From 4141abaa3424c26f5ea7c3ddfd4bdbbb50bf7daa Mon Sep 17 00:00:00 2001 From: Kevin Van Cott Date: Wed, 26 Nov 2025 16:01:33 -0600 Subject: [PATCH 01/24] start migrating to tanstack config --- .changeset/config.json | 14 + .cursorignore | 1 + .github/FUNDING.yml | 3 + .github/ISSUE_TEMPLATE/bug_report.yml | 100 + .github/ISSUE_TEMPLATE/config.yml | 8 + .github/workflows/autofix.yml | 31 + .github/workflows/pr.yml | 50 + .github/workflows/release.yml | 42 + .npmrc | 3 + .nvmrc | 1 + .nx/cache/run.json | 98 + .../terminalOutputs/10212416127652217168 | 15 + .../terminalOutputs/10602608975826075496 | 15 + .../terminalOutputs/10899295964426828110 | 15 + .../terminalOutputs/12189398981347784299 | 129 + .../terminalOutputs/12311986898317374245 | 15 + .../terminalOutputs/13891177766533542103 | 49 + .../terminalOutputs/15134291999248278184 | 41 + .../terminalOutputs/15289852906145915523 | 15 + .../terminalOutputs/16048335657332254327 | 41 + .../terminalOutputs/16380270685398234527 | 15 + .nx/cache/terminalOutputs/2686292967587754244 | 15 + .nx/cache/terminalOutputs/3505369680714718251 | 57 + .nx/cache/terminalOutputs/3741776693305569249 | 15 + .nx/cache/terminalOutputs/5434208491390619494 | 15 + .nx/cache/terminalOutputs/5934932795746721533 | 129 + .nx/cache/terminalOutputs/6767593282717562448 | 15 + .nx/cache/terminalOutputs/6900745953598375882 | 15 + .../A0C6373D-4A79-501D-A64C-0B2F2C38049E.db | Bin 0 -> 4096 bytes ...0C6373D-4A79-501D-A64C-0B2F2C38049E.db-shm | Bin 0 -> 32768 bytes ...0C6373D-4A79-501D-A64C-0B2F2C38049E.db-wal | Bin 0 -> 144232 bytes .nx/workspace-data/d/server-process.json | 5 + .nx/workspace-data/file-map.json | 1634 + .nx/workspace-data/lockfile-dependencies.hash | 1 + .nx/workspace-data/lockfile-nodes.hash | 1 + .nx/workspace-data/nx_files.nxt | Bin 0 -> 32748 bytes .../parsed-lock-file.dependencies.json | 12687 +++++++ .../parsed-lock-file.nodes.json | 15406 +++++++++ .nx/workspace-data/project-graph.json | 28748 ++++++++++++++++ .nx/workspace-data/source-maps.json | 5602 +++ .prettierignore | 10 + CODE_OF_CONDUCT.md | 81 + LICENSE | 21 + config.json | 14 + eslint.config.js | 25 + examples/ts-chat/package.json | 56 +- examples/vanilla-chat/package.json | 2 +- knip.json | 10 + nx.json | 63 + package.json | 92 +- .../typescript/ai-anthropic/eslint.config.js | 9 + packages/typescript/ai-anthropic/package.json | 42 +- .../typescript/ai-anthropic/tsconfig.json | 5 +- .../typescript/ai-anthropic/tsdown.config.ts | 12 - .../typescript/ai-anthropic/vite.config.ts | 36 + .../typescript/ai-anthropic/vitest.config.ts | 22 - .../typescript/ai-client/eslint.config.js | 9 + packages/typescript/ai-client/package.json | 42 +- packages/typescript/ai-client/tsconfig.json | 10 +- .../typescript/ai-client/tsdown.config.ts | 12 - packages/typescript/ai-client/vite.config.ts | 36 + .../typescript/ai-client/vitest.config.ts | 32 - packages/typescript/ai-devtools/package.json | 28 +- packages/typescript/ai-fallback/package.json | 24 +- packages/typescript/ai-gemini/package.json | 26 +- packages/typescript/ai-ollama/package.json | 21 +- packages/typescript/ai-openai/package.json | 26 +- packages/typescript/ai-react-ui/package.json | 20 +- packages/typescript/ai-react/package.json | 30 +- packages/typescript/ai/eslint.config.js | 9 + packages/typescript/ai/package.json | 32 +- packages/typescript/ai/tsconfig.docs.json | 4 + packages/typescript/ai/tsconfig.json | 7 +- packages/typescript/ai/tsdown.config.ts | 11 - packages/typescript/ai/vite.config.ts | 36 + packages/typescript/ai/vitest.config.ts | 23 - .../typescript/react-ai-devtools/package.json | 21 +- .../typescript/solid-ai-devtools/package.json | 22 +- .../typescript/tests-adapters/package.json | 8 +- pnpm-lock.yaml | 4868 +-- prettier.config.js | 12 + scripts/check-missing-docs.sh | 213 + scripts/generateDocs.js | 64 + scripts/verify-links.ts | 133 + tsconfig.json | 40 +- vitest.workspace.js | 14 + 86 files changed, 69072 insertions(+), 2307 deletions(-) create mode 100644 .changeset/config.json create mode 100644 .cursorignore create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/workflows/autofix.yml create mode 100644 .github/workflows/pr.yml create mode 100644 .github/workflows/release.yml create mode 100644 .npmrc create mode 100644 .nvmrc create mode 100644 .nx/cache/run.json create mode 100644 .nx/cache/terminalOutputs/10212416127652217168 create mode 100644 .nx/cache/terminalOutputs/10602608975826075496 create mode 100644 .nx/cache/terminalOutputs/10899295964426828110 create mode 100644 .nx/cache/terminalOutputs/12189398981347784299 create mode 100644 .nx/cache/terminalOutputs/12311986898317374245 create mode 100644 .nx/cache/terminalOutputs/13891177766533542103 create mode 100644 .nx/cache/terminalOutputs/15134291999248278184 create mode 100644 .nx/cache/terminalOutputs/15289852906145915523 create mode 100644 .nx/cache/terminalOutputs/16048335657332254327 create mode 100644 .nx/cache/terminalOutputs/16380270685398234527 create mode 100644 .nx/cache/terminalOutputs/2686292967587754244 create mode 100644 .nx/cache/terminalOutputs/3505369680714718251 create mode 100644 .nx/cache/terminalOutputs/3741776693305569249 create mode 100644 .nx/cache/terminalOutputs/5434208491390619494 create mode 100644 .nx/cache/terminalOutputs/5934932795746721533 create mode 100644 .nx/cache/terminalOutputs/6767593282717562448 create mode 100644 .nx/cache/terminalOutputs/6900745953598375882 create mode 100644 .nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db create mode 100644 .nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db-shm create mode 100644 .nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db-wal create mode 100644 .nx/workspace-data/d/server-process.json create mode 100644 .nx/workspace-data/file-map.json create mode 100644 .nx/workspace-data/lockfile-dependencies.hash create mode 100644 .nx/workspace-data/lockfile-nodes.hash create mode 100644 .nx/workspace-data/nx_files.nxt create mode 100644 .nx/workspace-data/parsed-lock-file.dependencies.json create mode 100644 .nx/workspace-data/parsed-lock-file.nodes.json create mode 100644 .nx/workspace-data/project-graph.json create mode 100644 .nx/workspace-data/source-maps.json create mode 100644 .prettierignore create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE create mode 100644 config.json create mode 100644 eslint.config.js create mode 100644 knip.json create mode 100644 nx.json create mode 100644 packages/typescript/ai-anthropic/eslint.config.js delete mode 100644 packages/typescript/ai-anthropic/tsdown.config.ts create mode 100644 packages/typescript/ai-anthropic/vite.config.ts delete mode 100644 packages/typescript/ai-anthropic/vitest.config.ts create mode 100644 packages/typescript/ai-client/eslint.config.js delete mode 100644 packages/typescript/ai-client/tsdown.config.ts create mode 100644 packages/typescript/ai-client/vite.config.ts delete mode 100644 packages/typescript/ai-client/vitest.config.ts create mode 100644 packages/typescript/ai/eslint.config.js create mode 100644 packages/typescript/ai/tsconfig.docs.json delete mode 100644 packages/typescript/ai/tsdown.config.ts create mode 100644 packages/typescript/ai/vite.config.ts delete mode 100644 packages/typescript/ai/vitest.config.ts create mode 100644 prettier.config.js create mode 100755 scripts/check-missing-docs.sh create mode 100644 scripts/generateDocs.js create mode 100644 scripts/verify-links.ts create mode 100644 vitest.workspace.js diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 000000000..174cf479e --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": [ + "@svitejs/changesets-changelog-github-compact", + { "repo": "TanStack/ai" } + ], + "commit": false, + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "fixed": [], + "linked": [], + "ignore": [] +} diff --git a/.cursorignore b/.cursorignore new file mode 100644 index 000000000..faba0f683 --- /dev/null +++ b/.cursorignore @@ -0,0 +1 @@ +**/reference/** \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..e2ea8ad3b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: tannerlinsley diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..67a638a45 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,100 @@ +name: '🐛 Bug report' +description: Report a reproducible bug or regression +body: + - type: markdown + attributes: + value: | + Thank you for reporting an issue :pray:. + + This issue tracker is for reporting reproducible bugs or regression's found in [react-ai](https://github.com/tanstack/ai) + If you have a question about how to achieve or implement something and are struggling, please post a question + inside of react-ai's [Discussions tab](https://github.com/tanstack/ai/discussions) instead of filing an issue. + + Before submitting a new bug/issue, please check the links below to see if there is a solution or question posted there already: + - TanStack AI's [Discussions tab](https://github.com/tanstack/ai/discussions) + - TanStack AI's [Open Issues](https://github.com/tanstack/ai/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) + - TanStack AI's [Closed Issues](https://github.com/tanstack/ai/issues?q=is%3Aissue+sort%3Aupdated-desc+is%3Aclosed) + + The more information you fill in, the better the community can help you. + + - type: input + id: tanstack-ai-version + attributes: + label: TanStack AI version + description: | + - Please let us know the exact version of the TanStack AI framework adapter that you were using when the issue occurred. If you are using an older version, check to see if your bug has already been solved in the latest version. Please don't just put in "latest", as this is subject to change. + - The latest "ai" version is + placeholder: | + e.g. v8.11.6 + validations: + required: true + + - type: input + id: framework-library-version + attributes: + label: Framework/Library version + description: Which framework and what version of that framework are you using? + placeholder: | + e.g. React v17.0.2 + validations: + required: true + + - type: textarea + id: description + attributes: + label: Describe the bug and the steps to reproduce it + description: Provide a clear and concise description of the challenge you are running into, and the steps we should take to try to reproduce your bug. + validations: + required: true + + - type: input + id: link + attributes: + label: Your Minimal, Reproducible Example - (Sandbox Highly Recommended) + description: | + Please add a link to a minimal reproduction. + Note: + - Your bug may get fixed much faster if we can run your code and it doesn't have dependencies other than React. + - To create a shareable code example for web, you can use CodeSandbox (https://codesandbox.io/s/new) or Stackblitz (https://stackblitz.com/). + - Please make sure the example is complete and runnable without prior dependencies and free of unnecessary abstractions + - Feel free to fork any of the official CodeSandbox examples to reproduce your issue: https://github.com/tanstack/ai/tree/main/examples/ + - For React Native, you can use: https://snack.expo.dev/ + - For TypeScript related issues only, a TypeScript Playground link might be sufficient: https://www.typescriptlang.org/play + - Please read these tips for providing a minimal example: https://stackoverflow.com/help/mcve. + placeholder: | + e.g. Code Sandbox, Stackblitz, TypeScript Playground, etc. + validations: + required: true + + - type: textarea + id: screenshots_or_videos + attributes: + label: Screenshots or Videos (Optional) + description: | + If applicable, add screenshots or a video to help explain your problem. + For more information on the supported file image/file types and the file size limits, please refer + to the following link: https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/attaching-files + placeholder: | + You can drag your video or image files inside of this editor ↓ + + - type: dropdown + attributes: + options: + - No, because I do not know how + - No, because I do not have time to dig into it + - Maybe, I'll investigate and start debugging + - Yes, I think I know how to fix it and will discuss it in the comments of this issue + - Yes, I am also opening a PR that solves the problem along side this issue + label: Do you intend to try to help solve this bug with your own PR? + description: | + If you think you know the cause of the problem, the fastest way to get it fixed is to suggest a fix, or fix it yourself! However, it is ok if you cannot solve this yourself and are just wanting help. + - type: checkboxes + id: agrees-to-terms + attributes: + label: Terms & Code of Conduct + description: By submitting this issue, you agree to follow our Code of Conduct and can verify that you have followed the requirements outlined above to the best of your ability. + options: + - label: I agree to follow this project's Code of Conduct + required: true + - label: I understand that if my bug cannot be reliable reproduced in a debuggable environment, it will probably not be fixed and this issue may even be closed. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..17660b114 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Feature Requests & Questions + url: https://github.com/TanStack/ai/discussions + about: Please ask and answer questions here. + - name: Community Chat + url: https://discord.gg/mQd7egN + about: A dedicated discord server hosted by TanStack diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml new file mode 100644 index 000000000..4d357d862 --- /dev/null +++ b/.github/workflows/autofix.yml @@ -0,0 +1,31 @@ +name: autofix.ci # needed to securely identify the workflow + +on: + pull_request: + push: + branches: [main, alpha, beta, rc] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + autofix: + name: autofix + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5.0.0 + - name: Setup Tools + uses: tanstack/config/.github/setup@main + - name: Fix formatting + run: pnpm prettier:write + - name: Regenerate docs + run: pnpm build:all && pnpm docs:generate + - name: Apply fixes + uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 + with: + commit-message: 'ci: apply automated fixes' diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 000000000..bfe3bd41e --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,50 @@ +name: PR + +on: + pull_request: + paths-ignore: + - 'docs/**' + - 'media/**' + - '**/*.md' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.number || github.ref }} + cancel-in-progress: true + +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + +permissions: + contents: read + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5.0.0 + with: + fetch-depth: 0 + - name: Setup Tools + uses: tanstack/config/.github/setup@main + - name: Get base and head commits for `nx affected` + uses: nrwl/nx-set-shas@v4.4.0 + with: + main-branch-name: main + - name: Run Checks + run: pnpm run test:pr + preview: + name: Preview + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5.0.0 + with: + fetch-depth: 0 + - name: Setup Tools + uses: tanstack/config/.github/setup@main + - name: Build Packages + run: pnpm run build:all + - name: Publish Previews + run: pnpx pkg-pr-new publish --pnpm './packages/*' --template './examples/*/*' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..0858f39cd --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,42 @@ +name: Release + +on: + push: + branches: [main, alpha, beta, rc] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.number || github.ref }} + cancel-in-progress: true + +env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + +permissions: + contents: write + id-token: write + pull-requests: write + +jobs: + release: + name: Release + if: github.repository_owner == 'TanStack' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5.0.0 + with: + fetch-depth: 0 + - name: Setup Tools + uses: tanstack/config/.github/setup@main + - name: Run Tests + run: pnpm run test:ci + - name: Run Changesets (version or publish) + uses: changesets/action@v1.5.3 + with: + version: pnpm run changeset:version + publish: pnpm run changeset:publish + commit: 'ci: Version Packages' + title: 'ci: Version Packages' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..84aee8d99 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +link-workspace-packages=true +prefer-workspace-packages=true +provenance=true diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..1d9b7831b --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22.12.0 diff --git a/.nx/cache/run.json b/.nx/cache/run.json new file mode 100644 index 000000000..c8af8461b --- /dev/null +++ b/.nx/cache/run.json @@ -0,0 +1,98 @@ +{ + "run": { + "command": "nx affected --skip-nx-cache --targets=build --exclude=examples/**", + "startTime": "2025-11-26T21:58:42.705Z", + "endTime": "2025-11-26T21:58:47.233Z", + "inner": false + }, + "tasks": [ + { + "taskId": "@tanstack/ai:build", + "target": "build", + "projectName": "@tanstack/ai", + "hash": "15134291999248278184", + "startTime": "2025-11-26T21:58:42.741Z", + "endTime": "2025-11-26T21:58:44.946Z", + "params": "", + "cacheStatus": "cache-miss", + "status": 0 + }, + { + "taskId": "@tanstack/ai-openai:build", + "target": "build", + "projectName": "@tanstack/ai-openai", + "hash": "6767593282717562448", + "startTime": "2025-11-26T21:58:44.953Z", + "endTime": "2025-11-26T21:58:45.563Z", + "params": "", + "cacheStatus": "cache-miss", + "status": 1 + }, + { + "taskId": "@tanstack/ai-gemini:build", + "target": "build", + "projectName": "@tanstack/ai-gemini", + "hash": "10602608975826075496", + "startTime": "2025-11-26T21:58:44.953Z", + "endTime": "2025-11-26T21:58:45.563Z", + "params": "", + "cacheStatus": "cache-miss", + "status": 1 + }, + { + "taskId": "@tanstack/ai-ollama:build", + "target": "build", + "projectName": "@tanstack/ai-ollama", + "hash": "10212416127652217168", + "startTime": "2025-11-26T21:58:45.564Z", + "endTime": "2025-11-26T21:58:46.123Z", + "params": "", + "cacheStatus": "cache-miss", + "status": 1 + }, + { + "taskId": "@tanstack/ai-fallback:build", + "target": "build", + "projectName": "@tanstack/ai-fallback", + "hash": "5434208491390619494", + "startTime": "2025-11-26T21:58:45.566Z", + "endTime": "2025-11-26T21:58:46.123Z", + "params": "", + "cacheStatus": "cache-miss", + "status": 1 + }, + { + "taskId": "@tanstack/ai-client:build", + "target": "build", + "projectName": "@tanstack/ai-client", + "hash": "13891177766533542103", + "startTime": "2025-11-26T21:58:44.953Z", + "endTime": "2025-11-26T21:58:46.751Z", + "params": "", + "cacheStatus": "cache-miss", + "status": 1 + }, + { + "taskId": "@tanstack/ai-anthropic:build", + "target": "build", + "projectName": "@tanstack/ai-anthropic", + "hash": "3505369680714718251", + "startTime": "2025-11-26T21:58:44.953Z", + "endTime": "2025-11-26T21:58:46.767Z", + "params": "", + "cacheStatus": "cache-miss", + "status": 1 + }, + { + "taskId": "@tanstack/ai-devtools-core:build", + "target": "build", + "projectName": "@tanstack/ai-devtools-core", + "hash": "5934932795746721533", + "startTime": "2025-11-26T21:58:44.953Z", + "endTime": "2025-11-26T21:58:47.232Z", + "params": "", + "cacheStatus": "cache-miss", + "status": 1 + } + ] +} \ No newline at end of file diff --git a/.nx/cache/terminalOutputs/10212416127652217168 b/.nx/cache/terminalOutputs/10212416127652217168 new file mode 100644 index 000000000..4c0b7ccbe --- /dev/null +++ b/.nx/cache/terminalOutputs/10212416127652217168 @@ -0,0 +1,15 @@ + +> @tanstack/ai-ollama@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-ollama +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 7ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/10602608975826075496 b/.nx/cache/terminalOutputs/10602608975826075496 new file mode 100644 index 000000000..29ee11116 --- /dev/null +++ b/.nx/cache/terminalOutputs/10602608975826075496 @@ -0,0 +1,15 @@ + +> @tanstack/ai-gemini@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-gemini +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 7ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/10899295964426828110 b/.nx/cache/terminalOutputs/10899295964426828110 new file mode 100644 index 000000000..f1474b1a9 --- /dev/null +++ b/.nx/cache/terminalOutputs/10899295964426828110 @@ -0,0 +1,15 @@ + +> @tanstack/ai-openai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-openai +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 7ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/12189398981347784299 b/.nx/cache/terminalOutputs/12189398981347784299 new file mode 100644 index 000000000..f3442aad8 --- /dev/null +++ b/.nx/cache/terminalOutputs/12189398981347784299 @@ -0,0 +1,129 @@ + +> @tanstack/ai-devtools-core@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-devtools +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +src/store/ai-context.tsx:3:31 - error TS2307: Cannot find module '@tanstack/ai/event-client' or its corresponding type declarations. + +3 import { aiEventClient } from "@tanstack/ai/event-client"; +   ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src/store/ai-context.tsx:430:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +430 (e) => { +   ~ +src/store/ai-context.tsx:442:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +442 (e) => { +   ~ +src/store/ai-context.tsx:462:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +462 (e) => { +   ~ +src/store/ai-context.tsx:485:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +485 (e) => { +   ~ +src/store/ai-context.tsx:498:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +498 (e) => { +   ~ +src/store/ai-context.tsx:511:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +511 (e) => { +   ~ +src/store/ai-context.tsx:524:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +524 (e) => { +   ~ +src/store/ai-context.tsx:541:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +541 (e) => { +   ~ +src/store/ai-context.tsx:554:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +554 (e) => { +   ~ +src/store/ai-context.tsx:584:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +584 (e) => { +   ~ +src/store/ai-context.tsx:634:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +634 (e) => { +   ~ +src/store/ai-context.tsx:664:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +664 (e) => { +   ~ +src/store/ai-context.tsx:692:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +692 (e) => { +   ~ +src/store/ai-context.tsx:722:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +722 (e) => { +   ~ +src/store/ai-context.tsx:764:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +764 (e) => { +   ~ +src/store/ai-context.tsx:793:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +793 (e) => { +   ~ +src/store/ai-context.tsx:822:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +822 (e) => { +   ~ +src/store/ai-context.tsx:868:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +868 (e) => { +   ~ +src/store/ai-context.tsx:904:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +904 (e) => { +   ~ +src/store/ai-context.tsx:943:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +943 (e) => { +   ~ +src/store/ai-context.tsx:973:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +973 (e) => { +   ~ +src/store/ai-context.tsx:987:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +987 (e) => { +   ~ +src/store/ai-context.tsx:1040:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1040 (e) => { +   ~ +src/store/ai-context.tsx:1080:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1080 (e) => { +   ~ +src/store/ai-context.tsx:1114:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1114 (e) => { +   ~ +src/store/ai-context.tsx:1145:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1145 (e) => { +   ~ +src/store/ai-context.tsx:1160:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1160 (e) => { +   ~ +src/store/ai-context.tsx:1176:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1176 (e) => { +   ~ +src/store/ai-context.tsx:1191:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1191 (e) => { +   ~ + +Please fix the above type errors + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/12311986898317374245 b/.nx/cache/terminalOutputs/12311986898317374245 new file mode 100644 index 000000000..1b2b844a1 --- /dev/null +++ b/.nx/cache/terminalOutputs/12311986898317374245 @@ -0,0 +1,15 @@ + +> @tanstack/ai-gemini@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-gemini +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 6ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/13891177766533542103 b/.nx/cache/terminalOutputs/13891177766533542103 new file mode 100644 index 000000000..8ab87333b --- /dev/null +++ b/.nx/cache/terminalOutputs/13891177766533542103 @@ -0,0 +1,49 @@ + +> @tanstack/ai-client@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-client +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +src/chat-client.ts:1:35 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +1 import type { ModelMessage } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/chat-client.ts:353:48 - error TS2550: Property 'findLastIndex' does not exist on type 'UIMessage[]'. Do you need to change your target library? Try changing the 'lib' compiler option to 'es2023' or later. + +353 const lastUserMessageIndex = this.messages.findLastIndex( +   ~~~~~~~~~~~~~ +src/chat-client.ts:513:41 - error TS2550: Property 'findLast' does not exist on type 'UIMessage[]'. Do you need to change your target library? Try changing the 'lib' compiler option to 'es2023' or later. + +513 const lastAssistant = this.messages.findLast( +   ~~~~~~~~ +src/chat-client.ts:520:8 - error TS7006: Parameter 'p' implicitly has an 'any' type. + +520 (p): p is ToolCallPart => p.type === "tool-call" +   ~ +src/chat-client.ts:527:8 - error TS7006: Parameter 'part' implicitly has an 'any' type. + +527 (part) => +   ~~~~ +src/connection-adapters.ts:1:48 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +1 import type { StreamChunk, ModelMessage } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/events.ts:1:31 - error TS2307: Cannot find module '@tanstack/ai/event-client' or its corresponding type declarations. + +1 import { aiEventClient } from "@tanstack/ai/event-client"; +   ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src/message-converters.ts:1:35 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +1 import type { ModelMessage } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/message-updaters.ts:3:3 - error TS6196: 'MessagePart' is declared but never used. + +3 MessagePart, +   ~~~~~~~~~~~ +src/types.ts:1:48 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +1 import type { ModelMessage, StreamChunk } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ + +Please fix the above type errors + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/15134291999248278184 b/.nx/cache/terminalOutputs/15134291999248278184 new file mode 100644 index 000000000..1f13f503f --- /dev/null +++ b/.nx/cache/terminalOutputs/15134291999248278184 @@ -0,0 +1,41 @@ + +> @tanstack/ai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +transforming... +✓ 12 modules transformed. +rendering chunks... + +[vite:dts] Start generate declaration files... + +[vite:dts] Start generate declaration files... +computing gzip size... +dist/esm/tools/tool-utils.js  0.10 kB │ gzip: 0.11 kB │ map: 3.03 kB +dist/esm/utilities/chat-options.js  0.12 kB │ gzip: 0.11 kB │ map: 0.97 kB +dist/esm/core/summarize.js  0.22 kB │ gzip: 0.16 kB │ map: 0.89 kB +dist/esm/core/embedding.js  0.23 kB │ gzip: 0.17 kB │ map: 0.86 kB +dist/esm/base-adapter.js  0.25 kB │ gzip: 0.20 kB │ map: 2.58 kB +dist/esm/utilities/agent-loop-strategies.js  0.58 kB │ gzip: 0.27 kB │ map: 2.77 kB +dist/esm/index.js  0.86 kB │ gzip: 0.35 kB │ map: 0.10 kB +dist/esm/utilities/stream-to-response.js  1.55 kB │ gzip: 0.58 kB │ map: 4.87 kB +dist/esm/event-client.js  1.94 kB │ gzip: 0.70 kB │ map: 11.71 kB +dist/esm/tools/tool-calls.js  6.80 kB │ gzip: 1.59 kB │ map: 15.82 kB +dist/esm/core/chat.js 15.59 kB │ gzip: 3.11 kB │ map: 31.91 kB +[vite:dts] Declaration files built in 937ms. + +[vite:dts] Declaration files built in 363ms. + +dist/cjs/tools/tool-utils.cjs  0.19 kB │ gzip: 0.17 kB │ map: 3.04 kB +dist/cjs/utilities/chat-options.cjs  0.22 kB │ gzip: 0.18 kB │ map: 0.98 kB +dist/cjs/core/summarize.cjs  0.31 kB │ gzip: 0.22 kB │ map: 0.89 kB +dist/cjs/core/embedding.cjs  0.32 kB │ gzip: 0.23 kB │ map: 0.86 kB +dist/cjs/base-adapter.cjs  0.35 kB │ gzip: 0.26 kB │ map: 2.58 kB +dist/cjs/utilities/agent-loop-strategies.cjs  0.73 kB │ gzip: 0.34 kB │ map: 2.78 kB +dist/cjs/index.cjs  1.35 kB │ gzip: 0.47 kB │ map: 0.12 kB +dist/cjs/utilities/stream-to-response.cjs  1.69 kB │ gzip: 0.64 kB │ map: 4.88 kB +dist/cjs/event-client.cjs  2.09 kB │ gzip: 0.76 kB │ map: 11.74 kB +dist/cjs/tools/tool-calls.cjs  6.93 kB │ gzip: 1.65 kB │ map: 15.83 kB +dist/cjs/core/chat.cjs 15.94 kB │ gzip: 3.19 kB │ map: 32.14 kB +✓ built in 1.06s diff --git a/.nx/cache/terminalOutputs/15289852906145915523 b/.nx/cache/terminalOutputs/15289852906145915523 new file mode 100644 index 000000000..89f055242 --- /dev/null +++ b/.nx/cache/terminalOutputs/15289852906145915523 @@ -0,0 +1,15 @@ + +> @tanstack/ai-anthropic@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-anthropic +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 7ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/16048335657332254327 b/.nx/cache/terminalOutputs/16048335657332254327 new file mode 100644 index 000000000..8ec2ec72a --- /dev/null +++ b/.nx/cache/terminalOutputs/16048335657332254327 @@ -0,0 +1,41 @@ + +> @tanstack/ai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +transforming... +✓ 12 modules transformed. +rendering chunks... + +[vite:dts] Start generate declaration files... + +[vite:dts] Start generate declaration files... +computing gzip size... +dist/esm/tools/tool-utils.js  0.10 kB │ gzip: 0.11 kB │ map: 3.03 kB +dist/esm/utilities/chat-options.js  0.12 kB │ gzip: 0.11 kB │ map: 0.97 kB +dist/esm/core/summarize.js  0.22 kB │ gzip: 0.16 kB │ map: 0.89 kB +dist/esm/core/embedding.js  0.23 kB │ gzip: 0.17 kB │ map: 0.86 kB +dist/esm/base-adapter.js  0.25 kB │ gzip: 0.20 kB │ map: 2.58 kB +dist/esm/utilities/agent-loop-strategies.js  0.58 kB │ gzip: 0.27 kB │ map: 2.77 kB +dist/esm/index.js  0.86 kB │ gzip: 0.35 kB │ map: 0.10 kB +dist/esm/utilities/stream-to-response.js  1.55 kB │ gzip: 0.58 kB │ map: 4.87 kB +dist/esm/event-client.js  1.94 kB │ gzip: 0.70 kB │ map: 11.71 kB +dist/esm/tools/tool-calls.js  6.80 kB │ gzip: 1.59 kB │ map: 15.82 kB +dist/esm/core/chat.js 15.59 kB │ gzip: 3.11 kB │ map: 31.91 kB +[vite:dts] Declaration files built in 970ms. + +[vite:dts] Declaration files built in 383ms. + +dist/cjs/tools/tool-utils.cjs  0.19 kB │ gzip: 0.17 kB │ map: 3.04 kB +dist/cjs/utilities/chat-options.cjs  0.22 kB │ gzip: 0.18 kB │ map: 0.98 kB +dist/cjs/core/summarize.cjs  0.31 kB │ gzip: 0.22 kB │ map: 0.89 kB +dist/cjs/core/embedding.cjs  0.32 kB │ gzip: 0.23 kB │ map: 0.86 kB +dist/cjs/base-adapter.cjs  0.35 kB │ gzip: 0.26 kB │ map: 2.58 kB +dist/cjs/utilities/agent-loop-strategies.cjs  0.73 kB │ gzip: 0.34 kB │ map: 2.78 kB +dist/cjs/index.cjs  1.35 kB │ gzip: 0.47 kB │ map: 0.12 kB +dist/cjs/utilities/stream-to-response.cjs  1.69 kB │ gzip: 0.64 kB │ map: 4.88 kB +dist/cjs/event-client.cjs  2.09 kB │ gzip: 0.76 kB │ map: 11.74 kB +dist/cjs/tools/tool-calls.cjs  6.93 kB │ gzip: 1.65 kB │ map: 15.83 kB +dist/cjs/core/chat.cjs 15.94 kB │ gzip: 3.19 kB │ map: 32.14 kB +✓ built in 1.09s diff --git a/.nx/cache/terminalOutputs/16380270685398234527 b/.nx/cache/terminalOutputs/16380270685398234527 new file mode 100644 index 000000000..69d804507 --- /dev/null +++ b/.nx/cache/terminalOutputs/16380270685398234527 @@ -0,0 +1,15 @@ + +> @tanstack/ai-fallback@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-fallback +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 6ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/2686292967587754244 b/.nx/cache/terminalOutputs/2686292967587754244 new file mode 100644 index 000000000..fbf0de9a3 --- /dev/null +++ b/.nx/cache/terminalOutputs/2686292967587754244 @@ -0,0 +1,15 @@ + +> @tanstack/ai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 5ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/3505369680714718251 b/.nx/cache/terminalOutputs/3505369680714718251 new file mode 100644 index 000000000..4dca9b831 --- /dev/null +++ b/.nx/cache/terminalOutputs/3505369680714718251 @@ -0,0 +1,57 @@ + +> @tanstack/ai-anthropic@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-anthropic +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +src/anthropic-adapter.ts:12:8 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +12 } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/anthropic-adapter.ts:91:14 - error TS2339: Property 'generateId' does not exist on type 'Anthropic'. + +91 this.generateId() +   ~~~~~~~~~~ +src/anthropic-adapter.ts:107:18 - error TS2339: Property 'generateId' does not exist on type 'Anthropic'. + +107 id: this.generateId(), +   ~~~~~~~~~~ +src/tools/bash-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +2 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/tools/code-execution-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +2 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/tools/computer-use-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +2 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/tools/custom-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +2 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/tools/memory-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +2 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/tools/text-editor-tool.ts:3:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +3 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/tools/tool-converter.ts:1:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +1 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/tools/web-fetch-tool.ts:3:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +3 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ +src/tools/web-search-tool.ts:3:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. + +3 import type { Tool } from "@tanstack/ai"; +   ~~~~~~~~~~~~~~ + +Please fix the above type errors + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/3741776693305569249 b/.nx/cache/terminalOutputs/3741776693305569249 new file mode 100644 index 000000000..ce57c990d --- /dev/null +++ b/.nx/cache/terminalOutputs/3741776693305569249 @@ -0,0 +1,15 @@ + +> @tanstack/ai-ollama@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-ollama +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 6ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/5434208491390619494 b/.nx/cache/terminalOutputs/5434208491390619494 new file mode 100644 index 000000000..69d804507 --- /dev/null +++ b/.nx/cache/terminalOutputs/5434208491390619494 @@ -0,0 +1,15 @@ + +> @tanstack/ai-fallback@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-fallback +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 6ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/5934932795746721533 b/.nx/cache/terminalOutputs/5934932795746721533 new file mode 100644 index 000000000..f3442aad8 --- /dev/null +++ b/.nx/cache/terminalOutputs/5934932795746721533 @@ -0,0 +1,129 @@ + +> @tanstack/ai-devtools-core@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-devtools +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +src/store/ai-context.tsx:3:31 - error TS2307: Cannot find module '@tanstack/ai/event-client' or its corresponding type declarations. + +3 import { aiEventClient } from "@tanstack/ai/event-client"; +   ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +src/store/ai-context.tsx:430:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +430 (e) => { +   ~ +src/store/ai-context.tsx:442:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +442 (e) => { +   ~ +src/store/ai-context.tsx:462:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +462 (e) => { +   ~ +src/store/ai-context.tsx:485:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +485 (e) => { +   ~ +src/store/ai-context.tsx:498:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +498 (e) => { +   ~ +src/store/ai-context.tsx:511:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +511 (e) => { +   ~ +src/store/ai-context.tsx:524:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +524 (e) => { +   ~ +src/store/ai-context.tsx:541:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +541 (e) => { +   ~ +src/store/ai-context.tsx:554:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +554 (e) => { +   ~ +src/store/ai-context.tsx:584:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +584 (e) => { +   ~ +src/store/ai-context.tsx:634:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +634 (e) => { +   ~ +src/store/ai-context.tsx:664:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +664 (e) => { +   ~ +src/store/ai-context.tsx:692:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +692 (e) => { +   ~ +src/store/ai-context.tsx:722:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +722 (e) => { +   ~ +src/store/ai-context.tsx:764:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +764 (e) => { +   ~ +src/store/ai-context.tsx:793:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +793 (e) => { +   ~ +src/store/ai-context.tsx:822:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +822 (e) => { +   ~ +src/store/ai-context.tsx:868:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +868 (e) => { +   ~ +src/store/ai-context.tsx:904:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +904 (e) => { +   ~ +src/store/ai-context.tsx:943:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +943 (e) => { +   ~ +src/store/ai-context.tsx:973:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +973 (e) => { +   ~ +src/store/ai-context.tsx:987:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +987 (e) => { +   ~ +src/store/ai-context.tsx:1040:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1040 (e) => { +   ~ +src/store/ai-context.tsx:1080:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1080 (e) => { +   ~ +src/store/ai-context.tsx:1114:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1114 (e) => { +   ~ +src/store/ai-context.tsx:1145:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1145 (e) => { +   ~ +src/store/ai-context.tsx:1160:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1160 (e) => { +   ~ +src/store/ai-context.tsx:1176:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1176 (e) => { +   ~ +src/store/ai-context.tsx:1191:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. + +1191 (e) => { +   ~ + +Please fix the above type errors + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/6767593282717562448 b/.nx/cache/terminalOutputs/6767593282717562448 new file mode 100644 index 000000000..dd1ef646e --- /dev/null +++ b/.nx/cache/terminalOutputs/6767593282717562448 @@ -0,0 +1,15 @@ + +> @tanstack/ai-openai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-openai +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 6ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/6900745953598375882 b/.nx/cache/terminalOutputs/6900745953598375882 new file mode 100644 index 000000000..c18520014 --- /dev/null +++ b/.nx/cache/terminalOutputs/6900745953598375882 @@ -0,0 +1,15 @@ + +> @tanstack/ai-client@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-client +> vite build + +You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. +vite v7.2.4 building client environment for production... +✓ 0 modules transformed. +✗ Build failed in 6ms +error during build: +Could not resolve entry module "index.html". + at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) + at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) + at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) + at async Promise.all (index 0) + ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db b/.nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db new file mode 100644 index 0000000000000000000000000000000000000000..7ee7c113a09428e4daafacb6e70a35d18573e608 GIT binary patch literal 4096 zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|@t|AVoG{WYDWB;00+HAlr;ljiVtj n8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O6ovo*4{!$i literal 0 HcmV?d00001 diff --git a/.nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db-shm b/.nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..85432392fcaf73bb8fd861fd92e37d4bb2cac9c0 GIT binary patch literal 32768 zcmeI)J1&Jm6bJBgJ+8;~xZcw z)EQpt$^|B4Db}OBMXd-<`*zXV9v8{l>G9W+*2kK_j<8G18obEt( z!jOs6xEQyoo5bTZah>TD<2aexjoUcwU_708?ADAkw2kYub!%rjb}{WhlYtIyI&PZ` zecs(WX;-^|W2gh@za#11+kKz+Ju8!SOH1gEY?kV_(07E{ zG!ACp+I&Kfc6+YpLB*C(&u4a|`S(LD{IU?gjDIz#63&4D2!H?xfB*=900@8p2!H?x zfWRe2;DM{d@yxt=;Ro)o=eL%vF{_?0=Ii<9W6ScvzTTm}>`?C~*YstZXR}M%v(t|4 z)}HK8-{zt0z&iTgv}R3q{b2vv-oY)|)qPuT@>SoJFHcxr15cgqWi7GH@_FGNq@m(zc=@1bH9J&#WbA@^FI#J7Y+~r z0T2KI5C8!X009sH0T2KI5CDP8pTJe&$bxGJHV@z3H@LBX-GC(Zh&>Wbi}?s5%{YSF zmKu*Nl#jjMPA9|s=@5P4009sH0T2KI5C8!X009sH0T2KI5V&Fpq$3LwQ{DlZmS-Qq zXNxZ_>MuUdpJyLI)P;k^8+_<}1g+^a_CA928ScMaZK4PQAOHd&00JNY0w4eaAOHd& z@X-)>pdN{5y1K%9m)ddh^?YsnaFK%JOXZro-0F#scV7vJksr<1Mp@Xr9VhP!kDrX0 z_s7Za7_Z)I73vL}W^BE`UOhiPVx7NQp<3Bi8krc+*Gtuk)2KJ>UT=+MR(G8(?A|@U zVbT38dL`~7u>YrT#tUqC>fM7^9kXs``v@A61Ru>xL@yu!0w4eaAOHd&00JNY0w4ea zAOHft3rd!KuedyrelU7tRYK1dgEfB*=900@8p z2!H?xfB*=900>-c0^O;o+?5GQnxRRiWNNx<=(?&%igHIiU!l1E!uDnP(${Fb;*zoLzP6qV=`iml`77_#j3c4Zd3KhJ)Y|EF+TWLae zKSn$%FVBQzLo;MiRRx)*Vw#eqy1J=V%cWv2U&bPb1xvVuRian}RT6Yv)Kr~r zmQFWK^DKs3pmb-NoS992z*UNc2mF+}<)oAgLLJp;>E>Z9Y;9i@V8MT^)IFOZ78 zu;TSO+2t%=AjQ2E;$Pzz@k#y@+-d$e{}A^Ue>cCMukg=b?8T4vKmY_l00ck)1V8`; zKmY_l00cnb;u6S2G!$A&}q;tXVHfgsn1UN?$j)mU^(#HA@aC5}j`2Z(I z%x);aMG<8N0Un4}c0Rz-5V0Eya3-{5B5ESYWkAe5x`U?|f9FTJSN7d_9^Ju&>s~Rx z!iUx!Y)kH%)E!LSo9av+p%XYj00ck)1V8`;KmY_lU`7xaY>Q0Td;WtJ`tZ?Wa*8VS*B*3Jp5Qn02yjeA7trd?c8q2%s2k!APZ*-=~K zZr{k1#9d>q?)k(#t+}rRNZgf*+5Ul{zEypL?)>lB-c3X6`Uj|?wS5CqDdPPycD6#E zCyl(njzia*JKkTbP%T=MLpi%{9yK;z&kpsk?b|riyLSCKl=!Sl@dMRcxo)tpf7Jj> zd!Jom-?{8y-^#whzJcX^8=ZyH&=G80_6qPpcaUCxJIkfIHJqQQSMAr%u)XLS)MkM0 zV2r)xHuVMm;r9=`AkP2d9_S9vh+jmQBnW^22!H?xfB*=900@8p2!H?x#2JF7U*N9X zf5!{2y>|?L0W1s<009sH0T2KI5C8!X009sH0T7rG1lrgvn|^^GZhG&`k$*k*@5o0m zBknyW2?8Jh0w4eaAOHd&00JNY0w4eaOe-MK^a~iL-dMc5@-go?w@4gz{@Z@=P2a_%`OrPLG>khUj_W5)N6Z?|4xY|b% z1V8`;KmY_l00d?ZfxU7fo>{y&{7{!I$yUf0My=uMM199Zz2 ztI?yauC{)#e{JvJ7F(q3?BZz5%+^uMegGvkR=HOCj71Mk1-SFHO!>I#R&hA*)?ZuE zx3YKBnxX9SO@pMEHZ(k`%;r~kV;$xTBz{-Bz(y`iu`QeJHrr#FwTr_cM?7%4c$w$s z42zzpN$3t*Zbd!3m00ck)1V8`;KmY_l z00d?<0ruH{vgsH2l?^Zd$M=44=oaiFn9*wjlLrA1009sH0T2KI5C8!X009t~IRrfW z2#Wo$?CU&v_`&n+Be25>8i-gvgAcurAk{V$xR0Q1C~?=!xdoUh2!H?xfB*)p6n9mTKAfGEHkewY}wly*!Gd>Ew*`DY}W9%$F6j*kHs=emxj04 z8(SI~-fPy*39CX|IGjBb&8KnCt9aVQC6)Y`brV(X-a9)Q&vbQ#_l?+Xy65UHV;=$b z5v-%P;Z4{_U@rvw$F6*N!t(xp^8WH!))LDspLe#65o5G#r1qTR#00@8p2!H?xfB*=900@8p2wd?5m> zMcI}wl_$on@Ynxh{+IT#pO1cyrp5FDCjA1RHanl{N&d-K9KXP+5P#}&nK;G?0w4ea zAOHd&00JNY0w4eaAOHd&a2^7DIMS7H%Xv_JTW6rTk0AT)!*^~x_@i&IeFS0tM2Nm{ zfB*=900@8p2!H?xfB*=900@8p2wd(2u8GKrfDi(jR)W4K^#%5?`n$3H@zJ@CU*M-9 z{->Aw#4&yl009sH0T2KI5C8!X009sH0T2KI4}tc`+(ctf0iCyV3^wBhR()stZy*2M z?a#7(1f9t_A^r&e7+>He?tSh>?m=!HcYXRq`e6Fu^rrN})XCKMQhQT(rqaoON`5n0 zOWr{SI6wddKmY_l00ck)1VG>lA#h`7RPD-yL`_f(SynYwmt{#(6 zS-!M&qEs%5nW!pLUBNJEFRyB9ib9{tNros2?z*|^4y)2I5w3~KWFqT|sOy?$%CexU znkgx!*P>j`kL8_Cu68<+WKlE?%`gpF)X82_RFBDsHCC!PK-cDJ^H%sW&>O_2myGYO}t=^~r#)F^3c&Oj#| zlmchpFU=GLT~P^#O8jZlwjp_J3gwbjsoUKs>8NVbj8vj$sFEpYA{nx7WRFR{QXd_! z?kE*(tL{`(rezoKp|0D=t|}&-1);07b6l5Iwk&j7dZOZ@P4jTAIKbb9?# z+0fjyCl|SE(Y4x(P9YG)T&7X#hNNhw?!C8Di%yC}WqK(Zf}m*<-7sC%G?|b{uIWu* zb7D*56|YJHy$&ZhbULe73q3m4~hVplEh#1PLU+>7oGTY zPg}EoKyZtz{?TVy{bSGN;tj?90B480`X4#fdt%Mz1H1>W`p$5UKGPFz)(`NR1l4bC z)(>#X1k}$(8p99pa`>x1-P6LFZzGxk;Y+oNLcyxl*hJrWnEia`o(s%J@a3gn->^mu zJ?i8mI2qzkp6gcQ8VG;@2!H?xfB*=900@8p2!H?xfWYNLU>2n#2-owq?Zcy`TD>~H zhiMLa@)6v>-_=O?bAFz;rh#%wsmcNxh!EfRZT|TqLNI?JuKmY_l z00ck)1V8`;KmY_l;35!kV)OlbA)IXl0Wl8FHUhtVNZf8IAZo$cM-UL65Vb7=;t=eO z1OWjD&PIZO$byy+n2+GS`|iEHerF;bZKhs`0Zz8A})XE87b0+c;ARj@wC?g+%ldQy* z1mm*GN1z{mV)Zw)L!&HSU{UIKLX?T{4R=n0^ykxYo-PDsCP+W-h@s;#w z+DLtqWhqE!FZ9m<*n)Xe@BdHS zSH1I858sra4+vfH*MB?5HAmx*7;;sga~m7YHQRgA&E^BbnB4VmZPZUq*7v(YT=kvV z&bcL*Y%1dWeJugid)k|d_yI9nQ;PVxgvy4~@k8VzP!vj#C>f$COyO*#UpV^ArJax9 zi6h_2R9tzUgF+#auRS~=G&Wj3Ap?CP23-H!`x})C%BON0b39N0T2KI5C8!X z009sH0T8(237loSMaNloNz6LiwhG?ahvCy_;cSC|u!^*E!5=@7Vl4%1N=e!V0TB`H z_62E%HH-;@00@8p2!H?x xfB*=900@8p2!Mc>fJ^7U!&RQ;D)X)~=PIXN<&>+OWaY-DjCR-g|L=SR{|E3fafJW? literal 0 HcmV?d00001 diff --git a/.nx/workspace-data/d/server-process.json b/.nx/workspace-data/d/server-process.json new file mode 100644 index 000000000..8ff2ed6c9 --- /dev/null +++ b/.nx/workspace-data/d/server-process.json @@ -0,0 +1,5 @@ +{ + "processId": 64114, + "socketPath": "/private/var/folders/nr/plzz2tfs15lb437g_jckt51c0000gn/T/e9cca2e0653d03945493/d.sock", + "nxVersion": "22.1.2" +} diff --git a/.nx/workspace-data/file-map.json b/.nx/workspace-data/file-map.json new file mode 100644 index 000000000..e8aeac66e --- /dev/null +++ b/.nx/workspace-data/file-map.json @@ -0,0 +1,1634 @@ +{ + "version": "6.0", + "nxVersion": "22.1.2", + "pathMappings": {}, + "nxJsonPlugins": [], + "fileMap": { + "nonProjectFiles": [], + "projectFileMap": { + "@tanstack/react-ai-devtools": [ + { + "file": "packages/typescript/react-ai-devtools/package.json", + "hash": "5015851932444334730", + "deps": [ + "npm:react", + "npm:@types/react", + "npm:@tanstack/devtools-utils", + "@tanstack/ai-devtools-core" + ] + }, + { + "file": "packages/typescript/react-ai-devtools/src/AiDevtools.tsx", + "hash": "17643008749647550551" + }, + { + "file": "packages/typescript/react-ai-devtools/src/index.ts", + "hash": "690820935095618943" + }, + { + "file": "packages/typescript/react-ai-devtools/src/plugin.tsx", + "hash": "1797088302951387346" + }, + { + "file": "packages/typescript/react-ai-devtools/src/production.ts", + "hash": "10817458403881338401" + }, + { + "file": "packages/typescript/react-ai-devtools/tsconfig.json", + "hash": "1306631043222942463" + }, + { + "file": "packages/typescript/react-ai-devtools/tsdown.config.ts", + "hash": "15766826510434865934" + }, + { + "file": "packages/typescript/react-ai-devtools/vitest.config.ts", + "hash": "16166077380570933860" + } + ], + "vanilla-chat": [ + { + "file": "examples/vanilla-chat/README.md", + "hash": "9282960027394310212" + }, + { + "file": "examples/vanilla-chat/index.html", + "hash": "3209670018771939917" + }, + { + "file": "examples/vanilla-chat/package.json", + "hash": "13621716808609472163", + "deps": [ + "npm:vite", + "@tanstack/ai-client" + ] + }, + { + "file": "examples/vanilla-chat/src/main.js", + "hash": "1065820847750448268" + }, + { + "file": "examples/vanilla-chat/src/style.css", + "hash": "14790050755339330948" + }, + { + "file": "examples/vanilla-chat/vite.config.ts", + "hash": "6591996030399873107" + } + ], + "@tanstack/ai": [ + { + "file": "packages/typescript/ai/eslint.config.js", + "hash": "7781284990019102288" + }, + { + "file": "packages/typescript/ai/package.json", + "hash": "10739163436894203899", + "deps": [ + "npm:@tanstack/devtools-event-client" + ] + }, + { + "file": "packages/typescript/ai/src/base-adapter.ts", + "hash": "13842223249309044261" + }, + { + "file": "packages/typescript/ai/src/core/chat-common-options.ts", + "hash": "13732596118621246713" + }, + { + "file": "packages/typescript/ai/src/core/chat.ts", + "hash": "12762273026036705103" + }, + { + "file": "packages/typescript/ai/src/core/embedding.ts", + "hash": "18109869585387630047" + }, + { + "file": "packages/typescript/ai/src/core/summarize.ts", + "hash": "8329969047525284909" + }, + { + "file": "packages/typescript/ai/src/event-client.ts", + "hash": "5947644555025204395" + }, + { + "file": "packages/typescript/ai/src/index.ts", + "hash": "5252227405372573747" + }, + { + "file": "packages/typescript/ai/src/tools/tool-calls.ts", + "hash": "294229199782255549" + }, + { + "file": "packages/typescript/ai/src/tools/tool-utils.ts", + "hash": "9677695668996805044" + }, + { + "file": "packages/typescript/ai/src/types.ts", + "hash": "1498944371269991886" + }, + { + "file": "packages/typescript/ai/src/utilities/agent-loop-strategies.ts", + "hash": "17859911512439261438" + }, + { + "file": "packages/typescript/ai/src/utilities/chat-options.ts", + "hash": "9438458523939521628" + }, + { + "file": "packages/typescript/ai/src/utilities/stream-to-response.ts", + "hash": "1030951040095494792" + }, + { + "file": "packages/typescript/ai/tests/agent-loop-strategies.test.ts", + "hash": "8175830577546117963" + }, + { + "file": "packages/typescript/ai/tests/ai-abort.test.ts", + "hash": "8957232303273549186" + }, + { + "file": "packages/typescript/ai/tests/ai-chat.test.ts", + "hash": "939114443809333927" + }, + { + "file": "packages/typescript/ai/tests/tool-call-manager.test.ts", + "hash": "10866637994353260616" + }, + { + "file": "packages/typescript/ai/tsconfig.docs.json", + "hash": "2740853684691565937" + }, + { + "file": "packages/typescript/ai/tsconfig.json", + "hash": "15143473186599245443" + }, + { + "file": "packages/typescript/ai/vite.config.ts", + "hash": "13571564677928348694" + } + ], + "@tanstack/ai-react-ui": [ + { + "file": "packages/typescript/ai-react-ui/README.md", + "hash": "7762262271587316281" + }, + { + "file": "packages/typescript/ai-react-ui/package.json", + "hash": "13894561176105700241", + "deps": [ + "@tanstack/ai-client", + "@tanstack/ai-react", + "npm:react", + "npm:react-dom", + "npm:@types/react", + "npm:highlight.js", + "npm:react-markdown", + "npm:rehype-highlight", + "npm:rehype-raw", + "npm:rehype-sanitize", + "npm:remark-gfm" + ] + }, + { + "file": "packages/typescript/ai-react-ui/src/chat-input.tsx", + "hash": "1312131526151862082" + }, + { + "file": "packages/typescript/ai-react-ui/src/chat-message.tsx", + "hash": "16334200844161387003" + }, + { + "file": "packages/typescript/ai-react-ui/src/chat-messages.tsx", + "hash": "15402841597094476201" + }, + { + "file": "packages/typescript/ai-react-ui/src/chat.tsx", + "hash": "10666081882078630987" + }, + { + "file": "packages/typescript/ai-react-ui/src/index.ts", + "hash": "15518305576287772683" + }, + { + "file": "packages/typescript/ai-react-ui/src/text-part.tsx", + "hash": "6246961682484374625" + }, + { + "file": "packages/typescript/ai-react-ui/src/thinking-part.tsx", + "hash": "7613963373764019353" + }, + { + "file": "packages/typescript/ai-react-ui/src/tool-approval.tsx", + "hash": "14768010954960151780" + }, + { + "file": "packages/typescript/ai-react-ui/tsconfig.json", + "hash": "2942896667779417629" + }, + { + "file": "packages/typescript/ai-react-ui/tsdown.config.ts", + "hash": "9791912542407287867" + } + ], + "@tanstack/ai-anthropic": [ + { + "file": "packages/typescript/ai-anthropic/eslint.config.js", + "hash": "7781284990019102288" + }, + { + "file": "packages/typescript/ai-anthropic/package.json", + "hash": "255041631379239819", + "deps": [ + "@tanstack/ai", + "npm:@anthropic-ai/sdk" + ] + }, + { + "file": "packages/typescript/ai-anthropic/src/anthropic-adapter.ts", + "hash": "8452625336753771146" + }, + { + "file": "packages/typescript/ai-anthropic/src/index.ts", + "hash": "4457152849778296411" + }, + { + "file": "packages/typescript/ai-anthropic/src/model-meta.ts", + "hash": "2973921560232992175" + }, + { + "file": "packages/typescript/ai-anthropic/src/text/text-provider-options.ts", + "hash": "9811312919833032040" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/bash-tool.ts", + "hash": "5635051266500890101" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts", + "hash": "4749996097298750598" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts", + "hash": "7363039983717111771" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/custom-tool.ts", + "hash": "15345835199061424144" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/index.ts", + "hash": "11852213418084872939" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/memory-tool.ts", + "hash": "14522848837255695837" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts", + "hash": "12200075178713181007" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/tool-converter.ts", + "hash": "15111552880358185635" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/web-fetch-tool.ts", + "hash": "4532834429160796109" + }, + { + "file": "packages/typescript/ai-anthropic/src/tools/web-search-tool.ts", + "hash": "4969863907768659443" + }, + { + "file": "packages/typescript/ai-anthropic/tests/anthropic-adapter.test.ts", + "hash": "6294716220417392970" + }, + { + "file": "packages/typescript/ai-anthropic/tests/model-meta.test.ts", + "hash": "7328118497274933719" + }, + { + "file": "packages/typescript/ai-anthropic/tsconfig.json", + "hash": "15143473186599245443" + }, + { + "file": "packages/typescript/ai-anthropic/vite.config.ts", + "hash": "13571564677928348694" + } + ], + "@tanstack/ai-openai": [ + { + "file": "packages/typescript/ai-openai/live-tests/example-guitars.ts", + "hash": "1493943760047990028" + }, + { + "file": "packages/typescript/ai-openai/live-tests/test-tool-arguments.ts", + "hash": "12342243970170325003" + }, + { + "file": "packages/typescript/ai-openai/package.json", + "hash": "7764975492596503120", + "deps": [ + "@tanstack/ai", + "npm:zod@4.1.13", + "npm:openai" + ] + }, + { + "file": "packages/typescript/ai-openai/src/audio/audio-provider-options.ts", + "hash": "10818012445548783744" + }, + { + "file": "packages/typescript/ai-openai/src/audio/transcribe-provider-options.ts", + "hash": "910546854844516167" + }, + { + "file": "packages/typescript/ai-openai/src/image/image-provider-options.ts", + "hash": "9316185050507450776" + }, + { + "file": "packages/typescript/ai-openai/src/index.ts", + "hash": "335888904215592625" + }, + { + "file": "packages/typescript/ai-openai/src/model-meta.ts", + "hash": "11671332892395364932" + }, + { + "file": "packages/typescript/ai-openai/src/openai-adapter.test.ts", + "hash": "3244421341483603138" + }, + { + "file": "packages/typescript/ai-openai/src/openai-adapter.ts", + "hash": "13786492348929263638" + }, + { + "file": "packages/typescript/ai-openai/src/text/text-provider-options.ts", + "hash": "13626697959231180124" + }, + { + "file": "packages/typescript/ai-openai/src/tools/apply-patch-tool.ts", + "hash": "5282601921021569029" + }, + { + "file": "packages/typescript/ai-openai/src/tools/code-interpreter-tool.ts", + "hash": "3392726200035777548" + }, + { + "file": "packages/typescript/ai-openai/src/tools/computer-use-tool.ts", + "hash": "13114041725619852690" + }, + { + "file": "packages/typescript/ai-openai/src/tools/custom-tool.ts", + "hash": "5378563049750912791" + }, + { + "file": "packages/typescript/ai-openai/src/tools/file-search-tool.ts", + "hash": "11462259817792926669" + }, + { + "file": "packages/typescript/ai-openai/src/tools/function-tool.ts", + "hash": "15011563170559954290" + }, + { + "file": "packages/typescript/ai-openai/src/tools/image-generation-tool.ts", + "hash": "2908656132541537390" + }, + { + "file": "packages/typescript/ai-openai/src/tools/index.ts", + "hash": "596820970272461274" + }, + { + "file": "packages/typescript/ai-openai/src/tools/local-shell-tool.ts", + "hash": "1051724757058026172" + }, + { + "file": "packages/typescript/ai-openai/src/tools/mcp-tool.ts", + "hash": "6641889725054347333" + }, + { + "file": "packages/typescript/ai-openai/src/tools/shell-tool.ts", + "hash": "3107394209009363292" + }, + { + "file": "packages/typescript/ai-openai/src/tools/tool-choice.ts", + "hash": "17054044197549173919" + }, + { + "file": "packages/typescript/ai-openai/src/tools/tool-converter.ts", + "hash": "634804831991671352" + }, + { + "file": "packages/typescript/ai-openai/src/tools/web-search-preview-tool.ts", + "hash": "10276043415596020796" + }, + { + "file": "packages/typescript/ai-openai/src/tools/web-search-tool.ts", + "hash": "9855407685045802773" + }, + { + "file": "packages/typescript/ai-openai/tests/model-meta.test.ts", + "hash": "4161644311984483570" + }, + { + "file": "packages/typescript/ai-openai/tests/openai-adapter.test.ts", + "hash": "2092197395591848867" + }, + { + "file": "packages/typescript/ai-openai/tsconfig.json", + "hash": "17487793864479620212" + }, + { + "file": "packages/typescript/ai-openai/tsdown.config.ts", + "hash": "13668403277050289523" + }, + { + "file": "packages/typescript/ai-openai/vitest.config.ts", + "hash": "14379467452428811752" + } + ], + "@tanstack/tests-adapters": [ + { + "file": "packages/typescript/tests-adapters/README.md", + "hash": "826524314342396419" + }, + { + "file": "packages/typescript/tests-adapters/env.example", + "hash": "4509017829091090490" + }, + { + "file": "packages/typescript/tests-adapters/package.json", + "hash": "3885918433353695660", + "deps": [ + "npm:@types/node", + "npm:dotenv@17.2.3", + "npm:tsx", + "npm:typescript", + "@tanstack/ai", + "@tanstack/ai-anthropic", + "@tanstack/ai-gemini", + "@tanstack/ai-ollama", + "@tanstack/ai-openai" + ] + }, + { + "file": "packages/typescript/tests-adapters/src/harness.ts", + "hash": "4035746237938299335" + }, + { + "file": "packages/typescript/tests-adapters/src/index.ts", + "hash": "11309426036128408512" + }, + { + "file": "packages/typescript/tests-adapters/tsconfig.json", + "hash": "8391116500506156774" + } + ], + "@tanstack/ai-ollama": [ + { + "file": "packages/typescript/ai-ollama/package.json", + "hash": "18202516038182883121", + "deps": [ + "@tanstack/ai", + "npm:ollama" + ] + }, + { + "file": "packages/typescript/ai-ollama/src/index.ts", + "hash": "9052190880257909266" + }, + { + "file": "packages/typescript/ai-ollama/src/ollama-adapter.ts", + "hash": "12042754145895646581" + }, + { + "file": "packages/typescript/ai-ollama/tsconfig.json", + "hash": "17487793864479620212" + }, + { + "file": "packages/typescript/ai-ollama/tsdown.config.ts", + "hash": "17860578175650129157" + } + ], + "root": [ + { + "file": ".changeset/config.json", + "hash": "1979795190074309818" + }, + { + "file": ".cursorignore", + "hash": "10338563896281470751" + }, + { + "file": ".github/FUNDING.yml", + "hash": "7147761140472713877" + }, + { + "file": ".github/ISSUE_TEMPLATE/bug_report.yml", + "hash": "11317197335965284772" + }, + { + "file": ".github/ISSUE_TEMPLATE/config.yml", + "hash": "10669642839954630116" + }, + { + "file": ".github/instructions/copilot-instructions.md", + "hash": "15770608591728561680" + }, + { + "file": ".github/workflows/autofix.yml", + "hash": "370305525201108569" + }, + { + "file": ".github/workflows/pr.yml", + "hash": "7322719433044986181" + }, + { + "file": ".github/workflows/release.yml", + "hash": "132751124063330986" + }, + { + "file": ".gitignore", + "hash": "8782263177283243594" + }, + { + "file": ".npmrc", + "hash": "8974250228043845607" + }, + { + "file": ".nvmrc", + "hash": "6593500695046679622" + }, + { + "file": ".prettierignore", + "hash": "5046726174050070668" + }, + { + "file": "CHANGELOG.md", + "hash": "13449318543508998288" + }, + { + "file": "CODE_OF_CONDUCT.md", + "hash": "3955647879993932925" + }, + { + "file": "LICENSE", + "hash": "5598561347454435878" + }, + { + "file": "README.md", + "hash": "16523691990671060021" + }, + { + "file": "ai-docs/AGENT_LOOP_STRATEGIES.md", + "hash": "16788710745196204407" + }, + { + "file": "ai-docs/CONNECTION_ADAPTERS_GUIDE.md", + "hash": "8600094686360457444" + }, + { + "file": "ai-docs/EVENT_CLIENT.md", + "hash": "11871789519419303513" + }, + { + "file": "ai-docs/EVENT_CLIENT_INTEGRATION.md", + "hash": "8112599375147974081" + }, + { + "file": "ai-docs/IMPLEMENTATION_SUMMARY.md", + "hash": "3969375475616031936" + }, + { + "file": "ai-docs/MIGRATION_UNIFIED_CHAT.md", + "hash": "10665420318505031653" + }, + { + "file": "ai-docs/TOOL_EXECUTION_LOOP.md", + "hash": "14065856400555761" + }, + { + "file": "ai-docs/TOOL_REGISTRY.md", + "hash": "2227881596927978911" + }, + { + "file": "ai-docs/TOOL_REGISTRY_IMPLEMENTATION.md", + "hash": "13645556165741441006" + }, + { + "file": "ai-docs/TOOL_REGISTRY_QUICK_START.md", + "hash": "15556890364568236303" + }, + { + "file": "ai-docs/TOOL_STATES_MIGRATION.md", + "hash": "7331657546383995199" + }, + { + "file": "ai-docs/TYPE_NARROWING_SOLUTION.md", + "hash": "5004707700951043696" + }, + { + "file": "ai-docs/TYPE_NARROWING_UNIFIED_CHAT.md", + "hash": "6376887632264014064" + }, + { + "file": "ai-docs/TYPE_SAFETY.md", + "hash": "12958538935603381694" + }, + { + "file": "ai-docs/UNIFIED_CHAT_API.md", + "hash": "12941557287753927406" + }, + { + "file": "ai-docs/UNIFIED_CHAT_IMPLEMENTATION.md", + "hash": "10176413661467073230" + }, + { + "file": "ai-docs/UNIFIED_CHAT_QUICK_REFERENCE.md", + "hash": "11439126419747039363" + }, + { + "file": "config.json", + "hash": "1979795190074309818" + }, + { + "file": "docs/adapters/anthropic.md", + "hash": "7129345997887719987" + }, + { + "file": "docs/adapters/gemini.md", + "hash": "540059042078142732" + }, + { + "file": "docs/adapters/ollama.md", + "hash": "3058607039178797574" + }, + { + "file": "docs/adapters/openai.md", + "hash": "15429933950232890800" + }, + { + "file": "docs/api/ai-client.md", + "hash": "2397914678360586517" + }, + { + "file": "docs/api/ai-react.md", + "hash": "2320953645316671287" + }, + { + "file": "docs/api/ai.md", + "hash": "1370750673706961555" + }, + { + "file": "docs/config.json", + "hash": "3543987359207085772" + }, + { + "file": "docs/getting-started/overview.md", + "hash": "15637309927992079791" + }, + { + "file": "docs/getting-started/quick-start.md", + "hash": "6694145494986083252" + }, + { + "file": "docs/guides/client-tools.md", + "hash": "14273519025856902502" + }, + { + "file": "docs/guides/connection-adapters.md", + "hash": "5245658969227204189" + }, + { + "file": "docs/guides/per-model-type-safety.md", + "hash": "3256030617826363071" + }, + { + "file": "docs/guides/server-tools.md", + "hash": "4809632627542721144" + }, + { + "file": "docs/guides/streaming.md", + "hash": "13013784700607286584" + }, + { + "file": "docs/guides/tool-approval.md", + "hash": "9066464042807483682" + }, + { + "file": "docs/guides/tools.md", + "hash": "16325322421985179421" + }, + { + "file": "docs/overview.md", + "hash": "16666925762002954668" + }, + { + "file": "docs/reference/protocol.md", + "hash": "8437841165773395669" + }, + { + "file": "eslint.config.js", + "hash": "10663859121837952639" + }, + { + "file": "examples/README.md", + "hash": "16748359222545040135" + }, + { + "file": "examples/package.json", + "hash": "11863219418170316689" + }, + { + "file": "examples/php-slim/.gitignore", + "hash": "3275384530925908016" + }, + { + "file": "examples/php-slim/README.md", + "hash": "10421311013957019558" + }, + { + "file": "examples/php-slim/composer.json", + "hash": "9613264207567594538" + }, + { + "file": "examples/php-slim/env.example", + "hash": "2131297201349357703" + }, + { + "file": "examples/php-slim/public/anthropic-server.php", + "hash": "6311121037195650420" + }, + { + "file": "examples/php-slim/public/index.php", + "hash": "2417837903883103534" + }, + { + "file": "examples/php-slim/public/openai-server.php", + "hash": "18173659856399553725" + }, + { + "file": "examples/python-fastapi/.gitignore", + "hash": "11531535563237820121" + }, + { + "file": "examples/python-fastapi/README.md", + "hash": "5085251051733439297" + }, + { + "file": "examples/python-fastapi/anthropic-server.py", + "hash": "10221115995696279382" + }, + { + "file": "examples/python-fastapi/env.example", + "hash": "14678751538489270367" + }, + { + "file": "examples/python-fastapi/openai-server.py", + "hash": "7741447488157475855" + }, + { + "file": "examples/python-fastapi/requirements.txt", + "hash": "3121617484010492675" + }, + { + "file": "knip.json", + "hash": "11637693389368211248" + }, + { + "file": "media/header_ai.png", + "hash": "16155595980942402433" + }, + { + "file": "media/partner_logo.svg", + "hash": "55685859315047251" + }, + { + "file": "nx.json", + "hash": "11819268650244387774" + }, + { + "file": "package.json", + "hash": "5827453522906564370", + "deps": [ + "npm:@changesets/cli", + "npm:@faker-js/faker", + "npm:@size-limit/preset-small-lib", + "npm:@svitejs/changesets-changelog-github-compact", + "npm:@tanstack/config", + "npm:@testing-library/jest-dom", + "npm:@types/node", + "npm:eslint", + "npm:eslint-plugin-unused-imports", + "npm:fast-glob", + "npm:happy-dom", + "npm:knip", + "npm:markdown-link-extractor", + "npm:nx", + "npm:premove", + "npm:prettier", + "npm:prettier-plugin-svelte", + "npm:publint", + "npm:sherif", + "npm:size-limit", + "npm:typescript", + "npm:vite", + "npm:vitest" + ] + }, + { + "file": "packages/php/tanstack-ai/.gitignore", + "hash": "15588699489279568883" + }, + { + "file": "packages/php/tanstack-ai/README.md", + "hash": "14854683634744827928" + }, + { + "file": "packages/php/tanstack-ai/composer.json", + "hash": "17598689768029783959" + }, + { + "file": "packages/php/tanstack-ai/example.php", + "hash": "14073889928254486253" + }, + { + "file": "packages/php/tanstack-ai/src/MessageFormatters.php", + "hash": "16119010945492383537" + }, + { + "file": "packages/php/tanstack-ai/src/SSEFormatter.php", + "hash": "9492084713636225998" + }, + { + "file": "packages/php/tanstack-ai/src/StreamChunkConverter.php", + "hash": "2495321638741191992" + }, + { + "file": "packages/python/tanstack-ai-python/src/tanstack_ai/__init__.py", + "hash": "4392043494746650704" + }, + { + "file": "packages/python/tanstack-ai-python/src/tanstack_ai/sse.py", + "hash": "3781166003489317394" + }, + { + "file": "packages/python/tanstack-ai/.gitignore", + "hash": "735431749966809933" + }, + { + "file": "packages/python/tanstack-ai/README.md", + "hash": "7496802787493610327" + }, + { + "file": "packages/python/tanstack-ai/pyproject.toml", + "hash": "6598604233429293988" + }, + { + "file": "packages/python/tanstack-ai/src/tanstack_ai/__init__.py", + "hash": "4392043494746650704" + }, + { + "file": "packages/python/tanstack-ai/src/tanstack_ai/converter.py", + "hash": "7339881801740414188" + }, + { + "file": "packages/python/tanstack-ai/src/tanstack_ai/message_formatters.py", + "hash": "17833046626683851183" + }, + { + "file": "packages/python/tanstack-ai/src/tanstack_ai/sse.py", + "hash": "3781166003489317394" + }, + { + "file": "pnpm-lock.yaml", + "hash": "227571855288972724" + }, + { + "file": "pnpm-workspace.yaml", + "hash": "2090281309662519133" + }, + { + "file": "prettier.config.js", + "hash": "2787958131156490758" + }, + { + "file": "scripts/check-missing-docs.sh", + "hash": "11439736034311242627" + }, + { + "file": "scripts/clean.sh", + "hash": "10230301901856519645" + }, + { + "file": "scripts/generateDocs.js", + "hash": "18321528774381021538" + }, + { + "file": "scripts/verify-links.ts", + "hash": "18258403061743395029" + }, + { + "file": "tsconfig.json", + "hash": "13311735335697620841" + }, + { + "file": "vitest.workspace.js", + "hash": "8308533316281028689" + } + ], + "@tanstack/ai-client": [ + { + "file": "packages/typescript/ai-client/ARCHITECTURE.md", + "hash": "1156419891256257170" + }, + { + "file": "packages/typescript/ai-client/README.md", + "hash": "5543195337634330446" + }, + { + "file": "packages/typescript/ai-client/eslint.config.js", + "hash": "7781284990019102288" + }, + { + "file": "packages/typescript/ai-client/package.json", + "hash": "12632833071421560934", + "deps": [ + "@tanstack/ai", + "npm:partial-json" + ] + }, + { + "file": "packages/typescript/ai-client/src/chat-client.ts", + "hash": "16167047103358159454" + }, + { + "file": "packages/typescript/ai-client/src/connection-adapters.ts", + "hash": "178778201273564075" + }, + { + "file": "packages/typescript/ai-client/src/events.ts", + "hash": "18016358239974477463" + }, + { + "file": "packages/typescript/ai-client/src/index.ts", + "hash": "7985168791015933538" + }, + { + "file": "packages/typescript/ai-client/src/loose-json-parser.ts", + "hash": "13253506103878445394" + }, + { + "file": "packages/typescript/ai-client/src/message-converters.ts", + "hash": "2511075561940546371" + }, + { + "file": "packages/typescript/ai-client/src/message-updaters.ts", + "hash": "18016414492299754786" + }, + { + "file": "packages/typescript/ai-client/src/stream/chunk-strategies.ts", + "hash": "2836835351429937060" + }, + { + "file": "packages/typescript/ai-client/src/stream/index.ts", + "hash": "1774238058981540450" + }, + { + "file": "packages/typescript/ai-client/src/stream/processor.ts", + "hash": "11144364974656194641" + }, + { + "file": "packages/typescript/ai-client/src/stream/types.ts", + "hash": "16593686214685650636" + }, + { + "file": "packages/typescript/ai-client/src/types.ts", + "hash": "16739993363026862954" + }, + { + "file": "packages/typescript/ai-client/tests/chat-client-abort.test.ts", + "hash": "15480987846955152030" + }, + { + "file": "packages/typescript/ai-client/tests/chat-client.test.ts", + "hash": "12693817585488672562" + }, + { + "file": "packages/typescript/ai-client/tests/connection-adapters-abort.test.ts", + "hash": "5366545113871363164" + }, + { + "file": "packages/typescript/ai-client/tests/connection-adapters.test.ts", + "hash": "7581613334078935759" + }, + { + "file": "packages/typescript/ai-client/tests/events.test.ts", + "hash": "10612527988580290080" + }, + { + "file": "packages/typescript/ai-client/tests/message-converters.test.ts", + "hash": "2431256036758945666" + }, + { + "file": "packages/typescript/ai-client/tests/message-updaters.test.ts", + "hash": "16542851151413230193" + }, + { + "file": "packages/typescript/ai-client/tests/stream-processor.test.ts", + "hash": "12032369673415444495" + }, + { + "file": "packages/typescript/ai-client/tests/stream/chunk-strategies.test.ts", + "hash": "12821827081381005259" + }, + { + "file": "packages/typescript/ai-client/tests/stream/processor.test.ts", + "hash": "4884899484554597541" + }, + { + "file": "packages/typescript/ai-client/tests/test-utils.ts", + "hash": "1914520340230290122" + }, + { + "file": "packages/typescript/ai-client/tsconfig.json", + "hash": "15143473186599245443" + }, + { + "file": "packages/typescript/ai-client/vite.config.ts", + "hash": "13571564677928348694" + } + ], + "@tanstack/ai-react": [ + { + "file": "packages/typescript/ai-react/README.md", + "hash": "7153120479544687075" + }, + { + "file": "packages/typescript/ai-react/package.json", + "hash": "8932078632468042145", + "deps": [ + "@tanstack/ai", + "@tanstack/ai-client", + "npm:react", + "npm:@eslint-react/eslint-plugin", + "npm:@testing-library/react", + "npm:@types/react", + "npm:@vitejs/plugin-react", + "npm:eslint-plugin-react-compiler", + "npm:eslint-plugin-react-hooks" + ] + }, + { + "file": "packages/typescript/ai-react/src/index.ts", + "hash": "15989044881223344136" + }, + { + "file": "packages/typescript/ai-react/src/types.ts", + "hash": "6386419347199255664" + }, + { + "file": "packages/typescript/ai-react/src/use-chat.ts", + "hash": "6854434043721794412" + }, + { + "file": "packages/typescript/ai-react/tests/test-utils.ts", + "hash": "7818138902521845568" + }, + { + "file": "packages/typescript/ai-react/tests/use-chat.test.ts", + "hash": "12578468655140039264" + }, + { + "file": "packages/typescript/ai-react/tsconfig.json", + "hash": "5405973005111661208" + }, + { + "file": "packages/typescript/ai-react/tsdown.config.ts", + "hash": "15858091543790361771" + }, + { + "file": "packages/typescript/ai-react/vitest.config.ts", + "hash": "8557672221221695996" + } + ], + "@tanstack/ai-devtools-core": [ + { + "file": "packages/typescript/ai-devtools/package.json", + "hash": "16807938235866892752", + "deps": [ + "npm:vite-plugin-solid", + "@tanstack/ai", + "npm:@tanstack/devtools-ui", + "npm:@tanstack/devtools-utils", + "npm:clsx", + "npm:goober", + "npm:solid-js" + ] + }, + { + "file": "packages/typescript/ai-devtools/src/components/ConversationDetails.tsx", + "hash": "12734242460332145705" + }, + { + "file": "packages/typescript/ai-devtools/src/components/ConversationsList.tsx", + "hash": "3302316628300575077" + }, + { + "file": "packages/typescript/ai-devtools/src/components/Shell.tsx", + "hash": "16027474093298434279" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/ChunkBadges.tsx", + "hash": "6521719718475907925" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/ChunkItem.tsx", + "hash": "15636051996732514371" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/ChunksCollapsible.tsx", + "hash": "7525547476706586118" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/ChunksTab.tsx", + "hash": "12075376337752252644" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/ConversationHeader.tsx", + "hash": "10988238669684967982" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/ConversationTabs.tsx", + "hash": "1542237355685355507" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/MessageCard.tsx", + "hash": "18042535898588816273" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/MessageGroup.tsx", + "hash": "8185853742723965863" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/MessagesTab.tsx", + "hash": "2508769078004343842" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/ToolCallDisplay.tsx", + "hash": "17831326395086798160" + }, + { + "file": "packages/typescript/ai-devtools/src/components/conversation/index.ts", + "hash": "2409654139849153307" + }, + { + "file": "packages/typescript/ai-devtools/src/components/list/ConversationRow.tsx", + "hash": "9225191833044278525" + }, + { + "file": "packages/typescript/ai-devtools/src/components/list/index.ts", + "hash": "6982889723429263661" + }, + { + "file": "packages/typescript/ai-devtools/src/components/utils/format.ts", + "hash": "9915902800726047345" + }, + { + "file": "packages/typescript/ai-devtools/src/components/utils/index.ts", + "hash": "14393207116636301480" + }, + { + "file": "packages/typescript/ai-devtools/src/core.tsx", + "hash": "1477975059824520481" + }, + { + "file": "packages/typescript/ai-devtools/src/index.ts", + "hash": "7474352075292438948" + }, + { + "file": "packages/typescript/ai-devtools/src/production.ts", + "hash": "10347483870229824551" + }, + { + "file": "packages/typescript/ai-devtools/src/store/ai-context.tsx", + "hash": "11691516537858892483" + }, + { + "file": "packages/typescript/ai-devtools/src/store/ai-store.ts", + "hash": "3120989652886489610" + }, + { + "file": "packages/typescript/ai-devtools/src/styles/tokens.ts", + "hash": "10856849725541711873" + }, + { + "file": "packages/typescript/ai-devtools/src/styles/use-styles.ts", + "hash": "17476975403922516340" + }, + { + "file": "packages/typescript/ai-devtools/tsconfig.json", + "hash": "2560743061830725618" + }, + { + "file": "packages/typescript/ai-devtools/vite.config.ts", + "hash": "13228817740114069865" + }, + { + "file": "packages/typescript/ai-devtools/vitest.config.ts", + "hash": "16166077380570933860" + } + ], + "@tanstack/ai-fallback": [ + { + "file": "packages/typescript/ai-fallback/README.md", + "hash": "6761501137729243856" + }, + { + "file": "packages/typescript/ai-fallback/package.json", + "hash": "737870455585130161", + "deps": [ + "@tanstack/ai" + ] + }, + { + "file": "packages/typescript/ai-fallback/src/bound-ai.ts", + "hash": "8736322061514036670" + }, + { + "file": "packages/typescript/ai-fallback/src/fallback-ai.ts", + "hash": "12060290602746820311" + }, + { + "file": "packages/typescript/ai-fallback/src/index.ts", + "hash": "4337915932762348500" + }, + { + "file": "packages/typescript/ai-fallback/src/types.ts", + "hash": "11422455793641892216" + }, + { + "file": "packages/typescript/ai-fallback/tests/fallback.test.ts", + "hash": "9312394412985838318" + }, + { + "file": "packages/typescript/ai-fallback/tsconfig.json", + "hash": "17487793864479620212" + }, + { + "file": "packages/typescript/ai-fallback/tsdown.config.ts", + "hash": "10187296086296757619" + }, + { + "file": "packages/typescript/ai-fallback/vitest.config.ts", + "hash": "7615621961327142822" + } + ], + "ts-chat": [ + { + "file": "examples/ts-chat/.cta.json", + "hash": "17957252993989621813" + }, + { + "file": "examples/ts-chat/.gitignore", + "hash": "9533296198461232274" + }, + { + "file": "examples/ts-chat/README.md", + "hash": "7996730016093040806" + }, + { + "file": "examples/ts-chat/api-verification.ts", + "hash": "14298611812373499017" + }, + { + "file": "examples/ts-chat/env.example", + "hash": "18377011614814965924" + }, + { + "file": "examples/ts-chat/package.json", + "hash": "17167067345745576093", + "deps": [ + "npm:@testing-library/dom", + "npm:@testing-library/react", + "npm:@types/node", + "npm:@types/react", + "npm:@types/react-dom", + "npm:@vitejs/plugin-react", + "npm:jsdom", + "npm:typescript", + "npm:vite", + "npm:vitest", + "npm:web-vitals", + "npm:@ai-sdk/openai", + "npm:@ai-sdk/provider", + "npm:@ai-sdk/provider-utils", + "npm:@tailwindcss/vite", + "@tanstack/ai", + "@tanstack/ai-anthropic", + "@tanstack/ai-client", + "@tanstack/ai-gemini", + "@tanstack/ai-ollama", + "@tanstack/ai-openai", + "@tanstack/ai-react", + "@tanstack/ai-react-ui", + "npm:@tanstack/nitro-v2-vite-plugin", + "npm:@tanstack/react-devtools", + "npm:@tanstack/react-router", + "npm:@tanstack/react-router-devtools", + "npm:@tanstack/react-router-ssr-query", + "npm:@tanstack/react-start", + "npm:@tanstack/react-store", + "npm:@tanstack/router-plugin", + "npm:@tanstack/store", + "npm:highlight.js", + "npm:lucide-react", + "npm:react", + "npm:react-dom", + "npm:react-markdown", + "npm:rehype-highlight", + "npm:rehype-raw", + "npm:rehype-sanitize", + "npm:remark-gfm", + "npm:tailwindcss", + "npm:vite-tsconfig-paths", + "npm:zod@4.1.13" + ] + }, + { + "file": "examples/ts-chat/public/example-guitar-flowers.jpg", + "hash": "3860872875571240335" + }, + { + "file": "examples/ts-chat/public/example-guitar-motherboard.jpg", + "hash": "2741907069919080163" + }, + { + "file": "examples/ts-chat/public/example-guitar-racing.jpg", + "hash": "6536003299929325317" + }, + { + "file": "examples/ts-chat/public/example-guitar-steamer-trunk.jpg", + "hash": "146542270860809738" + }, + { + "file": "examples/ts-chat/public/example-guitar-superhero.jpg", + "hash": "2110668839341553839" + }, + { + "file": "examples/ts-chat/public/example-guitar-traveling.jpg", + "hash": "5435312409484947607" + }, + { + "file": "examples/ts-chat/public/example-guitar-video-games.jpg", + "hash": "1491568140000221261" + }, + { + "file": "examples/ts-chat/public/favicon.ico", + "hash": "2949791817221603359" + }, + { + "file": "examples/ts-chat/public/logo192.png", + "hash": "7585273181698778288" + }, + { + "file": "examples/ts-chat/public/logo512.png", + "hash": "9339365414554387981" + }, + { + "file": "examples/ts-chat/public/manifest.json", + "hash": "425001267799769451" + }, + { + "file": "examples/ts-chat/public/robots.txt", + "hash": "2790380794362165217" + }, + { + "file": "examples/ts-chat/public/tanstack-circle-logo.png", + "hash": "1267347947504420788" + }, + { + "file": "examples/ts-chat/public/tanstack-word-logo-white.svg", + "hash": "2437888107770601788" + }, + { + "file": "examples/ts-chat/src/components/Approval.tsx", + "hash": "7910045894079159035" + }, + { + "file": "examples/ts-chat/src/components/Header.tsx", + "hash": "15489940022761222780" + }, + { + "file": "examples/ts-chat/src/components/example-GuitarRecommendation.tsx", + "hash": "6697137368594663627" + }, + { + "file": "examples/ts-chat/src/data/example-guitars.ts", + "hash": "1493943760047990028" + }, + { + "file": "examples/ts-chat/src/lib/guitar-tools.ts", + "hash": "2543780594518725512" + }, + { + "file": "examples/ts-chat/src/lib/stub-adapter.ts", + "hash": "1509607428678335901" + }, + { + "file": "examples/ts-chat/src/lib/stub-llm.ts", + "hash": "10932251380340004125" + }, + { + "file": "examples/ts-chat/src/logo.svg", + "hash": "3942313435587414446" + }, + { + "file": "examples/ts-chat/src/routeTree.gen.ts", + "hash": "12338247319306000875" + }, + { + "file": "examples/ts-chat/src/router.tsx", + "hash": "3872645124130335506" + }, + { + "file": "examples/ts-chat/src/routes/__root.tsx", + "hash": "16414886355281670793" + }, + { + "file": "examples/ts-chat/src/routes/api.tanchat.ts", + "hash": "17234137480219775210" + }, + { + "file": "examples/ts-chat/src/routes/api.test-chat.ts", + "hash": "11255984911709387429" + }, + { + "file": "examples/ts-chat/src/routes/demo.tsx", + "hash": "16388829717604153208" + }, + { + "file": "examples/ts-chat/src/routes/example.guitars/$guitarId.tsx", + "hash": "17562506041613072548" + }, + { + "file": "examples/ts-chat/src/routes/example.guitars/index.tsx", + "hash": "14231250696734596752" + }, + { + "file": "examples/ts-chat/src/routes/index.tsx", + "hash": "8185393998693565299" + }, + { + "file": "examples/ts-chat/src/routes/tanchat.css", + "hash": "5438259874171855668" + }, + { + "file": "examples/ts-chat/src/styles.css", + "hash": "16519577060105603698" + }, + { + "file": "examples/ts-chat/src/utils/demo.tools.ts", + "hash": "13761334072357408477" + }, + { + "file": "examples/ts-chat/tsconfig.json", + "hash": "18286238709166217558" + }, + { + "file": "examples/ts-chat/vite.config.ts", + "hash": "7763138038252414933" + } + ], + "@tanstack/ai-gemini": [ + { + "file": "packages/typescript/ai-gemini/package.json", + "hash": "2232407804374453143", + "deps": [ + "@tanstack/ai", + "npm:@google/genai" + ] + }, + { + "file": "packages/typescript/ai-gemini/src/gemini-adapter.ts", + "hash": "15344987649265123847" + }, + { + "file": "packages/typescript/ai-gemini/src/index.ts", + "hash": "1810521445822028207" + }, + { + "file": "packages/typescript/ai-gemini/src/model-meta.ts", + "hash": "16187662143579125151" + }, + { + "file": "packages/typescript/ai-gemini/src/text/text-provider-options.ts", + "hash": "9043538609512896446" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/code-execution-tool.ts", + "hash": "12270816637141460797" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/computer-use-tool.ts", + "hash": "17977892481738570344" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/file-search-tool.ts", + "hash": "2852673093464598373" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts", + "hash": "6778001202763125943" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/google-maps-tool.ts", + "hash": "2981941627762861366" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts", + "hash": "12394937234886637812" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/google-search-tool.ts", + "hash": "11790355173669636127" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/index.ts", + "hash": "388511333951589562" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/tool-converter.ts", + "hash": "17848454382125284680" + }, + { + "file": "packages/typescript/ai-gemini/src/tools/url-context-tool.ts", + "hash": "5805711885094551762" + }, + { + "file": "packages/typescript/ai-gemini/tests/gemini-adapter.test.ts", + "hash": "2889544286000887040" + }, + { + "file": "packages/typescript/ai-gemini/tests/model-meta.test.ts", + "hash": "17565011756602352194" + }, + { + "file": "packages/typescript/ai-gemini/tsconfig.json", + "hash": "17487793864479620212" + }, + { + "file": "packages/typescript/ai-gemini/tsdown.config.ts", + "hash": "13921512206456352195" + }, + { + "file": "packages/typescript/ai-gemini/vitest.config.ts", + "hash": "14379467452428811752" + } + ], + "@tanstack/solid-ai-devtools": [ + { + "file": "packages/typescript/solid-ai-devtools/package.json", + "hash": "12030619632275185766", + "deps": [ + "npm:solid-js", + "npm:vite-plugin-solid", + "@tanstack/ai-devtools-core", + "npm:@tanstack/devtools-utils" + ] + }, + { + "file": "packages/typescript/solid-ai-devtools/src/AiDevtools.tsx", + "hash": "831131791389423336" + }, + { + "file": "packages/typescript/solid-ai-devtools/src/index.ts", + "hash": "13634138679122569959" + }, + { + "file": "packages/typescript/solid-ai-devtools/src/plugin.tsx", + "hash": "6245929956183148441" + }, + { + "file": "packages/typescript/solid-ai-devtools/src/production.ts", + "hash": "14512530177798002641" + }, + { + "file": "packages/typescript/solid-ai-devtools/tsconfig.json", + "hash": "1306631043222942463" + }, + { + "file": "packages/typescript/solid-ai-devtools/tsdown.config.ts", + "hash": "15766826510434865934" + }, + { + "file": "packages/typescript/solid-ai-devtools/vitest.config.ts", + "hash": "16166077380570933860" + } + ] + } + }, + "externalNodesHash": "3578599483009164216" +} \ No newline at end of file diff --git a/.nx/workspace-data/lockfile-dependencies.hash b/.nx/workspace-data/lockfile-dependencies.hash new file mode 100644 index 000000000..a8fd66e7e --- /dev/null +++ b/.nx/workspace-data/lockfile-dependencies.hash @@ -0,0 +1 @@ +4773244219203613534 \ No newline at end of file diff --git a/.nx/workspace-data/lockfile-nodes.hash b/.nx/workspace-data/lockfile-nodes.hash new file mode 100644 index 000000000..a8fd66e7e --- /dev/null +++ b/.nx/workspace-data/lockfile-nodes.hash @@ -0,0 +1 @@ +4773244219203613534 \ No newline at end of file diff --git a/.nx/workspace-data/nx_files.nxt b/.nx/workspace-data/nx_files.nxt new file mode 100644 index 0000000000000000000000000000000000000000..bc396a47facfb182d985bd996fde625599727bf5 GIT binary patch literal 32748 zcmb`Q3!G$Cedh<`LVQ7hFd(o>L`Bf*uBuy4A2@AK&(JUrnCamaKejd9HQmK@cU7vY z=K)b$qcMI&L?eD8#?=G`9~%sWCI~+AL8Z19QvOAKEnHt89GD{9Jmtf;~am+p*}vtnZK2*dHDiI)b3i| zf05%lj_5kkXFw}A@DkB~?cd+%&-(l(UcSO{Gl#x^E9bxGxQ!$F-W~q4J2~I&@vn3K zhJUYi-!$*<@$a8ce;T_!zZWbT-+iX-1H2c1J>oITYx*AWijME`qVo@Vd7R@X96#ky zo2cKz`CRn>1pjyc*^~YpwR;Ns=LX~L$}f4*S#5sB8(ma`6)jxHA%;H8x7Fu|dtC4J zC%!$xV@Gk;cZDCv`{OzE`Kg>w;}D+nXWjQG@A==g*Jp)Qv@p$Q0AAt{t-mVoYo3m- zr|YQC*LnQ)ocZ5jQJd2N)^Ut;OmJ-A2zxwmK;PB-jUGFL^I87=X3kqU_hek<^7>xx?aQJ`i>5@(VxDz(|q1(%v(1IvVzb{E>GukiLakb<6bq%GT&)+11zujKwjqYjno4x+XOnYfpYcA}mQps1VK`mdd=IcRFtK`#qqK{pT zg@v7rbF|-^ZSP$&edHNUv0lm7D!f+9)k>kRYqn>4qf=YAZkpaUv2k+y)V2$z&)G3K ze%AE%sj+QSBa5?za=Bco)$>86#JLz$f_#v1?Z#4nzT57!W`^gYSg!{4Vxe5g7lUG* zchz!pUt_VepxNx@X674x_odlJzcK1R$;~ad`i*W+6HuxL^-@r+i0&^ zXf|e>UB0`oKz3*5J2r0~+japn8PqHF zfa_Gtl|m&S6zW0cU~fWWW|G>inWko=nlG2~rBb0zZ}kE*Td2ErY|J(~++uIEy|B<& zZ0MT#GQ3jF)1+Ff(!N^CxMs|J;$w5uFyS7$Z1h|0rP0mJUXL9x-ssM{X{hB(#d1)t z)obNityZWMtIy6G{`w;q_1a7D6{}jRRSTtRP|X)Ib_i2Dv(RD<9FH{jXf-qswS1w% z)r&#BUM-cX)lwzv^4(@*rk`658AII0CUv*sZle+eB^aT`lvWBstqMz|&C>8j)m(KJ zmgiba>ZejHmFsXf>st#7C3Tn9O*j^@OSIozH{JH^@{DF#cb2aes-<$Rln zbB&$tZhyqdA;ts0=j*jVtkR^ZyX1d?p*Uxnt>c~wGqbVRnm>O2SQY^=V z>dbdW`;8^;Xl6H}FcJYH;Du5i!N+zh){5m)3Gr19;<<=qhwsQSRiRp_RP&W;P=edb z2s$KY{DoDM*KPjZa;w{13^{6FKPVJo0XUKg&zI^&1Z6zNL8(8mc&(+`=05JRTB;)K zi}`A~STB}>TD_Dhr`!&8{2YC`o-Y>*^?a?CFQPBV*fNTfT1VZH0{E@C-jETME8)^Jrs zUAfB6;hyq^BArxI2e8ndYmfBy%%M_>K_Otp%C)M7TS}d9w>RQh8*MJ_8S&kg%K3U8 z!CGXs3cM}V^Qjl?wwDphx=Dmf5k*>HcF?0-IG=jSbV(C2N&zLz_iGhd6-Bmqy&S9Z ziF46B)8m^ab(-8VHL-D<(?cwFt$+j*yw^>V(L#TT)?p_PpYb}%5>75?h*yA*M; zUM^KCSvw}-z))DlbhI>)u)@A6Ap(lxXIUNf>hP*`mUk{-r|fF%X|Xd#c;QQR<`eEg zcCw9va(!qm{kIkyORZfp(4@jpfO(j$QpGN*R_d(npel}s$=z0AN;U}%Yqe^XjZ&*d zR>Sz#En6nWoy9P=e(db2iEZ1bH}05RKcR)g?8(=e!b(tKhoI_GmG~+?)q>17x=ZLe z76VPf7c0fUDFe75dv}Ev)R6rcur%~itYUp&f7Q#yR3&M2%0XD5Rz!vB%ZZa7cP))m z39!&Gau7}hD^5@gx!yu+adc#^)o;x$wYyCQRz^>j0|Y0+L#9E7_=s1;h_b!Sow;4j z{>*$N&FH9D3rZ!V2=)_dE1$IkoWdKmvba_cPywt~ku}3YDwHxM*=lQbai$ZEpi)5` z*XmXHt6U1OkAfiDt~2vZ)Z}8T*J~}!ITL=QH_rqGSlO^{iH%k)Y34F!V8}@B%{Lbo zq6-HF6fU9>frjSfF6vpv!%#nsPG@013g1j*8MR%>7clwrvj6MZqQskc{hs%GoPiif zEYvW_@~kY9s}Pt^F@X6Gjg!wKr!Y_o!#2F%vwkmopCY#hrP$8RHLwClF6zwTUof^B zrUrlP|6(Pv+*X?=+E?5Atoq{k{PNQ7ac3V(ywk8)s>3%JrP3z_%yKhzq2)1P<*2L3 z>Y2vsnV!ax>`zZ)!m*afub_k|Lnf9n;ZyfKyUn@VjvyyxE^y?%-}=6eP0jKT&Z12d+V8_g-k=>{ zMu?YDQF3x*MR4Dep!3T+M<=&$-!U;gHG%g!HZ?K2b9rvM+w8~(*uS{I7qF_4E@;Jy z22`ycgiL5H;wz52*PQG;_FOmD?#Rc{yw|yWp@wwhKMZx^8yVB?~*F}!XJ z)*z2$fqU}hLO#>NH|81)h7*kYf}W`1{p-6K(>k<9%UvAsHem!D8m$+jC@UIMKt^K) zYPlIx+}moQ;T&odoOe*zg2Ys+EGyPY4FfAnxy1X%=&E6MVL=JgVD+Qqk%48L;&>#3 zyV6MP$eLtL@!c_A5zn}}aJ4>C# z+(LV1_sIUn;sOiA^wiwA&|=kMmH->rR9TS+Cu@7-GW|Qf*3JdRLH6NhmD#SyA^bf8 z9V|x1eGiMZ)>3ELxuvjnkpo#o^a1ZOpXn=ynqHF;%^iYJGgrb%FBSy7 z&$nzj$Miugk1*=z5H=1)6dvOHB2SG<)9=@3j18=yv*oAll3Rp?`nds#n+!MA* z7*zH9A(T5}5643RrCn8lDN*K#YnYSH{jA zkPgHf&;pFvy+H)9cQN~%PO4Q9>e%VlrEsDWqcjXMEY9MLRzYf1vpp)Jk1*RJZy&%4v{gGA$>R3 zZqH#xE+TECZHZY^sKao0fQSqDEEs}NNP{$0<7y))-Oqhg{_=IJuS=ObWgfK>8^HJdx zNMKY-@(}C9rwP|pQ!UF-T}U`YrneO&h)v`!2@K6AYLDfKT+_McQnQO?y`H=hTOIX+ zSs~?uG3z|Q^eG>{-v2`mEY@|ar%?eOCE_HYstk$2eZ(Hk_X_J`Lh{+8hkVr|? zh-(orfp_r+(ylUm%LCpGV!eWaj-nvFB$1k#+c0b|c}GIcWs8hILAa1O1To<{(F_d# za_WGFH?CcC1T7;fC?tbnhcaLf$E+XO3Ysmizer7tAe-buvh#?lDP)PvB??d{+eSDb zZBpR4#7fBG;VPjSOg-Xt1Qyv&cqZahWioB}Q<|EbCsI!#0y35+Q$*|Q=xDbje4LaiR1Ezm~Qo;B~@Uea3@eEq( zLlQa7QbLbnGm>f`Y#Fd5*y0%mkkeH=8yHzW{I5m94}!Va#Y~ONSWMt(BCQoLJ!}D? zOK_Rd0P?8_7Zo$}K?4q|S93E8oS?%cDCSy(V6@U25V0b%7gZwDk{0Ac%JoRF%q%n; zOA2$5L535F`N+{>VX?(BrZ89 z-D{d(tK=Oa1!N=62|@<0&sdb4&t!;W!nbyHi2o?|$rz<)N;o)44lrfIO;2~*?a-r9 zG@}Na$@fw&jF@l66d4mFii}_f5uf+55j;Gs2idx$Wr)tR*M>GdJ3Z$T2(1~HCDuX` zH+Ak|f-1*RlJP;%6Fw{DE8fz-7Dl1E{5+z7=jijX09@E@KyoUB3?ZyZ0TLZ)lCN2cYnreOW!}`vFdH@^7h+YCd(33sQ1qfWmZTSU zHq+!UsaPZx41|G8MjW;s5?R`W3TTBswbKR~Hhj$j=26QSIMN82To*F!fWd~FMpzt2 zMbS7I47*|Iy6Lf$UY}%wDwDdX#V{Qqms@&}a;-d_COxrmVdl$s6^a5-GRjgliU(on zVdNx>#k%tb_r2jH25lj?H|b~0^*Ey&9y(1QU&R4#RAxsgOe=nZ5r<>itK$G3xzFpJQ>QJz3zYS%)0Z*R2Q z#3VyQD?gy@tCEg+N~x5HdzL6@I0;c9mpA_KF3@MVOY(IQ8nAvE*9`kjV#cHjOExi+ zC%L2WH0DRvV1|?;v1=szKr$3rg6~2shb#l5!t>5j@o|LF?G06k$`Ha5QZ5J!OzB*7 zXJ%U3m|_d7trGHMYpV_mQ>H!~G%*|8%bt-aei(7bK1L)y&*Pq| zL`t=w8MhQFWkfnTc1nmy<}CGzFtw3D#&pNGgIO?^RMmn?!zD2CYQS&`$1vYtTwwch zVfLM?gCN#x?889`;Uz6R(i=?-1kW-UJxY#Mkklk0bn#?PJnw|@Mgsc;BGA1!O2mB- zal_Ren!Gs6VZ0Q{i4l>j zMG?h*c#)_BVxNl95y~hf8g#Y(i3L$yeK_Aijv@=VRUC7bVi7&g7>3`03z$^7P$uZr ziRN6RJGboX@^B2fWpNiZqO2d>n_i*GotbSEu0U9=t+`jA5oVzt1M7fsVF#v-Yd8)f z&KPU0_n|Pl+J}lo8DS=?#*YO_?}_1r(u%^<*o;>6lq_4ZN(`+UT6mFcZBYQ(4U0fk zvDaxWwENU9C!p4tVr6V<$!DxcB_Z%NVQbckeL&ou-AA}L*$0uUIAE-(Mv!74R16Uz zWd*SMMrM|~y>>S&r(yN5&alvk&Qlj5z6uMQy3Jk9ZgXj-sr+}pJwqy#3MJW1R6LLn zAxA8IF}%HG=0-twDkY_Dl{}=VQ>B80aYnHHmng4q_EoK@%6FG47_RY%7j3l_8_zNB zuS`IKHe?4&L=^DU;%^PgmsMIlF7^)HU|;tf2~QLpxds9s1W$>^qUx&A+9i6ivD|O( zYVDI=WFIQM#x1f&tXaym7?JHlX5#-SXoi?(%X1}|o*G_cP^uyyP22gDey}u#3%oQsUag3%O(8=B1z&u4Ve)y zg|aY~9WAP-8PYNr-ZEDz2I;Bf7_*P$aiJU;+pJ8MkvPDOE`OkK?(U{5m~b5A!kz?{ zlo>^SJoDH?nVJ^a2^AZYw*&*qsDicxvYWMaDn861aypwbV5cv#NFEF@RXhg|4G+&nO_ARRNhy<$y^yDAk!mMgTv#^gY@wYe~&KYV~s1-7avTOov=N!f!;G zVDl_7;njRReKaM#fp9{v;I_a`!D@pkyW@qixFdO z?w2MM3bFx^LxjZf77!}vvy7!P!p)}UU|pqU5G{3t6CM}pFvBK~q*A!EQBuQ|B;nR3 zYYk^(nQ&h!kf>(X7!AmrtX$U=lQqsFt#9=@3yuA=^;NfuE{ zkada8;S)K%sm4xqkCBHBicrBlClsh$MOb&B=SfI1PDf?@@H-wODvojviW)NO?)>Br z+ChXgap1Lo*m+2y>=5ojO_RTejYL^Gx(QWd5y?Yy!(50M+>mEy4abXs^Q@p4tS4T4`YF26cZ-o@ockWc~Aix_Yf9!*U}_J&WpR3TAk3A#7RcQ5PMOm ziie&k?a1gnwnd#y6_(lTQ&tVZMNxYA1QMb6OpPA1IffQu-bK1G7m1?Qv+Uo4TW+)V zEV@i=Jvc%pp2B9?YP?bl7p9I?e91FRJorn=!R#ncAhT+f74Sxj z)v}f~W~Bk8EMJW9A78~nCf>kvl^M4mS=MgoUS!7s^l;1!MTK87!IW6iBxH0pz+*lH zqQHOn7G}a|WQ%a`3i!jfID9GDsZQ4!xQbArB)AoFqq3OfBS^BTM0{8m z#(YgRpdM8qpvOECx?nQ1q=R+zpE0Y7Z^g93p+_AVf|9iG z9l`mHbFlV;zQ;rD%E7fXT&zR?H~#k>6NB4e%vjJV>7{+DsG`+Fvsu$%;3I zYD6xu%Ye~K6mk|_y zU=t%Bu}`G1%OSTJt4ZvLELZsrQ%0#@Rvt1mC8P8sf>SkyYKWgoE_I zFQAit&PF#moNduMdmkwbHZcOibm(P_Zhn$Nt~(VX86z-O$ZBz_a23%C0!6COA?w2~ z%jza;md1^S?row_N)v>LBr%M0LFydcqUZ5qQ55BnOlX^glS124Y3w2d88udNMl&BV zFfOs<1c^VELcX{Jh0<600f3Ad@!uZXHh#wB6c5Vp*cKXguqvWgMcsrsnAxldlxNu0 zmafa0LeIXYx ziyj_yMtOxC3hYNr59OY<`kskQa@BWzP(Q5X%u#+@hpB?WzV|EPh4_Jrn0QLY%U+Go?wp!10 zSz>~w(JF3qKaaJo$w%bLd7PObp*FIn7a@WFKzGu@#`+Cyo;axIg-iI$3q%;m8zX+v zuM7n%i@lv8zLVV`K^H%k#Y}7UoxDXLpbB_ej35$qO*k^c4}^Jn64fr|W?Eh9yxmhw z?x8Y0v`$=>ktiBPC^%!02Zv+kDl|^QC<>!O1ya93@{d?QGFbI587p=$qH{gJ^A^@S z?$bk?Jfp!=8Z4xK@PTrnxaSl@)0qJ#-V^FA_t3$9Wzbmwwgwgw>w(seyD~b|si&lT zYkm74C+PHYY(r3j@_OUWuA<>Ha7&b{l7eDphh zf`XtGzu$z5qJn0zHhZ25;`AE(;Vm~5x=ML&EFO=Unbq6Y@IyGyHZJj|#w;}lZr`BE z@fC=N!EfXpvctonW#H^VC9Zf%ZV88t$gVdK2+%8aMiDJH3!|~gGsbBIgRfQ@em0_q zMkd~e7$y{hwp95?Mt8>Qj}3BM3~r2wF;N^?pIwyp<@BN#g4X6I4oKAE?ZB4!gKQzi zQ_{M!(=T0_6nzj*l9GiRNxNcc;`$`JWN-of#Dp{Lr^bZP!-+;tVFZaeiO5iVOF|@L zKvq2|?Khh8BN+_IJ>sJQI?D<{da&I^vrSl$8Kz80&$}xDon_DX0S(y_2WgKCZx-#p zXcT14Gz#LHBrB*o%q(dgnido7!fDfwG(~l?l%dOPb&(JL_rc$sn^)(z;+ciAxI$!-oFnIwR3R5|cQv9(TaJ zA;ynkZQ~9Er*dK9Si2?HYw(*z`*GWFXq0rvr)DN(O;=a_3RO4@a`1G2Sls$eFXfx5 z)kwWtJ5+nCL{emZ;o}nz!UaLaq}}PN$%-Qwdg@n2CrZoU@?yKEeS7uAcea<8^b4u1 z7A~*?z|v|+5DGoAEK=tOy9(o|)T!UY9>QkRv-|v39<>(CLdNBj+{MA{(3o8#KS?v@ z<5hb6SC6TMWqZhCaY?-vC1Y3p?20#4RZ>k{gb70SizgLHDOAEJU-ToNp|EF7iG)#S zqB2XKJ|W#@lBokiHHkrmMksb8g)7MqvdCyuVg$3C=s)rcGm>8c*s^hA)7FjR9o2=x zkunQ-NXb1@6W@C5t(XcM1*`CP$q@4l7$pdV-ZSPqMcnJrjwoa5^(uv9%E!nkgpc{l zT)${v4OF2KUQtaw%g+X7LX)Q*-J@Xq;_cML_UZVS5V&JZF&0l@Rt10c80l~-QETly z{i$xVIYPc(GKG>*egg=Gjm4zRVLf++?M;O7P-t5kJDuz(1hUfqG4Tlv%$G|GU>5IPjYrPH{h3J_>yz zwD1oYT))e{(c?E6JP*F#;}07A<=~%z)^E@s_SvNWBJ@{1K4NhF2KaNj;J@gF^OFPr z9cYc`-KM>M$9~e|HyFGG-htLQ|78{aDc^qW=acK|x9;!t_!|ta{+|P_>+Ui58=y~x zR{vKSTx+}2x4+HcT9?Z_{xIi_{qVm2Gx)X8>gRxI|0?LOdHj`MNXDu4`mx8)GPu^| zNNA0-!#SEa;T350f0=3jGUzw^_O}_l4!+;F|FOY!-D`dOqyK9%o)Pf-ef!rKT=#Xr z<2wwl_QyhNJZ*!&6nY)B#{Z`V7vEm!+uv;PlfnPUxBn*R=zhglS9|WFp zMKb>10{d_)k6FGWhGjUjnUhe$e3BcT*m}f^)RK zF95&T<9C|&k~1qF|KA4Jb+7aItNt<>kM{fj@c3H{uJIfVt^2yn;Ob`*TI0Ok;My-2 zd;DJwE_rn=wE8*Wy5zd*=er(1!{A!?!=TmvZ3b8WC1_puR)bGKw|x7@I7jm%KKz_- zf5P?2b;rQJ?%Th?;HQ8e3a#tD+2G>yQ=xU;KQ_4L=M3Ne27|v6{Oun9H-n3>J_W7) za@1cXIibeEZjepY8dOfA3+kY2`-htMAeb?aP z=TAUuJkP%&8BY!RHgNU-N`p&I{x9FpW`j!}9to}X7aLsbSoio127e=X6I$c>s=?Pn zf6}-AvB5RY>wNnc{&g}=t=Ij&{b>f*IDhWjzs2C>G6-5_R{0? z9{()oC%yi4^X~CmO?%0=k3j45Ck!q=|GdW!{ZcZ1$)ATjel&PA9<9f}d;GPgz2^DX z9^Ykf&GRdub=@lrUV=Wyp$GPuU`=N>=i#$YohIZ>_aE)`qxBrg8w}E$j`$KL@`U${q1=szS4KBX=H{VYKJX%MM^QF)l&wEXK z?f1>l8qX~TS3f=9{vLztzOM1@|Bt~nZ(s5F=vR_)${zb?a9wwo!6ko=hZcUR!8M+3 z9>3P$l4JWk{u6_bgJ0?KUvQ50h3tn1Jw9@CG9KO6_dUMb;F80~Lu))&8eH>yp2u(D z9QCj9{2{dF?FrLf`s=g4{o%JH*OmNy$hRLixW@BKkI#cg>!o=ZfmZ*QnD)m(Z}<2W z2A7?-%i~`&xW=>M@$Va4{C~a2*Zxg1PVwirz%>si8(e&L2(<93!8M*Epf%2E&e8lx zKIr?xKWf@*-Oq$pKMxpuBlJ5x{)E9#0KWrT{rsA9G(Vyr_V}xBO~x-ie;i!>Pa0hJ zyB1pC+hcIat1`6Ozms#+zxbyCt^2;+wBG=|2(5m;Z*chqf8p`x|7|iJt>d@A)z2FY zE_wAc-~IxFOa7k%t^O}Dxb(|_-{4xW z6QOn84;cKl(Bsg$?#%`dp!fOqKj0kAoBZW#pmo2$Hn{B1Z$qn})BZjgkJjr);JWUG z1}{Ocg%*Cf!KE)Ipw-Wp4X*KD;_=4~E`GksYlN7dc0Kvb4`7)DKhp_nP)Efxf`EzudHc5qJ+;*S*@bmp$aP@PV!B2wzrN?Is zu6?%_TJ0|}xa`uc&>H8B2A95`^Z0`XmtMZg<4+r0{CNko`mfxTj8o(Pk#B#l!KJTX z2Ca2}hr#9Vk3nlZpE9`SxdpBMZ#TI1`};lqubiX#7oU95<7@9u#v}RpkKpS69D{40 zJ_lO;f85|(pggklk3W_e*|3pOdEU?^lv~5 zztZ6ApwIO9XAQ1)@A3GTI7jy@{Ewk^-TO>??Ylqo_|pd0JpV1UzE}N5GES}6;~rlR z9`&zvdKt9ZFPir1XB1l3{e;0K|IhdB?=-mNH7o8oUU-vTK)X?Hk{JPumpyv*S83pPS)Ja-se_j|F&?=!f*|3#1g z%HZP9TRootb}~-&^8;{wZ^q!_{}Z5f-MyTn`8*DKE423UpP2Squbt59=W2tCewWAZ zF}UXW!yf;>!KF{X0Fr=4_kcu z8&=_aefxhgxa7|#efwkXOU5JoTOL2j;POY-Kx;gw8(jSG0%*zk^9(LK>Qrcr^X&%L zeqRTzdA{1jew61%R!2{@1pf&!_8(j9) zxgNjE;JU9Xpw-V$3@-WeSHAt)`;+l#{vY)1-)L~%?;+6YXScy6H(u@W%M30#a2~YA z`8k8jp1j!O|739aBOmej4>-TV$3{j`(fU z!AsC} zX!ZYjgG-;zd;AfDi*G*)t$t2^FuAVmrMrClDTAy1;m~S-slla>)_MFogNr}+LTfzV zGq~jKpL+a74<*+Xf8GnO{wEBs{(s@yUt)0aTOL~b_Zow1e&(Qc-FpqL{y*f~KW%W$ z&&|Gl{o!OhiW~e8T;rKHcmVwhXyG%QBmNxW-#C%p7yb^@UV3c{w8nG2!L_~@dHhj> z%kKRz(CX)iN0RYq{_pnqh{47Gzx4gAGx)LKFNRh>^9GlEdkwVa?SrfE?Y{ku2G@A@ zd;C#@YkjYR)_pzi(PW&myYBM%%MC8M@iUK)fk*SE`S~qqjc3ZV*Z6bL>i^va*F2o= z@kiap};IcQK r2d#1LFu3&WY0&EDody?wj`{ZQ;~dSyi@+D4n}^_!t{gb9!u$UVRGEt~ literal 0 HcmV?d00001 diff --git a/.nx/workspace-data/parsed-lock-file.dependencies.json b/.nx/workspace-data/parsed-lock-file.dependencies.json new file mode 100644 index 000000000..5b0b9e516 --- /dev/null +++ b/.nx/workspace-data/parsed-lock-file.dependencies.json @@ -0,0 +1,12687 @@ +[ + { + "source": "npm:@ai-sdk/openai", + "target": "npm:@ai-sdk/provider", + "type": "static" + }, + { + "source": "npm:@ai-sdk/openai", + "target": "npm:@ai-sdk/provider-utils", + "type": "static" + }, + { + "source": "npm:@ai-sdk/openai", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "npm:@ai-sdk/provider-utils", + "target": "npm:@ai-sdk/provider", + "type": "static" + }, + { + "source": "npm:@ai-sdk/provider-utils", + "target": "npm:@standard-schema/spec", + "type": "static" + }, + { + "source": "npm:@ai-sdk/provider-utils", + "target": "npm:eventsource-parser", + "type": "static" + }, + { + "source": "npm:@ai-sdk/provider-utils", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "npm:@ai-sdk/provider", + "target": "npm:json-schema", + "type": "static" + }, + { + "source": "npm:@anthropic-ai/sdk", + "target": "npm:json-schema-to-ts", + "type": "static" + }, + { + "source": "npm:@anthropic-ai/sdk", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:@csstools/css-calc", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:@csstools/css-color-parser", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:@csstools/css-parser-algorithms", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:@csstools/css-tokenizer", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:lru-cache@11.2.2", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:@asamuzakjp/nwsapi", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:bidi-js", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:css-tree", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:is-potential-custom-element-name", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:lru-cache@11.2.2", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.26.2", + "target": "npm:@babel/helper-validator-identifier@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.26.2", + "target": "npm:js-tokens@4.0.0", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.26.2", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.27.1", + "target": "npm:@babel/helper-validator-identifier@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.27.1", + "target": "npm:js-tokens@4.0.0", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.27.1", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/generator", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/helper-compilation-targets", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/helper-module-transforms", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/helpers", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@jridgewell/remapping", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:convert-source-map", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:gensync", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:json5", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:semver@6.3.1", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:@jridgewell/gen-mapping", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:@jridgewell/trace-mapping", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:jsesc", + "type": "static" + }, + { + "source": "npm:@babel/helper-annotate-as-pure", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:@babel/compat-data", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:@babel/helper-validator-option", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:browserslist", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:lru-cache@5.1.1", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:semver@6.3.1", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-annotate-as-pure", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-member-expression-to-functions", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-optimise-call-expression", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-replace-supers", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-skip-transparent-expression-wrappers", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:semver@6.3.1", + "type": "static" + }, + { + "source": "npm:@babel/helper-member-expression-to-functions", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-member-expression-to-functions", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-imports@7.18.6", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-imports@7.27.1", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-imports@7.27.1", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-transforms", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-transforms", + "target": "npm:@babel/helper-module-imports@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-transforms", + "target": "npm:@babel/helper-validator-identifier@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-transforms", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-optimise-call-expression", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/helper-replace-supers", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/helper-replace-supers", + "target": "npm:@babel/helper-member-expression-to-functions", + "type": "static" + }, + { + "source": "npm:@babel/helper-replace-supers", + "target": "npm:@babel/helper-optimise-call-expression", + "type": "static" + }, + { + "source": "npm:@babel/helper-replace-supers", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-skip-transparent-expression-wrappers", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-skip-transparent-expression-wrappers", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/helpers", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@babel/helpers", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/parser@7.28.4", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/parser@7.28.5", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/plugin-proposal-private-methods", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-proposal-private-methods", + "target": "npm:@babel/helper-create-class-features-plugin", + "type": "static" + }, + { + "source": "npm:@babel/plugin-proposal-private-methods", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/plugin-syntax-jsx", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-syntax-jsx", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/plugin-syntax-typescript", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-syntax-typescript", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-modules-commonjs", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-modules-commonjs", + "target": "npm:@babel/helper-module-transforms", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-modules-commonjs", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-react-jsx-self", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-react-jsx-self", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-react-jsx-source", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-react-jsx-source", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/helper-annotate-as-pure", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/helper-create-class-features-plugin", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/helper-skip-transparent-expression-wrappers", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/plugin-syntax-typescript", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/helper-validator-option", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/plugin-syntax-jsx", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/plugin-transform-modules-commonjs", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/plugin-transform-typescript", + "type": "static" + }, + { + "source": "npm:@babel/template", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/template", + "target": "npm:@babel/parser@7.28.4", + "type": "static" + }, + { + "source": "npm:@babel/template", + "target": "npm:@babel/types@7.28.4", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/generator", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/helper-globals", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@babel/types@7.28.4", + "target": "npm:@babel/helper-string-parser", + "type": "static" + }, + { + "source": "npm:@babel/types@7.28.4", + "target": "npm:@babel/helper-validator-identifier@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/types@7.28.5", + "target": "npm:@babel/helper-string-parser", + "type": "static" + }, + { + "source": "npm:@babel/types@7.28.5", + "target": "npm:@babel/helper-validator-identifier@7.28.5", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/config", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/get-version-range-type", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/git", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/should-skip-package", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:detect-indent", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:lodash.startcase", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:outdent", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:prettier@2.8.8", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:resolve-from@5.0.0", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@changesets/get-dependents-graph", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@changesets/should-skip-package", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@changesets/changelog-git", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/apply-release-plan", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/assemble-release-plan", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/changelog-git", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/config", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/get-dependents-graph", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/get-release-plan", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/git", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/logger", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/pre", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/read", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/should-skip-package", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/write", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@inquirer/external-editor", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:ansi-colors", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:ci-info", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:enquirer@2.4.1", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:mri", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:p-limit@2.3.0", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:package-manager-detector@0.2.11", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:resolve-from@5.0.0", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:spawndamnit", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:term-size", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@changesets/get-dependents-graph", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@changesets/logger", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:micromatch", + "type": "static" + }, + { + "source": "npm:@changesets/errors", + "target": "npm:extendable-error", + "type": "static" + }, + { + "source": "npm:@changesets/get-dependents-graph", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/get-dependents-graph", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/get-dependents-graph", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@changesets/get-dependents-graph", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@changesets/get-github-info", + "target": "npm:dataloader", + "type": "static" + }, + { + "source": "npm:@changesets/get-github-info", + "target": "npm:node-fetch@2.7.0", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/assemble-release-plan", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/config", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/pre", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/read", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:is-subdir", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:micromatch", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:spawndamnit", + "type": "static" + }, + { + "source": "npm:@changesets/logger", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@changesets/parse", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/parse", + "target": "npm:js-yaml@3.14.1", + "type": "static" + }, + { + "source": "npm:@changesets/pre", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/pre", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/pre", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/pre", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:@changesets/git", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:@changesets/logger", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:@changesets/parse", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:p-filter", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@changesets/should-skip-package", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/should-skip-package", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/write", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/write", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/write", + "target": "npm:human-id", + "type": "static" + }, + { + "source": "npm:@changesets/write", + "target": "npm:prettier@2.8.8", + "type": "static" + }, + { + "source": "npm:@cloudflare/kv-asset-handler", + "target": "npm:mime@3.0.0", + "type": "static" + }, + { + "source": "npm:@commitlint/parse", + "target": "npm:@commitlint/types", + "type": "static" + }, + { + "source": "npm:@commitlint/parse", + "target": "npm:conventional-changelog-angular", + "type": "static" + }, + { + "source": "npm:@commitlint/parse", + "target": "npm:conventional-commits-parser", + "type": "static" + }, + { + "source": "npm:@commitlint/types", + "target": "npm:@types/conventional-commits-parser", + "type": "static" + }, + { + "source": "npm:@commitlint/types", + "target": "npm:chalk@5.6.2", + "type": "static" + }, + { + "source": "npm:@csstools/css-calc", + "target": "npm:@csstools/css-parser-algorithms", + "type": "static" + }, + { + "source": "npm:@csstools/css-calc", + "target": "npm:@csstools/css-tokenizer", + "type": "static" + }, + { + "source": "npm:@csstools/css-color-parser", + "target": "npm:@csstools/color-helpers", + "type": "static" + }, + { + "source": "npm:@csstools/css-color-parser", + "target": "npm:@csstools/css-calc", + "type": "static" + }, + { + "source": "npm:@csstools/css-color-parser", + "target": "npm:@csstools/css-parser-algorithms", + "type": "static" + }, + { + "source": "npm:@csstools/css-color-parser", + "target": "npm:@csstools/css-tokenizer", + "type": "static" + }, + { + "source": "npm:@csstools/css-parser-algorithms", + "target": "npm:@csstools/css-tokenizer", + "type": "static" + }, + { + "source": "npm:@csstools/css-syntax-patches-for-csstree", + "target": "npm:postcss", + "type": "static" + }, + { + "source": "npm:@emnapi/core", + "target": "npm:@emnapi/wasi-threads", + "type": "static" + }, + { + "source": "npm:@emnapi/core", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:@emnapi/runtime", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:@emnapi/wasi-threads", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:@eslint-community/eslint-utils", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-community/eslint-utils", + "target": "npm:eslint-visitor-keys@3.4.3", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:@typescript-eslint/typescript-estree@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:birecord", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-dom", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-hooks-extra", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-naming-convention", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-web-api", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-x", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@eslint/config-array", + "target": "npm:@eslint/object-schema", + "type": "static" + }, + { + "source": "npm:@eslint/config-array", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@eslint/config-array", + "target": "npm:minimatch@3.1.2", + "type": "static" + }, + { + "source": "npm:@eslint/config-helpers", + "target": "npm:@eslint/core", + "type": "static" + }, + { + "source": "npm:@eslint/core", + "target": "npm:@types/json-schema", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:ajv@6.12.6", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:espree", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:globals@14.0.0", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:ignore@5.3.2", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:import-fresh", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:js-yaml@4.1.1", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:minimatch@3.1.2", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:strip-json-comments@3.1.1", + "type": "static" + }, + { + "source": "npm:@eslint/plugin-kit", + "target": "npm:@eslint/core", + "type": "static" + }, + { + "source": "npm:@eslint/plugin-kit", + "target": "npm:levn", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/engine-oniguruma", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/langs", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/themes", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/types", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/vscode-textmate", + "type": "static" + }, + { + "source": "npm:@google/genai", + "target": "npm:google-auth-library", + "type": "static" + }, + { + "source": "npm:@google/genai", + "target": "npm:ws", + "type": "static" + }, + { + "source": "npm:@humanfs/node", + "target": "npm:@humanfs/core", + "type": "static" + }, + { + "source": "npm:@humanfs/node", + "target": "npm:@humanwhocodes/retry", + "type": "static" + }, + { + "source": "npm:@inquirer/external-editor", + "target": "npm:chardet", + "type": "static" + }, + { + "source": "npm:@inquirer/external-editor", + "target": "npm:iconv-lite@0.7.0", + "type": "static" + }, + { + "source": "npm:@inquirer/external-editor", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:string-width@5.1.2", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:string-width-cjs", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:strip-ansi@7.1.2", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:strip-ansi-cjs", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:wrap-ansi@8.1.0", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:wrap-ansi-cjs", + "type": "static" + }, + { + "source": "npm:@isaacs/fs-minipass", + "target": "npm:minipass", + "type": "static" + }, + { + "source": "npm:@jest/schemas", + "target": "npm:@sinclair/typebox", + "type": "static" + }, + { + "source": "npm:@jridgewell/gen-mapping", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + }, + { + "source": "npm:@jridgewell/gen-mapping", + "target": "npm:@jridgewell/trace-mapping", + "type": "static" + }, + { + "source": "npm:@jridgewell/remapping", + "target": "npm:@jridgewell/gen-mapping", + "type": "static" + }, + { + "source": "npm:@jridgewell/remapping", + "target": "npm:@jridgewell/trace-mapping", + "type": "static" + }, + { + "source": "npm:@jridgewell/source-map", + "target": "npm:@jridgewell/gen-mapping", + "type": "static" + }, + { + "source": "npm:@jridgewell/source-map", + "target": "npm:@jridgewell/trace-mapping", + "type": "static" + }, + { + "source": "npm:@jridgewell/trace-mapping", + "target": "npm:@jridgewell/resolve-uri", + "type": "static" + }, + { + "source": "npm:@jridgewell/trace-mapping", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + }, + { + "source": "npm:@kwsites/file-exists", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@manypkg/find-root", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:@manypkg/find-root", + "target": "npm:@types/node@12.20.55", + "type": "static" + }, + { + "source": "npm:@manypkg/find-root", + "target": "npm:find-up@4.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/find-root", + "target": "npm:fs-extra@8.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:@changesets/types@4.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:@manypkg/find-root", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:fs-extra@8.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:globby@11.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:read-yaml-file", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:detect-libc@2.1.2", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:https-proxy-agent", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:node-fetch@2.7.0", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:nopt", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:tar", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor-model", + "target": "npm:@microsoft/tsdoc", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor-model", + "target": "npm:@microsoft/tsdoc-config", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor-model", + "target": "npm:@rushstack/node-core-library", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@microsoft/api-extractor-model", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@microsoft/tsdoc", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@microsoft/tsdoc-config", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@rushstack/node-core-library", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@rushstack/rig-package", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@rushstack/terminal", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@rushstack/ts-command-line", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:lodash", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:minimatch@3.0.8", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:semver@7.5.4", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:source-map@0.6.1", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:typescript@5.4.2", + "type": "static" + }, + { + "source": "npm:@microsoft/tsdoc-config", + "target": "npm:@microsoft/tsdoc", + "type": "static" + }, + { + "source": "npm:@microsoft/tsdoc-config", + "target": "npm:ajv@8.12.0", + "type": "static" + }, + { + "source": "npm:@microsoft/tsdoc-config", + "target": "npm:jju", + "type": "static" + }, + { + "source": "npm:@microsoft/tsdoc-config", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.12", + "target": "npm:@emnapi/core", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.12", + "target": "npm:@emnapi/runtime", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.12", + "target": "npm:@tybys/wasm-util@0.10.1", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.4", + "target": "npm:@emnapi/core", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.4", + "target": "npm:@emnapi/runtime", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.4", + "target": "npm:@tybys/wasm-util@0.9.0", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@1.0.7", + "target": "npm:@emnapi/core", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@1.0.7", + "target": "npm:@emnapi/runtime", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@1.0.7", + "target": "npm:@tybys/wasm-util@0.10.1", + "type": "static" + }, + { + "source": "npm:@nodelib/fs.scandir", + "target": "npm:@nodelib/fs.stat", + "type": "static" + }, + { + "source": "npm:@nodelib/fs.scandir", + "target": "npm:run-parallel", + "type": "static" + }, + { + "source": "npm:@nodelib/fs.walk", + "target": "npm:@nodelib/fs.scandir", + "type": "static" + }, + { + "source": "npm:@nodelib/fs.walk", + "target": "npm:fastq", + "type": "static" + }, + { + "source": "npm:@oozcitak/dom", + "target": "npm:@oozcitak/infra", + "type": "static" + }, + { + "source": "npm:@oozcitak/dom", + "target": "npm:@oozcitak/url", + "type": "static" + }, + { + "source": "npm:@oozcitak/dom", + "target": "npm:@oozcitak/util", + "type": "static" + }, + { + "source": "npm:@oozcitak/infra", + "target": "npm:@oozcitak/util", + "type": "static" + }, + { + "source": "npm:@oozcitak/url", + "target": "npm:@oozcitak/infra", + "type": "static" + }, + { + "source": "npm:@oozcitak/url", + "target": "npm:@oozcitak/util", + "type": "static" + }, + { + "source": "npm:@oxc-resolver/binding-wasm32-wasi", + "target": "npm:@napi-rs/wasm-runtime@1.0.7", + "type": "static" + }, + { + "source": "npm:@parcel/watcher-wasm", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:@parcel/watcher-wasm", + "target": "npm:micromatch", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:detect-libc@1.0.3", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:micromatch", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:node-addon-api", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-android-arm64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-darwin-arm64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-darwin-x64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-freebsd-x64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-arm-glibc", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-arm-musl", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-arm64-glibc", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-x64-glibc", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-win32-arm64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-win32-ia32", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-win32-x64", + "type": "static" + }, + { + "source": "npm:@poppinss/colors", + "target": "npm:kleur", + "type": "static" + }, + { + "source": "npm:@poppinss/dumper", + "target": "npm:@poppinss/colors", + "type": "static" + }, + { + "source": "npm:@poppinss/dumper", + "target": "npm:@sindresorhus/is", + "type": "static" + }, + { + "source": "npm:@poppinss/dumper", + "target": "npm:supports-color@10.2.2", + "type": "static" + }, + { + "source": "npm:@rolldown/binding-wasm32-wasi", + "target": "npm:@napi-rs/wasm-runtime@1.0.7", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-alias", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:commondir", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:fdir", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:is-reference@1.2.1", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-inject", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-inject", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-inject", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-inject", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-json", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-json", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:@types/resolve", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:deepmerge", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:is-module", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-replace", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-replace", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-replace", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-terser", + "target": "npm:serialize-javascript", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-terser", + "target": "npm:smob", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-terser", + "target": "npm:terser", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-terser", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:@rollup/pluginutils", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:@rollup/pluginutils", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@rollup/pluginutils", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:@rollup/pluginutils", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:ajv@8.13.0", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:ajv-draft-04", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:ajv-formats", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:import-lazy", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:jju", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:semver@7.5.4", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:@rushstack/rig-package", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@rushstack/rig-package", + "target": "npm:strip-json-comments@3.1.1", + "type": "static" + }, + { + "source": "npm:@rushstack/terminal", + "target": "npm:@rushstack/node-core-library", + "type": "static" + }, + { + "source": "npm:@rushstack/terminal", + "target": "npm:supports-color@8.1.1", + "type": "static" + }, + { + "source": "npm:@rushstack/terminal", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:@rushstack/ts-command-line", + "target": "npm:@rushstack/terminal", + "type": "static" + }, + { + "source": "npm:@rushstack/ts-command-line", + "target": "npm:@types/argparse", + "type": "static" + }, + { + "source": "npm:@rushstack/ts-command-line", + "target": "npm:argparse@1.0.10", + "type": "static" + }, + { + "source": "npm:@rushstack/ts-command-line", + "target": "npm:string-argv", + "type": "static" + }, + { + "source": "npm:@shikijs/engine-oniguruma", + "target": "npm:@shikijs/types", + "type": "static" + }, + { + "source": "npm:@shikijs/engine-oniguruma", + "target": "npm:@shikijs/vscode-textmate", + "type": "static" + }, + { + "source": "npm:@shikijs/langs", + "target": "npm:@shikijs/types", + "type": "static" + }, + { + "source": "npm:@shikijs/themes", + "target": "npm:@shikijs/types", + "type": "static" + }, + { + "source": "npm:@shikijs/types", + "target": "npm:@shikijs/vscode-textmate", + "type": "static" + }, + { + "source": "npm:@shikijs/types", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:@size-limit/esbuild", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "npm:@size-limit/esbuild", + "target": "npm:nanoid@5.1.6", + "type": "static" + }, + { + "source": "npm:@size-limit/esbuild", + "target": "npm:size-limit", + "type": "static" + }, + { + "source": "npm:@size-limit/file", + "target": "npm:size-limit", + "type": "static" + }, + { + "source": "npm:@size-limit/preset-small-lib", + "target": "npm:@size-limit/esbuild", + "type": "static" + }, + { + "source": "npm:@size-limit/preset-small-lib", + "target": "npm:@size-limit/file", + "type": "static" + }, + { + "source": "npm:@size-limit/preset-small-lib", + "target": "npm:size-limit", + "type": "static" + }, + { + "source": "npm:@solid-primitives/event-listener", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/event-listener", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@solid-primitives/keyboard", + "target": "npm:@solid-primitives/event-listener", + "type": "static" + }, + { + "source": "npm:@solid-primitives/keyboard", + "target": "npm:@solid-primitives/rootless", + "type": "static" + }, + { + "source": "npm:@solid-primitives/keyboard", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/keyboard", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:@solid-primitives/event-listener", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:@solid-primitives/rootless", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:@solid-primitives/static-store", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@solid-primitives/rootless", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/rootless", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@solid-primitives/static-store", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/static-store", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@solid-primitives/utils", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:espree", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:estraverse", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:@sveltejs/acorn-typescript", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:@svitejs/changesets-changelog-github-compact", + "target": "npm:@changesets/get-github-info", + "type": "static" + }, + { + "source": "npm:@svitejs/changesets-changelog-github-compact", + "target": "npm:dotenv@16.6.1", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:@jridgewell/remapping", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:enhanced-resolve", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:lightningcss", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:source-map-js", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:tailwindcss", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-android-arm64", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-darwin-arm64", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-darwin-x64", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-freebsd-x64", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-wasm32-wasi", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-win32-x64-msvc", + "type": "static" + }, + { + "source": "npm:@tailwindcss/vite", + "target": "npm:@tailwindcss/node", + "type": "static" + }, + { + "source": "npm:@tailwindcss/vite", + "target": "npm:@tailwindcss/oxide", + "type": "static" + }, + { + "source": "npm:@tailwindcss/vite", + "target": "npm:tailwindcss", + "type": "static" + }, + { + "source": "npm:@tailwindcss/vite", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/config", + "target": "npm:@tanstack/eslint-config", + "type": "static" + }, + { + "source": "npm:@tanstack/config", + "target": "npm:@tanstack/publish-config", + "type": "static" + }, + { + "source": "npm:@tanstack/config", + "target": "npm:@tanstack/typedoc-config", + "type": "static" + }, + { + "source": "npm:@tanstack/config", + "target": "npm:@tanstack/vite-config", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-client", + "target": "npm:@tanstack/devtools-event-client", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-event-bus", + "target": "npm:ws", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-ui", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-ui", + "target": "npm:goober", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-ui", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-utils", + "target": "npm:@tanstack/devtools-ui", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-utils", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-utils", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-utils", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@solid-primitives/event-listener", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@solid-primitives/keyboard", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@solid-primitives/resize-observer", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@tanstack/devtools-client", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@tanstack/devtools-event-bus", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@tanstack/devtools-ui", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:goober", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:babel-dead-code-elimination", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:@eslint/js", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:@stylistic/eslint-plugin", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:eslint-plugin-import-x", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:eslint-plugin-n", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:globals@16.5.0", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:typescript-eslint", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:vue-eslint-parser", + "type": "static" + }, + { + "source": "npm:@tanstack/nitro-v2-vite-plugin", + "target": "npm:nitropack", + "type": "static" + }, + { + "source": "npm:@tanstack/nitro-v2-vite-plugin", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/nitro-v2-vite-plugin", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/publish-config", + "target": "npm:@commitlint/parse", + "type": "static" + }, + { + "source": "npm:@tanstack/publish-config", + "target": "npm:jsonfile@6.2.0", + "type": "static" + }, + { + "source": "npm:@tanstack/publish-config", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@tanstack/publish-config", + "target": "npm:simple-git", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:@tanstack/devtools", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:@types/react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-query", + "target": "npm:@tanstack/query-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-query", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:@tanstack/router-devtools-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:@tanstack/query-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:@tanstack/react-query", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:@tanstack/router-ssr-query-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:@tanstack/history", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:@tanstack/react-store", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:isbot", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:tiny-warning", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:tiny-warning", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/history", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/start-server-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/react-start-client", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/react-start-server", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/start-plugin-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/start-server-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/react-store", + "target": "npm:@tanstack/store", + "type": "static" + }, + { + "source": "npm:@tanstack/react-store", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-store", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-store", + "target": "npm:use-sync-external-store", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:@tanstack/history", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:@tanstack/store", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:cookie-es@2.0.0", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:seroval@1.4.0", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:seroval-plugins@1.4.0", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:tiny-warning", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:goober", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:csstype@3.2.3", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:@tanstack/virtual-file-routes", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:recast", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:source-map@0.7.6", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:tsx", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:zod@3.25.76", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/plugin-syntax-jsx", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/plugin-syntax-typescript", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/router-generator", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/virtual-file-routes", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:babel-dead-code-elimination", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:chokidar@3.6.0", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:unplugin", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:zod@3.25.76", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:vite-plugin-solid", + "type": "static" + }, + { + "source": "npm:@tanstack/router-ssr-query-core", + "target": "npm:@tanstack/query-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-ssr-query-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:@babel/generator", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:@babel/preset-typescript", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:ansis", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:diff", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/plugin-syntax-jsx", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/plugin-syntax-typescript", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@tanstack/directive-functions-plugin", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:babel-dead-code-elimination", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:@tanstack/start-storage-context", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:seroval@1.4.0", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:tiny-warning", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@babel/code-frame@7.26.2", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@rolldown/pluginutils@1.0.0-beta.40", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/router-generator", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/router-plugin", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/server-functions-plugin", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/start-server-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:babel-dead-code-elimination", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:cheerio", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:exsolve", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:srvx", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:vitefu", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:xmlbuilder2", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:zod@3.25.76", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:@tanstack/history", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:@tanstack/start-storage-context", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:h3-v2", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:seroval@1.4.0", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/start-storage-context", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/typedoc-config", + "target": "npm:typedoc", + "type": "static" + }, + { + "source": "npm:@tanstack/typedoc-config", + "target": "npm:typedoc-plugin-frontmatter", + "type": "static" + }, + { + "source": "npm:@tanstack/typedoc-config", + "target": "npm:typedoc-plugin-markdown", + "type": "static" + }, + { + "source": "npm:@tanstack/vite-config", + "target": "npm:rollup-plugin-preserve-directives", + "type": "static" + }, + { + "source": "npm:@tanstack/vite-config", + "target": "npm:vite-plugin-dts", + "type": "static" + }, + { + "source": "npm:@tanstack/vite-config", + "target": "npm:vite-plugin-externalize-deps", + "type": "static" + }, + { + "source": "npm:@tanstack/vite-config", + "target": "npm:vite-tsconfig-paths", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:@types/aria-query", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:aria-query@5.3.0", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:dom-accessibility-api@0.5.16", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:lz-string", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:pretty-format@27.5.1", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:@adobe/css-tools", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:aria-query@5.3.0", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:css.escape", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:dom-accessibility-api@0.6.3", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:redent", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:@testing-library/dom", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:@types/react-dom", + "type": "static" + }, + { + "source": "npm:@tybys/wasm-util@0.10.1", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:@tybys/wasm-util@0.9.0", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@types/babel__generator", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@types/babel__template", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@types/babel__traverse", + "type": "static" + }, + { + "source": "npm:@types/babel__generator", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/babel__template", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/babel__template", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/babel__traverse", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/chai", + "target": "npm:@types/deep-eql", + "type": "static" + }, + { + "source": "npm:@types/chai", + "target": "npm:assertion-error", + "type": "static" + }, + { + "source": "npm:@types/conventional-commits-parser", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:@types/debug", + "target": "npm:@types/ms", + "type": "static" + }, + { + "source": "npm:@types/estree-jsx", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:@types/hast", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:@types/mdast", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:@types/node@20.19.25", + "target": "npm:undici-types@6.21.0", + "type": "static" + }, + { + "source": "npm:@types/node", + "target": "npm:undici-types@7.16.0", + "type": "static" + }, + { + "source": "npm:@types/react-dom", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:@types/react", + "target": "npm:csstype@3.2.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@eslint-community/regexpp", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/parser", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/scope-manager@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/type-utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/visitor-keys@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:graphemer", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:ignore@7.0.5", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:natural-compare", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:@typescript-eslint/scope-manager@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:@typescript-eslint/typescript-estree@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:@typescript-eslint/visitor-keys@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.46.3", + "target": "npm:@typescript-eslint/tsconfig-utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.46.3", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.46.3", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.48.0", + "target": "npm:@typescript-eslint/tsconfig-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.48.0", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.48.0", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/scope-manager@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/scope-manager@8.46.3", + "target": "npm:@typescript-eslint/visitor-keys@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/scope-manager@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/scope-manager@8.48.0", + "target": "npm:@typescript-eslint/visitor-keys@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/tsconfig-utils@8.46.3", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/tsconfig-utils@8.48.0", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:@typescript-eslint/typescript-estree@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:@typescript-eslint/utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:@typescript-eslint/typescript-estree@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:@typescript-eslint/project-service@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:@typescript-eslint/tsconfig-utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:@typescript-eslint/visitor-keys@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:@typescript-eslint/project-service@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:@typescript-eslint/tsconfig-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:@typescript-eslint/visitor-keys@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:@typescript-eslint/scope-manager@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:@typescript-eslint/typescript-estree@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:@typescript-eslint/typescript-estree@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/visitor-keys@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/visitor-keys@8.46.3", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/visitor-keys@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/visitor-keys@8.48.0", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:@unrs/resolver-binding-wasm32-wasi", + "target": "npm:@napi-rs/wasm-runtime@0.2.12", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:@mapbox/node-pre-gyp", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:acorn-import-attributes", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:async-sema", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:bindings", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:glob", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:node-gyp-build", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:resolve-from@5.0.0", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@babel/plugin-transform-react-jsx-self", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@babel/plugin-transform-react-jsx-source", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@rolldown/pluginutils@1.0.0-beta.47", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@types/babel__core", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:react-refresh", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:@standard-schema/spec", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:@types/chai", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:@vitest/spy", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:@vitest/utils", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:chai", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:tinyrainbow", + "type": "static" + }, + { + "source": "npm:@vitest/mocker", + "target": "npm:@vitest/spy", + "type": "static" + }, + { + "source": "npm:@vitest/mocker", + "target": "npm:estree-walker@3.0.3", + "type": "static" + }, + { + "source": "npm:@vitest/mocker", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@vitest/mocker", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@vitest/pretty-format", + "target": "npm:tinyrainbow", + "type": "static" + }, + { + "source": "npm:@vitest/runner", + "target": "npm:@vitest/utils", + "type": "static" + }, + { + "source": "npm:@vitest/runner", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@vitest/snapshot", + "target": "npm:@vitest/pretty-format", + "type": "static" + }, + { + "source": "npm:@vitest/snapshot", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@vitest/snapshot", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@vitest/utils", + "target": "npm:@vitest/pretty-format", + "type": "static" + }, + { + "source": "npm:@vitest/utils", + "target": "npm:tinyrainbow", + "type": "static" + }, + { + "source": "npm:@volar/language-core", + "target": "npm:@volar/source-map", + "type": "static" + }, + { + "source": "npm:@volar/typescript", + "target": "npm:@volar/language-core", + "type": "static" + }, + { + "source": "npm:@volar/typescript", + "target": "npm:path-browserify", + "type": "static" + }, + { + "source": "npm:@volar/typescript", + "target": "npm:vscode-uri", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:@vue/shared", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:entities@4.5.0", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:source-map-js", + "type": "static" + }, + { + "source": "npm:@vue/compiler-dom", + "target": "npm:@vue/compiler-core", + "type": "static" + }, + { + "source": "npm:@vue/compiler-dom", + "target": "npm:@vue/shared", + "type": "static" + }, + { + "source": "npm:@vue/compiler-vue2", + "target": "npm:de-indent", + "type": "static" + }, + { + "source": "npm:@vue/compiler-vue2", + "target": "npm:he", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:@volar/language-core", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:@vue/compiler-dom", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:@vue/compiler-vue2", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:@vue/shared", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:computeds", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:muggle-string", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:path-browserify", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@yarnpkg/parsers", + "target": "npm:js-yaml@3.14.1", + "type": "static" + }, + { + "source": "npm:@yarnpkg/parsers", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:@zkochan/js-yaml", + "target": "npm:argparse@2.0.1", + "type": "static" + }, + { + "source": "npm:JSONStream", + "target": "npm:jsonparse", + "type": "static" + }, + { + "source": "npm:JSONStream", + "target": "npm:through", + "type": "static" + }, + { + "source": "npm:abort-controller", + "target": "npm:event-target-shim", + "type": "static" + }, + { + "source": "npm:acorn-import-attributes", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:acorn-jsx", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:ajv-draft-04", + "target": "npm:ajv@8.13.0", + "type": "static" + }, + { + "source": "npm:ajv-formats", + "target": "npm:ajv@8.13.0", + "type": "static" + }, + { + "source": "npm:ajv@6.12.6", + "target": "npm:fast-deep-equal", + "type": "static" + }, + { + "source": "npm:ajv@6.12.6", + "target": "npm:fast-json-stable-stringify", + "type": "static" + }, + { + "source": "npm:ajv@6.12.6", + "target": "npm:json-schema-traverse@0.4.1", + "type": "static" + }, + { + "source": "npm:ajv@6.12.6", + "target": "npm:uri-js", + "type": "static" + }, + { + "source": "npm:ajv@8.12.0", + "target": "npm:fast-deep-equal", + "type": "static" + }, + { + "source": "npm:ajv@8.12.0", + "target": "npm:json-schema-traverse@1.0.0", + "type": "static" + }, + { + "source": "npm:ajv@8.12.0", + "target": "npm:require-from-string", + "type": "static" + }, + { + "source": "npm:ajv@8.12.0", + "target": "npm:uri-js", + "type": "static" + }, + { + "source": "npm:ajv@8.13.0", + "target": "npm:fast-deep-equal", + "type": "static" + }, + { + "source": "npm:ajv@8.13.0", + "target": "npm:json-schema-traverse@1.0.0", + "type": "static" + }, + { + "source": "npm:ajv@8.13.0", + "target": "npm:require-from-string", + "type": "static" + }, + { + "source": "npm:ajv@8.13.0", + "target": "npm:uri-js", + "type": "static" + }, + { + "source": "npm:ansi-styles@4.3.0", + "target": "npm:color-convert", + "type": "static" + }, + { + "source": "npm:anymatch", + "target": "npm:normalize-path", + "type": "static" + }, + { + "source": "npm:anymatch", + "target": "npm:picomatch@2.3.1", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:glob", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:is-stream@2.0.1", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:lazystream", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:lodash", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:normalize-path", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:readable-stream@4.7.0", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:archiver-utils", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:async", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:buffer-crc32", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:readable-stream@4.7.0", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:readdir-glob", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:tar-stream@3.1.7", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:zip-stream", + "type": "static" + }, + { + "source": "npm:argparse@1.0.10", + "target": "npm:sprintf-js", + "type": "static" + }, + { + "source": "npm:aria-query@5.3.0", + "target": "npm:dequal", + "type": "static" + }, + { + "source": "npm:ast-types", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:axios", + "target": "npm:follow-redirects", + "type": "static" + }, + { + "source": "npm:axios", + "target": "npm:form-data", + "type": "static" + }, + { + "source": "npm:axios", + "target": "npm:proxy-from-env", + "type": "static" + }, + { + "source": "npm:babel-dead-code-elimination", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:babel-dead-code-elimination", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:babel-dead-code-elimination", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:babel-dead-code-elimination", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:@babel/helper-module-imports@7.18.6", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:@babel/plugin-syntax-jsx", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:html-entities", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:parse5@7.3.0", + "type": "static" + }, + { + "source": "npm:babel-preset-solid", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:babel-preset-solid", + "target": "npm:babel-plugin-jsx-dom-expressions", + "type": "static" + }, + { + "source": "npm:babel-preset-solid", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:better-path-resolve", + "target": "npm:is-windows", + "type": "static" + }, + { + "source": "npm:bidi-js", + "target": "npm:require-from-string", + "type": "static" + }, + { + "source": "npm:bindings", + "target": "npm:file-uri-to-path", + "type": "static" + }, + { + "source": "npm:bl", + "target": "npm:buffer@5.7.1", + "type": "static" + }, + { + "source": "npm:bl", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:bl", + "target": "npm:readable-stream@3.6.2", + "type": "static" + }, + { + "source": "npm:brace-expansion@1.1.12", + "target": "npm:balanced-match", + "type": "static" + }, + { + "source": "npm:brace-expansion@1.1.12", + "target": "npm:concat-map", + "type": "static" + }, + { + "source": "npm:brace-expansion@2.0.2", + "target": "npm:balanced-match", + "type": "static" + }, + { + "source": "npm:braces", + "target": "npm:fill-range", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:baseline-browser-mapping", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:caniuse-lite", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:electron-to-chromium", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:node-releases", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:update-browserslist-db", + "type": "static" + }, + { + "source": "npm:buffer@5.7.1", + "target": "npm:base64-js", + "type": "static" + }, + { + "source": "npm:buffer@5.7.1", + "target": "npm:ieee754", + "type": "static" + }, + { + "source": "npm:buffer@6.0.3", + "target": "npm:base64-js", + "type": "static" + }, + { + "source": "npm:buffer@6.0.3", + "target": "npm:ieee754", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:chokidar@4.0.3", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:confbox@0.2.2", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:dotenv@17.2.3", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:exsolve", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:giget", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:ohash", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:perfect-debounce", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:rc9", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:magicast", + "type": "static" + }, + { + "source": "npm:call-bind-apply-helpers", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:call-bind-apply-helpers", + "target": "npm:function-bind", + "type": "static" + }, + { + "source": "npm:chalk@4.1.2", + "target": "npm:ansi-styles@4.3.0", + "type": "static" + }, + { + "source": "npm:chalk@4.1.2", + "target": "npm:supports-color@7.2.0", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:boolbase", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:css-select", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:css-what", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:domutils", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:cheerio-select", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:dom-serializer", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:domutils", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:encoding-sniffer", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:htmlparser2", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:parse5@7.3.0", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:parse5-htmlparser2-tree-adapter", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:parse5-parser-stream", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:undici", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:whatwg-mimetype@4.0.0", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:anymatch", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:braces", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:glob-parent@5.1.2", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:is-binary-path", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:normalize-path", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:readdirp@3.6.0", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:fsevents", + "type": "static" + }, + { + "source": "npm:chokidar@4.0.3", + "target": "npm:readdirp@4.1.2", + "type": "static" + }, + { + "source": "npm:citty", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:cli-cursor", + "target": "npm:restore-cursor", + "type": "static" + }, + { + "source": "npm:clipboardy", + "target": "npm:execa", + "type": "static" + }, + { + "source": "npm:clipboardy", + "target": "npm:is-wsl@3.1.0", + "type": "static" + }, + { + "source": "npm:clipboardy", + "target": "npm:is64bit", + "type": "static" + }, + { + "source": "npm:cliui", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:cliui", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:cliui", + "target": "npm:wrap-ansi@7.0.0", + "type": "static" + }, + { + "source": "npm:color-convert", + "target": "npm:color-name", + "type": "static" + }, + { + "source": "npm:combined-stream", + "target": "npm:delayed-stream", + "type": "static" + }, + { + "source": "npm:compare-func", + "target": "npm:array-ify", + "type": "static" + }, + { + "source": "npm:compare-func", + "target": "npm:dot-prop@5.3.0", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:crc-32", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:crc32-stream", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:is-stream@2.0.1", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:normalize-path", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:readable-stream@4.7.0", + "type": "static" + }, + { + "source": "npm:conventional-changelog-angular", + "target": "npm:compare-func", + "type": "static" + }, + { + "source": "npm:conventional-commits-parser", + "target": "npm:JSONStream", + "type": "static" + }, + { + "source": "npm:conventional-commits-parser", + "target": "npm:is-text-path", + "type": "static" + }, + { + "source": "npm:conventional-commits-parser", + "target": "npm:meow", + "type": "static" + }, + { + "source": "npm:conventional-commits-parser", + "target": "npm:split2", + "type": "static" + }, + { + "source": "npm:crc32-stream", + "target": "npm:crc-32", + "type": "static" + }, + { + "source": "npm:crc32-stream", + "target": "npm:readable-stream@4.7.0", + "type": "static" + }, + { + "source": "npm:cross-spawn", + "target": "npm:path-key@3.1.1", + "type": "static" + }, + { + "source": "npm:cross-spawn", + "target": "npm:shebang-command", + "type": "static" + }, + { + "source": "npm:cross-spawn", + "target": "npm:which", + "type": "static" + }, + { + "source": "npm:crossws", + "target": "npm:uncrypto", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:boolbase", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:css-what", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:domutils", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:nth-check", + "type": "static" + }, + { + "source": "npm:css-tree", + "target": "npm:mdn-data", + "type": "static" + }, + { + "source": "npm:css-tree", + "target": "npm:source-map-js", + "type": "static" + }, + { + "source": "npm:cssstyle", + "target": "npm:@asamuzakjp/css-color", + "type": "static" + }, + { + "source": "npm:cssstyle", + "target": "npm:@csstools/css-syntax-patches-for-csstree", + "type": "static" + }, + { + "source": "npm:cssstyle", + "target": "npm:css-tree", + "type": "static" + }, + { + "source": "npm:data-urls", + "target": "npm:whatwg-mimetype@4.0.0", + "type": "static" + }, + { + "source": "npm:data-urls", + "target": "npm:whatwg-url@15.1.0", + "type": "static" + }, + { + "source": "npm:debug", + "target": "npm:ms", + "type": "static" + }, + { + "source": "npm:decode-named-character-reference", + "target": "npm:character-entities", + "type": "static" + }, + { + "source": "npm:defaults", + "target": "npm:clone", + "type": "static" + }, + { + "source": "npm:devlop", + "target": "npm:dequal", + "type": "static" + }, + { + "source": "npm:dir-glob", + "target": "npm:path-type@4.0.0", + "type": "static" + }, + { + "source": "npm:dom-serializer", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:dom-serializer", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:dom-serializer", + "target": "npm:entities@4.5.0", + "type": "static" + }, + { + "source": "npm:domhandler", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:domutils", + "target": "npm:dom-serializer", + "type": "static" + }, + { + "source": "npm:domutils", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:domutils", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:dot-prop@10.1.0", + "target": "npm:type-fest", + "type": "static" + }, + { + "source": "npm:dot-prop@5.3.0", + "target": "npm:is-obj", + "type": "static" + }, + { + "source": "npm:dotenv-expand", + "target": "npm:dotenv@16.6.1", + "type": "static" + }, + { + "source": "npm:dunder-proto", + "target": "npm:call-bind-apply-helpers", + "type": "static" + }, + { + "source": "npm:dunder-proto", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:dunder-proto", + "target": "npm:gopd", + "type": "static" + }, + { + "source": "npm:ecdsa-sig-formatter", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + }, + { + "source": "npm:encoding-sniffer", + "target": "npm:iconv-lite@0.6.3", + "type": "static" + }, + { + "source": "npm:encoding-sniffer", + "target": "npm:whatwg-encoding", + "type": "static" + }, + { + "source": "npm:end-of-stream", + "target": "npm:once", + "type": "static" + }, + { + "source": "npm:enhanced-resolve", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:enhanced-resolve", + "target": "npm:tapable", + "type": "static" + }, + { + "source": "npm:enquirer@2.3.6", + "target": "npm:ansi-colors", + "type": "static" + }, + { + "source": "npm:enquirer@2.4.1", + "target": "npm:ansi-colors", + "type": "static" + }, + { + "source": "npm:enquirer@2.4.1", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:es-object-atoms", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:es-set-tostringtag", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:es-set-tostringtag", + "target": "npm:get-intrinsic", + "type": "static" + }, + { + "source": "npm:es-set-tostringtag", + "target": "npm:has-tostringtag", + "type": "static" + }, + { + "source": "npm:es-set-tostringtag", + "target": "npm:hasown", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/aix-ppc64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/android-arm", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/android-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/android-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/darwin-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/darwin-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/freebsd-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/freebsd-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-arm", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-ia32", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-loong64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-mips64el", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-ppc64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-riscv64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-s390x", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/netbsd-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/netbsd-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/openbsd-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/openbsd-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/openharmony-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/sunos-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/win32-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/win32-ia32", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/win32-x64", + "type": "static" + }, + { + "source": "npm:eslint-compat-utils", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-compat-utils", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:eslint-import-context", + "target": "npm:get-tsconfig", + "type": "static" + }, + { + "source": "npm:eslint-import-context", + "target": "npm:stable-hash-x", + "type": "static" + }, + { + "source": "npm:eslint-import-context", + "target": "npm:unrs-resolver", + "type": "static" + }, + { + "source": "npm:eslint-plugin-es-x", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:eslint-plugin-es-x", + "target": "npm:@eslint-community/regexpp", + "type": "static" + }, + { + "source": "npm:eslint-plugin-es-x", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-es-x", + "target": "npm:eslint-compat-utils", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:comment-parser", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:eslint-import-context", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:stable-hash-x", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:unrs-resolver", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:enhanced-resolve", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:eslint-plugin-es-x", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:get-tsconfig", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:globals@15.15.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:globrex", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:ignore@5.3.2", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:ts-declaration-location", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:@babel/plugin-proposal-private-methods", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:hermes-parser", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:zod@3.25.76", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:zod-validation-error@3.5.4", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:compare-versions", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:hermes-parser", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:zod-validation-error@4.0.2", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:compare-versions", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:is-immutable-type", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:eslint-plugin-unused-imports", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-unused-imports", + "target": "npm:@typescript-eslint/eslint-plugin", + "type": "static" + }, + { + "source": "npm:eslint-scope", + "target": "npm:esrecurse", + "type": "static" + }, + { + "source": "npm:eslint-scope", + "target": "npm:estraverse", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint-community/regexpp", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/config-array", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/config-helpers", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/core", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/eslintrc", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/js", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/plugin-kit", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@humanfs/node", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@humanwhocodes/module-importer", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@humanwhocodes/retry", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:ajv@6.12.6", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:cross-spawn", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:escape-string-regexp@4.0.0", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:eslint-scope", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:espree", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:esquery", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:esutils", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:fast-deep-equal", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:file-entry-cache", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:find-up@5.0.0", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:glob-parent@6.0.2", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:ignore@5.3.2", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:imurmurhash", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:json-stable-stringify-without-jsonify", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:lodash.merge", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:minimatch@3.1.2", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:natural-compare", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:optionator", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:espree", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:espree", + "target": "npm:acorn-jsx", + "type": "static" + }, + { + "source": "npm:espree", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:esquery", + "target": "npm:estraverse", + "type": "static" + }, + { + "source": "npm:esrap", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + }, + { + "source": "npm:esrecurse", + "target": "npm:estraverse", + "type": "static" + }, + { + "source": "npm:estree-walker@3.0.3", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:events-universal", + "target": "npm:bare-events", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:cross-spawn", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:get-stream", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:human-signals", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:is-stream@3.0.0", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:merge-stream", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:npm-run-path@5.3.0", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:onetime@6.0.0", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:signal-exit@4.1.0", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:strip-final-newline", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:@nodelib/fs.stat", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:@nodelib/fs.walk", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:glob-parent@5.1.2", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:merge2", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:micromatch", + "type": "static" + }, + { + "source": "npm:fastq", + "target": "npm:reusify", + "type": "static" + }, + { + "source": "npm:fd-package-json", + "target": "npm:walk-up-path", + "type": "static" + }, + { + "source": "npm:fdir", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:fetch-blob", + "target": "npm:node-domexception", + "type": "static" + }, + { + "source": "npm:fetch-blob", + "target": "npm:web-streams-polyfill", + "type": "static" + }, + { + "source": "npm:figures", + "target": "npm:escape-string-regexp@1.0.5", + "type": "static" + }, + { + "source": "npm:file-entry-cache", + "target": "npm:flat-cache", + "type": "static" + }, + { + "source": "npm:fill-range", + "target": "npm:to-regex-range", + "type": "static" + }, + { + "source": "npm:find-up@4.1.0", + "target": "npm:locate-path@5.0.0", + "type": "static" + }, + { + "source": "npm:find-up@4.1.0", + "target": "npm:path-exists", + "type": "static" + }, + { + "source": "npm:find-up@5.0.0", + "target": "npm:locate-path@6.0.0", + "type": "static" + }, + { + "source": "npm:find-up@5.0.0", + "target": "npm:path-exists", + "type": "static" + }, + { + "source": "npm:flat-cache", + "target": "npm:flatted", + "type": "static" + }, + { + "source": "npm:flat-cache", + "target": "npm:keyv", + "type": "static" + }, + { + "source": "npm:foreground-child", + "target": "npm:cross-spawn", + "type": "static" + }, + { + "source": "npm:foreground-child", + "target": "npm:signal-exit@4.1.0", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:asynckit", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:combined-stream", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:es-set-tostringtag", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:hasown", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:mime-types@2.1.35", + "type": "static" + }, + { + "source": "npm:formatly", + "target": "npm:fd-package-json", + "type": "static" + }, + { + "source": "npm:formdata-polyfill", + "target": "npm:fetch-blob", + "type": "static" + }, + { + "source": "npm:front-matter", + "target": "npm:js-yaml@3.14.1", + "type": "static" + }, + { + "source": "npm:fs-extra@7.0.1", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:fs-extra@7.0.1", + "target": "npm:jsonfile@4.0.0", + "type": "static" + }, + { + "source": "npm:fs-extra@7.0.1", + "target": "npm:universalify@0.1.2", + "type": "static" + }, + { + "source": "npm:fs-extra@8.1.0", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:fs-extra@8.1.0", + "target": "npm:jsonfile@4.0.0", + "type": "static" + }, + { + "source": "npm:fs-extra@8.1.0", + "target": "npm:universalify@0.1.2", + "type": "static" + }, + { + "source": "npm:gaxios", + "target": "npm:extend", + "type": "static" + }, + { + "source": "npm:gaxios", + "target": "npm:https-proxy-agent", + "type": "static" + }, + { + "source": "npm:gaxios", + "target": "npm:node-fetch@3.3.2", + "type": "static" + }, + { + "source": "npm:gaxios", + "target": "npm:rimraf", + "type": "static" + }, + { + "source": "npm:gcp-metadata", + "target": "npm:gaxios", + "type": "static" + }, + { + "source": "npm:gcp-metadata", + "target": "npm:google-logging-utils", + "type": "static" + }, + { + "source": "npm:gcp-metadata", + "target": "npm:json-bigint", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:call-bind-apply-helpers", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:es-define-property", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:es-object-atoms", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:function-bind", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:get-proto", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:gopd", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:has-symbols", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:hasown", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:math-intrinsics", + "type": "static" + }, + { + "source": "npm:get-proto", + "target": "npm:dunder-proto", + "type": "static" + }, + { + "source": "npm:get-proto", + "target": "npm:es-object-atoms", + "type": "static" + }, + { + "source": "npm:get-tsconfig", + "target": "npm:resolve-pkg-maps", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:node-fetch-native", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:nypm", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:glob-parent@5.1.2", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:glob-parent@6.0.2", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:foreground-child", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:jackspeak", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:minipass", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:package-json-from-dist", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:path-scurry", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:array-union", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:dir-glob", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:ignore@5.3.2", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:merge2", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:slash@3.0.0", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:@sindresorhus/merge-streams", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:ignore@7.0.5", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:path-type@6.0.0", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:slash@5.1.0", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:unicorn-magic", + "type": "static" + }, + { + "source": "npm:goober", + "target": "npm:csstype@3.2.3", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:base64-js", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:ecdsa-sig-formatter", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:gaxios", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:gcp-metadata", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:google-logging-utils", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:gtoken", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:jws", + "type": "static" + }, + { + "source": "npm:gtoken", + "target": "npm:gaxios", + "type": "static" + }, + { + "source": "npm:gtoken", + "target": "npm:jws", + "type": "static" + }, + { + "source": "npm:gzip-size", + "target": "npm:duplexer", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:cookie-es@1.2.2", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:crossws", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:iron-webcrypto", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:node-mock-http", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:radix3", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:uncrypto", + "type": "static" + }, + { + "source": "npm:h3@2.0.0-beta.5", + "target": "npm:cookie-es@2.0.0", + "type": "static" + }, + { + "source": "npm:h3@2.0.0-beta.5", + "target": "npm:fetchdts", + "type": "static" + }, + { + "source": "npm:h3@2.0.0-beta.5", + "target": "npm:rou3", + "type": "static" + }, + { + "source": "npm:h3@2.0.0-beta.5", + "target": "npm:srvx", + "type": "static" + }, + { + "source": "npm:h3-v2", + "target": "npm:cookie-es@2.0.0", + "type": "static" + }, + { + "source": "npm:h3-v2", + "target": "npm:fetchdts", + "type": "static" + }, + { + "source": "npm:h3-v2", + "target": "npm:rou3", + "type": "static" + }, + { + "source": "npm:h3-v2", + "target": "npm:srvx", + "type": "static" + }, + { + "source": "npm:happy-dom", + "target": "npm:@types/node@20.19.25", + "type": "static" + }, + { + "source": "npm:happy-dom", + "target": "npm:@types/whatwg-mimetype", + "type": "static" + }, + { + "source": "npm:happy-dom", + "target": "npm:whatwg-mimetype@3.0.0", + "type": "static" + }, + { + "source": "npm:has-tostringtag", + "target": "npm:has-symbols", + "type": "static" + }, + { + "source": "npm:hasown", + "target": "npm:function-bind", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:hastscript", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:property-information@7.1.0", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:vfile-location", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:web-namespaces", + "type": "static" + }, + { + "source": "npm:hast-util-is-element", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-parse-selector", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:@ungap/structured-clone", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:hast-util-from-parse5", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:hast-util-to-parse5", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:html-void-elements", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:mdast-util-to-hast", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:parse5@7.3.0", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:unist-util-position", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:web-namespaces", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:zwitch", + "type": "static" + }, + { + "source": "npm:hast-util-sanitize", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-sanitize", + "target": "npm:@ungap/structured-clone", + "type": "static" + }, + { + "source": "npm:hast-util-sanitize", + "target": "npm:unist-util-position", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:comma-separated-tokens", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:estree-util-is-identifier-name", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:hast-util-whitespace", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:mdast-util-mdx-expression", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:mdast-util-mdx-jsx", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:mdast-util-mdxjs-esm", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:property-information@7.1.0", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:space-separated-tokens", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:style-to-js", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:unist-util-position", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:vfile-message", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:comma-separated-tokens", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:property-information@6.5.0", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:space-separated-tokens", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:web-namespaces", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:zwitch", + "type": "static" + }, + { + "source": "npm:hast-util-to-text", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-to-text", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:hast-util-to-text", + "target": "npm:hast-util-is-element", + "type": "static" + }, + { + "source": "npm:hast-util-to-text", + "target": "npm:unist-util-find-after", + "type": "static" + }, + { + "source": "npm:hast-util-whitespace", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:comma-separated-tokens", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:hast-util-parse-selector", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:property-information@7.1.0", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:space-separated-tokens", + "type": "static" + }, + { + "source": "npm:hermes-parser", + "target": "npm:hermes-estree", + "type": "static" + }, + { + "source": "npm:html-encoding-sniffer", + "target": "npm:whatwg-encoding", + "type": "static" + }, + { + "source": "npm:html-link-extractor", + "target": "npm:cheerio", + "type": "static" + }, + { + "source": "npm:htmlparser2", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:htmlparser2", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:htmlparser2", + "target": "npm:domutils", + "type": "static" + }, + { + "source": "npm:htmlparser2", + "target": "npm:entities@6.0.1", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:depd", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:setprototypeof", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:statuses@2.0.1", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:toidentifier", + "type": "static" + }, + { + "source": "npm:http-proxy-agent", + "target": "npm:agent-base", + "type": "static" + }, + { + "source": "npm:http-proxy-agent", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:https-proxy-agent", + "target": "npm:agent-base", + "type": "static" + }, + { + "source": "npm:https-proxy-agent", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:iconv-lite@0.6.3", + "target": "npm:safer-buffer", + "type": "static" + }, + { + "source": "npm:iconv-lite@0.7.0", + "target": "npm:safer-buffer", + "type": "static" + }, + { + "source": "npm:import-fresh", + "target": "npm:parent-module", + "type": "static" + }, + { + "source": "npm:import-fresh", + "target": "npm:resolve-from@4.0.0", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:@ioredis/commands", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:cluster-key-slot", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:denque", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:lodash.defaults", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:lodash.isarguments", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:redis-errors", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:redis-parser", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:standard-as-callback", + "type": "static" + }, + { + "source": "npm:is-alphanumerical", + "target": "npm:is-alphabetical", + "type": "static" + }, + { + "source": "npm:is-alphanumerical", + "target": "npm:is-decimal", + "type": "static" + }, + { + "source": "npm:is-binary-path", + "target": "npm:binary-extensions", + "type": "static" + }, + { + "source": "npm:is-core-module", + "target": "npm:hasown", + "type": "static" + }, + { + "source": "npm:is-glob", + "target": "npm:is-extglob", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:ts-declaration-location", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:is-inside-container", + "target": "npm:is-docker@3.0.0", + "type": "static" + }, + { + "source": "npm:is-reference@1.2.1", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:is-reference@3.0.3", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:is-subdir", + "target": "npm:better-path-resolve", + "type": "static" + }, + { + "source": "npm:is-text-path", + "target": "npm:text-extensions", + "type": "static" + }, + { + "source": "npm:is-wsl@2.2.0", + "target": "npm:is-docker@2.2.1", + "type": "static" + }, + { + "source": "npm:is-wsl@3.1.0", + "target": "npm:is-inside-container", + "type": "static" + }, + { + "source": "npm:is64bit", + "target": "npm:system-architecture", + "type": "static" + }, + { + "source": "npm:jackspeak", + "target": "npm:@isaacs/cliui", + "type": "static" + }, + { + "source": "npm:jackspeak", + "target": "npm:@pkgjs/parseargs", + "type": "static" + }, + { + "source": "npm:jest-diff", + "target": "npm:@jest/diff-sequences", + "type": "static" + }, + { + "source": "npm:jest-diff", + "target": "npm:@jest/get-type", + "type": "static" + }, + { + "source": "npm:jest-diff", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:jest-diff", + "target": "npm:pretty-format@30.2.0", + "type": "static" + }, + { + "source": "npm:js-yaml@3.14.1", + "target": "npm:argparse@1.0.10", + "type": "static" + }, + { + "source": "npm:js-yaml@3.14.1", + "target": "npm:esprima", + "type": "static" + }, + { + "source": "npm:js-yaml@4.1.1", + "target": "npm:argparse@2.0.1", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:@acemir/cssom", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:@asamuzakjp/dom-selector", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:cssstyle", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:data-urls", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:decimal.js", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:html-encoding-sniffer", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:http-proxy-agent", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:https-proxy-agent", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:is-potential-custom-element-name", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:parse5@8.0.0", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:saxes", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:symbol-tree", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:tough-cookie", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:w3c-xmlserializer", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:webidl-conversions@8.0.0", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:whatwg-encoding", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:whatwg-mimetype@4.0.0", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:whatwg-url@15.1.0", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:ws", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:xml-name-validator", + "type": "static" + }, + { + "source": "npm:json-bigint", + "target": "npm:bignumber.js", + "type": "static" + }, + { + "source": "npm:json-schema-to-ts", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:json-schema-to-ts", + "target": "npm:ts-algebra", + "type": "static" + }, + { + "source": "npm:jsonfile@4.0.0", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:jsonfile@6.2.0", + "target": "npm:universalify@2.0.1", + "type": "static" + }, + { + "source": "npm:jsonfile@6.2.0", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:jwa", + "target": "npm:buffer-equal-constant-time", + "type": "static" + }, + { + "source": "npm:jwa", + "target": "npm:ecdsa-sig-formatter", + "type": "static" + }, + { + "source": "npm:jwa", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + }, + { + "source": "npm:jws", + "target": "npm:jwa", + "type": "static" + }, + { + "source": "npm:jws", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + }, + { + "source": "npm:keyv", + "target": "npm:json-buffer", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:@nodelib/fs.walk", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:formatly", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:js-yaml@4.1.1", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:minimist", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:oxc-resolver", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:smol-toml", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:strip-json-comments@5.0.3", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "npm:lazystream", + "target": "npm:readable-stream@2.3.8", + "type": "static" + }, + { + "source": "npm:levn", + "target": "npm:prelude-ls", + "type": "static" + }, + { + "source": "npm:levn", + "target": "npm:type-check", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:detect-libc@2.1.2", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-android-arm64", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-darwin-arm64", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-darwin-x64", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-freebsd-x64", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-win32-x64-msvc", + "type": "static" + }, + { + "source": "npm:linkify-it", + "target": "npm:uc.micro", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:@parcel/watcher", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:@parcel/watcher-wasm", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:clipboardy", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:crossws", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:get-port-please", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:h3@1.15.4", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:http-shutdown", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:node-forge", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:pathe@1.1.2", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:std-env", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:untun", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:uqr", + "type": "static" + }, + { + "source": "npm:local-pkg@0.5.1", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:local-pkg@0.5.1", + "target": "npm:pkg-types@1.3.1", + "type": "static" + }, + { + "source": "npm:local-pkg@1.1.2", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:local-pkg@1.1.2", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:local-pkg@1.1.2", + "target": "npm:quansync", + "type": "static" + }, + { + "source": "npm:locate-path@5.0.0", + "target": "npm:p-locate@4.1.0", + "type": "static" + }, + { + "source": "npm:locate-path@6.0.0", + "target": "npm:p-locate@5.0.0", + "type": "static" + }, + { + "source": "npm:log-symbols", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:log-symbols", + "target": "npm:is-unicode-supported", + "type": "static" + }, + { + "source": "npm:lowlight", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:lowlight", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:lowlight", + "target": "npm:highlight.js", + "type": "static" + }, + { + "source": "npm:lru-cache@5.1.1", + "target": "npm:yallist@3.1.1", + "type": "static" + }, + { + "source": "npm:lru-cache@6.0.0", + "target": "npm:yallist@4.0.0", + "type": "static" + }, + { + "source": "npm:lucide-react", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:magic-string", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + }, + { + "source": "npm:magicast", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:magicast", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:magicast", + "target": "npm:source-map-js", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:argparse@2.0.1", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:entities@4.5.0", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:linkify-it", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:mdurl", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:punycode.js", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:uc.micro", + "type": "static" + }, + { + "source": "npm:markdown-link-extractor", + "target": "npm:html-link-extractor", + "type": "static" + }, + { + "source": "npm:markdown-link-extractor", + "target": "npm:marked", + "type": "static" + }, + { + "source": "npm:mdast-util-find-and-replace", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-find-and-replace", + "target": "npm:escape-string-regexp@5.0.0", + "type": "static" + }, + { + "source": "npm:mdast-util-find-and-replace", + "target": "npm:unist-util-is", + "type": "static" + }, + { + "source": "npm:mdast-util-find-and-replace", + "target": "npm:unist-util-visit-parents", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:mdast-util-to-string", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-decode-numeric-character-reference", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-decode-string", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:unist-util-stringify-position", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:ccount", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:mdast-util-find-and-replace", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-strikethrough", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-strikethrough", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-strikethrough", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:markdown-table", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-task-list-item", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-task-list-item", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-task-list-item", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-task-list-item", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-autolink-literal", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-footnote", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-strikethrough", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-table", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-task-list-item", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:@types/estree-jsx", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:@types/estree-jsx", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:ccount", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:parse-entities", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:stringify-entities", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:unist-util-stringify-position", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:vfile-message", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:@types/estree-jsx", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-phrasing", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-phrasing", + "target": "npm:unist-util-is", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:@ungap/structured-clone", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:micromark-util-sanitize-uri", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:trim-lines", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:unist-util-position", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:longest-streak", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:mdast-util-phrasing", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:mdast-util-to-string", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:micromark-util-classify-character", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:micromark-util-decode-string", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:zwitch", + "type": "static" + }, + { + "source": "npm:mdast-util-to-string", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:merge-anything", + "target": "npm:is-what", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-destination", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-label", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-title", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-whitespace", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-classify-character", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-html-tag-name", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-resolve-all", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-subtokenize", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-autolink-literal", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-autolink-literal", + "target": "npm:micromark-util-sanitize-uri", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-autolink-literal", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-autolink-literal", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-core-commonmark", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-sanitize-uri", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-classify-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-resolve-all", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-tagfilter", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-autolink-literal", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-footnote", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-strikethrough", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-table", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-tagfilter", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-task-list-item", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-util-combine-extensions", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-factory-destination", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-destination", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-factory-destination", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-factory-label", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-factory-label", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-label", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-factory-label", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-factory-space", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-space", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-factory-title", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-factory-title", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-title", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-factory-title", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-factory-whitespace", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-factory-whitespace", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-whitespace", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-factory-whitespace", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-util-character", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-character", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-util-chunked", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-classify-character", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-util-classify-character", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-classify-character", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-util-combine-extensions", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark-util-combine-extensions", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-util-decode-numeric-character-reference", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-decode-string", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:micromark-util-decode-string", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-util-decode-string", + "target": "npm:micromark-util-decode-numeric-character-reference", + "type": "static" + }, + { + "source": "npm:micromark-util-decode-string", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-normalize-identifier", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-resolve-all", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark-util-sanitize-uri", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-util-sanitize-uri", + "target": "npm:micromark-util-encode", + "type": "static" + }, + { + "source": "npm:micromark-util-sanitize-uri", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-subtokenize", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-util-subtokenize", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark-util-subtokenize", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-subtokenize", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:@types/debug", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-core-commonmark", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-combine-extensions", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-decode-numeric-character-reference", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-encode", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-resolve-all", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-sanitize-uri", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-subtokenize", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:micromatch", + "target": "npm:braces", + "type": "static" + }, + { + "source": "npm:micromatch", + "target": "npm:picomatch@2.3.1", + "type": "static" + }, + { + "source": "npm:mime-types@2.1.35", + "target": "npm:mime-db@1.52.0", + "type": "static" + }, + { + "source": "npm:mime-types@3.0.1", + "target": "npm:mime-db@1.54.0", + "type": "static" + }, + { + "source": "npm:minimatch@3.0.8", + "target": "npm:brace-expansion@1.1.12", + "type": "static" + }, + { + "source": "npm:minimatch@3.1.2", + "target": "npm:brace-expansion@1.1.12", + "type": "static" + }, + { + "source": "npm:minimatch@5.1.6", + "target": "npm:brace-expansion@2.0.2", + "type": "static" + }, + { + "source": "npm:minimatch@9.0.3", + "target": "npm:brace-expansion@2.0.2", + "type": "static" + }, + { + "source": "npm:minimatch@9.0.5", + "target": "npm:brace-expansion@2.0.2", + "type": "static" + }, + { + "source": "npm:minizlib", + "target": "npm:minipass", + "type": "static" + }, + { + "source": "npm:mlly", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:mlly", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:mlly", + "target": "npm:pkg-types@1.3.1", + "type": "static" + }, + { + "source": "npm:mlly", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:nanospinner", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@cloudflare/kv-asset-handler", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-alias", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-commonjs", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-inject", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-json", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-node-resolve", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-replace", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-terser", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@vercel/nft", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:archiver", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:c12", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:chokidar@4.0.3", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:compatx", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:confbox@0.2.2", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:cookie-es@2.0.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:croner", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:crossws", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:db0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:dot-prop@10.1.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:escape-string-regexp@5.0.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:etag", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:exsolve", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:globby@15.0.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:gzip-size", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:h3@1.15.4", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:hookable", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:httpxy", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ioredis", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:klona", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:knitwork", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:listhen", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:magicast", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:mime@4.1.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:node-fetch-native", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:node-mock-http", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ofetch", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ohash", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:perfect-debounce", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:pretty-bytes", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:radix3", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:rollup-plugin-visualizer", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:scule", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:serve-placeholder", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:serve-static", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:source-map@0.7.6", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:std-env", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ultrahtml", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:uncrypto", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unctx", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unenv", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unimport", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unplugin-utils", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unstorage", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:untyped", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unwasm", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:youch", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:youch-core", + "type": "static" + }, + { + "source": "npm:node-fetch@2.7.0", + "target": "npm:whatwg-url@5.0.0", + "type": "static" + }, + { + "source": "npm:node-fetch@3.3.2", + "target": "npm:data-uri-to-buffer", + "type": "static" + }, + { + "source": "npm:node-fetch@3.3.2", + "target": "npm:fetch-blob", + "type": "static" + }, + { + "source": "npm:node-fetch@3.3.2", + "target": "npm:formdata-polyfill", + "type": "static" + }, + { + "source": "npm:nopt", + "target": "npm:abbrev", + "type": "static" + }, + { + "source": "npm:npm-run-path@4.0.1", + "target": "npm:path-key@3.1.1", + "type": "static" + }, + { + "source": "npm:npm-run-path@5.3.0", + "target": "npm:path-key@4.0.0", + "type": "static" + }, + { + "source": "npm:nth-check", + "target": "npm:boolbase", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@napi-rs/wasm-runtime@0.2.4", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@yarnpkg/lockfile", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@yarnpkg/parsers", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@zkochan/js-yaml", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:axios", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:cli-cursor", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:cli-spinners", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:cliui", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:dotenv@16.4.7", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:dotenv-expand", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:enquirer@2.3.6", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:figures", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:flat", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:front-matter", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:ignore@7.0.5", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:jest-diff", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:jsonc-parser", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:lines-and-columns", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:minimatch@9.0.3", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:node-machine-id", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:npm-run-path@4.0.1", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:open", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:ora", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:resolve.exports", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tar-stream@2.2.0", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tree-kill", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tsconfig-paths", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:yaml", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:yargs-parser", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-darwin-arm64", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-darwin-x64", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-freebsd-x64", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-win32-x64-msvc", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:tinyexec@1.0.1", + "type": "static" + }, + { + "source": "npm:ofetch", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:ofetch", + "target": "npm:node-fetch-native", + "type": "static" + }, + { + "source": "npm:ofetch", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:ollama", + "target": "npm:whatwg-fetch", + "type": "static" + }, + { + "source": "npm:on-finished", + "target": "npm:ee-first", + "type": "static" + }, + { + "source": "npm:once", + "target": "npm:wrappy", + "type": "static" + }, + { + "source": "npm:onetime@5.1.2", + "target": "npm:mimic-fn@2.1.0", + "type": "static" + }, + { + "source": "npm:onetime@6.0.0", + "target": "npm:mimic-fn@4.0.0", + "type": "static" + }, + { + "source": "npm:open", + "target": "npm:define-lazy-prop", + "type": "static" + }, + { + "source": "npm:open", + "target": "npm:is-docker@2.2.1", + "type": "static" + }, + { + "source": "npm:open", + "target": "npm:is-wsl@2.2.0", + "type": "static" + }, + { + "source": "npm:openai", + "target": "npm:ws", + "type": "static" + }, + { + "source": "npm:openai", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:deep-is", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:fast-levenshtein", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:levn", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:prelude-ls", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:type-check", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:word-wrap", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:bl", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:cli-cursor", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:cli-spinners", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:is-interactive", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:log-symbols", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:wcwidth", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-android-arm-eabi", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-android-arm64", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-darwin-arm64", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-darwin-x64", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-freebsd-x64", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-arm-musleabihf", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-ppc64-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-riscv64-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-riscv64-musl", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-s390x-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-wasm32-wasi", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-win32-ia32-msvc", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-win32-x64-msvc", + "type": "static" + }, + { + "source": "npm:p-filter", + "target": "npm:p-map", + "type": "static" + }, + { + "source": "npm:p-limit@2.3.0", + "target": "npm:p-try", + "type": "static" + }, + { + "source": "npm:p-limit@3.1.0", + "target": "npm:yocto-queue", + "type": "static" + }, + { + "source": "npm:p-locate@4.1.0", + "target": "npm:p-limit@2.3.0", + "type": "static" + }, + { + "source": "npm:p-locate@5.0.0", + "target": "npm:p-limit@3.1.0", + "type": "static" + }, + { + "source": "npm:package-manager-detector@0.2.11", + "target": "npm:quansync", + "type": "static" + }, + { + "source": "npm:parent-module", + "target": "npm:callsites", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:@types/unist@2.0.11", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:character-entities-legacy", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:character-reference-invalid", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:is-alphanumerical", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:is-decimal", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:is-hexadecimal", + "type": "static" + }, + { + "source": "npm:parse5-htmlparser2-tree-adapter", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:parse5-htmlparser2-tree-adapter", + "target": "npm:parse5@7.3.0", + "type": "static" + }, + { + "source": "npm:parse5-parser-stream", + "target": "npm:parse5@7.3.0", + "type": "static" + }, + { + "source": "npm:parse5@7.3.0", + "target": "npm:entities@6.0.1", + "type": "static" + }, + { + "source": "npm:parse5@8.0.0", + "target": "npm:entities@6.0.1", + "type": "static" + }, + { + "source": "npm:path-scurry", + "target": "npm:lru-cache@10.4.3", + "type": "static" + }, + { + "source": "npm:path-scurry", + "target": "npm:minipass", + "type": "static" + }, + { + "source": "npm:pkg-types@1.3.1", + "target": "npm:confbox@0.1.8", + "type": "static" + }, + { + "source": "npm:pkg-types@1.3.1", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:pkg-types@1.3.1", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:pkg-types@2.3.0", + "target": "npm:confbox@0.2.2", + "type": "static" + }, + { + "source": "npm:pkg-types@2.3.0", + "target": "npm:exsolve", + "type": "static" + }, + { + "source": "npm:pkg-types@2.3.0", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:postcss", + "target": "npm:nanoid@3.3.11", + "type": "static" + }, + { + "source": "npm:postcss", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:postcss", + "target": "npm:source-map-js", + "type": "static" + }, + { + "source": "npm:prettier-plugin-svelte", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "npm:prettier-plugin-svelte", + "target": "npm:svelte", + "type": "static" + }, + { + "source": "npm:pretty-format@27.5.1", + "target": "npm:ansi-regex@5.0.1", + "type": "static" + }, + { + "source": "npm:pretty-format@27.5.1", + "target": "npm:ansi-styles@5.2.0", + "type": "static" + }, + { + "source": "npm:pretty-format@27.5.1", + "target": "npm:react-is@17.0.2", + "type": "static" + }, + { + "source": "npm:pretty-format@30.2.0", + "target": "npm:@jest/schemas", + "type": "static" + }, + { + "source": "npm:pretty-format@30.2.0", + "target": "npm:ansi-styles@5.2.0", + "type": "static" + }, + { + "source": "npm:pretty-format@30.2.0", + "target": "npm:react-is@18.3.1", + "type": "static" + }, + { + "source": "npm:publint", + "target": "npm:@publint/pack", + "type": "static" + }, + { + "source": "npm:publint", + "target": "npm:package-manager-detector@1.5.0", + "type": "static" + }, + { + "source": "npm:publint", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:publint", + "target": "npm:sade", + "type": "static" + }, + { + "source": "npm:randombytes", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + }, + { + "source": "npm:rc9", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:rc9", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:react-dom", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:react-dom", + "target": "npm:scheduler", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:hast-util-to-jsx-runtime", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:html-url-attributes", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:mdast-util-to-hast", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:remark-parse", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:remark-rehype", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:unified", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:read-yaml-file", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:read-yaml-file", + "target": "npm:js-yaml@3.14.1", + "type": "static" + }, + { + "source": "npm:read-yaml-file", + "target": "npm:pify", + "type": "static" + }, + { + "source": "npm:read-yaml-file", + "target": "npm:strip-bom", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:core-util-is", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:isarray", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:process-nextick-args", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:safe-buffer@5.1.2", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:string_decoder@1.1.1", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:util-deprecate", + "type": "static" + }, + { + "source": "npm:readable-stream@3.6.2", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:readable-stream@3.6.2", + "target": "npm:string_decoder@1.3.0", + "type": "static" + }, + { + "source": "npm:readable-stream@3.6.2", + "target": "npm:util-deprecate", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:abort-controller", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:buffer@6.0.3", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:events", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:process", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:string_decoder@1.3.0", + "type": "static" + }, + { + "source": "npm:readdir-glob", + "target": "npm:minimatch@5.1.6", + "type": "static" + }, + { + "source": "npm:readdirp@3.6.0", + "target": "npm:picomatch@2.3.1", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:ast-types", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:esprima", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:source-map@0.6.1", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:redent", + "target": "npm:indent-string", + "type": "static" + }, + { + "source": "npm:redent", + "target": "npm:strip-indent", + "type": "static" + }, + { + "source": "npm:redis-parser", + "target": "npm:redis-errors", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:hast-util-to-text", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:lowlight", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:rehype-raw", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:rehype-raw", + "target": "npm:hast-util-raw", + "type": "static" + }, + { + "source": "npm:rehype-raw", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:rehype-sanitize", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:rehype-sanitize", + "target": "npm:hast-util-sanitize", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:mdast-util-gfm", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:micromark-extension-gfm", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:remark-parse", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:remark-stringify", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:unified", + "type": "static" + }, + { + "source": "npm:remark-parse", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:remark-parse", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:remark-parse", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:remark-parse", + "target": "npm:unified", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:mdast-util-to-hast", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:unified", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:remark-stringify", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:remark-stringify", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:remark-stringify", + "target": "npm:unified", + "type": "static" + }, + { + "source": "npm:resolve", + "target": "npm:is-core-module", + "type": "static" + }, + { + "source": "npm:resolve", + "target": "npm:path-parse", + "type": "static" + }, + { + "source": "npm:resolve", + "target": "npm:supports-preserve-symlinks-flag", + "type": "static" + }, + { + "source": "npm:restore-cursor", + "target": "npm:onetime@5.1.2", + "type": "static" + }, + { + "source": "npm:restore-cursor", + "target": "npm:signal-exit@3.0.7", + "type": "static" + }, + { + "source": "npm:rimraf", + "target": "npm:glob", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@oxc-project/types", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/pluginutils@1.0.0-beta.51", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-android-arm64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-darwin-arm64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-darwin-x64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-freebsd-x64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-openharmony-arm64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-wasm32-wasi", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-win32-ia32-msvc", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-win32-x64-msvc", + "type": "static" + }, + { + "source": "npm:rollup-plugin-preserve-directives", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:rollup-plugin-preserve-directives", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:rollup-plugin-preserve-directives", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:open", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:source-map@0.7.6", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:rolldown", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-android-arm-eabi", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-android-arm64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-darwin-arm64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-darwin-x64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-freebsd-arm64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-freebsd-x64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-arm-musleabihf", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-loong64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-ppc64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-riscv64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-riscv64-musl", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-s390x-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-openharmony-arm64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-win32-ia32-msvc", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-win32-x64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-win32-x64-msvc", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:fsevents", + "type": "static" + }, + { + "source": "npm:run-parallel", + "target": "npm:queue-microtask", + "type": "static" + }, + { + "source": "npm:sade", + "target": "npm:mri", + "type": "static" + }, + { + "source": "npm:saxes", + "target": "npm:xmlchars", + "type": "static" + }, + { + "source": "npm:semver@7.5.4", + "target": "npm:lru-cache@6.0.0", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:encodeurl", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:escape-html", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:etag", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:fresh", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:http-errors", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:mime-types@3.0.1", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:ms", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:on-finished", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:range-parser", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:statuses@2.0.2", + "type": "static" + }, + { + "source": "npm:serialize-javascript", + "target": "npm:randombytes", + "type": "static" + }, + { + "source": "npm:seroval-plugins@1.3.3", + "target": "npm:seroval@1.3.2", + "type": "static" + }, + { + "source": "npm:seroval-plugins@1.4.0", + "target": "npm:seroval@1.4.0", + "type": "static" + }, + { + "source": "npm:serve-placeholder", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:serve-static", + "target": "npm:encodeurl", + "type": "static" + }, + { + "source": "npm:serve-static", + "target": "npm:escape-html", + "type": "static" + }, + { + "source": "npm:serve-static", + "target": "npm:parseurl", + "type": "static" + }, + { + "source": "npm:serve-static", + "target": "npm:send", + "type": "static" + }, + { + "source": "npm:shebang-command", + "target": "npm:shebang-regex", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-darwin-arm64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-darwin-x64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-linux-arm64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-linux-x64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-windows-arm64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-windows-x64", + "type": "static" + }, + { + "source": "npm:simple-git", + "target": "npm:@kwsites/file-exists", + "type": "static" + }, + { + "source": "npm:simple-git", + "target": "npm:@kwsites/promise-deferred", + "type": "static" + }, + { + "source": "npm:simple-git", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:bytes-iec", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:chokidar@4.0.3", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:lilconfig", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:nanospinner", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:solid-js", + "target": "npm:csstype@3.1.3", + "type": "static" + }, + { + "source": "npm:solid-js", + "target": "npm:seroval@1.3.2", + "type": "static" + }, + { + "source": "npm:solid-js", + "target": "npm:seroval-plugins@1.3.3", + "type": "static" + }, + { + "source": "npm:solid-refresh", + "target": "npm:@babel/generator", + "type": "static" + }, + { + "source": "npm:solid-refresh", + "target": "npm:@babel/helper-module-imports@7.27.1", + "type": "static" + }, + { + "source": "npm:solid-refresh", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:solid-refresh", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:source-map-support", + "target": "npm:buffer-from", + "type": "static" + }, + { + "source": "npm:source-map-support", + "target": "npm:source-map@0.6.1", + "type": "static" + }, + { + "source": "npm:spawndamnit", + "target": "npm:cross-spawn", + "type": "static" + }, + { + "source": "npm:spawndamnit", + "target": "npm:signal-exit@4.1.0", + "type": "static" + }, + { + "source": "npm:streamx", + "target": "npm:events-universal", + "type": "static" + }, + { + "source": "npm:streamx", + "target": "npm:fast-fifo", + "type": "static" + }, + { + "source": "npm:streamx", + "target": "npm:text-decoder", + "type": "static" + }, + { + "source": "npm:string-width@4.2.3", + "target": "npm:emoji-regex@8.0.0", + "type": "static" + }, + { + "source": "npm:string-width@4.2.3", + "target": "npm:is-fullwidth-code-point", + "type": "static" + }, + { + "source": "npm:string-width@4.2.3", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:string-width-cjs", + "target": "npm:emoji-regex@8.0.0", + "type": "static" + }, + { + "source": "npm:string-width-cjs", + "target": "npm:is-fullwidth-code-point", + "type": "static" + }, + { + "source": "npm:string-width-cjs", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:string-width@5.1.2", + "target": "npm:eastasianwidth", + "type": "static" + }, + { + "source": "npm:string-width@5.1.2", + "target": "npm:emoji-regex@9.2.2", + "type": "static" + }, + { + "source": "npm:string-width@5.1.2", + "target": "npm:strip-ansi@7.1.2", + "type": "static" + }, + { + "source": "npm:string_decoder@1.1.1", + "target": "npm:safe-buffer@5.1.2", + "type": "static" + }, + { + "source": "npm:string_decoder@1.3.0", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + }, + { + "source": "npm:stringify-entities", + "target": "npm:character-entities-html4", + "type": "static" + }, + { + "source": "npm:stringify-entities", + "target": "npm:character-entities-legacy", + "type": "static" + }, + { + "source": "npm:strip-ansi@6.0.1", + "target": "npm:ansi-regex@5.0.1", + "type": "static" + }, + { + "source": "npm:strip-ansi-cjs", + "target": "npm:ansi-regex@5.0.1", + "type": "static" + }, + { + "source": "npm:strip-ansi@7.1.2", + "target": "npm:ansi-regex@6.2.2", + "type": "static" + }, + { + "source": "npm:strip-indent", + "target": "npm:min-indent", + "type": "static" + }, + { + "source": "npm:strip-literal", + "target": "npm:js-tokens@9.0.1", + "type": "static" + }, + { + "source": "npm:style-to-js", + "target": "npm:style-to-object", + "type": "static" + }, + { + "source": "npm:style-to-object", + "target": "npm:inline-style-parser", + "type": "static" + }, + { + "source": "npm:supports-color@7.2.0", + "target": "npm:has-flag", + "type": "static" + }, + { + "source": "npm:supports-color@8.1.1", + "target": "npm:has-flag", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:@jridgewell/remapping", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:@sveltejs/acorn-typescript", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:aria-query@5.3.2", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:axobject-query", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:devalue", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:esm-env", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:esrap", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:is-reference@3.0.3", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:locate-character", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:zimmerframe", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:bl", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:end-of-stream", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:fs-constants", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:readable-stream@3.6.2", + "type": "static" + }, + { + "source": "npm:tar-stream@3.1.7", + "target": "npm:b4a", + "type": "static" + }, + { + "source": "npm:tar-stream@3.1.7", + "target": "npm:fast-fifo", + "type": "static" + }, + { + "source": "npm:tar-stream@3.1.7", + "target": "npm:streamx", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:@isaacs/fs-minipass", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:chownr", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:minipass", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:minizlib", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:yallist@5.0.0", + "type": "static" + }, + { + "source": "npm:terser", + "target": "npm:@jridgewell/source-map", + "type": "static" + }, + { + "source": "npm:terser", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:terser", + "target": "npm:commander", + "type": "static" + }, + { + "source": "npm:terser", + "target": "npm:source-map-support", + "type": "static" + }, + { + "source": "npm:text-decoder", + "target": "npm:b4a", + "type": "static" + }, + { + "source": "npm:tinyglobby", + "target": "npm:fdir", + "type": "static" + }, + { + "source": "npm:tinyglobby", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:tldts", + "target": "npm:tldts-core", + "type": "static" + }, + { + "source": "npm:to-regex-range", + "target": "npm:is-number", + "type": "static" + }, + { + "source": "npm:tough-cookie", + "target": "npm:tldts", + "type": "static" + }, + { + "source": "npm:tr46@6.0.0", + "target": "npm:punycode", + "type": "static" + }, + { + "source": "npm:ts-api-utils", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:ts-declaration-location", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:ts-declaration-location", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:tsconfck", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:tsconfig-paths", + "target": "npm:json5", + "type": "static" + }, + { + "source": "npm:tsconfig-paths", + "target": "npm:minimist", + "type": "static" + }, + { + "source": "npm:tsconfig-paths", + "target": "npm:strip-bom", + "type": "static" + }, + { + "source": "npm:tsx", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "npm:tsx", + "target": "npm:get-tsconfig", + "type": "static" + }, + { + "source": "npm:tsx", + "target": "npm:fsevents", + "type": "static" + }, + { + "source": "npm:type-check", + "target": "npm:prelude-ls", + "type": "static" + }, + { + "source": "npm:type-fest", + "target": "npm:tagged-tag", + "type": "static" + }, + { + "source": "npm:typedoc-plugin-frontmatter", + "target": "npm:typedoc-plugin-markdown", + "type": "static" + }, + { + "source": "npm:typedoc-plugin-frontmatter", + "target": "npm:yaml", + "type": "static" + }, + { + "source": "npm:typedoc-plugin-markdown", + "target": "npm:typedoc", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:@gerrit0/mini-shiki", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:lunr", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:markdown-it", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:yaml", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:@typescript-eslint/eslint-plugin", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:@typescript-eslint/parser", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:@typescript-eslint/typescript-estree@8.46.3", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:@typescript-eslint/utils@8.46.3", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:unctx", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:unctx", + "target": "npm:estree-walker@3.0.3", + "type": "static" + }, + { + "source": "npm:unctx", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:unctx", + "target": "npm:unplugin", + "type": "static" + }, + { + "source": "npm:unenv", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:bail", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:extend", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:is-plain-obj", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:trough", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:escape-string-regexp@5.0.0", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:estree-walker@3.0.3", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:local-pkg@1.1.2", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:scule", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:strip-literal", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:unplugin", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:unplugin-utils", + "type": "static" + }, + { + "source": "npm:unist-util-find-after", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-find-after", + "target": "npm:unist-util-is", + "type": "static" + }, + { + "source": "npm:unist-util-is", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-position", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-stringify-position", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-visit-parents", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-visit-parents", + "target": "npm:unist-util-is", + "type": "static" + }, + { + "source": "npm:unist-util-visit", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-visit", + "target": "npm:unist-util-is", + "type": "static" + }, + { + "source": "npm:unist-util-visit", + "target": "npm:unist-util-visit-parents", + "type": "static" + }, + { + "source": "npm:unplugin-utils", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:unplugin-utils", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:unplugin", + "target": "npm:@jridgewell/remapping", + "type": "static" + }, + { + "source": "npm:unplugin", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:unplugin", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:unplugin", + "target": "npm:webpack-virtual-modules", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:napi-postinstall", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-android-arm-eabi", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-android-arm64", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-darwin-arm64", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-darwin-x64", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-freebsd-x64", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-arm-musleabihf", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-ppc64-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-riscv64-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-riscv64-musl", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-s390x-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-wasm32-wasi", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-win32-ia32-msvc", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-win32-x64-msvc", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:anymatch", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:chokidar@4.0.3", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:h3@1.15.4", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:lru-cache@10.4.3", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:node-fetch-native", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:ofetch", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:db0", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:ioredis", + "type": "static" + }, + { + "source": "npm:untun", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:untun", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:untun", + "target": "npm:pathe@1.1.2", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:knitwork", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:scule", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:knitwork", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:unplugin", + "type": "static" + }, + { + "source": "npm:update-browserslist-db", + "target": "npm:browserslist", + "type": "static" + }, + { + "source": "npm:update-browserslist-db", + "target": "npm:escalade", + "type": "static" + }, + { + "source": "npm:update-browserslist-db", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:uri-js", + "target": "npm:punycode", + "type": "static" + }, + { + "source": "npm:use-sync-external-store", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:vfile-location", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:vfile-location", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:vfile-message", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:vfile-message", + "target": "npm:unist-util-stringify-position", + "type": "static" + }, + { + "source": "npm:vfile", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:vfile", + "target": "npm:vfile-message", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:@microsoft/api-extractor", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:@volar/typescript", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:@vue/language-core", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:compare-versions", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:kolorist", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:local-pkg@0.5.1", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:vite-plugin-externalize-deps", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:@types/babel__core", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:babel-preset-solid", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:merge-anything", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:solid-refresh", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:vitefu", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:@testing-library/jest-dom", + "type": "static" + }, + { + "source": "npm:vite-tsconfig-paths", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:vite-tsconfig-paths", + "target": "npm:globrex", + "type": "static" + }, + { + "source": "npm:vite-tsconfig-paths", + "target": "npm:tsconfck", + "type": "static" + }, + { + "source": "npm:vite-tsconfig-paths", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:fdir", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:postcss", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:fsevents", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:lightningcss", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:terser", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:tsx", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:yaml", + "type": "static" + }, + { + "source": "npm:vitefu", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/expect", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/mocker", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/pretty-format", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/runner", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/snapshot", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/spy", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/utils", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:es-module-lexer", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:expect-type", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:obug", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:std-env", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:tinybench", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:tinyexec@0.3.2", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:tinyrainbow", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:why-is-node-running", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:happy-dom", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:jsdom", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:eslint-scope", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:espree", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:esquery", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:w3c-xmlserializer", + "target": "npm:xml-name-validator", + "type": "static" + }, + { + "source": "npm:wcwidth", + "target": "npm:defaults", + "type": "static" + }, + { + "source": "npm:whatwg-encoding", + "target": "npm:iconv-lite@0.6.3", + "type": "static" + }, + { + "source": "npm:whatwg-url@15.1.0", + "target": "npm:tr46@6.0.0", + "type": "static" + }, + { + "source": "npm:whatwg-url@15.1.0", + "target": "npm:webidl-conversions@8.0.0", + "type": "static" + }, + { + "source": "npm:whatwg-url@5.0.0", + "target": "npm:tr46@0.0.3", + "type": "static" + }, + { + "source": "npm:whatwg-url@5.0.0", + "target": "npm:webidl-conversions@3.0.1", + "type": "static" + }, + { + "source": "npm:which", + "target": "npm:isexe", + "type": "static" + }, + { + "source": "npm:why-is-node-running", + "target": "npm:siginfo", + "type": "static" + }, + { + "source": "npm:why-is-node-running", + "target": "npm:stackback", + "type": "static" + }, + { + "source": "npm:wrap-ansi@7.0.0", + "target": "npm:ansi-styles@4.3.0", + "type": "static" + }, + { + "source": "npm:wrap-ansi@7.0.0", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:wrap-ansi@7.0.0", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:wrap-ansi-cjs", + "target": "npm:ansi-styles@4.3.0", + "type": "static" + }, + { + "source": "npm:wrap-ansi-cjs", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:wrap-ansi-cjs", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:wrap-ansi@8.1.0", + "target": "npm:ansi-styles@6.2.3", + "type": "static" + }, + { + "source": "npm:wrap-ansi@8.1.0", + "target": "npm:string-width@5.1.2", + "type": "static" + }, + { + "source": "npm:wrap-ansi@8.1.0", + "target": "npm:strip-ansi@7.1.2", + "type": "static" + }, + { + "source": "npm:xmlbuilder2", + "target": "npm:@oozcitak/dom", + "type": "static" + }, + { + "source": "npm:xmlbuilder2", + "target": "npm:@oozcitak/infra", + "type": "static" + }, + { + "source": "npm:xmlbuilder2", + "target": "npm:@oozcitak/util", + "type": "static" + }, + { + "source": "npm:xmlbuilder2", + "target": "npm:js-yaml@4.1.1", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:cliui", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:escalade", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:get-caller-file", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:require-directory", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:y18n", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:yargs-parser", + "type": "static" + }, + { + "source": "npm:youch-core", + "target": "npm:@poppinss/exception", + "type": "static" + }, + { + "source": "npm:youch-core", + "target": "npm:error-stack-parser-es", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:@poppinss/colors", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:@poppinss/dumper", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:@speed-highlight/core", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:cookie", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:youch-core", + "type": "static" + }, + { + "source": "npm:zip-stream", + "target": "npm:archiver-utils", + "type": "static" + }, + { + "source": "npm:zip-stream", + "target": "npm:compress-commons", + "type": "static" + }, + { + "source": "npm:zip-stream", + "target": "npm:readable-stream@4.7.0", + "type": "static" + }, + { + "source": "npm:zod-validation-error@3.5.4", + "target": "npm:zod@3.25.76", + "type": "static" + }, + { + "source": "npm:zod-validation-error@4.0.2", + "target": "npm:zod@4.1.13", + "type": "static" + } +] \ No newline at end of file diff --git a/.nx/workspace-data/parsed-lock-file.nodes.json b/.nx/workspace-data/parsed-lock-file.nodes.json new file mode 100644 index 000000000..3c615ac4b --- /dev/null +++ b/.nx/workspace-data/parsed-lock-file.nodes.json @@ -0,0 +1,15406 @@ +{ + "nodes": { + "npm:@acemir/cssom": { + "type": "npm", + "name": "npm:@acemir/cssom", + "data": { + "version": "0.9.24", + "packageName": "@acemir/cssom", + "hash": "sha512-5YjgMmAiT2rjJZU7XK1SNI7iqTy92DpaYVgG6x63FxkJ11UpYfLndHJATtinWJClAXiOlW9XWaUyAQf8pMrQPg==" + } + }, + "npm:@adobe/css-tools": { + "type": "npm", + "name": "npm:@adobe/css-tools", + "data": { + "version": "4.4.4", + "packageName": "@adobe/css-tools", + "hash": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==" + } + }, + "npm:@ai-sdk/openai": { + "type": "npm", + "name": "npm:@ai-sdk/openai", + "data": { + "version": "2.0.73", + "packageName": "@ai-sdk/openai", + "hash": "sha512-TOGoxkeJMgcxq80ZfyCAqKcfvGPgFsEQEK8SgI/w3He0fqi16KlnZVMexOlg8HOLumF6szweg/YrOmQixsPVGw==" + } + }, + "npm:@ai-sdk/provider-utils": { + "type": "npm", + "name": "npm:@ai-sdk/provider-utils", + "data": { + "version": "3.0.17", + "packageName": "@ai-sdk/provider-utils", + "hash": "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==" + } + }, + "npm:@ai-sdk/provider": { + "type": "npm", + "name": "npm:@ai-sdk/provider", + "data": { + "version": "2.0.0", + "packageName": "@ai-sdk/provider", + "hash": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==" + } + }, + "npm:@anthropic-ai/sdk": { + "type": "npm", + "name": "npm:@anthropic-ai/sdk", + "data": { + "version": "0.71.0", + "packageName": "@anthropic-ai/sdk", + "hash": "sha512-go1XeWXmpxuiTkosSXpb8tokLk2ZLkIRcXpbWVwJM6gH5OBtHOVsfPfGuqI1oW7RRt4qc59EmYbrXRZ0Ng06Jw==" + } + }, + "npm:@asamuzakjp/css-color": { + "type": "npm", + "name": "npm:@asamuzakjp/css-color", + "data": { + "version": "4.0.5", + "packageName": "@asamuzakjp/css-color", + "hash": "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==" + } + }, + "npm:@asamuzakjp/dom-selector": { + "type": "npm", + "name": "npm:@asamuzakjp/dom-selector", + "data": { + "version": "6.7.4", + "packageName": "@asamuzakjp/dom-selector", + "hash": "sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==" + } + }, + "npm:@asamuzakjp/nwsapi": { + "type": "npm", + "name": "npm:@asamuzakjp/nwsapi", + "data": { + "version": "2.3.9", + "packageName": "@asamuzakjp/nwsapi", + "hash": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==" + } + }, + "npm:@babel/code-frame@7.26.2": { + "type": "npm", + "name": "npm:@babel/code-frame@7.26.2", + "data": { + "version": "7.26.2", + "packageName": "@babel/code-frame", + "hash": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==" + } + }, + "npm:@babel/code-frame@7.27.1": { + "type": "npm", + "name": "npm:@babel/code-frame@7.27.1", + "data": { + "version": "7.27.1", + "packageName": "@babel/code-frame", + "hash": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==" + } + }, + "npm:@babel/compat-data": { + "type": "npm", + "name": "npm:@babel/compat-data", + "data": { + "version": "7.28.5", + "packageName": "@babel/compat-data", + "hash": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==" + } + }, + "npm:@babel/core": { + "type": "npm", + "name": "npm:@babel/core", + "data": { + "version": "7.28.5", + "packageName": "@babel/core", + "hash": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==" + } + }, + "npm:@babel/generator": { + "type": "npm", + "name": "npm:@babel/generator", + "data": { + "version": "7.28.5", + "packageName": "@babel/generator", + "hash": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==" + } + }, + "npm:@babel/helper-annotate-as-pure": { + "type": "npm", + "name": "npm:@babel/helper-annotate-as-pure", + "data": { + "version": "7.27.3", + "packageName": "@babel/helper-annotate-as-pure", + "hash": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==" + } + }, + "npm:@babel/helper-compilation-targets": { + "type": "npm", + "name": "npm:@babel/helper-compilation-targets", + "data": { + "version": "7.27.2", + "packageName": "@babel/helper-compilation-targets", + "hash": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==" + } + }, + "npm:@babel/helper-create-class-features-plugin": { + "type": "npm", + "name": "npm:@babel/helper-create-class-features-plugin", + "data": { + "version": "7.28.5", + "packageName": "@babel/helper-create-class-features-plugin", + "hash": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==" + } + }, + "npm:@babel/helper-globals": { + "type": "npm", + "name": "npm:@babel/helper-globals", + "data": { + "version": "7.28.0", + "packageName": "@babel/helper-globals", + "hash": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" + } + }, + "npm:@babel/helper-member-expression-to-functions": { + "type": "npm", + "name": "npm:@babel/helper-member-expression-to-functions", + "data": { + "version": "7.28.5", + "packageName": "@babel/helper-member-expression-to-functions", + "hash": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==" + } + }, + "npm:@babel/helper-module-imports@7.18.6": { + "type": "npm", + "name": "npm:@babel/helper-module-imports@7.18.6", + "data": { + "version": "7.18.6", + "packageName": "@babel/helper-module-imports", + "hash": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==" + } + }, + "npm:@babel/helper-module-imports@7.27.1": { + "type": "npm", + "name": "npm:@babel/helper-module-imports@7.27.1", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-module-imports", + "hash": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==" + } + }, + "npm:@babel/helper-module-transforms": { + "type": "npm", + "name": "npm:@babel/helper-module-transforms", + "data": { + "version": "7.28.3", + "packageName": "@babel/helper-module-transforms", + "hash": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==" + } + }, + "npm:@babel/helper-optimise-call-expression": { + "type": "npm", + "name": "npm:@babel/helper-optimise-call-expression", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-optimise-call-expression", + "hash": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==" + } + }, + "npm:@babel/helper-plugin-utils": { + "type": "npm", + "name": "npm:@babel/helper-plugin-utils", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-plugin-utils", + "hash": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" + } + }, + "npm:@babel/helper-replace-supers": { + "type": "npm", + "name": "npm:@babel/helper-replace-supers", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-replace-supers", + "hash": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==" + } + }, + "npm:@babel/helper-skip-transparent-expression-wrappers": { + "type": "npm", + "name": "npm:@babel/helper-skip-transparent-expression-wrappers", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-skip-transparent-expression-wrappers", + "hash": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==" + } + }, + "npm:@babel/helper-string-parser": { + "type": "npm", + "name": "npm:@babel/helper-string-parser", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-string-parser", + "hash": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" + } + }, + "npm:@babel/helper-validator-identifier@7.27.1": { + "type": "npm", + "name": "npm:@babel/helper-validator-identifier@7.27.1", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-validator-identifier", + "hash": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + } + }, + "npm:@babel/helper-validator-identifier@7.28.5": { + "type": "npm", + "name": "npm:@babel/helper-validator-identifier@7.28.5", + "data": { + "version": "7.28.5", + "packageName": "@babel/helper-validator-identifier", + "hash": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" + } + }, + "npm:@babel/helper-validator-option": { + "type": "npm", + "name": "npm:@babel/helper-validator-option", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-validator-option", + "hash": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" + } + }, + "npm:@babel/helpers": { + "type": "npm", + "name": "npm:@babel/helpers", + "data": { + "version": "7.28.4", + "packageName": "@babel/helpers", + "hash": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==" + } + }, + "npm:@babel/parser@7.28.4": { + "type": "npm", + "name": "npm:@babel/parser@7.28.4", + "data": { + "version": "7.28.4", + "packageName": "@babel/parser", + "hash": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==" + } + }, + "npm:@babel/parser@7.28.5": { + "type": "npm", + "name": "npm:@babel/parser@7.28.5", + "data": { + "version": "7.28.5", + "packageName": "@babel/parser", + "hash": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==" + } + }, + "npm:@babel/plugin-proposal-private-methods": { + "type": "npm", + "name": "npm:@babel/plugin-proposal-private-methods", + "data": { + "version": "7.18.6", + "packageName": "@babel/plugin-proposal-private-methods", + "hash": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==" + } + }, + "npm:@babel/plugin-syntax-jsx": { + "type": "npm", + "name": "npm:@babel/plugin-syntax-jsx", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-syntax-jsx", + "hash": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==" + } + }, + "npm:@babel/plugin-syntax-typescript": { + "type": "npm", + "name": "npm:@babel/plugin-syntax-typescript", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-syntax-typescript", + "hash": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==" + } + }, + "npm:@babel/plugin-transform-modules-commonjs": { + "type": "npm", + "name": "npm:@babel/plugin-transform-modules-commonjs", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-transform-modules-commonjs", + "hash": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==" + } + }, + "npm:@babel/plugin-transform-react-jsx-self": { + "type": "npm", + "name": "npm:@babel/plugin-transform-react-jsx-self", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-transform-react-jsx-self", + "hash": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==" + } + }, + "npm:@babel/plugin-transform-react-jsx-source": { + "type": "npm", + "name": "npm:@babel/plugin-transform-react-jsx-source", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-transform-react-jsx-source", + "hash": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==" + } + }, + "npm:@babel/plugin-transform-typescript": { + "type": "npm", + "name": "npm:@babel/plugin-transform-typescript", + "data": { + "version": "7.28.5", + "packageName": "@babel/plugin-transform-typescript", + "hash": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==" + } + }, + "npm:@babel/preset-typescript": { + "type": "npm", + "name": "npm:@babel/preset-typescript", + "data": { + "version": "7.28.5", + "packageName": "@babel/preset-typescript", + "hash": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==" + } + }, + "npm:@babel/runtime": { + "type": "npm", + "name": "npm:@babel/runtime", + "data": { + "version": "7.28.4", + "packageName": "@babel/runtime", + "hash": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==" + } + }, + "npm:@babel/template": { + "type": "npm", + "name": "npm:@babel/template", + "data": { + "version": "7.27.2", + "packageName": "@babel/template", + "hash": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==" + } + }, + "npm:@babel/traverse": { + "type": "npm", + "name": "npm:@babel/traverse", + "data": { + "version": "7.28.5", + "packageName": "@babel/traverse", + "hash": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==" + } + }, + "npm:@babel/types@7.28.4": { + "type": "npm", + "name": "npm:@babel/types@7.28.4", + "data": { + "version": "7.28.4", + "packageName": "@babel/types", + "hash": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==" + } + }, + "npm:@babel/types@7.28.5": { + "type": "npm", + "name": "npm:@babel/types@7.28.5", + "data": { + "version": "7.28.5", + "packageName": "@babel/types", + "hash": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==" + } + }, + "npm:@changesets/apply-release-plan": { + "type": "npm", + "name": "npm:@changesets/apply-release-plan", + "data": { + "version": "7.0.13", + "packageName": "@changesets/apply-release-plan", + "hash": "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==" + } + }, + "npm:@changesets/assemble-release-plan": { + "type": "npm", + "name": "npm:@changesets/assemble-release-plan", + "data": { + "version": "6.0.9", + "packageName": "@changesets/assemble-release-plan", + "hash": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==" + } + }, + "npm:@changesets/changelog-git": { + "type": "npm", + "name": "npm:@changesets/changelog-git", + "data": { + "version": "0.2.1", + "packageName": "@changesets/changelog-git", + "hash": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==" + } + }, + "npm:@changesets/cli": { + "type": "npm", + "name": "npm:@changesets/cli", + "data": { + "version": "2.29.7", + "packageName": "@changesets/cli", + "hash": "sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==" + } + }, + "npm:@changesets/config": { + "type": "npm", + "name": "npm:@changesets/config", + "data": { + "version": "3.1.1", + "packageName": "@changesets/config", + "hash": "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==" + } + }, + "npm:@changesets/errors": { + "type": "npm", + "name": "npm:@changesets/errors", + "data": { + "version": "0.2.0", + "packageName": "@changesets/errors", + "hash": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==" + } + }, + "npm:@changesets/get-dependents-graph": { + "type": "npm", + "name": "npm:@changesets/get-dependents-graph", + "data": { + "version": "2.1.3", + "packageName": "@changesets/get-dependents-graph", + "hash": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==" + } + }, + "npm:@changesets/get-github-info": { + "type": "npm", + "name": "npm:@changesets/get-github-info", + "data": { + "version": "0.6.0", + "packageName": "@changesets/get-github-info", + "hash": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==" + } + }, + "npm:@changesets/get-release-plan": { + "type": "npm", + "name": "npm:@changesets/get-release-plan", + "data": { + "version": "4.0.13", + "packageName": "@changesets/get-release-plan", + "hash": "sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==" + } + }, + "npm:@changesets/get-version-range-type": { + "type": "npm", + "name": "npm:@changesets/get-version-range-type", + "data": { + "version": "0.4.0", + "packageName": "@changesets/get-version-range-type", + "hash": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==" + } + }, + "npm:@changesets/git": { + "type": "npm", + "name": "npm:@changesets/git", + "data": { + "version": "3.0.4", + "packageName": "@changesets/git", + "hash": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==" + } + }, + "npm:@changesets/logger": { + "type": "npm", + "name": "npm:@changesets/logger", + "data": { + "version": "0.1.1", + "packageName": "@changesets/logger", + "hash": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==" + } + }, + "npm:@changesets/parse": { + "type": "npm", + "name": "npm:@changesets/parse", + "data": { + "version": "0.4.1", + "packageName": "@changesets/parse", + "hash": "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==" + } + }, + "npm:@changesets/pre": { + "type": "npm", + "name": "npm:@changesets/pre", + "data": { + "version": "2.0.2", + "packageName": "@changesets/pre", + "hash": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==" + } + }, + "npm:@changesets/read": { + "type": "npm", + "name": "npm:@changesets/read", + "data": { + "version": "0.6.5", + "packageName": "@changesets/read", + "hash": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==" + } + }, + "npm:@changesets/should-skip-package": { + "type": "npm", + "name": "npm:@changesets/should-skip-package", + "data": { + "version": "0.1.2", + "packageName": "@changesets/should-skip-package", + "hash": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==" + } + }, + "npm:@changesets/types@4.1.0": { + "type": "npm", + "name": "npm:@changesets/types@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "@changesets/types", + "hash": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==" + } + }, + "npm:@changesets/types@6.1.0": { + "type": "npm", + "name": "npm:@changesets/types@6.1.0", + "data": { + "version": "6.1.0", + "packageName": "@changesets/types", + "hash": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==" + } + }, + "npm:@changesets/write": { + "type": "npm", + "name": "npm:@changesets/write", + "data": { + "version": "0.4.0", + "packageName": "@changesets/write", + "hash": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==" + } + }, + "npm:@cloudflare/kv-asset-handler": { + "type": "npm", + "name": "npm:@cloudflare/kv-asset-handler", + "data": { + "version": "0.4.0", + "packageName": "@cloudflare/kv-asset-handler", + "hash": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==" + } + }, + "npm:@commitlint/parse": { + "type": "npm", + "name": "npm:@commitlint/parse", + "data": { + "version": "20.0.0", + "packageName": "@commitlint/parse", + "hash": "sha512-j/PHCDX2bGM5xGcWObOvpOc54cXjn9g6xScXzAeOLwTsScaL4Y+qd0pFC6HBwTtrH92NvJQc+2Lx9HFkVi48cg==" + } + }, + "npm:@commitlint/types": { + "type": "npm", + "name": "npm:@commitlint/types", + "data": { + "version": "20.0.0", + "packageName": "@commitlint/types", + "hash": "sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==" + } + }, + "npm:@csstools/color-helpers": { + "type": "npm", + "name": "npm:@csstools/color-helpers", + "data": { + "version": "5.1.0", + "packageName": "@csstools/color-helpers", + "hash": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==" + } + }, + "npm:@csstools/css-calc": { + "type": "npm", + "name": "npm:@csstools/css-calc", + "data": { + "version": "2.1.4", + "packageName": "@csstools/css-calc", + "hash": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==" + } + }, + "npm:@csstools/css-color-parser": { + "type": "npm", + "name": "npm:@csstools/css-color-parser", + "data": { + "version": "3.1.0", + "packageName": "@csstools/css-color-parser", + "hash": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==" + } + }, + "npm:@csstools/css-parser-algorithms": { + "type": "npm", + "name": "npm:@csstools/css-parser-algorithms", + "data": { + "version": "3.0.5", + "packageName": "@csstools/css-parser-algorithms", + "hash": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==" + } + }, + "npm:@csstools/css-syntax-patches-for-csstree": { + "type": "npm", + "name": "npm:@csstools/css-syntax-patches-for-csstree", + "data": { + "version": "1.0.14", + "packageName": "@csstools/css-syntax-patches-for-csstree", + "hash": "sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==" + } + }, + "npm:@csstools/css-tokenizer": { + "type": "npm", + "name": "npm:@csstools/css-tokenizer", + "data": { + "version": "3.0.4", + "packageName": "@csstools/css-tokenizer", + "hash": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" + } + }, + "npm:@emnapi/core": { + "type": "npm", + "name": "npm:@emnapi/core", + "data": { + "version": "1.6.0", + "packageName": "@emnapi/core", + "hash": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==" + } + }, + "npm:@emnapi/runtime": { + "type": "npm", + "name": "npm:@emnapi/runtime", + "data": { + "version": "1.6.0", + "packageName": "@emnapi/runtime", + "hash": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==" + } + }, + "npm:@emnapi/wasi-threads": { + "type": "npm", + "name": "npm:@emnapi/wasi-threads", + "data": { + "version": "1.1.0", + "packageName": "@emnapi/wasi-threads", + "hash": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==" + } + }, + "npm:@esbuild/aix-ppc64": { + "type": "npm", + "name": "npm:@esbuild/aix-ppc64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/aix-ppc64", + "hash": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==" + } + }, + "npm:@esbuild/android-arm64": { + "type": "npm", + "name": "npm:@esbuild/android-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/android-arm64", + "hash": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==" + } + }, + "npm:@esbuild/android-arm": { + "type": "npm", + "name": "npm:@esbuild/android-arm", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/android-arm", + "hash": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==" + } + }, + "npm:@esbuild/android-x64": { + "type": "npm", + "name": "npm:@esbuild/android-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/android-x64", + "hash": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==" + } + }, + "npm:@esbuild/darwin-arm64": { + "type": "npm", + "name": "npm:@esbuild/darwin-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/darwin-arm64", + "hash": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==" + } + }, + "npm:@esbuild/darwin-x64": { + "type": "npm", + "name": "npm:@esbuild/darwin-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/darwin-x64", + "hash": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==" + } + }, + "npm:@esbuild/freebsd-arm64": { + "type": "npm", + "name": "npm:@esbuild/freebsd-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/freebsd-arm64", + "hash": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==" + } + }, + "npm:@esbuild/freebsd-x64": { + "type": "npm", + "name": "npm:@esbuild/freebsd-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/freebsd-x64", + "hash": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==" + } + }, + "npm:@esbuild/linux-arm64": { + "type": "npm", + "name": "npm:@esbuild/linux-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-arm64", + "hash": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==" + } + }, + "npm:@esbuild/linux-arm": { + "type": "npm", + "name": "npm:@esbuild/linux-arm", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-arm", + "hash": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==" + } + }, + "npm:@esbuild/linux-ia32": { + "type": "npm", + "name": "npm:@esbuild/linux-ia32", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-ia32", + "hash": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==" + } + }, + "npm:@esbuild/linux-loong64": { + "type": "npm", + "name": "npm:@esbuild/linux-loong64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-loong64", + "hash": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==" + } + }, + "npm:@esbuild/linux-mips64el": { + "type": "npm", + "name": "npm:@esbuild/linux-mips64el", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-mips64el", + "hash": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==" + } + }, + "npm:@esbuild/linux-ppc64": { + "type": "npm", + "name": "npm:@esbuild/linux-ppc64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-ppc64", + "hash": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==" + } + }, + "npm:@esbuild/linux-riscv64": { + "type": "npm", + "name": "npm:@esbuild/linux-riscv64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-riscv64", + "hash": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==" + } + }, + "npm:@esbuild/linux-s390x": { + "type": "npm", + "name": "npm:@esbuild/linux-s390x", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-s390x", + "hash": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==" + } + }, + "npm:@esbuild/linux-x64": { + "type": "npm", + "name": "npm:@esbuild/linux-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-x64", + "hash": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==" + } + }, + "npm:@esbuild/netbsd-arm64": { + "type": "npm", + "name": "npm:@esbuild/netbsd-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/netbsd-arm64", + "hash": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==" + } + }, + "npm:@esbuild/netbsd-x64": { + "type": "npm", + "name": "npm:@esbuild/netbsd-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/netbsd-x64", + "hash": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==" + } + }, + "npm:@esbuild/openbsd-arm64": { + "type": "npm", + "name": "npm:@esbuild/openbsd-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/openbsd-arm64", + "hash": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==" + } + }, + "npm:@esbuild/openbsd-x64": { + "type": "npm", + "name": "npm:@esbuild/openbsd-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/openbsd-x64", + "hash": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==" + } + }, + "npm:@esbuild/openharmony-arm64": { + "type": "npm", + "name": "npm:@esbuild/openharmony-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/openharmony-arm64", + "hash": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==" + } + }, + "npm:@esbuild/sunos-x64": { + "type": "npm", + "name": "npm:@esbuild/sunos-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/sunos-x64", + "hash": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==" + } + }, + "npm:@esbuild/win32-arm64": { + "type": "npm", + "name": "npm:@esbuild/win32-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/win32-arm64", + "hash": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==" + } + }, + "npm:@esbuild/win32-ia32": { + "type": "npm", + "name": "npm:@esbuild/win32-ia32", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/win32-ia32", + "hash": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==" + } + }, + "npm:@esbuild/win32-x64": { + "type": "npm", + "name": "npm:@esbuild/win32-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/win32-x64", + "hash": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==" + } + }, + "npm:@eslint-community/eslint-utils": { + "type": "npm", + "name": "npm:@eslint-community/eslint-utils", + "data": { + "version": "4.9.0", + "packageName": "@eslint-community/eslint-utils", + "hash": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==" + } + }, + "npm:@eslint-community/regexpp": { + "type": "npm", + "name": "npm:@eslint-community/regexpp", + "data": { + "version": "4.12.2", + "packageName": "@eslint-community/regexpp", + "hash": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==" + } + }, + "npm:@eslint-react/ast": { + "type": "npm", + "name": "npm:@eslint-react/ast", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/ast", + "hash": "sha512-/RiruPxlQs6CMLJ8tiNT1jV8Zq4u80MTWYkNFz2PP9pht23bdcpngDKFoz8RQYDPt71dwiRURHiQAF75v8bIIw==" + } + }, + "npm:@eslint-react/core": { + "type": "npm", + "name": "npm:@eslint-react/core", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/core", + "hash": "sha512-pIkrGuQWyW/GgrAp0kC7nv/Jn53Xjs1/rbBqUcUYvEZnVKuUifnlXQtnmioOEj9PYsuWuOxAPijExrnNavm73w==" + } + }, + "npm:@eslint-react/eff": { + "type": "npm", + "name": "npm:@eslint-react/eff", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/eff", + "hash": "sha512-pkRWIPnH/jedRn5ZMEA0nDPn5BFuUHKOORbR+hfrAMFp4c3o+1/P1G/eB0vSQvAHAZdPwLZXdgxydz+2rbb8nQ==" + } + }, + "npm:@eslint-react/eslint-plugin": { + "type": "npm", + "name": "npm:@eslint-react/eslint-plugin", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/eslint-plugin", + "hash": "sha512-wKeXNa0vc8ACmvBoZPnRZ+s/z0KEmMKRxpOfRthcBvd0TPMIprohT/uwBXd8k15/j3CmaYe74pJFVVagJY3U3g==" + } + }, + "npm:@eslint-react/shared": { + "type": "npm", + "name": "npm:@eslint-react/shared", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/shared", + "hash": "sha512-LVtD76ycDC7D4OFKDQ8jyATTVxz986J+e9nzydyEUtEf1l+WYiOivPBeJUAs6JEySBl24nO76oEHDABw6l4hig==" + } + }, + "npm:@eslint-react/var": { + "type": "npm", + "name": "npm:@eslint-react/var", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/var", + "hash": "sha512-Bc36K8Lw6KV/5NMaEaFS7as4kgSgZ1wElFejgUEBPZnhUVmq2mITV1BsnMoMYM4jojnkMN80WNALyhONjOx9Jw==" + } + }, + "npm:@eslint/config-array": { + "type": "npm", + "name": "npm:@eslint/config-array", + "data": { + "version": "0.21.1", + "packageName": "@eslint/config-array", + "hash": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==" + } + }, + "npm:@eslint/config-helpers": { + "type": "npm", + "name": "npm:@eslint/config-helpers", + "data": { + "version": "0.4.2", + "packageName": "@eslint/config-helpers", + "hash": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==" + } + }, + "npm:@eslint/core": { + "type": "npm", + "name": "npm:@eslint/core", + "data": { + "version": "0.17.0", + "packageName": "@eslint/core", + "hash": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==" + } + }, + "npm:@eslint/eslintrc": { + "type": "npm", + "name": "npm:@eslint/eslintrc", + "data": { + "version": "3.3.1", + "packageName": "@eslint/eslintrc", + "hash": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==" + } + }, + "npm:@eslint/js": { + "type": "npm", + "name": "npm:@eslint/js", + "data": { + "version": "9.39.1", + "packageName": "@eslint/js", + "hash": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==" + } + }, + "npm:@eslint/object-schema": { + "type": "npm", + "name": "npm:@eslint/object-schema", + "data": { + "version": "2.1.7", + "packageName": "@eslint/object-schema", + "hash": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==" + } + }, + "npm:@eslint/plugin-kit": { + "type": "npm", + "name": "npm:@eslint/plugin-kit", + "data": { + "version": "0.4.1", + "packageName": "@eslint/plugin-kit", + "hash": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==" + } + }, + "npm:@faker-js/faker": { + "type": "npm", + "name": "npm:@faker-js/faker", + "data": { + "version": "10.1.0", + "packageName": "@faker-js/faker", + "hash": "sha512-C3mrr3b5dRVlKPJdfrAXS8+dq+rq8Qm5SNRazca0JKgw1HQERFmrVb0towvMmw5uu8hHKNiQasMaR/tydf3Zsg==" + } + }, + "npm:@gerrit0/mini-shiki": { + "type": "npm", + "name": "npm:@gerrit0/mini-shiki", + "data": { + "version": "3.15.0", + "packageName": "@gerrit0/mini-shiki", + "hash": "sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ==" + } + }, + "npm:@google/genai": { + "type": "npm", + "name": "npm:@google/genai", + "data": { + "version": "1.30.0", + "packageName": "@google/genai", + "hash": "sha512-3MRcgczBFbUat1wIlZoLJ0vCCfXgm7Qxjh59cZi2X08RgWLtm9hKOspzp7TOg1TV2e26/MLxR2GR5yD5GmBV2w==" + } + }, + "npm:@humanfs/core": { + "type": "npm", + "name": "npm:@humanfs/core", + "data": { + "version": "0.19.1", + "packageName": "@humanfs/core", + "hash": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==" + } + }, + "npm:@humanfs/node": { + "type": "npm", + "name": "npm:@humanfs/node", + "data": { + "version": "0.16.7", + "packageName": "@humanfs/node", + "hash": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==" + } + }, + "npm:@humanwhocodes/module-importer": { + "type": "npm", + "name": "npm:@humanwhocodes/module-importer", + "data": { + "version": "1.0.1", + "packageName": "@humanwhocodes/module-importer", + "hash": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + } + }, + "npm:@humanwhocodes/retry": { + "type": "npm", + "name": "npm:@humanwhocodes/retry", + "data": { + "version": "0.4.3", + "packageName": "@humanwhocodes/retry", + "hash": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==" + } + }, + "npm:@inquirer/external-editor": { + "type": "npm", + "name": "npm:@inquirer/external-editor", + "data": { + "version": "1.0.3", + "packageName": "@inquirer/external-editor", + "hash": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==" + } + }, + "npm:@ioredis/commands": { + "type": "npm", + "name": "npm:@ioredis/commands", + "data": { + "version": "1.4.0", + "packageName": "@ioredis/commands", + "hash": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==" + } + }, + "npm:@isaacs/cliui": { + "type": "npm", + "name": "npm:@isaacs/cliui", + "data": { + "version": "8.0.2", + "packageName": "@isaacs/cliui", + "hash": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==" + } + }, + "npm:@isaacs/fs-minipass": { + "type": "npm", + "name": "npm:@isaacs/fs-minipass", + "data": { + "version": "4.0.1", + "packageName": "@isaacs/fs-minipass", + "hash": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==" + } + }, + "npm:@jest/diff-sequences": { + "type": "npm", + "name": "npm:@jest/diff-sequences", + "data": { + "version": "30.0.1", + "packageName": "@jest/diff-sequences", + "hash": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==" + } + }, + "npm:@jest/get-type": { + "type": "npm", + "name": "npm:@jest/get-type", + "data": { + "version": "30.1.0", + "packageName": "@jest/get-type", + "hash": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==" + } + }, + "npm:@jest/schemas": { + "type": "npm", + "name": "npm:@jest/schemas", + "data": { + "version": "30.0.5", + "packageName": "@jest/schemas", + "hash": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==" + } + }, + "npm:@jridgewell/gen-mapping": { + "type": "npm", + "name": "npm:@jridgewell/gen-mapping", + "data": { + "version": "0.3.13", + "packageName": "@jridgewell/gen-mapping", + "hash": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==" + } + }, + "npm:@jridgewell/remapping": { + "type": "npm", + "name": "npm:@jridgewell/remapping", + "data": { + "version": "2.3.5", + "packageName": "@jridgewell/remapping", + "hash": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==" + } + }, + "npm:@jridgewell/resolve-uri": { + "type": "npm", + "name": "npm:@jridgewell/resolve-uri", + "data": { + "version": "3.1.2", + "packageName": "@jridgewell/resolve-uri", + "hash": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + } + }, + "npm:@jridgewell/source-map": { + "type": "npm", + "name": "npm:@jridgewell/source-map", + "data": { + "version": "0.3.11", + "packageName": "@jridgewell/source-map", + "hash": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==" + } + }, + "npm:@jridgewell/sourcemap-codec": { + "type": "npm", + "name": "npm:@jridgewell/sourcemap-codec", + "data": { + "version": "1.5.5", + "packageName": "@jridgewell/sourcemap-codec", + "hash": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + } + }, + "npm:@jridgewell/trace-mapping": { + "type": "npm", + "name": "npm:@jridgewell/trace-mapping", + "data": { + "version": "0.3.31", + "packageName": "@jridgewell/trace-mapping", + "hash": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==" + } + }, + "npm:@kwsites/file-exists": { + "type": "npm", + "name": "npm:@kwsites/file-exists", + "data": { + "version": "1.1.1", + "packageName": "@kwsites/file-exists", + "hash": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==" + } + }, + "npm:@kwsites/promise-deferred": { + "type": "npm", + "name": "npm:@kwsites/promise-deferred", + "data": { + "version": "1.1.1", + "packageName": "@kwsites/promise-deferred", + "hash": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + } + }, + "npm:@manypkg/find-root": { + "type": "npm", + "name": "npm:@manypkg/find-root", + "data": { + "version": "1.1.0", + "packageName": "@manypkg/find-root", + "hash": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==" + } + }, + "npm:@manypkg/get-packages": { + "type": "npm", + "name": "npm:@manypkg/get-packages", + "data": { + "version": "1.1.3", + "packageName": "@manypkg/get-packages", + "hash": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==" + } + }, + "npm:@mapbox/node-pre-gyp": { + "type": "npm", + "name": "npm:@mapbox/node-pre-gyp", + "data": { + "version": "2.0.0", + "packageName": "@mapbox/node-pre-gyp", + "hash": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==" + } + }, + "npm:@microsoft/api-extractor-model": { + "type": "npm", + "name": "npm:@microsoft/api-extractor-model", + "data": { + "version": "7.29.6", + "packageName": "@microsoft/api-extractor-model", + "hash": "sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==" + } + }, + "npm:@microsoft/api-extractor": { + "type": "npm", + "name": "npm:@microsoft/api-extractor", + "data": { + "version": "7.47.7", + "packageName": "@microsoft/api-extractor", + "hash": "sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==" + } + }, + "npm:@microsoft/tsdoc-config": { + "type": "npm", + "name": "npm:@microsoft/tsdoc-config", + "data": { + "version": "0.17.1", + "packageName": "@microsoft/tsdoc-config", + "hash": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==" + } + }, + "npm:@microsoft/tsdoc": { + "type": "npm", + "name": "npm:@microsoft/tsdoc", + "data": { + "version": "0.15.1", + "packageName": "@microsoft/tsdoc", + "hash": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==" + } + }, + "npm:@napi-rs/wasm-runtime@0.2.12": { + "type": "npm", + "name": "npm:@napi-rs/wasm-runtime@0.2.12", + "data": { + "version": "0.2.12", + "packageName": "@napi-rs/wasm-runtime", + "hash": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==" + } + }, + "npm:@napi-rs/wasm-runtime@0.2.4": { + "type": "npm", + "name": "npm:@napi-rs/wasm-runtime@0.2.4", + "data": { + "version": "0.2.4", + "packageName": "@napi-rs/wasm-runtime", + "hash": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==" + } + }, + "npm:@napi-rs/wasm-runtime@1.0.7": { + "type": "npm", + "name": "npm:@napi-rs/wasm-runtime@1.0.7", + "data": { + "version": "1.0.7", + "packageName": "@napi-rs/wasm-runtime", + "hash": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==" + } + }, + "npm:@nodelib/fs.scandir": { + "type": "npm", + "name": "npm:@nodelib/fs.scandir", + "data": { + "version": "2.1.5", + "packageName": "@nodelib/fs.scandir", + "hash": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + } + }, + "npm:@nodelib/fs.stat": { + "type": "npm", + "name": "npm:@nodelib/fs.stat", + "data": { + "version": "2.0.5", + "packageName": "@nodelib/fs.stat", + "hash": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + } + }, + "npm:@nodelib/fs.walk": { + "type": "npm", + "name": "npm:@nodelib/fs.walk", + "data": { + "version": "1.2.8", + "packageName": "@nodelib/fs.walk", + "hash": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + } + }, + "npm:@nx/nx-darwin-arm64": { + "type": "npm", + "name": "npm:@nx/nx-darwin-arm64", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-darwin-arm64", + "hash": "sha512-xT6U9oRjze9QTLp8ieoNOno6GHA5S2R36tzergMfTevCTnpJBE0GX8vtI6fmcK3NkVmbdPI9Vb/FmBPcvD9eEQ==" + } + }, + "npm:@nx/nx-darwin-x64": { + "type": "npm", + "name": "npm:@nx/nx-darwin-x64", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-darwin-x64", + "hash": "sha512-20n1KPgPNV4gym3rzs/vgDJb0ybNIHuVYU+5m6/+ee5jZNApa5Ivi5Kqpm1RKLiKYgcm97ZbWbGi/K0CXqt1dw==" + } + }, + "npm:@nx/nx-freebsd-x64": { + "type": "npm", + "name": "npm:@nx/nx-freebsd-x64", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-freebsd-x64", + "hash": "sha512-Z1AMFUuT1MAay09s0MWSRBdb9fY0DVwOm2TnvLRc1zJ2eMVnbK+Z2NMMOMM10udyogLbxGUHefbl+HtAAcJdxQ==" + } + }, + "npm:@nx/nx-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@nx/nx-linux-arm-gnueabihf", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-arm-gnueabihf", + "hash": "sha512-bR82Id9frpz4GbxXXMsiXAQZ6tI7d3Veifyqj6th/9A3/UyZR4YKYpGm2QEsm0hp4n3BO8K5JxCxhGDgp5YwVg==" + } + }, + "npm:@nx/nx-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@nx/nx-linux-arm64-gnu", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-arm64-gnu", + "hash": "sha512-K6l/qa1rUM1saFlcT/KnJfhRtLyPkpYCxWGNYaMQ3gEFozPCHYdAJUQ+sKS8kVyWt2anAWx2XkmXUaz04OB8BQ==" + } + }, + "npm:@nx/nx-linux-arm64-musl": { + "type": "npm", + "name": "npm:@nx/nx-linux-arm64-musl", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-arm64-musl", + "hash": "sha512-vZUAUsaop5fdcyWpYzED+hWTKOuDtwG9DNNYUlII0dZhSA8kZwmXoYmrCGeMe5nQX9tF4pNzF+oddC/E169Z6g==" + } + }, + "npm:@nx/nx-linux-x64-gnu": { + "type": "npm", + "name": "npm:@nx/nx-linux-x64-gnu", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-x64-gnu", + "hash": "sha512-+NiA5uNh1cdpk2k984NlfIxRXaO0Bu0S4qCvWWKmL/150f31qJ/eHN6rd78/Re2qKO1NDoyDZLW6jqRXIm/GgA==" + } + }, + "npm:@nx/nx-linux-x64-musl": { + "type": "npm", + "name": "npm:@nx/nx-linux-x64-musl", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-x64-musl", + "hash": "sha512-8O7dXems/Of/biCKeuGMh3nmbS2PNvaL8R4xQzaBl94XitzFMxVFjjoTST7y3Ksmsa5Wrbzwyh+kHOMoIMlVpA==" + } + }, + "npm:@nx/nx-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@nx/nx-win32-arm64-msvc", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-win32-arm64-msvc", + "hash": "sha512-/Wt3kdj5BksswSWL4N8tef6B+d5r0LbdEPqZimx3AqDMC9H1YkVuwwdBWFGOh+ldj/N8adRuZKjEMQfa/oqPGg==" + } + }, + "npm:@nx/nx-win32-x64-msvc": { + "type": "npm", + "name": "npm:@nx/nx-win32-x64-msvc", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-win32-x64-msvc", + "hash": "sha512-vihs1hIVMyQYoKul5rfwvU+4WKhbajJ8lSUTVvxjV2j+8F0BYMvRQtB2jDZfBpjEpSBmgP4ApIsLkQzQQBzLug==" + } + }, + "npm:@oozcitak/dom": { + "type": "npm", + "name": "npm:@oozcitak/dom", + "data": { + "version": "2.0.2", + "packageName": "@oozcitak/dom", + "hash": "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==" + } + }, + "npm:@oozcitak/infra": { + "type": "npm", + "name": "npm:@oozcitak/infra", + "data": { + "version": "2.0.2", + "packageName": "@oozcitak/infra", + "hash": "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==" + } + }, + "npm:@oozcitak/url": { + "type": "npm", + "name": "npm:@oozcitak/url", + "data": { + "version": "3.0.0", + "packageName": "@oozcitak/url", + "hash": "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==" + } + }, + "npm:@oozcitak/util": { + "type": "npm", + "name": "npm:@oozcitak/util", + "data": { + "version": "10.0.0", + "packageName": "@oozcitak/util", + "hash": "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==" + } + }, + "npm:@oxc-project/types": { + "type": "npm", + "name": "npm:@oxc-project/types", + "data": { + "version": "0.98.0", + "packageName": "@oxc-project/types", + "hash": "sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==" + } + }, + "npm:@oxc-resolver/binding-android-arm-eabi": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-android-arm-eabi", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-android-arm-eabi", + "hash": "sha512-jB47iZ/thvhE+USCLv+XY3IknBbkKr/p7OBsQDTHode/GPw+OHRlit3NQ1bjt1Mj8V2CS7iHdSDYobZ1/0gagQ==" + } + }, + "npm:@oxc-resolver/binding-android-arm64": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-android-arm64", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-android-arm64", + "hash": "sha512-XFJ9t7d/Cz+dWLyqtTy3Xrekz+qqN4hmOU2iOUgr7u71OQsPUHIIeS9/wKanEK0l413gPwapIkyc5x9ltlOtyw==" + } + }, + "npm:@oxc-resolver/binding-darwin-arm64": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-darwin-arm64", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-darwin-arm64", + "hash": "sha512-gwehBS9smA1mzK8frDsmUCHz+6baJVwkKF6qViHhoqA3kRKvIZ3k6WNP4JmF19JhOiGxRcoPa8gZRfzNgXwP2A==" + } + }, + "npm:@oxc-resolver/binding-darwin-x64": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-darwin-x64", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-darwin-x64", + "hash": "sha512-5wwJvfuoahKiAqqAsMLOI28rqdh3P2K7HkjIWUXNMWAZq6ErX0L5rwJzu6T32+Zxw3k18C7R9IS4wDq/3Ar+6w==" + } + }, + "npm:@oxc-resolver/binding-freebsd-x64": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-freebsd-x64", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-freebsd-x64", + "hash": "sha512-MWTt+LOQNcQ6fa+Uu5VikkihLi1PSIrQqqp0QD44k2AORasNWl0jRGBTcMSBIgNe82qEQWYvlGzvOEEOBp01Og==" + } + }, + "npm:@oxc-resolver/binding-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-arm-gnueabihf", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-arm-gnueabihf", + "hash": "sha512-b6/IBqYrS3o0XiLVBsnex/wK8pTTK+hbGfAMOHVU6p7DBpwPPLgC/tav4IXoOIUCssTFz7aWh/xtUok0swn8VQ==" + } + }, + "npm:@oxc-resolver/binding-linux-arm-musleabihf": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-arm-musleabihf", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-arm-musleabihf", + "hash": "sha512-o2Qh5+y5YoqVK6YfzkalHdpmQ5bkbGGxuLg1pZLQ1Ift0x+Vix7DaFEpdCl5Z9xvYXogd/TwOlL0TPl4+MTFLA==" + } + }, + "npm:@oxc-resolver/binding-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-arm64-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-arm64-gnu", + "hash": "sha512-lk8mCSg0Tg4sEG73RiPjb7keGcEPwqQnBHX3Z+BR2SWe+qNHpoHcyFMNafzSvEC18vlxC04AUSoa6kJl/C5zig==" + } + }, + "npm:@oxc-resolver/binding-linux-arm64-musl": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-arm64-musl", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-arm64-musl", + "hash": "sha512-KykeIVhCM7pn93ABa0fNe8vk4XvnbfZMELne2s6P9tdJH9KMBsCFBi7a2BmSdUtTqWCAJokAcm46lpczU52Xaw==" + } + }, + "npm:@oxc-resolver/binding-linux-ppc64-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-ppc64-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-ppc64-gnu", + "hash": "sha512-QqPPWAcZU/jHAuam4f3zV8OdEkYRPD2XR0peVet3hoMMgsihR3Lhe7J/bLclmod297FG0+OgBYQVMh2nTN6oWA==" + } + }, + "npm:@oxc-resolver/binding-linux-riscv64-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-riscv64-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-riscv64-gnu", + "hash": "sha512-DunWA+wafeG3hj1NADUD3c+DRvmyVNqF5LSHVUWA2bzswqmuEZXl3VYBSzxfD0j+UnRTFYLxf27AMptoMsepYg==" + } + }, + "npm:@oxc-resolver/binding-linux-riscv64-musl": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-riscv64-musl", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-riscv64-musl", + "hash": "sha512-4SRvwKTTk2k67EQr9Ny4NGf/BhlwggCI1CXwBbA9IV4oP38DH8b+NAPxDY0ySGRsWbPkG92FYOqM4AWzG4GSgA==" + } + }, + "npm:@oxc-resolver/binding-linux-s390x-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-s390x-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-s390x-gnu", + "hash": "sha512-hZKvkbsurj4JOom//R1Ab2MlC4cGeVm5zzMt4IsS3XySQeYjyMJ5TDZ3J5rQ8bVj3xi4FpJU2yFZ72GApsHQ6A==" + } + }, + "npm:@oxc-resolver/binding-linux-x64-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-x64-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-x64-gnu", + "hash": "sha512-hABxQXFXJurivw+0amFdeEcK67cF1BGBIN1+sSHzq3TRv4RoG8n5q2JE04Le2n2Kpt6xg4Y5+lcv+rb2mCJLgQ==" + } + }, + "npm:@oxc-resolver/binding-linux-x64-musl": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-x64-musl", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-x64-musl", + "hash": "sha512-Ln73wUB5migZRvC7obAAdqVwvFvk7AUs2JLt4g9QHr8FnqivlsjpUC9Nf2ssrybdjyQzEMjttUxPZz6aKPSAHw==" + } + }, + "npm:@oxc-resolver/binding-wasm32-wasi": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-wasm32-wasi", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-wasm32-wasi", + "hash": "sha512-z+NbELmCOKNtWOqEB5qDfHXOSWB3kGQIIehq6nHtZwHLzdVO2oBq6De/ayhY3ygriC1XhgaIzzniY7jgrNl4Kw==" + } + }, + "npm:@oxc-resolver/binding-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-win32-arm64-msvc", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-win32-arm64-msvc", + "hash": "sha512-Ft0+qd7HSO61qCTLJ4LCdBGZkpKyDj1rG0OVSZL1DxWQoh97m7vEHd7zAvUtw8EcWjOMBQuX4mfRap/x2MOCpQ==" + } + }, + "npm:@oxc-resolver/binding-win32-ia32-msvc": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-win32-ia32-msvc", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-win32-ia32-msvc", + "hash": "sha512-o54jYNSfGdPxHSvXEhZg8FOV3K99mJ1f7hb1alRFb+Yec1GQXNrJXxZPIxNMYeFT13kwAWB7zuQ0HZLnDHFxfw==" + } + }, + "npm:@oxc-resolver/binding-win32-x64-msvc": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-win32-x64-msvc", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-win32-x64-msvc", + "hash": "sha512-j97icaORyM6A7GjgmUzfn7V+KGzVvctRA+eAlJb0c2OQNaETFxl6BXZdnGBDb+6oA0Y4Sr/wnekd1kQ0aVyKGg==" + } + }, + "npm:@parcel/watcher-android-arm64": { + "type": "npm", + "name": "npm:@parcel/watcher-android-arm64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-android-arm64", + "hash": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==" + } + }, + "npm:@parcel/watcher-darwin-arm64": { + "type": "npm", + "name": "npm:@parcel/watcher-darwin-arm64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-darwin-arm64", + "hash": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==" + } + }, + "npm:@parcel/watcher-darwin-x64": { + "type": "npm", + "name": "npm:@parcel/watcher-darwin-x64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-darwin-x64", + "hash": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==" + } + }, + "npm:@parcel/watcher-freebsd-x64": { + "type": "npm", + "name": "npm:@parcel/watcher-freebsd-x64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-freebsd-x64", + "hash": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==" + } + }, + "npm:@parcel/watcher-linux-arm-glibc": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-arm-glibc", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-arm-glibc", + "hash": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==" + } + }, + "npm:@parcel/watcher-linux-arm-musl": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-arm-musl", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-arm-musl", + "hash": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==" + } + }, + "npm:@parcel/watcher-linux-arm64-glibc": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-arm64-glibc", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-arm64-glibc", + "hash": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==" + } + }, + "npm:@parcel/watcher-linux-arm64-musl": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-arm64-musl", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-arm64-musl", + "hash": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==" + } + }, + "npm:@parcel/watcher-linux-x64-glibc": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-x64-glibc", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-x64-glibc", + "hash": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==" + } + }, + "npm:@parcel/watcher-linux-x64-musl": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-x64-musl", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-x64-musl", + "hash": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==" + } + }, + "npm:@parcel/watcher-wasm": { + "type": "npm", + "name": "npm:@parcel/watcher-wasm", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-wasm", + "hash": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==" + } + }, + "npm:@parcel/watcher-win32-arm64": { + "type": "npm", + "name": "npm:@parcel/watcher-win32-arm64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-win32-arm64", + "hash": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==" + } + }, + "npm:@parcel/watcher-win32-ia32": { + "type": "npm", + "name": "npm:@parcel/watcher-win32-ia32", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-win32-ia32", + "hash": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==" + } + }, + "npm:@parcel/watcher-win32-x64": { + "type": "npm", + "name": "npm:@parcel/watcher-win32-x64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-win32-x64", + "hash": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==" + } + }, + "npm:@parcel/watcher": { + "type": "npm", + "name": "npm:@parcel/watcher", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher", + "hash": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==" + } + }, + "npm:@pkgjs/parseargs": { + "type": "npm", + "name": "npm:@pkgjs/parseargs", + "data": { + "version": "0.11.0", + "packageName": "@pkgjs/parseargs", + "hash": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" + } + }, + "npm:@poppinss/colors": { + "type": "npm", + "name": "npm:@poppinss/colors", + "data": { + "version": "4.1.5", + "packageName": "@poppinss/colors", + "hash": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==" + } + }, + "npm:@poppinss/dumper": { + "type": "npm", + "name": "npm:@poppinss/dumper", + "data": { + "version": "0.6.4", + "packageName": "@poppinss/dumper", + "hash": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==" + } + }, + "npm:@poppinss/exception": { + "type": "npm", + "name": "npm:@poppinss/exception", + "data": { + "version": "1.2.2", + "packageName": "@poppinss/exception", + "hash": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==" + } + }, + "npm:@publint/pack": { + "type": "npm", + "name": "npm:@publint/pack", + "data": { + "version": "0.1.2", + "packageName": "@publint/pack", + "hash": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==" + } + }, + "npm:@rolldown/binding-android-arm64": { + "type": "npm", + "name": "npm:@rolldown/binding-android-arm64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-android-arm64", + "hash": "sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==" + } + }, + "npm:@rolldown/binding-darwin-arm64": { + "type": "npm", + "name": "npm:@rolldown/binding-darwin-arm64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-darwin-arm64", + "hash": "sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==" + } + }, + "npm:@rolldown/binding-darwin-x64": { + "type": "npm", + "name": "npm:@rolldown/binding-darwin-x64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-darwin-x64", + "hash": "sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==" + } + }, + "npm:@rolldown/binding-freebsd-x64": { + "type": "npm", + "name": "npm:@rolldown/binding-freebsd-x64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-freebsd-x64", + "hash": "sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==" + } + }, + "npm:@rolldown/binding-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-arm-gnueabihf", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-arm-gnueabihf", + "hash": "sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==" + } + }, + "npm:@rolldown/binding-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-arm64-gnu", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-arm64-gnu", + "hash": "sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==" + } + }, + "npm:@rolldown/binding-linux-arm64-musl": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-arm64-musl", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-arm64-musl", + "hash": "sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==" + } + }, + "npm:@rolldown/binding-linux-x64-gnu": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-x64-gnu", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-x64-gnu", + "hash": "sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==" + } + }, + "npm:@rolldown/binding-linux-x64-musl": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-x64-musl", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-x64-musl", + "hash": "sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==" + } + }, + "npm:@rolldown/binding-openharmony-arm64": { + "type": "npm", + "name": "npm:@rolldown/binding-openharmony-arm64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-openharmony-arm64", + "hash": "sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==" + } + }, + "npm:@rolldown/binding-wasm32-wasi": { + "type": "npm", + "name": "npm:@rolldown/binding-wasm32-wasi", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-wasm32-wasi", + "hash": "sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==" + } + }, + "npm:@rolldown/binding-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@rolldown/binding-win32-arm64-msvc", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-win32-arm64-msvc", + "hash": "sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==" + } + }, + "npm:@rolldown/binding-win32-ia32-msvc": { + "type": "npm", + "name": "npm:@rolldown/binding-win32-ia32-msvc", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-win32-ia32-msvc", + "hash": "sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==" + } + }, + "npm:@rolldown/binding-win32-x64-msvc": { + "type": "npm", + "name": "npm:@rolldown/binding-win32-x64-msvc", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-win32-x64-msvc", + "hash": "sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==" + } + }, + "npm:@rolldown/pluginutils@1.0.0-beta.40": { + "type": "npm", + "name": "npm:@rolldown/pluginutils@1.0.0-beta.40", + "data": { + "version": "1.0.0-beta.40", + "packageName": "@rolldown/pluginutils", + "hash": "sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==" + } + }, + "npm:@rolldown/pluginutils@1.0.0-beta.47": { + "type": "npm", + "name": "npm:@rolldown/pluginutils@1.0.0-beta.47", + "data": { + "version": "1.0.0-beta.47", + "packageName": "@rolldown/pluginutils", + "hash": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==" + } + }, + "npm:@rolldown/pluginutils@1.0.0-beta.51": { + "type": "npm", + "name": "npm:@rolldown/pluginutils@1.0.0-beta.51", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/pluginutils", + "hash": "sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==" + } + }, + "npm:@rollup/plugin-alias": { + "type": "npm", + "name": "npm:@rollup/plugin-alias", + "data": { + "version": "5.1.1", + "packageName": "@rollup/plugin-alias", + "hash": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==" + } + }, + "npm:@rollup/plugin-commonjs": { + "type": "npm", + "name": "npm:@rollup/plugin-commonjs", + "data": { + "version": "28.0.9", + "packageName": "@rollup/plugin-commonjs", + "hash": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==" + } + }, + "npm:@rollup/plugin-inject": { + "type": "npm", + "name": "npm:@rollup/plugin-inject", + "data": { + "version": "5.0.5", + "packageName": "@rollup/plugin-inject", + "hash": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==" + } + }, + "npm:@rollup/plugin-json": { + "type": "npm", + "name": "npm:@rollup/plugin-json", + "data": { + "version": "6.1.0", + "packageName": "@rollup/plugin-json", + "hash": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==" + } + }, + "npm:@rollup/plugin-node-resolve": { + "type": "npm", + "name": "npm:@rollup/plugin-node-resolve", + "data": { + "version": "16.0.3", + "packageName": "@rollup/plugin-node-resolve", + "hash": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==" + } + }, + "npm:@rollup/plugin-replace": { + "type": "npm", + "name": "npm:@rollup/plugin-replace", + "data": { + "version": "6.0.3", + "packageName": "@rollup/plugin-replace", + "hash": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==" + } + }, + "npm:@rollup/plugin-terser": { + "type": "npm", + "name": "npm:@rollup/plugin-terser", + "data": { + "version": "0.4.4", + "packageName": "@rollup/plugin-terser", + "hash": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==" + } + }, + "npm:@rollup/pluginutils": { + "type": "npm", + "name": "npm:@rollup/pluginutils", + "data": { + "version": "5.3.0", + "packageName": "@rollup/pluginutils", + "hash": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==" + } + }, + "npm:@rollup/rollup-android-arm-eabi": { + "type": "npm", + "name": "npm:@rollup/rollup-android-arm-eabi", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-android-arm-eabi", + "hash": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==" + } + }, + "npm:@rollup/rollup-android-arm64": { + "type": "npm", + "name": "npm:@rollup/rollup-android-arm64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-android-arm64", + "hash": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==" + } + }, + "npm:@rollup/rollup-darwin-arm64": { + "type": "npm", + "name": "npm:@rollup/rollup-darwin-arm64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-darwin-arm64", + "hash": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==" + } + }, + "npm:@rollup/rollup-darwin-x64": { + "type": "npm", + "name": "npm:@rollup/rollup-darwin-x64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-darwin-x64", + "hash": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==" + } + }, + "npm:@rollup/rollup-freebsd-arm64": { + "type": "npm", + "name": "npm:@rollup/rollup-freebsd-arm64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-freebsd-arm64", + "hash": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==" + } + }, + "npm:@rollup/rollup-freebsd-x64": { + "type": "npm", + "name": "npm:@rollup/rollup-freebsd-x64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-freebsd-x64", + "hash": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==" + } + }, + "npm:@rollup/rollup-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-arm-gnueabihf", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-arm-gnueabihf", + "hash": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==" + } + }, + "npm:@rollup/rollup-linux-arm-musleabihf": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-arm-musleabihf", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-arm-musleabihf", + "hash": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==" + } + }, + "npm:@rollup/rollup-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-arm64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-arm64-gnu", + "hash": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==" + } + }, + "npm:@rollup/rollup-linux-arm64-musl": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-arm64-musl", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-arm64-musl", + "hash": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==" + } + }, + "npm:@rollup/rollup-linux-loong64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-loong64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-loong64-gnu", + "hash": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==" + } + }, + "npm:@rollup/rollup-linux-ppc64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-ppc64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-ppc64-gnu", + "hash": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==" + } + }, + "npm:@rollup/rollup-linux-riscv64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-riscv64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-riscv64-gnu", + "hash": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==" + } + }, + "npm:@rollup/rollup-linux-riscv64-musl": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-riscv64-musl", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-riscv64-musl", + "hash": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==" + } + }, + "npm:@rollup/rollup-linux-s390x-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-s390x-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-s390x-gnu", + "hash": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==" + } + }, + "npm:@rollup/rollup-linux-x64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-x64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-x64-gnu", + "hash": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==" + } + }, + "npm:@rollup/rollup-linux-x64-musl": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-x64-musl", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-x64-musl", + "hash": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==" + } + }, + "npm:@rollup/rollup-openharmony-arm64": { + "type": "npm", + "name": "npm:@rollup/rollup-openharmony-arm64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-openharmony-arm64", + "hash": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==" + } + }, + "npm:@rollup/rollup-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@rollup/rollup-win32-arm64-msvc", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-win32-arm64-msvc", + "hash": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==" + } + }, + "npm:@rollup/rollup-win32-ia32-msvc": { + "type": "npm", + "name": "npm:@rollup/rollup-win32-ia32-msvc", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-win32-ia32-msvc", + "hash": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==" + } + }, + "npm:@rollup/rollup-win32-x64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-win32-x64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-win32-x64-gnu", + "hash": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==" + } + }, + "npm:@rollup/rollup-win32-x64-msvc": { + "type": "npm", + "name": "npm:@rollup/rollup-win32-x64-msvc", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-win32-x64-msvc", + "hash": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==" + } + }, + "npm:@rushstack/node-core-library": { + "type": "npm", + "name": "npm:@rushstack/node-core-library", + "data": { + "version": "5.7.0", + "packageName": "@rushstack/node-core-library", + "hash": "sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==" + } + }, + "npm:@rushstack/rig-package": { + "type": "npm", + "name": "npm:@rushstack/rig-package", + "data": { + "version": "0.5.3", + "packageName": "@rushstack/rig-package", + "hash": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==" + } + }, + "npm:@rushstack/terminal": { + "type": "npm", + "name": "npm:@rushstack/terminal", + "data": { + "version": "0.14.0", + "packageName": "@rushstack/terminal", + "hash": "sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==" + } + }, + "npm:@rushstack/ts-command-line": { + "type": "npm", + "name": "npm:@rushstack/ts-command-line", + "data": { + "version": "4.22.6", + "packageName": "@rushstack/ts-command-line", + "hash": "sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==" + } + }, + "npm:@shikijs/engine-oniguruma": { + "type": "npm", + "name": "npm:@shikijs/engine-oniguruma", + "data": { + "version": "3.15.0", + "packageName": "@shikijs/engine-oniguruma", + "hash": "sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==" + } + }, + "npm:@shikijs/langs": { + "type": "npm", + "name": "npm:@shikijs/langs", + "data": { + "version": "3.15.0", + "packageName": "@shikijs/langs", + "hash": "sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==" + } + }, + "npm:@shikijs/themes": { + "type": "npm", + "name": "npm:@shikijs/themes", + "data": { + "version": "3.15.0", + "packageName": "@shikijs/themes", + "hash": "sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==" + } + }, + "npm:@shikijs/types": { + "type": "npm", + "name": "npm:@shikijs/types", + "data": { + "version": "3.15.0", + "packageName": "@shikijs/types", + "hash": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==" + } + }, + "npm:@shikijs/vscode-textmate": { + "type": "npm", + "name": "npm:@shikijs/vscode-textmate", + "data": { + "version": "10.0.2", + "packageName": "@shikijs/vscode-textmate", + "hash": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" + } + }, + "npm:@sinclair/typebox": { + "type": "npm", + "name": "npm:@sinclair/typebox", + "data": { + "version": "0.34.41", + "packageName": "@sinclair/typebox", + "hash": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==" + } + }, + "npm:@sindresorhus/is": { + "type": "npm", + "name": "npm:@sindresorhus/is", + "data": { + "version": "7.1.1", + "packageName": "@sindresorhus/is", + "hash": "sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==" + } + }, + "npm:@sindresorhus/merge-streams": { + "type": "npm", + "name": "npm:@sindresorhus/merge-streams", + "data": { + "version": "4.0.0", + "packageName": "@sindresorhus/merge-streams", + "hash": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==" + } + }, + "npm:@size-limit/esbuild": { + "type": "npm", + "name": "npm:@size-limit/esbuild", + "data": { + "version": "11.2.0", + "packageName": "@size-limit/esbuild", + "hash": "sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==" + } + }, + "npm:@size-limit/file": { + "type": "npm", + "name": "npm:@size-limit/file", + "data": { + "version": "11.2.0", + "packageName": "@size-limit/file", + "hash": "sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==" + } + }, + "npm:@size-limit/preset-small-lib": { + "type": "npm", + "name": "npm:@size-limit/preset-small-lib", + "data": { + "version": "11.2.0", + "packageName": "@size-limit/preset-small-lib", + "hash": "sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==" + } + }, + "npm:@solid-primitives/event-listener": { + "type": "npm", + "name": "npm:@solid-primitives/event-listener", + "data": { + "version": "2.4.3", + "packageName": "@solid-primitives/event-listener", + "hash": "sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==" + } + }, + "npm:@solid-primitives/keyboard": { + "type": "npm", + "name": "npm:@solid-primitives/keyboard", + "data": { + "version": "1.3.3", + "packageName": "@solid-primitives/keyboard", + "hash": "sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==" + } + }, + "npm:@solid-primitives/resize-observer": { + "type": "npm", + "name": "npm:@solid-primitives/resize-observer", + "data": { + "version": "2.1.3", + "packageName": "@solid-primitives/resize-observer", + "hash": "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==" + } + }, + "npm:@solid-primitives/rootless": { + "type": "npm", + "name": "npm:@solid-primitives/rootless", + "data": { + "version": "1.5.2", + "packageName": "@solid-primitives/rootless", + "hash": "sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==" + } + }, + "npm:@solid-primitives/static-store": { + "type": "npm", + "name": "npm:@solid-primitives/static-store", + "data": { + "version": "0.1.2", + "packageName": "@solid-primitives/static-store", + "hash": "sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==" + } + }, + "npm:@solid-primitives/utils": { + "type": "npm", + "name": "npm:@solid-primitives/utils", + "data": { + "version": "6.3.2", + "packageName": "@solid-primitives/utils", + "hash": "sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==" + } + }, + "npm:@speed-highlight/core": { + "type": "npm", + "name": "npm:@speed-highlight/core", + "data": { + "version": "1.2.8", + "packageName": "@speed-highlight/core", + "hash": "sha512-IGytNtnUnPIobIbOq5Y6LIlqiHNX+vnToQIS7lj6L5819C+rA8TXRDkkG8vePsiBOGcoW9R6i+dp2YBUKdB09Q==" + } + }, + "npm:@standard-schema/spec": { + "type": "npm", + "name": "npm:@standard-schema/spec", + "data": { + "version": "1.0.0", + "packageName": "@standard-schema/spec", + "hash": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==" + } + }, + "npm:@stylistic/eslint-plugin": { + "type": "npm", + "name": "npm:@stylistic/eslint-plugin", + "data": { + "version": "5.5.0", + "packageName": "@stylistic/eslint-plugin", + "hash": "sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==" + } + }, + "npm:@sveltejs/acorn-typescript": { + "type": "npm", + "name": "npm:@sveltejs/acorn-typescript", + "data": { + "version": "1.0.7", + "packageName": "@sveltejs/acorn-typescript", + "hash": "sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==" + } + }, + "npm:@svitejs/changesets-changelog-github-compact": { + "type": "npm", + "name": "npm:@svitejs/changesets-changelog-github-compact", + "data": { + "version": "1.2.0", + "packageName": "@svitejs/changesets-changelog-github-compact", + "hash": "sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==" + } + }, + "npm:@tailwindcss/node": { + "type": "npm", + "name": "npm:@tailwindcss/node", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/node", + "hash": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==" + } + }, + "npm:@tailwindcss/oxide-android-arm64": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-android-arm64", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-android-arm64", + "hash": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==" + } + }, + "npm:@tailwindcss/oxide-darwin-arm64": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-darwin-arm64", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-darwin-arm64", + "hash": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==" + } + }, + "npm:@tailwindcss/oxide-darwin-x64": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-darwin-x64", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-darwin-x64", + "hash": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==" + } + }, + "npm:@tailwindcss/oxide-freebsd-x64": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-freebsd-x64", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-freebsd-x64", + "hash": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==" + } + }, + "npm:@tailwindcss/oxide-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-arm-gnueabihf", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-arm-gnueabihf", + "hash": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==" + } + }, + "npm:@tailwindcss/oxide-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-arm64-gnu", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-arm64-gnu", + "hash": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==" + } + }, + "npm:@tailwindcss/oxide-linux-arm64-musl": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-arm64-musl", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-arm64-musl", + "hash": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==" + } + }, + "npm:@tailwindcss/oxide-linux-x64-gnu": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-x64-gnu", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-x64-gnu", + "hash": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==" + } + }, + "npm:@tailwindcss/oxide-linux-x64-musl": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-x64-musl", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-x64-musl", + "hash": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==" + } + }, + "npm:@tailwindcss/oxide-wasm32-wasi": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-wasm32-wasi", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-wasm32-wasi", + "hash": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==" + } + }, + "npm:@tailwindcss/oxide-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-win32-arm64-msvc", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-win32-arm64-msvc", + "hash": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==" + } + }, + "npm:@tailwindcss/oxide-win32-x64-msvc": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-win32-x64-msvc", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-win32-x64-msvc", + "hash": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==" + } + }, + "npm:@tailwindcss/oxide": { + "type": "npm", + "name": "npm:@tailwindcss/oxide", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide", + "hash": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==" + } + }, + "npm:@tailwindcss/vite": { + "type": "npm", + "name": "npm:@tailwindcss/vite", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/vite", + "hash": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==" + } + }, + "npm:@tanstack/config": { + "type": "npm", + "name": "npm:@tanstack/config", + "data": { + "version": "0.22.1", + "packageName": "@tanstack/config", + "hash": "sha512-0m+gqjrIE6el20VpGIzT54SIjvu27lDRHr+9NiK2nYya5fm0e/19+NfKRoDekZhSBfjaGytUaSpbofzvbSw8zw==" + } + }, + "npm:@tanstack/devtools-client": { + "type": "npm", + "name": "npm:@tanstack/devtools-client", + "data": { + "version": "0.0.4", + "packageName": "@tanstack/devtools-client", + "hash": "sha512-LefnH9KE9uRDEWifc3QDcooskA8ikfs41bybDTgpYQpyTUspZnaEdUdya9Hry0KYxZ8nos0S3nNbsP79KHqr6Q==" + } + }, + "npm:@tanstack/devtools-event-bus": { + "type": "npm", + "name": "npm:@tanstack/devtools-event-bus", + "data": { + "version": "0.3.3", + "packageName": "@tanstack/devtools-event-bus", + "hash": "sha512-lWl88uLAz7ZhwNdLH6A3tBOSEuBCrvnY9Fzr5JPdzJRFdM5ZFdyNWz1Bf5l/F3GU57VodrN0KCFi9OA26H5Kpg==" + } + }, + "npm:@tanstack/devtools-event-client": { + "type": "npm", + "name": "npm:@tanstack/devtools-event-client", + "data": { + "version": "0.3.5", + "packageName": "@tanstack/devtools-event-client", + "hash": "sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==" + } + }, + "npm:@tanstack/devtools-ui": { + "type": "npm", + "name": "npm:@tanstack/devtools-ui", + "data": { + "version": "0.4.4", + "packageName": "@tanstack/devtools-ui", + "hash": "sha512-5xHXFyX3nom0UaNfiOM92o6ziaHjGo3mcSGe2HD5Xs8dWRZNpdZ0Smd0B9ddEhy0oB+gXyMzZgUJb9DmrZV0Mg==" + } + }, + "npm:@tanstack/devtools-utils": { + "type": "npm", + "name": "npm:@tanstack/devtools-utils", + "data": { + "version": "0.0.8", + "packageName": "@tanstack/devtools-utils", + "hash": "sha512-cWoohW9OswidFclwopYRsW0FR3jOoC5iMy0pUHm/31uAnlTb3ViFoZ1VqMf7vZESYdDeee8OjaICS1YbKksDxg==" + } + }, + "npm:@tanstack/devtools": { + "type": "npm", + "name": "npm:@tanstack/devtools", + "data": { + "version": "0.8.2", + "packageName": "@tanstack/devtools", + "hash": "sha512-ltVS+MpOrA37CiVunSOCcXctaDnQOJV6FPE5Y2uLq3m8b0spmHwp0edp1PRd2CMG4LnGIlRf7lYdhHa2p9CHNA==" + } + }, + "npm:@tanstack/directive-functions-plugin": { + "type": "npm", + "name": "npm:@tanstack/directive-functions-plugin", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/directive-functions-plugin", + "hash": "sha512-qLGxldnWa0pp/siZEFEYDU+eB/j40bd1V3IuTzP0sFnrYi11Ldx1yVkOruDKUbO1WM0o+OlPhp22Q1h+LMdDMA==" + } + }, + "npm:@tanstack/eslint-config": { + "type": "npm", + "name": "npm:@tanstack/eslint-config", + "data": { + "version": "0.3.3", + "packageName": "@tanstack/eslint-config", + "hash": "sha512-8VFyAaIFV9onJcfc5yVj5WWl6DmN3W4m+t0Mb+nZrQmqHy+kDndw5O5Xv2BHVWRRPTqnhlJYh6wHWGh0R81ZzQ==" + } + }, + "npm:@tanstack/history": { + "type": "npm", + "name": "npm:@tanstack/history", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/history", + "hash": "sha512-l6wcxwDBeh/7Dhles23U1O8lp9kNJmAb2yNjekR6olZwCRNAVA8TCXlVCrueELyFlYZqvQkh0ofxnzG62A1Kkg==" + } + }, + "npm:@tanstack/nitro-v2-vite-plugin": { + "type": "npm", + "name": "npm:@tanstack/nitro-v2-vite-plugin", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/nitro-v2-vite-plugin", + "hash": "sha512-TedrzuMjtHA08x47wCaU6KTrrat8gyzn8a4HUswTwjAa0sMpz4vbOOUDDZyYaJpmjKKbTjgTs6iRr4MONneKTQ==" + } + }, + "npm:@tanstack/publish-config": { + "type": "npm", + "name": "npm:@tanstack/publish-config", + "data": { + "version": "0.2.2", + "packageName": "@tanstack/publish-config", + "hash": "sha512-hTW2rLeZLBMmpwVzWmUJ5L50hPlf4Ea74rZtecbT6qQYCT16JEAbryfHm1u07KIICI2vEArsm2YguckjODqx0w==" + } + }, + "npm:@tanstack/query-core": { + "type": "npm", + "name": "npm:@tanstack/query-core", + "data": { + "version": "5.90.5", + "packageName": "@tanstack/query-core", + "hash": "sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==" + } + }, + "npm:@tanstack/react-devtools": { + "type": "npm", + "name": "npm:@tanstack/react-devtools", + "data": { + "version": "0.8.2", + "packageName": "@tanstack/react-devtools", + "hash": "sha512-D1oG2QivpAmiT4iq7PxbsajmoYmtnhwg9gEK7q9mDiVcnyPjwnhg1ujDvKIzP+ZaRTkQzpJYwtTmS9DzYp8Akg==" + } + }, + "npm:@tanstack/react-query": { + "type": "npm", + "name": "npm:@tanstack/react-query", + "data": { + "version": "5.90.5", + "packageName": "@tanstack/react-query", + "hash": "sha512-pN+8UWpxZkEJ/Rnnj2v2Sxpx1WFlaa9L6a4UO89p6tTQbeo+m0MS8oYDjbggrR8QcTyjKoYWKS3xJQGr3ExT8Q==" + } + }, + "npm:@tanstack/react-router-devtools": { + "type": "npm", + "name": "npm:@tanstack/react-router-devtools", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/react-router-devtools", + "hash": "sha512-ySuFWfR5mHtbs/le5SUb56OxCWTZskwynPp6E9qnyDgB4vX6P7OJDqdgv7rqiorYNjFmAaywraaVZGQ8WuB4+g==" + } + }, + "npm:@tanstack/react-router-ssr-query": { + "type": "npm", + "name": "npm:@tanstack/react-router-ssr-query", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/react-router-ssr-query", + "hash": "sha512-S38TJsBrA7NRxFzdCTb7uDIls1JEtRJAuSLWQrlVigmFEHY2yk2/r45aSKu0cc/ucxRRZ+0JxUo4lFInoFYt1w==" + } + }, + "npm:@tanstack/react-router": { + "type": "npm", + "name": "npm:@tanstack/react-router", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/react-router", + "hash": "sha512-5vhwIAwoxWl7oeIZRNgk5wh9TCkaAinK9qbfdKuKzwGtMHqnv1bRrfKwam3/MaMwHCmvnNfnFj0RYfnBA/ilEg==" + } + }, + "npm:@tanstack/react-start-client": { + "type": "npm", + "name": "npm:@tanstack/react-start-client", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/react-start-client", + "hash": "sha512-082eg9SvYdg4+kZFO6fhiwazoWOa8TUWLIi2Um3OLcnlBJzAf3cwsYE+Ub4siPucRX4DxzSDrY5TgH+uMYKtBQ==" + } + }, + "npm:@tanstack/react-start-server": { + "type": "npm", + "name": "npm:@tanstack/react-start-server", + "data": { + "version": "1.139.8", + "packageName": "@tanstack/react-start-server", + "hash": "sha512-7lmu6a2PDpxd1J438FmV/lxc5vRRvy34dV9NYRNvOj6fxcGfagxix1qi6NKtgmiSQQ83DNfrckHno0wlOJJLOg==" + } + }, + "npm:@tanstack/react-start": { + "type": "npm", + "name": "npm:@tanstack/react-start", + "data": { + "version": "1.139.8", + "packageName": "@tanstack/react-start", + "hash": "sha512-vNSd1w+NCDAmTzkiPC6klnwVZBH8EjXg+c5sf7+PPUYXMZMb7kYCRiH8xKjCBRQkubgQeA8bnVsbRWqC21hQHw==" + } + }, + "npm:@tanstack/react-store": { + "type": "npm", + "name": "npm:@tanstack/react-store", + "data": { + "version": "0.8.0", + "packageName": "@tanstack/react-store", + "hash": "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==" + } + }, + "npm:@tanstack/router-core": { + "type": "npm", + "name": "npm:@tanstack/router-core", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-core", + "hash": "sha512-mqgsJi4/B2Jo6PXRUs1AsWA+06nqiqVZe1aXioA3vR6PesNeKUSXWfmIoYF6wOx3osiV0BnwB1JCBrInCOQSWA==" + } + }, + "npm:@tanstack/router-devtools-core": { + "type": "npm", + "name": "npm:@tanstack/router-devtools-core", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-devtools-core", + "hash": "sha512-Tx6+rCyjthlH7KS9Jz6YdT2KQ6rZQ66F+XJOj7Rel8zGAvyqx8USzcqTRvC+QjaU1jIJq+mNPWpMdKkkxPSOVA==" + } + }, + "npm:@tanstack/router-generator": { + "type": "npm", + "name": "npm:@tanstack/router-generator", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-generator", + "hash": "sha512-xnmF1poNH/dHtwFxecCcRsaLRIXVnXRZiWYUpvtyaPv4pQYayCrFQCg2ygDbCV0/8H7ctMBJh5MIL7GgPR7+xw==" + } + }, + "npm:@tanstack/router-plugin": { + "type": "npm", + "name": "npm:@tanstack/router-plugin", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-plugin", + "hash": "sha512-sgB8nOoVKr0A2lw5p7kQ3MtEA03d1t+Qvqyy+f/QkHy5pGk8Yohg64TEX+2e98plfM3j5vAOu/JhAyoLLrp1Jw==" + } + }, + "npm:@tanstack/router-ssr-query-core": { + "type": "npm", + "name": "npm:@tanstack/router-ssr-query-core", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-ssr-query-core", + "hash": "sha512-Ei4P2g/7xNO99OgvBOAAeVLI6VnqXYcSTI1Q6b1NYBzsb4aIo8Ne38cgVnanDlnIRrUJjIDQdZTAtu0AdANiyg==" + } + }, + "npm:@tanstack/router-utils": { + "type": "npm", + "name": "npm:@tanstack/router-utils", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/router-utils", + "hash": "sha512-jT7D6NimWqoFSkid4vCno8gvTyfL1+NHpgm3es0B2UNhKKRV3LngOGilm1m6v8Qvk/gy6Fh/tvB+s+hBl6GhOg==" + } + }, + "npm:@tanstack/server-functions-plugin": { + "type": "npm", + "name": "npm:@tanstack/server-functions-plugin", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/server-functions-plugin", + "hash": "sha512-IpNFiCoy2YU6gY/4lCKIVlFyU67ltlcUMGcdnrevqOgq20AbMyeLbbBVo9tAA3TkHK9F+9Hd7DqGXsup2pmBLg==" + } + }, + "npm:@tanstack/start-client-core": { + "type": "npm", + "name": "npm:@tanstack/start-client-core", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/start-client-core", + "hash": "sha512-omG032CeYUWlwQt6s7VFqhc9dGHKWNJ0C5PoIckL+G/HcV+0/RxYkiKzx/HTTzWt+K+LpsBDFFNnrTUUyTE5sw==" + } + }, + "npm:@tanstack/start-plugin-core": { + "type": "npm", + "name": "npm:@tanstack/start-plugin-core", + "data": { + "version": "1.139.8", + "packageName": "@tanstack/start-plugin-core", + "hash": "sha512-u1+rof/1vNHzFVR0yPWWSVwzbCtvndQsfjBR104xSTLCLB0oGvFvkCU0xLLyKtxhqsrYZFrqudg5B8aVH2plOg==" + } + }, + "npm:@tanstack/start-server-core": { + "type": "npm", + "name": "npm:@tanstack/start-server-core", + "data": { + "version": "1.139.8", + "packageName": "@tanstack/start-server-core", + "hash": "sha512-jKC83uMS2kgCHoqlHmxh9hAK1pN9Wd8l+Lhkibwp9PKKMW4Z1bxy5xCx6sr3TD2yJEOP25SRhYMrtAKmrLmYGA==" + } + }, + "npm:@tanstack/start-storage-context": { + "type": "npm", + "name": "npm:@tanstack/start-storage-context", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/start-storage-context", + "hash": "sha512-l2utb0CXLE+wfj1wlAUPHohiq7n5nOBMl3pflhl3JzCXt+6D9AAogkfrysyxOAvx3KnLh3oG+qwf1KHWIDB9HA==" + } + }, + "npm:@tanstack/store": { + "type": "npm", + "name": "npm:@tanstack/store", + "data": { + "version": "0.8.0", + "packageName": "@tanstack/store", + "hash": "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==" + } + }, + "npm:@tanstack/typedoc-config": { + "type": "npm", + "name": "npm:@tanstack/typedoc-config", + "data": { + "version": "0.3.1", + "packageName": "@tanstack/typedoc-config", + "hash": "sha512-frgA1vjzxbdU5/xn/Z/UqyOd1yuegEfAnx9QNbcX+1XQ3TCzD+x89cMZH9iyxdTC1Tasx2gq7DCNCvX962X9WA==" + } + }, + "npm:@tanstack/virtual-file-routes": { + "type": "npm", + "name": "npm:@tanstack/virtual-file-routes", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/virtual-file-routes", + "hash": "sha512-9PImF1d1tovTUIpjFVa0W7Fwj/MHif7BaaczgJJfbv3sDt1Gh+oW9W9uCw9M3ndEJynnp5ZD/TTs0RGubH5ssg==" + } + }, + "npm:@tanstack/vite-config": { + "type": "npm", + "name": "npm:@tanstack/vite-config", + "data": { + "version": "0.4.1", + "packageName": "@tanstack/vite-config", + "hash": "sha512-FOl8EF6SAcljanKSm5aBeJaflFcxQAytTbxtNW8HC6D4x+UBW68IC4tBcrlrsI0wXHBmC/Gz4Ovvv8qCtiXSgQ==" + } + }, + "npm:@testing-library/dom": { + "type": "npm", + "name": "npm:@testing-library/dom", + "data": { + "version": "10.4.1", + "packageName": "@testing-library/dom", + "hash": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==" + } + }, + "npm:@testing-library/jest-dom": { + "type": "npm", + "name": "npm:@testing-library/jest-dom", + "data": { + "version": "6.9.1", + "packageName": "@testing-library/jest-dom", + "hash": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==" + } + }, + "npm:@testing-library/react": { + "type": "npm", + "name": "npm:@testing-library/react", + "data": { + "version": "16.3.0", + "packageName": "@testing-library/react", + "hash": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==" + } + }, + "npm:@tybys/wasm-util@0.10.1": { + "type": "npm", + "name": "npm:@tybys/wasm-util@0.10.1", + "data": { + "version": "0.10.1", + "packageName": "@tybys/wasm-util", + "hash": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==" + } + }, + "npm:@tybys/wasm-util@0.9.0": { + "type": "npm", + "name": "npm:@tybys/wasm-util@0.9.0", + "data": { + "version": "0.9.0", + "packageName": "@tybys/wasm-util", + "hash": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==" + } + }, + "npm:@types/argparse": { + "type": "npm", + "name": "npm:@types/argparse", + "data": { + "version": "1.0.38", + "packageName": "@types/argparse", + "hash": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" + } + }, + "npm:@types/aria-query": { + "type": "npm", + "name": "npm:@types/aria-query", + "data": { + "version": "5.0.4", + "packageName": "@types/aria-query", + "hash": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + } + }, + "npm:@types/babel__core": { + "type": "npm", + "name": "npm:@types/babel__core", + "data": { + "version": "7.20.5", + "packageName": "@types/babel__core", + "hash": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==" + } + }, + "npm:@types/babel__generator": { + "type": "npm", + "name": "npm:@types/babel__generator", + "data": { + "version": "7.27.0", + "packageName": "@types/babel__generator", + "hash": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==" + } + }, + "npm:@types/babel__template": { + "type": "npm", + "name": "npm:@types/babel__template", + "data": { + "version": "7.4.4", + "packageName": "@types/babel__template", + "hash": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==" + } + }, + "npm:@types/babel__traverse": { + "type": "npm", + "name": "npm:@types/babel__traverse", + "data": { + "version": "7.28.0", + "packageName": "@types/babel__traverse", + "hash": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==" + } + }, + "npm:@types/chai": { + "type": "npm", + "name": "npm:@types/chai", + "data": { + "version": "5.2.3", + "packageName": "@types/chai", + "hash": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==" + } + }, + "npm:@types/conventional-commits-parser": { + "type": "npm", + "name": "npm:@types/conventional-commits-parser", + "data": { + "version": "5.0.2", + "packageName": "@types/conventional-commits-parser", + "hash": "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==" + } + }, + "npm:@types/debug": { + "type": "npm", + "name": "npm:@types/debug", + "data": { + "version": "4.1.12", + "packageName": "@types/debug", + "hash": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==" + } + }, + "npm:@types/deep-eql": { + "type": "npm", + "name": "npm:@types/deep-eql", + "data": { + "version": "4.0.2", + "packageName": "@types/deep-eql", + "hash": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" + } + }, + "npm:@types/estree-jsx": { + "type": "npm", + "name": "npm:@types/estree-jsx", + "data": { + "version": "1.0.5", + "packageName": "@types/estree-jsx", + "hash": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==" + } + }, + "npm:@types/estree": { + "type": "npm", + "name": "npm:@types/estree", + "data": { + "version": "1.0.8", + "packageName": "@types/estree", + "hash": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + } + }, + "npm:@types/hast": { + "type": "npm", + "name": "npm:@types/hast", + "data": { + "version": "3.0.4", + "packageName": "@types/hast", + "hash": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==" + } + }, + "npm:@types/json-schema": { + "type": "npm", + "name": "npm:@types/json-schema", + "data": { + "version": "7.0.15", + "packageName": "@types/json-schema", + "hash": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + } + }, + "npm:@types/mdast": { + "type": "npm", + "name": "npm:@types/mdast", + "data": { + "version": "4.0.4", + "packageName": "@types/mdast", + "hash": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==" + } + }, + "npm:@types/ms": { + "type": "npm", + "name": "npm:@types/ms", + "data": { + "version": "2.1.0", + "packageName": "@types/ms", + "hash": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + } + }, + "npm:@types/node@12.20.55": { + "type": "npm", + "name": "npm:@types/node@12.20.55", + "data": { + "version": "12.20.55", + "packageName": "@types/node", + "hash": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + } + }, + "npm:@types/node@20.19.25": { + "type": "npm", + "name": "npm:@types/node@20.19.25", + "data": { + "version": "20.19.25", + "packageName": "@types/node", + "hash": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==" + } + }, + "npm:@types/node": { + "type": "npm", + "name": "npm:@types/node", + "data": { + "version": "24.10.1", + "packageName": "@types/node", + "hash": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==" + } + }, + "npm:@types/react-dom": { + "type": "npm", + "name": "npm:@types/react-dom", + "data": { + "version": "19.2.3", + "packageName": "@types/react-dom", + "hash": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==" + } + }, + "npm:@types/react": { + "type": "npm", + "name": "npm:@types/react", + "data": { + "version": "19.2.7", + "packageName": "@types/react", + "hash": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==" + } + }, + "npm:@types/resolve": { + "type": "npm", + "name": "npm:@types/resolve", + "data": { + "version": "1.20.2", + "packageName": "@types/resolve", + "hash": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + } + }, + "npm:@types/unist@2.0.11": { + "type": "npm", + "name": "npm:@types/unist@2.0.11", + "data": { + "version": "2.0.11", + "packageName": "@types/unist", + "hash": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + } + }, + "npm:@types/unist@3.0.3": { + "type": "npm", + "name": "npm:@types/unist@3.0.3", + "data": { + "version": "3.0.3", + "packageName": "@types/unist", + "hash": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + } + }, + "npm:@types/whatwg-mimetype": { + "type": "npm", + "name": "npm:@types/whatwg-mimetype", + "data": { + "version": "3.0.2", + "packageName": "@types/whatwg-mimetype", + "hash": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==" + } + }, + "npm:@typescript-eslint/eslint-plugin": { + "type": "npm", + "name": "npm:@typescript-eslint/eslint-plugin", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/eslint-plugin", + "hash": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==" + } + }, + "npm:@typescript-eslint/parser": { + "type": "npm", + "name": "npm:@typescript-eslint/parser", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/parser", + "hash": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==" + } + }, + "npm:@typescript-eslint/project-service@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/project-service@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/project-service", + "hash": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==" + } + }, + "npm:@typescript-eslint/project-service@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/project-service@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/project-service", + "hash": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==" + } + }, + "npm:@typescript-eslint/scope-manager@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/scope-manager@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/scope-manager", + "hash": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==" + } + }, + "npm:@typescript-eslint/scope-manager@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/scope-manager@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/scope-manager", + "hash": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==" + } + }, + "npm:@typescript-eslint/tsconfig-utils@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/tsconfig-utils@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/tsconfig-utils", + "hash": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==" + } + }, + "npm:@typescript-eslint/tsconfig-utils@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/tsconfig-utils@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/tsconfig-utils", + "hash": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==" + } + }, + "npm:@typescript-eslint/type-utils@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/type-utils@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/type-utils", + "hash": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==" + } + }, + "npm:@typescript-eslint/type-utils@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/type-utils@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/type-utils", + "hash": "sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==" + } + }, + "npm:@typescript-eslint/types@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/types@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/types", + "hash": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==" + } + }, + "npm:@typescript-eslint/types@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/types@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/types", + "hash": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==" + } + }, + "npm:@typescript-eslint/typescript-estree@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/typescript-estree@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/typescript-estree", + "hash": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==" + } + }, + "npm:@typescript-eslint/typescript-estree@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/typescript-estree@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/typescript-estree", + "hash": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==" + } + }, + "npm:@typescript-eslint/utils@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/utils@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/utils", + "hash": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==" + } + }, + "npm:@typescript-eslint/utils@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/utils@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/utils", + "hash": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==" + } + }, + "npm:@typescript-eslint/visitor-keys@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/visitor-keys@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/visitor-keys", + "hash": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==" + } + }, + "npm:@typescript-eslint/visitor-keys@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/visitor-keys@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/visitor-keys", + "hash": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==" + } + }, + "npm:@ungap/structured-clone": { + "type": "npm", + "name": "npm:@ungap/structured-clone", + "data": { + "version": "1.3.0", + "packageName": "@ungap/structured-clone", + "hash": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" + } + }, + "npm:@unrs/resolver-binding-android-arm-eabi": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-android-arm-eabi", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-android-arm-eabi", + "hash": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==" + } + }, + "npm:@unrs/resolver-binding-android-arm64": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-android-arm64", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-android-arm64", + "hash": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==" + } + }, + "npm:@unrs/resolver-binding-darwin-arm64": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-darwin-arm64", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-darwin-arm64", + "hash": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==" + } + }, + "npm:@unrs/resolver-binding-darwin-x64": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-darwin-x64", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-darwin-x64", + "hash": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==" + } + }, + "npm:@unrs/resolver-binding-freebsd-x64": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-freebsd-x64", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-freebsd-x64", + "hash": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==" + } + }, + "npm:@unrs/resolver-binding-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-arm-gnueabihf", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-arm-gnueabihf", + "hash": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==" + } + }, + "npm:@unrs/resolver-binding-linux-arm-musleabihf": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-arm-musleabihf", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-arm-musleabihf", + "hash": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==" + } + }, + "npm:@unrs/resolver-binding-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-arm64-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-arm64-gnu", + "hash": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==" + } + }, + "npm:@unrs/resolver-binding-linux-arm64-musl": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-arm64-musl", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-arm64-musl", + "hash": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==" + } + }, + "npm:@unrs/resolver-binding-linux-ppc64-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-ppc64-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-ppc64-gnu", + "hash": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==" + } + }, + "npm:@unrs/resolver-binding-linux-riscv64-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-riscv64-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-riscv64-gnu", + "hash": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==" + } + }, + "npm:@unrs/resolver-binding-linux-riscv64-musl": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-riscv64-musl", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-riscv64-musl", + "hash": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==" + } + }, + "npm:@unrs/resolver-binding-linux-s390x-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-s390x-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-s390x-gnu", + "hash": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==" + } + }, + "npm:@unrs/resolver-binding-linux-x64-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-x64-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-x64-gnu", + "hash": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==" + } + }, + "npm:@unrs/resolver-binding-linux-x64-musl": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-x64-musl", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-x64-musl", + "hash": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==" + } + }, + "npm:@unrs/resolver-binding-wasm32-wasi": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-wasm32-wasi", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-wasm32-wasi", + "hash": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==" + } + }, + "npm:@unrs/resolver-binding-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-win32-arm64-msvc", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-win32-arm64-msvc", + "hash": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==" + } + }, + "npm:@unrs/resolver-binding-win32-ia32-msvc": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-win32-ia32-msvc", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-win32-ia32-msvc", + "hash": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==" + } + }, + "npm:@unrs/resolver-binding-win32-x64-msvc": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-win32-x64-msvc", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-win32-x64-msvc", + "hash": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==" + } + }, + "npm:@vercel/nft": { + "type": "npm", + "name": "npm:@vercel/nft", + "data": { + "version": "0.30.3", + "packageName": "@vercel/nft", + "hash": "sha512-UEq+eF0ocEf9WQCV1gktxKhha36KDs7jln5qii6UpPf5clMqDc0p3E7d9l2Smx0i9Pm1qpq4S4lLfNl97bbv6w==" + } + }, + "npm:@vitejs/plugin-react": { + "type": "npm", + "name": "npm:@vitejs/plugin-react", + "data": { + "version": "5.1.1", + "packageName": "@vitejs/plugin-react", + "hash": "sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==" + } + }, + "npm:@vitest/expect": { + "type": "npm", + "name": "npm:@vitest/expect", + "data": { + "version": "4.0.14", + "packageName": "@vitest/expect", + "hash": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==" + } + }, + "npm:@vitest/mocker": { + "type": "npm", + "name": "npm:@vitest/mocker", + "data": { + "version": "4.0.14", + "packageName": "@vitest/mocker", + "hash": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==" + } + }, + "npm:@vitest/pretty-format": { + "type": "npm", + "name": "npm:@vitest/pretty-format", + "data": { + "version": "4.0.14", + "packageName": "@vitest/pretty-format", + "hash": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==" + } + }, + "npm:@vitest/runner": { + "type": "npm", + "name": "npm:@vitest/runner", + "data": { + "version": "4.0.14", + "packageName": "@vitest/runner", + "hash": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==" + } + }, + "npm:@vitest/snapshot": { + "type": "npm", + "name": "npm:@vitest/snapshot", + "data": { + "version": "4.0.14", + "packageName": "@vitest/snapshot", + "hash": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==" + } + }, + "npm:@vitest/spy": { + "type": "npm", + "name": "npm:@vitest/spy", + "data": { + "version": "4.0.14", + "packageName": "@vitest/spy", + "hash": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==" + } + }, + "npm:@vitest/utils": { + "type": "npm", + "name": "npm:@vitest/utils", + "data": { + "version": "4.0.14", + "packageName": "@vitest/utils", + "hash": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==" + } + }, + "npm:@volar/language-core": { + "type": "npm", + "name": "npm:@volar/language-core", + "data": { + "version": "2.4.23", + "packageName": "@volar/language-core", + "hash": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==" + } + }, + "npm:@volar/source-map": { + "type": "npm", + "name": "npm:@volar/source-map", + "data": { + "version": "2.4.23", + "packageName": "@volar/source-map", + "hash": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==" + } + }, + "npm:@volar/typescript": { + "type": "npm", + "name": "npm:@volar/typescript", + "data": { + "version": "2.4.23", + "packageName": "@volar/typescript", + "hash": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==" + } + }, + "npm:@vue/compiler-core": { + "type": "npm", + "name": "npm:@vue/compiler-core", + "data": { + "version": "3.5.24", + "packageName": "@vue/compiler-core", + "hash": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==" + } + }, + "npm:@vue/compiler-dom": { + "type": "npm", + "name": "npm:@vue/compiler-dom", + "data": { + "version": "3.5.24", + "packageName": "@vue/compiler-dom", + "hash": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==" + } + }, + "npm:@vue/compiler-vue2": { + "type": "npm", + "name": "npm:@vue/compiler-vue2", + "data": { + "version": "2.7.16", + "packageName": "@vue/compiler-vue2", + "hash": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==" + } + }, + "npm:@vue/language-core": { + "type": "npm", + "name": "npm:@vue/language-core", + "data": { + "version": "2.1.6", + "packageName": "@vue/language-core", + "hash": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==" + } + }, + "npm:@vue/shared": { + "type": "npm", + "name": "npm:@vue/shared", + "data": { + "version": "3.5.24", + "packageName": "@vue/shared", + "hash": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==" + } + }, + "npm:@yarnpkg/lockfile": { + "type": "npm", + "name": "npm:@yarnpkg/lockfile", + "data": { + "version": "1.1.0", + "packageName": "@yarnpkg/lockfile", + "hash": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + } + }, + "npm:@yarnpkg/parsers": { + "type": "npm", + "name": "npm:@yarnpkg/parsers", + "data": { + "version": "3.0.2", + "packageName": "@yarnpkg/parsers", + "hash": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==" + } + }, + "npm:@zkochan/js-yaml": { + "type": "npm", + "name": "npm:@zkochan/js-yaml", + "data": { + "version": "0.0.7", + "packageName": "@zkochan/js-yaml", + "hash": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==" + } + }, + "npm:JSONStream": { + "type": "npm", + "name": "npm:JSONStream", + "data": { + "version": "1.3.5", + "packageName": "JSONStream", + "hash": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==" + } + }, + "npm:abbrev": { + "type": "npm", + "name": "npm:abbrev", + "data": { + "version": "3.0.1", + "packageName": "abbrev", + "hash": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" + } + }, + "npm:abort-controller": { + "type": "npm", + "name": "npm:abort-controller", + "data": { + "version": "3.0.0", + "packageName": "abort-controller", + "hash": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==" + } + }, + "npm:acorn-import-attributes": { + "type": "npm", + "name": "npm:acorn-import-attributes", + "data": { + "version": "1.9.5", + "packageName": "acorn-import-attributes", + "hash": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==" + } + }, + "npm:acorn-jsx": { + "type": "npm", + "name": "npm:acorn-jsx", + "data": { + "version": "5.3.2", + "packageName": "acorn-jsx", + "hash": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + } + }, + "npm:acorn": { + "type": "npm", + "name": "npm:acorn", + "data": { + "version": "8.15.0", + "packageName": "acorn", + "hash": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" + } + }, + "npm:agent-base": { + "type": "npm", + "name": "npm:agent-base", + "data": { + "version": "7.1.4", + "packageName": "agent-base", + "hash": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" + } + }, + "npm:ajv-draft-04": { + "type": "npm", + "name": "npm:ajv-draft-04", + "data": { + "version": "1.0.0", + "packageName": "ajv-draft-04", + "hash": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==" + } + }, + "npm:ajv-formats": { + "type": "npm", + "name": "npm:ajv-formats", + "data": { + "version": "3.0.1", + "packageName": "ajv-formats", + "hash": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==" + } + }, + "npm:ajv@6.12.6": { + "type": "npm", + "name": "npm:ajv@6.12.6", + "data": { + "version": "6.12.6", + "packageName": "ajv", + "hash": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + } + }, + "npm:ajv@8.12.0": { + "type": "npm", + "name": "npm:ajv@8.12.0", + "data": { + "version": "8.12.0", + "packageName": "ajv", + "hash": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==" + } + }, + "npm:ajv@8.13.0": { + "type": "npm", + "name": "npm:ajv@8.13.0", + "data": { + "version": "8.13.0", + "packageName": "ajv", + "hash": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==" + } + }, + "npm:ansi-colors": { + "type": "npm", + "name": "npm:ansi-colors", + "data": { + "version": "4.1.3", + "packageName": "ansi-colors", + "hash": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + } + }, + "npm:ansi-regex@5.0.1": { + "type": "npm", + "name": "npm:ansi-regex@5.0.1", + "data": { + "version": "5.0.1", + "packageName": "ansi-regex", + "hash": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + }, + "npm:ansi-regex@6.2.2": { + "type": "npm", + "name": "npm:ansi-regex@6.2.2", + "data": { + "version": "6.2.2", + "packageName": "ansi-regex", + "hash": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" + } + }, + "npm:ansi-styles@4.3.0": { + "type": "npm", + "name": "npm:ansi-styles@4.3.0", + "data": { + "version": "4.3.0", + "packageName": "ansi-styles", + "hash": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + } + }, + "npm:ansi-styles@5.2.0": { + "type": "npm", + "name": "npm:ansi-styles@5.2.0", + "data": { + "version": "5.2.0", + "packageName": "ansi-styles", + "hash": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + }, + "npm:ansi-styles@6.2.3": { + "type": "npm", + "name": "npm:ansi-styles@6.2.3", + "data": { + "version": "6.2.3", + "packageName": "ansi-styles", + "hash": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" + } + }, + "npm:ansis": { + "type": "npm", + "name": "npm:ansis", + "data": { + "version": "4.2.0", + "packageName": "ansis", + "hash": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==" + } + }, + "npm:anymatch": { + "type": "npm", + "name": "npm:anymatch", + "data": { + "version": "3.1.3", + "packageName": "anymatch", + "hash": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" + } + }, + "npm:archiver-utils": { + "type": "npm", + "name": "npm:archiver-utils", + "data": { + "version": "5.0.2", + "packageName": "archiver-utils", + "hash": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==" + } + }, + "npm:archiver": { + "type": "npm", + "name": "npm:archiver", + "data": { + "version": "7.0.1", + "packageName": "archiver", + "hash": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==" + } + }, + "npm:argparse@1.0.10": { + "type": "npm", + "name": "npm:argparse@1.0.10", + "data": { + "version": "1.0.10", + "packageName": "argparse", + "hash": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + } + }, + "npm:argparse@2.0.1": { + "type": "npm", + "name": "npm:argparse@2.0.1", + "data": { + "version": "2.0.1", + "packageName": "argparse", + "hash": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + } + }, + "npm:aria-query@5.3.0": { + "type": "npm", + "name": "npm:aria-query@5.3.0", + "data": { + "version": "5.3.0", + "packageName": "aria-query", + "hash": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==" + } + }, + "npm:aria-query@5.3.2": { + "type": "npm", + "name": "npm:aria-query@5.3.2", + "data": { + "version": "5.3.2", + "packageName": "aria-query", + "hash": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" + } + }, + "npm:array-ify": { + "type": "npm", + "name": "npm:array-ify", + "data": { + "version": "1.0.0", + "packageName": "array-ify", + "hash": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" + } + }, + "npm:array-union": { + "type": "npm", + "name": "npm:array-union", + "data": { + "version": "2.1.0", + "packageName": "array-union", + "hash": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + } + }, + "npm:assertion-error": { + "type": "npm", + "name": "npm:assertion-error", + "data": { + "version": "2.0.1", + "packageName": "assertion-error", + "hash": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" + } + }, + "npm:ast-types": { + "type": "npm", + "name": "npm:ast-types", + "data": { + "version": "0.16.1", + "packageName": "ast-types", + "hash": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==" + } + }, + "npm:async-sema": { + "type": "npm", + "name": "npm:async-sema", + "data": { + "version": "3.1.1", + "packageName": "async-sema", + "hash": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" + } + }, + "npm:async": { + "type": "npm", + "name": "npm:async", + "data": { + "version": "3.2.6", + "packageName": "async", + "hash": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + } + }, + "npm:asynckit": { + "type": "npm", + "name": "npm:asynckit", + "data": { + "version": "0.4.0", + "packageName": "asynckit", + "hash": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + } + }, + "npm:axios": { + "type": "npm", + "name": "npm:axios", + "data": { + "version": "1.13.2", + "packageName": "axios", + "hash": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==" + } + }, + "npm:axobject-query": { + "type": "npm", + "name": "npm:axobject-query", + "data": { + "version": "4.1.0", + "packageName": "axobject-query", + "hash": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==" + } + }, + "npm:b4a": { + "type": "npm", + "name": "npm:b4a", + "data": { + "version": "1.7.3", + "packageName": "b4a", + "hash": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==" + } + }, + "npm:babel-dead-code-elimination": { + "type": "npm", + "name": "npm:babel-dead-code-elimination", + "data": { + "version": "1.0.10", + "packageName": "babel-dead-code-elimination", + "hash": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==" + } + }, + "npm:babel-plugin-jsx-dom-expressions": { + "type": "npm", + "name": "npm:babel-plugin-jsx-dom-expressions", + "data": { + "version": "0.40.3", + "packageName": "babel-plugin-jsx-dom-expressions", + "hash": "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==" + } + }, + "npm:babel-preset-solid": { + "type": "npm", + "name": "npm:babel-preset-solid", + "data": { + "version": "1.9.10", + "packageName": "babel-preset-solid", + "hash": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==" + } + }, + "npm:bail": { + "type": "npm", + "name": "npm:bail", + "data": { + "version": "2.0.2", + "packageName": "bail", + "hash": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + } + }, + "npm:balanced-match": { + "type": "npm", + "name": "npm:balanced-match", + "data": { + "version": "1.0.2", + "packageName": "balanced-match", + "hash": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + } + }, + "npm:bare-events": { + "type": "npm", + "name": "npm:bare-events", + "data": { + "version": "2.8.1", + "packageName": "bare-events", + "hash": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==" + } + }, + "npm:base64-js": { + "type": "npm", + "name": "npm:base64-js", + "data": { + "version": "1.5.1", + "packageName": "base64-js", + "hash": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + } + }, + "npm:baseline-browser-mapping": { + "type": "npm", + "name": "npm:baseline-browser-mapping", + "data": { + "version": "2.8.22", + "packageName": "baseline-browser-mapping", + "hash": "sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==" + } + }, + "npm:better-path-resolve": { + "type": "npm", + "name": "npm:better-path-resolve", + "data": { + "version": "1.0.0", + "packageName": "better-path-resolve", + "hash": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==" + } + }, + "npm:bidi-js": { + "type": "npm", + "name": "npm:bidi-js", + "data": { + "version": "1.0.3", + "packageName": "bidi-js", + "hash": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==" + } + }, + "npm:bignumber.js": { + "type": "npm", + "name": "npm:bignumber.js", + "data": { + "version": "9.3.1", + "packageName": "bignumber.js", + "hash": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" + } + }, + "npm:binary-extensions": { + "type": "npm", + "name": "npm:binary-extensions", + "data": { + "version": "2.3.0", + "packageName": "binary-extensions", + "hash": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + } + }, + "npm:bindings": { + "type": "npm", + "name": "npm:bindings", + "data": { + "version": "1.5.0", + "packageName": "bindings", + "hash": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==" + } + }, + "npm:birecord": { + "type": "npm", + "name": "npm:birecord", + "data": { + "version": "0.1.1", + "packageName": "birecord", + "hash": "sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==" + } + }, + "npm:bl": { + "type": "npm", + "name": "npm:bl", + "data": { + "version": "4.1.0", + "packageName": "bl", + "hash": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==" + } + }, + "npm:boolbase": { + "type": "npm", + "name": "npm:boolbase", + "data": { + "version": "1.0.0", + "packageName": "boolbase", + "hash": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + } + }, + "npm:brace-expansion@1.1.12": { + "type": "npm", + "name": "npm:brace-expansion@1.1.12", + "data": { + "version": "1.1.12", + "packageName": "brace-expansion", + "hash": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==" + } + }, + "npm:brace-expansion@2.0.2": { + "type": "npm", + "name": "npm:brace-expansion@2.0.2", + "data": { + "version": "2.0.2", + "packageName": "brace-expansion", + "hash": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==" + } + }, + "npm:braces": { + "type": "npm", + "name": "npm:braces", + "data": { + "version": "3.0.3", + "packageName": "braces", + "hash": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==" + } + }, + "npm:browserslist": { + "type": "npm", + "name": "npm:browserslist", + "data": { + "version": "4.27.0", + "packageName": "browserslist", + "hash": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==" + } + }, + "npm:buffer-crc32": { + "type": "npm", + "name": "npm:buffer-crc32", + "data": { + "version": "1.0.0", + "packageName": "buffer-crc32", + "hash": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==" + } + }, + "npm:buffer-equal-constant-time": { + "type": "npm", + "name": "npm:buffer-equal-constant-time", + "data": { + "version": "1.0.1", + "packageName": "buffer-equal-constant-time", + "hash": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + } + }, + "npm:buffer-from": { + "type": "npm", + "name": "npm:buffer-from", + "data": { + "version": "1.1.2", + "packageName": "buffer-from", + "hash": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + } + }, + "npm:buffer@5.7.1": { + "type": "npm", + "name": "npm:buffer@5.7.1", + "data": { + "version": "5.7.1", + "packageName": "buffer", + "hash": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" + } + }, + "npm:buffer@6.0.3": { + "type": "npm", + "name": "npm:buffer@6.0.3", + "data": { + "version": "6.0.3", + "packageName": "buffer", + "hash": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==" + } + }, + "npm:bytes-iec": { + "type": "npm", + "name": "npm:bytes-iec", + "data": { + "version": "3.1.1", + "packageName": "bytes-iec", + "hash": "sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==" + } + }, + "npm:c12": { + "type": "npm", + "name": "npm:c12", + "data": { + "version": "3.3.1", + "packageName": "c12", + "hash": "sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ==" + } + }, + "npm:call-bind-apply-helpers": { + "type": "npm", + "name": "npm:call-bind-apply-helpers", + "data": { + "version": "1.0.2", + "packageName": "call-bind-apply-helpers", + "hash": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==" + } + }, + "npm:callsites": { + "type": "npm", + "name": "npm:callsites", + "data": { + "version": "3.1.0", + "packageName": "callsites", + "hash": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + } + }, + "npm:caniuse-lite": { + "type": "npm", + "name": "npm:caniuse-lite", + "data": { + "version": "1.0.30001752", + "packageName": "caniuse-lite", + "hash": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==" + } + }, + "npm:ccount": { + "type": "npm", + "name": "npm:ccount", + "data": { + "version": "2.0.1", + "packageName": "ccount", + "hash": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + } + }, + "npm:chai": { + "type": "npm", + "name": "npm:chai", + "data": { + "version": "6.2.1", + "packageName": "chai", + "hash": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==" + } + }, + "npm:chalk@4.1.2": { + "type": "npm", + "name": "npm:chalk@4.1.2", + "data": { + "version": "4.1.2", + "packageName": "chalk", + "hash": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + } + }, + "npm:chalk@5.6.2": { + "type": "npm", + "name": "npm:chalk@5.6.2", + "data": { + "version": "5.6.2", + "packageName": "chalk", + "hash": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" + } + }, + "npm:character-entities-html4": { + "type": "npm", + "name": "npm:character-entities-html4", + "data": { + "version": "2.1.0", + "packageName": "character-entities-html4", + "hash": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" + } + }, + "npm:character-entities-legacy": { + "type": "npm", + "name": "npm:character-entities-legacy", + "data": { + "version": "3.0.0", + "packageName": "character-entities-legacy", + "hash": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" + } + }, + "npm:character-entities": { + "type": "npm", + "name": "npm:character-entities", + "data": { + "version": "2.0.2", + "packageName": "character-entities", + "hash": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" + } + }, + "npm:character-reference-invalid": { + "type": "npm", + "name": "npm:character-reference-invalid", + "data": { + "version": "2.0.1", + "packageName": "character-reference-invalid", + "hash": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" + } + }, + "npm:chardet": { + "type": "npm", + "name": "npm:chardet", + "data": { + "version": "2.1.1", + "packageName": "chardet", + "hash": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==" + } + }, + "npm:cheerio-select": { + "type": "npm", + "name": "npm:cheerio-select", + "data": { + "version": "2.1.0", + "packageName": "cheerio-select", + "hash": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==" + } + }, + "npm:cheerio": { + "type": "npm", + "name": "npm:cheerio", + "data": { + "version": "1.1.2", + "packageName": "cheerio", + "hash": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==" + } + }, + "npm:chokidar@3.6.0": { + "type": "npm", + "name": "npm:chokidar@3.6.0", + "data": { + "version": "3.6.0", + "packageName": "chokidar", + "hash": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==" + } + }, + "npm:chokidar@4.0.3": { + "type": "npm", + "name": "npm:chokidar@4.0.3", + "data": { + "version": "4.0.3", + "packageName": "chokidar", + "hash": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==" + } + }, + "npm:chownr": { + "type": "npm", + "name": "npm:chownr", + "data": { + "version": "3.0.0", + "packageName": "chownr", + "hash": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" + } + }, + "npm:ci-info": { + "type": "npm", + "name": "npm:ci-info", + "data": { + "version": "3.9.0", + "packageName": "ci-info", + "hash": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + } + }, + "npm:citty": { + "type": "npm", + "name": "npm:citty", + "data": { + "version": "0.1.6", + "packageName": "citty", + "hash": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==" + } + }, + "npm:cli-cursor": { + "type": "npm", + "name": "npm:cli-cursor", + "data": { + "version": "3.1.0", + "packageName": "cli-cursor", + "hash": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==" + } + }, + "npm:cli-spinners": { + "type": "npm", + "name": "npm:cli-spinners", + "data": { + "version": "2.6.1", + "packageName": "cli-spinners", + "hash": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" + } + }, + "npm:clipboardy": { + "type": "npm", + "name": "npm:clipboardy", + "data": { + "version": "4.0.0", + "packageName": "clipboardy", + "hash": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==" + } + }, + "npm:cliui": { + "type": "npm", + "name": "npm:cliui", + "data": { + "version": "8.0.1", + "packageName": "cliui", + "hash": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==" + } + }, + "npm:clone": { + "type": "npm", + "name": "npm:clone", + "data": { + "version": "1.0.4", + "packageName": "clone", + "hash": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + } + }, + "npm:clsx": { + "type": "npm", + "name": "npm:clsx", + "data": { + "version": "2.1.1", + "packageName": "clsx", + "hash": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + } + }, + "npm:cluster-key-slot": { + "type": "npm", + "name": "npm:cluster-key-slot", + "data": { + "version": "1.1.2", + "packageName": "cluster-key-slot", + "hash": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + } + }, + "npm:color-convert": { + "type": "npm", + "name": "npm:color-convert", + "data": { + "version": "2.0.1", + "packageName": "color-convert", + "hash": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + } + }, + "npm:color-name": { + "type": "npm", + "name": "npm:color-name", + "data": { + "version": "1.1.4", + "packageName": "color-name", + "hash": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + }, + "npm:combined-stream": { + "type": "npm", + "name": "npm:combined-stream", + "data": { + "version": "1.0.8", + "packageName": "combined-stream", + "hash": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" + } + }, + "npm:comma-separated-tokens": { + "type": "npm", + "name": "npm:comma-separated-tokens", + "data": { + "version": "2.0.3", + "packageName": "comma-separated-tokens", + "hash": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + } + }, + "npm:commander": { + "type": "npm", + "name": "npm:commander", + "data": { + "version": "2.20.3", + "packageName": "commander", + "hash": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + }, + "npm:comment-parser": { + "type": "npm", + "name": "npm:comment-parser", + "data": { + "version": "1.4.1", + "packageName": "comment-parser", + "hash": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==" + } + }, + "npm:commondir": { + "type": "npm", + "name": "npm:commondir", + "data": { + "version": "1.0.1", + "packageName": "commondir", + "hash": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + } + }, + "npm:compare-func": { + "type": "npm", + "name": "npm:compare-func", + "data": { + "version": "2.0.0", + "packageName": "compare-func", + "hash": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==" + } + }, + "npm:compare-versions": { + "type": "npm", + "name": "npm:compare-versions", + "data": { + "version": "6.1.1", + "packageName": "compare-versions", + "hash": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==" + } + }, + "npm:compatx": { + "type": "npm", + "name": "npm:compatx", + "data": { + "version": "0.2.0", + "packageName": "compatx", + "hash": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==" + } + }, + "npm:compress-commons": { + "type": "npm", + "name": "npm:compress-commons", + "data": { + "version": "6.0.2", + "packageName": "compress-commons", + "hash": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==" + } + }, + "npm:computeds": { + "type": "npm", + "name": "npm:computeds", + "data": { + "version": "0.0.1", + "packageName": "computeds", + "hash": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==" + } + }, + "npm:concat-map": { + "type": "npm", + "name": "npm:concat-map", + "data": { + "version": "0.0.1", + "packageName": "concat-map", + "hash": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + } + }, + "npm:confbox@0.1.8": { + "type": "npm", + "name": "npm:confbox@0.1.8", + "data": { + "version": "0.1.8", + "packageName": "confbox", + "hash": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + } + }, + "npm:confbox@0.2.2": { + "type": "npm", + "name": "npm:confbox@0.2.2", + "data": { + "version": "0.2.2", + "packageName": "confbox", + "hash": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==" + } + }, + "npm:consola": { + "type": "npm", + "name": "npm:consola", + "data": { + "version": "3.4.2", + "packageName": "consola", + "hash": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==" + } + }, + "npm:conventional-changelog-angular": { + "type": "npm", + "name": "npm:conventional-changelog-angular", + "data": { + "version": "7.0.0", + "packageName": "conventional-changelog-angular", + "hash": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==" + } + }, + "npm:conventional-commits-parser": { + "type": "npm", + "name": "npm:conventional-commits-parser", + "data": { + "version": "5.0.0", + "packageName": "conventional-commits-parser", + "hash": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==" + } + }, + "npm:convert-source-map": { + "type": "npm", + "name": "npm:convert-source-map", + "data": { + "version": "2.0.0", + "packageName": "convert-source-map", + "hash": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + } + }, + "npm:cookie-es@1.2.2": { + "type": "npm", + "name": "npm:cookie-es@1.2.2", + "data": { + "version": "1.2.2", + "packageName": "cookie-es", + "hash": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" + } + }, + "npm:cookie-es@2.0.0": { + "type": "npm", + "name": "npm:cookie-es@2.0.0", + "data": { + "version": "2.0.0", + "packageName": "cookie-es", + "hash": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==" + } + }, + "npm:cookie": { + "type": "npm", + "name": "npm:cookie", + "data": { + "version": "1.0.2", + "packageName": "cookie", + "hash": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==" + } + }, + "npm:core-util-is": { + "type": "npm", + "name": "npm:core-util-is", + "data": { + "version": "1.0.3", + "packageName": "core-util-is", + "hash": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + } + }, + "npm:crc-32": { + "type": "npm", + "name": "npm:crc-32", + "data": { + "version": "1.2.2", + "packageName": "crc-32", + "hash": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + } + }, + "npm:crc32-stream": { + "type": "npm", + "name": "npm:crc32-stream", + "data": { + "version": "6.0.0", + "packageName": "crc32-stream", + "hash": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==" + } + }, + "npm:croner": { + "type": "npm", + "name": "npm:croner", + "data": { + "version": "9.1.0", + "packageName": "croner", + "hash": "sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==" + } + }, + "npm:cross-spawn": { + "type": "npm", + "name": "npm:cross-spawn", + "data": { + "version": "7.0.6", + "packageName": "cross-spawn", + "hash": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==" + } + }, + "npm:crossws": { + "type": "npm", + "name": "npm:crossws", + "data": { + "version": "0.3.5", + "packageName": "crossws", + "hash": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==" + } + }, + "npm:css-select": { + "type": "npm", + "name": "npm:css-select", + "data": { + "version": "5.2.2", + "packageName": "css-select", + "hash": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==" + } + }, + "npm:css-tree": { + "type": "npm", + "name": "npm:css-tree", + "data": { + "version": "3.1.0", + "packageName": "css-tree", + "hash": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==" + } + }, + "npm:css-what": { + "type": "npm", + "name": "npm:css-what", + "data": { + "version": "6.2.2", + "packageName": "css-what", + "hash": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" + } + }, + "npm:css.escape": { + "type": "npm", + "name": "npm:css.escape", + "data": { + "version": "1.5.1", + "packageName": "css.escape", + "hash": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + } + }, + "npm:cssstyle": { + "type": "npm", + "name": "npm:cssstyle", + "data": { + "version": "5.3.3", + "packageName": "cssstyle", + "hash": "sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==" + } + }, + "npm:csstype@3.1.3": { + "type": "npm", + "name": "npm:csstype@3.1.3", + "data": { + "version": "3.1.3", + "packageName": "csstype", + "hash": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + } + }, + "npm:csstype@3.2.3": { + "type": "npm", + "name": "npm:csstype@3.2.3", + "data": { + "version": "3.2.3", + "packageName": "csstype", + "hash": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" + } + }, + "npm:data-uri-to-buffer": { + "type": "npm", + "name": "npm:data-uri-to-buffer", + "data": { + "version": "4.0.1", + "packageName": "data-uri-to-buffer", + "hash": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + } + }, + "npm:data-urls": { + "type": "npm", + "name": "npm:data-urls", + "data": { + "version": "6.0.0", + "packageName": "data-urls", + "hash": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==" + } + }, + "npm:dataloader": { + "type": "npm", + "name": "npm:dataloader", + "data": { + "version": "1.4.0", + "packageName": "dataloader", + "hash": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" + } + }, + "npm:db0": { + "type": "npm", + "name": "npm:db0", + "data": { + "version": "0.3.4", + "packageName": "db0", + "hash": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==" + } + }, + "npm:de-indent": { + "type": "npm", + "name": "npm:de-indent", + "data": { + "version": "1.0.2", + "packageName": "de-indent", + "hash": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" + } + }, + "npm:debug": { + "type": "npm", + "name": "npm:debug", + "data": { + "version": "4.4.3", + "packageName": "debug", + "hash": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==" + } + }, + "npm:decimal.js": { + "type": "npm", + "name": "npm:decimal.js", + "data": { + "version": "10.6.0", + "packageName": "decimal.js", + "hash": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==" + } + }, + "npm:decode-named-character-reference": { + "type": "npm", + "name": "npm:decode-named-character-reference", + "data": { + "version": "1.2.0", + "packageName": "decode-named-character-reference", + "hash": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==" + } + }, + "npm:deep-is": { + "type": "npm", + "name": "npm:deep-is", + "data": { + "version": "0.1.4", + "packageName": "deep-is", + "hash": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + } + }, + "npm:deepmerge": { + "type": "npm", + "name": "npm:deepmerge", + "data": { + "version": "4.3.1", + "packageName": "deepmerge", + "hash": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + } + }, + "npm:defaults": { + "type": "npm", + "name": "npm:defaults", + "data": { + "version": "1.0.4", + "packageName": "defaults", + "hash": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==" + } + }, + "npm:define-lazy-prop": { + "type": "npm", + "name": "npm:define-lazy-prop", + "data": { + "version": "2.0.0", + "packageName": "define-lazy-prop", + "hash": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + } + }, + "npm:defu": { + "type": "npm", + "name": "npm:defu", + "data": { + "version": "6.1.4", + "packageName": "defu", + "hash": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + } + }, + "npm:delayed-stream": { + "type": "npm", + "name": "npm:delayed-stream", + "data": { + "version": "1.0.0", + "packageName": "delayed-stream", + "hash": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + } + }, + "npm:denque": { + "type": "npm", + "name": "npm:denque", + "data": { + "version": "2.1.0", + "packageName": "denque", + "hash": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + } + }, + "npm:depd": { + "type": "npm", + "name": "npm:depd", + "data": { + "version": "2.0.0", + "packageName": "depd", + "hash": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + }, + "npm:dequal": { + "type": "npm", + "name": "npm:dequal", + "data": { + "version": "2.0.3", + "packageName": "dequal", + "hash": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + } + }, + "npm:destr": { + "type": "npm", + "name": "npm:destr", + "data": { + "version": "2.0.5", + "packageName": "destr", + "hash": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" + } + }, + "npm:detect-indent": { + "type": "npm", + "name": "npm:detect-indent", + "data": { + "version": "6.1.0", + "packageName": "detect-indent", + "hash": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" + } + }, + "npm:detect-libc@1.0.3": { + "type": "npm", + "name": "npm:detect-libc@1.0.3", + "data": { + "version": "1.0.3", + "packageName": "detect-libc", + "hash": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + } + }, + "npm:detect-libc@2.1.2": { + "type": "npm", + "name": "npm:detect-libc@2.1.2", + "data": { + "version": "2.1.2", + "packageName": "detect-libc", + "hash": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" + } + }, + "npm:devalue": { + "type": "npm", + "name": "npm:devalue", + "data": { + "version": "5.5.0", + "packageName": "devalue", + "hash": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==" + } + }, + "npm:devlop": { + "type": "npm", + "name": "npm:devlop", + "data": { + "version": "1.1.0", + "packageName": "devlop", + "hash": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==" + } + }, + "npm:diff": { + "type": "npm", + "name": "npm:diff", + "data": { + "version": "8.0.2", + "packageName": "diff", + "hash": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==" + } + }, + "npm:dir-glob": { + "type": "npm", + "name": "npm:dir-glob", + "data": { + "version": "3.0.1", + "packageName": "dir-glob", + "hash": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + } + }, + "npm:dom-accessibility-api@0.5.16": { + "type": "npm", + "name": "npm:dom-accessibility-api@0.5.16", + "data": { + "version": "0.5.16", + "packageName": "dom-accessibility-api", + "hash": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + } + }, + "npm:dom-accessibility-api@0.6.3": { + "type": "npm", + "name": "npm:dom-accessibility-api@0.6.3", + "data": { + "version": "0.6.3", + "packageName": "dom-accessibility-api", + "hash": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" + } + }, + "npm:dom-serializer": { + "type": "npm", + "name": "npm:dom-serializer", + "data": { + "version": "2.0.0", + "packageName": "dom-serializer", + "hash": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==" + } + }, + "npm:domelementtype": { + "type": "npm", + "name": "npm:domelementtype", + "data": { + "version": "2.3.0", + "packageName": "domelementtype", + "hash": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + } + }, + "npm:domhandler": { + "type": "npm", + "name": "npm:domhandler", + "data": { + "version": "5.0.3", + "packageName": "domhandler", + "hash": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==" + } + }, + "npm:domutils": { + "type": "npm", + "name": "npm:domutils", + "data": { + "version": "3.2.2", + "packageName": "domutils", + "hash": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==" + } + }, + "npm:dot-prop@10.1.0": { + "type": "npm", + "name": "npm:dot-prop@10.1.0", + "data": { + "version": "10.1.0", + "packageName": "dot-prop", + "hash": "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==" + } + }, + "npm:dot-prop@5.3.0": { + "type": "npm", + "name": "npm:dot-prop@5.3.0", + "data": { + "version": "5.3.0", + "packageName": "dot-prop", + "hash": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" + } + }, + "npm:dotenv-expand": { + "type": "npm", + "name": "npm:dotenv-expand", + "data": { + "version": "11.0.7", + "packageName": "dotenv-expand", + "hash": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==" + } + }, + "npm:dotenv@16.4.7": { + "type": "npm", + "name": "npm:dotenv@16.4.7", + "data": { + "version": "16.4.7", + "packageName": "dotenv", + "hash": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==" + } + }, + "npm:dotenv@16.6.1": { + "type": "npm", + "name": "npm:dotenv@16.6.1", + "data": { + "version": "16.6.1", + "packageName": "dotenv", + "hash": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==" + } + }, + "npm:dotenv@17.2.3": { + "type": "npm", + "name": "npm:dotenv@17.2.3", + "data": { + "version": "17.2.3", + "packageName": "dotenv", + "hash": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==" + } + }, + "npm:dunder-proto": { + "type": "npm", + "name": "npm:dunder-proto", + "data": { + "version": "1.0.1", + "packageName": "dunder-proto", + "hash": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==" + } + }, + "npm:duplexer": { + "type": "npm", + "name": "npm:duplexer", + "data": { + "version": "0.1.2", + "packageName": "duplexer", + "hash": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + } + }, + "npm:eastasianwidth": { + "type": "npm", + "name": "npm:eastasianwidth", + "data": { + "version": "0.2.0", + "packageName": "eastasianwidth", + "hash": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + } + }, + "npm:ecdsa-sig-formatter": { + "type": "npm", + "name": "npm:ecdsa-sig-formatter", + "data": { + "version": "1.0.11", + "packageName": "ecdsa-sig-formatter", + "hash": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==" + } + }, + "npm:ee-first": { + "type": "npm", + "name": "npm:ee-first", + "data": { + "version": "1.1.1", + "packageName": "ee-first", + "hash": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + } + }, + "npm:electron-to-chromium": { + "type": "npm", + "name": "npm:electron-to-chromium", + "data": { + "version": "1.5.244", + "packageName": "electron-to-chromium", + "hash": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==" + } + }, + "npm:emoji-regex@8.0.0": { + "type": "npm", + "name": "npm:emoji-regex@8.0.0", + "data": { + "version": "8.0.0", + "packageName": "emoji-regex", + "hash": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + } + }, + "npm:emoji-regex@9.2.2": { + "type": "npm", + "name": "npm:emoji-regex@9.2.2", + "data": { + "version": "9.2.2", + "packageName": "emoji-regex", + "hash": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + } + }, + "npm:encodeurl": { + "type": "npm", + "name": "npm:encodeurl", + "data": { + "version": "2.0.0", + "packageName": "encodeurl", + "hash": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + } + }, + "npm:encoding-sniffer": { + "type": "npm", + "name": "npm:encoding-sniffer", + "data": { + "version": "0.2.1", + "packageName": "encoding-sniffer", + "hash": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==" + } + }, + "npm:end-of-stream": { + "type": "npm", + "name": "npm:end-of-stream", + "data": { + "version": "1.4.5", + "packageName": "end-of-stream", + "hash": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==" + } + }, + "npm:enhanced-resolve": { + "type": "npm", + "name": "npm:enhanced-resolve", + "data": { + "version": "5.18.3", + "packageName": "enhanced-resolve", + "hash": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==" + } + }, + "npm:enquirer@2.3.6": { + "type": "npm", + "name": "npm:enquirer@2.3.6", + "data": { + "version": "2.3.6", + "packageName": "enquirer", + "hash": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" + } + }, + "npm:enquirer@2.4.1": { + "type": "npm", + "name": "npm:enquirer@2.4.1", + "data": { + "version": "2.4.1", + "packageName": "enquirer", + "hash": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==" + } + }, + "npm:entities@4.5.0": { + "type": "npm", + "name": "npm:entities@4.5.0", + "data": { + "version": "4.5.0", + "packageName": "entities", + "hash": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } + }, + "npm:entities@6.0.1": { + "type": "npm", + "name": "npm:entities@6.0.1", + "data": { + "version": "6.0.1", + "packageName": "entities", + "hash": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" + } + }, + "npm:error-stack-parser-es": { + "type": "npm", + "name": "npm:error-stack-parser-es", + "data": { + "version": "1.0.5", + "packageName": "error-stack-parser-es", + "hash": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==" + } + }, + "npm:es-define-property": { + "type": "npm", + "name": "npm:es-define-property", + "data": { + "version": "1.0.1", + "packageName": "es-define-property", + "hash": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + } + }, + "npm:es-errors": { + "type": "npm", + "name": "npm:es-errors", + "data": { + "version": "1.3.0", + "packageName": "es-errors", + "hash": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + } + }, + "npm:es-module-lexer": { + "type": "npm", + "name": "npm:es-module-lexer", + "data": { + "version": "1.7.0", + "packageName": "es-module-lexer", + "hash": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + } + }, + "npm:es-object-atoms": { + "type": "npm", + "name": "npm:es-object-atoms", + "data": { + "version": "1.1.1", + "packageName": "es-object-atoms", + "hash": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==" + } + }, + "npm:es-set-tostringtag": { + "type": "npm", + "name": "npm:es-set-tostringtag", + "data": { + "version": "2.1.0", + "packageName": "es-set-tostringtag", + "hash": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==" + } + }, + "npm:esbuild": { + "type": "npm", + "name": "npm:esbuild", + "data": { + "version": "0.25.12", + "packageName": "esbuild", + "hash": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==" + } + }, + "npm:escalade": { + "type": "npm", + "name": "npm:escalade", + "data": { + "version": "3.2.0", + "packageName": "escalade", + "hash": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + } + }, + "npm:escape-html": { + "type": "npm", + "name": "npm:escape-html", + "data": { + "version": "1.0.3", + "packageName": "escape-html", + "hash": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + } + }, + "npm:escape-string-regexp@1.0.5": { + "type": "npm", + "name": "npm:escape-string-regexp@1.0.5", + "data": { + "version": "1.0.5", + "packageName": "escape-string-regexp", + "hash": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + }, + "npm:escape-string-regexp@4.0.0": { + "type": "npm", + "name": "npm:escape-string-regexp@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "escape-string-regexp", + "hash": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + } + }, + "npm:escape-string-regexp@5.0.0": { + "type": "npm", + "name": "npm:escape-string-regexp@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "escape-string-regexp", + "hash": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + }, + "npm:eslint-compat-utils": { + "type": "npm", + "name": "npm:eslint-compat-utils", + "data": { + "version": "0.5.1", + "packageName": "eslint-compat-utils", + "hash": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==" + } + }, + "npm:eslint-import-context": { + "type": "npm", + "name": "npm:eslint-import-context", + "data": { + "version": "0.1.9", + "packageName": "eslint-import-context", + "hash": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==" + } + }, + "npm:eslint-plugin-es-x": { + "type": "npm", + "name": "npm:eslint-plugin-es-x", + "data": { + "version": "7.8.0", + "packageName": "eslint-plugin-es-x", + "hash": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==" + } + }, + "npm:eslint-plugin-import-x": { + "type": "npm", + "name": "npm:eslint-plugin-import-x", + "data": { + "version": "4.16.1", + "packageName": "eslint-plugin-import-x", + "hash": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==" + } + }, + "npm:eslint-plugin-n": { + "type": "npm", + "name": "npm:eslint-plugin-n", + "data": { + "version": "17.23.1", + "packageName": "eslint-plugin-n", + "hash": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==" + } + }, + "npm:eslint-plugin-react-compiler": { + "type": "npm", + "name": "npm:eslint-plugin-react-compiler", + "data": { + "version": "19.1.0-rc.2", + "packageName": "eslint-plugin-react-compiler", + "hash": "sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==" + } + }, + "npm:eslint-plugin-react-dom": { + "type": "npm", + "name": "npm:eslint-plugin-react-dom", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-dom", + "hash": "sha512-xflcmWONib2KN54bJ25AvrYSPrp0qDWwWoG+tZJWD7xe0OcvC42zpERKyMuqTMuXfKPJNUOs2ZB1z6e3HNRviw==" + } + }, + "npm:eslint-plugin-react-hooks-extra": { + "type": "npm", + "name": "npm:eslint-plugin-react-hooks-extra", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-hooks-extra", + "hash": "sha512-ImANssr1gfBNMahqCufe2nhb1CZpqMBjKYgwtYF6u0pV11UXnGj181MW+YBEPEB+qIN4NK3hKxSsQngQJPBfQQ==" + } + }, + "npm:eslint-plugin-react-hooks": { + "type": "npm", + "name": "npm:eslint-plugin-react-hooks", + "data": { + "version": "7.0.1", + "packageName": "eslint-plugin-react-hooks", + "hash": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==" + } + }, + "npm:eslint-plugin-react-naming-convention": { + "type": "npm", + "name": "npm:eslint-plugin-react-naming-convention", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-naming-convention", + "hash": "sha512-3cxHcn6oA29awTQr20LCw9XBhms65giuHHclU3KyLtFVoHSX/LUJtXUpv/KezkhRiaavT8PmxGTGMZiGGY9vHw==" + } + }, + "npm:eslint-plugin-react-web-api": { + "type": "npm", + "name": "npm:eslint-plugin-react-web-api", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-web-api", + "hash": "sha512-AlSBt0ITf1nT1I6U4Kyj9GoFEpfLh8sR62sl+6uYSladmhPAKXMOSB7Ban7VX6jZcA7LHp+acKAJCv18fKxaUg==" + } + }, + "npm:eslint-plugin-react-x": { + "type": "npm", + "name": "npm:eslint-plugin-react-x", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-x", + "hash": "sha512-G0Aqk7oHMVmMNnulpQ2nb/Iq2o9JNkk3WQT70zBVQJYIz6NUrXp/1ujL2+cXb5A8ZapEN53F0pP9ZoQRIzNhsA==" + } + }, + "npm:eslint-plugin-unused-imports": { + "type": "npm", + "name": "npm:eslint-plugin-unused-imports", + "data": { + "version": "4.3.0", + "packageName": "eslint-plugin-unused-imports", + "hash": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==" + } + }, + "npm:eslint-scope": { + "type": "npm", + "name": "npm:eslint-scope", + "data": { + "version": "8.4.0", + "packageName": "eslint-scope", + "hash": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==" + } + }, + "npm:eslint-visitor-keys@3.4.3": { + "type": "npm", + "name": "npm:eslint-visitor-keys@3.4.3", + "data": { + "version": "3.4.3", + "packageName": "eslint-visitor-keys", + "hash": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + } + }, + "npm:eslint-visitor-keys@4.2.1": { + "type": "npm", + "name": "npm:eslint-visitor-keys@4.2.1", + "data": { + "version": "4.2.1", + "packageName": "eslint-visitor-keys", + "hash": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==" + } + }, + "npm:eslint": { + "type": "npm", + "name": "npm:eslint", + "data": { + "version": "9.39.1", + "packageName": "eslint", + "hash": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==" + } + }, + "npm:esm-env": { + "type": "npm", + "name": "npm:esm-env", + "data": { + "version": "1.2.2", + "packageName": "esm-env", + "hash": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" + } + }, + "npm:espree": { + "type": "npm", + "name": "npm:espree", + "data": { + "version": "10.4.0", + "packageName": "espree", + "hash": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==" + } + }, + "npm:esprima": { + "type": "npm", + "name": "npm:esprima", + "data": { + "version": "4.0.1", + "packageName": "esprima", + "hash": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + } + }, + "npm:esquery": { + "type": "npm", + "name": "npm:esquery", + "data": { + "version": "1.6.0", + "packageName": "esquery", + "hash": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==" + } + }, + "npm:esrap": { + "type": "npm", + "name": "npm:esrap", + "data": { + "version": "2.2.0", + "packageName": "esrap", + "hash": "sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg==" + } + }, + "npm:esrecurse": { + "type": "npm", + "name": "npm:esrecurse", + "data": { + "version": "4.3.0", + "packageName": "esrecurse", + "hash": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + } + }, + "npm:estraverse": { + "type": "npm", + "name": "npm:estraverse", + "data": { + "version": "5.3.0", + "packageName": "estraverse", + "hash": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + }, + "npm:estree-util-is-identifier-name": { + "type": "npm", + "name": "npm:estree-util-is-identifier-name", + "data": { + "version": "3.0.0", + "packageName": "estree-util-is-identifier-name", + "hash": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==" + } + }, + "npm:estree-walker@2.0.2": { + "type": "npm", + "name": "npm:estree-walker@2.0.2", + "data": { + "version": "2.0.2", + "packageName": "estree-walker", + "hash": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + } + }, + "npm:estree-walker@3.0.3": { + "type": "npm", + "name": "npm:estree-walker@3.0.3", + "data": { + "version": "3.0.3", + "packageName": "estree-walker", + "hash": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==" + } + }, + "npm:esutils": { + "type": "npm", + "name": "npm:esutils", + "data": { + "version": "2.0.3", + "packageName": "esutils", + "hash": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + } + }, + "npm:etag": { + "type": "npm", + "name": "npm:etag", + "data": { + "version": "1.8.1", + "packageName": "etag", + "hash": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + } + }, + "npm:event-target-shim": { + "type": "npm", + "name": "npm:event-target-shim", + "data": { + "version": "5.0.1", + "packageName": "event-target-shim", + "hash": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + } + }, + "npm:events-universal": { + "type": "npm", + "name": "npm:events-universal", + "data": { + "version": "1.0.1", + "packageName": "events-universal", + "hash": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==" + } + }, + "npm:events": { + "type": "npm", + "name": "npm:events", + "data": { + "version": "3.3.0", + "packageName": "events", + "hash": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + } + }, + "npm:eventsource-parser": { + "type": "npm", + "name": "npm:eventsource-parser", + "data": { + "version": "3.0.6", + "packageName": "eventsource-parser", + "hash": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==" + } + }, + "npm:execa": { + "type": "npm", + "name": "npm:execa", + "data": { + "version": "8.0.1", + "packageName": "execa", + "hash": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==" + } + }, + "npm:expect-type": { + "type": "npm", + "name": "npm:expect-type", + "data": { + "version": "1.2.2", + "packageName": "expect-type", + "hash": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==" + } + }, + "npm:exsolve": { + "type": "npm", + "name": "npm:exsolve", + "data": { + "version": "1.0.7", + "packageName": "exsolve", + "hash": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==" + } + }, + "npm:extend": { + "type": "npm", + "name": "npm:extend", + "data": { + "version": "3.0.2", + "packageName": "extend", + "hash": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + } + }, + "npm:extendable-error": { + "type": "npm", + "name": "npm:extendable-error", + "data": { + "version": "0.1.7", + "packageName": "extendable-error", + "hash": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==" + } + }, + "npm:fast-deep-equal": { + "type": "npm", + "name": "npm:fast-deep-equal", + "data": { + "version": "3.1.3", + "packageName": "fast-deep-equal", + "hash": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + } + }, + "npm:fast-fifo": { + "type": "npm", + "name": "npm:fast-fifo", + "data": { + "version": "1.3.2", + "packageName": "fast-fifo", + "hash": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + } + }, + "npm:fast-glob": { + "type": "npm", + "name": "npm:fast-glob", + "data": { + "version": "3.3.3", + "packageName": "fast-glob", + "hash": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==" + } + }, + "npm:fast-json-stable-stringify": { + "type": "npm", + "name": "npm:fast-json-stable-stringify", + "data": { + "version": "2.1.0", + "packageName": "fast-json-stable-stringify", + "hash": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + } + }, + "npm:fast-levenshtein": { + "type": "npm", + "name": "npm:fast-levenshtein", + "data": { + "version": "2.0.6", + "packageName": "fast-levenshtein", + "hash": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + } + }, + "npm:fastq": { + "type": "npm", + "name": "npm:fastq", + "data": { + "version": "1.19.1", + "packageName": "fastq", + "hash": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==" + } + }, + "npm:fd-package-json": { + "type": "npm", + "name": "npm:fd-package-json", + "data": { + "version": "2.0.0", + "packageName": "fd-package-json", + "hash": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==" + } + }, + "npm:fdir": { + "type": "npm", + "name": "npm:fdir", + "data": { + "version": "6.5.0", + "packageName": "fdir", + "hash": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==" + } + }, + "npm:fetch-blob": { + "type": "npm", + "name": "npm:fetch-blob", + "data": { + "version": "3.2.0", + "packageName": "fetch-blob", + "hash": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==" + } + }, + "npm:fetchdts": { + "type": "npm", + "name": "npm:fetchdts", + "data": { + "version": "0.1.7", + "packageName": "fetchdts", + "hash": "sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==" + } + }, + "npm:figures": { + "type": "npm", + "name": "npm:figures", + "data": { + "version": "3.2.0", + "packageName": "figures", + "hash": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" + } + }, + "npm:file-entry-cache": { + "type": "npm", + "name": "npm:file-entry-cache", + "data": { + "version": "8.0.0", + "packageName": "file-entry-cache", + "hash": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==" + } + }, + "npm:file-uri-to-path": { + "type": "npm", + "name": "npm:file-uri-to-path", + "data": { + "version": "1.0.0", + "packageName": "file-uri-to-path", + "hash": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + } + }, + "npm:fill-range": { + "type": "npm", + "name": "npm:fill-range", + "data": { + "version": "7.1.1", + "packageName": "fill-range", + "hash": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==" + } + }, + "npm:find-up@4.1.0": { + "type": "npm", + "name": "npm:find-up@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "find-up", + "hash": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + } + }, + "npm:find-up@5.0.0": { + "type": "npm", + "name": "npm:find-up@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "find-up", + "hash": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" + } + }, + "npm:flat-cache": { + "type": "npm", + "name": "npm:flat-cache", + "data": { + "version": "4.0.1", + "packageName": "flat-cache", + "hash": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==" + } + }, + "npm:flat": { + "type": "npm", + "name": "npm:flat", + "data": { + "version": "5.0.2", + "packageName": "flat", + "hash": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + } + }, + "npm:flatted": { + "type": "npm", + "name": "npm:flatted", + "data": { + "version": "3.3.3", + "packageName": "flatted", + "hash": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" + } + }, + "npm:follow-redirects": { + "type": "npm", + "name": "npm:follow-redirects", + "data": { + "version": "1.15.11", + "packageName": "follow-redirects", + "hash": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" + } + }, + "npm:foreground-child": { + "type": "npm", + "name": "npm:foreground-child", + "data": { + "version": "3.3.1", + "packageName": "foreground-child", + "hash": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==" + } + }, + "npm:form-data": { + "type": "npm", + "name": "npm:form-data", + "data": { + "version": "4.0.4", + "packageName": "form-data", + "hash": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==" + } + }, + "npm:formatly": { + "type": "npm", + "name": "npm:formatly", + "data": { + "version": "0.3.0", + "packageName": "formatly", + "hash": "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==" + } + }, + "npm:formdata-polyfill": { + "type": "npm", + "name": "npm:formdata-polyfill", + "data": { + "version": "4.0.10", + "packageName": "formdata-polyfill", + "hash": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==" + } + }, + "npm:fresh": { + "type": "npm", + "name": "npm:fresh", + "data": { + "version": "2.0.0", + "packageName": "fresh", + "hash": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" + } + }, + "npm:front-matter": { + "type": "npm", + "name": "npm:front-matter", + "data": { + "version": "4.0.2", + "packageName": "front-matter", + "hash": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==" + } + }, + "npm:fs-constants": { + "type": "npm", + "name": "npm:fs-constants", + "data": { + "version": "1.0.0", + "packageName": "fs-constants", + "hash": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + } + }, + "npm:fs-extra@7.0.1": { + "type": "npm", + "name": "npm:fs-extra@7.0.1", + "data": { + "version": "7.0.1", + "packageName": "fs-extra", + "hash": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==" + } + }, + "npm:fs-extra@8.1.0": { + "type": "npm", + "name": "npm:fs-extra@8.1.0", + "data": { + "version": "8.1.0", + "packageName": "fs-extra", + "hash": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==" + } + }, + "npm:fsevents": { + "type": "npm", + "name": "npm:fsevents", + "data": { + "version": "2.3.3", + "packageName": "fsevents", + "hash": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" + } + }, + "npm:function-bind": { + "type": "npm", + "name": "npm:function-bind", + "data": { + "version": "1.1.2", + "packageName": "function-bind", + "hash": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + } + }, + "npm:gaxios": { + "type": "npm", + "name": "npm:gaxios", + "data": { + "version": "7.1.3", + "packageName": "gaxios", + "hash": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==" + } + }, + "npm:gcp-metadata": { + "type": "npm", + "name": "npm:gcp-metadata", + "data": { + "version": "8.1.2", + "packageName": "gcp-metadata", + "hash": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==" + } + }, + "npm:gensync": { + "type": "npm", + "name": "npm:gensync", + "data": { + "version": "1.0.0-beta.2", + "packageName": "gensync", + "hash": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + } + }, + "npm:get-caller-file": { + "type": "npm", + "name": "npm:get-caller-file", + "data": { + "version": "2.0.5", + "packageName": "get-caller-file", + "hash": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + } + }, + "npm:get-intrinsic": { + "type": "npm", + "name": "npm:get-intrinsic", + "data": { + "version": "1.3.0", + "packageName": "get-intrinsic", + "hash": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==" + } + }, + "npm:get-port-please": { + "type": "npm", + "name": "npm:get-port-please", + "data": { + "version": "3.2.0", + "packageName": "get-port-please", + "hash": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==" + } + }, + "npm:get-proto": { + "type": "npm", + "name": "npm:get-proto", + "data": { + "version": "1.0.1", + "packageName": "get-proto", + "hash": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==" + } + }, + "npm:get-stream": { + "type": "npm", + "name": "npm:get-stream", + "data": { + "version": "8.0.1", + "packageName": "get-stream", + "hash": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" + } + }, + "npm:get-tsconfig": { + "type": "npm", + "name": "npm:get-tsconfig", + "data": { + "version": "4.13.0", + "packageName": "get-tsconfig", + "hash": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==" + } + }, + "npm:giget": { + "type": "npm", + "name": "npm:giget", + "data": { + "version": "2.0.0", + "packageName": "giget", + "hash": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==" + } + }, + "npm:glob-parent@5.1.2": { + "type": "npm", + "name": "npm:glob-parent@5.1.2", + "data": { + "version": "5.1.2", + "packageName": "glob-parent", + "hash": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + } + }, + "npm:glob-parent@6.0.2": { + "type": "npm", + "name": "npm:glob-parent@6.0.2", + "data": { + "version": "6.0.2", + "packageName": "glob-parent", + "hash": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + } + }, + "npm:glob": { + "type": "npm", + "name": "npm:glob", + "data": { + "version": "10.4.5", + "packageName": "glob", + "hash": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==" + } + }, + "npm:globals@14.0.0": { + "type": "npm", + "name": "npm:globals@14.0.0", + "data": { + "version": "14.0.0", + "packageName": "globals", + "hash": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" + } + }, + "npm:globals@15.15.0": { + "type": "npm", + "name": "npm:globals@15.15.0", + "data": { + "version": "15.15.0", + "packageName": "globals", + "hash": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==" + } + }, + "npm:globals@16.5.0": { + "type": "npm", + "name": "npm:globals@16.5.0", + "data": { + "version": "16.5.0", + "packageName": "globals", + "hash": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==" + } + }, + "npm:globby@11.1.0": { + "type": "npm", + "name": "npm:globby@11.1.0", + "data": { + "version": "11.1.0", + "packageName": "globby", + "hash": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" + } + }, + "npm:globby@15.0.0": { + "type": "npm", + "name": "npm:globby@15.0.0", + "data": { + "version": "15.0.0", + "packageName": "globby", + "hash": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==" + } + }, + "npm:globrex": { + "type": "npm", + "name": "npm:globrex", + "data": { + "version": "0.1.2", + "packageName": "globrex", + "hash": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + } + }, + "npm:goober": { + "type": "npm", + "name": "npm:goober", + "data": { + "version": "2.1.18", + "packageName": "goober", + "hash": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==" + } + }, + "npm:google-auth-library": { + "type": "npm", + "name": "npm:google-auth-library", + "data": { + "version": "10.5.0", + "packageName": "google-auth-library", + "hash": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==" + } + }, + "npm:google-logging-utils": { + "type": "npm", + "name": "npm:google-logging-utils", + "data": { + "version": "1.1.3", + "packageName": "google-logging-utils", + "hash": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==" + } + }, + "npm:gopd": { + "type": "npm", + "name": "npm:gopd", + "data": { + "version": "1.2.0", + "packageName": "gopd", + "hash": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + } + }, + "npm:graceful-fs": { + "type": "npm", + "name": "npm:graceful-fs", + "data": { + "version": "4.2.11", + "packageName": "graceful-fs", + "hash": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + } + }, + "npm:graphemer": { + "type": "npm", + "name": "npm:graphemer", + "data": { + "version": "1.4.0", + "packageName": "graphemer", + "hash": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + } + }, + "npm:gtoken": { + "type": "npm", + "name": "npm:gtoken", + "data": { + "version": "8.0.0", + "packageName": "gtoken", + "hash": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==" + } + }, + "npm:gzip-size": { + "type": "npm", + "name": "npm:gzip-size", + "data": { + "version": "7.0.0", + "packageName": "gzip-size", + "hash": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==" + } + }, + "npm:h3@1.15.4": { + "type": "npm", + "name": "npm:h3@1.15.4", + "data": { + "version": "1.15.4", + "packageName": "h3", + "hash": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==" + } + }, + "npm:h3@2.0.0-beta.5": { + "type": "npm", + "name": "npm:h3@2.0.0-beta.5", + "data": { + "version": "2.0.0-beta.5", + "packageName": "h3", + "hash": "sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==" + } + }, + "npm:h3-v2": { + "type": "npm", + "name": "npm:h3-v2", + "data": { + "version": "npm:h3@2.0.0-beta.5", + "packageName": "h3-v2", + "hash": "sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==" + } + }, + "npm:happy-dom": { + "type": "npm", + "name": "npm:happy-dom", + "data": { + "version": "20.0.10", + "packageName": "happy-dom", + "hash": "sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==" + } + }, + "npm:has-flag": { + "type": "npm", + "name": "npm:has-flag", + "data": { + "version": "4.0.0", + "packageName": "has-flag", + "hash": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + } + }, + "npm:has-symbols": { + "type": "npm", + "name": "npm:has-symbols", + "data": { + "version": "1.1.0", + "packageName": "has-symbols", + "hash": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + } + }, + "npm:has-tostringtag": { + "type": "npm", + "name": "npm:has-tostringtag", + "data": { + "version": "1.0.2", + "packageName": "has-tostringtag", + "hash": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==" + } + }, + "npm:hasown": { + "type": "npm", + "name": "npm:hasown", + "data": { + "version": "2.0.2", + "packageName": "hasown", + "hash": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==" + } + }, + "npm:hast-util-from-parse5": { + "type": "npm", + "name": "npm:hast-util-from-parse5", + "data": { + "version": "8.0.3", + "packageName": "hast-util-from-parse5", + "hash": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==" + } + }, + "npm:hast-util-is-element": { + "type": "npm", + "name": "npm:hast-util-is-element", + "data": { + "version": "3.0.0", + "packageName": "hast-util-is-element", + "hash": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==" + } + }, + "npm:hast-util-parse-selector": { + "type": "npm", + "name": "npm:hast-util-parse-selector", + "data": { + "version": "4.0.0", + "packageName": "hast-util-parse-selector", + "hash": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==" + } + }, + "npm:hast-util-raw": { + "type": "npm", + "name": "npm:hast-util-raw", + "data": { + "version": "9.1.0", + "packageName": "hast-util-raw", + "hash": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==" + } + }, + "npm:hast-util-sanitize": { + "type": "npm", + "name": "npm:hast-util-sanitize", + "data": { + "version": "5.0.2", + "packageName": "hast-util-sanitize", + "hash": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==" + } + }, + "npm:hast-util-to-jsx-runtime": { + "type": "npm", + "name": "npm:hast-util-to-jsx-runtime", + "data": { + "version": "2.3.6", + "packageName": "hast-util-to-jsx-runtime", + "hash": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==" + } + }, + "npm:hast-util-to-parse5": { + "type": "npm", + "name": "npm:hast-util-to-parse5", + "data": { + "version": "8.0.0", + "packageName": "hast-util-to-parse5", + "hash": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==" + } + }, + "npm:hast-util-to-text": { + "type": "npm", + "name": "npm:hast-util-to-text", + "data": { + "version": "4.0.2", + "packageName": "hast-util-to-text", + "hash": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==" + } + }, + "npm:hast-util-whitespace": { + "type": "npm", + "name": "npm:hast-util-whitespace", + "data": { + "version": "3.0.0", + "packageName": "hast-util-whitespace", + "hash": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==" + } + }, + "npm:hastscript": { + "type": "npm", + "name": "npm:hastscript", + "data": { + "version": "9.0.1", + "packageName": "hastscript", + "hash": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==" + } + }, + "npm:he": { + "type": "npm", + "name": "npm:he", + "data": { + "version": "1.2.0", + "packageName": "he", + "hash": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + } + }, + "npm:hermes-estree": { + "type": "npm", + "name": "npm:hermes-estree", + "data": { + "version": "0.25.1", + "packageName": "hermes-estree", + "hash": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==" + } + }, + "npm:hermes-parser": { + "type": "npm", + "name": "npm:hermes-parser", + "data": { + "version": "0.25.1", + "packageName": "hermes-parser", + "hash": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==" + } + }, + "npm:highlight.js": { + "type": "npm", + "name": "npm:highlight.js", + "data": { + "version": "11.11.1", + "packageName": "highlight.js", + "hash": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==" + } + }, + "npm:hookable": { + "type": "npm", + "name": "npm:hookable", + "data": { + "version": "5.5.3", + "packageName": "hookable", + "hash": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" + } + }, + "npm:html-encoding-sniffer": { + "type": "npm", + "name": "npm:html-encoding-sniffer", + "data": { + "version": "4.0.0", + "packageName": "html-encoding-sniffer", + "hash": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==" + } + }, + "npm:html-entities": { + "type": "npm", + "name": "npm:html-entities", + "data": { + "version": "2.3.3", + "packageName": "html-entities", + "hash": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + } + }, + "npm:html-link-extractor": { + "type": "npm", + "name": "npm:html-link-extractor", + "data": { + "version": "1.0.5", + "packageName": "html-link-extractor", + "hash": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==" + } + }, + "npm:html-url-attributes": { + "type": "npm", + "name": "npm:html-url-attributes", + "data": { + "version": "3.0.1", + "packageName": "html-url-attributes", + "hash": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==" + } + }, + "npm:html-void-elements": { + "type": "npm", + "name": "npm:html-void-elements", + "data": { + "version": "3.0.0", + "packageName": "html-void-elements", + "hash": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" + } + }, + "npm:htmlparser2": { + "type": "npm", + "name": "npm:htmlparser2", + "data": { + "version": "10.0.0", + "packageName": "htmlparser2", + "hash": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==" + } + }, + "npm:http-errors": { + "type": "npm", + "name": "npm:http-errors", + "data": { + "version": "2.0.0", + "packageName": "http-errors", + "hash": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" + } + }, + "npm:http-proxy-agent": { + "type": "npm", + "name": "npm:http-proxy-agent", + "data": { + "version": "7.0.2", + "packageName": "http-proxy-agent", + "hash": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==" + } + }, + "npm:http-shutdown": { + "type": "npm", + "name": "npm:http-shutdown", + "data": { + "version": "1.2.2", + "packageName": "http-shutdown", + "hash": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==" + } + }, + "npm:https-proxy-agent": { + "type": "npm", + "name": "npm:https-proxy-agent", + "data": { + "version": "7.0.6", + "packageName": "https-proxy-agent", + "hash": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==" + } + }, + "npm:httpxy": { + "type": "npm", + "name": "npm:httpxy", + "data": { + "version": "0.1.7", + "packageName": "httpxy", + "hash": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==" + } + }, + "npm:human-id": { + "type": "npm", + "name": "npm:human-id", + "data": { + "version": "4.1.2", + "packageName": "human-id", + "hash": "sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==" + } + }, + "npm:human-signals": { + "type": "npm", + "name": "npm:human-signals", + "data": { + "version": "5.0.0", + "packageName": "human-signals", + "hash": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" + } + }, + "npm:iconv-lite@0.6.3": { + "type": "npm", + "name": "npm:iconv-lite@0.6.3", + "data": { + "version": "0.6.3", + "packageName": "iconv-lite", + "hash": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" + } + }, + "npm:iconv-lite@0.7.0": { + "type": "npm", + "name": "npm:iconv-lite@0.7.0", + "data": { + "version": "0.7.0", + "packageName": "iconv-lite", + "hash": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==" + } + }, + "npm:ieee754": { + "type": "npm", + "name": "npm:ieee754", + "data": { + "version": "1.2.1", + "packageName": "ieee754", + "hash": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + } + }, + "npm:ignore@5.3.2": { + "type": "npm", + "name": "npm:ignore@5.3.2", + "data": { + "version": "5.3.2", + "packageName": "ignore", + "hash": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" + } + }, + "npm:ignore@7.0.5": { + "type": "npm", + "name": "npm:ignore@7.0.5", + "data": { + "version": "7.0.5", + "packageName": "ignore", + "hash": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==" + } + }, + "npm:import-fresh": { + "type": "npm", + "name": "npm:import-fresh", + "data": { + "version": "3.3.1", + "packageName": "import-fresh", + "hash": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==" + } + }, + "npm:import-lazy": { + "type": "npm", + "name": "npm:import-lazy", + "data": { + "version": "4.0.0", + "packageName": "import-lazy", + "hash": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==" + } + }, + "npm:imurmurhash": { + "type": "npm", + "name": "npm:imurmurhash", + "data": { + "version": "0.1.4", + "packageName": "imurmurhash", + "hash": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + } + }, + "npm:indent-string": { + "type": "npm", + "name": "npm:indent-string", + "data": { + "version": "4.0.0", + "packageName": "indent-string", + "hash": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + } + }, + "npm:inherits": { + "type": "npm", + "name": "npm:inherits", + "data": { + "version": "2.0.4", + "packageName": "inherits", + "hash": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + }, + "npm:inline-style-parser": { + "type": "npm", + "name": "npm:inline-style-parser", + "data": { + "version": "0.2.4", + "packageName": "inline-style-parser", + "hash": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" + } + }, + "npm:ioredis": { + "type": "npm", + "name": "npm:ioredis", + "data": { + "version": "5.8.2", + "packageName": "ioredis", + "hash": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==" + } + }, + "npm:iron-webcrypto": { + "type": "npm", + "name": "npm:iron-webcrypto", + "data": { + "version": "1.2.1", + "packageName": "iron-webcrypto", + "hash": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==" + } + }, + "npm:is-alphabetical": { + "type": "npm", + "name": "npm:is-alphabetical", + "data": { + "version": "2.0.1", + "packageName": "is-alphabetical", + "hash": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" + } + }, + "npm:is-alphanumerical": { + "type": "npm", + "name": "npm:is-alphanumerical", + "data": { + "version": "2.0.1", + "packageName": "is-alphanumerical", + "hash": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==" + } + }, + "npm:is-binary-path": { + "type": "npm", + "name": "npm:is-binary-path", + "data": { + "version": "2.1.0", + "packageName": "is-binary-path", + "hash": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + } + }, + "npm:is-core-module": { + "type": "npm", + "name": "npm:is-core-module", + "data": { + "version": "2.16.1", + "packageName": "is-core-module", + "hash": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==" + } + }, + "npm:is-decimal": { + "type": "npm", + "name": "npm:is-decimal", + "data": { + "version": "2.0.1", + "packageName": "is-decimal", + "hash": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" + } + }, + "npm:is-docker@2.2.1": { + "type": "npm", + "name": "npm:is-docker@2.2.1", + "data": { + "version": "2.2.1", + "packageName": "is-docker", + "hash": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + } + }, + "npm:is-docker@3.0.0": { + "type": "npm", + "name": "npm:is-docker@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "is-docker", + "hash": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" + } + }, + "npm:is-extglob": { + "type": "npm", + "name": "npm:is-extglob", + "data": { + "version": "2.1.1", + "packageName": "is-extglob", + "hash": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + } + }, + "npm:is-fullwidth-code-point": { + "type": "npm", + "name": "npm:is-fullwidth-code-point", + "data": { + "version": "3.0.0", + "packageName": "is-fullwidth-code-point", + "hash": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + } + }, + "npm:is-glob": { + "type": "npm", + "name": "npm:is-glob", + "data": { + "version": "4.0.3", + "packageName": "is-glob", + "hash": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + } + }, + "npm:is-hexadecimal": { + "type": "npm", + "name": "npm:is-hexadecimal", + "data": { + "version": "2.0.1", + "packageName": "is-hexadecimal", + "hash": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" + } + }, + "npm:is-immutable-type": { + "type": "npm", + "name": "npm:is-immutable-type", + "data": { + "version": "5.0.1", + "packageName": "is-immutable-type", + "hash": "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==" + } + }, + "npm:is-inside-container": { + "type": "npm", + "name": "npm:is-inside-container", + "data": { + "version": "1.0.0", + "packageName": "is-inside-container", + "hash": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==" + } + }, + "npm:is-interactive": { + "type": "npm", + "name": "npm:is-interactive", + "data": { + "version": "1.0.0", + "packageName": "is-interactive", + "hash": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + } + }, + "npm:is-module": { + "type": "npm", + "name": "npm:is-module", + "data": { + "version": "1.0.0", + "packageName": "is-module", + "hash": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + } + }, + "npm:is-number": { + "type": "npm", + "name": "npm:is-number", + "data": { + "version": "7.0.0", + "packageName": "is-number", + "hash": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + } + }, + "npm:is-obj": { + "type": "npm", + "name": "npm:is-obj", + "data": { + "version": "2.0.0", + "packageName": "is-obj", + "hash": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + } + }, + "npm:is-plain-obj": { + "type": "npm", + "name": "npm:is-plain-obj", + "data": { + "version": "4.1.0", + "packageName": "is-plain-obj", + "hash": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + } + }, + "npm:is-potential-custom-element-name": { + "type": "npm", + "name": "npm:is-potential-custom-element-name", + "data": { + "version": "1.0.1", + "packageName": "is-potential-custom-element-name", + "hash": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + } + }, + "npm:is-reference@1.2.1": { + "type": "npm", + "name": "npm:is-reference@1.2.1", + "data": { + "version": "1.2.1", + "packageName": "is-reference", + "hash": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==" + } + }, + "npm:is-reference@3.0.3": { + "type": "npm", + "name": "npm:is-reference@3.0.3", + "data": { + "version": "3.0.3", + "packageName": "is-reference", + "hash": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==" + } + }, + "npm:is-stream@2.0.1": { + "type": "npm", + "name": "npm:is-stream@2.0.1", + "data": { + "version": "2.0.1", + "packageName": "is-stream", + "hash": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + } + }, + "npm:is-stream@3.0.0": { + "type": "npm", + "name": "npm:is-stream@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "is-stream", + "hash": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + } + }, + "npm:is-subdir": { + "type": "npm", + "name": "npm:is-subdir", + "data": { + "version": "1.2.0", + "packageName": "is-subdir", + "hash": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==" + } + }, + "npm:is-text-path": { + "type": "npm", + "name": "npm:is-text-path", + "data": { + "version": "2.0.0", + "packageName": "is-text-path", + "hash": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==" + } + }, + "npm:is-unicode-supported": { + "type": "npm", + "name": "npm:is-unicode-supported", + "data": { + "version": "0.1.0", + "packageName": "is-unicode-supported", + "hash": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + } + }, + "npm:is-what": { + "type": "npm", + "name": "npm:is-what", + "data": { + "version": "4.1.16", + "packageName": "is-what", + "hash": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==" + } + }, + "npm:is-windows": { + "type": "npm", + "name": "npm:is-windows", + "data": { + "version": "1.0.2", + "packageName": "is-windows", + "hash": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + } + }, + "npm:is-wsl@2.2.0": { + "type": "npm", + "name": "npm:is-wsl@2.2.0", + "data": { + "version": "2.2.0", + "packageName": "is-wsl", + "hash": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==" + } + }, + "npm:is-wsl@3.1.0": { + "type": "npm", + "name": "npm:is-wsl@3.1.0", + "data": { + "version": "3.1.0", + "packageName": "is-wsl", + "hash": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==" + } + }, + "npm:is64bit": { + "type": "npm", + "name": "npm:is64bit", + "data": { + "version": "2.0.0", + "packageName": "is64bit", + "hash": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==" + } + }, + "npm:isarray": { + "type": "npm", + "name": "npm:isarray", + "data": { + "version": "1.0.0", + "packageName": "isarray", + "hash": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + } + }, + "npm:isbot": { + "type": "npm", + "name": "npm:isbot", + "data": { + "version": "5.1.31", + "packageName": "isbot", + "hash": "sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==" + } + }, + "npm:isexe": { + "type": "npm", + "name": "npm:isexe", + "data": { + "version": "2.0.0", + "packageName": "isexe", + "hash": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + } + }, + "npm:jackspeak": { + "type": "npm", + "name": "npm:jackspeak", + "data": { + "version": "3.4.3", + "packageName": "jackspeak", + "hash": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==" + } + }, + "npm:jest-diff": { + "type": "npm", + "name": "npm:jest-diff", + "data": { + "version": "30.2.0", + "packageName": "jest-diff", + "hash": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==" + } + }, + "npm:jiti": { + "type": "npm", + "name": "npm:jiti", + "data": { + "version": "2.6.1", + "packageName": "jiti", + "hash": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==" + } + }, + "npm:jju": { + "type": "npm", + "name": "npm:jju", + "data": { + "version": "1.4.0", + "packageName": "jju", + "hash": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + } + }, + "npm:js-tokens@4.0.0": { + "type": "npm", + "name": "npm:js-tokens@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "js-tokens", + "hash": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + } + }, + "npm:js-tokens@9.0.1": { + "type": "npm", + "name": "npm:js-tokens@9.0.1", + "data": { + "version": "9.0.1", + "packageName": "js-tokens", + "hash": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" + } + }, + "npm:js-yaml@3.14.1": { + "type": "npm", + "name": "npm:js-yaml@3.14.1", + "data": { + "version": "3.14.1", + "packageName": "js-yaml", + "hash": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" + } + }, + "npm:js-yaml@4.1.1": { + "type": "npm", + "name": "npm:js-yaml@4.1.1", + "data": { + "version": "4.1.1", + "packageName": "js-yaml", + "hash": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==" + } + }, + "npm:jsdom": { + "type": "npm", + "name": "npm:jsdom", + "data": { + "version": "27.2.0", + "packageName": "jsdom", + "hash": "sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==" + } + }, + "npm:jsesc": { + "type": "npm", + "name": "npm:jsesc", + "data": { + "version": "3.1.0", + "packageName": "jsesc", + "hash": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" + } + }, + "npm:json-bigint": { + "type": "npm", + "name": "npm:json-bigint", + "data": { + "version": "1.0.0", + "packageName": "json-bigint", + "hash": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==" + } + }, + "npm:json-buffer": { + "type": "npm", + "name": "npm:json-buffer", + "data": { + "version": "3.0.1", + "packageName": "json-buffer", + "hash": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + } + }, + "npm:json-schema-to-ts": { + "type": "npm", + "name": "npm:json-schema-to-ts", + "data": { + "version": "3.1.1", + "packageName": "json-schema-to-ts", + "hash": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==" + } + }, + "npm:json-schema-traverse@0.4.1": { + "type": "npm", + "name": "npm:json-schema-traverse@0.4.1", + "data": { + "version": "0.4.1", + "packageName": "json-schema-traverse", + "hash": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } + }, + "npm:json-schema-traverse@1.0.0": { + "type": "npm", + "name": "npm:json-schema-traverse@1.0.0", + "data": { + "version": "1.0.0", + "packageName": "json-schema-traverse", + "hash": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + }, + "npm:json-schema": { + "type": "npm", + "name": "npm:json-schema", + "data": { + "version": "0.4.0", + "packageName": "json-schema", + "hash": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + } + }, + "npm:json-stable-stringify-without-jsonify": { + "type": "npm", + "name": "npm:json-stable-stringify-without-jsonify", + "data": { + "version": "1.0.1", + "packageName": "json-stable-stringify-without-jsonify", + "hash": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + } + }, + "npm:json5": { + "type": "npm", + "name": "npm:json5", + "data": { + "version": "2.2.3", + "packageName": "json5", + "hash": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + } + }, + "npm:jsonc-parser": { + "type": "npm", + "name": "npm:jsonc-parser", + "data": { + "version": "3.2.0", + "packageName": "jsonc-parser", + "hash": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + } + }, + "npm:jsonfile@4.0.0": { + "type": "npm", + "name": "npm:jsonfile@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "jsonfile", + "hash": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" + } + }, + "npm:jsonfile@6.2.0": { + "type": "npm", + "name": "npm:jsonfile@6.2.0", + "data": { + "version": "6.2.0", + "packageName": "jsonfile", + "hash": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==" + } + }, + "npm:jsonparse": { + "type": "npm", + "name": "npm:jsonparse", + "data": { + "version": "1.3.1", + "packageName": "jsonparse", + "hash": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" + } + }, + "npm:jwa": { + "type": "npm", + "name": "npm:jwa", + "data": { + "version": "2.0.1", + "packageName": "jwa", + "hash": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==" + } + }, + "npm:jws": { + "type": "npm", + "name": "npm:jws", + "data": { + "version": "4.0.0", + "packageName": "jws", + "hash": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==" + } + }, + "npm:keyv": { + "type": "npm", + "name": "npm:keyv", + "data": { + "version": "4.5.4", + "packageName": "keyv", + "hash": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==" + } + }, + "npm:kleur": { + "type": "npm", + "name": "npm:kleur", + "data": { + "version": "4.1.5", + "packageName": "kleur", + "hash": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + } + }, + "npm:klona": { + "type": "npm", + "name": "npm:klona", + "data": { + "version": "2.0.6", + "packageName": "klona", + "hash": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + } + }, + "npm:knip": { + "type": "npm", + "name": "npm:knip", + "data": { + "version": "5.70.2", + "packageName": "knip", + "hash": "sha512-LI7DbeVnk7h9+FAet5KzzHNdDwJyqDa2+cn4uQfZYTfpuVjEqtGmYD9r5b9JEuOs4eVkf/7sskNhWXxELm3C/Q==" + } + }, + "npm:knitwork": { + "type": "npm", + "name": "npm:knitwork", + "data": { + "version": "1.2.0", + "packageName": "knitwork", + "hash": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==" + } + }, + "npm:kolorist": { + "type": "npm", + "name": "npm:kolorist", + "data": { + "version": "1.8.0", + "packageName": "kolorist", + "hash": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" + } + }, + "npm:lazystream": { + "type": "npm", + "name": "npm:lazystream", + "data": { + "version": "1.0.1", + "packageName": "lazystream", + "hash": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==" + } + }, + "npm:levn": { + "type": "npm", + "name": "npm:levn", + "data": { + "version": "0.4.1", + "packageName": "levn", + "hash": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + } + }, + "npm:lightningcss-android-arm64": { + "type": "npm", + "name": "npm:lightningcss-android-arm64", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-android-arm64", + "hash": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==" + } + }, + "npm:lightningcss-darwin-arm64": { + "type": "npm", + "name": "npm:lightningcss-darwin-arm64", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-darwin-arm64", + "hash": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==" + } + }, + "npm:lightningcss-darwin-x64": { + "type": "npm", + "name": "npm:lightningcss-darwin-x64", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-darwin-x64", + "hash": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==" + } + }, + "npm:lightningcss-freebsd-x64": { + "type": "npm", + "name": "npm:lightningcss-freebsd-x64", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-freebsd-x64", + "hash": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==" + } + }, + "npm:lightningcss-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:lightningcss-linux-arm-gnueabihf", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-arm-gnueabihf", + "hash": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==" + } + }, + "npm:lightningcss-linux-arm64-gnu": { + "type": "npm", + "name": "npm:lightningcss-linux-arm64-gnu", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-arm64-gnu", + "hash": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==" + } + }, + "npm:lightningcss-linux-arm64-musl": { + "type": "npm", + "name": "npm:lightningcss-linux-arm64-musl", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-arm64-musl", + "hash": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==" + } + }, + "npm:lightningcss-linux-x64-gnu": { + "type": "npm", + "name": "npm:lightningcss-linux-x64-gnu", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-x64-gnu", + "hash": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==" + } + }, + "npm:lightningcss-linux-x64-musl": { + "type": "npm", + "name": "npm:lightningcss-linux-x64-musl", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-x64-musl", + "hash": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==" + } + }, + "npm:lightningcss-win32-arm64-msvc": { + "type": "npm", + "name": "npm:lightningcss-win32-arm64-msvc", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-win32-arm64-msvc", + "hash": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==" + } + }, + "npm:lightningcss-win32-x64-msvc": { + "type": "npm", + "name": "npm:lightningcss-win32-x64-msvc", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-win32-x64-msvc", + "hash": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==" + } + }, + "npm:lightningcss": { + "type": "npm", + "name": "npm:lightningcss", + "data": { + "version": "1.30.2", + "packageName": "lightningcss", + "hash": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==" + } + }, + "npm:lilconfig": { + "type": "npm", + "name": "npm:lilconfig", + "data": { + "version": "3.1.3", + "packageName": "lilconfig", + "hash": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" + } + }, + "npm:lines-and-columns": { + "type": "npm", + "name": "npm:lines-and-columns", + "data": { + "version": "2.0.3", + "packageName": "lines-and-columns", + "hash": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==" + } + }, + "npm:linkify-it": { + "type": "npm", + "name": "npm:linkify-it", + "data": { + "version": "5.0.0", + "packageName": "linkify-it", + "hash": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==" + } + }, + "npm:listhen": { + "type": "npm", + "name": "npm:listhen", + "data": { + "version": "1.9.0", + "packageName": "listhen", + "hash": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==" + } + }, + "npm:local-pkg@0.5.1": { + "type": "npm", + "name": "npm:local-pkg@0.5.1", + "data": { + "version": "0.5.1", + "packageName": "local-pkg", + "hash": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==" + } + }, + "npm:local-pkg@1.1.2": { + "type": "npm", + "name": "npm:local-pkg@1.1.2", + "data": { + "version": "1.1.2", + "packageName": "local-pkg", + "hash": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==" + } + }, + "npm:locate-character": { + "type": "npm", + "name": "npm:locate-character", + "data": { + "version": "3.0.0", + "packageName": "locate-character", + "hash": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" + } + }, + "npm:locate-path@5.0.0": { + "type": "npm", + "name": "npm:locate-path@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "locate-path", + "hash": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" + } + }, + "npm:locate-path@6.0.0": { + "type": "npm", + "name": "npm:locate-path@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "locate-path", + "hash": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" + } + }, + "npm:lodash.defaults": { + "type": "npm", + "name": "npm:lodash.defaults", + "data": { + "version": "4.2.0", + "packageName": "lodash.defaults", + "hash": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + } + }, + "npm:lodash.isarguments": { + "type": "npm", + "name": "npm:lodash.isarguments", + "data": { + "version": "3.1.0", + "packageName": "lodash.isarguments", + "hash": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + } + }, + "npm:lodash.merge": { + "type": "npm", + "name": "npm:lodash.merge", + "data": { + "version": "4.6.2", + "packageName": "lodash.merge", + "hash": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + } + }, + "npm:lodash.startcase": { + "type": "npm", + "name": "npm:lodash.startcase", + "data": { + "version": "4.4.0", + "packageName": "lodash.startcase", + "hash": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==" + } + }, + "npm:lodash": { + "type": "npm", + "name": "npm:lodash", + "data": { + "version": "4.17.21", + "packageName": "lodash", + "hash": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + }, + "npm:log-symbols": { + "type": "npm", + "name": "npm:log-symbols", + "data": { + "version": "4.1.0", + "packageName": "log-symbols", + "hash": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==" + } + }, + "npm:longest-streak": { + "type": "npm", + "name": "npm:longest-streak", + "data": { + "version": "3.1.0", + "packageName": "longest-streak", + "hash": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" + } + }, + "npm:lowlight": { + "type": "npm", + "name": "npm:lowlight", + "data": { + "version": "3.3.0", + "packageName": "lowlight", + "hash": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==" + } + }, + "npm:lru-cache@10.4.3": { + "type": "npm", + "name": "npm:lru-cache@10.4.3", + "data": { + "version": "10.4.3", + "packageName": "lru-cache", + "hash": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + } + }, + "npm:lru-cache@11.2.2": { + "type": "npm", + "name": "npm:lru-cache@11.2.2", + "data": { + "version": "11.2.2", + "packageName": "lru-cache", + "hash": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==" + } + }, + "npm:lru-cache@5.1.1": { + "type": "npm", + "name": "npm:lru-cache@5.1.1", + "data": { + "version": "5.1.1", + "packageName": "lru-cache", + "hash": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" + } + }, + "npm:lru-cache@6.0.0": { + "type": "npm", + "name": "npm:lru-cache@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "lru-cache", + "hash": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + } + }, + "npm:lucide-react": { + "type": "npm", + "name": "npm:lucide-react", + "data": { + "version": "0.555.0", + "packageName": "lucide-react", + "hash": "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==" + } + }, + "npm:lunr": { + "type": "npm", + "name": "npm:lunr", + "data": { + "version": "2.3.9", + "packageName": "lunr", + "hash": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + } + }, + "npm:lz-string": { + "type": "npm", + "name": "npm:lz-string", + "data": { + "version": "1.5.0", + "packageName": "lz-string", + "hash": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" + } + }, + "npm:magic-string": { + "type": "npm", + "name": "npm:magic-string", + "data": { + "version": "0.30.21", + "packageName": "magic-string", + "hash": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==" + } + }, + "npm:magicast": { + "type": "npm", + "name": "npm:magicast", + "data": { + "version": "0.5.1", + "packageName": "magicast", + "hash": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==" + } + }, + "npm:markdown-it": { + "type": "npm", + "name": "npm:markdown-it", + "data": { + "version": "14.1.0", + "packageName": "markdown-it", + "hash": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==" + } + }, + "npm:markdown-link-extractor": { + "type": "npm", + "name": "npm:markdown-link-extractor", + "data": { + "version": "4.0.3", + "packageName": "markdown-link-extractor", + "hash": "sha512-aEltJiQ4/oC0h6Jbw/uuATGSHZPkcH8DIunNH1A0e+GSFkvZ6BbBkdvBTVfIV8r6HapCU3yTd0eFdi3ZeM1eAQ==" + } + }, + "npm:markdown-table": { + "type": "npm", + "name": "npm:markdown-table", + "data": { + "version": "3.0.4", + "packageName": "markdown-table", + "hash": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" + } + }, + "npm:marked": { + "type": "npm", + "name": "npm:marked", + "data": { + "version": "17.0.1", + "packageName": "marked", + "hash": "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==" + } + }, + "npm:math-intrinsics": { + "type": "npm", + "name": "npm:math-intrinsics", + "data": { + "version": "1.1.0", + "packageName": "math-intrinsics", + "hash": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + } + }, + "npm:mdast-util-find-and-replace": { + "type": "npm", + "name": "npm:mdast-util-find-and-replace", + "data": { + "version": "3.0.2", + "packageName": "mdast-util-find-and-replace", + "hash": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==" + } + }, + "npm:mdast-util-from-markdown": { + "type": "npm", + "name": "npm:mdast-util-from-markdown", + "data": { + "version": "2.0.2", + "packageName": "mdast-util-from-markdown", + "hash": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==" + } + }, + "npm:mdast-util-gfm-autolink-literal": { + "type": "npm", + "name": "npm:mdast-util-gfm-autolink-literal", + "data": { + "version": "2.0.1", + "packageName": "mdast-util-gfm-autolink-literal", + "hash": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==" + } + }, + "npm:mdast-util-gfm-footnote": { + "type": "npm", + "name": "npm:mdast-util-gfm-footnote", + "data": { + "version": "2.1.0", + "packageName": "mdast-util-gfm-footnote", + "hash": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==" + } + }, + "npm:mdast-util-gfm-strikethrough": { + "type": "npm", + "name": "npm:mdast-util-gfm-strikethrough", + "data": { + "version": "2.0.0", + "packageName": "mdast-util-gfm-strikethrough", + "hash": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==" + } + }, + "npm:mdast-util-gfm-table": { + "type": "npm", + "name": "npm:mdast-util-gfm-table", + "data": { + "version": "2.0.0", + "packageName": "mdast-util-gfm-table", + "hash": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==" + } + }, + "npm:mdast-util-gfm-task-list-item": { + "type": "npm", + "name": "npm:mdast-util-gfm-task-list-item", + "data": { + "version": "2.0.0", + "packageName": "mdast-util-gfm-task-list-item", + "hash": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==" + } + }, + "npm:mdast-util-gfm": { + "type": "npm", + "name": "npm:mdast-util-gfm", + "data": { + "version": "3.1.0", + "packageName": "mdast-util-gfm", + "hash": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==" + } + }, + "npm:mdast-util-mdx-expression": { + "type": "npm", + "name": "npm:mdast-util-mdx-expression", + "data": { + "version": "2.0.1", + "packageName": "mdast-util-mdx-expression", + "hash": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==" + } + }, + "npm:mdast-util-mdx-jsx": { + "type": "npm", + "name": "npm:mdast-util-mdx-jsx", + "data": { + "version": "3.2.0", + "packageName": "mdast-util-mdx-jsx", + "hash": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==" + } + }, + "npm:mdast-util-mdxjs-esm": { + "type": "npm", + "name": "npm:mdast-util-mdxjs-esm", + "data": { + "version": "2.0.1", + "packageName": "mdast-util-mdxjs-esm", + "hash": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==" + } + }, + "npm:mdast-util-phrasing": { + "type": "npm", + "name": "npm:mdast-util-phrasing", + "data": { + "version": "4.1.0", + "packageName": "mdast-util-phrasing", + "hash": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==" + } + }, + "npm:mdast-util-to-hast": { + "type": "npm", + "name": "npm:mdast-util-to-hast", + "data": { + "version": "13.2.0", + "packageName": "mdast-util-to-hast", + "hash": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==" + } + }, + "npm:mdast-util-to-markdown": { + "type": "npm", + "name": "npm:mdast-util-to-markdown", + "data": { + "version": "2.1.2", + "packageName": "mdast-util-to-markdown", + "hash": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==" + } + }, + "npm:mdast-util-to-string": { + "type": "npm", + "name": "npm:mdast-util-to-string", + "data": { + "version": "4.0.0", + "packageName": "mdast-util-to-string", + "hash": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==" + } + }, + "npm:mdn-data": { + "type": "npm", + "name": "npm:mdn-data", + "data": { + "version": "2.12.2", + "packageName": "mdn-data", + "hash": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" + } + }, + "npm:mdurl": { + "type": "npm", + "name": "npm:mdurl", + "data": { + "version": "2.0.0", + "packageName": "mdurl", + "hash": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + } + }, + "npm:meow": { + "type": "npm", + "name": "npm:meow", + "data": { + "version": "12.1.1", + "packageName": "meow", + "hash": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==" + } + }, + "npm:merge-anything": { + "type": "npm", + "name": "npm:merge-anything", + "data": { + "version": "5.1.7", + "packageName": "merge-anything", + "hash": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==" + } + }, + "npm:merge-stream": { + "type": "npm", + "name": "npm:merge-stream", + "data": { + "version": "2.0.0", + "packageName": "merge-stream", + "hash": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + } + }, + "npm:merge2": { + "type": "npm", + "name": "npm:merge2", + "data": { + "version": "1.4.1", + "packageName": "merge2", + "hash": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + } + }, + "npm:micromark-core-commonmark": { + "type": "npm", + "name": "npm:micromark-core-commonmark", + "data": { + "version": "2.0.3", + "packageName": "micromark-core-commonmark", + "hash": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==" + } + }, + "npm:micromark-extension-gfm-autolink-literal": { + "type": "npm", + "name": "npm:micromark-extension-gfm-autolink-literal", + "data": { + "version": "2.1.0", + "packageName": "micromark-extension-gfm-autolink-literal", + "hash": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==" + } + }, + "npm:micromark-extension-gfm-footnote": { + "type": "npm", + "name": "npm:micromark-extension-gfm-footnote", + "data": { + "version": "2.1.0", + "packageName": "micromark-extension-gfm-footnote", + "hash": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==" + } + }, + "npm:micromark-extension-gfm-strikethrough": { + "type": "npm", + "name": "npm:micromark-extension-gfm-strikethrough", + "data": { + "version": "2.1.0", + "packageName": "micromark-extension-gfm-strikethrough", + "hash": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==" + } + }, + "npm:micromark-extension-gfm-table": { + "type": "npm", + "name": "npm:micromark-extension-gfm-table", + "data": { + "version": "2.1.1", + "packageName": "micromark-extension-gfm-table", + "hash": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==" + } + }, + "npm:micromark-extension-gfm-tagfilter": { + "type": "npm", + "name": "npm:micromark-extension-gfm-tagfilter", + "data": { + "version": "2.0.0", + "packageName": "micromark-extension-gfm-tagfilter", + "hash": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==" + } + }, + "npm:micromark-extension-gfm-task-list-item": { + "type": "npm", + "name": "npm:micromark-extension-gfm-task-list-item", + "data": { + "version": "2.1.0", + "packageName": "micromark-extension-gfm-task-list-item", + "hash": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==" + } + }, + "npm:micromark-extension-gfm": { + "type": "npm", + "name": "npm:micromark-extension-gfm", + "data": { + "version": "3.0.0", + "packageName": "micromark-extension-gfm", + "hash": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==" + } + }, + "npm:micromark-factory-destination": { + "type": "npm", + "name": "npm:micromark-factory-destination", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-destination", + "hash": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==" + } + }, + "npm:micromark-factory-label": { + "type": "npm", + "name": "npm:micromark-factory-label", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-label", + "hash": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==" + } + }, + "npm:micromark-factory-space": { + "type": "npm", + "name": "npm:micromark-factory-space", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-space", + "hash": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==" + } + }, + "npm:micromark-factory-title": { + "type": "npm", + "name": "npm:micromark-factory-title", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-title", + "hash": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==" + } + }, + "npm:micromark-factory-whitespace": { + "type": "npm", + "name": "npm:micromark-factory-whitespace", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-whitespace", + "hash": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==" + } + }, + "npm:micromark-util-character": { + "type": "npm", + "name": "npm:micromark-util-character", + "data": { + "version": "2.1.1", + "packageName": "micromark-util-character", + "hash": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==" + } + }, + "npm:micromark-util-chunked": { + "type": "npm", + "name": "npm:micromark-util-chunked", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-chunked", + "hash": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==" + } + }, + "npm:micromark-util-classify-character": { + "type": "npm", + "name": "npm:micromark-util-classify-character", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-classify-character", + "hash": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==" + } + }, + "npm:micromark-util-combine-extensions": { + "type": "npm", + "name": "npm:micromark-util-combine-extensions", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-combine-extensions", + "hash": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==" + } + }, + "npm:micromark-util-decode-numeric-character-reference": { + "type": "npm", + "name": "npm:micromark-util-decode-numeric-character-reference", + "data": { + "version": "2.0.2", + "packageName": "micromark-util-decode-numeric-character-reference", + "hash": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==" + } + }, + "npm:micromark-util-decode-string": { + "type": "npm", + "name": "npm:micromark-util-decode-string", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-decode-string", + "hash": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==" + } + }, + "npm:micromark-util-encode": { + "type": "npm", + "name": "npm:micromark-util-encode", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-encode", + "hash": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==" + } + }, + "npm:micromark-util-html-tag-name": { + "type": "npm", + "name": "npm:micromark-util-html-tag-name", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-html-tag-name", + "hash": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==" + } + }, + "npm:micromark-util-normalize-identifier": { + "type": "npm", + "name": "npm:micromark-util-normalize-identifier", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-normalize-identifier", + "hash": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==" + } + }, + "npm:micromark-util-resolve-all": { + "type": "npm", + "name": "npm:micromark-util-resolve-all", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-resolve-all", + "hash": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==" + } + }, + "npm:micromark-util-sanitize-uri": { + "type": "npm", + "name": "npm:micromark-util-sanitize-uri", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-sanitize-uri", + "hash": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==" + } + }, + "npm:micromark-util-subtokenize": { + "type": "npm", + "name": "npm:micromark-util-subtokenize", + "data": { + "version": "2.1.0", + "packageName": "micromark-util-subtokenize", + "hash": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==" + } + }, + "npm:micromark-util-symbol": { + "type": "npm", + "name": "npm:micromark-util-symbol", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-symbol", + "hash": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" + } + }, + "npm:micromark-util-types": { + "type": "npm", + "name": "npm:micromark-util-types", + "data": { + "version": "2.0.2", + "packageName": "micromark-util-types", + "hash": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" + } + }, + "npm:micromark": { + "type": "npm", + "name": "npm:micromark", + "data": { + "version": "4.0.2", + "packageName": "micromark", + "hash": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==" + } + }, + "npm:micromatch": { + "type": "npm", + "name": "npm:micromatch", + "data": { + "version": "4.0.8", + "packageName": "micromatch", + "hash": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==" + } + }, + "npm:mime-db@1.52.0": { + "type": "npm", + "name": "npm:mime-db@1.52.0", + "data": { + "version": "1.52.0", + "packageName": "mime-db", + "hash": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + } + }, + "npm:mime-db@1.54.0": { + "type": "npm", + "name": "npm:mime-db@1.54.0", + "data": { + "version": "1.54.0", + "packageName": "mime-db", + "hash": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" + } + }, + "npm:mime-types@2.1.35": { + "type": "npm", + "name": "npm:mime-types@2.1.35", + "data": { + "version": "2.1.35", + "packageName": "mime-types", + "hash": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + } + }, + "npm:mime-types@3.0.1": { + "type": "npm", + "name": "npm:mime-types@3.0.1", + "data": { + "version": "3.0.1", + "packageName": "mime-types", + "hash": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==" + } + }, + "npm:mime@3.0.0": { + "type": "npm", + "name": "npm:mime@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "mime", + "hash": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" + } + }, + "npm:mime@4.1.0": { + "type": "npm", + "name": "npm:mime@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "mime", + "hash": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==" + } + }, + "npm:mimic-fn@2.1.0": { + "type": "npm", + "name": "npm:mimic-fn@2.1.0", + "data": { + "version": "2.1.0", + "packageName": "mimic-fn", + "hash": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + }, + "npm:mimic-fn@4.0.0": { + "type": "npm", + "name": "npm:mimic-fn@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "mimic-fn", + "hash": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + } + }, + "npm:min-indent": { + "type": "npm", + "name": "npm:min-indent", + "data": { + "version": "1.0.1", + "packageName": "min-indent", + "hash": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + } + }, + "npm:minimatch@3.0.8": { + "type": "npm", + "name": "npm:minimatch@3.0.8", + "data": { + "version": "3.0.8", + "packageName": "minimatch", + "hash": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==" + } + }, + "npm:minimatch@3.1.2": { + "type": "npm", + "name": "npm:minimatch@3.1.2", + "data": { + "version": "3.1.2", + "packageName": "minimatch", + "hash": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + } + }, + "npm:minimatch@5.1.6": { + "type": "npm", + "name": "npm:minimatch@5.1.6", + "data": { + "version": "5.1.6", + "packageName": "minimatch", + "hash": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==" + } + }, + "npm:minimatch@9.0.3": { + "type": "npm", + "name": "npm:minimatch@9.0.3", + "data": { + "version": "9.0.3", + "packageName": "minimatch", + "hash": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==" + } + }, + "npm:minimatch@9.0.5": { + "type": "npm", + "name": "npm:minimatch@9.0.5", + "data": { + "version": "9.0.5", + "packageName": "minimatch", + "hash": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==" + } + }, + "npm:minimist": { + "type": "npm", + "name": "npm:minimist", + "data": { + "version": "1.2.8", + "packageName": "minimist", + "hash": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + } + }, + "npm:minipass": { + "type": "npm", + "name": "npm:minipass", + "data": { + "version": "7.1.2", + "packageName": "minipass", + "hash": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + }, + "npm:minizlib": { + "type": "npm", + "name": "npm:minizlib", + "data": { + "version": "3.1.0", + "packageName": "minizlib", + "hash": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==" + } + }, + "npm:mlly": { + "type": "npm", + "name": "npm:mlly", + "data": { + "version": "1.8.0", + "packageName": "mlly", + "hash": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==" + } + }, + "npm:mri": { + "type": "npm", + "name": "npm:mri", + "data": { + "version": "1.2.0", + "packageName": "mri", + "hash": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + } + }, + "npm:ms": { + "type": "npm", + "name": "npm:ms", + "data": { + "version": "2.1.3", + "packageName": "ms", + "hash": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + }, + "npm:muggle-string": { + "type": "npm", + "name": "npm:muggle-string", + "data": { + "version": "0.4.1", + "packageName": "muggle-string", + "hash": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" + } + }, + "npm:nanoid@3.3.11": { + "type": "npm", + "name": "npm:nanoid@3.3.11", + "data": { + "version": "3.3.11", + "packageName": "nanoid", + "hash": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" + } + }, + "npm:nanoid@5.1.6": { + "type": "npm", + "name": "npm:nanoid@5.1.6", + "data": { + "version": "5.1.6", + "packageName": "nanoid", + "hash": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==" + } + }, + "npm:nanospinner": { + "type": "npm", + "name": "npm:nanospinner", + "data": { + "version": "1.2.2", + "packageName": "nanospinner", + "hash": "sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==" + } + }, + "npm:napi-postinstall": { + "type": "npm", + "name": "npm:napi-postinstall", + "data": { + "version": "0.3.4", + "packageName": "napi-postinstall", + "hash": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==" + } + }, + "npm:natural-compare": { + "type": "npm", + "name": "npm:natural-compare", + "data": { + "version": "1.4.0", + "packageName": "natural-compare", + "hash": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + } + }, + "npm:nitropack": { + "type": "npm", + "name": "npm:nitropack", + "data": { + "version": "2.12.9", + "packageName": "nitropack", + "hash": "sha512-t6qqNBn2UDGMWogQuORjbL2UPevB8PvIPsPHmqvWpeGOlPr4P8Oc5oA8t3wFwGmaolM2M/s2SwT23nx9yARmOg==" + } + }, + "npm:node-addon-api": { + "type": "npm", + "name": "npm:node-addon-api", + "data": { + "version": "7.1.1", + "packageName": "node-addon-api", + "hash": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + } + }, + "npm:node-domexception": { + "type": "npm", + "name": "npm:node-domexception", + "data": { + "version": "1.0.0", + "packageName": "node-domexception", + "hash": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + } + }, + "npm:node-fetch-native": { + "type": "npm", + "name": "npm:node-fetch-native", + "data": { + "version": "1.6.7", + "packageName": "node-fetch-native", + "hash": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==" + } + }, + "npm:node-fetch@2.7.0": { + "type": "npm", + "name": "npm:node-fetch@2.7.0", + "data": { + "version": "2.7.0", + "packageName": "node-fetch", + "hash": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==" + } + }, + "npm:node-fetch@3.3.2": { + "type": "npm", + "name": "npm:node-fetch@3.3.2", + "data": { + "version": "3.3.2", + "packageName": "node-fetch", + "hash": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==" + } + }, + "npm:node-forge": { + "type": "npm", + "name": "npm:node-forge", + "data": { + "version": "1.3.1", + "packageName": "node-forge", + "hash": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + } + }, + "npm:node-gyp-build": { + "type": "npm", + "name": "npm:node-gyp-build", + "data": { + "version": "4.8.4", + "packageName": "node-gyp-build", + "hash": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" + } + }, + "npm:node-machine-id": { + "type": "npm", + "name": "npm:node-machine-id", + "data": { + "version": "1.1.12", + "packageName": "node-machine-id", + "hash": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" + } + }, + "npm:node-mock-http": { + "type": "npm", + "name": "npm:node-mock-http", + "data": { + "version": "1.0.3", + "packageName": "node-mock-http", + "hash": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==" + } + }, + "npm:node-releases": { + "type": "npm", + "name": "npm:node-releases", + "data": { + "version": "2.0.27", + "packageName": "node-releases", + "hash": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" + } + }, + "npm:nopt": { + "type": "npm", + "name": "npm:nopt", + "data": { + "version": "8.1.0", + "packageName": "nopt", + "hash": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==" + } + }, + "npm:normalize-path": { + "type": "npm", + "name": "npm:normalize-path", + "data": { + "version": "3.0.0", + "packageName": "normalize-path", + "hash": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + }, + "npm:npm-run-path@4.0.1": { + "type": "npm", + "name": "npm:npm-run-path@4.0.1", + "data": { + "version": "4.0.1", + "packageName": "npm-run-path", + "hash": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" + } + }, + "npm:npm-run-path@5.3.0": { + "type": "npm", + "name": "npm:npm-run-path@5.3.0", + "data": { + "version": "5.3.0", + "packageName": "npm-run-path", + "hash": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==" + } + }, + "npm:nth-check": { + "type": "npm", + "name": "npm:nth-check", + "data": { + "version": "2.1.1", + "packageName": "nth-check", + "hash": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" + } + }, + "npm:nx": { + "type": "npm", + "name": "npm:nx", + "data": { + "version": "22.1.2", + "packageName": "nx", + "hash": "sha512-sD1CoYFPMsoiRG095qUhEhzL6ZbSY1a68dw9gJNRg60gM06O7l6X2Kyu+dEEwIZ5PutD82Pt4/S2nzK6mdhfew==" + } + }, + "npm:nypm": { + "type": "npm", + "name": "npm:nypm", + "data": { + "version": "0.6.2", + "packageName": "nypm", + "hash": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==" + } + }, + "npm:obug": { + "type": "npm", + "name": "npm:obug", + "data": { + "version": "2.1.1", + "packageName": "obug", + "hash": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==" + } + }, + "npm:ofetch": { + "type": "npm", + "name": "npm:ofetch", + "data": { + "version": "1.5.0", + "packageName": "ofetch", + "hash": "sha512-A7llJ7eZyziA5xq9//3ZurA8OhFqtS99K5/V1sLBJ5j137CM/OAjlbA/TEJXBuOWwOfLqih+oH5U3ran4za1FQ==" + } + }, + "npm:ohash": { + "type": "npm", + "name": "npm:ohash", + "data": { + "version": "2.0.11", + "packageName": "ohash", + "hash": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + } + }, + "npm:ollama": { + "type": "npm", + "name": "npm:ollama", + "data": { + "version": "0.6.3", + "packageName": "ollama", + "hash": "sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==" + } + }, + "npm:on-finished": { + "type": "npm", + "name": "npm:on-finished", + "data": { + "version": "2.4.1", + "packageName": "on-finished", + "hash": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==" + } + }, + "npm:once": { + "type": "npm", + "name": "npm:once", + "data": { + "version": "1.4.0", + "packageName": "once", + "hash": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + } + }, + "npm:onetime@5.1.2": { + "type": "npm", + "name": "npm:onetime@5.1.2", + "data": { + "version": "5.1.2", + "packageName": "onetime", + "hash": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" + } + }, + "npm:onetime@6.0.0": { + "type": "npm", + "name": "npm:onetime@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "onetime", + "hash": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==" + } + }, + "npm:open": { + "type": "npm", + "name": "npm:open", + "data": { + "version": "8.4.2", + "packageName": "open", + "hash": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==" + } + }, + "npm:openai": { + "type": "npm", + "name": "npm:openai", + "data": { + "version": "6.9.1", + "packageName": "openai", + "hash": "sha512-vQ5Rlt0ZgB3/BNmTa7bIijYFhz3YBceAA3Z4JuoMSBftBF9YqFHIEhZakSs+O/Ad7EaoEimZvHxD5ylRjN11Lg==" + } + }, + "npm:optionator": { + "type": "npm", + "name": "npm:optionator", + "data": { + "version": "0.9.4", + "packageName": "optionator", + "hash": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==" + } + }, + "npm:ora": { + "type": "npm", + "name": "npm:ora", + "data": { + "version": "5.3.0", + "packageName": "ora", + "hash": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==" + } + }, + "npm:outdent": { + "type": "npm", + "name": "npm:outdent", + "data": { + "version": "0.5.0", + "packageName": "outdent", + "hash": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==" + } + }, + "npm:oxc-resolver": { + "type": "npm", + "name": "npm:oxc-resolver", + "data": { + "version": "11.14.0", + "packageName": "oxc-resolver", + "hash": "sha512-i4wNrqhOd+4YdHJfHglHtFiqqSxXuzFA+RUqmmWN1aMD3r1HqUSrIhw17tSO4jwKfhLs9uw1wzFPmvMsWacStg==" + } + }, + "npm:p-filter": { + "type": "npm", + "name": "npm:p-filter", + "data": { + "version": "2.1.0", + "packageName": "p-filter", + "hash": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==" + } + }, + "npm:p-limit@2.3.0": { + "type": "npm", + "name": "npm:p-limit@2.3.0", + "data": { + "version": "2.3.0", + "packageName": "p-limit", + "hash": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + } + }, + "npm:p-limit@3.1.0": { + "type": "npm", + "name": "npm:p-limit@3.1.0", + "data": { + "version": "3.1.0", + "packageName": "p-limit", + "hash": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + } + }, + "npm:p-locate@4.1.0": { + "type": "npm", + "name": "npm:p-locate@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "p-locate", + "hash": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" + } + }, + "npm:p-locate@5.0.0": { + "type": "npm", + "name": "npm:p-locate@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "p-locate", + "hash": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" + } + }, + "npm:p-map": { + "type": "npm", + "name": "npm:p-map", + "data": { + "version": "2.1.0", + "packageName": "p-map", + "hash": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + }, + "npm:p-try": { + "type": "npm", + "name": "npm:p-try", + "data": { + "version": "2.2.0", + "packageName": "p-try", + "hash": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } + }, + "npm:package-json-from-dist": { + "type": "npm", + "name": "npm:package-json-from-dist", + "data": { + "version": "1.0.1", + "packageName": "package-json-from-dist", + "hash": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + } + }, + "npm:package-manager-detector@0.2.11": { + "type": "npm", + "name": "npm:package-manager-detector@0.2.11", + "data": { + "version": "0.2.11", + "packageName": "package-manager-detector", + "hash": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==" + } + }, + "npm:package-manager-detector@1.5.0": { + "type": "npm", + "name": "npm:package-manager-detector@1.5.0", + "data": { + "version": "1.5.0", + "packageName": "package-manager-detector", + "hash": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==" + } + }, + "npm:parent-module": { + "type": "npm", + "name": "npm:parent-module", + "data": { + "version": "1.0.1", + "packageName": "parent-module", + "hash": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + } + }, + "npm:parse-entities": { + "type": "npm", + "name": "npm:parse-entities", + "data": { + "version": "4.0.2", + "packageName": "parse-entities", + "hash": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==" + } + }, + "npm:parse5-htmlparser2-tree-adapter": { + "type": "npm", + "name": "npm:parse5-htmlparser2-tree-adapter", + "data": { + "version": "7.1.0", + "packageName": "parse5-htmlparser2-tree-adapter", + "hash": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==" + } + }, + "npm:parse5-parser-stream": { + "type": "npm", + "name": "npm:parse5-parser-stream", + "data": { + "version": "7.1.2", + "packageName": "parse5-parser-stream", + "hash": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==" + } + }, + "npm:parse5@7.3.0": { + "type": "npm", + "name": "npm:parse5@7.3.0", + "data": { + "version": "7.3.0", + "packageName": "parse5", + "hash": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==" + } + }, + "npm:parse5@8.0.0": { + "type": "npm", + "name": "npm:parse5@8.0.0", + "data": { + "version": "8.0.0", + "packageName": "parse5", + "hash": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==" + } + }, + "npm:parseurl": { + "type": "npm", + "name": "npm:parseurl", + "data": { + "version": "1.3.3", + "packageName": "parseurl", + "hash": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } + }, + "npm:partial-json": { + "type": "npm", + "name": "npm:partial-json", + "data": { + "version": "0.1.7", + "packageName": "partial-json", + "hash": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==" + } + }, + "npm:path-browserify": { + "type": "npm", + "name": "npm:path-browserify", + "data": { + "version": "1.0.1", + "packageName": "path-browserify", + "hash": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + } + }, + "npm:path-exists": { + "type": "npm", + "name": "npm:path-exists", + "data": { + "version": "4.0.0", + "packageName": "path-exists", + "hash": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } + }, + "npm:path-key@3.1.1": { + "type": "npm", + "name": "npm:path-key@3.1.1", + "data": { + "version": "3.1.1", + "packageName": "path-key", + "hash": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + } + }, + "npm:path-key@4.0.0": { + "type": "npm", + "name": "npm:path-key@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "path-key", + "hash": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + } + }, + "npm:path-parse": { + "type": "npm", + "name": "npm:path-parse", + "data": { + "version": "1.0.7", + "packageName": "path-parse", + "hash": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + } + }, + "npm:path-scurry": { + "type": "npm", + "name": "npm:path-scurry", + "data": { + "version": "1.11.1", + "packageName": "path-scurry", + "hash": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==" + } + }, + "npm:path-type@4.0.0": { + "type": "npm", + "name": "npm:path-type@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "path-type", + "hash": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + } + }, + "npm:path-type@6.0.0": { + "type": "npm", + "name": "npm:path-type@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "path-type", + "hash": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==" + } + }, + "npm:pathe@1.1.2": { + "type": "npm", + "name": "npm:pathe@1.1.2", + "data": { + "version": "1.1.2", + "packageName": "pathe", + "hash": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + } + }, + "npm:pathe@2.0.3": { + "type": "npm", + "name": "npm:pathe@2.0.3", + "data": { + "version": "2.0.3", + "packageName": "pathe", + "hash": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + } + }, + "npm:perfect-debounce": { + "type": "npm", + "name": "npm:perfect-debounce", + "data": { + "version": "2.0.0", + "packageName": "perfect-debounce", + "hash": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==" + } + }, + "npm:picocolors": { + "type": "npm", + "name": "npm:picocolors", + "data": { + "version": "1.1.1", + "packageName": "picocolors", + "hash": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + } + }, + "npm:picomatch@2.3.1": { + "type": "npm", + "name": "npm:picomatch@2.3.1", + "data": { + "version": "2.3.1", + "packageName": "picomatch", + "hash": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + }, + "npm:picomatch@4.0.3": { + "type": "npm", + "name": "npm:picomatch@4.0.3", + "data": { + "version": "4.0.3", + "packageName": "picomatch", + "hash": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + } + }, + "npm:pify": { + "type": "npm", + "name": "npm:pify", + "data": { + "version": "4.0.1", + "packageName": "pify", + "hash": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + }, + "npm:pkg-types@1.3.1": { + "type": "npm", + "name": "npm:pkg-types@1.3.1", + "data": { + "version": "1.3.1", + "packageName": "pkg-types", + "hash": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==" + } + }, + "npm:pkg-types@2.3.0": { + "type": "npm", + "name": "npm:pkg-types@2.3.0", + "data": { + "version": "2.3.0", + "packageName": "pkg-types", + "hash": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==" + } + }, + "npm:postcss": { + "type": "npm", + "name": "npm:postcss", + "data": { + "version": "8.5.6", + "packageName": "postcss", + "hash": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==" + } + }, + "npm:prelude-ls": { + "type": "npm", + "name": "npm:prelude-ls", + "data": { + "version": "1.2.1", + "packageName": "prelude-ls", + "hash": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + } + }, + "npm:premove": { + "type": "npm", + "name": "npm:premove", + "data": { + "version": "4.0.0", + "packageName": "premove", + "hash": "sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==" + } + }, + "npm:prettier-plugin-svelte": { + "type": "npm", + "name": "npm:prettier-plugin-svelte", + "data": { + "version": "3.4.0", + "packageName": "prettier-plugin-svelte", + "hash": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==" + } + }, + "npm:prettier@2.8.8": { + "type": "npm", + "name": "npm:prettier@2.8.8", + "data": { + "version": "2.8.8", + "packageName": "prettier", + "hash": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" + } + }, + "npm:prettier": { + "type": "npm", + "name": "npm:prettier", + "data": { + "version": "3.6.2", + "packageName": "prettier", + "hash": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==" + } + }, + "npm:pretty-bytes": { + "type": "npm", + "name": "npm:pretty-bytes", + "data": { + "version": "7.1.0", + "packageName": "pretty-bytes", + "hash": "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==" + } + }, + "npm:pretty-format@27.5.1": { + "type": "npm", + "name": "npm:pretty-format@27.5.1", + "data": { + "version": "27.5.1", + "packageName": "pretty-format", + "hash": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==" + } + }, + "npm:pretty-format@30.2.0": { + "type": "npm", + "name": "npm:pretty-format@30.2.0", + "data": { + "version": "30.2.0", + "packageName": "pretty-format", + "hash": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==" + } + }, + "npm:process-nextick-args": { + "type": "npm", + "name": "npm:process-nextick-args", + "data": { + "version": "2.0.1", + "packageName": "process-nextick-args", + "hash": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + } + }, + "npm:process": { + "type": "npm", + "name": "npm:process", + "data": { + "version": "0.11.10", + "packageName": "process", + "hash": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + } + }, + "npm:property-information@6.5.0": { + "type": "npm", + "name": "npm:property-information@6.5.0", + "data": { + "version": "6.5.0", + "packageName": "property-information", + "hash": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" + } + }, + "npm:property-information@7.1.0": { + "type": "npm", + "name": "npm:property-information@7.1.0", + "data": { + "version": "7.1.0", + "packageName": "property-information", + "hash": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==" + } + }, + "npm:proxy-from-env": { + "type": "npm", + "name": "npm:proxy-from-env", + "data": { + "version": "1.1.0", + "packageName": "proxy-from-env", + "hash": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + } + }, + "npm:publint": { + "type": "npm", + "name": "npm:publint", + "data": { + "version": "0.3.15", + "packageName": "publint", + "hash": "sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A==" + } + }, + "npm:punycode.js": { + "type": "npm", + "name": "npm:punycode.js", + "data": { + "version": "2.3.1", + "packageName": "punycode.js", + "hash": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" + } + }, + "npm:punycode": { + "type": "npm", + "name": "npm:punycode", + "data": { + "version": "2.3.1", + "packageName": "punycode", + "hash": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + } + }, + "npm:quansync": { + "type": "npm", + "name": "npm:quansync", + "data": { + "version": "0.2.11", + "packageName": "quansync", + "hash": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==" + } + }, + "npm:queue-microtask": { + "type": "npm", + "name": "npm:queue-microtask", + "data": { + "version": "1.2.3", + "packageName": "queue-microtask", + "hash": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + } + }, + "npm:radix3": { + "type": "npm", + "name": "npm:radix3", + "data": { + "version": "1.1.2", + "packageName": "radix3", + "hash": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" + } + }, + "npm:randombytes": { + "type": "npm", + "name": "npm:randombytes", + "data": { + "version": "2.1.0", + "packageName": "randombytes", + "hash": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" + } + }, + "npm:range-parser": { + "type": "npm", + "name": "npm:range-parser", + "data": { + "version": "1.2.1", + "packageName": "range-parser", + "hash": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + } + }, + "npm:rc9": { + "type": "npm", + "name": "npm:rc9", + "data": { + "version": "2.1.2", + "packageName": "rc9", + "hash": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==" + } + }, + "npm:react-dom": { + "type": "npm", + "name": "npm:react-dom", + "data": { + "version": "19.2.0", + "packageName": "react-dom", + "hash": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==" + } + }, + "npm:react-is@17.0.2": { + "type": "npm", + "name": "npm:react-is@17.0.2", + "data": { + "version": "17.0.2", + "packageName": "react-is", + "hash": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + }, + "npm:react-is@18.3.1": { + "type": "npm", + "name": "npm:react-is@18.3.1", + "data": { + "version": "18.3.1", + "packageName": "react-is", + "hash": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + }, + "npm:react-markdown": { + "type": "npm", + "name": "npm:react-markdown", + "data": { + "version": "10.1.0", + "packageName": "react-markdown", + "hash": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==" + } + }, + "npm:react-refresh": { + "type": "npm", + "name": "npm:react-refresh", + "data": { + "version": "0.18.0", + "packageName": "react-refresh", + "hash": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==" + } + }, + "npm:react": { + "type": "npm", + "name": "npm:react", + "data": { + "version": "19.2.0", + "packageName": "react", + "hash": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==" + } + }, + "npm:read-yaml-file": { + "type": "npm", + "name": "npm:read-yaml-file", + "data": { + "version": "1.1.0", + "packageName": "read-yaml-file", + "hash": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==" + } + }, + "npm:readable-stream@2.3.8": { + "type": "npm", + "name": "npm:readable-stream@2.3.8", + "data": { + "version": "2.3.8", + "packageName": "readable-stream", + "hash": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" + } + }, + "npm:readable-stream@3.6.2": { + "type": "npm", + "name": "npm:readable-stream@3.6.2", + "data": { + "version": "3.6.2", + "packageName": "readable-stream", + "hash": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" + } + }, + "npm:readable-stream@4.7.0": { + "type": "npm", + "name": "npm:readable-stream@4.7.0", + "data": { + "version": "4.7.0", + "packageName": "readable-stream", + "hash": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==" + } + }, + "npm:readdir-glob": { + "type": "npm", + "name": "npm:readdir-glob", + "data": { + "version": "1.1.3", + "packageName": "readdir-glob", + "hash": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==" + } + }, + "npm:readdirp@3.6.0": { + "type": "npm", + "name": "npm:readdirp@3.6.0", + "data": { + "version": "3.6.0", + "packageName": "readdirp", + "hash": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" + } + }, + "npm:readdirp@4.1.2": { + "type": "npm", + "name": "npm:readdirp@4.1.2", + "data": { + "version": "4.1.2", + "packageName": "readdirp", + "hash": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" + } + }, + "npm:recast": { + "type": "npm", + "name": "npm:recast", + "data": { + "version": "0.23.11", + "packageName": "recast", + "hash": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==" + } + }, + "npm:redent": { + "type": "npm", + "name": "npm:redent", + "data": { + "version": "3.0.0", + "packageName": "redent", + "hash": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==" + } + }, + "npm:redis-errors": { + "type": "npm", + "name": "npm:redis-errors", + "data": { + "version": "1.2.0", + "packageName": "redis-errors", + "hash": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" + } + }, + "npm:redis-parser": { + "type": "npm", + "name": "npm:redis-parser", + "data": { + "version": "3.0.0", + "packageName": "redis-parser", + "hash": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==" + } + }, + "npm:rehype-highlight": { + "type": "npm", + "name": "npm:rehype-highlight", + "data": { + "version": "7.0.2", + "packageName": "rehype-highlight", + "hash": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==" + } + }, + "npm:rehype-raw": { + "type": "npm", + "name": "npm:rehype-raw", + "data": { + "version": "7.0.0", + "packageName": "rehype-raw", + "hash": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==" + } + }, + "npm:rehype-sanitize": { + "type": "npm", + "name": "npm:rehype-sanitize", + "data": { + "version": "6.0.0", + "packageName": "rehype-sanitize", + "hash": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==" + } + }, + "npm:remark-gfm": { + "type": "npm", + "name": "npm:remark-gfm", + "data": { + "version": "4.0.1", + "packageName": "remark-gfm", + "hash": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==" + } + }, + "npm:remark-parse": { + "type": "npm", + "name": "npm:remark-parse", + "data": { + "version": "11.0.0", + "packageName": "remark-parse", + "hash": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==" + } + }, + "npm:remark-rehype": { + "type": "npm", + "name": "npm:remark-rehype", + "data": { + "version": "11.1.2", + "packageName": "remark-rehype", + "hash": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==" + } + }, + "npm:remark-stringify": { + "type": "npm", + "name": "npm:remark-stringify", + "data": { + "version": "11.0.0", + "packageName": "remark-stringify", + "hash": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==" + } + }, + "npm:require-directory": { + "type": "npm", + "name": "npm:require-directory", + "data": { + "version": "2.1.1", + "packageName": "require-directory", + "hash": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + } + }, + "npm:require-from-string": { + "type": "npm", + "name": "npm:require-from-string", + "data": { + "version": "2.0.2", + "packageName": "require-from-string", + "hash": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + } + }, + "npm:resolve-from@4.0.0": { + "type": "npm", + "name": "npm:resolve-from@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "resolve-from", + "hash": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + }, + "npm:resolve-from@5.0.0": { + "type": "npm", + "name": "npm:resolve-from@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "resolve-from", + "hash": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + }, + "npm:resolve-pkg-maps": { + "type": "npm", + "name": "npm:resolve-pkg-maps", + "data": { + "version": "1.0.0", + "packageName": "resolve-pkg-maps", + "hash": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" + } + }, + "npm:resolve.exports": { + "type": "npm", + "name": "npm:resolve.exports", + "data": { + "version": "2.0.3", + "packageName": "resolve.exports", + "hash": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==" + } + }, + "npm:resolve": { + "type": "npm", + "name": "npm:resolve", + "data": { + "version": "1.22.11", + "packageName": "resolve", + "hash": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==" + } + }, + "npm:restore-cursor": { + "type": "npm", + "name": "npm:restore-cursor", + "data": { + "version": "3.1.0", + "packageName": "restore-cursor", + "hash": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==" + } + }, + "npm:reusify": { + "type": "npm", + "name": "npm:reusify", + "data": { + "version": "1.1.0", + "packageName": "reusify", + "hash": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" + } + }, + "npm:rimraf": { + "type": "npm", + "name": "npm:rimraf", + "data": { + "version": "5.0.10", + "packageName": "rimraf", + "hash": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==" + } + }, + "npm:rolldown": { + "type": "npm", + "name": "npm:rolldown", + "data": { + "version": "1.0.0-beta.51", + "packageName": "rolldown", + "hash": "sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==" + } + }, + "npm:rollup-plugin-preserve-directives": { + "type": "npm", + "name": "npm:rollup-plugin-preserve-directives", + "data": { + "version": "0.4.0", + "packageName": "rollup-plugin-preserve-directives", + "hash": "sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==" + } + }, + "npm:rollup-plugin-visualizer": { + "type": "npm", + "name": "npm:rollup-plugin-visualizer", + "data": { + "version": "6.0.5", + "packageName": "rollup-plugin-visualizer", + "hash": "sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==" + } + }, + "npm:rollup": { + "type": "npm", + "name": "npm:rollup", + "data": { + "version": "4.53.3", + "packageName": "rollup", + "hash": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==" + } + }, + "npm:rou3": { + "type": "npm", + "name": "npm:rou3", + "data": { + "version": "0.7.10", + "packageName": "rou3", + "hash": "sha512-aoFj6f7MJZ5muJ+Of79nrhs9N3oLGqi2VEMe94Zbkjb6Wupha46EuoYgpWSOZlXww3bbd8ojgXTAA2mzimX5Ww==" + } + }, + "npm:run-parallel": { + "type": "npm", + "name": "npm:run-parallel", + "data": { + "version": "1.2.0", + "packageName": "run-parallel", + "hash": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + } + }, + "npm:sade": { + "type": "npm", + "name": "npm:sade", + "data": { + "version": "1.8.1", + "packageName": "sade", + "hash": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==" + } + }, + "npm:safe-buffer@5.1.2": { + "type": "npm", + "name": "npm:safe-buffer@5.1.2", + "data": { + "version": "5.1.2", + "packageName": "safe-buffer", + "hash": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + }, + "npm:safe-buffer@5.2.1": { + "type": "npm", + "name": "npm:safe-buffer@5.2.1", + "data": { + "version": "5.2.1", + "packageName": "safe-buffer", + "hash": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + }, + "npm:safer-buffer": { + "type": "npm", + "name": "npm:safer-buffer", + "data": { + "version": "2.1.2", + "packageName": "safer-buffer", + "hash": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + } + }, + "npm:saxes": { + "type": "npm", + "name": "npm:saxes", + "data": { + "version": "6.0.0", + "packageName": "saxes", + "hash": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==" + } + }, + "npm:scheduler": { + "type": "npm", + "name": "npm:scheduler", + "data": { + "version": "0.27.0", + "packageName": "scheduler", + "hash": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" + } + }, + "npm:scule": { + "type": "npm", + "name": "npm:scule", + "data": { + "version": "1.3.0", + "packageName": "scule", + "hash": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" + } + }, + "npm:semver@6.3.1": { + "type": "npm", + "name": "npm:semver@6.3.1", + "data": { + "version": "6.3.1", + "packageName": "semver", + "hash": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + }, + "npm:semver@7.5.4": { + "type": "npm", + "name": "npm:semver@7.5.4", + "data": { + "version": "7.5.4", + "packageName": "semver", + "hash": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + } + }, + "npm:semver@7.7.3": { + "type": "npm", + "name": "npm:semver@7.7.3", + "data": { + "version": "7.7.3", + "packageName": "semver", + "hash": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" + } + }, + "npm:send": { + "type": "npm", + "name": "npm:send", + "data": { + "version": "1.2.0", + "packageName": "send", + "hash": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==" + } + }, + "npm:serialize-javascript": { + "type": "npm", + "name": "npm:serialize-javascript", + "data": { + "version": "6.0.2", + "packageName": "serialize-javascript", + "hash": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==" + } + }, + "npm:seroval-plugins@1.3.3": { + "type": "npm", + "name": "npm:seroval-plugins@1.3.3", + "data": { + "version": "1.3.3", + "packageName": "seroval-plugins", + "hash": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==" + } + }, + "npm:seroval-plugins@1.4.0": { + "type": "npm", + "name": "npm:seroval-plugins@1.4.0", + "data": { + "version": "1.4.0", + "packageName": "seroval-plugins", + "hash": "sha512-zir1aWzoiax6pbBVjoYVd0O1QQXgIL3eVGBMsBsNmM8Ukq90yGaWlfx0AB9dTS8GPqrOrbXn79vmItCUP9U3BQ==" + } + }, + "npm:seroval@1.3.2": { + "type": "npm", + "name": "npm:seroval@1.3.2", + "data": { + "version": "1.3.2", + "packageName": "seroval", + "hash": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==" + } + }, + "npm:seroval@1.4.0": { + "type": "npm", + "name": "npm:seroval@1.4.0", + "data": { + "version": "1.4.0", + "packageName": "seroval", + "hash": "sha512-BdrNXdzlofomLTiRnwJTSEAaGKyHHZkbMXIywOh7zlzp4uZnXErEwl9XZ+N1hJSNpeTtNxWvVwN0wUzAIQ4Hpg==" + } + }, + "npm:serve-placeholder": { + "type": "npm", + "name": "npm:serve-placeholder", + "data": { + "version": "2.0.2", + "packageName": "serve-placeholder", + "hash": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==" + } + }, + "npm:serve-static": { + "type": "npm", + "name": "npm:serve-static", + "data": { + "version": "2.2.0", + "packageName": "serve-static", + "hash": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==" + } + }, + "npm:setprototypeof": { + "type": "npm", + "name": "npm:setprototypeof", + "data": { + "version": "1.2.0", + "packageName": "setprototypeof", + "hash": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + } + }, + "npm:shebang-command": { + "type": "npm", + "name": "npm:shebang-command", + "data": { + "version": "2.0.0", + "packageName": "shebang-command", + "hash": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + } + }, + "npm:shebang-regex": { + "type": "npm", + "name": "npm:shebang-regex", + "data": { + "version": "3.0.0", + "packageName": "shebang-regex", + "hash": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + } + }, + "npm:sherif-darwin-arm64": { + "type": "npm", + "name": "npm:sherif-darwin-arm64", + "data": { + "version": "1.9.0", + "packageName": "sherif-darwin-arm64", + "hash": "sha512-R+RpKSzlqZgBHean04CqHrdlmBBKu6Dhd/9BcdCpjx/KpqsalZsh9LzBVxTWLTtT9IBb/ccr23PNqFzWQTuh6A==" + } + }, + "npm:sherif-darwin-x64": { + "type": "npm", + "name": "npm:sherif-darwin-x64", + "data": { + "version": "1.9.0", + "packageName": "sherif-darwin-x64", + "hash": "sha512-b/KX9MczzkzmyEjngGxYuBq/rOdM6CbGcDLFdQ0H990Dmn9foj4C/UpLlyqSxXcsJhy586ATMEVN68aM2hFQdQ==" + } + }, + "npm:sherif-linux-arm64-musl": { + "type": "npm", + "name": "npm:sherif-linux-arm64-musl", + "data": { + "version": "1.9.0", + "packageName": "sherif-linux-arm64-musl", + "hash": "sha512-OZ4cKcCXTJTl8zaTxKnP8z0wu05nDeGtttxRQjaXHSKK+fjBwGkH/1qqFEVDcRANUxtLRLLdwmDyxvqQrCzhPQ==" + } + }, + "npm:sherif-linux-arm64": { + "type": "npm", + "name": "npm:sherif-linux-arm64", + "data": { + "version": "1.9.0", + "packageName": "sherif-linux-arm64", + "hash": "sha512-TyuGhaD/efCxGIk4scx09n6NsTr3qfKvH5qHYdyxtelv1mHRgbzVHwJ+Jj98jVktuzOZoexHpxr/hz7RUjd/nw==" + } + }, + "npm:sherif-linux-x64-musl": { + "type": "npm", + "name": "npm:sherif-linux-x64-musl", + "data": { + "version": "1.9.0", + "packageName": "sherif-linux-x64-musl", + "hash": "sha512-JSbA6DN0HkWSabYU858BUkS4cMmkTsAamDZEYuUVDW+XvW9IjaI6o0HNatUr7oCjrITIfcjzqlqy7uizmNlr/A==" + } + }, + "npm:sherif-linux-x64": { + "type": "npm", + "name": "npm:sherif-linux-x64", + "data": { + "version": "1.9.0", + "packageName": "sherif-linux-x64", + "hash": "sha512-iO+hTxndO36r0hgmipBRjntWFqFHKrrYFRODz0WnmDquVek88LInSzAY1xpS18/Thbff8IVc6ssefYNVFQQPWw==" + } + }, + "npm:sherif-windows-arm64": { + "type": "npm", + "name": "npm:sherif-windows-arm64", + "data": { + "version": "1.9.0", + "packageName": "sherif-windows-arm64", + "hash": "sha512-lPqQXDB/95SJodtIbGAJc90O/KyxcunvKTycZqo+6RGjkOSYZB/XnRzm/tJ7If/6kz0/wcDP4uvkJmJxrxcj3A==" + } + }, + "npm:sherif-windows-x64": { + "type": "npm", + "name": "npm:sherif-windows-x64", + "data": { + "version": "1.9.0", + "packageName": "sherif-windows-x64", + "hash": "sha512-3cL+XVGLpmyLC3UOZYiPr4vY2OFBQqPZnCoCwoRKN+ONm8VfGMirO9iqI0OckgFBUtJoG4AQY/MWxoPhNmzD8A==" + } + }, + "npm:sherif": { + "type": "npm", + "name": "npm:sherif", + "data": { + "version": "1.9.0", + "packageName": "sherif", + "hash": "sha512-5n7zqPAjL+RzR7n09NPKpWBXmDCtuRpQzIL+ycj8pe6MayV7cDuFmceoyPQJ0c95oFj6feY7SZvhX/+S0i1ukg==" + } + }, + "npm:siginfo": { + "type": "npm", + "name": "npm:siginfo", + "data": { + "version": "2.0.0", + "packageName": "siginfo", + "hash": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + } + }, + "npm:signal-exit@3.0.7": { + "type": "npm", + "name": "npm:signal-exit@3.0.7", + "data": { + "version": "3.0.7", + "packageName": "signal-exit", + "hash": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + } + }, + "npm:signal-exit@4.1.0": { + "type": "npm", + "name": "npm:signal-exit@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "signal-exit", + "hash": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + }, + "npm:simple-git": { + "type": "npm", + "name": "npm:simple-git", + "data": { + "version": "3.30.0", + "packageName": "simple-git", + "hash": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==" + } + }, + "npm:size-limit": { + "type": "npm", + "name": "npm:size-limit", + "data": { + "version": "11.2.0", + "packageName": "size-limit", + "hash": "sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==" + } + }, + "npm:slash@3.0.0": { + "type": "npm", + "name": "npm:slash@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "slash", + "hash": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + }, + "npm:slash@5.1.0": { + "type": "npm", + "name": "npm:slash@5.1.0", + "data": { + "version": "5.1.0", + "packageName": "slash", + "hash": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==" + } + }, + "npm:smob": { + "type": "npm", + "name": "npm:smob", + "data": { + "version": "1.5.0", + "packageName": "smob", + "hash": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" + } + }, + "npm:smol-toml": { + "type": "npm", + "name": "npm:smol-toml", + "data": { + "version": "1.5.2", + "packageName": "smol-toml", + "hash": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==" + } + }, + "npm:solid-js": { + "type": "npm", + "name": "npm:solid-js", + "data": { + "version": "1.9.10", + "packageName": "solid-js", + "hash": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==" + } + }, + "npm:solid-refresh": { + "type": "npm", + "name": "npm:solid-refresh", + "data": { + "version": "0.6.3", + "packageName": "solid-refresh", + "hash": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==" + } + }, + "npm:source-map-js": { + "type": "npm", + "name": "npm:source-map-js", + "data": { + "version": "1.2.1", + "packageName": "source-map-js", + "hash": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + } + }, + "npm:source-map-support": { + "type": "npm", + "name": "npm:source-map-support", + "data": { + "version": "0.5.21", + "packageName": "source-map-support", + "hash": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" + } + }, + "npm:source-map@0.6.1": { + "type": "npm", + "name": "npm:source-map@0.6.1", + "data": { + "version": "0.6.1", + "packageName": "source-map", + "hash": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + }, + "npm:source-map@0.7.6": { + "type": "npm", + "name": "npm:source-map@0.7.6", + "data": { + "version": "0.7.6", + "packageName": "source-map", + "hash": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==" + } + }, + "npm:space-separated-tokens": { + "type": "npm", + "name": "npm:space-separated-tokens", + "data": { + "version": "2.0.2", + "packageName": "space-separated-tokens", + "hash": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + } + }, + "npm:spawndamnit": { + "type": "npm", + "name": "npm:spawndamnit", + "data": { + "version": "3.0.1", + "packageName": "spawndamnit", + "hash": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==" + } + }, + "npm:split2": { + "type": "npm", + "name": "npm:split2", + "data": { + "version": "4.2.0", + "packageName": "split2", + "hash": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" + } + }, + "npm:sprintf-js": { + "type": "npm", + "name": "npm:sprintf-js", + "data": { + "version": "1.0.3", + "packageName": "sprintf-js", + "hash": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + } + }, + "npm:srvx": { + "type": "npm", + "name": "npm:srvx", + "data": { + "version": "0.8.16", + "packageName": "srvx", + "hash": "sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==" + } + }, + "npm:stable-hash-x": { + "type": "npm", + "name": "npm:stable-hash-x", + "data": { + "version": "0.2.0", + "packageName": "stable-hash-x", + "hash": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==" + } + }, + "npm:stackback": { + "type": "npm", + "name": "npm:stackback", + "data": { + "version": "0.0.2", + "packageName": "stackback", + "hash": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + } + }, + "npm:standard-as-callback": { + "type": "npm", + "name": "npm:standard-as-callback", + "data": { + "version": "2.1.0", + "packageName": "standard-as-callback", + "hash": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + } + }, + "npm:statuses@2.0.1": { + "type": "npm", + "name": "npm:statuses@2.0.1", + "data": { + "version": "2.0.1", + "packageName": "statuses", + "hash": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + }, + "npm:statuses@2.0.2": { + "type": "npm", + "name": "npm:statuses@2.0.2", + "data": { + "version": "2.0.2", + "packageName": "statuses", + "hash": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" + } + }, + "npm:std-env": { + "type": "npm", + "name": "npm:std-env", + "data": { + "version": "3.10.0", + "packageName": "std-env", + "hash": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==" + } + }, + "npm:streamx": { + "type": "npm", + "name": "npm:streamx", + "data": { + "version": "2.23.0", + "packageName": "streamx", + "hash": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==" + } + }, + "npm:string-argv": { + "type": "npm", + "name": "npm:string-argv", + "data": { + "version": "0.3.2", + "packageName": "string-argv", + "hash": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" + } + }, + "npm:string-ts": { + "type": "npm", + "name": "npm:string-ts", + "data": { + "version": "2.2.1", + "packageName": "string-ts", + "hash": "sha512-Q2u0gko67PLLhbte5HmPfdOjNvUKbKQM+mCNQae6jE91DmoFHY6HH9GcdqCeNx87DZ2KKjiFxmA0R/42OneGWw==" + } + }, + "npm:string-width@4.2.3": { + "type": "npm", + "name": "npm:string-width@4.2.3", + "data": { + "version": "4.2.3", + "packageName": "string-width", + "hash": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + } + }, + "npm:string-width@5.1.2": { + "type": "npm", + "name": "npm:string-width@5.1.2", + "data": { + "version": "5.1.2", + "packageName": "string-width", + "hash": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==" + } + }, + "npm:string-width-cjs": { + "type": "npm", + "name": "npm:string-width-cjs", + "data": { + "version": "npm:string-width@4.2.3", + "packageName": "string-width-cjs", + "hash": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + } + }, + "npm:string_decoder@1.1.1": { + "type": "npm", + "name": "npm:string_decoder@1.1.1", + "data": { + "version": "1.1.1", + "packageName": "string_decoder", + "hash": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + } + }, + "npm:string_decoder@1.3.0": { + "type": "npm", + "name": "npm:string_decoder@1.3.0", + "data": { + "version": "1.3.0", + "packageName": "string_decoder", + "hash": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + } + }, + "npm:stringify-entities": { + "type": "npm", + "name": "npm:stringify-entities", + "data": { + "version": "4.0.4", + "packageName": "stringify-entities", + "hash": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==" + } + }, + "npm:strip-ansi@6.0.1": { + "type": "npm", + "name": "npm:strip-ansi@6.0.1", + "data": { + "version": "6.0.1", + "packageName": "strip-ansi", + "hash": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + } + }, + "npm:strip-ansi@7.1.2": { + "type": "npm", + "name": "npm:strip-ansi@7.1.2", + "data": { + "version": "7.1.2", + "packageName": "strip-ansi", + "hash": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==" + } + }, + "npm:strip-ansi-cjs": { + "type": "npm", + "name": "npm:strip-ansi-cjs", + "data": { + "version": "npm:strip-ansi@6.0.1", + "packageName": "strip-ansi-cjs", + "hash": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + } + }, + "npm:strip-bom": { + "type": "npm", + "name": "npm:strip-bom", + "data": { + "version": "3.0.0", + "packageName": "strip-bom", + "hash": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + } + }, + "npm:strip-final-newline": { + "type": "npm", + "name": "npm:strip-final-newline", + "data": { + "version": "3.0.0", + "packageName": "strip-final-newline", + "hash": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + } + }, + "npm:strip-indent": { + "type": "npm", + "name": "npm:strip-indent", + "data": { + "version": "3.0.0", + "packageName": "strip-indent", + "hash": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==" + } + }, + "npm:strip-json-comments@3.1.1": { + "type": "npm", + "name": "npm:strip-json-comments@3.1.1", + "data": { + "version": "3.1.1", + "packageName": "strip-json-comments", + "hash": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + } + }, + "npm:strip-json-comments@5.0.3": { + "type": "npm", + "name": "npm:strip-json-comments@5.0.3", + "data": { + "version": "5.0.3", + "packageName": "strip-json-comments", + "hash": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==" + } + }, + "npm:strip-literal": { + "type": "npm", + "name": "npm:strip-literal", + "data": { + "version": "3.1.0", + "packageName": "strip-literal", + "hash": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==" + } + }, + "npm:style-to-js": { + "type": "npm", + "name": "npm:style-to-js", + "data": { + "version": "1.1.18", + "packageName": "style-to-js", + "hash": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==" + } + }, + "npm:style-to-object": { + "type": "npm", + "name": "npm:style-to-object", + "data": { + "version": "1.0.11", + "packageName": "style-to-object", + "hash": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==" + } + }, + "npm:supports-color@10.2.2": { + "type": "npm", + "name": "npm:supports-color@10.2.2", + "data": { + "version": "10.2.2", + "packageName": "supports-color", + "hash": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==" + } + }, + "npm:supports-color@7.2.0": { + "type": "npm", + "name": "npm:supports-color@7.2.0", + "data": { + "version": "7.2.0", + "packageName": "supports-color", + "hash": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + } + }, + "npm:supports-color@8.1.1": { + "type": "npm", + "name": "npm:supports-color@8.1.1", + "data": { + "version": "8.1.1", + "packageName": "supports-color", + "hash": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + } + }, + "npm:supports-preserve-symlinks-flag": { + "type": "npm", + "name": "npm:supports-preserve-symlinks-flag", + "data": { + "version": "1.0.0", + "packageName": "supports-preserve-symlinks-flag", + "hash": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + } + }, + "npm:svelte": { + "type": "npm", + "name": "npm:svelte", + "data": { + "version": "5.44.1", + "packageName": "svelte", + "hash": "sha512-8VnkRXpa6tJ9IqiwKvzZBNnBy9tZg0N63duDz0EJqiozsmBEAZfHiZzWWWAneIN+cAWkK1JkafW1xIbC4YrdBA==" + } + }, + "npm:symbol-tree": { + "type": "npm", + "name": "npm:symbol-tree", + "data": { + "version": "3.2.4", + "packageName": "symbol-tree", + "hash": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + } + }, + "npm:system-architecture": { + "type": "npm", + "name": "npm:system-architecture", + "data": { + "version": "0.1.0", + "packageName": "system-architecture", + "hash": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==" + } + }, + "npm:tagged-tag": { + "type": "npm", + "name": "npm:tagged-tag", + "data": { + "version": "1.0.0", + "packageName": "tagged-tag", + "hash": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==" + } + }, + "npm:tailwindcss": { + "type": "npm", + "name": "npm:tailwindcss", + "data": { + "version": "4.1.17", + "packageName": "tailwindcss", + "hash": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==" + } + }, + "npm:tapable": { + "type": "npm", + "name": "npm:tapable", + "data": { + "version": "2.3.0", + "packageName": "tapable", + "hash": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==" + } + }, + "npm:tar-stream@2.2.0": { + "type": "npm", + "name": "npm:tar-stream@2.2.0", + "data": { + "version": "2.2.0", + "packageName": "tar-stream", + "hash": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==" + } + }, + "npm:tar-stream@3.1.7": { + "type": "npm", + "name": "npm:tar-stream@3.1.7", + "data": { + "version": "3.1.7", + "packageName": "tar-stream", + "hash": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==" + } + }, + "npm:tar": { + "type": "npm", + "name": "npm:tar", + "data": { + "version": "7.5.2", + "packageName": "tar", + "hash": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==" + } + }, + "npm:term-size": { + "type": "npm", + "name": "npm:term-size", + "data": { + "version": "2.2.1", + "packageName": "term-size", + "hash": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" + } + }, + "npm:terser": { + "type": "npm", + "name": "npm:terser", + "data": { + "version": "5.44.0", + "packageName": "terser", + "hash": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==" + } + }, + "npm:text-decoder": { + "type": "npm", + "name": "npm:text-decoder", + "data": { + "version": "1.2.3", + "packageName": "text-decoder", + "hash": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==" + } + }, + "npm:text-extensions": { + "type": "npm", + "name": "npm:text-extensions", + "data": { + "version": "2.4.0", + "packageName": "text-extensions", + "hash": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==" + } + }, + "npm:through": { + "type": "npm", + "name": "npm:through", + "data": { + "version": "2.3.8", + "packageName": "through", + "hash": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + } + }, + "npm:tiny-invariant": { + "type": "npm", + "name": "npm:tiny-invariant", + "data": { + "version": "1.3.3", + "packageName": "tiny-invariant", + "hash": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + } + }, + "npm:tiny-warning": { + "type": "npm", + "name": "npm:tiny-warning", + "data": { + "version": "1.0.3", + "packageName": "tiny-warning", + "hash": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + } + }, + "npm:tinybench": { + "type": "npm", + "name": "npm:tinybench", + "data": { + "version": "2.9.0", + "packageName": "tinybench", + "hash": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" + } + }, + "npm:tinyexec@0.3.2": { + "type": "npm", + "name": "npm:tinyexec@0.3.2", + "data": { + "version": "0.3.2", + "packageName": "tinyexec", + "hash": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" + } + }, + "npm:tinyexec@1.0.1": { + "type": "npm", + "name": "npm:tinyexec@1.0.1", + "data": { + "version": "1.0.1", + "packageName": "tinyexec", + "hash": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==" + } + }, + "npm:tinyglobby": { + "type": "npm", + "name": "npm:tinyglobby", + "data": { + "version": "0.2.15", + "packageName": "tinyglobby", + "hash": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==" + } + }, + "npm:tinyrainbow": { + "type": "npm", + "name": "npm:tinyrainbow", + "data": { + "version": "3.0.3", + "packageName": "tinyrainbow", + "hash": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==" + } + }, + "npm:tldts-core": { + "type": "npm", + "name": "npm:tldts-core", + "data": { + "version": "7.0.16", + "packageName": "tldts-core", + "hash": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==" + } + }, + "npm:tldts": { + "type": "npm", + "name": "npm:tldts", + "data": { + "version": "7.0.16", + "packageName": "tldts", + "hash": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==" + } + }, + "npm:tmp": { + "type": "npm", + "name": "npm:tmp", + "data": { + "version": "0.2.5", + "packageName": "tmp", + "hash": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==" + } + }, + "npm:to-regex-range": { + "type": "npm", + "name": "npm:to-regex-range", + "data": { + "version": "5.0.1", + "packageName": "to-regex-range", + "hash": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + } + }, + "npm:toidentifier": { + "type": "npm", + "name": "npm:toidentifier", + "data": { + "version": "1.0.1", + "packageName": "toidentifier", + "hash": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + } + }, + "npm:tough-cookie": { + "type": "npm", + "name": "npm:tough-cookie", + "data": { + "version": "6.0.0", + "packageName": "tough-cookie", + "hash": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==" + } + }, + "npm:tr46@0.0.3": { + "type": "npm", + "name": "npm:tr46@0.0.3", + "data": { + "version": "0.0.3", + "packageName": "tr46", + "hash": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + } + }, + "npm:tr46@6.0.0": { + "type": "npm", + "name": "npm:tr46@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "tr46", + "hash": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==" + } + }, + "npm:tree-kill": { + "type": "npm", + "name": "npm:tree-kill", + "data": { + "version": "1.2.2", + "packageName": "tree-kill", + "hash": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + } + }, + "npm:trim-lines": { + "type": "npm", + "name": "npm:trim-lines", + "data": { + "version": "3.0.1", + "packageName": "trim-lines", + "hash": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + } + }, + "npm:trough": { + "type": "npm", + "name": "npm:trough", + "data": { + "version": "2.2.0", + "packageName": "trough", + "hash": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" + } + }, + "npm:ts-algebra": { + "type": "npm", + "name": "npm:ts-algebra", + "data": { + "version": "2.0.0", + "packageName": "ts-algebra", + "hash": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==" + } + }, + "npm:ts-api-utils": { + "type": "npm", + "name": "npm:ts-api-utils", + "data": { + "version": "2.1.0", + "packageName": "ts-api-utils", + "hash": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==" + } + }, + "npm:ts-declaration-location": { + "type": "npm", + "name": "npm:ts-declaration-location", + "data": { + "version": "1.0.7", + "packageName": "ts-declaration-location", + "hash": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==" + } + }, + "npm:ts-pattern": { + "type": "npm", + "name": "npm:ts-pattern", + "data": { + "version": "5.9.0", + "packageName": "ts-pattern", + "hash": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==" + } + }, + "npm:tsconfck": { + "type": "npm", + "name": "npm:tsconfck", + "data": { + "version": "3.1.6", + "packageName": "tsconfck", + "hash": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==" + } + }, + "npm:tsconfig-paths": { + "type": "npm", + "name": "npm:tsconfig-paths", + "data": { + "version": "4.2.0", + "packageName": "tsconfig-paths", + "hash": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==" + } + }, + "npm:tslib": { + "type": "npm", + "name": "npm:tslib", + "data": { + "version": "2.8.1", + "packageName": "tslib", + "hash": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + } + }, + "npm:tsx": { + "type": "npm", + "name": "npm:tsx", + "data": { + "version": "4.20.6", + "packageName": "tsx", + "hash": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==" + } + }, + "npm:type-check": { + "type": "npm", + "name": "npm:type-check", + "data": { + "version": "0.4.0", + "packageName": "type-check", + "hash": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + } + }, + "npm:type-fest": { + "type": "npm", + "name": "npm:type-fest", + "data": { + "version": "5.1.0", + "packageName": "type-fest", + "hash": "sha512-wQ531tuWvB6oK+pchHIu5lHe5f5wpSCqB8Kf4dWQRbOYc9HTge7JL0G4Qd44bh6QuJCccIzL3bugb8GI0MwHrg==" + } + }, + "npm:typedoc-plugin-frontmatter": { + "type": "npm", + "name": "npm:typedoc-plugin-frontmatter", + "data": { + "version": "1.3.0", + "packageName": "typedoc-plugin-frontmatter", + "hash": "sha512-xYQFMAecMlsRUjmf9oM/Sq2FVz4zlgcbIeVFNLdO118CHTN06gIKJNSlyExh9+Xl8sK0YhIvoQwViUURxritWA==" + } + }, + "npm:typedoc-plugin-markdown": { + "type": "npm", + "name": "npm:typedoc-plugin-markdown", + "data": { + "version": "4.9.0", + "packageName": "typedoc-plugin-markdown", + "hash": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==" + } + }, + "npm:typedoc": { + "type": "npm", + "name": "npm:typedoc", + "data": { + "version": "0.28.14", + "packageName": "typedoc", + "hash": "sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==" + } + }, + "npm:typescript-eslint": { + "type": "npm", + "name": "npm:typescript-eslint", + "data": { + "version": "8.46.3", + "packageName": "typescript-eslint", + "hash": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==" + } + }, + "npm:typescript@5.4.2": { + "type": "npm", + "name": "npm:typescript@5.4.2", + "data": { + "version": "5.4.2", + "packageName": "typescript", + "hash": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==" + } + }, + "npm:typescript": { + "type": "npm", + "name": "npm:typescript", + "data": { + "version": "5.9.3", + "packageName": "typescript", + "hash": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==" + } + }, + "npm:uc.micro": { + "type": "npm", + "name": "npm:uc.micro", + "data": { + "version": "2.1.0", + "packageName": "uc.micro", + "hash": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + } + }, + "npm:ufo": { + "type": "npm", + "name": "npm:ufo", + "data": { + "version": "1.6.1", + "packageName": "ufo", + "hash": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==" + } + }, + "npm:ultrahtml": { + "type": "npm", + "name": "npm:ultrahtml", + "data": { + "version": "1.6.0", + "packageName": "ultrahtml", + "hash": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==" + } + }, + "npm:uncrypto": { + "type": "npm", + "name": "npm:uncrypto", + "data": { + "version": "0.1.3", + "packageName": "uncrypto", + "hash": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + } + }, + "npm:unctx": { + "type": "npm", + "name": "npm:unctx", + "data": { + "version": "2.4.1", + "packageName": "unctx", + "hash": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==" + } + }, + "npm:undici-types@6.21.0": { + "type": "npm", + "name": "npm:undici-types@6.21.0", + "data": { + "version": "6.21.0", + "packageName": "undici-types", + "hash": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + } + }, + "npm:undici-types@7.16.0": { + "type": "npm", + "name": "npm:undici-types@7.16.0", + "data": { + "version": "7.16.0", + "packageName": "undici-types", + "hash": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" + } + }, + "npm:undici": { + "type": "npm", + "name": "npm:undici", + "data": { + "version": "7.16.0", + "packageName": "undici", + "hash": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==" + } + }, + "npm:unenv": { + "type": "npm", + "name": "npm:unenv", + "data": { + "version": "2.0.0-rc.24", + "packageName": "unenv", + "hash": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==" + } + }, + "npm:unicorn-magic": { + "type": "npm", + "name": "npm:unicorn-magic", + "data": { + "version": "0.3.0", + "packageName": "unicorn-magic", + "hash": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==" + } + }, + "npm:unified": { + "type": "npm", + "name": "npm:unified", + "data": { + "version": "11.0.5", + "packageName": "unified", + "hash": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==" + } + }, + "npm:unimport": { + "type": "npm", + "name": "npm:unimport", + "data": { + "version": "5.5.0", + "packageName": "unimport", + "hash": "sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==" + } + }, + "npm:unist-util-find-after": { + "type": "npm", + "name": "npm:unist-util-find-after", + "data": { + "version": "5.0.0", + "packageName": "unist-util-find-after", + "hash": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==" + } + }, + "npm:unist-util-is": { + "type": "npm", + "name": "npm:unist-util-is", + "data": { + "version": "6.0.1", + "packageName": "unist-util-is", + "hash": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==" + } + }, + "npm:unist-util-position": { + "type": "npm", + "name": "npm:unist-util-position", + "data": { + "version": "5.0.0", + "packageName": "unist-util-position", + "hash": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==" + } + }, + "npm:unist-util-stringify-position": { + "type": "npm", + "name": "npm:unist-util-stringify-position", + "data": { + "version": "4.0.0", + "packageName": "unist-util-stringify-position", + "hash": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==" + } + }, + "npm:unist-util-visit-parents": { + "type": "npm", + "name": "npm:unist-util-visit-parents", + "data": { + "version": "6.0.2", + "packageName": "unist-util-visit-parents", + "hash": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==" + } + }, + "npm:unist-util-visit": { + "type": "npm", + "name": "npm:unist-util-visit", + "data": { + "version": "5.0.0", + "packageName": "unist-util-visit", + "hash": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==" + } + }, + "npm:universalify@0.1.2": { + "type": "npm", + "name": "npm:universalify@0.1.2", + "data": { + "version": "0.1.2", + "packageName": "universalify", + "hash": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + }, + "npm:universalify@2.0.1": { + "type": "npm", + "name": "npm:universalify@2.0.1", + "data": { + "version": "2.0.1", + "packageName": "universalify", + "hash": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + } + }, + "npm:unplugin-utils": { + "type": "npm", + "name": "npm:unplugin-utils", + "data": { + "version": "0.3.1", + "packageName": "unplugin-utils", + "hash": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==" + } + }, + "npm:unplugin": { + "type": "npm", + "name": "npm:unplugin", + "data": { + "version": "2.3.10", + "packageName": "unplugin", + "hash": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==" + } + }, + "npm:unrs-resolver": { + "type": "npm", + "name": "npm:unrs-resolver", + "data": { + "version": "1.11.1", + "packageName": "unrs-resolver", + "hash": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==" + } + }, + "npm:unstorage": { + "type": "npm", + "name": "npm:unstorage", + "data": { + "version": "1.17.2", + "packageName": "unstorage", + "hash": "sha512-cKEsD6iBWJgOMJ6vW1ID/SYuqNf8oN4yqRk8OYqaVQ3nnkJXOT1PSpaMh2QfzLs78UN5kSNRD2c/mgjT8tX7+w==" + } + }, + "npm:untun": { + "type": "npm", + "name": "npm:untun", + "data": { + "version": "0.1.3", + "packageName": "untun", + "hash": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==" + } + }, + "npm:untyped": { + "type": "npm", + "name": "npm:untyped", + "data": { + "version": "2.0.0", + "packageName": "untyped", + "hash": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==" + } + }, + "npm:unwasm": { + "type": "npm", + "name": "npm:unwasm", + "data": { + "version": "0.3.11", + "packageName": "unwasm", + "hash": "sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ==" + } + }, + "npm:update-browserslist-db": { + "type": "npm", + "name": "npm:update-browserslist-db", + "data": { + "version": "1.1.4", + "packageName": "update-browserslist-db", + "hash": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==" + } + }, + "npm:uqr": { + "type": "npm", + "name": "npm:uqr", + "data": { + "version": "0.1.2", + "packageName": "uqr", + "hash": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" + } + }, + "npm:uri-js": { + "type": "npm", + "name": "npm:uri-js", + "data": { + "version": "4.4.1", + "packageName": "uri-js", + "hash": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + } + }, + "npm:use-sync-external-store": { + "type": "npm", + "name": "npm:use-sync-external-store", + "data": { + "version": "1.6.0", + "packageName": "use-sync-external-store", + "hash": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==" + } + }, + "npm:util-deprecate": { + "type": "npm", + "name": "npm:util-deprecate", + "data": { + "version": "1.0.2", + "packageName": "util-deprecate", + "hash": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + } + }, + "npm:vfile-location": { + "type": "npm", + "name": "npm:vfile-location", + "data": { + "version": "5.0.3", + "packageName": "vfile-location", + "hash": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==" + } + }, + "npm:vfile-message": { + "type": "npm", + "name": "npm:vfile-message", + "data": { + "version": "4.0.3", + "packageName": "vfile-message", + "hash": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==" + } + }, + "npm:vfile": { + "type": "npm", + "name": "npm:vfile", + "data": { + "version": "6.0.3", + "packageName": "vfile", + "hash": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==" + } + }, + "npm:vite-plugin-dts": { + "type": "npm", + "name": "npm:vite-plugin-dts", + "data": { + "version": "4.2.3", + "packageName": "vite-plugin-dts", + "hash": "sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==" + } + }, + "npm:vite-plugin-externalize-deps": { + "type": "npm", + "name": "npm:vite-plugin-externalize-deps", + "data": { + "version": "0.10.0", + "packageName": "vite-plugin-externalize-deps", + "hash": "sha512-eQrtpT/Do7AvDn76l1yL6ZHyXJ+UWH2LaHVqhAes9go54qaAnPZuMbgxcroQ/7WY3ZyetZzYW2quQnDF0DV5qg==" + } + }, + "npm:vite-plugin-solid": { + "type": "npm", + "name": "npm:vite-plugin-solid", + "data": { + "version": "2.11.10", + "packageName": "vite-plugin-solid", + "hash": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==" + } + }, + "npm:vite-tsconfig-paths": { + "type": "npm", + "name": "npm:vite-tsconfig-paths", + "data": { + "version": "5.1.4", + "packageName": "vite-tsconfig-paths", + "hash": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==" + } + }, + "npm:vite": { + "type": "npm", + "name": "npm:vite", + "data": { + "version": "7.2.4", + "packageName": "vite", + "hash": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==" + } + }, + "npm:vitefu": { + "type": "npm", + "name": "npm:vitefu", + "data": { + "version": "1.1.1", + "packageName": "vitefu", + "hash": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==" + } + }, + "npm:vitest": { + "type": "npm", + "name": "npm:vitest", + "data": { + "version": "4.0.14", + "packageName": "vitest", + "hash": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==" + } + }, + "npm:vscode-uri": { + "type": "npm", + "name": "npm:vscode-uri", + "data": { + "version": "3.1.0", + "packageName": "vscode-uri", + "hash": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" + } + }, + "npm:vue-eslint-parser": { + "type": "npm", + "name": "npm:vue-eslint-parser", + "data": { + "version": "10.2.0", + "packageName": "vue-eslint-parser", + "hash": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==" + } + }, + "npm:w3c-xmlserializer": { + "type": "npm", + "name": "npm:w3c-xmlserializer", + "data": { + "version": "5.0.0", + "packageName": "w3c-xmlserializer", + "hash": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==" + } + }, + "npm:walk-up-path": { + "type": "npm", + "name": "npm:walk-up-path", + "data": { + "version": "4.0.0", + "packageName": "walk-up-path", + "hash": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==" + } + }, + "npm:wcwidth": { + "type": "npm", + "name": "npm:wcwidth", + "data": { + "version": "1.0.1", + "packageName": "wcwidth", + "hash": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==" + } + }, + "npm:web-namespaces": { + "type": "npm", + "name": "npm:web-namespaces", + "data": { + "version": "2.0.1", + "packageName": "web-namespaces", + "hash": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" + } + }, + "npm:web-streams-polyfill": { + "type": "npm", + "name": "npm:web-streams-polyfill", + "data": { + "version": "3.3.3", + "packageName": "web-streams-polyfill", + "hash": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" + } + }, + "npm:web-vitals": { + "type": "npm", + "name": "npm:web-vitals", + "data": { + "version": "5.1.0", + "packageName": "web-vitals", + "hash": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==" + } + }, + "npm:webidl-conversions@3.0.1": { + "type": "npm", + "name": "npm:webidl-conversions@3.0.1", + "data": { + "version": "3.0.1", + "packageName": "webidl-conversions", + "hash": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + } + }, + "npm:webidl-conversions@8.0.0": { + "type": "npm", + "name": "npm:webidl-conversions@8.0.0", + "data": { + "version": "8.0.0", + "packageName": "webidl-conversions", + "hash": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==" + } + }, + "npm:webpack-virtual-modules": { + "type": "npm", + "name": "npm:webpack-virtual-modules", + "data": { + "version": "0.6.2", + "packageName": "webpack-virtual-modules", + "hash": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" + } + }, + "npm:whatwg-encoding": { + "type": "npm", + "name": "npm:whatwg-encoding", + "data": { + "version": "3.1.1", + "packageName": "whatwg-encoding", + "hash": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==" + } + }, + "npm:whatwg-fetch": { + "type": "npm", + "name": "npm:whatwg-fetch", + "data": { + "version": "3.6.20", + "packageName": "whatwg-fetch", + "hash": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + } + }, + "npm:whatwg-mimetype@3.0.0": { + "type": "npm", + "name": "npm:whatwg-mimetype@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "whatwg-mimetype", + "hash": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + } + }, + "npm:whatwg-mimetype@4.0.0": { + "type": "npm", + "name": "npm:whatwg-mimetype@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "whatwg-mimetype", + "hash": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==" + } + }, + "npm:whatwg-url@15.1.0": { + "type": "npm", + "name": "npm:whatwg-url@15.1.0", + "data": { + "version": "15.1.0", + "packageName": "whatwg-url", + "hash": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==" + } + }, + "npm:whatwg-url@5.0.0": { + "type": "npm", + "name": "npm:whatwg-url@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "whatwg-url", + "hash": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" + } + }, + "npm:which": { + "type": "npm", + "name": "npm:which", + "data": { + "version": "2.0.2", + "packageName": "which", + "hash": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + } + }, + "npm:why-is-node-running": { + "type": "npm", + "name": "npm:why-is-node-running", + "data": { + "version": "2.3.0", + "packageName": "why-is-node-running", + "hash": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==" + } + }, + "npm:word-wrap": { + "type": "npm", + "name": "npm:word-wrap", + "data": { + "version": "1.2.5", + "packageName": "word-wrap", + "hash": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + } + }, + "npm:wrap-ansi@7.0.0": { + "type": "npm", + "name": "npm:wrap-ansi@7.0.0", + "data": { + "version": "7.0.0", + "packageName": "wrap-ansi", + "hash": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + } + }, + "npm:wrap-ansi@8.1.0": { + "type": "npm", + "name": "npm:wrap-ansi@8.1.0", + "data": { + "version": "8.1.0", + "packageName": "wrap-ansi", + "hash": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==" + } + }, + "npm:wrap-ansi-cjs": { + "type": "npm", + "name": "npm:wrap-ansi-cjs", + "data": { + "version": "npm:wrap-ansi@7.0.0", + "packageName": "wrap-ansi-cjs", + "hash": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + } + }, + "npm:wrappy": { + "type": "npm", + "name": "npm:wrappy", + "data": { + "version": "1.0.2", + "packageName": "wrappy", + "hash": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + }, + "npm:ws": { + "type": "npm", + "name": "npm:ws", + "data": { + "version": "8.18.3", + "packageName": "ws", + "hash": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==" + } + }, + "npm:xml-name-validator": { + "type": "npm", + "name": "npm:xml-name-validator", + "data": { + "version": "5.0.0", + "packageName": "xml-name-validator", + "hash": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==" + } + }, + "npm:xmlbuilder2": { + "type": "npm", + "name": "npm:xmlbuilder2", + "data": { + "version": "4.0.1", + "packageName": "xmlbuilder2", + "hash": "sha512-vXeky0YRVjhx5pseJDQLk0F6u7gyA8++ceVOS88r4dWu4lWdY/ZjbL45QrN+g0GzZLg1D5AkzThpikZa98SC/g==" + } + }, + "npm:xmlchars": { + "type": "npm", + "name": "npm:xmlchars", + "data": { + "version": "2.2.0", + "packageName": "xmlchars", + "hash": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + } + }, + "npm:y18n": { + "type": "npm", + "name": "npm:y18n", + "data": { + "version": "5.0.8", + "packageName": "y18n", + "hash": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + } + }, + "npm:yallist@3.1.1": { + "type": "npm", + "name": "npm:yallist@3.1.1", + "data": { + "version": "3.1.1", + "packageName": "yallist", + "hash": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + }, + "npm:yallist@4.0.0": { + "type": "npm", + "name": "npm:yallist@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "yallist", + "hash": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "npm:yallist@5.0.0": { + "type": "npm", + "name": "npm:yallist@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "yallist", + "hash": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" + } + }, + "npm:yaml": { + "type": "npm", + "name": "npm:yaml", + "data": { + "version": "2.8.1", + "packageName": "yaml", + "hash": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==" + } + }, + "npm:yargs-parser": { + "type": "npm", + "name": "npm:yargs-parser", + "data": { + "version": "21.1.1", + "packageName": "yargs-parser", + "hash": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + }, + "npm:yargs": { + "type": "npm", + "name": "npm:yargs", + "data": { + "version": "17.7.2", + "packageName": "yargs", + "hash": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==" + } + }, + "npm:yocto-queue": { + "type": "npm", + "name": "npm:yocto-queue", + "data": { + "version": "0.1.0", + "packageName": "yocto-queue", + "hash": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + } + }, + "npm:youch-core": { + "type": "npm", + "name": "npm:youch-core", + "data": { + "version": "0.3.3", + "packageName": "youch-core", + "hash": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==" + } + }, + "npm:youch": { + "type": "npm", + "name": "npm:youch", + "data": { + "version": "4.1.0-beta.11", + "packageName": "youch", + "hash": "sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==" + } + }, + "npm:zimmerframe": { + "type": "npm", + "name": "npm:zimmerframe", + "data": { + "version": "1.1.4", + "packageName": "zimmerframe", + "hash": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==" + } + }, + "npm:zip-stream": { + "type": "npm", + "name": "npm:zip-stream", + "data": { + "version": "6.0.1", + "packageName": "zip-stream", + "hash": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==" + } + }, + "npm:zod-validation-error@3.5.4": { + "type": "npm", + "name": "npm:zod-validation-error@3.5.4", + "data": { + "version": "3.5.4", + "packageName": "zod-validation-error", + "hash": "sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==" + } + }, + "npm:zod-validation-error@4.0.2": { + "type": "npm", + "name": "npm:zod-validation-error@4.0.2", + "data": { + "version": "4.0.2", + "packageName": "zod-validation-error", + "hash": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==" + } + }, + "npm:zod@3.25.76": { + "type": "npm", + "name": "npm:zod@3.25.76", + "data": { + "version": "3.25.76", + "packageName": "zod", + "hash": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" + } + }, + "npm:zod@4.1.13": { + "type": "npm", + "name": "npm:zod@4.1.13", + "data": { + "version": "4.1.13", + "packageName": "zod", + "hash": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==" + } + }, + "npm:zwitch": { + "type": "npm", + "name": "npm:zwitch", + "data": { + "version": "2.0.4", + "packageName": "zwitch", + "hash": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" + } + } + }, + "keyMap": { + "@acemir/cssom@0.9.24": [ + "npm:@acemir/cssom" + ], + "@adobe/css-tools@4.4.4": [ + "npm:@adobe/css-tools" + ], + "@ai-sdk/openai@2.0.73(zod@4.1.13)": [ + "npm:@ai-sdk/openai" + ], + "@ai-sdk/provider-utils@3.0.17(zod@4.1.13)": [ + "npm:@ai-sdk/provider-utils" + ], + "@ai-sdk/provider@2.0.0": [ + "npm:@ai-sdk/provider" + ], + "@anthropic-ai/sdk@0.71.0(zod@4.1.13)": [ + "npm:@anthropic-ai/sdk" + ], + "@asamuzakjp/css-color@4.0.5": [ + "npm:@asamuzakjp/css-color" + ], + "@asamuzakjp/dom-selector@6.7.4": [ + "npm:@asamuzakjp/dom-selector" + ], + "@asamuzakjp/nwsapi@2.3.9": [ + "npm:@asamuzakjp/nwsapi" + ], + "@babel/code-frame@7.26.2": [ + "npm:@babel/code-frame@7.26.2" + ], + "@babel/code-frame@7.27.1": [ + "npm:@babel/code-frame@7.27.1" + ], + "@babel/compat-data@7.28.5": [ + "npm:@babel/compat-data" + ], + "@babel/core@7.28.5": [ + "npm:@babel/core" + ], + "@babel/generator@7.28.5": [ + "npm:@babel/generator" + ], + "@babel/helper-annotate-as-pure@7.27.3": [ + "npm:@babel/helper-annotate-as-pure" + ], + "@babel/helper-compilation-targets@7.27.2": [ + "npm:@babel/helper-compilation-targets" + ], + "@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)": [ + "npm:@babel/helper-create-class-features-plugin" + ], + "@babel/helper-globals@7.28.0": [ + "npm:@babel/helper-globals" + ], + "@babel/helper-member-expression-to-functions@7.28.5": [ + "npm:@babel/helper-member-expression-to-functions" + ], + "@babel/helper-module-imports@7.18.6": [ + "npm:@babel/helper-module-imports@7.18.6" + ], + "@babel/helper-module-imports@7.27.1": [ + "npm:@babel/helper-module-imports@7.27.1" + ], + "@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)": [ + "npm:@babel/helper-module-transforms" + ], + "@babel/helper-optimise-call-expression@7.27.1": [ + "npm:@babel/helper-optimise-call-expression" + ], + "@babel/helper-plugin-utils@7.27.1": [ + "npm:@babel/helper-plugin-utils" + ], + "@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)": [ + "npm:@babel/helper-replace-supers" + ], + "@babel/helper-skip-transparent-expression-wrappers@7.27.1": [ + "npm:@babel/helper-skip-transparent-expression-wrappers" + ], + "@babel/helper-string-parser@7.27.1": [ + "npm:@babel/helper-string-parser" + ], + "@babel/helper-validator-identifier@7.27.1": [ + "npm:@babel/helper-validator-identifier@7.27.1" + ], + "@babel/helper-validator-identifier@7.28.5": [ + "npm:@babel/helper-validator-identifier@7.28.5" + ], + "@babel/helper-validator-option@7.27.1": [ + "npm:@babel/helper-validator-option" + ], + "@babel/helpers@7.28.4": [ + "npm:@babel/helpers" + ], + "@babel/parser@7.28.4": [ + "npm:@babel/parser@7.28.4" + ], + "@babel/parser@7.28.5": [ + "npm:@babel/parser@7.28.5" + ], + "@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.5)": [ + "npm:@babel/plugin-proposal-private-methods" + ], + "@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)": [ + "npm:@babel/plugin-syntax-jsx" + ], + "@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)": [ + "npm:@babel/plugin-syntax-typescript" + ], + "@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)": [ + "npm:@babel/plugin-transform-modules-commonjs" + ], + "@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)": [ + "npm:@babel/plugin-transform-react-jsx-self" + ], + "@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)": [ + "npm:@babel/plugin-transform-react-jsx-source" + ], + "@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)": [ + "npm:@babel/plugin-transform-typescript" + ], + "@babel/preset-typescript@7.28.5(@babel/core@7.28.5)": [ + "npm:@babel/preset-typescript" + ], + "@babel/runtime@7.28.4": [ + "npm:@babel/runtime" + ], + "@babel/template@7.27.2": [ + "npm:@babel/template" + ], + "@babel/traverse@7.28.5": [ + "npm:@babel/traverse" + ], + "@babel/types@7.28.4": [ + "npm:@babel/types@7.28.4" + ], + "@babel/types@7.28.5": [ + "npm:@babel/types@7.28.5" + ], + "@changesets/apply-release-plan@7.0.13": [ + "npm:@changesets/apply-release-plan" + ], + "@changesets/assemble-release-plan@6.0.9": [ + "npm:@changesets/assemble-release-plan" + ], + "@changesets/changelog-git@0.2.1": [ + "npm:@changesets/changelog-git" + ], + "@changesets/cli@2.29.7(@types/node@24.10.1)": [ + "npm:@changesets/cli" + ], + "@changesets/config@3.1.1": [ + "npm:@changesets/config" + ], + "@changesets/errors@0.2.0": [ + "npm:@changesets/errors" + ], + "@changesets/get-dependents-graph@2.1.3": [ + "npm:@changesets/get-dependents-graph" + ], + "@changesets/get-github-info@0.6.0": [ + "npm:@changesets/get-github-info" + ], + "@changesets/get-release-plan@4.0.13": [ + "npm:@changesets/get-release-plan" + ], + "@changesets/get-version-range-type@0.4.0": [ + "npm:@changesets/get-version-range-type" + ], + "@changesets/git@3.0.4": [ + "npm:@changesets/git" + ], + "@changesets/logger@0.1.1": [ + "npm:@changesets/logger" + ], + "@changesets/parse@0.4.1": [ + "npm:@changesets/parse" + ], + "@changesets/pre@2.0.2": [ + "npm:@changesets/pre" + ], + "@changesets/read@0.6.5": [ + "npm:@changesets/read" + ], + "@changesets/should-skip-package@0.1.2": [ + "npm:@changesets/should-skip-package" + ], + "@changesets/types@4.1.0": [ + "npm:@changesets/types@4.1.0" + ], + "@changesets/types@6.1.0": [ + "npm:@changesets/types@6.1.0" + ], + "@changesets/write@0.4.0": [ + "npm:@changesets/write" + ], + "@cloudflare/kv-asset-handler@0.4.0": [ + "npm:@cloudflare/kv-asset-handler" + ], + "@commitlint/parse@20.0.0": [ + "npm:@commitlint/parse" + ], + "@commitlint/types@20.0.0": [ + "npm:@commitlint/types" + ], + "@csstools/color-helpers@5.1.0": [ + "npm:@csstools/color-helpers" + ], + "@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": [ + "npm:@csstools/css-calc" + ], + "@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": [ + "npm:@csstools/css-color-parser" + ], + "@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)": [ + "npm:@csstools/css-parser-algorithms" + ], + "@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)": [ + "npm:@csstools/css-syntax-patches-for-csstree" + ], + "@csstools/css-tokenizer@3.0.4": [ + "npm:@csstools/css-tokenizer" + ], + "@emnapi/core@1.6.0": [ + "npm:@emnapi/core" + ], + "@emnapi/runtime@1.6.0": [ + "npm:@emnapi/runtime" + ], + "@emnapi/wasi-threads@1.1.0": [ + "npm:@emnapi/wasi-threads" + ], + "@esbuild/aix-ppc64@0.25.12": [ + "npm:@esbuild/aix-ppc64" + ], + "@esbuild/android-arm64@0.25.12": [ + "npm:@esbuild/android-arm64" + ], + "@esbuild/android-arm@0.25.12": [ + "npm:@esbuild/android-arm" + ], + "@esbuild/android-x64@0.25.12": [ + "npm:@esbuild/android-x64" + ], + "@esbuild/darwin-arm64@0.25.12": [ + "npm:@esbuild/darwin-arm64" + ], + "@esbuild/darwin-x64@0.25.12": [ + "npm:@esbuild/darwin-x64" + ], + "@esbuild/freebsd-arm64@0.25.12": [ + "npm:@esbuild/freebsd-arm64" + ], + "@esbuild/freebsd-x64@0.25.12": [ + "npm:@esbuild/freebsd-x64" + ], + "@esbuild/linux-arm64@0.25.12": [ + "npm:@esbuild/linux-arm64" + ], + "@esbuild/linux-arm@0.25.12": [ + "npm:@esbuild/linux-arm" + ], + "@esbuild/linux-ia32@0.25.12": [ + "npm:@esbuild/linux-ia32" + ], + "@esbuild/linux-loong64@0.25.12": [ + "npm:@esbuild/linux-loong64" + ], + "@esbuild/linux-mips64el@0.25.12": [ + "npm:@esbuild/linux-mips64el" + ], + "@esbuild/linux-ppc64@0.25.12": [ + "npm:@esbuild/linux-ppc64" + ], + "@esbuild/linux-riscv64@0.25.12": [ + "npm:@esbuild/linux-riscv64" + ], + "@esbuild/linux-s390x@0.25.12": [ + "npm:@esbuild/linux-s390x" + ], + "@esbuild/linux-x64@0.25.12": [ + "npm:@esbuild/linux-x64" + ], + "@esbuild/netbsd-arm64@0.25.12": [ + "npm:@esbuild/netbsd-arm64" + ], + "@esbuild/netbsd-x64@0.25.12": [ + "npm:@esbuild/netbsd-x64" + ], + "@esbuild/openbsd-arm64@0.25.12": [ + "npm:@esbuild/openbsd-arm64" + ], + "@esbuild/openbsd-x64@0.25.12": [ + "npm:@esbuild/openbsd-x64" + ], + "@esbuild/openharmony-arm64@0.25.12": [ + "npm:@esbuild/openharmony-arm64" + ], + "@esbuild/sunos-x64@0.25.12": [ + "npm:@esbuild/sunos-x64" + ], + "@esbuild/win32-arm64@0.25.12": [ + "npm:@esbuild/win32-arm64" + ], + "@esbuild/win32-ia32@0.25.12": [ + "npm:@esbuild/win32-ia32" + ], + "@esbuild/win32-x64@0.25.12": [ + "npm:@esbuild/win32-x64" + ], + "@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))": [ + "npm:@eslint-community/eslint-utils" + ], + "@eslint-community/regexpp@4.12.2": [ + "npm:@eslint-community/regexpp" + ], + "@eslint-react/ast@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@eslint-react/ast" + ], + "@eslint-react/core@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@eslint-react/core" + ], + "@eslint-react/eff@2.3.9": [ + "npm:@eslint-react/eff" + ], + "@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@eslint-react/eslint-plugin" + ], + "@eslint-react/shared@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@eslint-react/shared" + ], + "@eslint-react/var@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@eslint-react/var" + ], + "@eslint/config-array@0.21.1": [ + "npm:@eslint/config-array" + ], + "@eslint/config-helpers@0.4.2": [ + "npm:@eslint/config-helpers" + ], + "@eslint/core@0.17.0": [ + "npm:@eslint/core" + ], + "@eslint/eslintrc@3.3.1": [ + "npm:@eslint/eslintrc" + ], + "@eslint/js@9.39.1": [ + "npm:@eslint/js" + ], + "@eslint/object-schema@2.1.7": [ + "npm:@eslint/object-schema" + ], + "@eslint/plugin-kit@0.4.1": [ + "npm:@eslint/plugin-kit" + ], + "@faker-js/faker@10.1.0": [ + "npm:@faker-js/faker" + ], + "@gerrit0/mini-shiki@3.15.0": [ + "npm:@gerrit0/mini-shiki" + ], + "@google/genai@1.30.0": [ + "npm:@google/genai" + ], + "@humanfs/core@0.19.1": [ + "npm:@humanfs/core" + ], + "@humanfs/node@0.16.7": [ + "npm:@humanfs/node" + ], + "@humanwhocodes/module-importer@1.0.1": [ + "npm:@humanwhocodes/module-importer" + ], + "@humanwhocodes/retry@0.4.3": [ + "npm:@humanwhocodes/retry" + ], + "@inquirer/external-editor@1.0.3(@types/node@24.10.1)": [ + "npm:@inquirer/external-editor" + ], + "@ioredis/commands@1.4.0": [ + "npm:@ioredis/commands" + ], + "@isaacs/cliui@8.0.2": [ + "npm:@isaacs/cliui" + ], + "@isaacs/fs-minipass@4.0.1": [ + "npm:@isaacs/fs-minipass" + ], + "@jest/diff-sequences@30.0.1": [ + "npm:@jest/diff-sequences" + ], + "@jest/get-type@30.1.0": [ + "npm:@jest/get-type" + ], + "@jest/schemas@30.0.5": [ + "npm:@jest/schemas" + ], + "@jridgewell/gen-mapping@0.3.13": [ + "npm:@jridgewell/gen-mapping" + ], + "@jridgewell/remapping@2.3.5": [ + "npm:@jridgewell/remapping" + ], + "@jridgewell/resolve-uri@3.1.2": [ + "npm:@jridgewell/resolve-uri" + ], + "@jridgewell/source-map@0.3.11": [ + "npm:@jridgewell/source-map" + ], + "@jridgewell/sourcemap-codec@1.5.5": [ + "npm:@jridgewell/sourcemap-codec" + ], + "@jridgewell/trace-mapping@0.3.31": [ + "npm:@jridgewell/trace-mapping" + ], + "@kwsites/file-exists@1.1.1": [ + "npm:@kwsites/file-exists" + ], + "@kwsites/promise-deferred@1.1.1": [ + "npm:@kwsites/promise-deferred" + ], + "@manypkg/find-root@1.1.0": [ + "npm:@manypkg/find-root" + ], + "@manypkg/get-packages@1.1.3": [ + "npm:@manypkg/get-packages" + ], + "@mapbox/node-pre-gyp@2.0.0": [ + "npm:@mapbox/node-pre-gyp" + ], + "@microsoft/api-extractor-model@7.29.6(@types/node@24.10.1)": [ + "npm:@microsoft/api-extractor-model" + ], + "@microsoft/api-extractor@7.47.7(@types/node@24.10.1)": [ + "npm:@microsoft/api-extractor" + ], + "@microsoft/tsdoc-config@0.17.1": [ + "npm:@microsoft/tsdoc-config" + ], + "@microsoft/tsdoc@0.15.1": [ + "npm:@microsoft/tsdoc" + ], + "@napi-rs/wasm-runtime@0.2.12": [ + "npm:@napi-rs/wasm-runtime@0.2.12" + ], + "@napi-rs/wasm-runtime@0.2.4": [ + "npm:@napi-rs/wasm-runtime@0.2.4" + ], + "@napi-rs/wasm-runtime@1.0.7": [ + "npm:@napi-rs/wasm-runtime@1.0.7" + ], + "@nodelib/fs.scandir@2.1.5": [ + "npm:@nodelib/fs.scandir" + ], + "@nodelib/fs.stat@2.0.5": [ + "npm:@nodelib/fs.stat" + ], + "@nodelib/fs.walk@1.2.8": [ + "npm:@nodelib/fs.walk" + ], + "@nx/nx-darwin-arm64@22.1.2": [ + "npm:@nx/nx-darwin-arm64" + ], + "@nx/nx-darwin-x64@22.1.2": [ + "npm:@nx/nx-darwin-x64" + ], + "@nx/nx-freebsd-x64@22.1.2": [ + "npm:@nx/nx-freebsd-x64" + ], + "@nx/nx-linux-arm-gnueabihf@22.1.2": [ + "npm:@nx/nx-linux-arm-gnueabihf" + ], + "@nx/nx-linux-arm64-gnu@22.1.2": [ + "npm:@nx/nx-linux-arm64-gnu" + ], + "@nx/nx-linux-arm64-musl@22.1.2": [ + "npm:@nx/nx-linux-arm64-musl" + ], + "@nx/nx-linux-x64-gnu@22.1.2": [ + "npm:@nx/nx-linux-x64-gnu" + ], + "@nx/nx-linux-x64-musl@22.1.2": [ + "npm:@nx/nx-linux-x64-musl" + ], + "@nx/nx-win32-arm64-msvc@22.1.2": [ + "npm:@nx/nx-win32-arm64-msvc" + ], + "@nx/nx-win32-x64-msvc@22.1.2": [ + "npm:@nx/nx-win32-x64-msvc" + ], + "@oozcitak/dom@2.0.2": [ + "npm:@oozcitak/dom" + ], + "@oozcitak/infra@2.0.2": [ + "npm:@oozcitak/infra" + ], + "@oozcitak/url@3.0.0": [ + "npm:@oozcitak/url" + ], + "@oozcitak/util@10.0.0": [ + "npm:@oozcitak/util" + ], + "@oxc-project/types@0.98.0": [ + "npm:@oxc-project/types" + ], + "@oxc-resolver/binding-android-arm-eabi@11.14.0": [ + "npm:@oxc-resolver/binding-android-arm-eabi" + ], + "@oxc-resolver/binding-android-arm64@11.14.0": [ + "npm:@oxc-resolver/binding-android-arm64" + ], + "@oxc-resolver/binding-darwin-arm64@11.14.0": [ + "npm:@oxc-resolver/binding-darwin-arm64" + ], + "@oxc-resolver/binding-darwin-x64@11.14.0": [ + "npm:@oxc-resolver/binding-darwin-x64" + ], + "@oxc-resolver/binding-freebsd-x64@11.14.0": [ + "npm:@oxc-resolver/binding-freebsd-x64" + ], + "@oxc-resolver/binding-linux-arm-gnueabihf@11.14.0": [ + "npm:@oxc-resolver/binding-linux-arm-gnueabihf" + ], + "@oxc-resolver/binding-linux-arm-musleabihf@11.14.0": [ + "npm:@oxc-resolver/binding-linux-arm-musleabihf" + ], + "@oxc-resolver/binding-linux-arm64-gnu@11.14.0": [ + "npm:@oxc-resolver/binding-linux-arm64-gnu" + ], + "@oxc-resolver/binding-linux-arm64-musl@11.14.0": [ + "npm:@oxc-resolver/binding-linux-arm64-musl" + ], + "@oxc-resolver/binding-linux-ppc64-gnu@11.14.0": [ + "npm:@oxc-resolver/binding-linux-ppc64-gnu" + ], + "@oxc-resolver/binding-linux-riscv64-gnu@11.14.0": [ + "npm:@oxc-resolver/binding-linux-riscv64-gnu" + ], + "@oxc-resolver/binding-linux-riscv64-musl@11.14.0": [ + "npm:@oxc-resolver/binding-linux-riscv64-musl" + ], + "@oxc-resolver/binding-linux-s390x-gnu@11.14.0": [ + "npm:@oxc-resolver/binding-linux-s390x-gnu" + ], + "@oxc-resolver/binding-linux-x64-gnu@11.14.0": [ + "npm:@oxc-resolver/binding-linux-x64-gnu" + ], + "@oxc-resolver/binding-linux-x64-musl@11.14.0": [ + "npm:@oxc-resolver/binding-linux-x64-musl" + ], + "@oxc-resolver/binding-wasm32-wasi@11.14.0": [ + "npm:@oxc-resolver/binding-wasm32-wasi" + ], + "@oxc-resolver/binding-win32-arm64-msvc@11.14.0": [ + "npm:@oxc-resolver/binding-win32-arm64-msvc" + ], + "@oxc-resolver/binding-win32-ia32-msvc@11.14.0": [ + "npm:@oxc-resolver/binding-win32-ia32-msvc" + ], + "@oxc-resolver/binding-win32-x64-msvc@11.14.0": [ + "npm:@oxc-resolver/binding-win32-x64-msvc" + ], + "@parcel/watcher-android-arm64@2.5.1": [ + "npm:@parcel/watcher-android-arm64" + ], + "@parcel/watcher-darwin-arm64@2.5.1": [ + "npm:@parcel/watcher-darwin-arm64" + ], + "@parcel/watcher-darwin-x64@2.5.1": [ + "npm:@parcel/watcher-darwin-x64" + ], + "@parcel/watcher-freebsd-x64@2.5.1": [ + "npm:@parcel/watcher-freebsd-x64" + ], + "@parcel/watcher-linux-arm-glibc@2.5.1": [ + "npm:@parcel/watcher-linux-arm-glibc" + ], + "@parcel/watcher-linux-arm-musl@2.5.1": [ + "npm:@parcel/watcher-linux-arm-musl" + ], + "@parcel/watcher-linux-arm64-glibc@2.5.1": [ + "npm:@parcel/watcher-linux-arm64-glibc" + ], + "@parcel/watcher-linux-arm64-musl@2.5.1": [ + "npm:@parcel/watcher-linux-arm64-musl" + ], + "@parcel/watcher-linux-x64-glibc@2.5.1": [ + "npm:@parcel/watcher-linux-x64-glibc" + ], + "@parcel/watcher-linux-x64-musl@2.5.1": [ + "npm:@parcel/watcher-linux-x64-musl" + ], + "@parcel/watcher-wasm@2.5.1": [ + "npm:@parcel/watcher-wasm" + ], + "@parcel/watcher-win32-arm64@2.5.1": [ + "npm:@parcel/watcher-win32-arm64" + ], + "@parcel/watcher-win32-ia32@2.5.1": [ + "npm:@parcel/watcher-win32-ia32" + ], + "@parcel/watcher-win32-x64@2.5.1": [ + "npm:@parcel/watcher-win32-x64" + ], + "@parcel/watcher@2.5.1": [ + "npm:@parcel/watcher" + ], + "@pkgjs/parseargs@0.11.0": [ + "npm:@pkgjs/parseargs" + ], + "@poppinss/colors@4.1.5": [ + "npm:@poppinss/colors" + ], + "@poppinss/dumper@0.6.4": [ + "npm:@poppinss/dumper" + ], + "@poppinss/exception@1.2.2": [ + "npm:@poppinss/exception" + ], + "@publint/pack@0.1.2": [ + "npm:@publint/pack" + ], + "@rolldown/binding-android-arm64@1.0.0-beta.51": [ + "npm:@rolldown/binding-android-arm64" + ], + "@rolldown/binding-darwin-arm64@1.0.0-beta.51": [ + "npm:@rolldown/binding-darwin-arm64" + ], + "@rolldown/binding-darwin-x64@1.0.0-beta.51": [ + "npm:@rolldown/binding-darwin-x64" + ], + "@rolldown/binding-freebsd-x64@1.0.0-beta.51": [ + "npm:@rolldown/binding-freebsd-x64" + ], + "@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51": [ + "npm:@rolldown/binding-linux-arm-gnueabihf" + ], + "@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51": [ + "npm:@rolldown/binding-linux-arm64-gnu" + ], + "@rolldown/binding-linux-arm64-musl@1.0.0-beta.51": [ + "npm:@rolldown/binding-linux-arm64-musl" + ], + "@rolldown/binding-linux-x64-gnu@1.0.0-beta.51": [ + "npm:@rolldown/binding-linux-x64-gnu" + ], + "@rolldown/binding-linux-x64-musl@1.0.0-beta.51": [ + "npm:@rolldown/binding-linux-x64-musl" + ], + "@rolldown/binding-openharmony-arm64@1.0.0-beta.51": [ + "npm:@rolldown/binding-openharmony-arm64" + ], + "@rolldown/binding-wasm32-wasi@1.0.0-beta.51": [ + "npm:@rolldown/binding-wasm32-wasi" + ], + "@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51": [ + "npm:@rolldown/binding-win32-arm64-msvc" + ], + "@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51": [ + "npm:@rolldown/binding-win32-ia32-msvc" + ], + "@rolldown/binding-win32-x64-msvc@1.0.0-beta.51": [ + "npm:@rolldown/binding-win32-x64-msvc" + ], + "@rolldown/pluginutils@1.0.0-beta.40": [ + "npm:@rolldown/pluginutils@1.0.0-beta.40" + ], + "@rolldown/pluginutils@1.0.0-beta.47": [ + "npm:@rolldown/pluginutils@1.0.0-beta.47" + ], + "@rolldown/pluginutils@1.0.0-beta.51": [ + "npm:@rolldown/pluginutils@1.0.0-beta.51" + ], + "@rollup/plugin-alias@5.1.1(rollup@4.53.3)": [ + "npm:@rollup/plugin-alias" + ], + "@rollup/plugin-commonjs@28.0.9(rollup@4.53.3)": [ + "npm:@rollup/plugin-commonjs" + ], + "@rollup/plugin-inject@5.0.5(rollup@4.53.3)": [ + "npm:@rollup/plugin-inject" + ], + "@rollup/plugin-json@6.1.0(rollup@4.53.3)": [ + "npm:@rollup/plugin-json" + ], + "@rollup/plugin-node-resolve@16.0.3(rollup@4.53.3)": [ + "npm:@rollup/plugin-node-resolve" + ], + "@rollup/plugin-replace@6.0.3(rollup@4.53.3)": [ + "npm:@rollup/plugin-replace" + ], + "@rollup/plugin-terser@0.4.4(rollup@4.53.3)": [ + "npm:@rollup/plugin-terser" + ], + "@rollup/pluginutils@5.3.0(rollup@4.53.3)": [ + "npm:@rollup/pluginutils" + ], + "@rollup/rollup-android-arm-eabi@4.53.3": [ + "npm:@rollup/rollup-android-arm-eabi" + ], + "@rollup/rollup-android-arm64@4.53.3": [ + "npm:@rollup/rollup-android-arm64" + ], + "@rollup/rollup-darwin-arm64@4.53.3": [ + "npm:@rollup/rollup-darwin-arm64" + ], + "@rollup/rollup-darwin-x64@4.53.3": [ + "npm:@rollup/rollup-darwin-x64" + ], + "@rollup/rollup-freebsd-arm64@4.53.3": [ + "npm:@rollup/rollup-freebsd-arm64" + ], + "@rollup/rollup-freebsd-x64@4.53.3": [ + "npm:@rollup/rollup-freebsd-x64" + ], + "@rollup/rollup-linux-arm-gnueabihf@4.53.3": [ + "npm:@rollup/rollup-linux-arm-gnueabihf" + ], + "@rollup/rollup-linux-arm-musleabihf@4.53.3": [ + "npm:@rollup/rollup-linux-arm-musleabihf" + ], + "@rollup/rollup-linux-arm64-gnu@4.53.3": [ + "npm:@rollup/rollup-linux-arm64-gnu" + ], + "@rollup/rollup-linux-arm64-musl@4.53.3": [ + "npm:@rollup/rollup-linux-arm64-musl" + ], + "@rollup/rollup-linux-loong64-gnu@4.53.3": [ + "npm:@rollup/rollup-linux-loong64-gnu" + ], + "@rollup/rollup-linux-ppc64-gnu@4.53.3": [ + "npm:@rollup/rollup-linux-ppc64-gnu" + ], + "@rollup/rollup-linux-riscv64-gnu@4.53.3": [ + "npm:@rollup/rollup-linux-riscv64-gnu" + ], + "@rollup/rollup-linux-riscv64-musl@4.53.3": [ + "npm:@rollup/rollup-linux-riscv64-musl" + ], + "@rollup/rollup-linux-s390x-gnu@4.53.3": [ + "npm:@rollup/rollup-linux-s390x-gnu" + ], + "@rollup/rollup-linux-x64-gnu@4.53.3": [ + "npm:@rollup/rollup-linux-x64-gnu" + ], + "@rollup/rollup-linux-x64-musl@4.53.3": [ + "npm:@rollup/rollup-linux-x64-musl" + ], + "@rollup/rollup-openharmony-arm64@4.53.3": [ + "npm:@rollup/rollup-openharmony-arm64" + ], + "@rollup/rollup-win32-arm64-msvc@4.53.3": [ + "npm:@rollup/rollup-win32-arm64-msvc" + ], + "@rollup/rollup-win32-ia32-msvc@4.53.3": [ + "npm:@rollup/rollup-win32-ia32-msvc" + ], + "@rollup/rollup-win32-x64-gnu@4.53.3": [ + "npm:@rollup/rollup-win32-x64-gnu" + ], + "@rollup/rollup-win32-x64-msvc@4.53.3": [ + "npm:@rollup/rollup-win32-x64-msvc" + ], + "@rushstack/node-core-library@5.7.0(@types/node@24.10.1)": [ + "npm:@rushstack/node-core-library" + ], + "@rushstack/rig-package@0.5.3": [ + "npm:@rushstack/rig-package" + ], + "@rushstack/terminal@0.14.0(@types/node@24.10.1)": [ + "npm:@rushstack/terminal" + ], + "@rushstack/ts-command-line@4.22.6(@types/node@24.10.1)": [ + "npm:@rushstack/ts-command-line" + ], + "@shikijs/engine-oniguruma@3.15.0": [ + "npm:@shikijs/engine-oniguruma" + ], + "@shikijs/langs@3.15.0": [ + "npm:@shikijs/langs" + ], + "@shikijs/themes@3.15.0": [ + "npm:@shikijs/themes" + ], + "@shikijs/types@3.15.0": [ + "npm:@shikijs/types" + ], + "@shikijs/vscode-textmate@10.0.2": [ + "npm:@shikijs/vscode-textmate" + ], + "@sinclair/typebox@0.34.41": [ + "npm:@sinclair/typebox" + ], + "@sindresorhus/is@7.1.1": [ + "npm:@sindresorhus/is" + ], + "@sindresorhus/merge-streams@4.0.0": [ + "npm:@sindresorhus/merge-streams" + ], + "@size-limit/esbuild@11.2.0(size-limit@11.2.0)": [ + "npm:@size-limit/esbuild" + ], + "@size-limit/file@11.2.0(size-limit@11.2.0)": [ + "npm:@size-limit/file" + ], + "@size-limit/preset-small-lib@11.2.0(size-limit@11.2.0)": [ + "npm:@size-limit/preset-small-lib" + ], + "@solid-primitives/event-listener@2.4.3(solid-js@1.9.10)": [ + "npm:@solid-primitives/event-listener" + ], + "@solid-primitives/keyboard@1.3.3(solid-js@1.9.10)": [ + "npm:@solid-primitives/keyboard" + ], + "@solid-primitives/resize-observer@2.1.3(solid-js@1.9.10)": [ + "npm:@solid-primitives/resize-observer" + ], + "@solid-primitives/rootless@1.5.2(solid-js@1.9.10)": [ + "npm:@solid-primitives/rootless" + ], + "@solid-primitives/static-store@0.1.2(solid-js@1.9.10)": [ + "npm:@solid-primitives/static-store" + ], + "@solid-primitives/utils@6.3.2(solid-js@1.9.10)": [ + "npm:@solid-primitives/utils" + ], + "@speed-highlight/core@1.2.8": [ + "npm:@speed-highlight/core" + ], + "@standard-schema/spec@1.0.0": [ + "npm:@standard-schema/spec" + ], + "@stylistic/eslint-plugin@5.5.0(eslint@9.39.1(jiti@2.6.1))": [ + "npm:@stylistic/eslint-plugin" + ], + "@sveltejs/acorn-typescript@1.0.7(acorn@8.15.0)": [ + "npm:@sveltejs/acorn-typescript" + ], + "@svitejs/changesets-changelog-github-compact@1.2.0": [ + "npm:@svitejs/changesets-changelog-github-compact" + ], + "@tailwindcss/node@4.1.17": [ + "npm:@tailwindcss/node" + ], + "@tailwindcss/oxide-android-arm64@4.1.17": [ + "npm:@tailwindcss/oxide-android-arm64" + ], + "@tailwindcss/oxide-darwin-arm64@4.1.17": [ + "npm:@tailwindcss/oxide-darwin-arm64" + ], + "@tailwindcss/oxide-darwin-x64@4.1.17": [ + "npm:@tailwindcss/oxide-darwin-x64" + ], + "@tailwindcss/oxide-freebsd-x64@4.1.17": [ + "npm:@tailwindcss/oxide-freebsd-x64" + ], + "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17": [ + "npm:@tailwindcss/oxide-linux-arm-gnueabihf" + ], + "@tailwindcss/oxide-linux-arm64-gnu@4.1.17": [ + "npm:@tailwindcss/oxide-linux-arm64-gnu" + ], + "@tailwindcss/oxide-linux-arm64-musl@4.1.17": [ + "npm:@tailwindcss/oxide-linux-arm64-musl" + ], + "@tailwindcss/oxide-linux-x64-gnu@4.1.17": [ + "npm:@tailwindcss/oxide-linux-x64-gnu" + ], + "@tailwindcss/oxide-linux-x64-musl@4.1.17": [ + "npm:@tailwindcss/oxide-linux-x64-musl" + ], + "@tailwindcss/oxide-wasm32-wasi@4.1.17": [ + "npm:@tailwindcss/oxide-wasm32-wasi" + ], + "@tailwindcss/oxide-win32-arm64-msvc@4.1.17": [ + "npm:@tailwindcss/oxide-win32-arm64-msvc" + ], + "@tailwindcss/oxide-win32-x64-msvc@4.1.17": [ + "npm:@tailwindcss/oxide-win32-x64-msvc" + ], + "@tailwindcss/oxide@4.1.17": [ + "npm:@tailwindcss/oxide" + ], + "@tailwindcss/vite@4.1.17(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tailwindcss/vite" + ], + "@tanstack/config@0.22.1(@types/node@24.10.1)(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tanstack/config" + ], + "@tanstack/devtools-client@0.0.4": [ + "npm:@tanstack/devtools-client" + ], + "@tanstack/devtools-event-bus@0.3.3": [ + "npm:@tanstack/devtools-event-bus" + ], + "@tanstack/devtools-event-client@0.3.5": [ + "npm:@tanstack/devtools-event-client" + ], + "@tanstack/devtools-ui@0.4.4(csstype@3.2.3)(solid-js@1.9.10)": [ + "npm:@tanstack/devtools-ui" + ], + "@tanstack/devtools-utils@0.0.8(@types/react@19.2.7)(csstype@3.2.3)(react@19.2.0)(solid-js@1.9.10)": [ + "npm:@tanstack/devtools-utils" + ], + "@tanstack/devtools@0.8.2(csstype@3.2.3)(solid-js@1.9.10)": [ + "npm:@tanstack/devtools" + ], + "@tanstack/directive-functions-plugin@1.139.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tanstack/directive-functions-plugin" + ], + "@tanstack/eslint-config@0.3.3(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@tanstack/eslint-config" + ], + "@tanstack/history@1.139.0": [ + "npm:@tanstack/history" + ], + "@tanstack/nitro-v2-vite-plugin@1.139.0(rolldown@1.0.0-beta.51)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tanstack/nitro-v2-vite-plugin" + ], + "@tanstack/publish-config@0.2.2": [ + "npm:@tanstack/publish-config" + ], + "@tanstack/query-core@5.90.5": [ + "npm:@tanstack/query-core" + ], + "@tanstack/react-devtools@0.8.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(csstype@3.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)": [ + "npm:@tanstack/react-devtools" + ], + "@tanstack/react-query@5.90.5(react@19.2.0)": [ + "npm:@tanstack/react-query" + ], + "@tanstack/react-router-devtools@1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.139.7)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)": [ + "npm:@tanstack/react-router-devtools" + ], + "@tanstack/react-router-ssr-query@1.139.7(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.139.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ + "npm:@tanstack/react-router-ssr-query" + ], + "@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ + "npm:@tanstack/react-router" + ], + "@tanstack/react-start-client@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ + "npm:@tanstack/react-start-client" + ], + "@tanstack/react-start-server@1.139.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ + "npm:@tanstack/react-start-server" + ], + "@tanstack/react-start@1.139.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tanstack/react-start" + ], + "@tanstack/react-store@0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ + "npm:@tanstack/react-store" + ], + "@tanstack/router-core@1.139.7": [ + "npm:@tanstack/router-core" + ], + "@tanstack/router-devtools-core@1.139.7(@tanstack/router-core@1.139.7)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)": [ + "npm:@tanstack/router-devtools-core" + ], + "@tanstack/router-generator@1.139.7": [ + "npm:@tanstack/router-generator" + ], + "@tanstack/router-plugin@1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tanstack/router-plugin" + ], + "@tanstack/router-ssr-query-core@1.139.7(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.139.7)": [ + "npm:@tanstack/router-ssr-query-core" + ], + "@tanstack/router-utils@1.139.0": [ + "npm:@tanstack/router-utils" + ], + "@tanstack/server-functions-plugin@1.139.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tanstack/server-functions-plugin" + ], + "@tanstack/start-client-core@1.139.7": [ + "npm:@tanstack/start-client-core" + ], + "@tanstack/start-plugin-core@1.139.8(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tanstack/start-plugin-core" + ], + "@tanstack/start-server-core@1.139.8": [ + "npm:@tanstack/start-server-core" + ], + "@tanstack/start-storage-context@1.139.7": [ + "npm:@tanstack/start-storage-context" + ], + "@tanstack/store@0.8.0": [ + "npm:@tanstack/store" + ], + "@tanstack/typedoc-config@0.3.1(typescript@5.9.3)": [ + "npm:@tanstack/typedoc-config" + ], + "@tanstack/virtual-file-routes@1.139.0": [ + "npm:@tanstack/virtual-file-routes" + ], + "@tanstack/vite-config@0.4.1(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@tanstack/vite-config" + ], + "@testing-library/dom@10.4.1": [ + "npm:@testing-library/dom" + ], + "@testing-library/jest-dom@6.9.1": [ + "npm:@testing-library/jest-dom" + ], + "@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ + "npm:@testing-library/react" + ], + "@tybys/wasm-util@0.10.1": [ + "npm:@tybys/wasm-util@0.10.1" + ], + "@tybys/wasm-util@0.9.0": [ + "npm:@tybys/wasm-util@0.9.0" + ], + "@types/argparse@1.0.38": [ + "npm:@types/argparse" + ], + "@types/aria-query@5.0.4": [ + "npm:@types/aria-query" + ], + "@types/babel__core@7.20.5": [ + "npm:@types/babel__core" + ], + "@types/babel__generator@7.27.0": [ + "npm:@types/babel__generator" + ], + "@types/babel__template@7.4.4": [ + "npm:@types/babel__template" + ], + "@types/babel__traverse@7.28.0": [ + "npm:@types/babel__traverse" + ], + "@types/chai@5.2.3": [ + "npm:@types/chai" + ], + "@types/conventional-commits-parser@5.0.2": [ + "npm:@types/conventional-commits-parser" + ], + "@types/debug@4.1.12": [ + "npm:@types/debug" + ], + "@types/deep-eql@4.0.2": [ + "npm:@types/deep-eql" + ], + "@types/estree-jsx@1.0.5": [ + "npm:@types/estree-jsx" + ], + "@types/estree@1.0.8": [ + "npm:@types/estree" + ], + "@types/hast@3.0.4": [ + "npm:@types/hast" + ], + "@types/json-schema@7.0.15": [ + "npm:@types/json-schema" + ], + "@types/mdast@4.0.4": [ + "npm:@types/mdast" + ], + "@types/ms@2.1.0": [ + "npm:@types/ms" + ], + "@types/node@12.20.55": [ + "npm:@types/node@12.20.55" + ], + "@types/node@20.19.25": [ + "npm:@types/node@20.19.25" + ], + "@types/node@24.10.1": [ + "npm:@types/node" + ], + "@types/react-dom@19.2.3(@types/react@19.2.7)": [ + "npm:@types/react-dom" + ], + "@types/react@19.2.7": [ + "npm:@types/react" + ], + "@types/resolve@1.20.2": [ + "npm:@types/resolve" + ], + "@types/unist@2.0.11": [ + "npm:@types/unist@2.0.11" + ], + "@types/unist@3.0.3": [ + "npm:@types/unist@3.0.3" + ], + "@types/whatwg-mimetype@3.0.2": [ + "npm:@types/whatwg-mimetype" + ], + "@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@typescript-eslint/eslint-plugin" + ], + "@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@typescript-eslint/parser" + ], + "@typescript-eslint/project-service@8.46.3(typescript@5.9.3)": [ + "npm:@typescript-eslint/project-service@8.46.3" + ], + "@typescript-eslint/project-service@8.48.0(typescript@5.9.3)": [ + "npm:@typescript-eslint/project-service@8.48.0" + ], + "@typescript-eslint/scope-manager@8.46.3": [ + "npm:@typescript-eslint/scope-manager@8.46.3" + ], + "@typescript-eslint/scope-manager@8.48.0": [ + "npm:@typescript-eslint/scope-manager@8.48.0" + ], + "@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)": [ + "npm:@typescript-eslint/tsconfig-utils@8.46.3" + ], + "@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)": [ + "npm:@typescript-eslint/tsconfig-utils@8.48.0" + ], + "@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@typescript-eslint/type-utils@8.46.3" + ], + "@typescript-eslint/type-utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@typescript-eslint/type-utils@8.48.0" + ], + "@typescript-eslint/types@8.46.3": [ + "npm:@typescript-eslint/types@8.46.3" + ], + "@typescript-eslint/types@8.48.0": [ + "npm:@typescript-eslint/types@8.48.0" + ], + "@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)": [ + "npm:@typescript-eslint/typescript-estree@8.46.3" + ], + "@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)": [ + "npm:@typescript-eslint/typescript-estree@8.48.0" + ], + "@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@typescript-eslint/utils@8.46.3" + ], + "@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:@typescript-eslint/utils@8.48.0" + ], + "@typescript-eslint/visitor-keys@8.46.3": [ + "npm:@typescript-eslint/visitor-keys@8.46.3" + ], + "@typescript-eslint/visitor-keys@8.48.0": [ + "npm:@typescript-eslint/visitor-keys@8.48.0" + ], + "@ungap/structured-clone@1.3.0": [ + "npm:@ungap/structured-clone" + ], + "@unrs/resolver-binding-android-arm-eabi@1.11.1": [ + "npm:@unrs/resolver-binding-android-arm-eabi" + ], + "@unrs/resolver-binding-android-arm64@1.11.1": [ + "npm:@unrs/resolver-binding-android-arm64" + ], + "@unrs/resolver-binding-darwin-arm64@1.11.1": [ + "npm:@unrs/resolver-binding-darwin-arm64" + ], + "@unrs/resolver-binding-darwin-x64@1.11.1": [ + "npm:@unrs/resolver-binding-darwin-x64" + ], + "@unrs/resolver-binding-freebsd-x64@1.11.1": [ + "npm:@unrs/resolver-binding-freebsd-x64" + ], + "@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": [ + "npm:@unrs/resolver-binding-linux-arm-gnueabihf" + ], + "@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": [ + "npm:@unrs/resolver-binding-linux-arm-musleabihf" + ], + "@unrs/resolver-binding-linux-arm64-gnu@1.11.1": [ + "npm:@unrs/resolver-binding-linux-arm64-gnu" + ], + "@unrs/resolver-binding-linux-arm64-musl@1.11.1": [ + "npm:@unrs/resolver-binding-linux-arm64-musl" + ], + "@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": [ + "npm:@unrs/resolver-binding-linux-ppc64-gnu" + ], + "@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": [ + "npm:@unrs/resolver-binding-linux-riscv64-gnu" + ], + "@unrs/resolver-binding-linux-riscv64-musl@1.11.1": [ + "npm:@unrs/resolver-binding-linux-riscv64-musl" + ], + "@unrs/resolver-binding-linux-s390x-gnu@1.11.1": [ + "npm:@unrs/resolver-binding-linux-s390x-gnu" + ], + "@unrs/resolver-binding-linux-x64-gnu@1.11.1": [ + "npm:@unrs/resolver-binding-linux-x64-gnu" + ], + "@unrs/resolver-binding-linux-x64-musl@1.11.1": [ + "npm:@unrs/resolver-binding-linux-x64-musl" + ], + "@unrs/resolver-binding-wasm32-wasi@1.11.1": [ + "npm:@unrs/resolver-binding-wasm32-wasi" + ], + "@unrs/resolver-binding-win32-arm64-msvc@1.11.1": [ + "npm:@unrs/resolver-binding-win32-arm64-msvc" + ], + "@unrs/resolver-binding-win32-ia32-msvc@1.11.1": [ + "npm:@unrs/resolver-binding-win32-ia32-msvc" + ], + "@unrs/resolver-binding-win32-x64-msvc@1.11.1": [ + "npm:@unrs/resolver-binding-win32-x64-msvc" + ], + "@vercel/nft@0.30.3(rollup@4.53.3)": [ + "npm:@vercel/nft" + ], + "@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@vitejs/plugin-react" + ], + "@vitest/expect@4.0.14": [ + "npm:@vitest/expect" + ], + "@vitest/mocker@4.0.14(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:@vitest/mocker" + ], + "@vitest/pretty-format@4.0.14": [ + "npm:@vitest/pretty-format" + ], + "@vitest/runner@4.0.14": [ + "npm:@vitest/runner" + ], + "@vitest/snapshot@4.0.14": [ + "npm:@vitest/snapshot" + ], + "@vitest/spy@4.0.14": [ + "npm:@vitest/spy" + ], + "@vitest/utils@4.0.14": [ + "npm:@vitest/utils" + ], + "@volar/language-core@2.4.23": [ + "npm:@volar/language-core" + ], + "@volar/source-map@2.4.23": [ + "npm:@volar/source-map" + ], + "@volar/typescript@2.4.23": [ + "npm:@volar/typescript" + ], + "@vue/compiler-core@3.5.24": [ + "npm:@vue/compiler-core" + ], + "@vue/compiler-dom@3.5.24": [ + "npm:@vue/compiler-dom" + ], + "@vue/compiler-vue2@2.7.16": [ + "npm:@vue/compiler-vue2" + ], + "@vue/language-core@2.1.6(typescript@5.9.3)": [ + "npm:@vue/language-core" + ], + "@vue/shared@3.5.24": [ + "npm:@vue/shared" + ], + "@yarnpkg/lockfile@1.1.0": [ + "npm:@yarnpkg/lockfile" + ], + "@yarnpkg/parsers@3.0.2": [ + "npm:@yarnpkg/parsers" + ], + "@zkochan/js-yaml@0.0.7": [ + "npm:@zkochan/js-yaml" + ], + "JSONStream@1.3.5": [ + "npm:JSONStream" + ], + "abbrev@3.0.1": [ + "npm:abbrev" + ], + "abort-controller@3.0.0": [ + "npm:abort-controller" + ], + "acorn-import-attributes@1.9.5(acorn@8.15.0)": [ + "npm:acorn-import-attributes" + ], + "acorn-jsx@5.3.2(acorn@8.15.0)": [ + "npm:acorn-jsx" + ], + "acorn@8.15.0": [ + "npm:acorn" + ], + "agent-base@7.1.4": [ + "npm:agent-base" + ], + "ajv-draft-04@1.0.0(ajv@8.13.0)": [ + "npm:ajv-draft-04" + ], + "ajv-formats@3.0.1(ajv@8.13.0)": [ + "npm:ajv-formats" + ], + "ajv@6.12.6": [ + "npm:ajv@6.12.6" + ], + "ajv@8.12.0": [ + "npm:ajv@8.12.0" + ], + "ajv@8.13.0": [ + "npm:ajv@8.13.0" + ], + "ansi-colors@4.1.3": [ + "npm:ansi-colors" + ], + "ansi-regex@5.0.1": [ + "npm:ansi-regex@5.0.1" + ], + "ansi-regex@6.2.2": [ + "npm:ansi-regex@6.2.2" + ], + "ansi-styles@4.3.0": [ + "npm:ansi-styles@4.3.0" + ], + "ansi-styles@5.2.0": [ + "npm:ansi-styles@5.2.0" + ], + "ansi-styles@6.2.3": [ + "npm:ansi-styles@6.2.3" + ], + "ansis@4.2.0": [ + "npm:ansis" + ], + "anymatch@3.1.3": [ + "npm:anymatch" + ], + "archiver-utils@5.0.2": [ + "npm:archiver-utils" + ], + "archiver@7.0.1": [ + "npm:archiver" + ], + "argparse@1.0.10": [ + "npm:argparse@1.0.10" + ], + "argparse@2.0.1": [ + "npm:argparse@2.0.1" + ], + "aria-query@5.3.0": [ + "npm:aria-query@5.3.0" + ], + "aria-query@5.3.2": [ + "npm:aria-query@5.3.2" + ], + "array-ify@1.0.0": [ + "npm:array-ify" + ], + "array-union@2.1.0": [ + "npm:array-union" + ], + "assertion-error@2.0.1": [ + "npm:assertion-error" + ], + "ast-types@0.16.1": [ + "npm:ast-types" + ], + "async-sema@3.1.1": [ + "npm:async-sema" + ], + "async@3.2.6": [ + "npm:async" + ], + "asynckit@0.4.0": [ + "npm:asynckit" + ], + "axios@1.13.2": [ + "npm:axios" + ], + "axobject-query@4.1.0": [ + "npm:axobject-query" + ], + "b4a@1.7.3": [ + "npm:b4a" + ], + "babel-dead-code-elimination@1.0.10": [ + "npm:babel-dead-code-elimination" + ], + "babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.5)": [ + "npm:babel-plugin-jsx-dom-expressions" + ], + "babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@1.9.10)": [ + "npm:babel-preset-solid" + ], + "bail@2.0.2": [ + "npm:bail" + ], + "balanced-match@1.0.2": [ + "npm:balanced-match" + ], + "bare-events@2.8.1": [ + "npm:bare-events" + ], + "base64-js@1.5.1": [ + "npm:base64-js" + ], + "baseline-browser-mapping@2.8.22": [ + "npm:baseline-browser-mapping" + ], + "better-path-resolve@1.0.0": [ + "npm:better-path-resolve" + ], + "bidi-js@1.0.3": [ + "npm:bidi-js" + ], + "bignumber.js@9.3.1": [ + "npm:bignumber.js" + ], + "binary-extensions@2.3.0": [ + "npm:binary-extensions" + ], + "bindings@1.5.0": [ + "npm:bindings" + ], + "birecord@0.1.1": [ + "npm:birecord" + ], + "bl@4.1.0": [ + "npm:bl" + ], + "boolbase@1.0.0": [ + "npm:boolbase" + ], + "brace-expansion@1.1.12": [ + "npm:brace-expansion@1.1.12" + ], + "brace-expansion@2.0.2": [ + "npm:brace-expansion@2.0.2" + ], + "braces@3.0.3": [ + "npm:braces" + ], + "browserslist@4.27.0": [ + "npm:browserslist" + ], + "buffer-crc32@1.0.0": [ + "npm:buffer-crc32" + ], + "buffer-equal-constant-time@1.0.1": [ + "npm:buffer-equal-constant-time" + ], + "buffer-from@1.1.2": [ + "npm:buffer-from" + ], + "buffer@5.7.1": [ + "npm:buffer@5.7.1" + ], + "buffer@6.0.3": [ + "npm:buffer@6.0.3" + ], + "bytes-iec@3.1.1": [ + "npm:bytes-iec" + ], + "c12@3.3.1(magicast@0.5.1)": [ + "npm:c12" + ], + "call-bind-apply-helpers@1.0.2": [ + "npm:call-bind-apply-helpers" + ], + "callsites@3.1.0": [ + "npm:callsites" + ], + "caniuse-lite@1.0.30001752": [ + "npm:caniuse-lite" + ], + "ccount@2.0.1": [ + "npm:ccount" + ], + "chai@6.2.1": [ + "npm:chai" + ], + "chalk@4.1.2": [ + "npm:chalk@4.1.2" + ], + "chalk@5.6.2": [ + "npm:chalk@5.6.2" + ], + "character-entities-html4@2.1.0": [ + "npm:character-entities-html4" + ], + "character-entities-legacy@3.0.0": [ + "npm:character-entities-legacy" + ], + "character-entities@2.0.2": [ + "npm:character-entities" + ], + "character-reference-invalid@2.0.1": [ + "npm:character-reference-invalid" + ], + "chardet@2.1.1": [ + "npm:chardet" + ], + "cheerio-select@2.1.0": [ + "npm:cheerio-select" + ], + "cheerio@1.1.2": [ + "npm:cheerio" + ], + "chokidar@3.6.0": [ + "npm:chokidar@3.6.0" + ], + "chokidar@4.0.3": [ + "npm:chokidar@4.0.3" + ], + "chownr@3.0.0": [ + "npm:chownr" + ], + "ci-info@3.9.0": [ + "npm:ci-info" + ], + "citty@0.1.6": [ + "npm:citty" + ], + "cli-cursor@3.1.0": [ + "npm:cli-cursor" + ], + "cli-spinners@2.6.1": [ + "npm:cli-spinners" + ], + "clipboardy@4.0.0": [ + "npm:clipboardy" + ], + "cliui@8.0.1": [ + "npm:cliui" + ], + "clone@1.0.4": [ + "npm:clone" + ], + "clsx@2.1.1": [ + "npm:clsx" + ], + "cluster-key-slot@1.1.2": [ + "npm:cluster-key-slot" + ], + "color-convert@2.0.1": [ + "npm:color-convert" + ], + "color-name@1.1.4": [ + "npm:color-name" + ], + "combined-stream@1.0.8": [ + "npm:combined-stream" + ], + "comma-separated-tokens@2.0.3": [ + "npm:comma-separated-tokens" + ], + "commander@2.20.3": [ + "npm:commander" + ], + "comment-parser@1.4.1": [ + "npm:comment-parser" + ], + "commondir@1.0.1": [ + "npm:commondir" + ], + "compare-func@2.0.0": [ + "npm:compare-func" + ], + "compare-versions@6.1.1": [ + "npm:compare-versions" + ], + "compatx@0.2.0": [ + "npm:compatx" + ], + "compress-commons@6.0.2": [ + "npm:compress-commons" + ], + "computeds@0.0.1": [ + "npm:computeds" + ], + "concat-map@0.0.1": [ + "npm:concat-map" + ], + "confbox@0.1.8": [ + "npm:confbox@0.1.8" + ], + "confbox@0.2.2": [ + "npm:confbox@0.2.2" + ], + "consola@3.4.2": [ + "npm:consola" + ], + "conventional-changelog-angular@7.0.0": [ + "npm:conventional-changelog-angular" + ], + "conventional-commits-parser@5.0.0": [ + "npm:conventional-commits-parser" + ], + "convert-source-map@2.0.0": [ + "npm:convert-source-map" + ], + "cookie-es@1.2.2": [ + "npm:cookie-es@1.2.2" + ], + "cookie-es@2.0.0": [ + "npm:cookie-es@2.0.0" + ], + "cookie@1.0.2": [ + "npm:cookie" + ], + "core-util-is@1.0.3": [ + "npm:core-util-is" + ], + "crc-32@1.2.2": [ + "npm:crc-32" + ], + "crc32-stream@6.0.0": [ + "npm:crc32-stream" + ], + "croner@9.1.0": [ + "npm:croner" + ], + "cross-spawn@7.0.6": [ + "npm:cross-spawn" + ], + "crossws@0.3.5": [ + "npm:crossws" + ], + "css-select@5.2.2": [ + "npm:css-select" + ], + "css-tree@3.1.0": [ + "npm:css-tree" + ], + "css-what@6.2.2": [ + "npm:css-what" + ], + "css.escape@1.5.1": [ + "npm:css.escape" + ], + "cssstyle@5.3.3(postcss@8.5.6)": [ + "npm:cssstyle" + ], + "csstype@3.1.3": [ + "npm:csstype@3.1.3" + ], + "csstype@3.2.3": [ + "npm:csstype@3.2.3" + ], + "data-uri-to-buffer@4.0.1": [ + "npm:data-uri-to-buffer" + ], + "data-urls@6.0.0": [ + "npm:data-urls" + ], + "dataloader@1.4.0": [ + "npm:dataloader" + ], + "db0@0.3.4": [ + "npm:db0" + ], + "de-indent@1.0.2": [ + "npm:de-indent" + ], + "debug@4.4.3": [ + "npm:debug" + ], + "decimal.js@10.6.0": [ + "npm:decimal.js" + ], + "decode-named-character-reference@1.2.0": [ + "npm:decode-named-character-reference" + ], + "deep-is@0.1.4": [ + "npm:deep-is" + ], + "deepmerge@4.3.1": [ + "npm:deepmerge" + ], + "defaults@1.0.4": [ + "npm:defaults" + ], + "define-lazy-prop@2.0.0": [ + "npm:define-lazy-prop" + ], + "defu@6.1.4": [ + "npm:defu" + ], + "delayed-stream@1.0.0": [ + "npm:delayed-stream" + ], + "denque@2.1.0": [ + "npm:denque" + ], + "depd@2.0.0": [ + "npm:depd" + ], + "dequal@2.0.3": [ + "npm:dequal" + ], + "destr@2.0.5": [ + "npm:destr" + ], + "detect-indent@6.1.0": [ + "npm:detect-indent" + ], + "detect-libc@1.0.3": [ + "npm:detect-libc@1.0.3" + ], + "detect-libc@2.1.2": [ + "npm:detect-libc@2.1.2" + ], + "devalue@5.5.0": [ + "npm:devalue" + ], + "devlop@1.1.0": [ + "npm:devlop" + ], + "diff@8.0.2": [ + "npm:diff" + ], + "dir-glob@3.0.1": [ + "npm:dir-glob" + ], + "dom-accessibility-api@0.5.16": [ + "npm:dom-accessibility-api@0.5.16" + ], + "dom-accessibility-api@0.6.3": [ + "npm:dom-accessibility-api@0.6.3" + ], + "dom-serializer@2.0.0": [ + "npm:dom-serializer" + ], + "domelementtype@2.3.0": [ + "npm:domelementtype" + ], + "domhandler@5.0.3": [ + "npm:domhandler" + ], + "domutils@3.2.2": [ + "npm:domutils" + ], + "dot-prop@10.1.0": [ + "npm:dot-prop@10.1.0" + ], + "dot-prop@5.3.0": [ + "npm:dot-prop@5.3.0" + ], + "dotenv-expand@11.0.7": [ + "npm:dotenv-expand" + ], + "dotenv@16.4.7": [ + "npm:dotenv@16.4.7" + ], + "dotenv@16.6.1": [ + "npm:dotenv@16.6.1" + ], + "dotenv@17.2.3": [ + "npm:dotenv@17.2.3" + ], + "dunder-proto@1.0.1": [ + "npm:dunder-proto" + ], + "duplexer@0.1.2": [ + "npm:duplexer" + ], + "eastasianwidth@0.2.0": [ + "npm:eastasianwidth" + ], + "ecdsa-sig-formatter@1.0.11": [ + "npm:ecdsa-sig-formatter" + ], + "ee-first@1.1.1": [ + "npm:ee-first" + ], + "electron-to-chromium@1.5.244": [ + "npm:electron-to-chromium" + ], + "emoji-regex@8.0.0": [ + "npm:emoji-regex@8.0.0" + ], + "emoji-regex@9.2.2": [ + "npm:emoji-regex@9.2.2" + ], + "encodeurl@2.0.0": [ + "npm:encodeurl" + ], + "encoding-sniffer@0.2.1": [ + "npm:encoding-sniffer" + ], + "end-of-stream@1.4.5": [ + "npm:end-of-stream" + ], + "enhanced-resolve@5.18.3": [ + "npm:enhanced-resolve" + ], + "enquirer@2.3.6": [ + "npm:enquirer@2.3.6" + ], + "enquirer@2.4.1": [ + "npm:enquirer@2.4.1" + ], + "entities@4.5.0": [ + "npm:entities@4.5.0" + ], + "entities@6.0.1": [ + "npm:entities@6.0.1" + ], + "error-stack-parser-es@1.0.5": [ + "npm:error-stack-parser-es" + ], + "es-define-property@1.0.1": [ + "npm:es-define-property" + ], + "es-errors@1.3.0": [ + "npm:es-errors" + ], + "es-module-lexer@1.7.0": [ + "npm:es-module-lexer" + ], + "es-object-atoms@1.1.1": [ + "npm:es-object-atoms" + ], + "es-set-tostringtag@2.1.0": [ + "npm:es-set-tostringtag" + ], + "esbuild@0.25.12": [ + "npm:esbuild" + ], + "escalade@3.2.0": [ + "npm:escalade" + ], + "escape-html@1.0.3": [ + "npm:escape-html" + ], + "escape-string-regexp@1.0.5": [ + "npm:escape-string-regexp@1.0.5" + ], + "escape-string-regexp@4.0.0": [ + "npm:escape-string-regexp@4.0.0" + ], + "escape-string-regexp@5.0.0": [ + "npm:escape-string-regexp@5.0.0" + ], + "eslint-compat-utils@0.5.1(eslint@9.39.1(jiti@2.6.1))": [ + "npm:eslint-compat-utils" + ], + "eslint-import-context@0.1.9(unrs-resolver@1.11.1)": [ + "npm:eslint-import-context" + ], + "eslint-plugin-es-x@7.8.0(eslint@9.39.1(jiti@2.6.1))": [ + "npm:eslint-plugin-es-x" + ], + "eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))": [ + "npm:eslint-plugin-import-x" + ], + "eslint-plugin-n@17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:eslint-plugin-n" + ], + "eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.39.1(jiti@2.6.1))": [ + "npm:eslint-plugin-react-compiler" + ], + "eslint-plugin-react-dom@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:eslint-plugin-react-dom" + ], + "eslint-plugin-react-hooks-extra@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:eslint-plugin-react-hooks-extra" + ], + "eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1))": [ + "npm:eslint-plugin-react-hooks" + ], + "eslint-plugin-react-naming-convention@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:eslint-plugin-react-naming-convention" + ], + "eslint-plugin-react-web-api@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:eslint-plugin-react-web-api" + ], + "eslint-plugin-react-x@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:eslint-plugin-react-x" + ], + "eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))": [ + "npm:eslint-plugin-unused-imports" + ], + "eslint-scope@8.4.0": [ + "npm:eslint-scope" + ], + "eslint-visitor-keys@3.4.3": [ + "npm:eslint-visitor-keys@3.4.3" + ], + "eslint-visitor-keys@4.2.1": [ + "npm:eslint-visitor-keys@4.2.1" + ], + "eslint@9.39.1(jiti@2.6.1)": [ + "npm:eslint" + ], + "esm-env@1.2.2": [ + "npm:esm-env" + ], + "espree@10.4.0": [ + "npm:espree" + ], + "esprima@4.0.1": [ + "npm:esprima" + ], + "esquery@1.6.0": [ + "npm:esquery" + ], + "esrap@2.2.0": [ + "npm:esrap" + ], + "esrecurse@4.3.0": [ + "npm:esrecurse" + ], + "estraverse@5.3.0": [ + "npm:estraverse" + ], + "estree-util-is-identifier-name@3.0.0": [ + "npm:estree-util-is-identifier-name" + ], + "estree-walker@2.0.2": [ + "npm:estree-walker@2.0.2" + ], + "estree-walker@3.0.3": [ + "npm:estree-walker@3.0.3" + ], + "esutils@2.0.3": [ + "npm:esutils" + ], + "etag@1.8.1": [ + "npm:etag" + ], + "event-target-shim@5.0.1": [ + "npm:event-target-shim" + ], + "events-universal@1.0.1": [ + "npm:events-universal" + ], + "events@3.3.0": [ + "npm:events" + ], + "eventsource-parser@3.0.6": [ + "npm:eventsource-parser" + ], + "execa@8.0.1": [ + "npm:execa" + ], + "expect-type@1.2.2": [ + "npm:expect-type" + ], + "exsolve@1.0.7": [ + "npm:exsolve" + ], + "extend@3.0.2": [ + "npm:extend" + ], + "extendable-error@0.1.7": [ + "npm:extendable-error" + ], + "fast-deep-equal@3.1.3": [ + "npm:fast-deep-equal" + ], + "fast-fifo@1.3.2": [ + "npm:fast-fifo" + ], + "fast-glob@3.3.3": [ + "npm:fast-glob" + ], + "fast-json-stable-stringify@2.1.0": [ + "npm:fast-json-stable-stringify" + ], + "fast-levenshtein@2.0.6": [ + "npm:fast-levenshtein" + ], + "fastq@1.19.1": [ + "npm:fastq" + ], + "fd-package-json@2.0.0": [ + "npm:fd-package-json" + ], + "fdir@6.5.0(picomatch@4.0.3)": [ + "npm:fdir" + ], + "fetch-blob@3.2.0": [ + "npm:fetch-blob" + ], + "fetchdts@0.1.7": [ + "npm:fetchdts" + ], + "figures@3.2.0": [ + "npm:figures" + ], + "file-entry-cache@8.0.0": [ + "npm:file-entry-cache" + ], + "file-uri-to-path@1.0.0": [ + "npm:file-uri-to-path" + ], + "fill-range@7.1.1": [ + "npm:fill-range" + ], + "find-up@4.1.0": [ + "npm:find-up@4.1.0" + ], + "find-up@5.0.0": [ + "npm:find-up@5.0.0" + ], + "flat-cache@4.0.1": [ + "npm:flat-cache" + ], + "flat@5.0.2": [ + "npm:flat" + ], + "flatted@3.3.3": [ + "npm:flatted" + ], + "follow-redirects@1.15.11": [ + "npm:follow-redirects" + ], + "foreground-child@3.3.1": [ + "npm:foreground-child" + ], + "form-data@4.0.4": [ + "npm:form-data" + ], + "formatly@0.3.0": [ + "npm:formatly" + ], + "formdata-polyfill@4.0.10": [ + "npm:formdata-polyfill" + ], + "fresh@2.0.0": [ + "npm:fresh" + ], + "front-matter@4.0.2": [ + "npm:front-matter" + ], + "fs-constants@1.0.0": [ + "npm:fs-constants" + ], + "fs-extra@7.0.1": [ + "npm:fs-extra@7.0.1" + ], + "fs-extra@8.1.0": [ + "npm:fs-extra@8.1.0" + ], + "fsevents@2.3.3": [ + "npm:fsevents" + ], + "function-bind@1.1.2": [ + "npm:function-bind" + ], + "gaxios@7.1.3": [ + "npm:gaxios" + ], + "gcp-metadata@8.1.2": [ + "npm:gcp-metadata" + ], + "gensync@1.0.0-beta.2": [ + "npm:gensync" + ], + "get-caller-file@2.0.5": [ + "npm:get-caller-file" + ], + "get-intrinsic@1.3.0": [ + "npm:get-intrinsic" + ], + "get-port-please@3.2.0": [ + "npm:get-port-please" + ], + "get-proto@1.0.1": [ + "npm:get-proto" + ], + "get-stream@8.0.1": [ + "npm:get-stream" + ], + "get-tsconfig@4.13.0": [ + "npm:get-tsconfig" + ], + "giget@2.0.0": [ + "npm:giget" + ], + "glob-parent@5.1.2": [ + "npm:glob-parent@5.1.2" + ], + "glob-parent@6.0.2": [ + "npm:glob-parent@6.0.2" + ], + "glob@10.4.5": [ + "npm:glob" + ], + "globals@14.0.0": [ + "npm:globals@14.0.0" + ], + "globals@15.15.0": [ + "npm:globals@15.15.0" + ], + "globals@16.5.0": [ + "npm:globals@16.5.0" + ], + "globby@11.1.0": [ + "npm:globby@11.1.0" + ], + "globby@15.0.0": [ + "npm:globby@15.0.0" + ], + "globrex@0.1.2": [ + "npm:globrex" + ], + "goober@2.1.18(csstype@3.2.3)": [ + "npm:goober" + ], + "google-auth-library@10.5.0": [ + "npm:google-auth-library" + ], + "google-logging-utils@1.1.3": [ + "npm:google-logging-utils" + ], + "gopd@1.2.0": [ + "npm:gopd" + ], + "graceful-fs@4.2.11": [ + "npm:graceful-fs" + ], + "graphemer@1.4.0": [ + "npm:graphemer" + ], + "gtoken@8.0.0": [ + "npm:gtoken" + ], + "gzip-size@7.0.0": [ + "npm:gzip-size" + ], + "h3@1.15.4": [ + "npm:h3@1.15.4" + ], + "h3@2.0.0-beta.5": [ + "npm:h3@2.0.0-beta.5", + "npm:h3-v2" + ], + "happy-dom@20.0.10": [ + "npm:happy-dom" + ], + "has-flag@4.0.0": [ + "npm:has-flag" + ], + "has-symbols@1.1.0": [ + "npm:has-symbols" + ], + "has-tostringtag@1.0.2": [ + "npm:has-tostringtag" + ], + "hasown@2.0.2": [ + "npm:hasown" + ], + "hast-util-from-parse5@8.0.3": [ + "npm:hast-util-from-parse5" + ], + "hast-util-is-element@3.0.0": [ + "npm:hast-util-is-element" + ], + "hast-util-parse-selector@4.0.0": [ + "npm:hast-util-parse-selector" + ], + "hast-util-raw@9.1.0": [ + "npm:hast-util-raw" + ], + "hast-util-sanitize@5.0.2": [ + "npm:hast-util-sanitize" + ], + "hast-util-to-jsx-runtime@2.3.6": [ + "npm:hast-util-to-jsx-runtime" + ], + "hast-util-to-parse5@8.0.0": [ + "npm:hast-util-to-parse5" + ], + "hast-util-to-text@4.0.2": [ + "npm:hast-util-to-text" + ], + "hast-util-whitespace@3.0.0": [ + "npm:hast-util-whitespace" + ], + "hastscript@9.0.1": [ + "npm:hastscript" + ], + "he@1.2.0": [ + "npm:he" + ], + "hermes-estree@0.25.1": [ + "npm:hermes-estree" + ], + "hermes-parser@0.25.1": [ + "npm:hermes-parser" + ], + "highlight.js@11.11.1": [ + "npm:highlight.js" + ], + "hookable@5.5.3": [ + "npm:hookable" + ], + "html-encoding-sniffer@4.0.0": [ + "npm:html-encoding-sniffer" + ], + "html-entities@2.3.3": [ + "npm:html-entities" + ], + "html-link-extractor@1.0.5": [ + "npm:html-link-extractor" + ], + "html-url-attributes@3.0.1": [ + "npm:html-url-attributes" + ], + "html-void-elements@3.0.0": [ + "npm:html-void-elements" + ], + "htmlparser2@10.0.0": [ + "npm:htmlparser2" + ], + "http-errors@2.0.0": [ + "npm:http-errors" + ], + "http-proxy-agent@7.0.2": [ + "npm:http-proxy-agent" + ], + "http-shutdown@1.2.2": [ + "npm:http-shutdown" + ], + "https-proxy-agent@7.0.6": [ + "npm:https-proxy-agent" + ], + "httpxy@0.1.7": [ + "npm:httpxy" + ], + "human-id@4.1.2": [ + "npm:human-id" + ], + "human-signals@5.0.0": [ + "npm:human-signals" + ], + "iconv-lite@0.6.3": [ + "npm:iconv-lite@0.6.3" + ], + "iconv-lite@0.7.0": [ + "npm:iconv-lite@0.7.0" + ], + "ieee754@1.2.1": [ + "npm:ieee754" + ], + "ignore@5.3.2": [ + "npm:ignore@5.3.2" + ], + "ignore@7.0.5": [ + "npm:ignore@7.0.5" + ], + "import-fresh@3.3.1": [ + "npm:import-fresh" + ], + "import-lazy@4.0.0": [ + "npm:import-lazy" + ], + "imurmurhash@0.1.4": [ + "npm:imurmurhash" + ], + "indent-string@4.0.0": [ + "npm:indent-string" + ], + "inherits@2.0.4": [ + "npm:inherits" + ], + "inline-style-parser@0.2.4": [ + "npm:inline-style-parser" + ], + "ioredis@5.8.2": [ + "npm:ioredis" + ], + "iron-webcrypto@1.2.1": [ + "npm:iron-webcrypto" + ], + "is-alphabetical@2.0.1": [ + "npm:is-alphabetical" + ], + "is-alphanumerical@2.0.1": [ + "npm:is-alphanumerical" + ], + "is-binary-path@2.1.0": [ + "npm:is-binary-path" + ], + "is-core-module@2.16.1": [ + "npm:is-core-module" + ], + "is-decimal@2.0.1": [ + "npm:is-decimal" + ], + "is-docker@2.2.1": [ + "npm:is-docker@2.2.1" + ], + "is-docker@3.0.0": [ + "npm:is-docker@3.0.0" + ], + "is-extglob@2.1.1": [ + "npm:is-extglob" + ], + "is-fullwidth-code-point@3.0.0": [ + "npm:is-fullwidth-code-point" + ], + "is-glob@4.0.3": [ + "npm:is-glob" + ], + "is-hexadecimal@2.0.1": [ + "npm:is-hexadecimal" + ], + "is-immutable-type@5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:is-immutable-type" + ], + "is-inside-container@1.0.0": [ + "npm:is-inside-container" + ], + "is-interactive@1.0.0": [ + "npm:is-interactive" + ], + "is-module@1.0.0": [ + "npm:is-module" + ], + "is-number@7.0.0": [ + "npm:is-number" + ], + "is-obj@2.0.0": [ + "npm:is-obj" + ], + "is-plain-obj@4.1.0": [ + "npm:is-plain-obj" + ], + "is-potential-custom-element-name@1.0.1": [ + "npm:is-potential-custom-element-name" + ], + "is-reference@1.2.1": [ + "npm:is-reference@1.2.1" + ], + "is-reference@3.0.3": [ + "npm:is-reference@3.0.3" + ], + "is-stream@2.0.1": [ + "npm:is-stream@2.0.1" + ], + "is-stream@3.0.0": [ + "npm:is-stream@3.0.0" + ], + "is-subdir@1.2.0": [ + "npm:is-subdir" + ], + "is-text-path@2.0.0": [ + "npm:is-text-path" + ], + "is-unicode-supported@0.1.0": [ + "npm:is-unicode-supported" + ], + "is-what@4.1.16": [ + "npm:is-what" + ], + "is-windows@1.0.2": [ + "npm:is-windows" + ], + "is-wsl@2.2.0": [ + "npm:is-wsl@2.2.0" + ], + "is-wsl@3.1.0": [ + "npm:is-wsl@3.1.0" + ], + "is64bit@2.0.0": [ + "npm:is64bit" + ], + "isarray@1.0.0": [ + "npm:isarray" + ], + "isbot@5.1.31": [ + "npm:isbot" + ], + "isexe@2.0.0": [ + "npm:isexe" + ], + "jackspeak@3.4.3": [ + "npm:jackspeak" + ], + "jest-diff@30.2.0": [ + "npm:jest-diff" + ], + "jiti@2.6.1": [ + "npm:jiti" + ], + "jju@1.4.0": [ + "npm:jju" + ], + "js-tokens@4.0.0": [ + "npm:js-tokens@4.0.0" + ], + "js-tokens@9.0.1": [ + "npm:js-tokens@9.0.1" + ], + "js-yaml@3.14.1": [ + "npm:js-yaml@3.14.1" + ], + "js-yaml@4.1.1": [ + "npm:js-yaml@4.1.1" + ], + "jsdom@27.2.0(postcss@8.5.6)": [ + "npm:jsdom" + ], + "jsesc@3.1.0": [ + "npm:jsesc" + ], + "json-bigint@1.0.0": [ + "npm:json-bigint" + ], + "json-buffer@3.0.1": [ + "npm:json-buffer" + ], + "json-schema-to-ts@3.1.1": [ + "npm:json-schema-to-ts" + ], + "json-schema-traverse@0.4.1": [ + "npm:json-schema-traverse@0.4.1" + ], + "json-schema-traverse@1.0.0": [ + "npm:json-schema-traverse@1.0.0" + ], + "json-schema@0.4.0": [ + "npm:json-schema" + ], + "json-stable-stringify-without-jsonify@1.0.1": [ + "npm:json-stable-stringify-without-jsonify" + ], + "json5@2.2.3": [ + "npm:json5" + ], + "jsonc-parser@3.2.0": [ + "npm:jsonc-parser" + ], + "jsonfile@4.0.0": [ + "npm:jsonfile@4.0.0" + ], + "jsonfile@6.2.0": [ + "npm:jsonfile@6.2.0" + ], + "jsonparse@1.3.1": [ + "npm:jsonparse" + ], + "jwa@2.0.1": [ + "npm:jwa" + ], + "jws@4.0.0": [ + "npm:jws" + ], + "keyv@4.5.4": [ + "npm:keyv" + ], + "kleur@4.1.5": [ + "npm:kleur" + ], + "klona@2.0.6": [ + "npm:klona" + ], + "knip@5.70.2(@types/node@24.10.1)(typescript@5.9.3)": [ + "npm:knip" + ], + "knitwork@1.2.0": [ + "npm:knitwork" + ], + "kolorist@1.8.0": [ + "npm:kolorist" + ], + "lazystream@1.0.1": [ + "npm:lazystream" + ], + "levn@0.4.1": [ + "npm:levn" + ], + "lightningcss-android-arm64@1.30.2": [ + "npm:lightningcss-android-arm64" + ], + "lightningcss-darwin-arm64@1.30.2": [ + "npm:lightningcss-darwin-arm64" + ], + "lightningcss-darwin-x64@1.30.2": [ + "npm:lightningcss-darwin-x64" + ], + "lightningcss-freebsd-x64@1.30.2": [ + "npm:lightningcss-freebsd-x64" + ], + "lightningcss-linux-arm-gnueabihf@1.30.2": [ + "npm:lightningcss-linux-arm-gnueabihf" + ], + "lightningcss-linux-arm64-gnu@1.30.2": [ + "npm:lightningcss-linux-arm64-gnu" + ], + "lightningcss-linux-arm64-musl@1.30.2": [ + "npm:lightningcss-linux-arm64-musl" + ], + "lightningcss-linux-x64-gnu@1.30.2": [ + "npm:lightningcss-linux-x64-gnu" + ], + "lightningcss-linux-x64-musl@1.30.2": [ + "npm:lightningcss-linux-x64-musl" + ], + "lightningcss-win32-arm64-msvc@1.30.2": [ + "npm:lightningcss-win32-arm64-msvc" + ], + "lightningcss-win32-x64-msvc@1.30.2": [ + "npm:lightningcss-win32-x64-msvc" + ], + "lightningcss@1.30.2": [ + "npm:lightningcss" + ], + "lilconfig@3.1.3": [ + "npm:lilconfig" + ], + "lines-and-columns@2.0.3": [ + "npm:lines-and-columns" + ], + "linkify-it@5.0.0": [ + "npm:linkify-it" + ], + "listhen@1.9.0": [ + "npm:listhen" + ], + "local-pkg@0.5.1": [ + "npm:local-pkg@0.5.1" + ], + "local-pkg@1.1.2": [ + "npm:local-pkg@1.1.2" + ], + "locate-character@3.0.0": [ + "npm:locate-character" + ], + "locate-path@5.0.0": [ + "npm:locate-path@5.0.0" + ], + "locate-path@6.0.0": [ + "npm:locate-path@6.0.0" + ], + "lodash.defaults@4.2.0": [ + "npm:lodash.defaults" + ], + "lodash.isarguments@3.1.0": [ + "npm:lodash.isarguments" + ], + "lodash.merge@4.6.2": [ + "npm:lodash.merge" + ], + "lodash.startcase@4.4.0": [ + "npm:lodash.startcase" + ], + "lodash@4.17.21": [ + "npm:lodash" + ], + "log-symbols@4.1.0": [ + "npm:log-symbols" + ], + "longest-streak@3.1.0": [ + "npm:longest-streak" + ], + "lowlight@3.3.0": [ + "npm:lowlight" + ], + "lru-cache@10.4.3": [ + "npm:lru-cache@10.4.3" + ], + "lru-cache@11.2.2": [ + "npm:lru-cache@11.2.2" + ], + "lru-cache@5.1.1": [ + "npm:lru-cache@5.1.1" + ], + "lru-cache@6.0.0": [ + "npm:lru-cache@6.0.0" + ], + "lucide-react@0.555.0(react@19.2.0)": [ + "npm:lucide-react" + ], + "lunr@2.3.9": [ + "npm:lunr" + ], + "lz-string@1.5.0": [ + "npm:lz-string" + ], + "magic-string@0.30.21": [ + "npm:magic-string" + ], + "magicast@0.5.1": [ + "npm:magicast" + ], + "markdown-it@14.1.0": [ + "npm:markdown-it" + ], + "markdown-link-extractor@4.0.3": [ + "npm:markdown-link-extractor" + ], + "markdown-table@3.0.4": [ + "npm:markdown-table" + ], + "marked@17.0.1": [ + "npm:marked" + ], + "math-intrinsics@1.1.0": [ + "npm:math-intrinsics" + ], + "mdast-util-find-and-replace@3.0.2": [ + "npm:mdast-util-find-and-replace" + ], + "mdast-util-from-markdown@2.0.2": [ + "npm:mdast-util-from-markdown" + ], + "mdast-util-gfm-autolink-literal@2.0.1": [ + "npm:mdast-util-gfm-autolink-literal" + ], + "mdast-util-gfm-footnote@2.1.0": [ + "npm:mdast-util-gfm-footnote" + ], + "mdast-util-gfm-strikethrough@2.0.0": [ + "npm:mdast-util-gfm-strikethrough" + ], + "mdast-util-gfm-table@2.0.0": [ + "npm:mdast-util-gfm-table" + ], + "mdast-util-gfm-task-list-item@2.0.0": [ + "npm:mdast-util-gfm-task-list-item" + ], + "mdast-util-gfm@3.1.0": [ + "npm:mdast-util-gfm" + ], + "mdast-util-mdx-expression@2.0.1": [ + "npm:mdast-util-mdx-expression" + ], + "mdast-util-mdx-jsx@3.2.0": [ + "npm:mdast-util-mdx-jsx" + ], + "mdast-util-mdxjs-esm@2.0.1": [ + "npm:mdast-util-mdxjs-esm" + ], + "mdast-util-phrasing@4.1.0": [ + "npm:mdast-util-phrasing" + ], + "mdast-util-to-hast@13.2.0": [ + "npm:mdast-util-to-hast" + ], + "mdast-util-to-markdown@2.1.2": [ + "npm:mdast-util-to-markdown" + ], + "mdast-util-to-string@4.0.0": [ + "npm:mdast-util-to-string" + ], + "mdn-data@2.12.2": [ + "npm:mdn-data" + ], + "mdurl@2.0.0": [ + "npm:mdurl" + ], + "meow@12.1.1": [ + "npm:meow" + ], + "merge-anything@5.1.7": [ + "npm:merge-anything" + ], + "merge-stream@2.0.0": [ + "npm:merge-stream" + ], + "merge2@1.4.1": [ + "npm:merge2" + ], + "micromark-core-commonmark@2.0.3": [ + "npm:micromark-core-commonmark" + ], + "micromark-extension-gfm-autolink-literal@2.1.0": [ + "npm:micromark-extension-gfm-autolink-literal" + ], + "micromark-extension-gfm-footnote@2.1.0": [ + "npm:micromark-extension-gfm-footnote" + ], + "micromark-extension-gfm-strikethrough@2.1.0": [ + "npm:micromark-extension-gfm-strikethrough" + ], + "micromark-extension-gfm-table@2.1.1": [ + "npm:micromark-extension-gfm-table" + ], + "micromark-extension-gfm-tagfilter@2.0.0": [ + "npm:micromark-extension-gfm-tagfilter" + ], + "micromark-extension-gfm-task-list-item@2.1.0": [ + "npm:micromark-extension-gfm-task-list-item" + ], + "micromark-extension-gfm@3.0.0": [ + "npm:micromark-extension-gfm" + ], + "micromark-factory-destination@2.0.1": [ + "npm:micromark-factory-destination" + ], + "micromark-factory-label@2.0.1": [ + "npm:micromark-factory-label" + ], + "micromark-factory-space@2.0.1": [ + "npm:micromark-factory-space" + ], + "micromark-factory-title@2.0.1": [ + "npm:micromark-factory-title" + ], + "micromark-factory-whitespace@2.0.1": [ + "npm:micromark-factory-whitespace" + ], + "micromark-util-character@2.1.1": [ + "npm:micromark-util-character" + ], + "micromark-util-chunked@2.0.1": [ + "npm:micromark-util-chunked" + ], + "micromark-util-classify-character@2.0.1": [ + "npm:micromark-util-classify-character" + ], + "micromark-util-combine-extensions@2.0.1": [ + "npm:micromark-util-combine-extensions" + ], + "micromark-util-decode-numeric-character-reference@2.0.2": [ + "npm:micromark-util-decode-numeric-character-reference" + ], + "micromark-util-decode-string@2.0.1": [ + "npm:micromark-util-decode-string" + ], + "micromark-util-encode@2.0.1": [ + "npm:micromark-util-encode" + ], + "micromark-util-html-tag-name@2.0.1": [ + "npm:micromark-util-html-tag-name" + ], + "micromark-util-normalize-identifier@2.0.1": [ + "npm:micromark-util-normalize-identifier" + ], + "micromark-util-resolve-all@2.0.1": [ + "npm:micromark-util-resolve-all" + ], + "micromark-util-sanitize-uri@2.0.1": [ + "npm:micromark-util-sanitize-uri" + ], + "micromark-util-subtokenize@2.1.0": [ + "npm:micromark-util-subtokenize" + ], + "micromark-util-symbol@2.0.1": [ + "npm:micromark-util-symbol" + ], + "micromark-util-types@2.0.2": [ + "npm:micromark-util-types" + ], + "micromark@4.0.2": [ + "npm:micromark" + ], + "micromatch@4.0.8": [ + "npm:micromatch" + ], + "mime-db@1.52.0": [ + "npm:mime-db@1.52.0" + ], + "mime-db@1.54.0": [ + "npm:mime-db@1.54.0" + ], + "mime-types@2.1.35": [ + "npm:mime-types@2.1.35" + ], + "mime-types@3.0.1": [ + "npm:mime-types@3.0.1" + ], + "mime@3.0.0": [ + "npm:mime@3.0.0" + ], + "mime@4.1.0": [ + "npm:mime@4.1.0" + ], + "mimic-fn@2.1.0": [ + "npm:mimic-fn@2.1.0" + ], + "mimic-fn@4.0.0": [ + "npm:mimic-fn@4.0.0" + ], + "min-indent@1.0.1": [ + "npm:min-indent" + ], + "minimatch@3.0.8": [ + "npm:minimatch@3.0.8" + ], + "minimatch@3.1.2": [ + "npm:minimatch@3.1.2" + ], + "minimatch@5.1.6": [ + "npm:minimatch@5.1.6" + ], + "minimatch@9.0.3": [ + "npm:minimatch@9.0.3" + ], + "minimatch@9.0.5": [ + "npm:minimatch@9.0.5" + ], + "minimist@1.2.8": [ + "npm:minimist" + ], + "minipass@7.1.2": [ + "npm:minipass" + ], + "minizlib@3.1.0": [ + "npm:minizlib" + ], + "mlly@1.8.0": [ + "npm:mlly" + ], + "mri@1.2.0": [ + "npm:mri" + ], + "ms@2.1.3": [ + "npm:ms" + ], + "muggle-string@0.4.1": [ + "npm:muggle-string" + ], + "nanoid@3.3.11": [ + "npm:nanoid@3.3.11" + ], + "nanoid@5.1.6": [ + "npm:nanoid@5.1.6" + ], + "nanospinner@1.2.2": [ + "npm:nanospinner" + ], + "napi-postinstall@0.3.4": [ + "npm:napi-postinstall" + ], + "natural-compare@1.4.0": [ + "npm:natural-compare" + ], + "nitropack@2.12.9(rolldown@1.0.0-beta.51)": [ + "npm:nitropack" + ], + "node-addon-api@7.1.1": [ + "npm:node-addon-api" + ], + "node-domexception@1.0.0": [ + "npm:node-domexception" + ], + "node-fetch-native@1.6.7": [ + "npm:node-fetch-native" + ], + "node-fetch@2.7.0": [ + "npm:node-fetch@2.7.0" + ], + "node-fetch@3.3.2": [ + "npm:node-fetch@3.3.2" + ], + "node-forge@1.3.1": [ + "npm:node-forge" + ], + "node-gyp-build@4.8.4": [ + "npm:node-gyp-build" + ], + "node-machine-id@1.1.12": [ + "npm:node-machine-id" + ], + "node-mock-http@1.0.3": [ + "npm:node-mock-http" + ], + "node-releases@2.0.27": [ + "npm:node-releases" + ], + "nopt@8.1.0": [ + "npm:nopt" + ], + "normalize-path@3.0.0": [ + "npm:normalize-path" + ], + "npm-run-path@4.0.1": [ + "npm:npm-run-path@4.0.1" + ], + "npm-run-path@5.3.0": [ + "npm:npm-run-path@5.3.0" + ], + "nth-check@2.1.1": [ + "npm:nth-check" + ], + "nx@22.1.2": [ + "npm:nx" + ], + "nypm@0.6.2": [ + "npm:nypm" + ], + "obug@2.1.1": [ + "npm:obug" + ], + "ofetch@1.5.0": [ + "npm:ofetch" + ], + "ohash@2.0.11": [ + "npm:ohash" + ], + "ollama@0.6.3": [ + "npm:ollama" + ], + "on-finished@2.4.1": [ + "npm:on-finished" + ], + "once@1.4.0": [ + "npm:once" + ], + "onetime@5.1.2": [ + "npm:onetime@5.1.2" + ], + "onetime@6.0.0": [ + "npm:onetime@6.0.0" + ], + "open@8.4.2": [ + "npm:open" + ], + "openai@6.9.1(ws@8.18.3)(zod@4.1.13)": [ + "npm:openai" + ], + "optionator@0.9.4": [ + "npm:optionator" + ], + "ora@5.3.0": [ + "npm:ora" + ], + "outdent@0.5.0": [ + "npm:outdent" + ], + "oxc-resolver@11.14.0": [ + "npm:oxc-resolver" + ], + "p-filter@2.1.0": [ + "npm:p-filter" + ], + "p-limit@2.3.0": [ + "npm:p-limit@2.3.0" + ], + "p-limit@3.1.0": [ + "npm:p-limit@3.1.0" + ], + "p-locate@4.1.0": [ + "npm:p-locate@4.1.0" + ], + "p-locate@5.0.0": [ + "npm:p-locate@5.0.0" + ], + "p-map@2.1.0": [ + "npm:p-map" + ], + "p-try@2.2.0": [ + "npm:p-try" + ], + "package-json-from-dist@1.0.1": [ + "npm:package-json-from-dist" + ], + "package-manager-detector@0.2.11": [ + "npm:package-manager-detector@0.2.11" + ], + "package-manager-detector@1.5.0": [ + "npm:package-manager-detector@1.5.0" + ], + "parent-module@1.0.1": [ + "npm:parent-module" + ], + "parse-entities@4.0.2": [ + "npm:parse-entities" + ], + "parse5-htmlparser2-tree-adapter@7.1.0": [ + "npm:parse5-htmlparser2-tree-adapter" + ], + "parse5-parser-stream@7.1.2": [ + "npm:parse5-parser-stream" + ], + "parse5@7.3.0": [ + "npm:parse5@7.3.0" + ], + "parse5@8.0.0": [ + "npm:parse5@8.0.0" + ], + "parseurl@1.3.3": [ + "npm:parseurl" + ], + "partial-json@0.1.7": [ + "npm:partial-json" + ], + "path-browserify@1.0.1": [ + "npm:path-browserify" + ], + "path-exists@4.0.0": [ + "npm:path-exists" + ], + "path-key@3.1.1": [ + "npm:path-key@3.1.1" + ], + "path-key@4.0.0": [ + "npm:path-key@4.0.0" + ], + "path-parse@1.0.7": [ + "npm:path-parse" + ], + "path-scurry@1.11.1": [ + "npm:path-scurry" + ], + "path-type@4.0.0": [ + "npm:path-type@4.0.0" + ], + "path-type@6.0.0": [ + "npm:path-type@6.0.0" + ], + "pathe@1.1.2": [ + "npm:pathe@1.1.2" + ], + "pathe@2.0.3": [ + "npm:pathe@2.0.3" + ], + "perfect-debounce@2.0.0": [ + "npm:perfect-debounce" + ], + "picocolors@1.1.1": [ + "npm:picocolors" + ], + "picomatch@2.3.1": [ + "npm:picomatch@2.3.1" + ], + "picomatch@4.0.3": [ + "npm:picomatch@4.0.3" + ], + "pify@4.0.1": [ + "npm:pify" + ], + "pkg-types@1.3.1": [ + "npm:pkg-types@1.3.1" + ], + "pkg-types@2.3.0": [ + "npm:pkg-types@2.3.0" + ], + "postcss@8.5.6": [ + "npm:postcss" + ], + "prelude-ls@1.2.1": [ + "npm:prelude-ls" + ], + "premove@4.0.0": [ + "npm:premove" + ], + "prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.44.1)": [ + "npm:prettier-plugin-svelte" + ], + "prettier@2.8.8": [ + "npm:prettier@2.8.8" + ], + "prettier@3.6.2": [ + "npm:prettier" + ], + "pretty-bytes@7.1.0": [ + "npm:pretty-bytes" + ], + "pretty-format@27.5.1": [ + "npm:pretty-format@27.5.1" + ], + "pretty-format@30.2.0": [ + "npm:pretty-format@30.2.0" + ], + "process-nextick-args@2.0.1": [ + "npm:process-nextick-args" + ], + "process@0.11.10": [ + "npm:process" + ], + "property-information@6.5.0": [ + "npm:property-information@6.5.0" + ], + "property-information@7.1.0": [ + "npm:property-information@7.1.0" + ], + "proxy-from-env@1.1.0": [ + "npm:proxy-from-env" + ], + "publint@0.3.15": [ + "npm:publint" + ], + "punycode.js@2.3.1": [ + "npm:punycode.js" + ], + "punycode@2.3.1": [ + "npm:punycode" + ], + "quansync@0.2.11": [ + "npm:quansync" + ], + "queue-microtask@1.2.3": [ + "npm:queue-microtask" + ], + "radix3@1.1.2": [ + "npm:radix3" + ], + "randombytes@2.1.0": [ + "npm:randombytes" + ], + "range-parser@1.2.1": [ + "npm:range-parser" + ], + "rc9@2.1.2": [ + "npm:rc9" + ], + "react-dom@19.2.0(react@19.2.0)": [ + "npm:react-dom" + ], + "react-is@17.0.2": [ + "npm:react-is@17.0.2" + ], + "react-is@18.3.1": [ + "npm:react-is@18.3.1" + ], + "react-markdown@10.1.0(@types/react@19.2.7)(react@19.2.0)": [ + "npm:react-markdown" + ], + "react-refresh@0.18.0": [ + "npm:react-refresh" + ], + "react@19.2.0": [ + "npm:react" + ], + "read-yaml-file@1.1.0": [ + "npm:read-yaml-file" + ], + "readable-stream@2.3.8": [ + "npm:readable-stream@2.3.8" + ], + "readable-stream@3.6.2": [ + "npm:readable-stream@3.6.2" + ], + "readable-stream@4.7.0": [ + "npm:readable-stream@4.7.0" + ], + "readdir-glob@1.1.3": [ + "npm:readdir-glob" + ], + "readdirp@3.6.0": [ + "npm:readdirp@3.6.0" + ], + "readdirp@4.1.2": [ + "npm:readdirp@4.1.2" + ], + "recast@0.23.11": [ + "npm:recast" + ], + "redent@3.0.0": [ + "npm:redent" + ], + "redis-errors@1.2.0": [ + "npm:redis-errors" + ], + "redis-parser@3.0.0": [ + "npm:redis-parser" + ], + "rehype-highlight@7.0.2": [ + "npm:rehype-highlight" + ], + "rehype-raw@7.0.0": [ + "npm:rehype-raw" + ], + "rehype-sanitize@6.0.0": [ + "npm:rehype-sanitize" + ], + "remark-gfm@4.0.1": [ + "npm:remark-gfm" + ], + "remark-parse@11.0.0": [ + "npm:remark-parse" + ], + "remark-rehype@11.1.2": [ + "npm:remark-rehype" + ], + "remark-stringify@11.0.0": [ + "npm:remark-stringify" + ], + "require-directory@2.1.1": [ + "npm:require-directory" + ], + "require-from-string@2.0.2": [ + "npm:require-from-string" + ], + "resolve-from@4.0.0": [ + "npm:resolve-from@4.0.0" + ], + "resolve-from@5.0.0": [ + "npm:resolve-from@5.0.0" + ], + "resolve-pkg-maps@1.0.0": [ + "npm:resolve-pkg-maps" + ], + "resolve.exports@2.0.3": [ + "npm:resolve.exports" + ], + "resolve@1.22.11": [ + "npm:resolve" + ], + "restore-cursor@3.1.0": [ + "npm:restore-cursor" + ], + "reusify@1.1.0": [ + "npm:reusify" + ], + "rimraf@5.0.10": [ + "npm:rimraf" + ], + "rolldown@1.0.0-beta.51": [ + "npm:rolldown" + ], + "rollup-plugin-preserve-directives@0.4.0(rollup@4.53.3)": [ + "npm:rollup-plugin-preserve-directives" + ], + "rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-beta.51)(rollup@4.53.3)": [ + "npm:rollup-plugin-visualizer" + ], + "rollup@4.53.3": [ + "npm:rollup" + ], + "rou3@0.7.10": [ + "npm:rou3" + ], + "run-parallel@1.2.0": [ + "npm:run-parallel" + ], + "sade@1.8.1": [ + "npm:sade" + ], + "safe-buffer@5.1.2": [ + "npm:safe-buffer@5.1.2" + ], + "safe-buffer@5.2.1": [ + "npm:safe-buffer@5.2.1" + ], + "safer-buffer@2.1.2": [ + "npm:safer-buffer" + ], + "saxes@6.0.0": [ + "npm:saxes" + ], + "scheduler@0.27.0": [ + "npm:scheduler" + ], + "scule@1.3.0": [ + "npm:scule" + ], + "semver@6.3.1": [ + "npm:semver@6.3.1" + ], + "semver@7.5.4": [ + "npm:semver@7.5.4" + ], + "semver@7.7.3": [ + "npm:semver@7.7.3" + ], + "send@1.2.0": [ + "npm:send" + ], + "serialize-javascript@6.0.2": [ + "npm:serialize-javascript" + ], + "seroval-plugins@1.3.3(seroval@1.3.2)": [ + "npm:seroval-plugins@1.3.3" + ], + "seroval-plugins@1.4.0(seroval@1.4.0)": [ + "npm:seroval-plugins@1.4.0" + ], + "seroval@1.3.2": [ + "npm:seroval@1.3.2" + ], + "seroval@1.4.0": [ + "npm:seroval@1.4.0" + ], + "serve-placeholder@2.0.2": [ + "npm:serve-placeholder" + ], + "serve-static@2.2.0": [ + "npm:serve-static" + ], + "setprototypeof@1.2.0": [ + "npm:setprototypeof" + ], + "shebang-command@2.0.0": [ + "npm:shebang-command" + ], + "shebang-regex@3.0.0": [ + "npm:shebang-regex" + ], + "sherif-darwin-arm64@1.9.0": [ + "npm:sherif-darwin-arm64" + ], + "sherif-darwin-x64@1.9.0": [ + "npm:sherif-darwin-x64" + ], + "sherif-linux-arm64-musl@1.9.0": [ + "npm:sherif-linux-arm64-musl" + ], + "sherif-linux-arm64@1.9.0": [ + "npm:sherif-linux-arm64" + ], + "sherif-linux-x64-musl@1.9.0": [ + "npm:sherif-linux-x64-musl" + ], + "sherif-linux-x64@1.9.0": [ + "npm:sherif-linux-x64" + ], + "sherif-windows-arm64@1.9.0": [ + "npm:sherif-windows-arm64" + ], + "sherif-windows-x64@1.9.0": [ + "npm:sherif-windows-x64" + ], + "sherif@1.9.0": [ + "npm:sherif" + ], + "siginfo@2.0.0": [ + "npm:siginfo" + ], + "signal-exit@3.0.7": [ + "npm:signal-exit@3.0.7" + ], + "signal-exit@4.1.0": [ + "npm:signal-exit@4.1.0" + ], + "simple-git@3.30.0": [ + "npm:simple-git" + ], + "size-limit@11.2.0": [ + "npm:size-limit" + ], + "slash@3.0.0": [ + "npm:slash@3.0.0" + ], + "slash@5.1.0": [ + "npm:slash@5.1.0" + ], + "smob@1.5.0": [ + "npm:smob" + ], + "smol-toml@1.5.2": [ + "npm:smol-toml" + ], + "solid-js@1.9.10": [ + "npm:solid-js" + ], + "solid-refresh@0.6.3(solid-js@1.9.10)": [ + "npm:solid-refresh" + ], + "source-map-js@1.2.1": [ + "npm:source-map-js" + ], + "source-map-support@0.5.21": [ + "npm:source-map-support" + ], + "source-map@0.6.1": [ + "npm:source-map@0.6.1" + ], + "source-map@0.7.6": [ + "npm:source-map@0.7.6" + ], + "space-separated-tokens@2.0.2": [ + "npm:space-separated-tokens" + ], + "spawndamnit@3.0.1": [ + "npm:spawndamnit" + ], + "split2@4.2.0": [ + "npm:split2" + ], + "sprintf-js@1.0.3": [ + "npm:sprintf-js" + ], + "srvx@0.8.16": [ + "npm:srvx" + ], + "stable-hash-x@0.2.0": [ + "npm:stable-hash-x" + ], + "stackback@0.0.2": [ + "npm:stackback" + ], + "standard-as-callback@2.1.0": [ + "npm:standard-as-callback" + ], + "statuses@2.0.1": [ + "npm:statuses@2.0.1" + ], + "statuses@2.0.2": [ + "npm:statuses@2.0.2" + ], + "std-env@3.10.0": [ + "npm:std-env" + ], + "streamx@2.23.0": [ + "npm:streamx" + ], + "string-argv@0.3.2": [ + "npm:string-argv" + ], + "string-ts@2.2.1": [ + "npm:string-ts" + ], + "string-width@4.2.3": [ + "npm:string-width@4.2.3", + "npm:string-width-cjs" + ], + "string-width@5.1.2": [ + "npm:string-width@5.1.2" + ], + "string_decoder@1.1.1": [ + "npm:string_decoder@1.1.1" + ], + "string_decoder@1.3.0": [ + "npm:string_decoder@1.3.0" + ], + "stringify-entities@4.0.4": [ + "npm:stringify-entities" + ], + "strip-ansi@6.0.1": [ + "npm:strip-ansi@6.0.1", + "npm:strip-ansi-cjs" + ], + "strip-ansi@7.1.2": [ + "npm:strip-ansi@7.1.2" + ], + "strip-bom@3.0.0": [ + "npm:strip-bom" + ], + "strip-final-newline@3.0.0": [ + "npm:strip-final-newline" + ], + "strip-indent@3.0.0": [ + "npm:strip-indent" + ], + "strip-json-comments@3.1.1": [ + "npm:strip-json-comments@3.1.1" + ], + "strip-json-comments@5.0.3": [ + "npm:strip-json-comments@5.0.3" + ], + "strip-literal@3.1.0": [ + "npm:strip-literal" + ], + "style-to-js@1.1.18": [ + "npm:style-to-js" + ], + "style-to-object@1.0.11": [ + "npm:style-to-object" + ], + "supports-color@10.2.2": [ + "npm:supports-color@10.2.2" + ], + "supports-color@7.2.0": [ + "npm:supports-color@7.2.0" + ], + "supports-color@8.1.1": [ + "npm:supports-color@8.1.1" + ], + "supports-preserve-symlinks-flag@1.0.0": [ + "npm:supports-preserve-symlinks-flag" + ], + "svelte@5.44.1": [ + "npm:svelte" + ], + "symbol-tree@3.2.4": [ + "npm:symbol-tree" + ], + "system-architecture@0.1.0": [ + "npm:system-architecture" + ], + "tagged-tag@1.0.0": [ + "npm:tagged-tag" + ], + "tailwindcss@4.1.17": [ + "npm:tailwindcss" + ], + "tapable@2.3.0": [ + "npm:tapable" + ], + "tar-stream@2.2.0": [ + "npm:tar-stream@2.2.0" + ], + "tar-stream@3.1.7": [ + "npm:tar-stream@3.1.7" + ], + "tar@7.5.2": [ + "npm:tar" + ], + "term-size@2.2.1": [ + "npm:term-size" + ], + "terser@5.44.0": [ + "npm:terser" + ], + "text-decoder@1.2.3": [ + "npm:text-decoder" + ], + "text-extensions@2.4.0": [ + "npm:text-extensions" + ], + "through@2.3.8": [ + "npm:through" + ], + "tiny-invariant@1.3.3": [ + "npm:tiny-invariant" + ], + "tiny-warning@1.0.3": [ + "npm:tiny-warning" + ], + "tinybench@2.9.0": [ + "npm:tinybench" + ], + "tinyexec@0.3.2": [ + "npm:tinyexec@0.3.2" + ], + "tinyexec@1.0.1": [ + "npm:tinyexec@1.0.1" + ], + "tinyglobby@0.2.15": [ + "npm:tinyglobby" + ], + "tinyrainbow@3.0.3": [ + "npm:tinyrainbow" + ], + "tldts-core@7.0.16": [ + "npm:tldts-core" + ], + "tldts@7.0.16": [ + "npm:tldts" + ], + "tmp@0.2.5": [ + "npm:tmp" + ], + "to-regex-range@5.0.1": [ + "npm:to-regex-range" + ], + "toidentifier@1.0.1": [ + "npm:toidentifier" + ], + "tough-cookie@6.0.0": [ + "npm:tough-cookie" + ], + "tr46@0.0.3": [ + "npm:tr46@0.0.3" + ], + "tr46@6.0.0": [ + "npm:tr46@6.0.0" + ], + "tree-kill@1.2.2": [ + "npm:tree-kill" + ], + "trim-lines@3.0.1": [ + "npm:trim-lines" + ], + "trough@2.2.0": [ + "npm:trough" + ], + "ts-algebra@2.0.0": [ + "npm:ts-algebra" + ], + "ts-api-utils@2.1.0(typescript@5.9.3)": [ + "npm:ts-api-utils" + ], + "ts-declaration-location@1.0.7(typescript@5.9.3)": [ + "npm:ts-declaration-location" + ], + "ts-pattern@5.9.0": [ + "npm:ts-pattern" + ], + "tsconfck@3.1.6(typescript@5.9.3)": [ + "npm:tsconfck" + ], + "tsconfig-paths@4.2.0": [ + "npm:tsconfig-paths" + ], + "tslib@2.8.1": [ + "npm:tslib" + ], + "tsx@4.20.6": [ + "npm:tsx" + ], + "type-check@0.4.0": [ + "npm:type-check" + ], + "type-fest@5.1.0": [ + "npm:type-fest" + ], + "typedoc-plugin-frontmatter@1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3)))": [ + "npm:typedoc-plugin-frontmatter" + ], + "typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))": [ + "npm:typedoc-plugin-markdown" + ], + "typedoc@0.28.14(typescript@5.9.3)": [ + "npm:typedoc" + ], + "typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ + "npm:typescript-eslint" + ], + "typescript@5.4.2": [ + "npm:typescript@5.4.2" + ], + "typescript@5.9.3": [ + "npm:typescript" + ], + "uc.micro@2.1.0": [ + "npm:uc.micro" + ], + "ufo@1.6.1": [ + "npm:ufo" + ], + "ultrahtml@1.6.0": [ + "npm:ultrahtml" + ], + "uncrypto@0.1.3": [ + "npm:uncrypto" + ], + "unctx@2.4.1": [ + "npm:unctx" + ], + "undici-types@6.21.0": [ + "npm:undici-types@6.21.0" + ], + "undici-types@7.16.0": [ + "npm:undici-types@7.16.0" + ], + "undici@7.16.0": [ + "npm:undici" + ], + "unenv@2.0.0-rc.24": [ + "npm:unenv" + ], + "unicorn-magic@0.3.0": [ + "npm:unicorn-magic" + ], + "unified@11.0.5": [ + "npm:unified" + ], + "unimport@5.5.0": [ + "npm:unimport" + ], + "unist-util-find-after@5.0.0": [ + "npm:unist-util-find-after" + ], + "unist-util-is@6.0.1": [ + "npm:unist-util-is" + ], + "unist-util-position@5.0.0": [ + "npm:unist-util-position" + ], + "unist-util-stringify-position@4.0.0": [ + "npm:unist-util-stringify-position" + ], + "unist-util-visit-parents@6.0.2": [ + "npm:unist-util-visit-parents" + ], + "unist-util-visit@5.0.0": [ + "npm:unist-util-visit" + ], + "universalify@0.1.2": [ + "npm:universalify@0.1.2" + ], + "universalify@2.0.1": [ + "npm:universalify@2.0.1" + ], + "unplugin-utils@0.3.1": [ + "npm:unplugin-utils" + ], + "unplugin@2.3.10": [ + "npm:unplugin" + ], + "unrs-resolver@1.11.1": [ + "npm:unrs-resolver" + ], + "unstorage@1.17.2(db0@0.3.4)(ioredis@5.8.2)": [ + "npm:unstorage" + ], + "untun@0.1.3": [ + "npm:untun" + ], + "untyped@2.0.0": [ + "npm:untyped" + ], + "unwasm@0.3.11": [ + "npm:unwasm" + ], + "update-browserslist-db@1.1.4(browserslist@4.27.0)": [ + "npm:update-browserslist-db" + ], + "uqr@0.1.2": [ + "npm:uqr" + ], + "uri-js@4.4.1": [ + "npm:uri-js" + ], + "use-sync-external-store@1.6.0(react@19.2.0)": [ + "npm:use-sync-external-store" + ], + "util-deprecate@1.0.2": [ + "npm:util-deprecate" + ], + "vfile-location@5.0.3": [ + "npm:vfile-location" + ], + "vfile-message@4.0.3": [ + "npm:vfile-message" + ], + "vfile@6.0.3": [ + "npm:vfile" + ], + "vite-plugin-dts@4.2.3(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:vite-plugin-dts" + ], + "vite-plugin-externalize-deps@0.10.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:vite-plugin-externalize-deps" + ], + "vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:vite-plugin-solid" + ], + "vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:vite-tsconfig-paths" + ], + "vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)": [ + "npm:vite" + ], + "vitefu@1.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ + "npm:vitefu" + ], + "vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)": [ + "npm:vitest" + ], + "vscode-uri@3.1.0": [ + "npm:vscode-uri" + ], + "vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))": [ + "npm:vue-eslint-parser" + ], + "w3c-xmlserializer@5.0.0": [ + "npm:w3c-xmlserializer" + ], + "walk-up-path@4.0.0": [ + "npm:walk-up-path" + ], + "wcwidth@1.0.1": [ + "npm:wcwidth" + ], + "web-namespaces@2.0.1": [ + "npm:web-namespaces" + ], + "web-streams-polyfill@3.3.3": [ + "npm:web-streams-polyfill" + ], + "web-vitals@5.1.0": [ + "npm:web-vitals" + ], + "webidl-conversions@3.0.1": [ + "npm:webidl-conversions@3.0.1" + ], + "webidl-conversions@8.0.0": [ + "npm:webidl-conversions@8.0.0" + ], + "webpack-virtual-modules@0.6.2": [ + "npm:webpack-virtual-modules" + ], + "whatwg-encoding@3.1.1": [ + "npm:whatwg-encoding" + ], + "whatwg-fetch@3.6.20": [ + "npm:whatwg-fetch" + ], + "whatwg-mimetype@3.0.0": [ + "npm:whatwg-mimetype@3.0.0" + ], + "whatwg-mimetype@4.0.0": [ + "npm:whatwg-mimetype@4.0.0" + ], + "whatwg-url@15.1.0": [ + "npm:whatwg-url@15.1.0" + ], + "whatwg-url@5.0.0": [ + "npm:whatwg-url@5.0.0" + ], + "which@2.0.2": [ + "npm:which" + ], + "why-is-node-running@2.3.0": [ + "npm:why-is-node-running" + ], + "word-wrap@1.2.5": [ + "npm:word-wrap" + ], + "wrap-ansi@7.0.0": [ + "npm:wrap-ansi@7.0.0", + "npm:wrap-ansi-cjs" + ], + "wrap-ansi@8.1.0": [ + "npm:wrap-ansi@8.1.0" + ], + "wrappy@1.0.2": [ + "npm:wrappy" + ], + "ws@8.18.3": [ + "npm:ws" + ], + "xml-name-validator@5.0.0": [ + "npm:xml-name-validator" + ], + "xmlbuilder2@4.0.1": [ + "npm:xmlbuilder2" + ], + "xmlchars@2.2.0": [ + "npm:xmlchars" + ], + "y18n@5.0.8": [ + "npm:y18n" + ], + "yallist@3.1.1": [ + "npm:yallist@3.1.1" + ], + "yallist@4.0.0": [ + "npm:yallist@4.0.0" + ], + "yallist@5.0.0": [ + "npm:yallist@5.0.0" + ], + "yaml@2.8.1": [ + "npm:yaml" + ], + "yargs-parser@21.1.1": [ + "npm:yargs-parser" + ], + "yargs@17.7.2": [ + "npm:yargs" + ], + "yocto-queue@0.1.0": [ + "npm:yocto-queue" + ], + "youch-core@0.3.3": [ + "npm:youch-core" + ], + "youch@4.1.0-beta.11": [ + "npm:youch" + ], + "zimmerframe@1.1.4": [ + "npm:zimmerframe" + ], + "zip-stream@6.0.1": [ + "npm:zip-stream" + ], + "zod-validation-error@3.5.4(zod@3.25.76)": [ + "npm:zod-validation-error@3.5.4" + ], + "zod-validation-error@4.0.2(zod@4.1.13)": [ + "npm:zod-validation-error@4.0.2" + ], + "zod@3.25.76": [ + "npm:zod@3.25.76" + ], + "zod@4.1.13": [ + "npm:zod@4.1.13" + ], + "zwitch@2.0.4": [ + "npm:zwitch" + ] + } +} \ No newline at end of file diff --git a/.nx/workspace-data/project-graph.json b/.nx/workspace-data/project-graph.json new file mode 100644 index 000000000..f792ef287 --- /dev/null +++ b/.nx/workspace-data/project-graph.json @@ -0,0 +1,28748 @@ +{ + "nodes": { + "@tanstack/react-ai-devtools": { + "name": "@tanstack/react-ai-devtools", + "type": "lib", + "data": { + "root": "packages/typescript/react-ai-devtools", + "name": "@tanstack/react-ai-devtools", + "tags": [ + "npm:public" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "clean", + "lint:fix", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types", + "test:build", + "build" + ] + }, + "description": "React Devtools for TanStack AI.", + "js": { + "packageName": "@tanstack/react-ai-devtools", + "packageVersion": "0.1.8", + "packageExports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "./production": { + "import": { + "types": "./dist/production.d.ts", + "default": "./dist/production.js" + } + }, + "./package.json": "./package.json" + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/solid-ai-devtools": { + "name": "@tanstack/solid-ai-devtools", + "type": "lib", + "data": { + "root": "packages/typescript/solid-ai-devtools", + "name": "@tanstack/solid-ai-devtools", + "tags": [ + "npm:public", + "npm:ai", + "npm:tanstack", + "npm:sdk", + "npm:llm", + "npm:chat", + "npm:embeddings" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Solid TanStack AI Devtools", + "js": { + "packageName": "@tanstack/solid-ai-devtools", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./production": { + "import": { + "types": "./dist/production.d.ts", + "default": "./dist/production.js" + } + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/tests-adapters": { + "name": "@tanstack/tests-adapters", + "type": "app", + "data": { + "root": "packages/typescript/tests-adapters", + "name": "@tanstack/tests-adapters", + "tags": [ + "npm:public" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "start", + "typecheck" + ] + }, + "description": "Tests for TanStack AI adapters", + "js": { + "packageName": "@tanstack/tests-adapters", + "packageVersion": "0.1.0", + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "start": { + "executor": "nx:run-script", + "options": { + "script": "start" + }, + "metadata": { + "scriptContent": "tsx src/index.ts", + "runCommand": "pnpm run start" + }, + "configurations": {}, + "parallelism": true + }, + "typecheck": { + "executor": "nx:run-script", + "options": { + "script": "typecheck" + }, + "metadata": { + "scriptContent": "tsc --noEmit", + "runCommand": "pnpm run typecheck" + }, + "configurations": {}, + "parallelism": true + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-anthropic": { + "name": "@tanstack/ai-anthropic", + "type": "lib", + "data": { + "root": "packages/typescript/ai-anthropic", + "name": "@tanstack/ai-anthropic", + "tags": [ + "npm:public", + "npm:ai", + "npm:anthropic", + "npm:claude", + "npm:tanstack", + "npm:adapter" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Anthropic Claude adapter for TanStack AI", + "js": { + "packageName": "@tanstack/ai-anthropic", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-devtools-core": { + "name": "@tanstack/ai-devtools-core", + "type": "lib", + "data": { + "root": "packages/typescript/ai-devtools", + "name": "@tanstack/ai-devtools-core", + "tags": [ + "npm:public", + "npm:ai", + "npm:tanstack", + "npm:sdk", + "npm:llm", + "npm:chat", + "npm:embeddings" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Core TanStack AI Devtools", + "js": { + "packageName": "@tanstack/ai-devtools-core", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts" + }, + "./production": { + "import": "./dist/esm/production.js", + "types": "./dist/esm/production.d.ts" + }, + "./package.json": "./package.json" + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-fallback": { + "name": "@tanstack/ai-fallback", + "type": "lib", + "data": { + "root": "packages/typescript/ai-fallback", + "name": "@tanstack/ai-fallback", + "tags": [ + "npm:public", + "npm:ai", + "npm:fallback", + "npm:tanstack", + "npm:adapter", + "npm:retry" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Fallback wrapper for TanStack AI - automatically try multiple adapters in sequence", + "js": { + "packageName": "@tanstack/ai-fallback", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-react-ui": { + "name": "@tanstack/ai-react-ui", + "type": "lib", + "data": { + "root": "packages/typescript/ai-react-ui", + "name": "@tanstack/ai-react-ui", + "tags": [ + "npm:public", + "npm:tanstack", + "npm:ai", + "npm:react", + "npm:chat", + "npm:ui", + "npm:headless", + "npm:components" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Headless React components for building AI chat interfaces", + "js": { + "packageName": "@tanstack/ai-react-ui", + "packageVersion": "0.0.1", + "packageExports": { + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "packageMain": "./dist/index.js", + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest --passWithNoTests", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-client": { + "name": "@tanstack/ai-client", + "type": "lib", + "data": { + "root": "packages/typescript/ai-client", + "name": "@tanstack/ai-client", + "tags": [ + "npm:public", + "npm:ai", + "npm:client", + "npm:headless", + "npm:tanstack", + "npm:chat", + "npm:streaming" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Framework-agnostic headless client for TanStack AI", + "js": { + "packageName": "@tanstack/ai-client", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-gemini": { + "name": "@tanstack/ai-gemini", + "type": "lib", + "data": { + "root": "packages/typescript/ai-gemini", + "name": "@tanstack/ai-gemini", + "tags": [ + "npm:public", + "npm:ai", + "npm:gemini", + "npm:google", + "npm:tanstack", + "npm:adapter" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Google Gemini adapter for TanStack AI", + "js": { + "packageName": "@tanstack/ai-gemini", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-ollama": { + "name": "@tanstack/ai-ollama", + "type": "lib", + "data": { + "root": "packages/typescript/ai-ollama", + "name": "@tanstack/ai-ollama", + "tags": [ + "npm:public", + "npm:ai", + "npm:ollama", + "npm:llama", + "npm:mistral", + "npm:tanstack", + "npm:adapter" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Ollama adapter for TanStack AI", + "js": { + "packageName": "@tanstack/ai-ollama", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-openai": { + "name": "@tanstack/ai-openai", + "type": "lib", + "data": { + "root": "packages/typescript/ai-openai", + "name": "@tanstack/ai-openai", + "tags": [ + "npm:public", + "npm:ai", + "npm:openai", + "npm:gpt", + "npm:tanstack", + "npm:adapter" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "OpenAI adapter for TanStack AI", + "js": { + "packageName": "@tanstack/ai-openai", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai-react": { + "name": "@tanstack/ai-react", + "type": "lib", + "data": { + "root": "packages/typescript/ai-react", + "name": "@tanstack/ai-react", + "tags": [ + "npm:public", + "npm:ai", + "npm:react", + "npm:hooks", + "npm:tanstack", + "npm:chat", + "npm:streaming" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "clean", + "lint:fix", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types", + "test:build", + "build" + ] + }, + "description": "React hooks for TanStack AI", + "js": { + "packageName": "@tanstack/ai-react", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + } + }, + "implicitDependencies": [] + } + }, + "@tanstack/ai": { + "name": "@tanstack/ai", + "type": "lib", + "data": { + "root": "packages/typescript/ai", + "name": "@tanstack/ai", + "tags": [ + "npm:public", + "npm:ai", + "npm:tanstack", + "npm:sdk", + "npm:llm", + "npm:chat", + "npm:embeddings" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "build", + "clean", + "lint:fix", + "test:build", + "test:eslint", + "test:lib", + "test:lib:dev", + "test:types" + ] + }, + "description": "Core TanStack AI library - Open source AI SDK", + "js": { + "packageName": "@tanstack/ai", + "packageVersion": "0.1.0", + "packageExports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./event-client": { + "types": "./dist/event-client.d.ts", + "import": "./dist/event-client.js" + } + }, + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "clean": { + "executor": "nx:run-script", + "options": { + "script": "clean" + }, + "metadata": { + "scriptContent": "premove ./build ./dist", + "runCommand": "pnpm run clean" + }, + "configurations": {}, + "parallelism": true + }, + "lint:fix": { + "executor": "nx:run-script", + "options": { + "script": "lint:fix" + }, + "metadata": { + "scriptContent": "eslint ./src --fix", + "runCommand": "pnpm run lint:fix" + }, + "configurations": {}, + "parallelism": true + }, + "test:build": { + "executor": "nx:run-script", + "options": { + "script": "test:build" + }, + "metadata": { + "scriptContent": "publint --strict", + "runCommand": "pnpm run test:build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "build" + ], + "inputs": [ + "production" + ] + }, + "test:eslint": { + "executor": "nx:run-script", + "options": { + "script": "test:eslint" + }, + "metadata": { + "scriptContent": "eslint ./src", + "runCommand": "pnpm run test:eslint" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/eslint.config.js" + ] + }, + "test:lib": { + "executor": "nx:run-script", + "options": { + "script": "test:lib" + }, + "metadata": { + "scriptContent": "vitest", + "runCommand": "pnpm run test:lib" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ], + "outputs": [ + "{projectRoot}/coverage" + ] + }, + "test:lib:dev": { + "executor": "nx:run-script", + "options": { + "script": "test:lib:dev" + }, + "metadata": { + "scriptContent": "pnpm test:lib --watch", + "runCommand": "pnpm run test:lib:dev" + }, + "configurations": {}, + "parallelism": true + }, + "test:types": { + "executor": "nx:run-script", + "options": { + "script": "test:types" + }, + "metadata": { + "scriptContent": "tsc", + "runCommand": "pnpm run test:types" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "default", + "^production" + ] + } + }, + "implicitDependencies": [] + } + }, + "vanilla-chat": { + "name": "vanilla-chat", + "type": "app", + "data": { + "root": "examples/vanilla-chat", + "name": "vanilla-chat", + "tags": [ + "npm:private" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "dev", + "build", + "preview" + ] + }, + "js": { + "packageName": "vanilla-chat", + "packageVersion": "0.1.0", + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "dev": { + "executor": "nx:run-script", + "options": { + "script": "dev" + }, + "metadata": { + "scriptContent": "vite --port 3001", + "runCommand": "pnpm run dev" + }, + "configurations": {}, + "parallelism": true + }, + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "preview": { + "executor": "nx:run-script", + "options": { + "script": "preview" + }, + "metadata": { + "scriptContent": "vite preview", + "runCommand": "pnpm run preview" + }, + "configurations": {}, + "parallelism": true + } + }, + "implicitDependencies": [] + } + }, + "ts-chat": { + "name": "ts-chat", + "type": "app", + "data": { + "root": "examples/ts-chat", + "name": "ts-chat", + "tags": [ + "npm:private" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "dev", + "build", + "serve", + "test" + ] + }, + "js": { + "packageName": "ts-chat", + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "dev": { + "executor": "nx:run-script", + "options": { + "script": "dev" + }, + "metadata": { + "scriptContent": "vite dev --port 3000", + "runCommand": "pnpm run dev" + }, + "configurations": {}, + "parallelism": true + }, + "build": { + "executor": "nx:run-script", + "options": { + "script": "build" + }, + "metadata": { + "scriptContent": "vite build", + "runCommand": "pnpm run build" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist" + ] + }, + "serve": { + "executor": "nx:run-script", + "options": { + "script": "serve" + }, + "metadata": { + "scriptContent": "vite preview", + "runCommand": "pnpm run serve" + }, + "configurations": {}, + "parallelism": true + }, + "test": { + "executor": "nx:run-script", + "options": { + "script": "test" + }, + "metadata": { + "scriptContent": "exit 0", + "runCommand": "pnpm run test" + }, + "configurations": {}, + "parallelism": true + } + }, + "implicitDependencies": [] + } + }, + "root": { + "name": "root", + "type": "app", + "data": { + "root": ".", + "name": "root", + "includedScripts": [ + "test:knip", + "test:sherif" + ], + "tags": [ + "npm:private" + ], + "metadata": { + "targetGroups": { + "NPM Scripts": [ + "test:knip", + "test:sherif" + ] + }, + "js": { + "packageName": "root", + "isInPackageManagerWorkspaces": true + } + }, + "targets": { + "test:knip": { + "executor": "nx:run-script", + "options": { + "script": "test:knip" + }, + "metadata": { + "scriptContent": "knip", + "runCommand": "pnpm run test:knip" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "inputs": [ + "{workspaceRoot}/**/*" + ] + }, + "test:sherif": { + "executor": "nx:run-script", + "options": { + "script": "test:sherif" + }, + "metadata": { + "scriptContent": "sherif", + "runCommand": "pnpm run test:sherif" + }, + "configurations": {}, + "parallelism": true, + "cache": true, + "inputs": [ + "{workspaceRoot}/**/package.json" + ] + } + }, + "implicitDependencies": [] + } + } + }, + "externalNodes": { + "npm:@acemir/cssom": { + "type": "npm", + "name": "npm:@acemir/cssom", + "data": { + "version": "0.9.24", + "packageName": "@acemir/cssom", + "hash": "sha512-5YjgMmAiT2rjJZU7XK1SNI7iqTy92DpaYVgG6x63FxkJ11UpYfLndHJATtinWJClAXiOlW9XWaUyAQf8pMrQPg==" + } + }, + "npm:@adobe/css-tools": { + "type": "npm", + "name": "npm:@adobe/css-tools", + "data": { + "version": "4.4.4", + "packageName": "@adobe/css-tools", + "hash": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==" + } + }, + "npm:@ai-sdk/openai": { + "type": "npm", + "name": "npm:@ai-sdk/openai", + "data": { + "version": "2.0.73", + "packageName": "@ai-sdk/openai", + "hash": "sha512-TOGoxkeJMgcxq80ZfyCAqKcfvGPgFsEQEK8SgI/w3He0fqi16KlnZVMexOlg8HOLumF6szweg/YrOmQixsPVGw==" + } + }, + "npm:@ai-sdk/provider-utils": { + "type": "npm", + "name": "npm:@ai-sdk/provider-utils", + "data": { + "version": "3.0.17", + "packageName": "@ai-sdk/provider-utils", + "hash": "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==" + } + }, + "npm:@ai-sdk/provider": { + "type": "npm", + "name": "npm:@ai-sdk/provider", + "data": { + "version": "2.0.0", + "packageName": "@ai-sdk/provider", + "hash": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==" + } + }, + "npm:@anthropic-ai/sdk": { + "type": "npm", + "name": "npm:@anthropic-ai/sdk", + "data": { + "version": "0.71.0", + "packageName": "@anthropic-ai/sdk", + "hash": "sha512-go1XeWXmpxuiTkosSXpb8tokLk2ZLkIRcXpbWVwJM6gH5OBtHOVsfPfGuqI1oW7RRt4qc59EmYbrXRZ0Ng06Jw==" + } + }, + "npm:@asamuzakjp/css-color": { + "type": "npm", + "name": "npm:@asamuzakjp/css-color", + "data": { + "version": "4.0.5", + "packageName": "@asamuzakjp/css-color", + "hash": "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==" + } + }, + "npm:@asamuzakjp/dom-selector": { + "type": "npm", + "name": "npm:@asamuzakjp/dom-selector", + "data": { + "version": "6.7.4", + "packageName": "@asamuzakjp/dom-selector", + "hash": "sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==" + } + }, + "npm:@asamuzakjp/nwsapi": { + "type": "npm", + "name": "npm:@asamuzakjp/nwsapi", + "data": { + "version": "2.3.9", + "packageName": "@asamuzakjp/nwsapi", + "hash": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==" + } + }, + "npm:@babel/code-frame@7.26.2": { + "type": "npm", + "name": "npm:@babel/code-frame@7.26.2", + "data": { + "version": "7.26.2", + "packageName": "@babel/code-frame", + "hash": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==" + } + }, + "npm:@babel/code-frame@7.27.1": { + "type": "npm", + "name": "npm:@babel/code-frame@7.27.1", + "data": { + "version": "7.27.1", + "packageName": "@babel/code-frame", + "hash": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==" + } + }, + "npm:@babel/compat-data": { + "type": "npm", + "name": "npm:@babel/compat-data", + "data": { + "version": "7.28.5", + "packageName": "@babel/compat-data", + "hash": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==" + } + }, + "npm:@babel/core": { + "type": "npm", + "name": "npm:@babel/core", + "data": { + "version": "7.28.5", + "packageName": "@babel/core", + "hash": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==" + } + }, + "npm:@babel/generator": { + "type": "npm", + "name": "npm:@babel/generator", + "data": { + "version": "7.28.5", + "packageName": "@babel/generator", + "hash": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==" + } + }, + "npm:@babel/helper-annotate-as-pure": { + "type": "npm", + "name": "npm:@babel/helper-annotate-as-pure", + "data": { + "version": "7.27.3", + "packageName": "@babel/helper-annotate-as-pure", + "hash": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==" + } + }, + "npm:@babel/helper-compilation-targets": { + "type": "npm", + "name": "npm:@babel/helper-compilation-targets", + "data": { + "version": "7.27.2", + "packageName": "@babel/helper-compilation-targets", + "hash": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==" + } + }, + "npm:@babel/helper-create-class-features-plugin": { + "type": "npm", + "name": "npm:@babel/helper-create-class-features-plugin", + "data": { + "version": "7.28.5", + "packageName": "@babel/helper-create-class-features-plugin", + "hash": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==" + } + }, + "npm:@babel/helper-globals": { + "type": "npm", + "name": "npm:@babel/helper-globals", + "data": { + "version": "7.28.0", + "packageName": "@babel/helper-globals", + "hash": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" + } + }, + "npm:@babel/helper-member-expression-to-functions": { + "type": "npm", + "name": "npm:@babel/helper-member-expression-to-functions", + "data": { + "version": "7.28.5", + "packageName": "@babel/helper-member-expression-to-functions", + "hash": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==" + } + }, + "npm:@babel/helper-module-imports@7.18.6": { + "type": "npm", + "name": "npm:@babel/helper-module-imports@7.18.6", + "data": { + "version": "7.18.6", + "packageName": "@babel/helper-module-imports", + "hash": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==" + } + }, + "npm:@babel/helper-module-imports@7.27.1": { + "type": "npm", + "name": "npm:@babel/helper-module-imports@7.27.1", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-module-imports", + "hash": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==" + } + }, + "npm:@babel/helper-module-transforms": { + "type": "npm", + "name": "npm:@babel/helper-module-transforms", + "data": { + "version": "7.28.3", + "packageName": "@babel/helper-module-transforms", + "hash": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==" + } + }, + "npm:@babel/helper-optimise-call-expression": { + "type": "npm", + "name": "npm:@babel/helper-optimise-call-expression", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-optimise-call-expression", + "hash": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==" + } + }, + "npm:@babel/helper-plugin-utils": { + "type": "npm", + "name": "npm:@babel/helper-plugin-utils", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-plugin-utils", + "hash": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" + } + }, + "npm:@babel/helper-replace-supers": { + "type": "npm", + "name": "npm:@babel/helper-replace-supers", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-replace-supers", + "hash": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==" + } + }, + "npm:@babel/helper-skip-transparent-expression-wrappers": { + "type": "npm", + "name": "npm:@babel/helper-skip-transparent-expression-wrappers", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-skip-transparent-expression-wrappers", + "hash": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==" + } + }, + "npm:@babel/helper-string-parser": { + "type": "npm", + "name": "npm:@babel/helper-string-parser", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-string-parser", + "hash": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" + } + }, + "npm:@babel/helper-validator-identifier@7.27.1": { + "type": "npm", + "name": "npm:@babel/helper-validator-identifier@7.27.1", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-validator-identifier", + "hash": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + } + }, + "npm:@babel/helper-validator-identifier@7.28.5": { + "type": "npm", + "name": "npm:@babel/helper-validator-identifier@7.28.5", + "data": { + "version": "7.28.5", + "packageName": "@babel/helper-validator-identifier", + "hash": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" + } + }, + "npm:@babel/helper-validator-option": { + "type": "npm", + "name": "npm:@babel/helper-validator-option", + "data": { + "version": "7.27.1", + "packageName": "@babel/helper-validator-option", + "hash": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" + } + }, + "npm:@babel/helpers": { + "type": "npm", + "name": "npm:@babel/helpers", + "data": { + "version": "7.28.4", + "packageName": "@babel/helpers", + "hash": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==" + } + }, + "npm:@babel/parser@7.28.4": { + "type": "npm", + "name": "npm:@babel/parser@7.28.4", + "data": { + "version": "7.28.4", + "packageName": "@babel/parser", + "hash": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==" + } + }, + "npm:@babel/parser@7.28.5": { + "type": "npm", + "name": "npm:@babel/parser@7.28.5", + "data": { + "version": "7.28.5", + "packageName": "@babel/parser", + "hash": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==" + } + }, + "npm:@babel/plugin-proposal-private-methods": { + "type": "npm", + "name": "npm:@babel/plugin-proposal-private-methods", + "data": { + "version": "7.18.6", + "packageName": "@babel/plugin-proposal-private-methods", + "hash": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==" + } + }, + "npm:@babel/plugin-syntax-jsx": { + "type": "npm", + "name": "npm:@babel/plugin-syntax-jsx", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-syntax-jsx", + "hash": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==" + } + }, + "npm:@babel/plugin-syntax-typescript": { + "type": "npm", + "name": "npm:@babel/plugin-syntax-typescript", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-syntax-typescript", + "hash": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==" + } + }, + "npm:@babel/plugin-transform-modules-commonjs": { + "type": "npm", + "name": "npm:@babel/plugin-transform-modules-commonjs", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-transform-modules-commonjs", + "hash": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==" + } + }, + "npm:@babel/plugin-transform-react-jsx-self": { + "type": "npm", + "name": "npm:@babel/plugin-transform-react-jsx-self", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-transform-react-jsx-self", + "hash": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==" + } + }, + "npm:@babel/plugin-transform-react-jsx-source": { + "type": "npm", + "name": "npm:@babel/plugin-transform-react-jsx-source", + "data": { + "version": "7.27.1", + "packageName": "@babel/plugin-transform-react-jsx-source", + "hash": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==" + } + }, + "npm:@babel/plugin-transform-typescript": { + "type": "npm", + "name": "npm:@babel/plugin-transform-typescript", + "data": { + "version": "7.28.5", + "packageName": "@babel/plugin-transform-typescript", + "hash": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==" + } + }, + "npm:@babel/preset-typescript": { + "type": "npm", + "name": "npm:@babel/preset-typescript", + "data": { + "version": "7.28.5", + "packageName": "@babel/preset-typescript", + "hash": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==" + } + }, + "npm:@babel/runtime": { + "type": "npm", + "name": "npm:@babel/runtime", + "data": { + "version": "7.28.4", + "packageName": "@babel/runtime", + "hash": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==" + } + }, + "npm:@babel/template": { + "type": "npm", + "name": "npm:@babel/template", + "data": { + "version": "7.27.2", + "packageName": "@babel/template", + "hash": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==" + } + }, + "npm:@babel/traverse": { + "type": "npm", + "name": "npm:@babel/traverse", + "data": { + "version": "7.28.5", + "packageName": "@babel/traverse", + "hash": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==" + } + }, + "npm:@babel/types@7.28.4": { + "type": "npm", + "name": "npm:@babel/types@7.28.4", + "data": { + "version": "7.28.4", + "packageName": "@babel/types", + "hash": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==" + } + }, + "npm:@babel/types@7.28.5": { + "type": "npm", + "name": "npm:@babel/types@7.28.5", + "data": { + "version": "7.28.5", + "packageName": "@babel/types", + "hash": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==" + } + }, + "npm:@changesets/apply-release-plan": { + "type": "npm", + "name": "npm:@changesets/apply-release-plan", + "data": { + "version": "7.0.13", + "packageName": "@changesets/apply-release-plan", + "hash": "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==" + } + }, + "npm:@changesets/assemble-release-plan": { + "type": "npm", + "name": "npm:@changesets/assemble-release-plan", + "data": { + "version": "6.0.9", + "packageName": "@changesets/assemble-release-plan", + "hash": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==" + } + }, + "npm:@changesets/changelog-git": { + "type": "npm", + "name": "npm:@changesets/changelog-git", + "data": { + "version": "0.2.1", + "packageName": "@changesets/changelog-git", + "hash": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==" + } + }, + "npm:@changesets/cli": { + "type": "npm", + "name": "npm:@changesets/cli", + "data": { + "version": "2.29.7", + "packageName": "@changesets/cli", + "hash": "sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==" + } + }, + "npm:@changesets/config": { + "type": "npm", + "name": "npm:@changesets/config", + "data": { + "version": "3.1.1", + "packageName": "@changesets/config", + "hash": "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==" + } + }, + "npm:@changesets/errors": { + "type": "npm", + "name": "npm:@changesets/errors", + "data": { + "version": "0.2.0", + "packageName": "@changesets/errors", + "hash": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==" + } + }, + "npm:@changesets/get-dependents-graph": { + "type": "npm", + "name": "npm:@changesets/get-dependents-graph", + "data": { + "version": "2.1.3", + "packageName": "@changesets/get-dependents-graph", + "hash": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==" + } + }, + "npm:@changesets/get-github-info": { + "type": "npm", + "name": "npm:@changesets/get-github-info", + "data": { + "version": "0.6.0", + "packageName": "@changesets/get-github-info", + "hash": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==" + } + }, + "npm:@changesets/get-release-plan": { + "type": "npm", + "name": "npm:@changesets/get-release-plan", + "data": { + "version": "4.0.13", + "packageName": "@changesets/get-release-plan", + "hash": "sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==" + } + }, + "npm:@changesets/get-version-range-type": { + "type": "npm", + "name": "npm:@changesets/get-version-range-type", + "data": { + "version": "0.4.0", + "packageName": "@changesets/get-version-range-type", + "hash": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==" + } + }, + "npm:@changesets/git": { + "type": "npm", + "name": "npm:@changesets/git", + "data": { + "version": "3.0.4", + "packageName": "@changesets/git", + "hash": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==" + } + }, + "npm:@changesets/logger": { + "type": "npm", + "name": "npm:@changesets/logger", + "data": { + "version": "0.1.1", + "packageName": "@changesets/logger", + "hash": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==" + } + }, + "npm:@changesets/parse": { + "type": "npm", + "name": "npm:@changesets/parse", + "data": { + "version": "0.4.1", + "packageName": "@changesets/parse", + "hash": "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==" + } + }, + "npm:@changesets/pre": { + "type": "npm", + "name": "npm:@changesets/pre", + "data": { + "version": "2.0.2", + "packageName": "@changesets/pre", + "hash": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==" + } + }, + "npm:@changesets/read": { + "type": "npm", + "name": "npm:@changesets/read", + "data": { + "version": "0.6.5", + "packageName": "@changesets/read", + "hash": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==" + } + }, + "npm:@changesets/should-skip-package": { + "type": "npm", + "name": "npm:@changesets/should-skip-package", + "data": { + "version": "0.1.2", + "packageName": "@changesets/should-skip-package", + "hash": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==" + } + }, + "npm:@changesets/types@4.1.0": { + "type": "npm", + "name": "npm:@changesets/types@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "@changesets/types", + "hash": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==" + } + }, + "npm:@changesets/types@6.1.0": { + "type": "npm", + "name": "npm:@changesets/types@6.1.0", + "data": { + "version": "6.1.0", + "packageName": "@changesets/types", + "hash": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==" + } + }, + "npm:@changesets/write": { + "type": "npm", + "name": "npm:@changesets/write", + "data": { + "version": "0.4.0", + "packageName": "@changesets/write", + "hash": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==" + } + }, + "npm:@cloudflare/kv-asset-handler": { + "type": "npm", + "name": "npm:@cloudflare/kv-asset-handler", + "data": { + "version": "0.4.0", + "packageName": "@cloudflare/kv-asset-handler", + "hash": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==" + } + }, + "npm:@commitlint/parse": { + "type": "npm", + "name": "npm:@commitlint/parse", + "data": { + "version": "20.0.0", + "packageName": "@commitlint/parse", + "hash": "sha512-j/PHCDX2bGM5xGcWObOvpOc54cXjn9g6xScXzAeOLwTsScaL4Y+qd0pFC6HBwTtrH92NvJQc+2Lx9HFkVi48cg==" + } + }, + "npm:@commitlint/types": { + "type": "npm", + "name": "npm:@commitlint/types", + "data": { + "version": "20.0.0", + "packageName": "@commitlint/types", + "hash": "sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==" + } + }, + "npm:@csstools/color-helpers": { + "type": "npm", + "name": "npm:@csstools/color-helpers", + "data": { + "version": "5.1.0", + "packageName": "@csstools/color-helpers", + "hash": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==" + } + }, + "npm:@csstools/css-calc": { + "type": "npm", + "name": "npm:@csstools/css-calc", + "data": { + "version": "2.1.4", + "packageName": "@csstools/css-calc", + "hash": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==" + } + }, + "npm:@csstools/css-color-parser": { + "type": "npm", + "name": "npm:@csstools/css-color-parser", + "data": { + "version": "3.1.0", + "packageName": "@csstools/css-color-parser", + "hash": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==" + } + }, + "npm:@csstools/css-parser-algorithms": { + "type": "npm", + "name": "npm:@csstools/css-parser-algorithms", + "data": { + "version": "3.0.5", + "packageName": "@csstools/css-parser-algorithms", + "hash": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==" + } + }, + "npm:@csstools/css-syntax-patches-for-csstree": { + "type": "npm", + "name": "npm:@csstools/css-syntax-patches-for-csstree", + "data": { + "version": "1.0.14", + "packageName": "@csstools/css-syntax-patches-for-csstree", + "hash": "sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==" + } + }, + "npm:@csstools/css-tokenizer": { + "type": "npm", + "name": "npm:@csstools/css-tokenizer", + "data": { + "version": "3.0.4", + "packageName": "@csstools/css-tokenizer", + "hash": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" + } + }, + "npm:@emnapi/core": { + "type": "npm", + "name": "npm:@emnapi/core", + "data": { + "version": "1.6.0", + "packageName": "@emnapi/core", + "hash": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==" + } + }, + "npm:@emnapi/runtime": { + "type": "npm", + "name": "npm:@emnapi/runtime", + "data": { + "version": "1.6.0", + "packageName": "@emnapi/runtime", + "hash": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==" + } + }, + "npm:@emnapi/wasi-threads": { + "type": "npm", + "name": "npm:@emnapi/wasi-threads", + "data": { + "version": "1.1.0", + "packageName": "@emnapi/wasi-threads", + "hash": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==" + } + }, + "npm:@esbuild/aix-ppc64": { + "type": "npm", + "name": "npm:@esbuild/aix-ppc64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/aix-ppc64", + "hash": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==" + } + }, + "npm:@esbuild/android-arm64": { + "type": "npm", + "name": "npm:@esbuild/android-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/android-arm64", + "hash": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==" + } + }, + "npm:@esbuild/android-arm": { + "type": "npm", + "name": "npm:@esbuild/android-arm", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/android-arm", + "hash": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==" + } + }, + "npm:@esbuild/android-x64": { + "type": "npm", + "name": "npm:@esbuild/android-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/android-x64", + "hash": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==" + } + }, + "npm:@esbuild/darwin-arm64": { + "type": "npm", + "name": "npm:@esbuild/darwin-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/darwin-arm64", + "hash": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==" + } + }, + "npm:@esbuild/darwin-x64": { + "type": "npm", + "name": "npm:@esbuild/darwin-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/darwin-x64", + "hash": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==" + } + }, + "npm:@esbuild/freebsd-arm64": { + "type": "npm", + "name": "npm:@esbuild/freebsd-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/freebsd-arm64", + "hash": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==" + } + }, + "npm:@esbuild/freebsd-x64": { + "type": "npm", + "name": "npm:@esbuild/freebsd-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/freebsd-x64", + "hash": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==" + } + }, + "npm:@esbuild/linux-arm64": { + "type": "npm", + "name": "npm:@esbuild/linux-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-arm64", + "hash": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==" + } + }, + "npm:@esbuild/linux-arm": { + "type": "npm", + "name": "npm:@esbuild/linux-arm", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-arm", + "hash": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==" + } + }, + "npm:@esbuild/linux-ia32": { + "type": "npm", + "name": "npm:@esbuild/linux-ia32", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-ia32", + "hash": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==" + } + }, + "npm:@esbuild/linux-loong64": { + "type": "npm", + "name": "npm:@esbuild/linux-loong64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-loong64", + "hash": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==" + } + }, + "npm:@esbuild/linux-mips64el": { + "type": "npm", + "name": "npm:@esbuild/linux-mips64el", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-mips64el", + "hash": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==" + } + }, + "npm:@esbuild/linux-ppc64": { + "type": "npm", + "name": "npm:@esbuild/linux-ppc64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-ppc64", + "hash": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==" + } + }, + "npm:@esbuild/linux-riscv64": { + "type": "npm", + "name": "npm:@esbuild/linux-riscv64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-riscv64", + "hash": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==" + } + }, + "npm:@esbuild/linux-s390x": { + "type": "npm", + "name": "npm:@esbuild/linux-s390x", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-s390x", + "hash": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==" + } + }, + "npm:@esbuild/linux-x64": { + "type": "npm", + "name": "npm:@esbuild/linux-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/linux-x64", + "hash": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==" + } + }, + "npm:@esbuild/netbsd-arm64": { + "type": "npm", + "name": "npm:@esbuild/netbsd-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/netbsd-arm64", + "hash": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==" + } + }, + "npm:@esbuild/netbsd-x64": { + "type": "npm", + "name": "npm:@esbuild/netbsd-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/netbsd-x64", + "hash": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==" + } + }, + "npm:@esbuild/openbsd-arm64": { + "type": "npm", + "name": "npm:@esbuild/openbsd-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/openbsd-arm64", + "hash": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==" + } + }, + "npm:@esbuild/openbsd-x64": { + "type": "npm", + "name": "npm:@esbuild/openbsd-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/openbsd-x64", + "hash": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==" + } + }, + "npm:@esbuild/openharmony-arm64": { + "type": "npm", + "name": "npm:@esbuild/openharmony-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/openharmony-arm64", + "hash": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==" + } + }, + "npm:@esbuild/sunos-x64": { + "type": "npm", + "name": "npm:@esbuild/sunos-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/sunos-x64", + "hash": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==" + } + }, + "npm:@esbuild/win32-arm64": { + "type": "npm", + "name": "npm:@esbuild/win32-arm64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/win32-arm64", + "hash": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==" + } + }, + "npm:@esbuild/win32-ia32": { + "type": "npm", + "name": "npm:@esbuild/win32-ia32", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/win32-ia32", + "hash": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==" + } + }, + "npm:@esbuild/win32-x64": { + "type": "npm", + "name": "npm:@esbuild/win32-x64", + "data": { + "version": "0.25.12", + "packageName": "@esbuild/win32-x64", + "hash": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==" + } + }, + "npm:@eslint-community/eslint-utils": { + "type": "npm", + "name": "npm:@eslint-community/eslint-utils", + "data": { + "version": "4.9.0", + "packageName": "@eslint-community/eslint-utils", + "hash": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==" + } + }, + "npm:@eslint-community/regexpp": { + "type": "npm", + "name": "npm:@eslint-community/regexpp", + "data": { + "version": "4.12.2", + "packageName": "@eslint-community/regexpp", + "hash": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==" + } + }, + "npm:@eslint-react/ast": { + "type": "npm", + "name": "npm:@eslint-react/ast", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/ast", + "hash": "sha512-/RiruPxlQs6CMLJ8tiNT1jV8Zq4u80MTWYkNFz2PP9pht23bdcpngDKFoz8RQYDPt71dwiRURHiQAF75v8bIIw==" + } + }, + "npm:@eslint-react/core": { + "type": "npm", + "name": "npm:@eslint-react/core", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/core", + "hash": "sha512-pIkrGuQWyW/GgrAp0kC7nv/Jn53Xjs1/rbBqUcUYvEZnVKuUifnlXQtnmioOEj9PYsuWuOxAPijExrnNavm73w==" + } + }, + "npm:@eslint-react/eff": { + "type": "npm", + "name": "npm:@eslint-react/eff", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/eff", + "hash": "sha512-pkRWIPnH/jedRn5ZMEA0nDPn5BFuUHKOORbR+hfrAMFp4c3o+1/P1G/eB0vSQvAHAZdPwLZXdgxydz+2rbb8nQ==" + } + }, + "npm:@eslint-react/eslint-plugin": { + "type": "npm", + "name": "npm:@eslint-react/eslint-plugin", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/eslint-plugin", + "hash": "sha512-wKeXNa0vc8ACmvBoZPnRZ+s/z0KEmMKRxpOfRthcBvd0TPMIprohT/uwBXd8k15/j3CmaYe74pJFVVagJY3U3g==" + } + }, + "npm:@eslint-react/shared": { + "type": "npm", + "name": "npm:@eslint-react/shared", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/shared", + "hash": "sha512-LVtD76ycDC7D4OFKDQ8jyATTVxz986J+e9nzydyEUtEf1l+WYiOivPBeJUAs6JEySBl24nO76oEHDABw6l4hig==" + } + }, + "npm:@eslint-react/var": { + "type": "npm", + "name": "npm:@eslint-react/var", + "data": { + "version": "2.3.9", + "packageName": "@eslint-react/var", + "hash": "sha512-Bc36K8Lw6KV/5NMaEaFS7as4kgSgZ1wElFejgUEBPZnhUVmq2mITV1BsnMoMYM4jojnkMN80WNALyhONjOx9Jw==" + } + }, + "npm:@eslint/config-array": { + "type": "npm", + "name": "npm:@eslint/config-array", + "data": { + "version": "0.21.1", + "packageName": "@eslint/config-array", + "hash": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==" + } + }, + "npm:@eslint/config-helpers": { + "type": "npm", + "name": "npm:@eslint/config-helpers", + "data": { + "version": "0.4.2", + "packageName": "@eslint/config-helpers", + "hash": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==" + } + }, + "npm:@eslint/core": { + "type": "npm", + "name": "npm:@eslint/core", + "data": { + "version": "0.17.0", + "packageName": "@eslint/core", + "hash": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==" + } + }, + "npm:@eslint/eslintrc": { + "type": "npm", + "name": "npm:@eslint/eslintrc", + "data": { + "version": "3.3.1", + "packageName": "@eslint/eslintrc", + "hash": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==" + } + }, + "npm:@eslint/js": { + "type": "npm", + "name": "npm:@eslint/js", + "data": { + "version": "9.39.1", + "packageName": "@eslint/js", + "hash": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==" + } + }, + "npm:@eslint/object-schema": { + "type": "npm", + "name": "npm:@eslint/object-schema", + "data": { + "version": "2.1.7", + "packageName": "@eslint/object-schema", + "hash": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==" + } + }, + "npm:@eslint/plugin-kit": { + "type": "npm", + "name": "npm:@eslint/plugin-kit", + "data": { + "version": "0.4.1", + "packageName": "@eslint/plugin-kit", + "hash": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==" + } + }, + "npm:@faker-js/faker": { + "type": "npm", + "name": "npm:@faker-js/faker", + "data": { + "version": "10.1.0", + "packageName": "@faker-js/faker", + "hash": "sha512-C3mrr3b5dRVlKPJdfrAXS8+dq+rq8Qm5SNRazca0JKgw1HQERFmrVb0towvMmw5uu8hHKNiQasMaR/tydf3Zsg==" + } + }, + "npm:@gerrit0/mini-shiki": { + "type": "npm", + "name": "npm:@gerrit0/mini-shiki", + "data": { + "version": "3.15.0", + "packageName": "@gerrit0/mini-shiki", + "hash": "sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ==" + } + }, + "npm:@google/genai": { + "type": "npm", + "name": "npm:@google/genai", + "data": { + "version": "1.30.0", + "packageName": "@google/genai", + "hash": "sha512-3MRcgczBFbUat1wIlZoLJ0vCCfXgm7Qxjh59cZi2X08RgWLtm9hKOspzp7TOg1TV2e26/MLxR2GR5yD5GmBV2w==" + } + }, + "npm:@humanfs/core": { + "type": "npm", + "name": "npm:@humanfs/core", + "data": { + "version": "0.19.1", + "packageName": "@humanfs/core", + "hash": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==" + } + }, + "npm:@humanfs/node": { + "type": "npm", + "name": "npm:@humanfs/node", + "data": { + "version": "0.16.7", + "packageName": "@humanfs/node", + "hash": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==" + } + }, + "npm:@humanwhocodes/module-importer": { + "type": "npm", + "name": "npm:@humanwhocodes/module-importer", + "data": { + "version": "1.0.1", + "packageName": "@humanwhocodes/module-importer", + "hash": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + } + }, + "npm:@humanwhocodes/retry": { + "type": "npm", + "name": "npm:@humanwhocodes/retry", + "data": { + "version": "0.4.3", + "packageName": "@humanwhocodes/retry", + "hash": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==" + } + }, + "npm:@inquirer/external-editor": { + "type": "npm", + "name": "npm:@inquirer/external-editor", + "data": { + "version": "1.0.3", + "packageName": "@inquirer/external-editor", + "hash": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==" + } + }, + "npm:@ioredis/commands": { + "type": "npm", + "name": "npm:@ioredis/commands", + "data": { + "version": "1.4.0", + "packageName": "@ioredis/commands", + "hash": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==" + } + }, + "npm:@isaacs/cliui": { + "type": "npm", + "name": "npm:@isaacs/cliui", + "data": { + "version": "8.0.2", + "packageName": "@isaacs/cliui", + "hash": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==" + } + }, + "npm:@isaacs/fs-minipass": { + "type": "npm", + "name": "npm:@isaacs/fs-minipass", + "data": { + "version": "4.0.1", + "packageName": "@isaacs/fs-minipass", + "hash": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==" + } + }, + "npm:@jest/diff-sequences": { + "type": "npm", + "name": "npm:@jest/diff-sequences", + "data": { + "version": "30.0.1", + "packageName": "@jest/diff-sequences", + "hash": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==" + } + }, + "npm:@jest/get-type": { + "type": "npm", + "name": "npm:@jest/get-type", + "data": { + "version": "30.1.0", + "packageName": "@jest/get-type", + "hash": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==" + } + }, + "npm:@jest/schemas": { + "type": "npm", + "name": "npm:@jest/schemas", + "data": { + "version": "30.0.5", + "packageName": "@jest/schemas", + "hash": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==" + } + }, + "npm:@jridgewell/gen-mapping": { + "type": "npm", + "name": "npm:@jridgewell/gen-mapping", + "data": { + "version": "0.3.13", + "packageName": "@jridgewell/gen-mapping", + "hash": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==" + } + }, + "npm:@jridgewell/remapping": { + "type": "npm", + "name": "npm:@jridgewell/remapping", + "data": { + "version": "2.3.5", + "packageName": "@jridgewell/remapping", + "hash": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==" + } + }, + "npm:@jridgewell/resolve-uri": { + "type": "npm", + "name": "npm:@jridgewell/resolve-uri", + "data": { + "version": "3.1.2", + "packageName": "@jridgewell/resolve-uri", + "hash": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + } + }, + "npm:@jridgewell/source-map": { + "type": "npm", + "name": "npm:@jridgewell/source-map", + "data": { + "version": "0.3.11", + "packageName": "@jridgewell/source-map", + "hash": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==" + } + }, + "npm:@jridgewell/sourcemap-codec": { + "type": "npm", + "name": "npm:@jridgewell/sourcemap-codec", + "data": { + "version": "1.5.5", + "packageName": "@jridgewell/sourcemap-codec", + "hash": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" + } + }, + "npm:@jridgewell/trace-mapping": { + "type": "npm", + "name": "npm:@jridgewell/trace-mapping", + "data": { + "version": "0.3.31", + "packageName": "@jridgewell/trace-mapping", + "hash": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==" + } + }, + "npm:@kwsites/file-exists": { + "type": "npm", + "name": "npm:@kwsites/file-exists", + "data": { + "version": "1.1.1", + "packageName": "@kwsites/file-exists", + "hash": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==" + } + }, + "npm:@kwsites/promise-deferred": { + "type": "npm", + "name": "npm:@kwsites/promise-deferred", + "data": { + "version": "1.1.1", + "packageName": "@kwsites/promise-deferred", + "hash": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + } + }, + "npm:@manypkg/find-root": { + "type": "npm", + "name": "npm:@manypkg/find-root", + "data": { + "version": "1.1.0", + "packageName": "@manypkg/find-root", + "hash": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==" + } + }, + "npm:@manypkg/get-packages": { + "type": "npm", + "name": "npm:@manypkg/get-packages", + "data": { + "version": "1.1.3", + "packageName": "@manypkg/get-packages", + "hash": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==" + } + }, + "npm:@mapbox/node-pre-gyp": { + "type": "npm", + "name": "npm:@mapbox/node-pre-gyp", + "data": { + "version": "2.0.0", + "packageName": "@mapbox/node-pre-gyp", + "hash": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==" + } + }, + "npm:@microsoft/api-extractor-model": { + "type": "npm", + "name": "npm:@microsoft/api-extractor-model", + "data": { + "version": "7.29.6", + "packageName": "@microsoft/api-extractor-model", + "hash": "sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==" + } + }, + "npm:@microsoft/api-extractor": { + "type": "npm", + "name": "npm:@microsoft/api-extractor", + "data": { + "version": "7.47.7", + "packageName": "@microsoft/api-extractor", + "hash": "sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==" + } + }, + "npm:@microsoft/tsdoc-config": { + "type": "npm", + "name": "npm:@microsoft/tsdoc-config", + "data": { + "version": "0.17.1", + "packageName": "@microsoft/tsdoc-config", + "hash": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==" + } + }, + "npm:@microsoft/tsdoc": { + "type": "npm", + "name": "npm:@microsoft/tsdoc", + "data": { + "version": "0.15.1", + "packageName": "@microsoft/tsdoc", + "hash": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==" + } + }, + "npm:@napi-rs/wasm-runtime@0.2.12": { + "type": "npm", + "name": "npm:@napi-rs/wasm-runtime@0.2.12", + "data": { + "version": "0.2.12", + "packageName": "@napi-rs/wasm-runtime", + "hash": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==" + } + }, + "npm:@napi-rs/wasm-runtime@0.2.4": { + "type": "npm", + "name": "npm:@napi-rs/wasm-runtime@0.2.4", + "data": { + "version": "0.2.4", + "packageName": "@napi-rs/wasm-runtime", + "hash": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==" + } + }, + "npm:@napi-rs/wasm-runtime@1.0.7": { + "type": "npm", + "name": "npm:@napi-rs/wasm-runtime@1.0.7", + "data": { + "version": "1.0.7", + "packageName": "@napi-rs/wasm-runtime", + "hash": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==" + } + }, + "npm:@nodelib/fs.scandir": { + "type": "npm", + "name": "npm:@nodelib/fs.scandir", + "data": { + "version": "2.1.5", + "packageName": "@nodelib/fs.scandir", + "hash": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + } + }, + "npm:@nodelib/fs.stat": { + "type": "npm", + "name": "npm:@nodelib/fs.stat", + "data": { + "version": "2.0.5", + "packageName": "@nodelib/fs.stat", + "hash": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + } + }, + "npm:@nodelib/fs.walk": { + "type": "npm", + "name": "npm:@nodelib/fs.walk", + "data": { + "version": "1.2.8", + "packageName": "@nodelib/fs.walk", + "hash": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + } + }, + "npm:@nx/nx-darwin-arm64": { + "type": "npm", + "name": "npm:@nx/nx-darwin-arm64", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-darwin-arm64", + "hash": "sha512-xT6U9oRjze9QTLp8ieoNOno6GHA5S2R36tzergMfTevCTnpJBE0GX8vtI6fmcK3NkVmbdPI9Vb/FmBPcvD9eEQ==" + } + }, + "npm:@nx/nx-darwin-x64": { + "type": "npm", + "name": "npm:@nx/nx-darwin-x64", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-darwin-x64", + "hash": "sha512-20n1KPgPNV4gym3rzs/vgDJb0ybNIHuVYU+5m6/+ee5jZNApa5Ivi5Kqpm1RKLiKYgcm97ZbWbGi/K0CXqt1dw==" + } + }, + "npm:@nx/nx-freebsd-x64": { + "type": "npm", + "name": "npm:@nx/nx-freebsd-x64", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-freebsd-x64", + "hash": "sha512-Z1AMFUuT1MAay09s0MWSRBdb9fY0DVwOm2TnvLRc1zJ2eMVnbK+Z2NMMOMM10udyogLbxGUHefbl+HtAAcJdxQ==" + } + }, + "npm:@nx/nx-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@nx/nx-linux-arm-gnueabihf", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-arm-gnueabihf", + "hash": "sha512-bR82Id9frpz4GbxXXMsiXAQZ6tI7d3Veifyqj6th/9A3/UyZR4YKYpGm2QEsm0hp4n3BO8K5JxCxhGDgp5YwVg==" + } + }, + "npm:@nx/nx-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@nx/nx-linux-arm64-gnu", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-arm64-gnu", + "hash": "sha512-K6l/qa1rUM1saFlcT/KnJfhRtLyPkpYCxWGNYaMQ3gEFozPCHYdAJUQ+sKS8kVyWt2anAWx2XkmXUaz04OB8BQ==" + } + }, + "npm:@nx/nx-linux-arm64-musl": { + "type": "npm", + "name": "npm:@nx/nx-linux-arm64-musl", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-arm64-musl", + "hash": "sha512-vZUAUsaop5fdcyWpYzED+hWTKOuDtwG9DNNYUlII0dZhSA8kZwmXoYmrCGeMe5nQX9tF4pNzF+oddC/E169Z6g==" + } + }, + "npm:@nx/nx-linux-x64-gnu": { + "type": "npm", + "name": "npm:@nx/nx-linux-x64-gnu", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-x64-gnu", + "hash": "sha512-+NiA5uNh1cdpk2k984NlfIxRXaO0Bu0S4qCvWWKmL/150f31qJ/eHN6rd78/Re2qKO1NDoyDZLW6jqRXIm/GgA==" + } + }, + "npm:@nx/nx-linux-x64-musl": { + "type": "npm", + "name": "npm:@nx/nx-linux-x64-musl", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-linux-x64-musl", + "hash": "sha512-8O7dXems/Of/biCKeuGMh3nmbS2PNvaL8R4xQzaBl94XitzFMxVFjjoTST7y3Ksmsa5Wrbzwyh+kHOMoIMlVpA==" + } + }, + "npm:@nx/nx-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@nx/nx-win32-arm64-msvc", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-win32-arm64-msvc", + "hash": "sha512-/Wt3kdj5BksswSWL4N8tef6B+d5r0LbdEPqZimx3AqDMC9H1YkVuwwdBWFGOh+ldj/N8adRuZKjEMQfa/oqPGg==" + } + }, + "npm:@nx/nx-win32-x64-msvc": { + "type": "npm", + "name": "npm:@nx/nx-win32-x64-msvc", + "data": { + "version": "22.1.2", + "packageName": "@nx/nx-win32-x64-msvc", + "hash": "sha512-vihs1hIVMyQYoKul5rfwvU+4WKhbajJ8lSUTVvxjV2j+8F0BYMvRQtB2jDZfBpjEpSBmgP4ApIsLkQzQQBzLug==" + } + }, + "npm:@oozcitak/dom": { + "type": "npm", + "name": "npm:@oozcitak/dom", + "data": { + "version": "2.0.2", + "packageName": "@oozcitak/dom", + "hash": "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==" + } + }, + "npm:@oozcitak/infra": { + "type": "npm", + "name": "npm:@oozcitak/infra", + "data": { + "version": "2.0.2", + "packageName": "@oozcitak/infra", + "hash": "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==" + } + }, + "npm:@oozcitak/url": { + "type": "npm", + "name": "npm:@oozcitak/url", + "data": { + "version": "3.0.0", + "packageName": "@oozcitak/url", + "hash": "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==" + } + }, + "npm:@oozcitak/util": { + "type": "npm", + "name": "npm:@oozcitak/util", + "data": { + "version": "10.0.0", + "packageName": "@oozcitak/util", + "hash": "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==" + } + }, + "npm:@oxc-project/types": { + "type": "npm", + "name": "npm:@oxc-project/types", + "data": { + "version": "0.98.0", + "packageName": "@oxc-project/types", + "hash": "sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==" + } + }, + "npm:@oxc-resolver/binding-android-arm-eabi": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-android-arm-eabi", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-android-arm-eabi", + "hash": "sha512-jB47iZ/thvhE+USCLv+XY3IknBbkKr/p7OBsQDTHode/GPw+OHRlit3NQ1bjt1Mj8V2CS7iHdSDYobZ1/0gagQ==" + } + }, + "npm:@oxc-resolver/binding-android-arm64": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-android-arm64", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-android-arm64", + "hash": "sha512-XFJ9t7d/Cz+dWLyqtTy3Xrekz+qqN4hmOU2iOUgr7u71OQsPUHIIeS9/wKanEK0l413gPwapIkyc5x9ltlOtyw==" + } + }, + "npm:@oxc-resolver/binding-darwin-arm64": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-darwin-arm64", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-darwin-arm64", + "hash": "sha512-gwehBS9smA1mzK8frDsmUCHz+6baJVwkKF6qViHhoqA3kRKvIZ3k6WNP4JmF19JhOiGxRcoPa8gZRfzNgXwP2A==" + } + }, + "npm:@oxc-resolver/binding-darwin-x64": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-darwin-x64", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-darwin-x64", + "hash": "sha512-5wwJvfuoahKiAqqAsMLOI28rqdh3P2K7HkjIWUXNMWAZq6ErX0L5rwJzu6T32+Zxw3k18C7R9IS4wDq/3Ar+6w==" + } + }, + "npm:@oxc-resolver/binding-freebsd-x64": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-freebsd-x64", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-freebsd-x64", + "hash": "sha512-MWTt+LOQNcQ6fa+Uu5VikkihLi1PSIrQqqp0QD44k2AORasNWl0jRGBTcMSBIgNe82qEQWYvlGzvOEEOBp01Og==" + } + }, + "npm:@oxc-resolver/binding-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-arm-gnueabihf", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-arm-gnueabihf", + "hash": "sha512-b6/IBqYrS3o0XiLVBsnex/wK8pTTK+hbGfAMOHVU6p7DBpwPPLgC/tav4IXoOIUCssTFz7aWh/xtUok0swn8VQ==" + } + }, + "npm:@oxc-resolver/binding-linux-arm-musleabihf": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-arm-musleabihf", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-arm-musleabihf", + "hash": "sha512-o2Qh5+y5YoqVK6YfzkalHdpmQ5bkbGGxuLg1pZLQ1Ift0x+Vix7DaFEpdCl5Z9xvYXogd/TwOlL0TPl4+MTFLA==" + } + }, + "npm:@oxc-resolver/binding-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-arm64-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-arm64-gnu", + "hash": "sha512-lk8mCSg0Tg4sEG73RiPjb7keGcEPwqQnBHX3Z+BR2SWe+qNHpoHcyFMNafzSvEC18vlxC04AUSoa6kJl/C5zig==" + } + }, + "npm:@oxc-resolver/binding-linux-arm64-musl": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-arm64-musl", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-arm64-musl", + "hash": "sha512-KykeIVhCM7pn93ABa0fNe8vk4XvnbfZMELne2s6P9tdJH9KMBsCFBi7a2BmSdUtTqWCAJokAcm46lpczU52Xaw==" + } + }, + "npm:@oxc-resolver/binding-linux-ppc64-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-ppc64-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-ppc64-gnu", + "hash": "sha512-QqPPWAcZU/jHAuam4f3zV8OdEkYRPD2XR0peVet3hoMMgsihR3Lhe7J/bLclmod297FG0+OgBYQVMh2nTN6oWA==" + } + }, + "npm:@oxc-resolver/binding-linux-riscv64-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-riscv64-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-riscv64-gnu", + "hash": "sha512-DunWA+wafeG3hj1NADUD3c+DRvmyVNqF5LSHVUWA2bzswqmuEZXl3VYBSzxfD0j+UnRTFYLxf27AMptoMsepYg==" + } + }, + "npm:@oxc-resolver/binding-linux-riscv64-musl": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-riscv64-musl", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-riscv64-musl", + "hash": "sha512-4SRvwKTTk2k67EQr9Ny4NGf/BhlwggCI1CXwBbA9IV4oP38DH8b+NAPxDY0ySGRsWbPkG92FYOqM4AWzG4GSgA==" + } + }, + "npm:@oxc-resolver/binding-linux-s390x-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-s390x-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-s390x-gnu", + "hash": "sha512-hZKvkbsurj4JOom//R1Ab2MlC4cGeVm5zzMt4IsS3XySQeYjyMJ5TDZ3J5rQ8bVj3xi4FpJU2yFZ72GApsHQ6A==" + } + }, + "npm:@oxc-resolver/binding-linux-x64-gnu": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-x64-gnu", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-x64-gnu", + "hash": "sha512-hABxQXFXJurivw+0amFdeEcK67cF1BGBIN1+sSHzq3TRv4RoG8n5q2JE04Le2n2Kpt6xg4Y5+lcv+rb2mCJLgQ==" + } + }, + "npm:@oxc-resolver/binding-linux-x64-musl": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-linux-x64-musl", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-linux-x64-musl", + "hash": "sha512-Ln73wUB5migZRvC7obAAdqVwvFvk7AUs2JLt4g9QHr8FnqivlsjpUC9Nf2ssrybdjyQzEMjttUxPZz6aKPSAHw==" + } + }, + "npm:@oxc-resolver/binding-wasm32-wasi": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-wasm32-wasi", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-wasm32-wasi", + "hash": "sha512-z+NbELmCOKNtWOqEB5qDfHXOSWB3kGQIIehq6nHtZwHLzdVO2oBq6De/ayhY3ygriC1XhgaIzzniY7jgrNl4Kw==" + } + }, + "npm:@oxc-resolver/binding-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-win32-arm64-msvc", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-win32-arm64-msvc", + "hash": "sha512-Ft0+qd7HSO61qCTLJ4LCdBGZkpKyDj1rG0OVSZL1DxWQoh97m7vEHd7zAvUtw8EcWjOMBQuX4mfRap/x2MOCpQ==" + } + }, + "npm:@oxc-resolver/binding-win32-ia32-msvc": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-win32-ia32-msvc", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-win32-ia32-msvc", + "hash": "sha512-o54jYNSfGdPxHSvXEhZg8FOV3K99mJ1f7hb1alRFb+Yec1GQXNrJXxZPIxNMYeFT13kwAWB7zuQ0HZLnDHFxfw==" + } + }, + "npm:@oxc-resolver/binding-win32-x64-msvc": { + "type": "npm", + "name": "npm:@oxc-resolver/binding-win32-x64-msvc", + "data": { + "version": "11.14.0", + "packageName": "@oxc-resolver/binding-win32-x64-msvc", + "hash": "sha512-j97icaORyM6A7GjgmUzfn7V+KGzVvctRA+eAlJb0c2OQNaETFxl6BXZdnGBDb+6oA0Y4Sr/wnekd1kQ0aVyKGg==" + } + }, + "npm:@parcel/watcher-android-arm64": { + "type": "npm", + "name": "npm:@parcel/watcher-android-arm64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-android-arm64", + "hash": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==" + } + }, + "npm:@parcel/watcher-darwin-arm64": { + "type": "npm", + "name": "npm:@parcel/watcher-darwin-arm64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-darwin-arm64", + "hash": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==" + } + }, + "npm:@parcel/watcher-darwin-x64": { + "type": "npm", + "name": "npm:@parcel/watcher-darwin-x64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-darwin-x64", + "hash": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==" + } + }, + "npm:@parcel/watcher-freebsd-x64": { + "type": "npm", + "name": "npm:@parcel/watcher-freebsd-x64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-freebsd-x64", + "hash": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==" + } + }, + "npm:@parcel/watcher-linux-arm-glibc": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-arm-glibc", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-arm-glibc", + "hash": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==" + } + }, + "npm:@parcel/watcher-linux-arm-musl": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-arm-musl", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-arm-musl", + "hash": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==" + } + }, + "npm:@parcel/watcher-linux-arm64-glibc": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-arm64-glibc", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-arm64-glibc", + "hash": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==" + } + }, + "npm:@parcel/watcher-linux-arm64-musl": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-arm64-musl", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-arm64-musl", + "hash": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==" + } + }, + "npm:@parcel/watcher-linux-x64-glibc": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-x64-glibc", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-x64-glibc", + "hash": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==" + } + }, + "npm:@parcel/watcher-linux-x64-musl": { + "type": "npm", + "name": "npm:@parcel/watcher-linux-x64-musl", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-linux-x64-musl", + "hash": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==" + } + }, + "npm:@parcel/watcher-wasm": { + "type": "npm", + "name": "npm:@parcel/watcher-wasm", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-wasm", + "hash": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==" + } + }, + "npm:@parcel/watcher-win32-arm64": { + "type": "npm", + "name": "npm:@parcel/watcher-win32-arm64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-win32-arm64", + "hash": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==" + } + }, + "npm:@parcel/watcher-win32-ia32": { + "type": "npm", + "name": "npm:@parcel/watcher-win32-ia32", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-win32-ia32", + "hash": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==" + } + }, + "npm:@parcel/watcher-win32-x64": { + "type": "npm", + "name": "npm:@parcel/watcher-win32-x64", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher-win32-x64", + "hash": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==" + } + }, + "npm:@parcel/watcher": { + "type": "npm", + "name": "npm:@parcel/watcher", + "data": { + "version": "2.5.1", + "packageName": "@parcel/watcher", + "hash": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==" + } + }, + "npm:@pkgjs/parseargs": { + "type": "npm", + "name": "npm:@pkgjs/parseargs", + "data": { + "version": "0.11.0", + "packageName": "@pkgjs/parseargs", + "hash": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" + } + }, + "npm:@poppinss/colors": { + "type": "npm", + "name": "npm:@poppinss/colors", + "data": { + "version": "4.1.5", + "packageName": "@poppinss/colors", + "hash": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==" + } + }, + "npm:@poppinss/dumper": { + "type": "npm", + "name": "npm:@poppinss/dumper", + "data": { + "version": "0.6.4", + "packageName": "@poppinss/dumper", + "hash": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==" + } + }, + "npm:@poppinss/exception": { + "type": "npm", + "name": "npm:@poppinss/exception", + "data": { + "version": "1.2.2", + "packageName": "@poppinss/exception", + "hash": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==" + } + }, + "npm:@publint/pack": { + "type": "npm", + "name": "npm:@publint/pack", + "data": { + "version": "0.1.2", + "packageName": "@publint/pack", + "hash": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==" + } + }, + "npm:@rolldown/binding-android-arm64": { + "type": "npm", + "name": "npm:@rolldown/binding-android-arm64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-android-arm64", + "hash": "sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==" + } + }, + "npm:@rolldown/binding-darwin-arm64": { + "type": "npm", + "name": "npm:@rolldown/binding-darwin-arm64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-darwin-arm64", + "hash": "sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==" + } + }, + "npm:@rolldown/binding-darwin-x64": { + "type": "npm", + "name": "npm:@rolldown/binding-darwin-x64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-darwin-x64", + "hash": "sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==" + } + }, + "npm:@rolldown/binding-freebsd-x64": { + "type": "npm", + "name": "npm:@rolldown/binding-freebsd-x64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-freebsd-x64", + "hash": "sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==" + } + }, + "npm:@rolldown/binding-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-arm-gnueabihf", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-arm-gnueabihf", + "hash": "sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==" + } + }, + "npm:@rolldown/binding-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-arm64-gnu", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-arm64-gnu", + "hash": "sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==" + } + }, + "npm:@rolldown/binding-linux-arm64-musl": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-arm64-musl", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-arm64-musl", + "hash": "sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==" + } + }, + "npm:@rolldown/binding-linux-x64-gnu": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-x64-gnu", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-x64-gnu", + "hash": "sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==" + } + }, + "npm:@rolldown/binding-linux-x64-musl": { + "type": "npm", + "name": "npm:@rolldown/binding-linux-x64-musl", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-linux-x64-musl", + "hash": "sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==" + } + }, + "npm:@rolldown/binding-openharmony-arm64": { + "type": "npm", + "name": "npm:@rolldown/binding-openharmony-arm64", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-openharmony-arm64", + "hash": "sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==" + } + }, + "npm:@rolldown/binding-wasm32-wasi": { + "type": "npm", + "name": "npm:@rolldown/binding-wasm32-wasi", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-wasm32-wasi", + "hash": "sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==" + } + }, + "npm:@rolldown/binding-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@rolldown/binding-win32-arm64-msvc", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-win32-arm64-msvc", + "hash": "sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==" + } + }, + "npm:@rolldown/binding-win32-ia32-msvc": { + "type": "npm", + "name": "npm:@rolldown/binding-win32-ia32-msvc", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-win32-ia32-msvc", + "hash": "sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==" + } + }, + "npm:@rolldown/binding-win32-x64-msvc": { + "type": "npm", + "name": "npm:@rolldown/binding-win32-x64-msvc", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/binding-win32-x64-msvc", + "hash": "sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==" + } + }, + "npm:@rolldown/pluginutils@1.0.0-beta.40": { + "type": "npm", + "name": "npm:@rolldown/pluginutils@1.0.0-beta.40", + "data": { + "version": "1.0.0-beta.40", + "packageName": "@rolldown/pluginutils", + "hash": "sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==" + } + }, + "npm:@rolldown/pluginutils@1.0.0-beta.47": { + "type": "npm", + "name": "npm:@rolldown/pluginutils@1.0.0-beta.47", + "data": { + "version": "1.0.0-beta.47", + "packageName": "@rolldown/pluginutils", + "hash": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==" + } + }, + "npm:@rolldown/pluginutils@1.0.0-beta.51": { + "type": "npm", + "name": "npm:@rolldown/pluginutils@1.0.0-beta.51", + "data": { + "version": "1.0.0-beta.51", + "packageName": "@rolldown/pluginutils", + "hash": "sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==" + } + }, + "npm:@rollup/plugin-alias": { + "type": "npm", + "name": "npm:@rollup/plugin-alias", + "data": { + "version": "5.1.1", + "packageName": "@rollup/plugin-alias", + "hash": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==" + } + }, + "npm:@rollup/plugin-commonjs": { + "type": "npm", + "name": "npm:@rollup/plugin-commonjs", + "data": { + "version": "28.0.9", + "packageName": "@rollup/plugin-commonjs", + "hash": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==" + } + }, + "npm:@rollup/plugin-inject": { + "type": "npm", + "name": "npm:@rollup/plugin-inject", + "data": { + "version": "5.0.5", + "packageName": "@rollup/plugin-inject", + "hash": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==" + } + }, + "npm:@rollup/plugin-json": { + "type": "npm", + "name": "npm:@rollup/plugin-json", + "data": { + "version": "6.1.0", + "packageName": "@rollup/plugin-json", + "hash": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==" + } + }, + "npm:@rollup/plugin-node-resolve": { + "type": "npm", + "name": "npm:@rollup/plugin-node-resolve", + "data": { + "version": "16.0.3", + "packageName": "@rollup/plugin-node-resolve", + "hash": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==" + } + }, + "npm:@rollup/plugin-replace": { + "type": "npm", + "name": "npm:@rollup/plugin-replace", + "data": { + "version": "6.0.3", + "packageName": "@rollup/plugin-replace", + "hash": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==" + } + }, + "npm:@rollup/plugin-terser": { + "type": "npm", + "name": "npm:@rollup/plugin-terser", + "data": { + "version": "0.4.4", + "packageName": "@rollup/plugin-terser", + "hash": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==" + } + }, + "npm:@rollup/pluginutils": { + "type": "npm", + "name": "npm:@rollup/pluginutils", + "data": { + "version": "5.3.0", + "packageName": "@rollup/pluginutils", + "hash": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==" + } + }, + "npm:@rollup/rollup-android-arm-eabi": { + "type": "npm", + "name": "npm:@rollup/rollup-android-arm-eabi", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-android-arm-eabi", + "hash": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==" + } + }, + "npm:@rollup/rollup-android-arm64": { + "type": "npm", + "name": "npm:@rollup/rollup-android-arm64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-android-arm64", + "hash": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==" + } + }, + "npm:@rollup/rollup-darwin-arm64": { + "type": "npm", + "name": "npm:@rollup/rollup-darwin-arm64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-darwin-arm64", + "hash": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==" + } + }, + "npm:@rollup/rollup-darwin-x64": { + "type": "npm", + "name": "npm:@rollup/rollup-darwin-x64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-darwin-x64", + "hash": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==" + } + }, + "npm:@rollup/rollup-freebsd-arm64": { + "type": "npm", + "name": "npm:@rollup/rollup-freebsd-arm64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-freebsd-arm64", + "hash": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==" + } + }, + "npm:@rollup/rollup-freebsd-x64": { + "type": "npm", + "name": "npm:@rollup/rollup-freebsd-x64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-freebsd-x64", + "hash": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==" + } + }, + "npm:@rollup/rollup-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-arm-gnueabihf", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-arm-gnueabihf", + "hash": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==" + } + }, + "npm:@rollup/rollup-linux-arm-musleabihf": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-arm-musleabihf", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-arm-musleabihf", + "hash": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==" + } + }, + "npm:@rollup/rollup-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-arm64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-arm64-gnu", + "hash": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==" + } + }, + "npm:@rollup/rollup-linux-arm64-musl": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-arm64-musl", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-arm64-musl", + "hash": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==" + } + }, + "npm:@rollup/rollup-linux-loong64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-loong64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-loong64-gnu", + "hash": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==" + } + }, + "npm:@rollup/rollup-linux-ppc64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-ppc64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-ppc64-gnu", + "hash": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==" + } + }, + "npm:@rollup/rollup-linux-riscv64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-riscv64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-riscv64-gnu", + "hash": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==" + } + }, + "npm:@rollup/rollup-linux-riscv64-musl": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-riscv64-musl", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-riscv64-musl", + "hash": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==" + } + }, + "npm:@rollup/rollup-linux-s390x-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-s390x-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-s390x-gnu", + "hash": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==" + } + }, + "npm:@rollup/rollup-linux-x64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-x64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-x64-gnu", + "hash": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==" + } + }, + "npm:@rollup/rollup-linux-x64-musl": { + "type": "npm", + "name": "npm:@rollup/rollup-linux-x64-musl", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-linux-x64-musl", + "hash": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==" + } + }, + "npm:@rollup/rollup-openharmony-arm64": { + "type": "npm", + "name": "npm:@rollup/rollup-openharmony-arm64", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-openharmony-arm64", + "hash": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==" + } + }, + "npm:@rollup/rollup-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@rollup/rollup-win32-arm64-msvc", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-win32-arm64-msvc", + "hash": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==" + } + }, + "npm:@rollup/rollup-win32-ia32-msvc": { + "type": "npm", + "name": "npm:@rollup/rollup-win32-ia32-msvc", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-win32-ia32-msvc", + "hash": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==" + } + }, + "npm:@rollup/rollup-win32-x64-gnu": { + "type": "npm", + "name": "npm:@rollup/rollup-win32-x64-gnu", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-win32-x64-gnu", + "hash": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==" + } + }, + "npm:@rollup/rollup-win32-x64-msvc": { + "type": "npm", + "name": "npm:@rollup/rollup-win32-x64-msvc", + "data": { + "version": "4.53.3", + "packageName": "@rollup/rollup-win32-x64-msvc", + "hash": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==" + } + }, + "npm:@rushstack/node-core-library": { + "type": "npm", + "name": "npm:@rushstack/node-core-library", + "data": { + "version": "5.7.0", + "packageName": "@rushstack/node-core-library", + "hash": "sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==" + } + }, + "npm:@rushstack/rig-package": { + "type": "npm", + "name": "npm:@rushstack/rig-package", + "data": { + "version": "0.5.3", + "packageName": "@rushstack/rig-package", + "hash": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==" + } + }, + "npm:@rushstack/terminal": { + "type": "npm", + "name": "npm:@rushstack/terminal", + "data": { + "version": "0.14.0", + "packageName": "@rushstack/terminal", + "hash": "sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==" + } + }, + "npm:@rushstack/ts-command-line": { + "type": "npm", + "name": "npm:@rushstack/ts-command-line", + "data": { + "version": "4.22.6", + "packageName": "@rushstack/ts-command-line", + "hash": "sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==" + } + }, + "npm:@shikijs/engine-oniguruma": { + "type": "npm", + "name": "npm:@shikijs/engine-oniguruma", + "data": { + "version": "3.15.0", + "packageName": "@shikijs/engine-oniguruma", + "hash": "sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==" + } + }, + "npm:@shikijs/langs": { + "type": "npm", + "name": "npm:@shikijs/langs", + "data": { + "version": "3.15.0", + "packageName": "@shikijs/langs", + "hash": "sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==" + } + }, + "npm:@shikijs/themes": { + "type": "npm", + "name": "npm:@shikijs/themes", + "data": { + "version": "3.15.0", + "packageName": "@shikijs/themes", + "hash": "sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==" + } + }, + "npm:@shikijs/types": { + "type": "npm", + "name": "npm:@shikijs/types", + "data": { + "version": "3.15.0", + "packageName": "@shikijs/types", + "hash": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==" + } + }, + "npm:@shikijs/vscode-textmate": { + "type": "npm", + "name": "npm:@shikijs/vscode-textmate", + "data": { + "version": "10.0.2", + "packageName": "@shikijs/vscode-textmate", + "hash": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" + } + }, + "npm:@sinclair/typebox": { + "type": "npm", + "name": "npm:@sinclair/typebox", + "data": { + "version": "0.34.41", + "packageName": "@sinclair/typebox", + "hash": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==" + } + }, + "npm:@sindresorhus/is": { + "type": "npm", + "name": "npm:@sindresorhus/is", + "data": { + "version": "7.1.1", + "packageName": "@sindresorhus/is", + "hash": "sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==" + } + }, + "npm:@sindresorhus/merge-streams": { + "type": "npm", + "name": "npm:@sindresorhus/merge-streams", + "data": { + "version": "4.0.0", + "packageName": "@sindresorhus/merge-streams", + "hash": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==" + } + }, + "npm:@size-limit/esbuild": { + "type": "npm", + "name": "npm:@size-limit/esbuild", + "data": { + "version": "11.2.0", + "packageName": "@size-limit/esbuild", + "hash": "sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==" + } + }, + "npm:@size-limit/file": { + "type": "npm", + "name": "npm:@size-limit/file", + "data": { + "version": "11.2.0", + "packageName": "@size-limit/file", + "hash": "sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==" + } + }, + "npm:@size-limit/preset-small-lib": { + "type": "npm", + "name": "npm:@size-limit/preset-small-lib", + "data": { + "version": "11.2.0", + "packageName": "@size-limit/preset-small-lib", + "hash": "sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==" + } + }, + "npm:@solid-primitives/event-listener": { + "type": "npm", + "name": "npm:@solid-primitives/event-listener", + "data": { + "version": "2.4.3", + "packageName": "@solid-primitives/event-listener", + "hash": "sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==" + } + }, + "npm:@solid-primitives/keyboard": { + "type": "npm", + "name": "npm:@solid-primitives/keyboard", + "data": { + "version": "1.3.3", + "packageName": "@solid-primitives/keyboard", + "hash": "sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==" + } + }, + "npm:@solid-primitives/resize-observer": { + "type": "npm", + "name": "npm:@solid-primitives/resize-observer", + "data": { + "version": "2.1.3", + "packageName": "@solid-primitives/resize-observer", + "hash": "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==" + } + }, + "npm:@solid-primitives/rootless": { + "type": "npm", + "name": "npm:@solid-primitives/rootless", + "data": { + "version": "1.5.2", + "packageName": "@solid-primitives/rootless", + "hash": "sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==" + } + }, + "npm:@solid-primitives/static-store": { + "type": "npm", + "name": "npm:@solid-primitives/static-store", + "data": { + "version": "0.1.2", + "packageName": "@solid-primitives/static-store", + "hash": "sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==" + } + }, + "npm:@solid-primitives/utils": { + "type": "npm", + "name": "npm:@solid-primitives/utils", + "data": { + "version": "6.3.2", + "packageName": "@solid-primitives/utils", + "hash": "sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==" + } + }, + "npm:@speed-highlight/core": { + "type": "npm", + "name": "npm:@speed-highlight/core", + "data": { + "version": "1.2.8", + "packageName": "@speed-highlight/core", + "hash": "sha512-IGytNtnUnPIobIbOq5Y6LIlqiHNX+vnToQIS7lj6L5819C+rA8TXRDkkG8vePsiBOGcoW9R6i+dp2YBUKdB09Q==" + } + }, + "npm:@standard-schema/spec": { + "type": "npm", + "name": "npm:@standard-schema/spec", + "data": { + "version": "1.0.0", + "packageName": "@standard-schema/spec", + "hash": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==" + } + }, + "npm:@stylistic/eslint-plugin": { + "type": "npm", + "name": "npm:@stylistic/eslint-plugin", + "data": { + "version": "5.5.0", + "packageName": "@stylistic/eslint-plugin", + "hash": "sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==" + } + }, + "npm:@sveltejs/acorn-typescript": { + "type": "npm", + "name": "npm:@sveltejs/acorn-typescript", + "data": { + "version": "1.0.7", + "packageName": "@sveltejs/acorn-typescript", + "hash": "sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==" + } + }, + "npm:@svitejs/changesets-changelog-github-compact": { + "type": "npm", + "name": "npm:@svitejs/changesets-changelog-github-compact", + "data": { + "version": "1.2.0", + "packageName": "@svitejs/changesets-changelog-github-compact", + "hash": "sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==" + } + }, + "npm:@tailwindcss/node": { + "type": "npm", + "name": "npm:@tailwindcss/node", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/node", + "hash": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==" + } + }, + "npm:@tailwindcss/oxide-android-arm64": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-android-arm64", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-android-arm64", + "hash": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==" + } + }, + "npm:@tailwindcss/oxide-darwin-arm64": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-darwin-arm64", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-darwin-arm64", + "hash": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==" + } + }, + "npm:@tailwindcss/oxide-darwin-x64": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-darwin-x64", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-darwin-x64", + "hash": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==" + } + }, + "npm:@tailwindcss/oxide-freebsd-x64": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-freebsd-x64", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-freebsd-x64", + "hash": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==" + } + }, + "npm:@tailwindcss/oxide-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-arm-gnueabihf", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-arm-gnueabihf", + "hash": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==" + } + }, + "npm:@tailwindcss/oxide-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-arm64-gnu", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-arm64-gnu", + "hash": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==" + } + }, + "npm:@tailwindcss/oxide-linux-arm64-musl": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-arm64-musl", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-arm64-musl", + "hash": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==" + } + }, + "npm:@tailwindcss/oxide-linux-x64-gnu": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-x64-gnu", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-x64-gnu", + "hash": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==" + } + }, + "npm:@tailwindcss/oxide-linux-x64-musl": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-linux-x64-musl", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-linux-x64-musl", + "hash": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==" + } + }, + "npm:@tailwindcss/oxide-wasm32-wasi": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-wasm32-wasi", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-wasm32-wasi", + "hash": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==" + } + }, + "npm:@tailwindcss/oxide-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-win32-arm64-msvc", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-win32-arm64-msvc", + "hash": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==" + } + }, + "npm:@tailwindcss/oxide-win32-x64-msvc": { + "type": "npm", + "name": "npm:@tailwindcss/oxide-win32-x64-msvc", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide-win32-x64-msvc", + "hash": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==" + } + }, + "npm:@tailwindcss/oxide": { + "type": "npm", + "name": "npm:@tailwindcss/oxide", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/oxide", + "hash": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==" + } + }, + "npm:@tailwindcss/vite": { + "type": "npm", + "name": "npm:@tailwindcss/vite", + "data": { + "version": "4.1.17", + "packageName": "@tailwindcss/vite", + "hash": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==" + } + }, + "npm:@tanstack/config": { + "type": "npm", + "name": "npm:@tanstack/config", + "data": { + "version": "0.22.1", + "packageName": "@tanstack/config", + "hash": "sha512-0m+gqjrIE6el20VpGIzT54SIjvu27lDRHr+9NiK2nYya5fm0e/19+NfKRoDekZhSBfjaGytUaSpbofzvbSw8zw==" + } + }, + "npm:@tanstack/devtools-client": { + "type": "npm", + "name": "npm:@tanstack/devtools-client", + "data": { + "version": "0.0.4", + "packageName": "@tanstack/devtools-client", + "hash": "sha512-LefnH9KE9uRDEWifc3QDcooskA8ikfs41bybDTgpYQpyTUspZnaEdUdya9Hry0KYxZ8nos0S3nNbsP79KHqr6Q==" + } + }, + "npm:@tanstack/devtools-event-bus": { + "type": "npm", + "name": "npm:@tanstack/devtools-event-bus", + "data": { + "version": "0.3.3", + "packageName": "@tanstack/devtools-event-bus", + "hash": "sha512-lWl88uLAz7ZhwNdLH6A3tBOSEuBCrvnY9Fzr5JPdzJRFdM5ZFdyNWz1Bf5l/F3GU57VodrN0KCFi9OA26H5Kpg==" + } + }, + "npm:@tanstack/devtools-event-client": { + "type": "npm", + "name": "npm:@tanstack/devtools-event-client", + "data": { + "version": "0.3.5", + "packageName": "@tanstack/devtools-event-client", + "hash": "sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==" + } + }, + "npm:@tanstack/devtools-ui": { + "type": "npm", + "name": "npm:@tanstack/devtools-ui", + "data": { + "version": "0.4.4", + "packageName": "@tanstack/devtools-ui", + "hash": "sha512-5xHXFyX3nom0UaNfiOM92o6ziaHjGo3mcSGe2HD5Xs8dWRZNpdZ0Smd0B9ddEhy0oB+gXyMzZgUJb9DmrZV0Mg==" + } + }, + "npm:@tanstack/devtools-utils": { + "type": "npm", + "name": "npm:@tanstack/devtools-utils", + "data": { + "version": "0.0.8", + "packageName": "@tanstack/devtools-utils", + "hash": "sha512-cWoohW9OswidFclwopYRsW0FR3jOoC5iMy0pUHm/31uAnlTb3ViFoZ1VqMf7vZESYdDeee8OjaICS1YbKksDxg==" + } + }, + "npm:@tanstack/devtools": { + "type": "npm", + "name": "npm:@tanstack/devtools", + "data": { + "version": "0.8.2", + "packageName": "@tanstack/devtools", + "hash": "sha512-ltVS+MpOrA37CiVunSOCcXctaDnQOJV6FPE5Y2uLq3m8b0spmHwp0edp1PRd2CMG4LnGIlRf7lYdhHa2p9CHNA==" + } + }, + "npm:@tanstack/directive-functions-plugin": { + "type": "npm", + "name": "npm:@tanstack/directive-functions-plugin", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/directive-functions-plugin", + "hash": "sha512-qLGxldnWa0pp/siZEFEYDU+eB/j40bd1V3IuTzP0sFnrYi11Ldx1yVkOruDKUbO1WM0o+OlPhp22Q1h+LMdDMA==" + } + }, + "npm:@tanstack/eslint-config": { + "type": "npm", + "name": "npm:@tanstack/eslint-config", + "data": { + "version": "0.3.3", + "packageName": "@tanstack/eslint-config", + "hash": "sha512-8VFyAaIFV9onJcfc5yVj5WWl6DmN3W4m+t0Mb+nZrQmqHy+kDndw5O5Xv2BHVWRRPTqnhlJYh6wHWGh0R81ZzQ==" + } + }, + "npm:@tanstack/history": { + "type": "npm", + "name": "npm:@tanstack/history", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/history", + "hash": "sha512-l6wcxwDBeh/7Dhles23U1O8lp9kNJmAb2yNjekR6olZwCRNAVA8TCXlVCrueELyFlYZqvQkh0ofxnzG62A1Kkg==" + } + }, + "npm:@tanstack/nitro-v2-vite-plugin": { + "type": "npm", + "name": "npm:@tanstack/nitro-v2-vite-plugin", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/nitro-v2-vite-plugin", + "hash": "sha512-TedrzuMjtHA08x47wCaU6KTrrat8gyzn8a4HUswTwjAa0sMpz4vbOOUDDZyYaJpmjKKbTjgTs6iRr4MONneKTQ==" + } + }, + "npm:@tanstack/publish-config": { + "type": "npm", + "name": "npm:@tanstack/publish-config", + "data": { + "version": "0.2.2", + "packageName": "@tanstack/publish-config", + "hash": "sha512-hTW2rLeZLBMmpwVzWmUJ5L50hPlf4Ea74rZtecbT6qQYCT16JEAbryfHm1u07KIICI2vEArsm2YguckjODqx0w==" + } + }, + "npm:@tanstack/query-core": { + "type": "npm", + "name": "npm:@tanstack/query-core", + "data": { + "version": "5.90.5", + "packageName": "@tanstack/query-core", + "hash": "sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==" + } + }, + "npm:@tanstack/react-devtools": { + "type": "npm", + "name": "npm:@tanstack/react-devtools", + "data": { + "version": "0.8.2", + "packageName": "@tanstack/react-devtools", + "hash": "sha512-D1oG2QivpAmiT4iq7PxbsajmoYmtnhwg9gEK7q9mDiVcnyPjwnhg1ujDvKIzP+ZaRTkQzpJYwtTmS9DzYp8Akg==" + } + }, + "npm:@tanstack/react-query": { + "type": "npm", + "name": "npm:@tanstack/react-query", + "data": { + "version": "5.90.5", + "packageName": "@tanstack/react-query", + "hash": "sha512-pN+8UWpxZkEJ/Rnnj2v2Sxpx1WFlaa9L6a4UO89p6tTQbeo+m0MS8oYDjbggrR8QcTyjKoYWKS3xJQGr3ExT8Q==" + } + }, + "npm:@tanstack/react-router-devtools": { + "type": "npm", + "name": "npm:@tanstack/react-router-devtools", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/react-router-devtools", + "hash": "sha512-ySuFWfR5mHtbs/le5SUb56OxCWTZskwynPp6E9qnyDgB4vX6P7OJDqdgv7rqiorYNjFmAaywraaVZGQ8WuB4+g==" + } + }, + "npm:@tanstack/react-router-ssr-query": { + "type": "npm", + "name": "npm:@tanstack/react-router-ssr-query", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/react-router-ssr-query", + "hash": "sha512-S38TJsBrA7NRxFzdCTb7uDIls1JEtRJAuSLWQrlVigmFEHY2yk2/r45aSKu0cc/ucxRRZ+0JxUo4lFInoFYt1w==" + } + }, + "npm:@tanstack/react-router": { + "type": "npm", + "name": "npm:@tanstack/react-router", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/react-router", + "hash": "sha512-5vhwIAwoxWl7oeIZRNgk5wh9TCkaAinK9qbfdKuKzwGtMHqnv1bRrfKwam3/MaMwHCmvnNfnFj0RYfnBA/ilEg==" + } + }, + "npm:@tanstack/react-start-client": { + "type": "npm", + "name": "npm:@tanstack/react-start-client", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/react-start-client", + "hash": "sha512-082eg9SvYdg4+kZFO6fhiwazoWOa8TUWLIi2Um3OLcnlBJzAf3cwsYE+Ub4siPucRX4DxzSDrY5TgH+uMYKtBQ==" + } + }, + "npm:@tanstack/react-start-server": { + "type": "npm", + "name": "npm:@tanstack/react-start-server", + "data": { + "version": "1.139.8", + "packageName": "@tanstack/react-start-server", + "hash": "sha512-7lmu6a2PDpxd1J438FmV/lxc5vRRvy34dV9NYRNvOj6fxcGfagxix1qi6NKtgmiSQQ83DNfrckHno0wlOJJLOg==" + } + }, + "npm:@tanstack/react-start": { + "type": "npm", + "name": "npm:@tanstack/react-start", + "data": { + "version": "1.139.8", + "packageName": "@tanstack/react-start", + "hash": "sha512-vNSd1w+NCDAmTzkiPC6klnwVZBH8EjXg+c5sf7+PPUYXMZMb7kYCRiH8xKjCBRQkubgQeA8bnVsbRWqC21hQHw==" + } + }, + "npm:@tanstack/react-store": { + "type": "npm", + "name": "npm:@tanstack/react-store", + "data": { + "version": "0.8.0", + "packageName": "@tanstack/react-store", + "hash": "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==" + } + }, + "npm:@tanstack/router-core": { + "type": "npm", + "name": "npm:@tanstack/router-core", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-core", + "hash": "sha512-mqgsJi4/B2Jo6PXRUs1AsWA+06nqiqVZe1aXioA3vR6PesNeKUSXWfmIoYF6wOx3osiV0BnwB1JCBrInCOQSWA==" + } + }, + "npm:@tanstack/router-devtools-core": { + "type": "npm", + "name": "npm:@tanstack/router-devtools-core", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-devtools-core", + "hash": "sha512-Tx6+rCyjthlH7KS9Jz6YdT2KQ6rZQ66F+XJOj7Rel8zGAvyqx8USzcqTRvC+QjaU1jIJq+mNPWpMdKkkxPSOVA==" + } + }, + "npm:@tanstack/router-generator": { + "type": "npm", + "name": "npm:@tanstack/router-generator", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-generator", + "hash": "sha512-xnmF1poNH/dHtwFxecCcRsaLRIXVnXRZiWYUpvtyaPv4pQYayCrFQCg2ygDbCV0/8H7ctMBJh5MIL7GgPR7+xw==" + } + }, + "npm:@tanstack/router-plugin": { + "type": "npm", + "name": "npm:@tanstack/router-plugin", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-plugin", + "hash": "sha512-sgB8nOoVKr0A2lw5p7kQ3MtEA03d1t+Qvqyy+f/QkHy5pGk8Yohg64TEX+2e98plfM3j5vAOu/JhAyoLLrp1Jw==" + } + }, + "npm:@tanstack/router-ssr-query-core": { + "type": "npm", + "name": "npm:@tanstack/router-ssr-query-core", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/router-ssr-query-core", + "hash": "sha512-Ei4P2g/7xNO99OgvBOAAeVLI6VnqXYcSTI1Q6b1NYBzsb4aIo8Ne38cgVnanDlnIRrUJjIDQdZTAtu0AdANiyg==" + } + }, + "npm:@tanstack/router-utils": { + "type": "npm", + "name": "npm:@tanstack/router-utils", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/router-utils", + "hash": "sha512-jT7D6NimWqoFSkid4vCno8gvTyfL1+NHpgm3es0B2UNhKKRV3LngOGilm1m6v8Qvk/gy6Fh/tvB+s+hBl6GhOg==" + } + }, + "npm:@tanstack/server-functions-plugin": { + "type": "npm", + "name": "npm:@tanstack/server-functions-plugin", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/server-functions-plugin", + "hash": "sha512-IpNFiCoy2YU6gY/4lCKIVlFyU67ltlcUMGcdnrevqOgq20AbMyeLbbBVo9tAA3TkHK9F+9Hd7DqGXsup2pmBLg==" + } + }, + "npm:@tanstack/start-client-core": { + "type": "npm", + "name": "npm:@tanstack/start-client-core", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/start-client-core", + "hash": "sha512-omG032CeYUWlwQt6s7VFqhc9dGHKWNJ0C5PoIckL+G/HcV+0/RxYkiKzx/HTTzWt+K+LpsBDFFNnrTUUyTE5sw==" + } + }, + "npm:@tanstack/start-plugin-core": { + "type": "npm", + "name": "npm:@tanstack/start-plugin-core", + "data": { + "version": "1.139.8", + "packageName": "@tanstack/start-plugin-core", + "hash": "sha512-u1+rof/1vNHzFVR0yPWWSVwzbCtvndQsfjBR104xSTLCLB0oGvFvkCU0xLLyKtxhqsrYZFrqudg5B8aVH2plOg==" + } + }, + "npm:@tanstack/start-server-core": { + "type": "npm", + "name": "npm:@tanstack/start-server-core", + "data": { + "version": "1.139.8", + "packageName": "@tanstack/start-server-core", + "hash": "sha512-jKC83uMS2kgCHoqlHmxh9hAK1pN9Wd8l+Lhkibwp9PKKMW4Z1bxy5xCx6sr3TD2yJEOP25SRhYMrtAKmrLmYGA==" + } + }, + "npm:@tanstack/start-storage-context": { + "type": "npm", + "name": "npm:@tanstack/start-storage-context", + "data": { + "version": "1.139.7", + "packageName": "@tanstack/start-storage-context", + "hash": "sha512-l2utb0CXLE+wfj1wlAUPHohiq7n5nOBMl3pflhl3JzCXt+6D9AAogkfrysyxOAvx3KnLh3oG+qwf1KHWIDB9HA==" + } + }, + "npm:@tanstack/store": { + "type": "npm", + "name": "npm:@tanstack/store", + "data": { + "version": "0.8.0", + "packageName": "@tanstack/store", + "hash": "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==" + } + }, + "npm:@tanstack/typedoc-config": { + "type": "npm", + "name": "npm:@tanstack/typedoc-config", + "data": { + "version": "0.3.1", + "packageName": "@tanstack/typedoc-config", + "hash": "sha512-frgA1vjzxbdU5/xn/Z/UqyOd1yuegEfAnx9QNbcX+1XQ3TCzD+x89cMZH9iyxdTC1Tasx2gq7DCNCvX962X9WA==" + } + }, + "npm:@tanstack/virtual-file-routes": { + "type": "npm", + "name": "npm:@tanstack/virtual-file-routes", + "data": { + "version": "1.139.0", + "packageName": "@tanstack/virtual-file-routes", + "hash": "sha512-9PImF1d1tovTUIpjFVa0W7Fwj/MHif7BaaczgJJfbv3sDt1Gh+oW9W9uCw9M3ndEJynnp5ZD/TTs0RGubH5ssg==" + } + }, + "npm:@tanstack/vite-config": { + "type": "npm", + "name": "npm:@tanstack/vite-config", + "data": { + "version": "0.4.1", + "packageName": "@tanstack/vite-config", + "hash": "sha512-FOl8EF6SAcljanKSm5aBeJaflFcxQAytTbxtNW8HC6D4x+UBW68IC4tBcrlrsI0wXHBmC/Gz4Ovvv8qCtiXSgQ==" + } + }, + "npm:@testing-library/dom": { + "type": "npm", + "name": "npm:@testing-library/dom", + "data": { + "version": "10.4.1", + "packageName": "@testing-library/dom", + "hash": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==" + } + }, + "npm:@testing-library/jest-dom": { + "type": "npm", + "name": "npm:@testing-library/jest-dom", + "data": { + "version": "6.9.1", + "packageName": "@testing-library/jest-dom", + "hash": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==" + } + }, + "npm:@testing-library/react": { + "type": "npm", + "name": "npm:@testing-library/react", + "data": { + "version": "16.3.0", + "packageName": "@testing-library/react", + "hash": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==" + } + }, + "npm:@tybys/wasm-util@0.10.1": { + "type": "npm", + "name": "npm:@tybys/wasm-util@0.10.1", + "data": { + "version": "0.10.1", + "packageName": "@tybys/wasm-util", + "hash": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==" + } + }, + "npm:@tybys/wasm-util@0.9.0": { + "type": "npm", + "name": "npm:@tybys/wasm-util@0.9.0", + "data": { + "version": "0.9.0", + "packageName": "@tybys/wasm-util", + "hash": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==" + } + }, + "npm:@types/argparse": { + "type": "npm", + "name": "npm:@types/argparse", + "data": { + "version": "1.0.38", + "packageName": "@types/argparse", + "hash": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" + } + }, + "npm:@types/aria-query": { + "type": "npm", + "name": "npm:@types/aria-query", + "data": { + "version": "5.0.4", + "packageName": "@types/aria-query", + "hash": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" + } + }, + "npm:@types/babel__core": { + "type": "npm", + "name": "npm:@types/babel__core", + "data": { + "version": "7.20.5", + "packageName": "@types/babel__core", + "hash": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==" + } + }, + "npm:@types/babel__generator": { + "type": "npm", + "name": "npm:@types/babel__generator", + "data": { + "version": "7.27.0", + "packageName": "@types/babel__generator", + "hash": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==" + } + }, + "npm:@types/babel__template": { + "type": "npm", + "name": "npm:@types/babel__template", + "data": { + "version": "7.4.4", + "packageName": "@types/babel__template", + "hash": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==" + } + }, + "npm:@types/babel__traverse": { + "type": "npm", + "name": "npm:@types/babel__traverse", + "data": { + "version": "7.28.0", + "packageName": "@types/babel__traverse", + "hash": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==" + } + }, + "npm:@types/chai": { + "type": "npm", + "name": "npm:@types/chai", + "data": { + "version": "5.2.3", + "packageName": "@types/chai", + "hash": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==" + } + }, + "npm:@types/conventional-commits-parser": { + "type": "npm", + "name": "npm:@types/conventional-commits-parser", + "data": { + "version": "5.0.2", + "packageName": "@types/conventional-commits-parser", + "hash": "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==" + } + }, + "npm:@types/debug": { + "type": "npm", + "name": "npm:@types/debug", + "data": { + "version": "4.1.12", + "packageName": "@types/debug", + "hash": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==" + } + }, + "npm:@types/deep-eql": { + "type": "npm", + "name": "npm:@types/deep-eql", + "data": { + "version": "4.0.2", + "packageName": "@types/deep-eql", + "hash": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" + } + }, + "npm:@types/estree-jsx": { + "type": "npm", + "name": "npm:@types/estree-jsx", + "data": { + "version": "1.0.5", + "packageName": "@types/estree-jsx", + "hash": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==" + } + }, + "npm:@types/estree": { + "type": "npm", + "name": "npm:@types/estree", + "data": { + "version": "1.0.8", + "packageName": "@types/estree", + "hash": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + } + }, + "npm:@types/hast": { + "type": "npm", + "name": "npm:@types/hast", + "data": { + "version": "3.0.4", + "packageName": "@types/hast", + "hash": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==" + } + }, + "npm:@types/json-schema": { + "type": "npm", + "name": "npm:@types/json-schema", + "data": { + "version": "7.0.15", + "packageName": "@types/json-schema", + "hash": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + } + }, + "npm:@types/mdast": { + "type": "npm", + "name": "npm:@types/mdast", + "data": { + "version": "4.0.4", + "packageName": "@types/mdast", + "hash": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==" + } + }, + "npm:@types/ms": { + "type": "npm", + "name": "npm:@types/ms", + "data": { + "version": "2.1.0", + "packageName": "@types/ms", + "hash": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + } + }, + "npm:@types/node@12.20.55": { + "type": "npm", + "name": "npm:@types/node@12.20.55", + "data": { + "version": "12.20.55", + "packageName": "@types/node", + "hash": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + } + }, + "npm:@types/node@20.19.25": { + "type": "npm", + "name": "npm:@types/node@20.19.25", + "data": { + "version": "20.19.25", + "packageName": "@types/node", + "hash": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==" + } + }, + "npm:@types/node": { + "type": "npm", + "name": "npm:@types/node", + "data": { + "version": "24.10.1", + "packageName": "@types/node", + "hash": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==" + } + }, + "npm:@types/react-dom": { + "type": "npm", + "name": "npm:@types/react-dom", + "data": { + "version": "19.2.3", + "packageName": "@types/react-dom", + "hash": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==" + } + }, + "npm:@types/react": { + "type": "npm", + "name": "npm:@types/react", + "data": { + "version": "19.2.7", + "packageName": "@types/react", + "hash": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==" + } + }, + "npm:@types/resolve": { + "type": "npm", + "name": "npm:@types/resolve", + "data": { + "version": "1.20.2", + "packageName": "@types/resolve", + "hash": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + } + }, + "npm:@types/unist@2.0.11": { + "type": "npm", + "name": "npm:@types/unist@2.0.11", + "data": { + "version": "2.0.11", + "packageName": "@types/unist", + "hash": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + } + }, + "npm:@types/unist@3.0.3": { + "type": "npm", + "name": "npm:@types/unist@3.0.3", + "data": { + "version": "3.0.3", + "packageName": "@types/unist", + "hash": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + } + }, + "npm:@types/whatwg-mimetype": { + "type": "npm", + "name": "npm:@types/whatwg-mimetype", + "data": { + "version": "3.0.2", + "packageName": "@types/whatwg-mimetype", + "hash": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==" + } + }, + "npm:@typescript-eslint/eslint-plugin": { + "type": "npm", + "name": "npm:@typescript-eslint/eslint-plugin", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/eslint-plugin", + "hash": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==" + } + }, + "npm:@typescript-eslint/parser": { + "type": "npm", + "name": "npm:@typescript-eslint/parser", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/parser", + "hash": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==" + } + }, + "npm:@typescript-eslint/project-service@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/project-service@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/project-service", + "hash": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==" + } + }, + "npm:@typescript-eslint/project-service@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/project-service@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/project-service", + "hash": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==" + } + }, + "npm:@typescript-eslint/scope-manager@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/scope-manager@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/scope-manager", + "hash": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==" + } + }, + "npm:@typescript-eslint/scope-manager@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/scope-manager@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/scope-manager", + "hash": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==" + } + }, + "npm:@typescript-eslint/tsconfig-utils@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/tsconfig-utils@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/tsconfig-utils", + "hash": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==" + } + }, + "npm:@typescript-eslint/tsconfig-utils@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/tsconfig-utils@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/tsconfig-utils", + "hash": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==" + } + }, + "npm:@typescript-eslint/type-utils@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/type-utils@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/type-utils", + "hash": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==" + } + }, + "npm:@typescript-eslint/type-utils@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/type-utils@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/type-utils", + "hash": "sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==" + } + }, + "npm:@typescript-eslint/types@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/types@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/types", + "hash": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==" + } + }, + "npm:@typescript-eslint/types@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/types@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/types", + "hash": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==" + } + }, + "npm:@typescript-eslint/typescript-estree@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/typescript-estree@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/typescript-estree", + "hash": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==" + } + }, + "npm:@typescript-eslint/typescript-estree@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/typescript-estree@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/typescript-estree", + "hash": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==" + } + }, + "npm:@typescript-eslint/utils@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/utils@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/utils", + "hash": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==" + } + }, + "npm:@typescript-eslint/utils@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/utils@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/utils", + "hash": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==" + } + }, + "npm:@typescript-eslint/visitor-keys@8.46.3": { + "type": "npm", + "name": "npm:@typescript-eslint/visitor-keys@8.46.3", + "data": { + "version": "8.46.3", + "packageName": "@typescript-eslint/visitor-keys", + "hash": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==" + } + }, + "npm:@typescript-eslint/visitor-keys@8.48.0": { + "type": "npm", + "name": "npm:@typescript-eslint/visitor-keys@8.48.0", + "data": { + "version": "8.48.0", + "packageName": "@typescript-eslint/visitor-keys", + "hash": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==" + } + }, + "npm:@ungap/structured-clone": { + "type": "npm", + "name": "npm:@ungap/structured-clone", + "data": { + "version": "1.3.0", + "packageName": "@ungap/structured-clone", + "hash": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" + } + }, + "npm:@unrs/resolver-binding-android-arm-eabi": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-android-arm-eabi", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-android-arm-eabi", + "hash": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==" + } + }, + "npm:@unrs/resolver-binding-android-arm64": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-android-arm64", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-android-arm64", + "hash": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==" + } + }, + "npm:@unrs/resolver-binding-darwin-arm64": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-darwin-arm64", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-darwin-arm64", + "hash": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==" + } + }, + "npm:@unrs/resolver-binding-darwin-x64": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-darwin-x64", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-darwin-x64", + "hash": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==" + } + }, + "npm:@unrs/resolver-binding-freebsd-x64": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-freebsd-x64", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-freebsd-x64", + "hash": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==" + } + }, + "npm:@unrs/resolver-binding-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-arm-gnueabihf", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-arm-gnueabihf", + "hash": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==" + } + }, + "npm:@unrs/resolver-binding-linux-arm-musleabihf": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-arm-musleabihf", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-arm-musleabihf", + "hash": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==" + } + }, + "npm:@unrs/resolver-binding-linux-arm64-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-arm64-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-arm64-gnu", + "hash": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==" + } + }, + "npm:@unrs/resolver-binding-linux-arm64-musl": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-arm64-musl", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-arm64-musl", + "hash": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==" + } + }, + "npm:@unrs/resolver-binding-linux-ppc64-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-ppc64-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-ppc64-gnu", + "hash": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==" + } + }, + "npm:@unrs/resolver-binding-linux-riscv64-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-riscv64-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-riscv64-gnu", + "hash": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==" + } + }, + "npm:@unrs/resolver-binding-linux-riscv64-musl": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-riscv64-musl", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-riscv64-musl", + "hash": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==" + } + }, + "npm:@unrs/resolver-binding-linux-s390x-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-s390x-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-s390x-gnu", + "hash": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==" + } + }, + "npm:@unrs/resolver-binding-linux-x64-gnu": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-x64-gnu", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-x64-gnu", + "hash": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==" + } + }, + "npm:@unrs/resolver-binding-linux-x64-musl": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-linux-x64-musl", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-linux-x64-musl", + "hash": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==" + } + }, + "npm:@unrs/resolver-binding-wasm32-wasi": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-wasm32-wasi", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-wasm32-wasi", + "hash": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==" + } + }, + "npm:@unrs/resolver-binding-win32-arm64-msvc": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-win32-arm64-msvc", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-win32-arm64-msvc", + "hash": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==" + } + }, + "npm:@unrs/resolver-binding-win32-ia32-msvc": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-win32-ia32-msvc", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-win32-ia32-msvc", + "hash": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==" + } + }, + "npm:@unrs/resolver-binding-win32-x64-msvc": { + "type": "npm", + "name": "npm:@unrs/resolver-binding-win32-x64-msvc", + "data": { + "version": "1.11.1", + "packageName": "@unrs/resolver-binding-win32-x64-msvc", + "hash": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==" + } + }, + "npm:@vercel/nft": { + "type": "npm", + "name": "npm:@vercel/nft", + "data": { + "version": "0.30.3", + "packageName": "@vercel/nft", + "hash": "sha512-UEq+eF0ocEf9WQCV1gktxKhha36KDs7jln5qii6UpPf5clMqDc0p3E7d9l2Smx0i9Pm1qpq4S4lLfNl97bbv6w==" + } + }, + "npm:@vitejs/plugin-react": { + "type": "npm", + "name": "npm:@vitejs/plugin-react", + "data": { + "version": "5.1.1", + "packageName": "@vitejs/plugin-react", + "hash": "sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==" + } + }, + "npm:@vitest/expect": { + "type": "npm", + "name": "npm:@vitest/expect", + "data": { + "version": "4.0.14", + "packageName": "@vitest/expect", + "hash": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==" + } + }, + "npm:@vitest/mocker": { + "type": "npm", + "name": "npm:@vitest/mocker", + "data": { + "version": "4.0.14", + "packageName": "@vitest/mocker", + "hash": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==" + } + }, + "npm:@vitest/pretty-format": { + "type": "npm", + "name": "npm:@vitest/pretty-format", + "data": { + "version": "4.0.14", + "packageName": "@vitest/pretty-format", + "hash": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==" + } + }, + "npm:@vitest/runner": { + "type": "npm", + "name": "npm:@vitest/runner", + "data": { + "version": "4.0.14", + "packageName": "@vitest/runner", + "hash": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==" + } + }, + "npm:@vitest/snapshot": { + "type": "npm", + "name": "npm:@vitest/snapshot", + "data": { + "version": "4.0.14", + "packageName": "@vitest/snapshot", + "hash": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==" + } + }, + "npm:@vitest/spy": { + "type": "npm", + "name": "npm:@vitest/spy", + "data": { + "version": "4.0.14", + "packageName": "@vitest/spy", + "hash": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==" + } + }, + "npm:@vitest/utils": { + "type": "npm", + "name": "npm:@vitest/utils", + "data": { + "version": "4.0.14", + "packageName": "@vitest/utils", + "hash": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==" + } + }, + "npm:@volar/language-core": { + "type": "npm", + "name": "npm:@volar/language-core", + "data": { + "version": "2.4.23", + "packageName": "@volar/language-core", + "hash": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==" + } + }, + "npm:@volar/source-map": { + "type": "npm", + "name": "npm:@volar/source-map", + "data": { + "version": "2.4.23", + "packageName": "@volar/source-map", + "hash": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==" + } + }, + "npm:@volar/typescript": { + "type": "npm", + "name": "npm:@volar/typescript", + "data": { + "version": "2.4.23", + "packageName": "@volar/typescript", + "hash": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==" + } + }, + "npm:@vue/compiler-core": { + "type": "npm", + "name": "npm:@vue/compiler-core", + "data": { + "version": "3.5.24", + "packageName": "@vue/compiler-core", + "hash": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==" + } + }, + "npm:@vue/compiler-dom": { + "type": "npm", + "name": "npm:@vue/compiler-dom", + "data": { + "version": "3.5.24", + "packageName": "@vue/compiler-dom", + "hash": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==" + } + }, + "npm:@vue/compiler-vue2": { + "type": "npm", + "name": "npm:@vue/compiler-vue2", + "data": { + "version": "2.7.16", + "packageName": "@vue/compiler-vue2", + "hash": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==" + } + }, + "npm:@vue/language-core": { + "type": "npm", + "name": "npm:@vue/language-core", + "data": { + "version": "2.1.6", + "packageName": "@vue/language-core", + "hash": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==" + } + }, + "npm:@vue/shared": { + "type": "npm", + "name": "npm:@vue/shared", + "data": { + "version": "3.5.24", + "packageName": "@vue/shared", + "hash": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==" + } + }, + "npm:@yarnpkg/lockfile": { + "type": "npm", + "name": "npm:@yarnpkg/lockfile", + "data": { + "version": "1.1.0", + "packageName": "@yarnpkg/lockfile", + "hash": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + } + }, + "npm:@yarnpkg/parsers": { + "type": "npm", + "name": "npm:@yarnpkg/parsers", + "data": { + "version": "3.0.2", + "packageName": "@yarnpkg/parsers", + "hash": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==" + } + }, + "npm:@zkochan/js-yaml": { + "type": "npm", + "name": "npm:@zkochan/js-yaml", + "data": { + "version": "0.0.7", + "packageName": "@zkochan/js-yaml", + "hash": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==" + } + }, + "npm:JSONStream": { + "type": "npm", + "name": "npm:JSONStream", + "data": { + "version": "1.3.5", + "packageName": "JSONStream", + "hash": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==" + } + }, + "npm:abbrev": { + "type": "npm", + "name": "npm:abbrev", + "data": { + "version": "3.0.1", + "packageName": "abbrev", + "hash": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" + } + }, + "npm:abort-controller": { + "type": "npm", + "name": "npm:abort-controller", + "data": { + "version": "3.0.0", + "packageName": "abort-controller", + "hash": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==" + } + }, + "npm:acorn-import-attributes": { + "type": "npm", + "name": "npm:acorn-import-attributes", + "data": { + "version": "1.9.5", + "packageName": "acorn-import-attributes", + "hash": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==" + } + }, + "npm:acorn-jsx": { + "type": "npm", + "name": "npm:acorn-jsx", + "data": { + "version": "5.3.2", + "packageName": "acorn-jsx", + "hash": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + } + }, + "npm:acorn": { + "type": "npm", + "name": "npm:acorn", + "data": { + "version": "8.15.0", + "packageName": "acorn", + "hash": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" + } + }, + "npm:agent-base": { + "type": "npm", + "name": "npm:agent-base", + "data": { + "version": "7.1.4", + "packageName": "agent-base", + "hash": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" + } + }, + "npm:ajv-draft-04": { + "type": "npm", + "name": "npm:ajv-draft-04", + "data": { + "version": "1.0.0", + "packageName": "ajv-draft-04", + "hash": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==" + } + }, + "npm:ajv-formats": { + "type": "npm", + "name": "npm:ajv-formats", + "data": { + "version": "3.0.1", + "packageName": "ajv-formats", + "hash": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==" + } + }, + "npm:ajv@6.12.6": { + "type": "npm", + "name": "npm:ajv@6.12.6", + "data": { + "version": "6.12.6", + "packageName": "ajv", + "hash": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + } + }, + "npm:ajv@8.12.0": { + "type": "npm", + "name": "npm:ajv@8.12.0", + "data": { + "version": "8.12.0", + "packageName": "ajv", + "hash": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==" + } + }, + "npm:ajv@8.13.0": { + "type": "npm", + "name": "npm:ajv@8.13.0", + "data": { + "version": "8.13.0", + "packageName": "ajv", + "hash": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==" + } + }, + "npm:ansi-colors": { + "type": "npm", + "name": "npm:ansi-colors", + "data": { + "version": "4.1.3", + "packageName": "ansi-colors", + "hash": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + } + }, + "npm:ansi-regex@5.0.1": { + "type": "npm", + "name": "npm:ansi-regex@5.0.1", + "data": { + "version": "5.0.1", + "packageName": "ansi-regex", + "hash": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + } + }, + "npm:ansi-regex@6.2.2": { + "type": "npm", + "name": "npm:ansi-regex@6.2.2", + "data": { + "version": "6.2.2", + "packageName": "ansi-regex", + "hash": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" + } + }, + "npm:ansi-styles@4.3.0": { + "type": "npm", + "name": "npm:ansi-styles@4.3.0", + "data": { + "version": "4.3.0", + "packageName": "ansi-styles", + "hash": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + } + }, + "npm:ansi-styles@5.2.0": { + "type": "npm", + "name": "npm:ansi-styles@5.2.0", + "data": { + "version": "5.2.0", + "packageName": "ansi-styles", + "hash": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + }, + "npm:ansi-styles@6.2.3": { + "type": "npm", + "name": "npm:ansi-styles@6.2.3", + "data": { + "version": "6.2.3", + "packageName": "ansi-styles", + "hash": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" + } + }, + "npm:ansis": { + "type": "npm", + "name": "npm:ansis", + "data": { + "version": "4.2.0", + "packageName": "ansis", + "hash": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==" + } + }, + "npm:anymatch": { + "type": "npm", + "name": "npm:anymatch", + "data": { + "version": "3.1.3", + "packageName": "anymatch", + "hash": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" + } + }, + "npm:archiver-utils": { + "type": "npm", + "name": "npm:archiver-utils", + "data": { + "version": "5.0.2", + "packageName": "archiver-utils", + "hash": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==" + } + }, + "npm:archiver": { + "type": "npm", + "name": "npm:archiver", + "data": { + "version": "7.0.1", + "packageName": "archiver", + "hash": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==" + } + }, + "npm:argparse@1.0.10": { + "type": "npm", + "name": "npm:argparse@1.0.10", + "data": { + "version": "1.0.10", + "packageName": "argparse", + "hash": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + } + }, + "npm:argparse@2.0.1": { + "type": "npm", + "name": "npm:argparse@2.0.1", + "data": { + "version": "2.0.1", + "packageName": "argparse", + "hash": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + } + }, + "npm:aria-query@5.3.0": { + "type": "npm", + "name": "npm:aria-query@5.3.0", + "data": { + "version": "5.3.0", + "packageName": "aria-query", + "hash": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==" + } + }, + "npm:aria-query@5.3.2": { + "type": "npm", + "name": "npm:aria-query@5.3.2", + "data": { + "version": "5.3.2", + "packageName": "aria-query", + "hash": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" + } + }, + "npm:array-ify": { + "type": "npm", + "name": "npm:array-ify", + "data": { + "version": "1.0.0", + "packageName": "array-ify", + "hash": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" + } + }, + "npm:array-union": { + "type": "npm", + "name": "npm:array-union", + "data": { + "version": "2.1.0", + "packageName": "array-union", + "hash": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + } + }, + "npm:assertion-error": { + "type": "npm", + "name": "npm:assertion-error", + "data": { + "version": "2.0.1", + "packageName": "assertion-error", + "hash": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" + } + }, + "npm:ast-types": { + "type": "npm", + "name": "npm:ast-types", + "data": { + "version": "0.16.1", + "packageName": "ast-types", + "hash": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==" + } + }, + "npm:async-sema": { + "type": "npm", + "name": "npm:async-sema", + "data": { + "version": "3.1.1", + "packageName": "async-sema", + "hash": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" + } + }, + "npm:async": { + "type": "npm", + "name": "npm:async", + "data": { + "version": "3.2.6", + "packageName": "async", + "hash": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + } + }, + "npm:asynckit": { + "type": "npm", + "name": "npm:asynckit", + "data": { + "version": "0.4.0", + "packageName": "asynckit", + "hash": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + } + }, + "npm:axios": { + "type": "npm", + "name": "npm:axios", + "data": { + "version": "1.13.2", + "packageName": "axios", + "hash": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==" + } + }, + "npm:axobject-query": { + "type": "npm", + "name": "npm:axobject-query", + "data": { + "version": "4.1.0", + "packageName": "axobject-query", + "hash": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==" + } + }, + "npm:b4a": { + "type": "npm", + "name": "npm:b4a", + "data": { + "version": "1.7.3", + "packageName": "b4a", + "hash": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==" + } + }, + "npm:babel-dead-code-elimination": { + "type": "npm", + "name": "npm:babel-dead-code-elimination", + "data": { + "version": "1.0.10", + "packageName": "babel-dead-code-elimination", + "hash": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==" + } + }, + "npm:babel-plugin-jsx-dom-expressions": { + "type": "npm", + "name": "npm:babel-plugin-jsx-dom-expressions", + "data": { + "version": "0.40.3", + "packageName": "babel-plugin-jsx-dom-expressions", + "hash": "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==" + } + }, + "npm:babel-preset-solid": { + "type": "npm", + "name": "npm:babel-preset-solid", + "data": { + "version": "1.9.10", + "packageName": "babel-preset-solid", + "hash": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==" + } + }, + "npm:bail": { + "type": "npm", + "name": "npm:bail", + "data": { + "version": "2.0.2", + "packageName": "bail", + "hash": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + } + }, + "npm:balanced-match": { + "type": "npm", + "name": "npm:balanced-match", + "data": { + "version": "1.0.2", + "packageName": "balanced-match", + "hash": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + } + }, + "npm:bare-events": { + "type": "npm", + "name": "npm:bare-events", + "data": { + "version": "2.8.1", + "packageName": "bare-events", + "hash": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==" + } + }, + "npm:base64-js": { + "type": "npm", + "name": "npm:base64-js", + "data": { + "version": "1.5.1", + "packageName": "base64-js", + "hash": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + } + }, + "npm:baseline-browser-mapping": { + "type": "npm", + "name": "npm:baseline-browser-mapping", + "data": { + "version": "2.8.22", + "packageName": "baseline-browser-mapping", + "hash": "sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==" + } + }, + "npm:better-path-resolve": { + "type": "npm", + "name": "npm:better-path-resolve", + "data": { + "version": "1.0.0", + "packageName": "better-path-resolve", + "hash": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==" + } + }, + "npm:bidi-js": { + "type": "npm", + "name": "npm:bidi-js", + "data": { + "version": "1.0.3", + "packageName": "bidi-js", + "hash": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==" + } + }, + "npm:bignumber.js": { + "type": "npm", + "name": "npm:bignumber.js", + "data": { + "version": "9.3.1", + "packageName": "bignumber.js", + "hash": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" + } + }, + "npm:binary-extensions": { + "type": "npm", + "name": "npm:binary-extensions", + "data": { + "version": "2.3.0", + "packageName": "binary-extensions", + "hash": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" + } + }, + "npm:bindings": { + "type": "npm", + "name": "npm:bindings", + "data": { + "version": "1.5.0", + "packageName": "bindings", + "hash": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==" + } + }, + "npm:birecord": { + "type": "npm", + "name": "npm:birecord", + "data": { + "version": "0.1.1", + "packageName": "birecord", + "hash": "sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==" + } + }, + "npm:bl": { + "type": "npm", + "name": "npm:bl", + "data": { + "version": "4.1.0", + "packageName": "bl", + "hash": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==" + } + }, + "npm:boolbase": { + "type": "npm", + "name": "npm:boolbase", + "data": { + "version": "1.0.0", + "packageName": "boolbase", + "hash": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + } + }, + "npm:brace-expansion@1.1.12": { + "type": "npm", + "name": "npm:brace-expansion@1.1.12", + "data": { + "version": "1.1.12", + "packageName": "brace-expansion", + "hash": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==" + } + }, + "npm:brace-expansion@2.0.2": { + "type": "npm", + "name": "npm:brace-expansion@2.0.2", + "data": { + "version": "2.0.2", + "packageName": "brace-expansion", + "hash": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==" + } + }, + "npm:braces": { + "type": "npm", + "name": "npm:braces", + "data": { + "version": "3.0.3", + "packageName": "braces", + "hash": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==" + } + }, + "npm:browserslist": { + "type": "npm", + "name": "npm:browserslist", + "data": { + "version": "4.27.0", + "packageName": "browserslist", + "hash": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==" + } + }, + "npm:buffer-crc32": { + "type": "npm", + "name": "npm:buffer-crc32", + "data": { + "version": "1.0.0", + "packageName": "buffer-crc32", + "hash": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==" + } + }, + "npm:buffer-equal-constant-time": { + "type": "npm", + "name": "npm:buffer-equal-constant-time", + "data": { + "version": "1.0.1", + "packageName": "buffer-equal-constant-time", + "hash": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + } + }, + "npm:buffer-from": { + "type": "npm", + "name": "npm:buffer-from", + "data": { + "version": "1.1.2", + "packageName": "buffer-from", + "hash": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + } + }, + "npm:buffer@5.7.1": { + "type": "npm", + "name": "npm:buffer@5.7.1", + "data": { + "version": "5.7.1", + "packageName": "buffer", + "hash": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" + } + }, + "npm:buffer@6.0.3": { + "type": "npm", + "name": "npm:buffer@6.0.3", + "data": { + "version": "6.0.3", + "packageName": "buffer", + "hash": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==" + } + }, + "npm:bytes-iec": { + "type": "npm", + "name": "npm:bytes-iec", + "data": { + "version": "3.1.1", + "packageName": "bytes-iec", + "hash": "sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==" + } + }, + "npm:c12": { + "type": "npm", + "name": "npm:c12", + "data": { + "version": "3.3.1", + "packageName": "c12", + "hash": "sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ==" + } + }, + "npm:call-bind-apply-helpers": { + "type": "npm", + "name": "npm:call-bind-apply-helpers", + "data": { + "version": "1.0.2", + "packageName": "call-bind-apply-helpers", + "hash": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==" + } + }, + "npm:callsites": { + "type": "npm", + "name": "npm:callsites", + "data": { + "version": "3.1.0", + "packageName": "callsites", + "hash": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + } + }, + "npm:caniuse-lite": { + "type": "npm", + "name": "npm:caniuse-lite", + "data": { + "version": "1.0.30001752", + "packageName": "caniuse-lite", + "hash": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==" + } + }, + "npm:ccount": { + "type": "npm", + "name": "npm:ccount", + "data": { + "version": "2.0.1", + "packageName": "ccount", + "hash": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + } + }, + "npm:chai": { + "type": "npm", + "name": "npm:chai", + "data": { + "version": "6.2.1", + "packageName": "chai", + "hash": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==" + } + }, + "npm:chalk@4.1.2": { + "type": "npm", + "name": "npm:chalk@4.1.2", + "data": { + "version": "4.1.2", + "packageName": "chalk", + "hash": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + } + }, + "npm:chalk@5.6.2": { + "type": "npm", + "name": "npm:chalk@5.6.2", + "data": { + "version": "5.6.2", + "packageName": "chalk", + "hash": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" + } + }, + "npm:character-entities-html4": { + "type": "npm", + "name": "npm:character-entities-html4", + "data": { + "version": "2.1.0", + "packageName": "character-entities-html4", + "hash": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" + } + }, + "npm:character-entities-legacy": { + "type": "npm", + "name": "npm:character-entities-legacy", + "data": { + "version": "3.0.0", + "packageName": "character-entities-legacy", + "hash": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" + } + }, + "npm:character-entities": { + "type": "npm", + "name": "npm:character-entities", + "data": { + "version": "2.0.2", + "packageName": "character-entities", + "hash": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" + } + }, + "npm:character-reference-invalid": { + "type": "npm", + "name": "npm:character-reference-invalid", + "data": { + "version": "2.0.1", + "packageName": "character-reference-invalid", + "hash": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" + } + }, + "npm:chardet": { + "type": "npm", + "name": "npm:chardet", + "data": { + "version": "2.1.1", + "packageName": "chardet", + "hash": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==" + } + }, + "npm:cheerio-select": { + "type": "npm", + "name": "npm:cheerio-select", + "data": { + "version": "2.1.0", + "packageName": "cheerio-select", + "hash": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==" + } + }, + "npm:cheerio": { + "type": "npm", + "name": "npm:cheerio", + "data": { + "version": "1.1.2", + "packageName": "cheerio", + "hash": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==" + } + }, + "npm:chokidar@3.6.0": { + "type": "npm", + "name": "npm:chokidar@3.6.0", + "data": { + "version": "3.6.0", + "packageName": "chokidar", + "hash": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==" + } + }, + "npm:chokidar@4.0.3": { + "type": "npm", + "name": "npm:chokidar@4.0.3", + "data": { + "version": "4.0.3", + "packageName": "chokidar", + "hash": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==" + } + }, + "npm:chownr": { + "type": "npm", + "name": "npm:chownr", + "data": { + "version": "3.0.0", + "packageName": "chownr", + "hash": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" + } + }, + "npm:ci-info": { + "type": "npm", + "name": "npm:ci-info", + "data": { + "version": "3.9.0", + "packageName": "ci-info", + "hash": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" + } + }, + "npm:citty": { + "type": "npm", + "name": "npm:citty", + "data": { + "version": "0.1.6", + "packageName": "citty", + "hash": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==" + } + }, + "npm:cli-cursor": { + "type": "npm", + "name": "npm:cli-cursor", + "data": { + "version": "3.1.0", + "packageName": "cli-cursor", + "hash": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==" + } + }, + "npm:cli-spinners": { + "type": "npm", + "name": "npm:cli-spinners", + "data": { + "version": "2.6.1", + "packageName": "cli-spinners", + "hash": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" + } + }, + "npm:clipboardy": { + "type": "npm", + "name": "npm:clipboardy", + "data": { + "version": "4.0.0", + "packageName": "clipboardy", + "hash": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==" + } + }, + "npm:cliui": { + "type": "npm", + "name": "npm:cliui", + "data": { + "version": "8.0.1", + "packageName": "cliui", + "hash": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==" + } + }, + "npm:clone": { + "type": "npm", + "name": "npm:clone", + "data": { + "version": "1.0.4", + "packageName": "clone", + "hash": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + } + }, + "npm:clsx": { + "type": "npm", + "name": "npm:clsx", + "data": { + "version": "2.1.1", + "packageName": "clsx", + "hash": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + } + }, + "npm:cluster-key-slot": { + "type": "npm", + "name": "npm:cluster-key-slot", + "data": { + "version": "1.1.2", + "packageName": "cluster-key-slot", + "hash": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + } + }, + "npm:color-convert": { + "type": "npm", + "name": "npm:color-convert", + "data": { + "version": "2.0.1", + "packageName": "color-convert", + "hash": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + } + }, + "npm:color-name": { + "type": "npm", + "name": "npm:color-name", + "data": { + "version": "1.1.4", + "packageName": "color-name", + "hash": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + }, + "npm:combined-stream": { + "type": "npm", + "name": "npm:combined-stream", + "data": { + "version": "1.0.8", + "packageName": "combined-stream", + "hash": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" + } + }, + "npm:comma-separated-tokens": { + "type": "npm", + "name": "npm:comma-separated-tokens", + "data": { + "version": "2.0.3", + "packageName": "comma-separated-tokens", + "hash": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + } + }, + "npm:commander": { + "type": "npm", + "name": "npm:commander", + "data": { + "version": "2.20.3", + "packageName": "commander", + "hash": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + }, + "npm:comment-parser": { + "type": "npm", + "name": "npm:comment-parser", + "data": { + "version": "1.4.1", + "packageName": "comment-parser", + "hash": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==" + } + }, + "npm:commondir": { + "type": "npm", + "name": "npm:commondir", + "data": { + "version": "1.0.1", + "packageName": "commondir", + "hash": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + } + }, + "npm:compare-func": { + "type": "npm", + "name": "npm:compare-func", + "data": { + "version": "2.0.0", + "packageName": "compare-func", + "hash": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==" + } + }, + "npm:compare-versions": { + "type": "npm", + "name": "npm:compare-versions", + "data": { + "version": "6.1.1", + "packageName": "compare-versions", + "hash": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==" + } + }, + "npm:compatx": { + "type": "npm", + "name": "npm:compatx", + "data": { + "version": "0.2.0", + "packageName": "compatx", + "hash": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==" + } + }, + "npm:compress-commons": { + "type": "npm", + "name": "npm:compress-commons", + "data": { + "version": "6.0.2", + "packageName": "compress-commons", + "hash": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==" + } + }, + "npm:computeds": { + "type": "npm", + "name": "npm:computeds", + "data": { + "version": "0.0.1", + "packageName": "computeds", + "hash": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==" + } + }, + "npm:concat-map": { + "type": "npm", + "name": "npm:concat-map", + "data": { + "version": "0.0.1", + "packageName": "concat-map", + "hash": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + } + }, + "npm:confbox@0.1.8": { + "type": "npm", + "name": "npm:confbox@0.1.8", + "data": { + "version": "0.1.8", + "packageName": "confbox", + "hash": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + } + }, + "npm:confbox@0.2.2": { + "type": "npm", + "name": "npm:confbox@0.2.2", + "data": { + "version": "0.2.2", + "packageName": "confbox", + "hash": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==" + } + }, + "npm:consola": { + "type": "npm", + "name": "npm:consola", + "data": { + "version": "3.4.2", + "packageName": "consola", + "hash": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==" + } + }, + "npm:conventional-changelog-angular": { + "type": "npm", + "name": "npm:conventional-changelog-angular", + "data": { + "version": "7.0.0", + "packageName": "conventional-changelog-angular", + "hash": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==" + } + }, + "npm:conventional-commits-parser": { + "type": "npm", + "name": "npm:conventional-commits-parser", + "data": { + "version": "5.0.0", + "packageName": "conventional-commits-parser", + "hash": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==" + } + }, + "npm:convert-source-map": { + "type": "npm", + "name": "npm:convert-source-map", + "data": { + "version": "2.0.0", + "packageName": "convert-source-map", + "hash": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + } + }, + "npm:cookie-es@1.2.2": { + "type": "npm", + "name": "npm:cookie-es@1.2.2", + "data": { + "version": "1.2.2", + "packageName": "cookie-es", + "hash": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" + } + }, + "npm:cookie-es@2.0.0": { + "type": "npm", + "name": "npm:cookie-es@2.0.0", + "data": { + "version": "2.0.0", + "packageName": "cookie-es", + "hash": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==" + } + }, + "npm:cookie": { + "type": "npm", + "name": "npm:cookie", + "data": { + "version": "1.0.2", + "packageName": "cookie", + "hash": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==" + } + }, + "npm:core-util-is": { + "type": "npm", + "name": "npm:core-util-is", + "data": { + "version": "1.0.3", + "packageName": "core-util-is", + "hash": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + } + }, + "npm:crc-32": { + "type": "npm", + "name": "npm:crc-32", + "data": { + "version": "1.2.2", + "packageName": "crc-32", + "hash": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + } + }, + "npm:crc32-stream": { + "type": "npm", + "name": "npm:crc32-stream", + "data": { + "version": "6.0.0", + "packageName": "crc32-stream", + "hash": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==" + } + }, + "npm:croner": { + "type": "npm", + "name": "npm:croner", + "data": { + "version": "9.1.0", + "packageName": "croner", + "hash": "sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==" + } + }, + "npm:cross-spawn": { + "type": "npm", + "name": "npm:cross-spawn", + "data": { + "version": "7.0.6", + "packageName": "cross-spawn", + "hash": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==" + } + }, + "npm:crossws": { + "type": "npm", + "name": "npm:crossws", + "data": { + "version": "0.3.5", + "packageName": "crossws", + "hash": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==" + } + }, + "npm:css-select": { + "type": "npm", + "name": "npm:css-select", + "data": { + "version": "5.2.2", + "packageName": "css-select", + "hash": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==" + } + }, + "npm:css-tree": { + "type": "npm", + "name": "npm:css-tree", + "data": { + "version": "3.1.0", + "packageName": "css-tree", + "hash": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==" + } + }, + "npm:css-what": { + "type": "npm", + "name": "npm:css-what", + "data": { + "version": "6.2.2", + "packageName": "css-what", + "hash": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" + } + }, + "npm:css.escape": { + "type": "npm", + "name": "npm:css.escape", + "data": { + "version": "1.5.1", + "packageName": "css.escape", + "hash": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + } + }, + "npm:cssstyle": { + "type": "npm", + "name": "npm:cssstyle", + "data": { + "version": "5.3.3", + "packageName": "cssstyle", + "hash": "sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==" + } + }, + "npm:csstype@3.1.3": { + "type": "npm", + "name": "npm:csstype@3.1.3", + "data": { + "version": "3.1.3", + "packageName": "csstype", + "hash": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + } + }, + "npm:csstype@3.2.3": { + "type": "npm", + "name": "npm:csstype@3.2.3", + "data": { + "version": "3.2.3", + "packageName": "csstype", + "hash": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" + } + }, + "npm:data-uri-to-buffer": { + "type": "npm", + "name": "npm:data-uri-to-buffer", + "data": { + "version": "4.0.1", + "packageName": "data-uri-to-buffer", + "hash": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + } + }, + "npm:data-urls": { + "type": "npm", + "name": "npm:data-urls", + "data": { + "version": "6.0.0", + "packageName": "data-urls", + "hash": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==" + } + }, + "npm:dataloader": { + "type": "npm", + "name": "npm:dataloader", + "data": { + "version": "1.4.0", + "packageName": "dataloader", + "hash": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" + } + }, + "npm:db0": { + "type": "npm", + "name": "npm:db0", + "data": { + "version": "0.3.4", + "packageName": "db0", + "hash": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==" + } + }, + "npm:de-indent": { + "type": "npm", + "name": "npm:de-indent", + "data": { + "version": "1.0.2", + "packageName": "de-indent", + "hash": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" + } + }, + "npm:debug": { + "type": "npm", + "name": "npm:debug", + "data": { + "version": "4.4.3", + "packageName": "debug", + "hash": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==" + } + }, + "npm:decimal.js": { + "type": "npm", + "name": "npm:decimal.js", + "data": { + "version": "10.6.0", + "packageName": "decimal.js", + "hash": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==" + } + }, + "npm:decode-named-character-reference": { + "type": "npm", + "name": "npm:decode-named-character-reference", + "data": { + "version": "1.2.0", + "packageName": "decode-named-character-reference", + "hash": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==" + } + }, + "npm:deep-is": { + "type": "npm", + "name": "npm:deep-is", + "data": { + "version": "0.1.4", + "packageName": "deep-is", + "hash": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + } + }, + "npm:deepmerge": { + "type": "npm", + "name": "npm:deepmerge", + "data": { + "version": "4.3.1", + "packageName": "deepmerge", + "hash": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + } + }, + "npm:defaults": { + "type": "npm", + "name": "npm:defaults", + "data": { + "version": "1.0.4", + "packageName": "defaults", + "hash": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==" + } + }, + "npm:define-lazy-prop": { + "type": "npm", + "name": "npm:define-lazy-prop", + "data": { + "version": "2.0.0", + "packageName": "define-lazy-prop", + "hash": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + } + }, + "npm:defu": { + "type": "npm", + "name": "npm:defu", + "data": { + "version": "6.1.4", + "packageName": "defu", + "hash": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + } + }, + "npm:delayed-stream": { + "type": "npm", + "name": "npm:delayed-stream", + "data": { + "version": "1.0.0", + "packageName": "delayed-stream", + "hash": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + } + }, + "npm:denque": { + "type": "npm", + "name": "npm:denque", + "data": { + "version": "2.1.0", + "packageName": "denque", + "hash": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + } + }, + "npm:depd": { + "type": "npm", + "name": "npm:depd", + "data": { + "version": "2.0.0", + "packageName": "depd", + "hash": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + }, + "npm:dequal": { + "type": "npm", + "name": "npm:dequal", + "data": { + "version": "2.0.3", + "packageName": "dequal", + "hash": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + } + }, + "npm:destr": { + "type": "npm", + "name": "npm:destr", + "data": { + "version": "2.0.5", + "packageName": "destr", + "hash": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" + } + }, + "npm:detect-indent": { + "type": "npm", + "name": "npm:detect-indent", + "data": { + "version": "6.1.0", + "packageName": "detect-indent", + "hash": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" + } + }, + "npm:detect-libc@1.0.3": { + "type": "npm", + "name": "npm:detect-libc@1.0.3", + "data": { + "version": "1.0.3", + "packageName": "detect-libc", + "hash": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + } + }, + "npm:detect-libc@2.1.2": { + "type": "npm", + "name": "npm:detect-libc@2.1.2", + "data": { + "version": "2.1.2", + "packageName": "detect-libc", + "hash": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" + } + }, + "npm:devalue": { + "type": "npm", + "name": "npm:devalue", + "data": { + "version": "5.5.0", + "packageName": "devalue", + "hash": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==" + } + }, + "npm:devlop": { + "type": "npm", + "name": "npm:devlop", + "data": { + "version": "1.1.0", + "packageName": "devlop", + "hash": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==" + } + }, + "npm:diff": { + "type": "npm", + "name": "npm:diff", + "data": { + "version": "8.0.2", + "packageName": "diff", + "hash": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==" + } + }, + "npm:dir-glob": { + "type": "npm", + "name": "npm:dir-glob", + "data": { + "version": "3.0.1", + "packageName": "dir-glob", + "hash": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" + } + }, + "npm:dom-accessibility-api@0.5.16": { + "type": "npm", + "name": "npm:dom-accessibility-api@0.5.16", + "data": { + "version": "0.5.16", + "packageName": "dom-accessibility-api", + "hash": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + } + }, + "npm:dom-accessibility-api@0.6.3": { + "type": "npm", + "name": "npm:dom-accessibility-api@0.6.3", + "data": { + "version": "0.6.3", + "packageName": "dom-accessibility-api", + "hash": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" + } + }, + "npm:dom-serializer": { + "type": "npm", + "name": "npm:dom-serializer", + "data": { + "version": "2.0.0", + "packageName": "dom-serializer", + "hash": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==" + } + }, + "npm:domelementtype": { + "type": "npm", + "name": "npm:domelementtype", + "data": { + "version": "2.3.0", + "packageName": "domelementtype", + "hash": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + } + }, + "npm:domhandler": { + "type": "npm", + "name": "npm:domhandler", + "data": { + "version": "5.0.3", + "packageName": "domhandler", + "hash": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==" + } + }, + "npm:domutils": { + "type": "npm", + "name": "npm:domutils", + "data": { + "version": "3.2.2", + "packageName": "domutils", + "hash": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==" + } + }, + "npm:dot-prop@10.1.0": { + "type": "npm", + "name": "npm:dot-prop@10.1.0", + "data": { + "version": "10.1.0", + "packageName": "dot-prop", + "hash": "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==" + } + }, + "npm:dot-prop@5.3.0": { + "type": "npm", + "name": "npm:dot-prop@5.3.0", + "data": { + "version": "5.3.0", + "packageName": "dot-prop", + "hash": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" + } + }, + "npm:dotenv-expand": { + "type": "npm", + "name": "npm:dotenv-expand", + "data": { + "version": "11.0.7", + "packageName": "dotenv-expand", + "hash": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==" + } + }, + "npm:dotenv@16.4.7": { + "type": "npm", + "name": "npm:dotenv@16.4.7", + "data": { + "version": "16.4.7", + "packageName": "dotenv", + "hash": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==" + } + }, + "npm:dotenv@16.6.1": { + "type": "npm", + "name": "npm:dotenv@16.6.1", + "data": { + "version": "16.6.1", + "packageName": "dotenv", + "hash": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==" + } + }, + "npm:dotenv@17.2.3": { + "type": "npm", + "name": "npm:dotenv@17.2.3", + "data": { + "version": "17.2.3", + "packageName": "dotenv", + "hash": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==" + } + }, + "npm:dunder-proto": { + "type": "npm", + "name": "npm:dunder-proto", + "data": { + "version": "1.0.1", + "packageName": "dunder-proto", + "hash": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==" + } + }, + "npm:duplexer": { + "type": "npm", + "name": "npm:duplexer", + "data": { + "version": "0.1.2", + "packageName": "duplexer", + "hash": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + } + }, + "npm:eastasianwidth": { + "type": "npm", + "name": "npm:eastasianwidth", + "data": { + "version": "0.2.0", + "packageName": "eastasianwidth", + "hash": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + } + }, + "npm:ecdsa-sig-formatter": { + "type": "npm", + "name": "npm:ecdsa-sig-formatter", + "data": { + "version": "1.0.11", + "packageName": "ecdsa-sig-formatter", + "hash": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==" + } + }, + "npm:ee-first": { + "type": "npm", + "name": "npm:ee-first", + "data": { + "version": "1.1.1", + "packageName": "ee-first", + "hash": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + } + }, + "npm:electron-to-chromium": { + "type": "npm", + "name": "npm:electron-to-chromium", + "data": { + "version": "1.5.244", + "packageName": "electron-to-chromium", + "hash": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==" + } + }, + "npm:emoji-regex@8.0.0": { + "type": "npm", + "name": "npm:emoji-regex@8.0.0", + "data": { + "version": "8.0.0", + "packageName": "emoji-regex", + "hash": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + } + }, + "npm:emoji-regex@9.2.2": { + "type": "npm", + "name": "npm:emoji-regex@9.2.2", + "data": { + "version": "9.2.2", + "packageName": "emoji-regex", + "hash": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + } + }, + "npm:encodeurl": { + "type": "npm", + "name": "npm:encodeurl", + "data": { + "version": "2.0.0", + "packageName": "encodeurl", + "hash": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" + } + }, + "npm:encoding-sniffer": { + "type": "npm", + "name": "npm:encoding-sniffer", + "data": { + "version": "0.2.1", + "packageName": "encoding-sniffer", + "hash": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==" + } + }, + "npm:end-of-stream": { + "type": "npm", + "name": "npm:end-of-stream", + "data": { + "version": "1.4.5", + "packageName": "end-of-stream", + "hash": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==" + } + }, + "npm:enhanced-resolve": { + "type": "npm", + "name": "npm:enhanced-resolve", + "data": { + "version": "5.18.3", + "packageName": "enhanced-resolve", + "hash": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==" + } + }, + "npm:enquirer@2.3.6": { + "type": "npm", + "name": "npm:enquirer@2.3.6", + "data": { + "version": "2.3.6", + "packageName": "enquirer", + "hash": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" + } + }, + "npm:enquirer@2.4.1": { + "type": "npm", + "name": "npm:enquirer@2.4.1", + "data": { + "version": "2.4.1", + "packageName": "enquirer", + "hash": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==" + } + }, + "npm:entities@4.5.0": { + "type": "npm", + "name": "npm:entities@4.5.0", + "data": { + "version": "4.5.0", + "packageName": "entities", + "hash": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } + }, + "npm:entities@6.0.1": { + "type": "npm", + "name": "npm:entities@6.0.1", + "data": { + "version": "6.0.1", + "packageName": "entities", + "hash": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" + } + }, + "npm:error-stack-parser-es": { + "type": "npm", + "name": "npm:error-stack-parser-es", + "data": { + "version": "1.0.5", + "packageName": "error-stack-parser-es", + "hash": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==" + } + }, + "npm:es-define-property": { + "type": "npm", + "name": "npm:es-define-property", + "data": { + "version": "1.0.1", + "packageName": "es-define-property", + "hash": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + } + }, + "npm:es-errors": { + "type": "npm", + "name": "npm:es-errors", + "data": { + "version": "1.3.0", + "packageName": "es-errors", + "hash": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + } + }, + "npm:es-module-lexer": { + "type": "npm", + "name": "npm:es-module-lexer", + "data": { + "version": "1.7.0", + "packageName": "es-module-lexer", + "hash": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" + } + }, + "npm:es-object-atoms": { + "type": "npm", + "name": "npm:es-object-atoms", + "data": { + "version": "1.1.1", + "packageName": "es-object-atoms", + "hash": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==" + } + }, + "npm:es-set-tostringtag": { + "type": "npm", + "name": "npm:es-set-tostringtag", + "data": { + "version": "2.1.0", + "packageName": "es-set-tostringtag", + "hash": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==" + } + }, + "npm:esbuild": { + "type": "npm", + "name": "npm:esbuild", + "data": { + "version": "0.25.12", + "packageName": "esbuild", + "hash": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==" + } + }, + "npm:escalade": { + "type": "npm", + "name": "npm:escalade", + "data": { + "version": "3.2.0", + "packageName": "escalade", + "hash": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" + } + }, + "npm:escape-html": { + "type": "npm", + "name": "npm:escape-html", + "data": { + "version": "1.0.3", + "packageName": "escape-html", + "hash": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + } + }, + "npm:escape-string-regexp@1.0.5": { + "type": "npm", + "name": "npm:escape-string-regexp@1.0.5", + "data": { + "version": "1.0.5", + "packageName": "escape-string-regexp", + "hash": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + }, + "npm:escape-string-regexp@4.0.0": { + "type": "npm", + "name": "npm:escape-string-regexp@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "escape-string-regexp", + "hash": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + } + }, + "npm:escape-string-regexp@5.0.0": { + "type": "npm", + "name": "npm:escape-string-regexp@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "escape-string-regexp", + "hash": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + }, + "npm:eslint-compat-utils": { + "type": "npm", + "name": "npm:eslint-compat-utils", + "data": { + "version": "0.5.1", + "packageName": "eslint-compat-utils", + "hash": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==" + } + }, + "npm:eslint-import-context": { + "type": "npm", + "name": "npm:eslint-import-context", + "data": { + "version": "0.1.9", + "packageName": "eslint-import-context", + "hash": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==" + } + }, + "npm:eslint-plugin-es-x": { + "type": "npm", + "name": "npm:eslint-plugin-es-x", + "data": { + "version": "7.8.0", + "packageName": "eslint-plugin-es-x", + "hash": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==" + } + }, + "npm:eslint-plugin-import-x": { + "type": "npm", + "name": "npm:eslint-plugin-import-x", + "data": { + "version": "4.16.1", + "packageName": "eslint-plugin-import-x", + "hash": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==" + } + }, + "npm:eslint-plugin-n": { + "type": "npm", + "name": "npm:eslint-plugin-n", + "data": { + "version": "17.23.1", + "packageName": "eslint-plugin-n", + "hash": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==" + } + }, + "npm:eslint-plugin-react-compiler": { + "type": "npm", + "name": "npm:eslint-plugin-react-compiler", + "data": { + "version": "19.1.0-rc.2", + "packageName": "eslint-plugin-react-compiler", + "hash": "sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==" + } + }, + "npm:eslint-plugin-react-dom": { + "type": "npm", + "name": "npm:eslint-plugin-react-dom", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-dom", + "hash": "sha512-xflcmWONib2KN54bJ25AvrYSPrp0qDWwWoG+tZJWD7xe0OcvC42zpERKyMuqTMuXfKPJNUOs2ZB1z6e3HNRviw==" + } + }, + "npm:eslint-plugin-react-hooks-extra": { + "type": "npm", + "name": "npm:eslint-plugin-react-hooks-extra", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-hooks-extra", + "hash": "sha512-ImANssr1gfBNMahqCufe2nhb1CZpqMBjKYgwtYF6u0pV11UXnGj181MW+YBEPEB+qIN4NK3hKxSsQngQJPBfQQ==" + } + }, + "npm:eslint-plugin-react-hooks": { + "type": "npm", + "name": "npm:eslint-plugin-react-hooks", + "data": { + "version": "7.0.1", + "packageName": "eslint-plugin-react-hooks", + "hash": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==" + } + }, + "npm:eslint-plugin-react-naming-convention": { + "type": "npm", + "name": "npm:eslint-plugin-react-naming-convention", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-naming-convention", + "hash": "sha512-3cxHcn6oA29awTQr20LCw9XBhms65giuHHclU3KyLtFVoHSX/LUJtXUpv/KezkhRiaavT8PmxGTGMZiGGY9vHw==" + } + }, + "npm:eslint-plugin-react-web-api": { + "type": "npm", + "name": "npm:eslint-plugin-react-web-api", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-web-api", + "hash": "sha512-AlSBt0ITf1nT1I6U4Kyj9GoFEpfLh8sR62sl+6uYSladmhPAKXMOSB7Ban7VX6jZcA7LHp+acKAJCv18fKxaUg==" + } + }, + "npm:eslint-plugin-react-x": { + "type": "npm", + "name": "npm:eslint-plugin-react-x", + "data": { + "version": "2.3.9", + "packageName": "eslint-plugin-react-x", + "hash": "sha512-G0Aqk7oHMVmMNnulpQ2nb/Iq2o9JNkk3WQT70zBVQJYIz6NUrXp/1ujL2+cXb5A8ZapEN53F0pP9ZoQRIzNhsA==" + } + }, + "npm:eslint-plugin-unused-imports": { + "type": "npm", + "name": "npm:eslint-plugin-unused-imports", + "data": { + "version": "4.3.0", + "packageName": "eslint-plugin-unused-imports", + "hash": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==" + } + }, + "npm:eslint-scope": { + "type": "npm", + "name": "npm:eslint-scope", + "data": { + "version": "8.4.0", + "packageName": "eslint-scope", + "hash": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==" + } + }, + "npm:eslint-visitor-keys@3.4.3": { + "type": "npm", + "name": "npm:eslint-visitor-keys@3.4.3", + "data": { + "version": "3.4.3", + "packageName": "eslint-visitor-keys", + "hash": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + } + }, + "npm:eslint-visitor-keys@4.2.1": { + "type": "npm", + "name": "npm:eslint-visitor-keys@4.2.1", + "data": { + "version": "4.2.1", + "packageName": "eslint-visitor-keys", + "hash": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==" + } + }, + "npm:eslint": { + "type": "npm", + "name": "npm:eslint", + "data": { + "version": "9.39.1", + "packageName": "eslint", + "hash": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==" + } + }, + "npm:esm-env": { + "type": "npm", + "name": "npm:esm-env", + "data": { + "version": "1.2.2", + "packageName": "esm-env", + "hash": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" + } + }, + "npm:espree": { + "type": "npm", + "name": "npm:espree", + "data": { + "version": "10.4.0", + "packageName": "espree", + "hash": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==" + } + }, + "npm:esprima": { + "type": "npm", + "name": "npm:esprima", + "data": { + "version": "4.0.1", + "packageName": "esprima", + "hash": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + } + }, + "npm:esquery": { + "type": "npm", + "name": "npm:esquery", + "data": { + "version": "1.6.0", + "packageName": "esquery", + "hash": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==" + } + }, + "npm:esrap": { + "type": "npm", + "name": "npm:esrap", + "data": { + "version": "2.2.0", + "packageName": "esrap", + "hash": "sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg==" + } + }, + "npm:esrecurse": { + "type": "npm", + "name": "npm:esrecurse", + "data": { + "version": "4.3.0", + "packageName": "esrecurse", + "hash": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + } + }, + "npm:estraverse": { + "type": "npm", + "name": "npm:estraverse", + "data": { + "version": "5.3.0", + "packageName": "estraverse", + "hash": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + }, + "npm:estree-util-is-identifier-name": { + "type": "npm", + "name": "npm:estree-util-is-identifier-name", + "data": { + "version": "3.0.0", + "packageName": "estree-util-is-identifier-name", + "hash": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==" + } + }, + "npm:estree-walker@2.0.2": { + "type": "npm", + "name": "npm:estree-walker@2.0.2", + "data": { + "version": "2.0.2", + "packageName": "estree-walker", + "hash": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + } + }, + "npm:estree-walker@3.0.3": { + "type": "npm", + "name": "npm:estree-walker@3.0.3", + "data": { + "version": "3.0.3", + "packageName": "estree-walker", + "hash": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==" + } + }, + "npm:esutils": { + "type": "npm", + "name": "npm:esutils", + "data": { + "version": "2.0.3", + "packageName": "esutils", + "hash": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + } + }, + "npm:etag": { + "type": "npm", + "name": "npm:etag", + "data": { + "version": "1.8.1", + "packageName": "etag", + "hash": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + } + }, + "npm:event-target-shim": { + "type": "npm", + "name": "npm:event-target-shim", + "data": { + "version": "5.0.1", + "packageName": "event-target-shim", + "hash": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + } + }, + "npm:events-universal": { + "type": "npm", + "name": "npm:events-universal", + "data": { + "version": "1.0.1", + "packageName": "events-universal", + "hash": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==" + } + }, + "npm:events": { + "type": "npm", + "name": "npm:events", + "data": { + "version": "3.3.0", + "packageName": "events", + "hash": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + } + }, + "npm:eventsource-parser": { + "type": "npm", + "name": "npm:eventsource-parser", + "data": { + "version": "3.0.6", + "packageName": "eventsource-parser", + "hash": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==" + } + }, + "npm:execa": { + "type": "npm", + "name": "npm:execa", + "data": { + "version": "8.0.1", + "packageName": "execa", + "hash": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==" + } + }, + "npm:expect-type": { + "type": "npm", + "name": "npm:expect-type", + "data": { + "version": "1.2.2", + "packageName": "expect-type", + "hash": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==" + } + }, + "npm:exsolve": { + "type": "npm", + "name": "npm:exsolve", + "data": { + "version": "1.0.7", + "packageName": "exsolve", + "hash": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==" + } + }, + "npm:extend": { + "type": "npm", + "name": "npm:extend", + "data": { + "version": "3.0.2", + "packageName": "extend", + "hash": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + } + }, + "npm:extendable-error": { + "type": "npm", + "name": "npm:extendable-error", + "data": { + "version": "0.1.7", + "packageName": "extendable-error", + "hash": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==" + } + }, + "npm:fast-deep-equal": { + "type": "npm", + "name": "npm:fast-deep-equal", + "data": { + "version": "3.1.3", + "packageName": "fast-deep-equal", + "hash": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + } + }, + "npm:fast-fifo": { + "type": "npm", + "name": "npm:fast-fifo", + "data": { + "version": "1.3.2", + "packageName": "fast-fifo", + "hash": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + } + }, + "npm:fast-glob": { + "type": "npm", + "name": "npm:fast-glob", + "data": { + "version": "3.3.3", + "packageName": "fast-glob", + "hash": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==" + } + }, + "npm:fast-json-stable-stringify": { + "type": "npm", + "name": "npm:fast-json-stable-stringify", + "data": { + "version": "2.1.0", + "packageName": "fast-json-stable-stringify", + "hash": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + } + }, + "npm:fast-levenshtein": { + "type": "npm", + "name": "npm:fast-levenshtein", + "data": { + "version": "2.0.6", + "packageName": "fast-levenshtein", + "hash": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + } + }, + "npm:fastq": { + "type": "npm", + "name": "npm:fastq", + "data": { + "version": "1.19.1", + "packageName": "fastq", + "hash": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==" + } + }, + "npm:fd-package-json": { + "type": "npm", + "name": "npm:fd-package-json", + "data": { + "version": "2.0.0", + "packageName": "fd-package-json", + "hash": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==" + } + }, + "npm:fdir": { + "type": "npm", + "name": "npm:fdir", + "data": { + "version": "6.5.0", + "packageName": "fdir", + "hash": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==" + } + }, + "npm:fetch-blob": { + "type": "npm", + "name": "npm:fetch-blob", + "data": { + "version": "3.2.0", + "packageName": "fetch-blob", + "hash": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==" + } + }, + "npm:fetchdts": { + "type": "npm", + "name": "npm:fetchdts", + "data": { + "version": "0.1.7", + "packageName": "fetchdts", + "hash": "sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==" + } + }, + "npm:figures": { + "type": "npm", + "name": "npm:figures", + "data": { + "version": "3.2.0", + "packageName": "figures", + "hash": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" + } + }, + "npm:file-entry-cache": { + "type": "npm", + "name": "npm:file-entry-cache", + "data": { + "version": "8.0.0", + "packageName": "file-entry-cache", + "hash": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==" + } + }, + "npm:file-uri-to-path": { + "type": "npm", + "name": "npm:file-uri-to-path", + "data": { + "version": "1.0.0", + "packageName": "file-uri-to-path", + "hash": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + } + }, + "npm:fill-range": { + "type": "npm", + "name": "npm:fill-range", + "data": { + "version": "7.1.1", + "packageName": "fill-range", + "hash": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==" + } + }, + "npm:find-up@4.1.0": { + "type": "npm", + "name": "npm:find-up@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "find-up", + "hash": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + } + }, + "npm:find-up@5.0.0": { + "type": "npm", + "name": "npm:find-up@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "find-up", + "hash": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" + } + }, + "npm:flat-cache": { + "type": "npm", + "name": "npm:flat-cache", + "data": { + "version": "4.0.1", + "packageName": "flat-cache", + "hash": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==" + } + }, + "npm:flat": { + "type": "npm", + "name": "npm:flat", + "data": { + "version": "5.0.2", + "packageName": "flat", + "hash": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + } + }, + "npm:flatted": { + "type": "npm", + "name": "npm:flatted", + "data": { + "version": "3.3.3", + "packageName": "flatted", + "hash": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" + } + }, + "npm:follow-redirects": { + "type": "npm", + "name": "npm:follow-redirects", + "data": { + "version": "1.15.11", + "packageName": "follow-redirects", + "hash": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" + } + }, + "npm:foreground-child": { + "type": "npm", + "name": "npm:foreground-child", + "data": { + "version": "3.3.1", + "packageName": "foreground-child", + "hash": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==" + } + }, + "npm:form-data": { + "type": "npm", + "name": "npm:form-data", + "data": { + "version": "4.0.4", + "packageName": "form-data", + "hash": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==" + } + }, + "npm:formatly": { + "type": "npm", + "name": "npm:formatly", + "data": { + "version": "0.3.0", + "packageName": "formatly", + "hash": "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==" + } + }, + "npm:formdata-polyfill": { + "type": "npm", + "name": "npm:formdata-polyfill", + "data": { + "version": "4.0.10", + "packageName": "formdata-polyfill", + "hash": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==" + } + }, + "npm:fresh": { + "type": "npm", + "name": "npm:fresh", + "data": { + "version": "2.0.0", + "packageName": "fresh", + "hash": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" + } + }, + "npm:front-matter": { + "type": "npm", + "name": "npm:front-matter", + "data": { + "version": "4.0.2", + "packageName": "front-matter", + "hash": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==" + } + }, + "npm:fs-constants": { + "type": "npm", + "name": "npm:fs-constants", + "data": { + "version": "1.0.0", + "packageName": "fs-constants", + "hash": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + } + }, + "npm:fs-extra@7.0.1": { + "type": "npm", + "name": "npm:fs-extra@7.0.1", + "data": { + "version": "7.0.1", + "packageName": "fs-extra", + "hash": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==" + } + }, + "npm:fs-extra@8.1.0": { + "type": "npm", + "name": "npm:fs-extra@8.1.0", + "data": { + "version": "8.1.0", + "packageName": "fs-extra", + "hash": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==" + } + }, + "npm:fsevents": { + "type": "npm", + "name": "npm:fsevents", + "data": { + "version": "2.3.3", + "packageName": "fsevents", + "hash": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" + } + }, + "npm:function-bind": { + "type": "npm", + "name": "npm:function-bind", + "data": { + "version": "1.1.2", + "packageName": "function-bind", + "hash": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + } + }, + "npm:gaxios": { + "type": "npm", + "name": "npm:gaxios", + "data": { + "version": "7.1.3", + "packageName": "gaxios", + "hash": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==" + } + }, + "npm:gcp-metadata": { + "type": "npm", + "name": "npm:gcp-metadata", + "data": { + "version": "8.1.2", + "packageName": "gcp-metadata", + "hash": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==" + } + }, + "npm:gensync": { + "type": "npm", + "name": "npm:gensync", + "data": { + "version": "1.0.0-beta.2", + "packageName": "gensync", + "hash": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + } + }, + "npm:get-caller-file": { + "type": "npm", + "name": "npm:get-caller-file", + "data": { + "version": "2.0.5", + "packageName": "get-caller-file", + "hash": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + } + }, + "npm:get-intrinsic": { + "type": "npm", + "name": "npm:get-intrinsic", + "data": { + "version": "1.3.0", + "packageName": "get-intrinsic", + "hash": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==" + } + }, + "npm:get-port-please": { + "type": "npm", + "name": "npm:get-port-please", + "data": { + "version": "3.2.0", + "packageName": "get-port-please", + "hash": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==" + } + }, + "npm:get-proto": { + "type": "npm", + "name": "npm:get-proto", + "data": { + "version": "1.0.1", + "packageName": "get-proto", + "hash": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==" + } + }, + "npm:get-stream": { + "type": "npm", + "name": "npm:get-stream", + "data": { + "version": "8.0.1", + "packageName": "get-stream", + "hash": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" + } + }, + "npm:get-tsconfig": { + "type": "npm", + "name": "npm:get-tsconfig", + "data": { + "version": "4.13.0", + "packageName": "get-tsconfig", + "hash": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==" + } + }, + "npm:giget": { + "type": "npm", + "name": "npm:giget", + "data": { + "version": "2.0.0", + "packageName": "giget", + "hash": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==" + } + }, + "npm:glob-parent@5.1.2": { + "type": "npm", + "name": "npm:glob-parent@5.1.2", + "data": { + "version": "5.1.2", + "packageName": "glob-parent", + "hash": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + } + }, + "npm:glob-parent@6.0.2": { + "type": "npm", + "name": "npm:glob-parent@6.0.2", + "data": { + "version": "6.0.2", + "packageName": "glob-parent", + "hash": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + } + }, + "npm:glob": { + "type": "npm", + "name": "npm:glob", + "data": { + "version": "10.4.5", + "packageName": "glob", + "hash": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==" + } + }, + "npm:globals@14.0.0": { + "type": "npm", + "name": "npm:globals@14.0.0", + "data": { + "version": "14.0.0", + "packageName": "globals", + "hash": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" + } + }, + "npm:globals@15.15.0": { + "type": "npm", + "name": "npm:globals@15.15.0", + "data": { + "version": "15.15.0", + "packageName": "globals", + "hash": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==" + } + }, + "npm:globals@16.5.0": { + "type": "npm", + "name": "npm:globals@16.5.0", + "data": { + "version": "16.5.0", + "packageName": "globals", + "hash": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==" + } + }, + "npm:globby@11.1.0": { + "type": "npm", + "name": "npm:globby@11.1.0", + "data": { + "version": "11.1.0", + "packageName": "globby", + "hash": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" + } + }, + "npm:globby@15.0.0": { + "type": "npm", + "name": "npm:globby@15.0.0", + "data": { + "version": "15.0.0", + "packageName": "globby", + "hash": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==" + } + }, + "npm:globrex": { + "type": "npm", + "name": "npm:globrex", + "data": { + "version": "0.1.2", + "packageName": "globrex", + "hash": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + } + }, + "npm:goober": { + "type": "npm", + "name": "npm:goober", + "data": { + "version": "2.1.18", + "packageName": "goober", + "hash": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==" + } + }, + "npm:google-auth-library": { + "type": "npm", + "name": "npm:google-auth-library", + "data": { + "version": "10.5.0", + "packageName": "google-auth-library", + "hash": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==" + } + }, + "npm:google-logging-utils": { + "type": "npm", + "name": "npm:google-logging-utils", + "data": { + "version": "1.1.3", + "packageName": "google-logging-utils", + "hash": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==" + } + }, + "npm:gopd": { + "type": "npm", + "name": "npm:gopd", + "data": { + "version": "1.2.0", + "packageName": "gopd", + "hash": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + } + }, + "npm:graceful-fs": { + "type": "npm", + "name": "npm:graceful-fs", + "data": { + "version": "4.2.11", + "packageName": "graceful-fs", + "hash": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + } + }, + "npm:graphemer": { + "type": "npm", + "name": "npm:graphemer", + "data": { + "version": "1.4.0", + "packageName": "graphemer", + "hash": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + } + }, + "npm:gtoken": { + "type": "npm", + "name": "npm:gtoken", + "data": { + "version": "8.0.0", + "packageName": "gtoken", + "hash": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==" + } + }, + "npm:gzip-size": { + "type": "npm", + "name": "npm:gzip-size", + "data": { + "version": "7.0.0", + "packageName": "gzip-size", + "hash": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==" + } + }, + "npm:h3@1.15.4": { + "type": "npm", + "name": "npm:h3@1.15.4", + "data": { + "version": "1.15.4", + "packageName": "h3", + "hash": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==" + } + }, + "npm:h3@2.0.0-beta.5": { + "type": "npm", + "name": "npm:h3@2.0.0-beta.5", + "data": { + "version": "2.0.0-beta.5", + "packageName": "h3", + "hash": "sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==" + } + }, + "npm:h3-v2": { + "type": "npm", + "name": "npm:h3-v2", + "data": { + "version": "npm:h3@2.0.0-beta.5", + "packageName": "h3-v2", + "hash": "sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==" + } + }, + "npm:happy-dom": { + "type": "npm", + "name": "npm:happy-dom", + "data": { + "version": "20.0.10", + "packageName": "happy-dom", + "hash": "sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==" + } + }, + "npm:has-flag": { + "type": "npm", + "name": "npm:has-flag", + "data": { + "version": "4.0.0", + "packageName": "has-flag", + "hash": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + } + }, + "npm:has-symbols": { + "type": "npm", + "name": "npm:has-symbols", + "data": { + "version": "1.1.0", + "packageName": "has-symbols", + "hash": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + } + }, + "npm:has-tostringtag": { + "type": "npm", + "name": "npm:has-tostringtag", + "data": { + "version": "1.0.2", + "packageName": "has-tostringtag", + "hash": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==" + } + }, + "npm:hasown": { + "type": "npm", + "name": "npm:hasown", + "data": { + "version": "2.0.2", + "packageName": "hasown", + "hash": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==" + } + }, + "npm:hast-util-from-parse5": { + "type": "npm", + "name": "npm:hast-util-from-parse5", + "data": { + "version": "8.0.3", + "packageName": "hast-util-from-parse5", + "hash": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==" + } + }, + "npm:hast-util-is-element": { + "type": "npm", + "name": "npm:hast-util-is-element", + "data": { + "version": "3.0.0", + "packageName": "hast-util-is-element", + "hash": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==" + } + }, + "npm:hast-util-parse-selector": { + "type": "npm", + "name": "npm:hast-util-parse-selector", + "data": { + "version": "4.0.0", + "packageName": "hast-util-parse-selector", + "hash": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==" + } + }, + "npm:hast-util-raw": { + "type": "npm", + "name": "npm:hast-util-raw", + "data": { + "version": "9.1.0", + "packageName": "hast-util-raw", + "hash": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==" + } + }, + "npm:hast-util-sanitize": { + "type": "npm", + "name": "npm:hast-util-sanitize", + "data": { + "version": "5.0.2", + "packageName": "hast-util-sanitize", + "hash": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==" + } + }, + "npm:hast-util-to-jsx-runtime": { + "type": "npm", + "name": "npm:hast-util-to-jsx-runtime", + "data": { + "version": "2.3.6", + "packageName": "hast-util-to-jsx-runtime", + "hash": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==" + } + }, + "npm:hast-util-to-parse5": { + "type": "npm", + "name": "npm:hast-util-to-parse5", + "data": { + "version": "8.0.0", + "packageName": "hast-util-to-parse5", + "hash": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==" + } + }, + "npm:hast-util-to-text": { + "type": "npm", + "name": "npm:hast-util-to-text", + "data": { + "version": "4.0.2", + "packageName": "hast-util-to-text", + "hash": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==" + } + }, + "npm:hast-util-whitespace": { + "type": "npm", + "name": "npm:hast-util-whitespace", + "data": { + "version": "3.0.0", + "packageName": "hast-util-whitespace", + "hash": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==" + } + }, + "npm:hastscript": { + "type": "npm", + "name": "npm:hastscript", + "data": { + "version": "9.0.1", + "packageName": "hastscript", + "hash": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==" + } + }, + "npm:he": { + "type": "npm", + "name": "npm:he", + "data": { + "version": "1.2.0", + "packageName": "he", + "hash": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + } + }, + "npm:hermes-estree": { + "type": "npm", + "name": "npm:hermes-estree", + "data": { + "version": "0.25.1", + "packageName": "hermes-estree", + "hash": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==" + } + }, + "npm:hermes-parser": { + "type": "npm", + "name": "npm:hermes-parser", + "data": { + "version": "0.25.1", + "packageName": "hermes-parser", + "hash": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==" + } + }, + "npm:highlight.js": { + "type": "npm", + "name": "npm:highlight.js", + "data": { + "version": "11.11.1", + "packageName": "highlight.js", + "hash": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==" + } + }, + "npm:hookable": { + "type": "npm", + "name": "npm:hookable", + "data": { + "version": "5.5.3", + "packageName": "hookable", + "hash": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" + } + }, + "npm:html-encoding-sniffer": { + "type": "npm", + "name": "npm:html-encoding-sniffer", + "data": { + "version": "4.0.0", + "packageName": "html-encoding-sniffer", + "hash": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==" + } + }, + "npm:html-entities": { + "type": "npm", + "name": "npm:html-entities", + "data": { + "version": "2.3.3", + "packageName": "html-entities", + "hash": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + } + }, + "npm:html-link-extractor": { + "type": "npm", + "name": "npm:html-link-extractor", + "data": { + "version": "1.0.5", + "packageName": "html-link-extractor", + "hash": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==" + } + }, + "npm:html-url-attributes": { + "type": "npm", + "name": "npm:html-url-attributes", + "data": { + "version": "3.0.1", + "packageName": "html-url-attributes", + "hash": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==" + } + }, + "npm:html-void-elements": { + "type": "npm", + "name": "npm:html-void-elements", + "data": { + "version": "3.0.0", + "packageName": "html-void-elements", + "hash": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" + } + }, + "npm:htmlparser2": { + "type": "npm", + "name": "npm:htmlparser2", + "data": { + "version": "10.0.0", + "packageName": "htmlparser2", + "hash": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==" + } + }, + "npm:http-errors": { + "type": "npm", + "name": "npm:http-errors", + "data": { + "version": "2.0.0", + "packageName": "http-errors", + "hash": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" + } + }, + "npm:http-proxy-agent": { + "type": "npm", + "name": "npm:http-proxy-agent", + "data": { + "version": "7.0.2", + "packageName": "http-proxy-agent", + "hash": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==" + } + }, + "npm:http-shutdown": { + "type": "npm", + "name": "npm:http-shutdown", + "data": { + "version": "1.2.2", + "packageName": "http-shutdown", + "hash": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==" + } + }, + "npm:https-proxy-agent": { + "type": "npm", + "name": "npm:https-proxy-agent", + "data": { + "version": "7.0.6", + "packageName": "https-proxy-agent", + "hash": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==" + } + }, + "npm:httpxy": { + "type": "npm", + "name": "npm:httpxy", + "data": { + "version": "0.1.7", + "packageName": "httpxy", + "hash": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==" + } + }, + "npm:human-id": { + "type": "npm", + "name": "npm:human-id", + "data": { + "version": "4.1.2", + "packageName": "human-id", + "hash": "sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==" + } + }, + "npm:human-signals": { + "type": "npm", + "name": "npm:human-signals", + "data": { + "version": "5.0.0", + "packageName": "human-signals", + "hash": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" + } + }, + "npm:iconv-lite@0.6.3": { + "type": "npm", + "name": "npm:iconv-lite@0.6.3", + "data": { + "version": "0.6.3", + "packageName": "iconv-lite", + "hash": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" + } + }, + "npm:iconv-lite@0.7.0": { + "type": "npm", + "name": "npm:iconv-lite@0.7.0", + "data": { + "version": "0.7.0", + "packageName": "iconv-lite", + "hash": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==" + } + }, + "npm:ieee754": { + "type": "npm", + "name": "npm:ieee754", + "data": { + "version": "1.2.1", + "packageName": "ieee754", + "hash": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + } + }, + "npm:ignore@5.3.2": { + "type": "npm", + "name": "npm:ignore@5.3.2", + "data": { + "version": "5.3.2", + "packageName": "ignore", + "hash": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" + } + }, + "npm:ignore@7.0.5": { + "type": "npm", + "name": "npm:ignore@7.0.5", + "data": { + "version": "7.0.5", + "packageName": "ignore", + "hash": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==" + } + }, + "npm:import-fresh": { + "type": "npm", + "name": "npm:import-fresh", + "data": { + "version": "3.3.1", + "packageName": "import-fresh", + "hash": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==" + } + }, + "npm:import-lazy": { + "type": "npm", + "name": "npm:import-lazy", + "data": { + "version": "4.0.0", + "packageName": "import-lazy", + "hash": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==" + } + }, + "npm:imurmurhash": { + "type": "npm", + "name": "npm:imurmurhash", + "data": { + "version": "0.1.4", + "packageName": "imurmurhash", + "hash": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + } + }, + "npm:indent-string": { + "type": "npm", + "name": "npm:indent-string", + "data": { + "version": "4.0.0", + "packageName": "indent-string", + "hash": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + } + }, + "npm:inherits": { + "type": "npm", + "name": "npm:inherits", + "data": { + "version": "2.0.4", + "packageName": "inherits", + "hash": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + }, + "npm:inline-style-parser": { + "type": "npm", + "name": "npm:inline-style-parser", + "data": { + "version": "0.2.4", + "packageName": "inline-style-parser", + "hash": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" + } + }, + "npm:ioredis": { + "type": "npm", + "name": "npm:ioredis", + "data": { + "version": "5.8.2", + "packageName": "ioredis", + "hash": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==" + } + }, + "npm:iron-webcrypto": { + "type": "npm", + "name": "npm:iron-webcrypto", + "data": { + "version": "1.2.1", + "packageName": "iron-webcrypto", + "hash": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==" + } + }, + "npm:is-alphabetical": { + "type": "npm", + "name": "npm:is-alphabetical", + "data": { + "version": "2.0.1", + "packageName": "is-alphabetical", + "hash": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" + } + }, + "npm:is-alphanumerical": { + "type": "npm", + "name": "npm:is-alphanumerical", + "data": { + "version": "2.0.1", + "packageName": "is-alphanumerical", + "hash": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==" + } + }, + "npm:is-binary-path": { + "type": "npm", + "name": "npm:is-binary-path", + "data": { + "version": "2.1.0", + "packageName": "is-binary-path", + "hash": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + } + }, + "npm:is-core-module": { + "type": "npm", + "name": "npm:is-core-module", + "data": { + "version": "2.16.1", + "packageName": "is-core-module", + "hash": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==" + } + }, + "npm:is-decimal": { + "type": "npm", + "name": "npm:is-decimal", + "data": { + "version": "2.0.1", + "packageName": "is-decimal", + "hash": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" + } + }, + "npm:is-docker@2.2.1": { + "type": "npm", + "name": "npm:is-docker@2.2.1", + "data": { + "version": "2.2.1", + "packageName": "is-docker", + "hash": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + } + }, + "npm:is-docker@3.0.0": { + "type": "npm", + "name": "npm:is-docker@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "is-docker", + "hash": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" + } + }, + "npm:is-extglob": { + "type": "npm", + "name": "npm:is-extglob", + "data": { + "version": "2.1.1", + "packageName": "is-extglob", + "hash": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + } + }, + "npm:is-fullwidth-code-point": { + "type": "npm", + "name": "npm:is-fullwidth-code-point", + "data": { + "version": "3.0.0", + "packageName": "is-fullwidth-code-point", + "hash": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + } + }, + "npm:is-glob": { + "type": "npm", + "name": "npm:is-glob", + "data": { + "version": "4.0.3", + "packageName": "is-glob", + "hash": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + } + }, + "npm:is-hexadecimal": { + "type": "npm", + "name": "npm:is-hexadecimal", + "data": { + "version": "2.0.1", + "packageName": "is-hexadecimal", + "hash": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" + } + }, + "npm:is-immutable-type": { + "type": "npm", + "name": "npm:is-immutable-type", + "data": { + "version": "5.0.1", + "packageName": "is-immutable-type", + "hash": "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==" + } + }, + "npm:is-inside-container": { + "type": "npm", + "name": "npm:is-inside-container", + "data": { + "version": "1.0.0", + "packageName": "is-inside-container", + "hash": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==" + } + }, + "npm:is-interactive": { + "type": "npm", + "name": "npm:is-interactive", + "data": { + "version": "1.0.0", + "packageName": "is-interactive", + "hash": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + } + }, + "npm:is-module": { + "type": "npm", + "name": "npm:is-module", + "data": { + "version": "1.0.0", + "packageName": "is-module", + "hash": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + } + }, + "npm:is-number": { + "type": "npm", + "name": "npm:is-number", + "data": { + "version": "7.0.0", + "packageName": "is-number", + "hash": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + } + }, + "npm:is-obj": { + "type": "npm", + "name": "npm:is-obj", + "data": { + "version": "2.0.0", + "packageName": "is-obj", + "hash": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + } + }, + "npm:is-plain-obj": { + "type": "npm", + "name": "npm:is-plain-obj", + "data": { + "version": "4.1.0", + "packageName": "is-plain-obj", + "hash": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + } + }, + "npm:is-potential-custom-element-name": { + "type": "npm", + "name": "npm:is-potential-custom-element-name", + "data": { + "version": "1.0.1", + "packageName": "is-potential-custom-element-name", + "hash": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + } + }, + "npm:is-reference@1.2.1": { + "type": "npm", + "name": "npm:is-reference@1.2.1", + "data": { + "version": "1.2.1", + "packageName": "is-reference", + "hash": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==" + } + }, + "npm:is-reference@3.0.3": { + "type": "npm", + "name": "npm:is-reference@3.0.3", + "data": { + "version": "3.0.3", + "packageName": "is-reference", + "hash": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==" + } + }, + "npm:is-stream@2.0.1": { + "type": "npm", + "name": "npm:is-stream@2.0.1", + "data": { + "version": "2.0.1", + "packageName": "is-stream", + "hash": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + } + }, + "npm:is-stream@3.0.0": { + "type": "npm", + "name": "npm:is-stream@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "is-stream", + "hash": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + } + }, + "npm:is-subdir": { + "type": "npm", + "name": "npm:is-subdir", + "data": { + "version": "1.2.0", + "packageName": "is-subdir", + "hash": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==" + } + }, + "npm:is-text-path": { + "type": "npm", + "name": "npm:is-text-path", + "data": { + "version": "2.0.0", + "packageName": "is-text-path", + "hash": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==" + } + }, + "npm:is-unicode-supported": { + "type": "npm", + "name": "npm:is-unicode-supported", + "data": { + "version": "0.1.0", + "packageName": "is-unicode-supported", + "hash": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + } + }, + "npm:is-what": { + "type": "npm", + "name": "npm:is-what", + "data": { + "version": "4.1.16", + "packageName": "is-what", + "hash": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==" + } + }, + "npm:is-windows": { + "type": "npm", + "name": "npm:is-windows", + "data": { + "version": "1.0.2", + "packageName": "is-windows", + "hash": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + } + }, + "npm:is-wsl@2.2.0": { + "type": "npm", + "name": "npm:is-wsl@2.2.0", + "data": { + "version": "2.2.0", + "packageName": "is-wsl", + "hash": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==" + } + }, + "npm:is-wsl@3.1.0": { + "type": "npm", + "name": "npm:is-wsl@3.1.0", + "data": { + "version": "3.1.0", + "packageName": "is-wsl", + "hash": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==" + } + }, + "npm:is64bit": { + "type": "npm", + "name": "npm:is64bit", + "data": { + "version": "2.0.0", + "packageName": "is64bit", + "hash": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==" + } + }, + "npm:isarray": { + "type": "npm", + "name": "npm:isarray", + "data": { + "version": "1.0.0", + "packageName": "isarray", + "hash": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + } + }, + "npm:isbot": { + "type": "npm", + "name": "npm:isbot", + "data": { + "version": "5.1.31", + "packageName": "isbot", + "hash": "sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==" + } + }, + "npm:isexe": { + "type": "npm", + "name": "npm:isexe", + "data": { + "version": "2.0.0", + "packageName": "isexe", + "hash": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + } + }, + "npm:jackspeak": { + "type": "npm", + "name": "npm:jackspeak", + "data": { + "version": "3.4.3", + "packageName": "jackspeak", + "hash": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==" + } + }, + "npm:jest-diff": { + "type": "npm", + "name": "npm:jest-diff", + "data": { + "version": "30.2.0", + "packageName": "jest-diff", + "hash": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==" + } + }, + "npm:jiti": { + "type": "npm", + "name": "npm:jiti", + "data": { + "version": "2.6.1", + "packageName": "jiti", + "hash": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==" + } + }, + "npm:jju": { + "type": "npm", + "name": "npm:jju", + "data": { + "version": "1.4.0", + "packageName": "jju", + "hash": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + } + }, + "npm:js-tokens@4.0.0": { + "type": "npm", + "name": "npm:js-tokens@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "js-tokens", + "hash": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + } + }, + "npm:js-tokens@9.0.1": { + "type": "npm", + "name": "npm:js-tokens@9.0.1", + "data": { + "version": "9.0.1", + "packageName": "js-tokens", + "hash": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" + } + }, + "npm:js-yaml@3.14.1": { + "type": "npm", + "name": "npm:js-yaml@3.14.1", + "data": { + "version": "3.14.1", + "packageName": "js-yaml", + "hash": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" + } + }, + "npm:js-yaml@4.1.1": { + "type": "npm", + "name": "npm:js-yaml@4.1.1", + "data": { + "version": "4.1.1", + "packageName": "js-yaml", + "hash": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==" + } + }, + "npm:jsdom": { + "type": "npm", + "name": "npm:jsdom", + "data": { + "version": "27.2.0", + "packageName": "jsdom", + "hash": "sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==" + } + }, + "npm:jsesc": { + "type": "npm", + "name": "npm:jsesc", + "data": { + "version": "3.1.0", + "packageName": "jsesc", + "hash": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" + } + }, + "npm:json-bigint": { + "type": "npm", + "name": "npm:json-bigint", + "data": { + "version": "1.0.0", + "packageName": "json-bigint", + "hash": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==" + } + }, + "npm:json-buffer": { + "type": "npm", + "name": "npm:json-buffer", + "data": { + "version": "3.0.1", + "packageName": "json-buffer", + "hash": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + } + }, + "npm:json-schema-to-ts": { + "type": "npm", + "name": "npm:json-schema-to-ts", + "data": { + "version": "3.1.1", + "packageName": "json-schema-to-ts", + "hash": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==" + } + }, + "npm:json-schema-traverse@0.4.1": { + "type": "npm", + "name": "npm:json-schema-traverse@0.4.1", + "data": { + "version": "0.4.1", + "packageName": "json-schema-traverse", + "hash": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + } + }, + "npm:json-schema-traverse@1.0.0": { + "type": "npm", + "name": "npm:json-schema-traverse@1.0.0", + "data": { + "version": "1.0.0", + "packageName": "json-schema-traverse", + "hash": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + }, + "npm:json-schema": { + "type": "npm", + "name": "npm:json-schema", + "data": { + "version": "0.4.0", + "packageName": "json-schema", + "hash": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + } + }, + "npm:json-stable-stringify-without-jsonify": { + "type": "npm", + "name": "npm:json-stable-stringify-without-jsonify", + "data": { + "version": "1.0.1", + "packageName": "json-stable-stringify-without-jsonify", + "hash": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + } + }, + "npm:json5": { + "type": "npm", + "name": "npm:json5", + "data": { + "version": "2.2.3", + "packageName": "json5", + "hash": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + } + }, + "npm:jsonc-parser": { + "type": "npm", + "name": "npm:jsonc-parser", + "data": { + "version": "3.2.0", + "packageName": "jsonc-parser", + "hash": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + } + }, + "npm:jsonfile@4.0.0": { + "type": "npm", + "name": "npm:jsonfile@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "jsonfile", + "hash": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" + } + }, + "npm:jsonfile@6.2.0": { + "type": "npm", + "name": "npm:jsonfile@6.2.0", + "data": { + "version": "6.2.0", + "packageName": "jsonfile", + "hash": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==" + } + }, + "npm:jsonparse": { + "type": "npm", + "name": "npm:jsonparse", + "data": { + "version": "1.3.1", + "packageName": "jsonparse", + "hash": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" + } + }, + "npm:jwa": { + "type": "npm", + "name": "npm:jwa", + "data": { + "version": "2.0.1", + "packageName": "jwa", + "hash": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==" + } + }, + "npm:jws": { + "type": "npm", + "name": "npm:jws", + "data": { + "version": "4.0.0", + "packageName": "jws", + "hash": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==" + } + }, + "npm:keyv": { + "type": "npm", + "name": "npm:keyv", + "data": { + "version": "4.5.4", + "packageName": "keyv", + "hash": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==" + } + }, + "npm:kleur": { + "type": "npm", + "name": "npm:kleur", + "data": { + "version": "4.1.5", + "packageName": "kleur", + "hash": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + } + }, + "npm:klona": { + "type": "npm", + "name": "npm:klona", + "data": { + "version": "2.0.6", + "packageName": "klona", + "hash": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + } + }, + "npm:knip": { + "type": "npm", + "name": "npm:knip", + "data": { + "version": "5.70.2", + "packageName": "knip", + "hash": "sha512-LI7DbeVnk7h9+FAet5KzzHNdDwJyqDa2+cn4uQfZYTfpuVjEqtGmYD9r5b9JEuOs4eVkf/7sskNhWXxELm3C/Q==" + } + }, + "npm:knitwork": { + "type": "npm", + "name": "npm:knitwork", + "data": { + "version": "1.2.0", + "packageName": "knitwork", + "hash": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==" + } + }, + "npm:kolorist": { + "type": "npm", + "name": "npm:kolorist", + "data": { + "version": "1.8.0", + "packageName": "kolorist", + "hash": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" + } + }, + "npm:lazystream": { + "type": "npm", + "name": "npm:lazystream", + "data": { + "version": "1.0.1", + "packageName": "lazystream", + "hash": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==" + } + }, + "npm:levn": { + "type": "npm", + "name": "npm:levn", + "data": { + "version": "0.4.1", + "packageName": "levn", + "hash": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + } + }, + "npm:lightningcss-android-arm64": { + "type": "npm", + "name": "npm:lightningcss-android-arm64", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-android-arm64", + "hash": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==" + } + }, + "npm:lightningcss-darwin-arm64": { + "type": "npm", + "name": "npm:lightningcss-darwin-arm64", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-darwin-arm64", + "hash": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==" + } + }, + "npm:lightningcss-darwin-x64": { + "type": "npm", + "name": "npm:lightningcss-darwin-x64", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-darwin-x64", + "hash": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==" + } + }, + "npm:lightningcss-freebsd-x64": { + "type": "npm", + "name": "npm:lightningcss-freebsd-x64", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-freebsd-x64", + "hash": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==" + } + }, + "npm:lightningcss-linux-arm-gnueabihf": { + "type": "npm", + "name": "npm:lightningcss-linux-arm-gnueabihf", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-arm-gnueabihf", + "hash": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==" + } + }, + "npm:lightningcss-linux-arm64-gnu": { + "type": "npm", + "name": "npm:lightningcss-linux-arm64-gnu", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-arm64-gnu", + "hash": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==" + } + }, + "npm:lightningcss-linux-arm64-musl": { + "type": "npm", + "name": "npm:lightningcss-linux-arm64-musl", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-arm64-musl", + "hash": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==" + } + }, + "npm:lightningcss-linux-x64-gnu": { + "type": "npm", + "name": "npm:lightningcss-linux-x64-gnu", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-x64-gnu", + "hash": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==" + } + }, + "npm:lightningcss-linux-x64-musl": { + "type": "npm", + "name": "npm:lightningcss-linux-x64-musl", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-linux-x64-musl", + "hash": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==" + } + }, + "npm:lightningcss-win32-arm64-msvc": { + "type": "npm", + "name": "npm:lightningcss-win32-arm64-msvc", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-win32-arm64-msvc", + "hash": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==" + } + }, + "npm:lightningcss-win32-x64-msvc": { + "type": "npm", + "name": "npm:lightningcss-win32-x64-msvc", + "data": { + "version": "1.30.2", + "packageName": "lightningcss-win32-x64-msvc", + "hash": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==" + } + }, + "npm:lightningcss": { + "type": "npm", + "name": "npm:lightningcss", + "data": { + "version": "1.30.2", + "packageName": "lightningcss", + "hash": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==" + } + }, + "npm:lilconfig": { + "type": "npm", + "name": "npm:lilconfig", + "data": { + "version": "3.1.3", + "packageName": "lilconfig", + "hash": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" + } + }, + "npm:lines-and-columns": { + "type": "npm", + "name": "npm:lines-and-columns", + "data": { + "version": "2.0.3", + "packageName": "lines-and-columns", + "hash": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==" + } + }, + "npm:linkify-it": { + "type": "npm", + "name": "npm:linkify-it", + "data": { + "version": "5.0.0", + "packageName": "linkify-it", + "hash": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==" + } + }, + "npm:listhen": { + "type": "npm", + "name": "npm:listhen", + "data": { + "version": "1.9.0", + "packageName": "listhen", + "hash": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==" + } + }, + "npm:local-pkg@0.5.1": { + "type": "npm", + "name": "npm:local-pkg@0.5.1", + "data": { + "version": "0.5.1", + "packageName": "local-pkg", + "hash": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==" + } + }, + "npm:local-pkg@1.1.2": { + "type": "npm", + "name": "npm:local-pkg@1.1.2", + "data": { + "version": "1.1.2", + "packageName": "local-pkg", + "hash": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==" + } + }, + "npm:locate-character": { + "type": "npm", + "name": "npm:locate-character", + "data": { + "version": "3.0.0", + "packageName": "locate-character", + "hash": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" + } + }, + "npm:locate-path@5.0.0": { + "type": "npm", + "name": "npm:locate-path@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "locate-path", + "hash": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" + } + }, + "npm:locate-path@6.0.0": { + "type": "npm", + "name": "npm:locate-path@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "locate-path", + "hash": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" + } + }, + "npm:lodash.defaults": { + "type": "npm", + "name": "npm:lodash.defaults", + "data": { + "version": "4.2.0", + "packageName": "lodash.defaults", + "hash": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + } + }, + "npm:lodash.isarguments": { + "type": "npm", + "name": "npm:lodash.isarguments", + "data": { + "version": "3.1.0", + "packageName": "lodash.isarguments", + "hash": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + } + }, + "npm:lodash.merge": { + "type": "npm", + "name": "npm:lodash.merge", + "data": { + "version": "4.6.2", + "packageName": "lodash.merge", + "hash": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + } + }, + "npm:lodash.startcase": { + "type": "npm", + "name": "npm:lodash.startcase", + "data": { + "version": "4.4.0", + "packageName": "lodash.startcase", + "hash": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==" + } + }, + "npm:lodash": { + "type": "npm", + "name": "npm:lodash", + "data": { + "version": "4.17.21", + "packageName": "lodash", + "hash": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + }, + "npm:log-symbols": { + "type": "npm", + "name": "npm:log-symbols", + "data": { + "version": "4.1.0", + "packageName": "log-symbols", + "hash": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==" + } + }, + "npm:longest-streak": { + "type": "npm", + "name": "npm:longest-streak", + "data": { + "version": "3.1.0", + "packageName": "longest-streak", + "hash": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" + } + }, + "npm:lowlight": { + "type": "npm", + "name": "npm:lowlight", + "data": { + "version": "3.3.0", + "packageName": "lowlight", + "hash": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==" + } + }, + "npm:lru-cache@10.4.3": { + "type": "npm", + "name": "npm:lru-cache@10.4.3", + "data": { + "version": "10.4.3", + "packageName": "lru-cache", + "hash": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + } + }, + "npm:lru-cache@11.2.2": { + "type": "npm", + "name": "npm:lru-cache@11.2.2", + "data": { + "version": "11.2.2", + "packageName": "lru-cache", + "hash": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==" + } + }, + "npm:lru-cache@5.1.1": { + "type": "npm", + "name": "npm:lru-cache@5.1.1", + "data": { + "version": "5.1.1", + "packageName": "lru-cache", + "hash": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" + } + }, + "npm:lru-cache@6.0.0": { + "type": "npm", + "name": "npm:lru-cache@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "lru-cache", + "hash": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + } + }, + "npm:lucide-react": { + "type": "npm", + "name": "npm:lucide-react", + "data": { + "version": "0.555.0", + "packageName": "lucide-react", + "hash": "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==" + } + }, + "npm:lunr": { + "type": "npm", + "name": "npm:lunr", + "data": { + "version": "2.3.9", + "packageName": "lunr", + "hash": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + } + }, + "npm:lz-string": { + "type": "npm", + "name": "npm:lz-string", + "data": { + "version": "1.5.0", + "packageName": "lz-string", + "hash": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" + } + }, + "npm:magic-string": { + "type": "npm", + "name": "npm:magic-string", + "data": { + "version": "0.30.21", + "packageName": "magic-string", + "hash": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==" + } + }, + "npm:magicast": { + "type": "npm", + "name": "npm:magicast", + "data": { + "version": "0.5.1", + "packageName": "magicast", + "hash": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==" + } + }, + "npm:markdown-it": { + "type": "npm", + "name": "npm:markdown-it", + "data": { + "version": "14.1.0", + "packageName": "markdown-it", + "hash": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==" + } + }, + "npm:markdown-link-extractor": { + "type": "npm", + "name": "npm:markdown-link-extractor", + "data": { + "version": "4.0.3", + "packageName": "markdown-link-extractor", + "hash": "sha512-aEltJiQ4/oC0h6Jbw/uuATGSHZPkcH8DIunNH1A0e+GSFkvZ6BbBkdvBTVfIV8r6HapCU3yTd0eFdi3ZeM1eAQ==" + } + }, + "npm:markdown-table": { + "type": "npm", + "name": "npm:markdown-table", + "data": { + "version": "3.0.4", + "packageName": "markdown-table", + "hash": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" + } + }, + "npm:marked": { + "type": "npm", + "name": "npm:marked", + "data": { + "version": "17.0.1", + "packageName": "marked", + "hash": "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==" + } + }, + "npm:math-intrinsics": { + "type": "npm", + "name": "npm:math-intrinsics", + "data": { + "version": "1.1.0", + "packageName": "math-intrinsics", + "hash": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + } + }, + "npm:mdast-util-find-and-replace": { + "type": "npm", + "name": "npm:mdast-util-find-and-replace", + "data": { + "version": "3.0.2", + "packageName": "mdast-util-find-and-replace", + "hash": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==" + } + }, + "npm:mdast-util-from-markdown": { + "type": "npm", + "name": "npm:mdast-util-from-markdown", + "data": { + "version": "2.0.2", + "packageName": "mdast-util-from-markdown", + "hash": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==" + } + }, + "npm:mdast-util-gfm-autolink-literal": { + "type": "npm", + "name": "npm:mdast-util-gfm-autolink-literal", + "data": { + "version": "2.0.1", + "packageName": "mdast-util-gfm-autolink-literal", + "hash": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==" + } + }, + "npm:mdast-util-gfm-footnote": { + "type": "npm", + "name": "npm:mdast-util-gfm-footnote", + "data": { + "version": "2.1.0", + "packageName": "mdast-util-gfm-footnote", + "hash": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==" + } + }, + "npm:mdast-util-gfm-strikethrough": { + "type": "npm", + "name": "npm:mdast-util-gfm-strikethrough", + "data": { + "version": "2.0.0", + "packageName": "mdast-util-gfm-strikethrough", + "hash": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==" + } + }, + "npm:mdast-util-gfm-table": { + "type": "npm", + "name": "npm:mdast-util-gfm-table", + "data": { + "version": "2.0.0", + "packageName": "mdast-util-gfm-table", + "hash": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==" + } + }, + "npm:mdast-util-gfm-task-list-item": { + "type": "npm", + "name": "npm:mdast-util-gfm-task-list-item", + "data": { + "version": "2.0.0", + "packageName": "mdast-util-gfm-task-list-item", + "hash": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==" + } + }, + "npm:mdast-util-gfm": { + "type": "npm", + "name": "npm:mdast-util-gfm", + "data": { + "version": "3.1.0", + "packageName": "mdast-util-gfm", + "hash": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==" + } + }, + "npm:mdast-util-mdx-expression": { + "type": "npm", + "name": "npm:mdast-util-mdx-expression", + "data": { + "version": "2.0.1", + "packageName": "mdast-util-mdx-expression", + "hash": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==" + } + }, + "npm:mdast-util-mdx-jsx": { + "type": "npm", + "name": "npm:mdast-util-mdx-jsx", + "data": { + "version": "3.2.0", + "packageName": "mdast-util-mdx-jsx", + "hash": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==" + } + }, + "npm:mdast-util-mdxjs-esm": { + "type": "npm", + "name": "npm:mdast-util-mdxjs-esm", + "data": { + "version": "2.0.1", + "packageName": "mdast-util-mdxjs-esm", + "hash": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==" + } + }, + "npm:mdast-util-phrasing": { + "type": "npm", + "name": "npm:mdast-util-phrasing", + "data": { + "version": "4.1.0", + "packageName": "mdast-util-phrasing", + "hash": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==" + } + }, + "npm:mdast-util-to-hast": { + "type": "npm", + "name": "npm:mdast-util-to-hast", + "data": { + "version": "13.2.0", + "packageName": "mdast-util-to-hast", + "hash": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==" + } + }, + "npm:mdast-util-to-markdown": { + "type": "npm", + "name": "npm:mdast-util-to-markdown", + "data": { + "version": "2.1.2", + "packageName": "mdast-util-to-markdown", + "hash": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==" + } + }, + "npm:mdast-util-to-string": { + "type": "npm", + "name": "npm:mdast-util-to-string", + "data": { + "version": "4.0.0", + "packageName": "mdast-util-to-string", + "hash": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==" + } + }, + "npm:mdn-data": { + "type": "npm", + "name": "npm:mdn-data", + "data": { + "version": "2.12.2", + "packageName": "mdn-data", + "hash": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" + } + }, + "npm:mdurl": { + "type": "npm", + "name": "npm:mdurl", + "data": { + "version": "2.0.0", + "packageName": "mdurl", + "hash": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + } + }, + "npm:meow": { + "type": "npm", + "name": "npm:meow", + "data": { + "version": "12.1.1", + "packageName": "meow", + "hash": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==" + } + }, + "npm:merge-anything": { + "type": "npm", + "name": "npm:merge-anything", + "data": { + "version": "5.1.7", + "packageName": "merge-anything", + "hash": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==" + } + }, + "npm:merge-stream": { + "type": "npm", + "name": "npm:merge-stream", + "data": { + "version": "2.0.0", + "packageName": "merge-stream", + "hash": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + } + }, + "npm:merge2": { + "type": "npm", + "name": "npm:merge2", + "data": { + "version": "1.4.1", + "packageName": "merge2", + "hash": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + } + }, + "npm:micromark-core-commonmark": { + "type": "npm", + "name": "npm:micromark-core-commonmark", + "data": { + "version": "2.0.3", + "packageName": "micromark-core-commonmark", + "hash": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==" + } + }, + "npm:micromark-extension-gfm-autolink-literal": { + "type": "npm", + "name": "npm:micromark-extension-gfm-autolink-literal", + "data": { + "version": "2.1.0", + "packageName": "micromark-extension-gfm-autolink-literal", + "hash": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==" + } + }, + "npm:micromark-extension-gfm-footnote": { + "type": "npm", + "name": "npm:micromark-extension-gfm-footnote", + "data": { + "version": "2.1.0", + "packageName": "micromark-extension-gfm-footnote", + "hash": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==" + } + }, + "npm:micromark-extension-gfm-strikethrough": { + "type": "npm", + "name": "npm:micromark-extension-gfm-strikethrough", + "data": { + "version": "2.1.0", + "packageName": "micromark-extension-gfm-strikethrough", + "hash": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==" + } + }, + "npm:micromark-extension-gfm-table": { + "type": "npm", + "name": "npm:micromark-extension-gfm-table", + "data": { + "version": "2.1.1", + "packageName": "micromark-extension-gfm-table", + "hash": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==" + } + }, + "npm:micromark-extension-gfm-tagfilter": { + "type": "npm", + "name": "npm:micromark-extension-gfm-tagfilter", + "data": { + "version": "2.0.0", + "packageName": "micromark-extension-gfm-tagfilter", + "hash": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==" + } + }, + "npm:micromark-extension-gfm-task-list-item": { + "type": "npm", + "name": "npm:micromark-extension-gfm-task-list-item", + "data": { + "version": "2.1.0", + "packageName": "micromark-extension-gfm-task-list-item", + "hash": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==" + } + }, + "npm:micromark-extension-gfm": { + "type": "npm", + "name": "npm:micromark-extension-gfm", + "data": { + "version": "3.0.0", + "packageName": "micromark-extension-gfm", + "hash": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==" + } + }, + "npm:micromark-factory-destination": { + "type": "npm", + "name": "npm:micromark-factory-destination", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-destination", + "hash": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==" + } + }, + "npm:micromark-factory-label": { + "type": "npm", + "name": "npm:micromark-factory-label", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-label", + "hash": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==" + } + }, + "npm:micromark-factory-space": { + "type": "npm", + "name": "npm:micromark-factory-space", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-space", + "hash": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==" + } + }, + "npm:micromark-factory-title": { + "type": "npm", + "name": "npm:micromark-factory-title", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-title", + "hash": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==" + } + }, + "npm:micromark-factory-whitespace": { + "type": "npm", + "name": "npm:micromark-factory-whitespace", + "data": { + "version": "2.0.1", + "packageName": "micromark-factory-whitespace", + "hash": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==" + } + }, + "npm:micromark-util-character": { + "type": "npm", + "name": "npm:micromark-util-character", + "data": { + "version": "2.1.1", + "packageName": "micromark-util-character", + "hash": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==" + } + }, + "npm:micromark-util-chunked": { + "type": "npm", + "name": "npm:micromark-util-chunked", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-chunked", + "hash": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==" + } + }, + "npm:micromark-util-classify-character": { + "type": "npm", + "name": "npm:micromark-util-classify-character", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-classify-character", + "hash": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==" + } + }, + "npm:micromark-util-combine-extensions": { + "type": "npm", + "name": "npm:micromark-util-combine-extensions", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-combine-extensions", + "hash": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==" + } + }, + "npm:micromark-util-decode-numeric-character-reference": { + "type": "npm", + "name": "npm:micromark-util-decode-numeric-character-reference", + "data": { + "version": "2.0.2", + "packageName": "micromark-util-decode-numeric-character-reference", + "hash": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==" + } + }, + "npm:micromark-util-decode-string": { + "type": "npm", + "name": "npm:micromark-util-decode-string", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-decode-string", + "hash": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==" + } + }, + "npm:micromark-util-encode": { + "type": "npm", + "name": "npm:micromark-util-encode", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-encode", + "hash": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==" + } + }, + "npm:micromark-util-html-tag-name": { + "type": "npm", + "name": "npm:micromark-util-html-tag-name", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-html-tag-name", + "hash": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==" + } + }, + "npm:micromark-util-normalize-identifier": { + "type": "npm", + "name": "npm:micromark-util-normalize-identifier", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-normalize-identifier", + "hash": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==" + } + }, + "npm:micromark-util-resolve-all": { + "type": "npm", + "name": "npm:micromark-util-resolve-all", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-resolve-all", + "hash": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==" + } + }, + "npm:micromark-util-sanitize-uri": { + "type": "npm", + "name": "npm:micromark-util-sanitize-uri", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-sanitize-uri", + "hash": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==" + } + }, + "npm:micromark-util-subtokenize": { + "type": "npm", + "name": "npm:micromark-util-subtokenize", + "data": { + "version": "2.1.0", + "packageName": "micromark-util-subtokenize", + "hash": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==" + } + }, + "npm:micromark-util-symbol": { + "type": "npm", + "name": "npm:micromark-util-symbol", + "data": { + "version": "2.0.1", + "packageName": "micromark-util-symbol", + "hash": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" + } + }, + "npm:micromark-util-types": { + "type": "npm", + "name": "npm:micromark-util-types", + "data": { + "version": "2.0.2", + "packageName": "micromark-util-types", + "hash": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" + } + }, + "npm:micromark": { + "type": "npm", + "name": "npm:micromark", + "data": { + "version": "4.0.2", + "packageName": "micromark", + "hash": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==" + } + }, + "npm:micromatch": { + "type": "npm", + "name": "npm:micromatch", + "data": { + "version": "4.0.8", + "packageName": "micromatch", + "hash": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==" + } + }, + "npm:mime-db@1.52.0": { + "type": "npm", + "name": "npm:mime-db@1.52.0", + "data": { + "version": "1.52.0", + "packageName": "mime-db", + "hash": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + } + }, + "npm:mime-db@1.54.0": { + "type": "npm", + "name": "npm:mime-db@1.54.0", + "data": { + "version": "1.54.0", + "packageName": "mime-db", + "hash": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" + } + }, + "npm:mime-types@2.1.35": { + "type": "npm", + "name": "npm:mime-types@2.1.35", + "data": { + "version": "2.1.35", + "packageName": "mime-types", + "hash": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + } + }, + "npm:mime-types@3.0.1": { + "type": "npm", + "name": "npm:mime-types@3.0.1", + "data": { + "version": "3.0.1", + "packageName": "mime-types", + "hash": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==" + } + }, + "npm:mime@3.0.0": { + "type": "npm", + "name": "npm:mime@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "mime", + "hash": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" + } + }, + "npm:mime@4.1.0": { + "type": "npm", + "name": "npm:mime@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "mime", + "hash": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==" + } + }, + "npm:mimic-fn@2.1.0": { + "type": "npm", + "name": "npm:mimic-fn@2.1.0", + "data": { + "version": "2.1.0", + "packageName": "mimic-fn", + "hash": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + }, + "npm:mimic-fn@4.0.0": { + "type": "npm", + "name": "npm:mimic-fn@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "mimic-fn", + "hash": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + } + }, + "npm:min-indent": { + "type": "npm", + "name": "npm:min-indent", + "data": { + "version": "1.0.1", + "packageName": "min-indent", + "hash": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + } + }, + "npm:minimatch@3.0.8": { + "type": "npm", + "name": "npm:minimatch@3.0.8", + "data": { + "version": "3.0.8", + "packageName": "minimatch", + "hash": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==" + } + }, + "npm:minimatch@3.1.2": { + "type": "npm", + "name": "npm:minimatch@3.1.2", + "data": { + "version": "3.1.2", + "packageName": "minimatch", + "hash": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + } + }, + "npm:minimatch@5.1.6": { + "type": "npm", + "name": "npm:minimatch@5.1.6", + "data": { + "version": "5.1.6", + "packageName": "minimatch", + "hash": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==" + } + }, + "npm:minimatch@9.0.3": { + "type": "npm", + "name": "npm:minimatch@9.0.3", + "data": { + "version": "9.0.3", + "packageName": "minimatch", + "hash": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==" + } + }, + "npm:minimatch@9.0.5": { + "type": "npm", + "name": "npm:minimatch@9.0.5", + "data": { + "version": "9.0.5", + "packageName": "minimatch", + "hash": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==" + } + }, + "npm:minimist": { + "type": "npm", + "name": "npm:minimist", + "data": { + "version": "1.2.8", + "packageName": "minimist", + "hash": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + } + }, + "npm:minipass": { + "type": "npm", + "name": "npm:minipass", + "data": { + "version": "7.1.2", + "packageName": "minipass", + "hash": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + } + }, + "npm:minizlib": { + "type": "npm", + "name": "npm:minizlib", + "data": { + "version": "3.1.0", + "packageName": "minizlib", + "hash": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==" + } + }, + "npm:mlly": { + "type": "npm", + "name": "npm:mlly", + "data": { + "version": "1.8.0", + "packageName": "mlly", + "hash": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==" + } + }, + "npm:mri": { + "type": "npm", + "name": "npm:mri", + "data": { + "version": "1.2.0", + "packageName": "mri", + "hash": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + } + }, + "npm:ms": { + "type": "npm", + "name": "npm:ms", + "data": { + "version": "2.1.3", + "packageName": "ms", + "hash": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + }, + "npm:muggle-string": { + "type": "npm", + "name": "npm:muggle-string", + "data": { + "version": "0.4.1", + "packageName": "muggle-string", + "hash": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" + } + }, + "npm:nanoid@3.3.11": { + "type": "npm", + "name": "npm:nanoid@3.3.11", + "data": { + "version": "3.3.11", + "packageName": "nanoid", + "hash": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" + } + }, + "npm:nanoid@5.1.6": { + "type": "npm", + "name": "npm:nanoid@5.1.6", + "data": { + "version": "5.1.6", + "packageName": "nanoid", + "hash": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==" + } + }, + "npm:nanospinner": { + "type": "npm", + "name": "npm:nanospinner", + "data": { + "version": "1.2.2", + "packageName": "nanospinner", + "hash": "sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==" + } + }, + "npm:napi-postinstall": { + "type": "npm", + "name": "npm:napi-postinstall", + "data": { + "version": "0.3.4", + "packageName": "napi-postinstall", + "hash": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==" + } + }, + "npm:natural-compare": { + "type": "npm", + "name": "npm:natural-compare", + "data": { + "version": "1.4.0", + "packageName": "natural-compare", + "hash": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + } + }, + "npm:nitropack": { + "type": "npm", + "name": "npm:nitropack", + "data": { + "version": "2.12.9", + "packageName": "nitropack", + "hash": "sha512-t6qqNBn2UDGMWogQuORjbL2UPevB8PvIPsPHmqvWpeGOlPr4P8Oc5oA8t3wFwGmaolM2M/s2SwT23nx9yARmOg==" + } + }, + "npm:node-addon-api": { + "type": "npm", + "name": "npm:node-addon-api", + "data": { + "version": "7.1.1", + "packageName": "node-addon-api", + "hash": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + } + }, + "npm:node-domexception": { + "type": "npm", + "name": "npm:node-domexception", + "data": { + "version": "1.0.0", + "packageName": "node-domexception", + "hash": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + } + }, + "npm:node-fetch-native": { + "type": "npm", + "name": "npm:node-fetch-native", + "data": { + "version": "1.6.7", + "packageName": "node-fetch-native", + "hash": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==" + } + }, + "npm:node-fetch@2.7.0": { + "type": "npm", + "name": "npm:node-fetch@2.7.0", + "data": { + "version": "2.7.0", + "packageName": "node-fetch", + "hash": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==" + } + }, + "npm:node-fetch@3.3.2": { + "type": "npm", + "name": "npm:node-fetch@3.3.2", + "data": { + "version": "3.3.2", + "packageName": "node-fetch", + "hash": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==" + } + }, + "npm:node-forge": { + "type": "npm", + "name": "npm:node-forge", + "data": { + "version": "1.3.1", + "packageName": "node-forge", + "hash": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + } + }, + "npm:node-gyp-build": { + "type": "npm", + "name": "npm:node-gyp-build", + "data": { + "version": "4.8.4", + "packageName": "node-gyp-build", + "hash": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" + } + }, + "npm:node-machine-id": { + "type": "npm", + "name": "npm:node-machine-id", + "data": { + "version": "1.1.12", + "packageName": "node-machine-id", + "hash": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" + } + }, + "npm:node-mock-http": { + "type": "npm", + "name": "npm:node-mock-http", + "data": { + "version": "1.0.3", + "packageName": "node-mock-http", + "hash": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==" + } + }, + "npm:node-releases": { + "type": "npm", + "name": "npm:node-releases", + "data": { + "version": "2.0.27", + "packageName": "node-releases", + "hash": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" + } + }, + "npm:nopt": { + "type": "npm", + "name": "npm:nopt", + "data": { + "version": "8.1.0", + "packageName": "nopt", + "hash": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==" + } + }, + "npm:normalize-path": { + "type": "npm", + "name": "npm:normalize-path", + "data": { + "version": "3.0.0", + "packageName": "normalize-path", + "hash": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + }, + "npm:npm-run-path@4.0.1": { + "type": "npm", + "name": "npm:npm-run-path@4.0.1", + "data": { + "version": "4.0.1", + "packageName": "npm-run-path", + "hash": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" + } + }, + "npm:npm-run-path@5.3.0": { + "type": "npm", + "name": "npm:npm-run-path@5.3.0", + "data": { + "version": "5.3.0", + "packageName": "npm-run-path", + "hash": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==" + } + }, + "npm:nth-check": { + "type": "npm", + "name": "npm:nth-check", + "data": { + "version": "2.1.1", + "packageName": "nth-check", + "hash": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" + } + }, + "npm:nx": { + "type": "npm", + "name": "npm:nx", + "data": { + "version": "22.1.2", + "packageName": "nx", + "hash": "sha512-sD1CoYFPMsoiRG095qUhEhzL6ZbSY1a68dw9gJNRg60gM06O7l6X2Kyu+dEEwIZ5PutD82Pt4/S2nzK6mdhfew==" + } + }, + "npm:nypm": { + "type": "npm", + "name": "npm:nypm", + "data": { + "version": "0.6.2", + "packageName": "nypm", + "hash": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==" + } + }, + "npm:obug": { + "type": "npm", + "name": "npm:obug", + "data": { + "version": "2.1.1", + "packageName": "obug", + "hash": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==" + } + }, + "npm:ofetch": { + "type": "npm", + "name": "npm:ofetch", + "data": { + "version": "1.5.0", + "packageName": "ofetch", + "hash": "sha512-A7llJ7eZyziA5xq9//3ZurA8OhFqtS99K5/V1sLBJ5j137CM/OAjlbA/TEJXBuOWwOfLqih+oH5U3ran4za1FQ==" + } + }, + "npm:ohash": { + "type": "npm", + "name": "npm:ohash", + "data": { + "version": "2.0.11", + "packageName": "ohash", + "hash": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" + } + }, + "npm:ollama": { + "type": "npm", + "name": "npm:ollama", + "data": { + "version": "0.6.3", + "packageName": "ollama", + "hash": "sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==" + } + }, + "npm:on-finished": { + "type": "npm", + "name": "npm:on-finished", + "data": { + "version": "2.4.1", + "packageName": "on-finished", + "hash": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==" + } + }, + "npm:once": { + "type": "npm", + "name": "npm:once", + "data": { + "version": "1.4.0", + "packageName": "once", + "hash": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + } + }, + "npm:onetime@5.1.2": { + "type": "npm", + "name": "npm:onetime@5.1.2", + "data": { + "version": "5.1.2", + "packageName": "onetime", + "hash": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" + } + }, + "npm:onetime@6.0.0": { + "type": "npm", + "name": "npm:onetime@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "onetime", + "hash": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==" + } + }, + "npm:open": { + "type": "npm", + "name": "npm:open", + "data": { + "version": "8.4.2", + "packageName": "open", + "hash": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==" + } + }, + "npm:openai": { + "type": "npm", + "name": "npm:openai", + "data": { + "version": "6.9.1", + "packageName": "openai", + "hash": "sha512-vQ5Rlt0ZgB3/BNmTa7bIijYFhz3YBceAA3Z4JuoMSBftBF9YqFHIEhZakSs+O/Ad7EaoEimZvHxD5ylRjN11Lg==" + } + }, + "npm:optionator": { + "type": "npm", + "name": "npm:optionator", + "data": { + "version": "0.9.4", + "packageName": "optionator", + "hash": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==" + } + }, + "npm:ora": { + "type": "npm", + "name": "npm:ora", + "data": { + "version": "5.3.0", + "packageName": "ora", + "hash": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==" + } + }, + "npm:outdent": { + "type": "npm", + "name": "npm:outdent", + "data": { + "version": "0.5.0", + "packageName": "outdent", + "hash": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==" + } + }, + "npm:oxc-resolver": { + "type": "npm", + "name": "npm:oxc-resolver", + "data": { + "version": "11.14.0", + "packageName": "oxc-resolver", + "hash": "sha512-i4wNrqhOd+4YdHJfHglHtFiqqSxXuzFA+RUqmmWN1aMD3r1HqUSrIhw17tSO4jwKfhLs9uw1wzFPmvMsWacStg==" + } + }, + "npm:p-filter": { + "type": "npm", + "name": "npm:p-filter", + "data": { + "version": "2.1.0", + "packageName": "p-filter", + "hash": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==" + } + }, + "npm:p-limit@2.3.0": { + "type": "npm", + "name": "npm:p-limit@2.3.0", + "data": { + "version": "2.3.0", + "packageName": "p-limit", + "hash": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + } + }, + "npm:p-limit@3.1.0": { + "type": "npm", + "name": "npm:p-limit@3.1.0", + "data": { + "version": "3.1.0", + "packageName": "p-limit", + "hash": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + } + }, + "npm:p-locate@4.1.0": { + "type": "npm", + "name": "npm:p-locate@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "p-locate", + "hash": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" + } + }, + "npm:p-locate@5.0.0": { + "type": "npm", + "name": "npm:p-locate@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "p-locate", + "hash": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" + } + }, + "npm:p-map": { + "type": "npm", + "name": "npm:p-map", + "data": { + "version": "2.1.0", + "packageName": "p-map", + "hash": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + }, + "npm:p-try": { + "type": "npm", + "name": "npm:p-try", + "data": { + "version": "2.2.0", + "packageName": "p-try", + "hash": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } + }, + "npm:package-json-from-dist": { + "type": "npm", + "name": "npm:package-json-from-dist", + "data": { + "version": "1.0.1", + "packageName": "package-json-from-dist", + "hash": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + } + }, + "npm:package-manager-detector@0.2.11": { + "type": "npm", + "name": "npm:package-manager-detector@0.2.11", + "data": { + "version": "0.2.11", + "packageName": "package-manager-detector", + "hash": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==" + } + }, + "npm:package-manager-detector@1.5.0": { + "type": "npm", + "name": "npm:package-manager-detector@1.5.0", + "data": { + "version": "1.5.0", + "packageName": "package-manager-detector", + "hash": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==" + } + }, + "npm:parent-module": { + "type": "npm", + "name": "npm:parent-module", + "data": { + "version": "1.0.1", + "packageName": "parent-module", + "hash": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + } + }, + "npm:parse-entities": { + "type": "npm", + "name": "npm:parse-entities", + "data": { + "version": "4.0.2", + "packageName": "parse-entities", + "hash": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==" + } + }, + "npm:parse5-htmlparser2-tree-adapter": { + "type": "npm", + "name": "npm:parse5-htmlparser2-tree-adapter", + "data": { + "version": "7.1.0", + "packageName": "parse5-htmlparser2-tree-adapter", + "hash": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==" + } + }, + "npm:parse5-parser-stream": { + "type": "npm", + "name": "npm:parse5-parser-stream", + "data": { + "version": "7.1.2", + "packageName": "parse5-parser-stream", + "hash": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==" + } + }, + "npm:parse5@7.3.0": { + "type": "npm", + "name": "npm:parse5@7.3.0", + "data": { + "version": "7.3.0", + "packageName": "parse5", + "hash": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==" + } + }, + "npm:parse5@8.0.0": { + "type": "npm", + "name": "npm:parse5@8.0.0", + "data": { + "version": "8.0.0", + "packageName": "parse5", + "hash": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==" + } + }, + "npm:parseurl": { + "type": "npm", + "name": "npm:parseurl", + "data": { + "version": "1.3.3", + "packageName": "parseurl", + "hash": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + } + }, + "npm:partial-json": { + "type": "npm", + "name": "npm:partial-json", + "data": { + "version": "0.1.7", + "packageName": "partial-json", + "hash": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==" + } + }, + "npm:path-browserify": { + "type": "npm", + "name": "npm:path-browserify", + "data": { + "version": "1.0.1", + "packageName": "path-browserify", + "hash": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + } + }, + "npm:path-exists": { + "type": "npm", + "name": "npm:path-exists", + "data": { + "version": "4.0.0", + "packageName": "path-exists", + "hash": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } + }, + "npm:path-key@3.1.1": { + "type": "npm", + "name": "npm:path-key@3.1.1", + "data": { + "version": "3.1.1", + "packageName": "path-key", + "hash": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + } + }, + "npm:path-key@4.0.0": { + "type": "npm", + "name": "npm:path-key@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "path-key", + "hash": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + } + }, + "npm:path-parse": { + "type": "npm", + "name": "npm:path-parse", + "data": { + "version": "1.0.7", + "packageName": "path-parse", + "hash": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + } + }, + "npm:path-scurry": { + "type": "npm", + "name": "npm:path-scurry", + "data": { + "version": "1.11.1", + "packageName": "path-scurry", + "hash": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==" + } + }, + "npm:path-type@4.0.0": { + "type": "npm", + "name": "npm:path-type@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "path-type", + "hash": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + } + }, + "npm:path-type@6.0.0": { + "type": "npm", + "name": "npm:path-type@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "path-type", + "hash": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==" + } + }, + "npm:pathe@1.1.2": { + "type": "npm", + "name": "npm:pathe@1.1.2", + "data": { + "version": "1.1.2", + "packageName": "pathe", + "hash": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + } + }, + "npm:pathe@2.0.3": { + "type": "npm", + "name": "npm:pathe@2.0.3", + "data": { + "version": "2.0.3", + "packageName": "pathe", + "hash": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" + } + }, + "npm:perfect-debounce": { + "type": "npm", + "name": "npm:perfect-debounce", + "data": { + "version": "2.0.0", + "packageName": "perfect-debounce", + "hash": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==" + } + }, + "npm:picocolors": { + "type": "npm", + "name": "npm:picocolors", + "data": { + "version": "1.1.1", + "packageName": "picocolors", + "hash": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + } + }, + "npm:picomatch@2.3.1": { + "type": "npm", + "name": "npm:picomatch@2.3.1", + "data": { + "version": "2.3.1", + "packageName": "picomatch", + "hash": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } + }, + "npm:picomatch@4.0.3": { + "type": "npm", + "name": "npm:picomatch@4.0.3", + "data": { + "version": "4.0.3", + "packageName": "picomatch", + "hash": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" + } + }, + "npm:pify": { + "type": "npm", + "name": "npm:pify", + "data": { + "version": "4.0.1", + "packageName": "pify", + "hash": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + }, + "npm:pkg-types@1.3.1": { + "type": "npm", + "name": "npm:pkg-types@1.3.1", + "data": { + "version": "1.3.1", + "packageName": "pkg-types", + "hash": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==" + } + }, + "npm:pkg-types@2.3.0": { + "type": "npm", + "name": "npm:pkg-types@2.3.0", + "data": { + "version": "2.3.0", + "packageName": "pkg-types", + "hash": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==" + } + }, + "npm:postcss": { + "type": "npm", + "name": "npm:postcss", + "data": { + "version": "8.5.6", + "packageName": "postcss", + "hash": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==" + } + }, + "npm:prelude-ls": { + "type": "npm", + "name": "npm:prelude-ls", + "data": { + "version": "1.2.1", + "packageName": "prelude-ls", + "hash": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + } + }, + "npm:premove": { + "type": "npm", + "name": "npm:premove", + "data": { + "version": "4.0.0", + "packageName": "premove", + "hash": "sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==" + } + }, + "npm:prettier-plugin-svelte": { + "type": "npm", + "name": "npm:prettier-plugin-svelte", + "data": { + "version": "3.4.0", + "packageName": "prettier-plugin-svelte", + "hash": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==" + } + }, + "npm:prettier@2.8.8": { + "type": "npm", + "name": "npm:prettier@2.8.8", + "data": { + "version": "2.8.8", + "packageName": "prettier", + "hash": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" + } + }, + "npm:prettier": { + "type": "npm", + "name": "npm:prettier", + "data": { + "version": "3.6.2", + "packageName": "prettier", + "hash": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==" + } + }, + "npm:pretty-bytes": { + "type": "npm", + "name": "npm:pretty-bytes", + "data": { + "version": "7.1.0", + "packageName": "pretty-bytes", + "hash": "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==" + } + }, + "npm:pretty-format@27.5.1": { + "type": "npm", + "name": "npm:pretty-format@27.5.1", + "data": { + "version": "27.5.1", + "packageName": "pretty-format", + "hash": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==" + } + }, + "npm:pretty-format@30.2.0": { + "type": "npm", + "name": "npm:pretty-format@30.2.0", + "data": { + "version": "30.2.0", + "packageName": "pretty-format", + "hash": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==" + } + }, + "npm:process-nextick-args": { + "type": "npm", + "name": "npm:process-nextick-args", + "data": { + "version": "2.0.1", + "packageName": "process-nextick-args", + "hash": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + } + }, + "npm:process": { + "type": "npm", + "name": "npm:process", + "data": { + "version": "0.11.10", + "packageName": "process", + "hash": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + } + }, + "npm:property-information@6.5.0": { + "type": "npm", + "name": "npm:property-information@6.5.0", + "data": { + "version": "6.5.0", + "packageName": "property-information", + "hash": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" + } + }, + "npm:property-information@7.1.0": { + "type": "npm", + "name": "npm:property-information@7.1.0", + "data": { + "version": "7.1.0", + "packageName": "property-information", + "hash": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==" + } + }, + "npm:proxy-from-env": { + "type": "npm", + "name": "npm:proxy-from-env", + "data": { + "version": "1.1.0", + "packageName": "proxy-from-env", + "hash": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + } + }, + "npm:publint": { + "type": "npm", + "name": "npm:publint", + "data": { + "version": "0.3.15", + "packageName": "publint", + "hash": "sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A==" + } + }, + "npm:punycode.js": { + "type": "npm", + "name": "npm:punycode.js", + "data": { + "version": "2.3.1", + "packageName": "punycode.js", + "hash": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" + } + }, + "npm:punycode": { + "type": "npm", + "name": "npm:punycode", + "data": { + "version": "2.3.1", + "packageName": "punycode", + "hash": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + } + }, + "npm:quansync": { + "type": "npm", + "name": "npm:quansync", + "data": { + "version": "0.2.11", + "packageName": "quansync", + "hash": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==" + } + }, + "npm:queue-microtask": { + "type": "npm", + "name": "npm:queue-microtask", + "data": { + "version": "1.2.3", + "packageName": "queue-microtask", + "hash": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + } + }, + "npm:radix3": { + "type": "npm", + "name": "npm:radix3", + "data": { + "version": "1.1.2", + "packageName": "radix3", + "hash": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" + } + }, + "npm:randombytes": { + "type": "npm", + "name": "npm:randombytes", + "data": { + "version": "2.1.0", + "packageName": "randombytes", + "hash": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" + } + }, + "npm:range-parser": { + "type": "npm", + "name": "npm:range-parser", + "data": { + "version": "1.2.1", + "packageName": "range-parser", + "hash": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + } + }, + "npm:rc9": { + "type": "npm", + "name": "npm:rc9", + "data": { + "version": "2.1.2", + "packageName": "rc9", + "hash": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==" + } + }, + "npm:react-dom": { + "type": "npm", + "name": "npm:react-dom", + "data": { + "version": "19.2.0", + "packageName": "react-dom", + "hash": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==" + } + }, + "npm:react-is@17.0.2": { + "type": "npm", + "name": "npm:react-is@17.0.2", + "data": { + "version": "17.0.2", + "packageName": "react-is", + "hash": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + }, + "npm:react-is@18.3.1": { + "type": "npm", + "name": "npm:react-is@18.3.1", + "data": { + "version": "18.3.1", + "packageName": "react-is", + "hash": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + } + }, + "npm:react-markdown": { + "type": "npm", + "name": "npm:react-markdown", + "data": { + "version": "10.1.0", + "packageName": "react-markdown", + "hash": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==" + } + }, + "npm:react-refresh": { + "type": "npm", + "name": "npm:react-refresh", + "data": { + "version": "0.18.0", + "packageName": "react-refresh", + "hash": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==" + } + }, + "npm:react": { + "type": "npm", + "name": "npm:react", + "data": { + "version": "19.2.0", + "packageName": "react", + "hash": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==" + } + }, + "npm:read-yaml-file": { + "type": "npm", + "name": "npm:read-yaml-file", + "data": { + "version": "1.1.0", + "packageName": "read-yaml-file", + "hash": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==" + } + }, + "npm:readable-stream@2.3.8": { + "type": "npm", + "name": "npm:readable-stream@2.3.8", + "data": { + "version": "2.3.8", + "packageName": "readable-stream", + "hash": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" + } + }, + "npm:readable-stream@3.6.2": { + "type": "npm", + "name": "npm:readable-stream@3.6.2", + "data": { + "version": "3.6.2", + "packageName": "readable-stream", + "hash": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" + } + }, + "npm:readable-stream@4.7.0": { + "type": "npm", + "name": "npm:readable-stream@4.7.0", + "data": { + "version": "4.7.0", + "packageName": "readable-stream", + "hash": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==" + } + }, + "npm:readdir-glob": { + "type": "npm", + "name": "npm:readdir-glob", + "data": { + "version": "1.1.3", + "packageName": "readdir-glob", + "hash": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==" + } + }, + "npm:readdirp@3.6.0": { + "type": "npm", + "name": "npm:readdirp@3.6.0", + "data": { + "version": "3.6.0", + "packageName": "readdirp", + "hash": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" + } + }, + "npm:readdirp@4.1.2": { + "type": "npm", + "name": "npm:readdirp@4.1.2", + "data": { + "version": "4.1.2", + "packageName": "readdirp", + "hash": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" + } + }, + "npm:recast": { + "type": "npm", + "name": "npm:recast", + "data": { + "version": "0.23.11", + "packageName": "recast", + "hash": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==" + } + }, + "npm:redent": { + "type": "npm", + "name": "npm:redent", + "data": { + "version": "3.0.0", + "packageName": "redent", + "hash": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==" + } + }, + "npm:redis-errors": { + "type": "npm", + "name": "npm:redis-errors", + "data": { + "version": "1.2.0", + "packageName": "redis-errors", + "hash": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" + } + }, + "npm:redis-parser": { + "type": "npm", + "name": "npm:redis-parser", + "data": { + "version": "3.0.0", + "packageName": "redis-parser", + "hash": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==" + } + }, + "npm:rehype-highlight": { + "type": "npm", + "name": "npm:rehype-highlight", + "data": { + "version": "7.0.2", + "packageName": "rehype-highlight", + "hash": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==" + } + }, + "npm:rehype-raw": { + "type": "npm", + "name": "npm:rehype-raw", + "data": { + "version": "7.0.0", + "packageName": "rehype-raw", + "hash": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==" + } + }, + "npm:rehype-sanitize": { + "type": "npm", + "name": "npm:rehype-sanitize", + "data": { + "version": "6.0.0", + "packageName": "rehype-sanitize", + "hash": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==" + } + }, + "npm:remark-gfm": { + "type": "npm", + "name": "npm:remark-gfm", + "data": { + "version": "4.0.1", + "packageName": "remark-gfm", + "hash": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==" + } + }, + "npm:remark-parse": { + "type": "npm", + "name": "npm:remark-parse", + "data": { + "version": "11.0.0", + "packageName": "remark-parse", + "hash": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==" + } + }, + "npm:remark-rehype": { + "type": "npm", + "name": "npm:remark-rehype", + "data": { + "version": "11.1.2", + "packageName": "remark-rehype", + "hash": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==" + } + }, + "npm:remark-stringify": { + "type": "npm", + "name": "npm:remark-stringify", + "data": { + "version": "11.0.0", + "packageName": "remark-stringify", + "hash": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==" + } + }, + "npm:require-directory": { + "type": "npm", + "name": "npm:require-directory", + "data": { + "version": "2.1.1", + "packageName": "require-directory", + "hash": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + } + }, + "npm:require-from-string": { + "type": "npm", + "name": "npm:require-from-string", + "data": { + "version": "2.0.2", + "packageName": "require-from-string", + "hash": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + } + }, + "npm:resolve-from@4.0.0": { + "type": "npm", + "name": "npm:resolve-from@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "resolve-from", + "hash": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + }, + "npm:resolve-from@5.0.0": { + "type": "npm", + "name": "npm:resolve-from@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "resolve-from", + "hash": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + }, + "npm:resolve-pkg-maps": { + "type": "npm", + "name": "npm:resolve-pkg-maps", + "data": { + "version": "1.0.0", + "packageName": "resolve-pkg-maps", + "hash": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" + } + }, + "npm:resolve.exports": { + "type": "npm", + "name": "npm:resolve.exports", + "data": { + "version": "2.0.3", + "packageName": "resolve.exports", + "hash": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==" + } + }, + "npm:resolve": { + "type": "npm", + "name": "npm:resolve", + "data": { + "version": "1.22.11", + "packageName": "resolve", + "hash": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==" + } + }, + "npm:restore-cursor": { + "type": "npm", + "name": "npm:restore-cursor", + "data": { + "version": "3.1.0", + "packageName": "restore-cursor", + "hash": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==" + } + }, + "npm:reusify": { + "type": "npm", + "name": "npm:reusify", + "data": { + "version": "1.1.0", + "packageName": "reusify", + "hash": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" + } + }, + "npm:rimraf": { + "type": "npm", + "name": "npm:rimraf", + "data": { + "version": "5.0.10", + "packageName": "rimraf", + "hash": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==" + } + }, + "npm:rolldown": { + "type": "npm", + "name": "npm:rolldown", + "data": { + "version": "1.0.0-beta.51", + "packageName": "rolldown", + "hash": "sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==" + } + }, + "npm:rollup-plugin-preserve-directives": { + "type": "npm", + "name": "npm:rollup-plugin-preserve-directives", + "data": { + "version": "0.4.0", + "packageName": "rollup-plugin-preserve-directives", + "hash": "sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==" + } + }, + "npm:rollup-plugin-visualizer": { + "type": "npm", + "name": "npm:rollup-plugin-visualizer", + "data": { + "version": "6.0.5", + "packageName": "rollup-plugin-visualizer", + "hash": "sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==" + } + }, + "npm:rollup": { + "type": "npm", + "name": "npm:rollup", + "data": { + "version": "4.53.3", + "packageName": "rollup", + "hash": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==" + } + }, + "npm:rou3": { + "type": "npm", + "name": "npm:rou3", + "data": { + "version": "0.7.10", + "packageName": "rou3", + "hash": "sha512-aoFj6f7MJZ5muJ+Of79nrhs9N3oLGqi2VEMe94Zbkjb6Wupha46EuoYgpWSOZlXww3bbd8ojgXTAA2mzimX5Ww==" + } + }, + "npm:run-parallel": { + "type": "npm", + "name": "npm:run-parallel", + "data": { + "version": "1.2.0", + "packageName": "run-parallel", + "hash": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + } + }, + "npm:sade": { + "type": "npm", + "name": "npm:sade", + "data": { + "version": "1.8.1", + "packageName": "sade", + "hash": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==" + } + }, + "npm:safe-buffer@5.1.2": { + "type": "npm", + "name": "npm:safe-buffer@5.1.2", + "data": { + "version": "5.1.2", + "packageName": "safe-buffer", + "hash": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + }, + "npm:safe-buffer@5.2.1": { + "type": "npm", + "name": "npm:safe-buffer@5.2.1", + "data": { + "version": "5.2.1", + "packageName": "safe-buffer", + "hash": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + }, + "npm:safer-buffer": { + "type": "npm", + "name": "npm:safer-buffer", + "data": { + "version": "2.1.2", + "packageName": "safer-buffer", + "hash": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + } + }, + "npm:saxes": { + "type": "npm", + "name": "npm:saxes", + "data": { + "version": "6.0.0", + "packageName": "saxes", + "hash": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==" + } + }, + "npm:scheduler": { + "type": "npm", + "name": "npm:scheduler", + "data": { + "version": "0.27.0", + "packageName": "scheduler", + "hash": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" + } + }, + "npm:scule": { + "type": "npm", + "name": "npm:scule", + "data": { + "version": "1.3.0", + "packageName": "scule", + "hash": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" + } + }, + "npm:semver@6.3.1": { + "type": "npm", + "name": "npm:semver@6.3.1", + "data": { + "version": "6.3.1", + "packageName": "semver", + "hash": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + }, + "npm:semver@7.5.4": { + "type": "npm", + "name": "npm:semver@7.5.4", + "data": { + "version": "7.5.4", + "packageName": "semver", + "hash": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" + } + }, + "npm:semver@7.7.3": { + "type": "npm", + "name": "npm:semver@7.7.3", + "data": { + "version": "7.7.3", + "packageName": "semver", + "hash": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" + } + }, + "npm:send": { + "type": "npm", + "name": "npm:send", + "data": { + "version": "1.2.0", + "packageName": "send", + "hash": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==" + } + }, + "npm:serialize-javascript": { + "type": "npm", + "name": "npm:serialize-javascript", + "data": { + "version": "6.0.2", + "packageName": "serialize-javascript", + "hash": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==" + } + }, + "npm:seroval-plugins@1.3.3": { + "type": "npm", + "name": "npm:seroval-plugins@1.3.3", + "data": { + "version": "1.3.3", + "packageName": "seroval-plugins", + "hash": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==" + } + }, + "npm:seroval-plugins@1.4.0": { + "type": "npm", + "name": "npm:seroval-plugins@1.4.0", + "data": { + "version": "1.4.0", + "packageName": "seroval-plugins", + "hash": "sha512-zir1aWzoiax6pbBVjoYVd0O1QQXgIL3eVGBMsBsNmM8Ukq90yGaWlfx0AB9dTS8GPqrOrbXn79vmItCUP9U3BQ==" + } + }, + "npm:seroval@1.3.2": { + "type": "npm", + "name": "npm:seroval@1.3.2", + "data": { + "version": "1.3.2", + "packageName": "seroval", + "hash": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==" + } + }, + "npm:seroval@1.4.0": { + "type": "npm", + "name": "npm:seroval@1.4.0", + "data": { + "version": "1.4.0", + "packageName": "seroval", + "hash": "sha512-BdrNXdzlofomLTiRnwJTSEAaGKyHHZkbMXIywOh7zlzp4uZnXErEwl9XZ+N1hJSNpeTtNxWvVwN0wUzAIQ4Hpg==" + } + }, + "npm:serve-placeholder": { + "type": "npm", + "name": "npm:serve-placeholder", + "data": { + "version": "2.0.2", + "packageName": "serve-placeholder", + "hash": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==" + } + }, + "npm:serve-static": { + "type": "npm", + "name": "npm:serve-static", + "data": { + "version": "2.2.0", + "packageName": "serve-static", + "hash": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==" + } + }, + "npm:setprototypeof": { + "type": "npm", + "name": "npm:setprototypeof", + "data": { + "version": "1.2.0", + "packageName": "setprototypeof", + "hash": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + } + }, + "npm:shebang-command": { + "type": "npm", + "name": "npm:shebang-command", + "data": { + "version": "2.0.0", + "packageName": "shebang-command", + "hash": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + } + }, + "npm:shebang-regex": { + "type": "npm", + "name": "npm:shebang-regex", + "data": { + "version": "3.0.0", + "packageName": "shebang-regex", + "hash": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + } + }, + "npm:sherif-darwin-arm64": { + "type": "npm", + "name": "npm:sherif-darwin-arm64", + "data": { + "version": "1.9.0", + "packageName": "sherif-darwin-arm64", + "hash": "sha512-R+RpKSzlqZgBHean04CqHrdlmBBKu6Dhd/9BcdCpjx/KpqsalZsh9LzBVxTWLTtT9IBb/ccr23PNqFzWQTuh6A==" + } + }, + "npm:sherif-darwin-x64": { + "type": "npm", + "name": "npm:sherif-darwin-x64", + "data": { + "version": "1.9.0", + "packageName": "sherif-darwin-x64", + "hash": "sha512-b/KX9MczzkzmyEjngGxYuBq/rOdM6CbGcDLFdQ0H990Dmn9foj4C/UpLlyqSxXcsJhy586ATMEVN68aM2hFQdQ==" + } + }, + "npm:sherif-linux-arm64-musl": { + "type": "npm", + "name": "npm:sherif-linux-arm64-musl", + "data": { + "version": "1.9.0", + "packageName": "sherif-linux-arm64-musl", + "hash": "sha512-OZ4cKcCXTJTl8zaTxKnP8z0wu05nDeGtttxRQjaXHSKK+fjBwGkH/1qqFEVDcRANUxtLRLLdwmDyxvqQrCzhPQ==" + } + }, + "npm:sherif-linux-arm64": { + "type": "npm", + "name": "npm:sherif-linux-arm64", + "data": { + "version": "1.9.0", + "packageName": "sherif-linux-arm64", + "hash": "sha512-TyuGhaD/efCxGIk4scx09n6NsTr3qfKvH5qHYdyxtelv1mHRgbzVHwJ+Jj98jVktuzOZoexHpxr/hz7RUjd/nw==" + } + }, + "npm:sherif-linux-x64-musl": { + "type": "npm", + "name": "npm:sherif-linux-x64-musl", + "data": { + "version": "1.9.0", + "packageName": "sherif-linux-x64-musl", + "hash": "sha512-JSbA6DN0HkWSabYU858BUkS4cMmkTsAamDZEYuUVDW+XvW9IjaI6o0HNatUr7oCjrITIfcjzqlqy7uizmNlr/A==" + } + }, + "npm:sherif-linux-x64": { + "type": "npm", + "name": "npm:sherif-linux-x64", + "data": { + "version": "1.9.0", + "packageName": "sherif-linux-x64", + "hash": "sha512-iO+hTxndO36r0hgmipBRjntWFqFHKrrYFRODz0WnmDquVek88LInSzAY1xpS18/Thbff8IVc6ssefYNVFQQPWw==" + } + }, + "npm:sherif-windows-arm64": { + "type": "npm", + "name": "npm:sherif-windows-arm64", + "data": { + "version": "1.9.0", + "packageName": "sherif-windows-arm64", + "hash": "sha512-lPqQXDB/95SJodtIbGAJc90O/KyxcunvKTycZqo+6RGjkOSYZB/XnRzm/tJ7If/6kz0/wcDP4uvkJmJxrxcj3A==" + } + }, + "npm:sherif-windows-x64": { + "type": "npm", + "name": "npm:sherif-windows-x64", + "data": { + "version": "1.9.0", + "packageName": "sherif-windows-x64", + "hash": "sha512-3cL+XVGLpmyLC3UOZYiPr4vY2OFBQqPZnCoCwoRKN+ONm8VfGMirO9iqI0OckgFBUtJoG4AQY/MWxoPhNmzD8A==" + } + }, + "npm:sherif": { + "type": "npm", + "name": "npm:sherif", + "data": { + "version": "1.9.0", + "packageName": "sherif", + "hash": "sha512-5n7zqPAjL+RzR7n09NPKpWBXmDCtuRpQzIL+ycj8pe6MayV7cDuFmceoyPQJ0c95oFj6feY7SZvhX/+S0i1ukg==" + } + }, + "npm:siginfo": { + "type": "npm", + "name": "npm:siginfo", + "data": { + "version": "2.0.0", + "packageName": "siginfo", + "hash": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" + } + }, + "npm:signal-exit@3.0.7": { + "type": "npm", + "name": "npm:signal-exit@3.0.7", + "data": { + "version": "3.0.7", + "packageName": "signal-exit", + "hash": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + } + }, + "npm:signal-exit@4.1.0": { + "type": "npm", + "name": "npm:signal-exit@4.1.0", + "data": { + "version": "4.1.0", + "packageName": "signal-exit", + "hash": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + }, + "npm:simple-git": { + "type": "npm", + "name": "npm:simple-git", + "data": { + "version": "3.30.0", + "packageName": "simple-git", + "hash": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==" + } + }, + "npm:size-limit": { + "type": "npm", + "name": "npm:size-limit", + "data": { + "version": "11.2.0", + "packageName": "size-limit", + "hash": "sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==" + } + }, + "npm:slash@3.0.0": { + "type": "npm", + "name": "npm:slash@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "slash", + "hash": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + }, + "npm:slash@5.1.0": { + "type": "npm", + "name": "npm:slash@5.1.0", + "data": { + "version": "5.1.0", + "packageName": "slash", + "hash": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==" + } + }, + "npm:smob": { + "type": "npm", + "name": "npm:smob", + "data": { + "version": "1.5.0", + "packageName": "smob", + "hash": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" + } + }, + "npm:smol-toml": { + "type": "npm", + "name": "npm:smol-toml", + "data": { + "version": "1.5.2", + "packageName": "smol-toml", + "hash": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==" + } + }, + "npm:solid-js": { + "type": "npm", + "name": "npm:solid-js", + "data": { + "version": "1.9.10", + "packageName": "solid-js", + "hash": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==" + } + }, + "npm:solid-refresh": { + "type": "npm", + "name": "npm:solid-refresh", + "data": { + "version": "0.6.3", + "packageName": "solid-refresh", + "hash": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==" + } + }, + "npm:source-map-js": { + "type": "npm", + "name": "npm:source-map-js", + "data": { + "version": "1.2.1", + "packageName": "source-map-js", + "hash": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + } + }, + "npm:source-map-support": { + "type": "npm", + "name": "npm:source-map-support", + "data": { + "version": "0.5.21", + "packageName": "source-map-support", + "hash": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" + } + }, + "npm:source-map@0.6.1": { + "type": "npm", + "name": "npm:source-map@0.6.1", + "data": { + "version": "0.6.1", + "packageName": "source-map", + "hash": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + }, + "npm:source-map@0.7.6": { + "type": "npm", + "name": "npm:source-map@0.7.6", + "data": { + "version": "0.7.6", + "packageName": "source-map", + "hash": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==" + } + }, + "npm:space-separated-tokens": { + "type": "npm", + "name": "npm:space-separated-tokens", + "data": { + "version": "2.0.2", + "packageName": "space-separated-tokens", + "hash": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + } + }, + "npm:spawndamnit": { + "type": "npm", + "name": "npm:spawndamnit", + "data": { + "version": "3.0.1", + "packageName": "spawndamnit", + "hash": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==" + } + }, + "npm:split2": { + "type": "npm", + "name": "npm:split2", + "data": { + "version": "4.2.0", + "packageName": "split2", + "hash": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" + } + }, + "npm:sprintf-js": { + "type": "npm", + "name": "npm:sprintf-js", + "data": { + "version": "1.0.3", + "packageName": "sprintf-js", + "hash": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + } + }, + "npm:srvx": { + "type": "npm", + "name": "npm:srvx", + "data": { + "version": "0.8.16", + "packageName": "srvx", + "hash": "sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==" + } + }, + "npm:stable-hash-x": { + "type": "npm", + "name": "npm:stable-hash-x", + "data": { + "version": "0.2.0", + "packageName": "stable-hash-x", + "hash": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==" + } + }, + "npm:stackback": { + "type": "npm", + "name": "npm:stackback", + "data": { + "version": "0.0.2", + "packageName": "stackback", + "hash": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" + } + }, + "npm:standard-as-callback": { + "type": "npm", + "name": "npm:standard-as-callback", + "data": { + "version": "2.1.0", + "packageName": "standard-as-callback", + "hash": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + } + }, + "npm:statuses@2.0.1": { + "type": "npm", + "name": "npm:statuses@2.0.1", + "data": { + "version": "2.0.1", + "packageName": "statuses", + "hash": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + }, + "npm:statuses@2.0.2": { + "type": "npm", + "name": "npm:statuses@2.0.2", + "data": { + "version": "2.0.2", + "packageName": "statuses", + "hash": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" + } + }, + "npm:std-env": { + "type": "npm", + "name": "npm:std-env", + "data": { + "version": "3.10.0", + "packageName": "std-env", + "hash": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==" + } + }, + "npm:streamx": { + "type": "npm", + "name": "npm:streamx", + "data": { + "version": "2.23.0", + "packageName": "streamx", + "hash": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==" + } + }, + "npm:string-argv": { + "type": "npm", + "name": "npm:string-argv", + "data": { + "version": "0.3.2", + "packageName": "string-argv", + "hash": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" + } + }, + "npm:string-ts": { + "type": "npm", + "name": "npm:string-ts", + "data": { + "version": "2.2.1", + "packageName": "string-ts", + "hash": "sha512-Q2u0gko67PLLhbte5HmPfdOjNvUKbKQM+mCNQae6jE91DmoFHY6HH9GcdqCeNx87DZ2KKjiFxmA0R/42OneGWw==" + } + }, + "npm:string-width@4.2.3": { + "type": "npm", + "name": "npm:string-width@4.2.3", + "data": { + "version": "4.2.3", + "packageName": "string-width", + "hash": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + } + }, + "npm:string-width@5.1.2": { + "type": "npm", + "name": "npm:string-width@5.1.2", + "data": { + "version": "5.1.2", + "packageName": "string-width", + "hash": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==" + } + }, + "npm:string-width-cjs": { + "type": "npm", + "name": "npm:string-width-cjs", + "data": { + "version": "npm:string-width@4.2.3", + "packageName": "string-width-cjs", + "hash": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + } + }, + "npm:string_decoder@1.1.1": { + "type": "npm", + "name": "npm:string_decoder@1.1.1", + "data": { + "version": "1.1.1", + "packageName": "string_decoder", + "hash": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + } + }, + "npm:string_decoder@1.3.0": { + "type": "npm", + "name": "npm:string_decoder@1.3.0", + "data": { + "version": "1.3.0", + "packageName": "string_decoder", + "hash": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + } + }, + "npm:stringify-entities": { + "type": "npm", + "name": "npm:stringify-entities", + "data": { + "version": "4.0.4", + "packageName": "stringify-entities", + "hash": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==" + } + }, + "npm:strip-ansi@6.0.1": { + "type": "npm", + "name": "npm:strip-ansi@6.0.1", + "data": { + "version": "6.0.1", + "packageName": "strip-ansi", + "hash": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + } + }, + "npm:strip-ansi@7.1.2": { + "type": "npm", + "name": "npm:strip-ansi@7.1.2", + "data": { + "version": "7.1.2", + "packageName": "strip-ansi", + "hash": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==" + } + }, + "npm:strip-ansi-cjs": { + "type": "npm", + "name": "npm:strip-ansi-cjs", + "data": { + "version": "npm:strip-ansi@6.0.1", + "packageName": "strip-ansi-cjs", + "hash": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + } + }, + "npm:strip-bom": { + "type": "npm", + "name": "npm:strip-bom", + "data": { + "version": "3.0.0", + "packageName": "strip-bom", + "hash": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + } + }, + "npm:strip-final-newline": { + "type": "npm", + "name": "npm:strip-final-newline", + "data": { + "version": "3.0.0", + "packageName": "strip-final-newline", + "hash": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + } + }, + "npm:strip-indent": { + "type": "npm", + "name": "npm:strip-indent", + "data": { + "version": "3.0.0", + "packageName": "strip-indent", + "hash": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==" + } + }, + "npm:strip-json-comments@3.1.1": { + "type": "npm", + "name": "npm:strip-json-comments@3.1.1", + "data": { + "version": "3.1.1", + "packageName": "strip-json-comments", + "hash": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + } + }, + "npm:strip-json-comments@5.0.3": { + "type": "npm", + "name": "npm:strip-json-comments@5.0.3", + "data": { + "version": "5.0.3", + "packageName": "strip-json-comments", + "hash": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==" + } + }, + "npm:strip-literal": { + "type": "npm", + "name": "npm:strip-literal", + "data": { + "version": "3.1.0", + "packageName": "strip-literal", + "hash": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==" + } + }, + "npm:style-to-js": { + "type": "npm", + "name": "npm:style-to-js", + "data": { + "version": "1.1.18", + "packageName": "style-to-js", + "hash": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==" + } + }, + "npm:style-to-object": { + "type": "npm", + "name": "npm:style-to-object", + "data": { + "version": "1.0.11", + "packageName": "style-to-object", + "hash": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==" + } + }, + "npm:supports-color@10.2.2": { + "type": "npm", + "name": "npm:supports-color@10.2.2", + "data": { + "version": "10.2.2", + "packageName": "supports-color", + "hash": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==" + } + }, + "npm:supports-color@7.2.0": { + "type": "npm", + "name": "npm:supports-color@7.2.0", + "data": { + "version": "7.2.0", + "packageName": "supports-color", + "hash": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + } + }, + "npm:supports-color@8.1.1": { + "type": "npm", + "name": "npm:supports-color@8.1.1", + "data": { + "version": "8.1.1", + "packageName": "supports-color", + "hash": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" + } + }, + "npm:supports-preserve-symlinks-flag": { + "type": "npm", + "name": "npm:supports-preserve-symlinks-flag", + "data": { + "version": "1.0.0", + "packageName": "supports-preserve-symlinks-flag", + "hash": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + } + }, + "npm:svelte": { + "type": "npm", + "name": "npm:svelte", + "data": { + "version": "5.44.1", + "packageName": "svelte", + "hash": "sha512-8VnkRXpa6tJ9IqiwKvzZBNnBy9tZg0N63duDz0EJqiozsmBEAZfHiZzWWWAneIN+cAWkK1JkafW1xIbC4YrdBA==" + } + }, + "npm:symbol-tree": { + "type": "npm", + "name": "npm:symbol-tree", + "data": { + "version": "3.2.4", + "packageName": "symbol-tree", + "hash": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + } + }, + "npm:system-architecture": { + "type": "npm", + "name": "npm:system-architecture", + "data": { + "version": "0.1.0", + "packageName": "system-architecture", + "hash": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==" + } + }, + "npm:tagged-tag": { + "type": "npm", + "name": "npm:tagged-tag", + "data": { + "version": "1.0.0", + "packageName": "tagged-tag", + "hash": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==" + } + }, + "npm:tailwindcss": { + "type": "npm", + "name": "npm:tailwindcss", + "data": { + "version": "4.1.17", + "packageName": "tailwindcss", + "hash": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==" + } + }, + "npm:tapable": { + "type": "npm", + "name": "npm:tapable", + "data": { + "version": "2.3.0", + "packageName": "tapable", + "hash": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==" + } + }, + "npm:tar-stream@2.2.0": { + "type": "npm", + "name": "npm:tar-stream@2.2.0", + "data": { + "version": "2.2.0", + "packageName": "tar-stream", + "hash": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==" + } + }, + "npm:tar-stream@3.1.7": { + "type": "npm", + "name": "npm:tar-stream@3.1.7", + "data": { + "version": "3.1.7", + "packageName": "tar-stream", + "hash": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==" + } + }, + "npm:tar": { + "type": "npm", + "name": "npm:tar", + "data": { + "version": "7.5.2", + "packageName": "tar", + "hash": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==" + } + }, + "npm:term-size": { + "type": "npm", + "name": "npm:term-size", + "data": { + "version": "2.2.1", + "packageName": "term-size", + "hash": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" + } + }, + "npm:terser": { + "type": "npm", + "name": "npm:terser", + "data": { + "version": "5.44.0", + "packageName": "terser", + "hash": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==" + } + }, + "npm:text-decoder": { + "type": "npm", + "name": "npm:text-decoder", + "data": { + "version": "1.2.3", + "packageName": "text-decoder", + "hash": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==" + } + }, + "npm:text-extensions": { + "type": "npm", + "name": "npm:text-extensions", + "data": { + "version": "2.4.0", + "packageName": "text-extensions", + "hash": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==" + } + }, + "npm:through": { + "type": "npm", + "name": "npm:through", + "data": { + "version": "2.3.8", + "packageName": "through", + "hash": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + } + }, + "npm:tiny-invariant": { + "type": "npm", + "name": "npm:tiny-invariant", + "data": { + "version": "1.3.3", + "packageName": "tiny-invariant", + "hash": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + } + }, + "npm:tiny-warning": { + "type": "npm", + "name": "npm:tiny-warning", + "data": { + "version": "1.0.3", + "packageName": "tiny-warning", + "hash": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + } + }, + "npm:tinybench": { + "type": "npm", + "name": "npm:tinybench", + "data": { + "version": "2.9.0", + "packageName": "tinybench", + "hash": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" + } + }, + "npm:tinyexec@0.3.2": { + "type": "npm", + "name": "npm:tinyexec@0.3.2", + "data": { + "version": "0.3.2", + "packageName": "tinyexec", + "hash": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" + } + }, + "npm:tinyexec@1.0.1": { + "type": "npm", + "name": "npm:tinyexec@1.0.1", + "data": { + "version": "1.0.1", + "packageName": "tinyexec", + "hash": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==" + } + }, + "npm:tinyglobby": { + "type": "npm", + "name": "npm:tinyglobby", + "data": { + "version": "0.2.15", + "packageName": "tinyglobby", + "hash": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==" + } + }, + "npm:tinyrainbow": { + "type": "npm", + "name": "npm:tinyrainbow", + "data": { + "version": "3.0.3", + "packageName": "tinyrainbow", + "hash": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==" + } + }, + "npm:tldts-core": { + "type": "npm", + "name": "npm:tldts-core", + "data": { + "version": "7.0.16", + "packageName": "tldts-core", + "hash": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==" + } + }, + "npm:tldts": { + "type": "npm", + "name": "npm:tldts", + "data": { + "version": "7.0.16", + "packageName": "tldts", + "hash": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==" + } + }, + "npm:tmp": { + "type": "npm", + "name": "npm:tmp", + "data": { + "version": "0.2.5", + "packageName": "tmp", + "hash": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==" + } + }, + "npm:to-regex-range": { + "type": "npm", + "name": "npm:to-regex-range", + "data": { + "version": "5.0.1", + "packageName": "to-regex-range", + "hash": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + } + }, + "npm:toidentifier": { + "type": "npm", + "name": "npm:toidentifier", + "data": { + "version": "1.0.1", + "packageName": "toidentifier", + "hash": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + } + }, + "npm:tough-cookie": { + "type": "npm", + "name": "npm:tough-cookie", + "data": { + "version": "6.0.0", + "packageName": "tough-cookie", + "hash": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==" + } + }, + "npm:tr46@0.0.3": { + "type": "npm", + "name": "npm:tr46@0.0.3", + "data": { + "version": "0.0.3", + "packageName": "tr46", + "hash": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + } + }, + "npm:tr46@6.0.0": { + "type": "npm", + "name": "npm:tr46@6.0.0", + "data": { + "version": "6.0.0", + "packageName": "tr46", + "hash": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==" + } + }, + "npm:tree-kill": { + "type": "npm", + "name": "npm:tree-kill", + "data": { + "version": "1.2.2", + "packageName": "tree-kill", + "hash": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + } + }, + "npm:trim-lines": { + "type": "npm", + "name": "npm:trim-lines", + "data": { + "version": "3.0.1", + "packageName": "trim-lines", + "hash": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + } + }, + "npm:trough": { + "type": "npm", + "name": "npm:trough", + "data": { + "version": "2.2.0", + "packageName": "trough", + "hash": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" + } + }, + "npm:ts-algebra": { + "type": "npm", + "name": "npm:ts-algebra", + "data": { + "version": "2.0.0", + "packageName": "ts-algebra", + "hash": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==" + } + }, + "npm:ts-api-utils": { + "type": "npm", + "name": "npm:ts-api-utils", + "data": { + "version": "2.1.0", + "packageName": "ts-api-utils", + "hash": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==" + } + }, + "npm:ts-declaration-location": { + "type": "npm", + "name": "npm:ts-declaration-location", + "data": { + "version": "1.0.7", + "packageName": "ts-declaration-location", + "hash": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==" + } + }, + "npm:ts-pattern": { + "type": "npm", + "name": "npm:ts-pattern", + "data": { + "version": "5.9.0", + "packageName": "ts-pattern", + "hash": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==" + } + }, + "npm:tsconfck": { + "type": "npm", + "name": "npm:tsconfck", + "data": { + "version": "3.1.6", + "packageName": "tsconfck", + "hash": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==" + } + }, + "npm:tsconfig-paths": { + "type": "npm", + "name": "npm:tsconfig-paths", + "data": { + "version": "4.2.0", + "packageName": "tsconfig-paths", + "hash": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==" + } + }, + "npm:tslib": { + "type": "npm", + "name": "npm:tslib", + "data": { + "version": "2.8.1", + "packageName": "tslib", + "hash": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + } + }, + "npm:tsx": { + "type": "npm", + "name": "npm:tsx", + "data": { + "version": "4.20.6", + "packageName": "tsx", + "hash": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==" + } + }, + "npm:type-check": { + "type": "npm", + "name": "npm:type-check", + "data": { + "version": "0.4.0", + "packageName": "type-check", + "hash": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + } + }, + "npm:type-fest": { + "type": "npm", + "name": "npm:type-fest", + "data": { + "version": "5.1.0", + "packageName": "type-fest", + "hash": "sha512-wQ531tuWvB6oK+pchHIu5lHe5f5wpSCqB8Kf4dWQRbOYc9HTge7JL0G4Qd44bh6QuJCccIzL3bugb8GI0MwHrg==" + } + }, + "npm:typedoc-plugin-frontmatter": { + "type": "npm", + "name": "npm:typedoc-plugin-frontmatter", + "data": { + "version": "1.3.0", + "packageName": "typedoc-plugin-frontmatter", + "hash": "sha512-xYQFMAecMlsRUjmf9oM/Sq2FVz4zlgcbIeVFNLdO118CHTN06gIKJNSlyExh9+Xl8sK0YhIvoQwViUURxritWA==" + } + }, + "npm:typedoc-plugin-markdown": { + "type": "npm", + "name": "npm:typedoc-plugin-markdown", + "data": { + "version": "4.9.0", + "packageName": "typedoc-plugin-markdown", + "hash": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==" + } + }, + "npm:typedoc": { + "type": "npm", + "name": "npm:typedoc", + "data": { + "version": "0.28.14", + "packageName": "typedoc", + "hash": "sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==" + } + }, + "npm:typescript-eslint": { + "type": "npm", + "name": "npm:typescript-eslint", + "data": { + "version": "8.46.3", + "packageName": "typescript-eslint", + "hash": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==" + } + }, + "npm:typescript@5.4.2": { + "type": "npm", + "name": "npm:typescript@5.4.2", + "data": { + "version": "5.4.2", + "packageName": "typescript", + "hash": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==" + } + }, + "npm:typescript": { + "type": "npm", + "name": "npm:typescript", + "data": { + "version": "5.9.3", + "packageName": "typescript", + "hash": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==" + } + }, + "npm:uc.micro": { + "type": "npm", + "name": "npm:uc.micro", + "data": { + "version": "2.1.0", + "packageName": "uc.micro", + "hash": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + } + }, + "npm:ufo": { + "type": "npm", + "name": "npm:ufo", + "data": { + "version": "1.6.1", + "packageName": "ufo", + "hash": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==" + } + }, + "npm:ultrahtml": { + "type": "npm", + "name": "npm:ultrahtml", + "data": { + "version": "1.6.0", + "packageName": "ultrahtml", + "hash": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==" + } + }, + "npm:uncrypto": { + "type": "npm", + "name": "npm:uncrypto", + "data": { + "version": "0.1.3", + "packageName": "uncrypto", + "hash": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + } + }, + "npm:unctx": { + "type": "npm", + "name": "npm:unctx", + "data": { + "version": "2.4.1", + "packageName": "unctx", + "hash": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==" + } + }, + "npm:undici-types@6.21.0": { + "type": "npm", + "name": "npm:undici-types@6.21.0", + "data": { + "version": "6.21.0", + "packageName": "undici-types", + "hash": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + } + }, + "npm:undici-types@7.16.0": { + "type": "npm", + "name": "npm:undici-types@7.16.0", + "data": { + "version": "7.16.0", + "packageName": "undici-types", + "hash": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" + } + }, + "npm:undici": { + "type": "npm", + "name": "npm:undici", + "data": { + "version": "7.16.0", + "packageName": "undici", + "hash": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==" + } + }, + "npm:unenv": { + "type": "npm", + "name": "npm:unenv", + "data": { + "version": "2.0.0-rc.24", + "packageName": "unenv", + "hash": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==" + } + }, + "npm:unicorn-magic": { + "type": "npm", + "name": "npm:unicorn-magic", + "data": { + "version": "0.3.0", + "packageName": "unicorn-magic", + "hash": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==" + } + }, + "npm:unified": { + "type": "npm", + "name": "npm:unified", + "data": { + "version": "11.0.5", + "packageName": "unified", + "hash": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==" + } + }, + "npm:unimport": { + "type": "npm", + "name": "npm:unimport", + "data": { + "version": "5.5.0", + "packageName": "unimport", + "hash": "sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==" + } + }, + "npm:unist-util-find-after": { + "type": "npm", + "name": "npm:unist-util-find-after", + "data": { + "version": "5.0.0", + "packageName": "unist-util-find-after", + "hash": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==" + } + }, + "npm:unist-util-is": { + "type": "npm", + "name": "npm:unist-util-is", + "data": { + "version": "6.0.1", + "packageName": "unist-util-is", + "hash": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==" + } + }, + "npm:unist-util-position": { + "type": "npm", + "name": "npm:unist-util-position", + "data": { + "version": "5.0.0", + "packageName": "unist-util-position", + "hash": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==" + } + }, + "npm:unist-util-stringify-position": { + "type": "npm", + "name": "npm:unist-util-stringify-position", + "data": { + "version": "4.0.0", + "packageName": "unist-util-stringify-position", + "hash": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==" + } + }, + "npm:unist-util-visit-parents": { + "type": "npm", + "name": "npm:unist-util-visit-parents", + "data": { + "version": "6.0.2", + "packageName": "unist-util-visit-parents", + "hash": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==" + } + }, + "npm:unist-util-visit": { + "type": "npm", + "name": "npm:unist-util-visit", + "data": { + "version": "5.0.0", + "packageName": "unist-util-visit", + "hash": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==" + } + }, + "npm:universalify@0.1.2": { + "type": "npm", + "name": "npm:universalify@0.1.2", + "data": { + "version": "0.1.2", + "packageName": "universalify", + "hash": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } + }, + "npm:universalify@2.0.1": { + "type": "npm", + "name": "npm:universalify@2.0.1", + "data": { + "version": "2.0.1", + "packageName": "universalify", + "hash": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + } + }, + "npm:unplugin-utils": { + "type": "npm", + "name": "npm:unplugin-utils", + "data": { + "version": "0.3.1", + "packageName": "unplugin-utils", + "hash": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==" + } + }, + "npm:unplugin": { + "type": "npm", + "name": "npm:unplugin", + "data": { + "version": "2.3.10", + "packageName": "unplugin", + "hash": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==" + } + }, + "npm:unrs-resolver": { + "type": "npm", + "name": "npm:unrs-resolver", + "data": { + "version": "1.11.1", + "packageName": "unrs-resolver", + "hash": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==" + } + }, + "npm:unstorage": { + "type": "npm", + "name": "npm:unstorage", + "data": { + "version": "1.17.2", + "packageName": "unstorage", + "hash": "sha512-cKEsD6iBWJgOMJ6vW1ID/SYuqNf8oN4yqRk8OYqaVQ3nnkJXOT1PSpaMh2QfzLs78UN5kSNRD2c/mgjT8tX7+w==" + } + }, + "npm:untun": { + "type": "npm", + "name": "npm:untun", + "data": { + "version": "0.1.3", + "packageName": "untun", + "hash": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==" + } + }, + "npm:untyped": { + "type": "npm", + "name": "npm:untyped", + "data": { + "version": "2.0.0", + "packageName": "untyped", + "hash": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==" + } + }, + "npm:unwasm": { + "type": "npm", + "name": "npm:unwasm", + "data": { + "version": "0.3.11", + "packageName": "unwasm", + "hash": "sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ==" + } + }, + "npm:update-browserslist-db": { + "type": "npm", + "name": "npm:update-browserslist-db", + "data": { + "version": "1.1.4", + "packageName": "update-browserslist-db", + "hash": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==" + } + }, + "npm:uqr": { + "type": "npm", + "name": "npm:uqr", + "data": { + "version": "0.1.2", + "packageName": "uqr", + "hash": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" + } + }, + "npm:uri-js": { + "type": "npm", + "name": "npm:uri-js", + "data": { + "version": "4.4.1", + "packageName": "uri-js", + "hash": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + } + }, + "npm:use-sync-external-store": { + "type": "npm", + "name": "npm:use-sync-external-store", + "data": { + "version": "1.6.0", + "packageName": "use-sync-external-store", + "hash": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==" + } + }, + "npm:util-deprecate": { + "type": "npm", + "name": "npm:util-deprecate", + "data": { + "version": "1.0.2", + "packageName": "util-deprecate", + "hash": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + } + }, + "npm:vfile-location": { + "type": "npm", + "name": "npm:vfile-location", + "data": { + "version": "5.0.3", + "packageName": "vfile-location", + "hash": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==" + } + }, + "npm:vfile-message": { + "type": "npm", + "name": "npm:vfile-message", + "data": { + "version": "4.0.3", + "packageName": "vfile-message", + "hash": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==" + } + }, + "npm:vfile": { + "type": "npm", + "name": "npm:vfile", + "data": { + "version": "6.0.3", + "packageName": "vfile", + "hash": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==" + } + }, + "npm:vite-plugin-dts": { + "type": "npm", + "name": "npm:vite-plugin-dts", + "data": { + "version": "4.2.3", + "packageName": "vite-plugin-dts", + "hash": "sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==" + } + }, + "npm:vite-plugin-externalize-deps": { + "type": "npm", + "name": "npm:vite-plugin-externalize-deps", + "data": { + "version": "0.10.0", + "packageName": "vite-plugin-externalize-deps", + "hash": "sha512-eQrtpT/Do7AvDn76l1yL6ZHyXJ+UWH2LaHVqhAes9go54qaAnPZuMbgxcroQ/7WY3ZyetZzYW2quQnDF0DV5qg==" + } + }, + "npm:vite-plugin-solid": { + "type": "npm", + "name": "npm:vite-plugin-solid", + "data": { + "version": "2.11.10", + "packageName": "vite-plugin-solid", + "hash": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==" + } + }, + "npm:vite-tsconfig-paths": { + "type": "npm", + "name": "npm:vite-tsconfig-paths", + "data": { + "version": "5.1.4", + "packageName": "vite-tsconfig-paths", + "hash": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==" + } + }, + "npm:vite": { + "type": "npm", + "name": "npm:vite", + "data": { + "version": "7.2.4", + "packageName": "vite", + "hash": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==" + } + }, + "npm:vitefu": { + "type": "npm", + "name": "npm:vitefu", + "data": { + "version": "1.1.1", + "packageName": "vitefu", + "hash": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==" + } + }, + "npm:vitest": { + "type": "npm", + "name": "npm:vitest", + "data": { + "version": "4.0.14", + "packageName": "vitest", + "hash": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==" + } + }, + "npm:vscode-uri": { + "type": "npm", + "name": "npm:vscode-uri", + "data": { + "version": "3.1.0", + "packageName": "vscode-uri", + "hash": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" + } + }, + "npm:vue-eslint-parser": { + "type": "npm", + "name": "npm:vue-eslint-parser", + "data": { + "version": "10.2.0", + "packageName": "vue-eslint-parser", + "hash": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==" + } + }, + "npm:w3c-xmlserializer": { + "type": "npm", + "name": "npm:w3c-xmlserializer", + "data": { + "version": "5.0.0", + "packageName": "w3c-xmlserializer", + "hash": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==" + } + }, + "npm:walk-up-path": { + "type": "npm", + "name": "npm:walk-up-path", + "data": { + "version": "4.0.0", + "packageName": "walk-up-path", + "hash": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==" + } + }, + "npm:wcwidth": { + "type": "npm", + "name": "npm:wcwidth", + "data": { + "version": "1.0.1", + "packageName": "wcwidth", + "hash": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==" + } + }, + "npm:web-namespaces": { + "type": "npm", + "name": "npm:web-namespaces", + "data": { + "version": "2.0.1", + "packageName": "web-namespaces", + "hash": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" + } + }, + "npm:web-streams-polyfill": { + "type": "npm", + "name": "npm:web-streams-polyfill", + "data": { + "version": "3.3.3", + "packageName": "web-streams-polyfill", + "hash": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" + } + }, + "npm:web-vitals": { + "type": "npm", + "name": "npm:web-vitals", + "data": { + "version": "5.1.0", + "packageName": "web-vitals", + "hash": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==" + } + }, + "npm:webidl-conversions@3.0.1": { + "type": "npm", + "name": "npm:webidl-conversions@3.0.1", + "data": { + "version": "3.0.1", + "packageName": "webidl-conversions", + "hash": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + } + }, + "npm:webidl-conversions@8.0.0": { + "type": "npm", + "name": "npm:webidl-conversions@8.0.0", + "data": { + "version": "8.0.0", + "packageName": "webidl-conversions", + "hash": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==" + } + }, + "npm:webpack-virtual-modules": { + "type": "npm", + "name": "npm:webpack-virtual-modules", + "data": { + "version": "0.6.2", + "packageName": "webpack-virtual-modules", + "hash": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" + } + }, + "npm:whatwg-encoding": { + "type": "npm", + "name": "npm:whatwg-encoding", + "data": { + "version": "3.1.1", + "packageName": "whatwg-encoding", + "hash": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==" + } + }, + "npm:whatwg-fetch": { + "type": "npm", + "name": "npm:whatwg-fetch", + "data": { + "version": "3.6.20", + "packageName": "whatwg-fetch", + "hash": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + } + }, + "npm:whatwg-mimetype@3.0.0": { + "type": "npm", + "name": "npm:whatwg-mimetype@3.0.0", + "data": { + "version": "3.0.0", + "packageName": "whatwg-mimetype", + "hash": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + } + }, + "npm:whatwg-mimetype@4.0.0": { + "type": "npm", + "name": "npm:whatwg-mimetype@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "whatwg-mimetype", + "hash": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==" + } + }, + "npm:whatwg-url@15.1.0": { + "type": "npm", + "name": "npm:whatwg-url@15.1.0", + "data": { + "version": "15.1.0", + "packageName": "whatwg-url", + "hash": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==" + } + }, + "npm:whatwg-url@5.0.0": { + "type": "npm", + "name": "npm:whatwg-url@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "whatwg-url", + "hash": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" + } + }, + "npm:which": { + "type": "npm", + "name": "npm:which", + "data": { + "version": "2.0.2", + "packageName": "which", + "hash": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + } + }, + "npm:why-is-node-running": { + "type": "npm", + "name": "npm:why-is-node-running", + "data": { + "version": "2.3.0", + "packageName": "why-is-node-running", + "hash": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==" + } + }, + "npm:word-wrap": { + "type": "npm", + "name": "npm:word-wrap", + "data": { + "version": "1.2.5", + "packageName": "word-wrap", + "hash": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + } + }, + "npm:wrap-ansi@7.0.0": { + "type": "npm", + "name": "npm:wrap-ansi@7.0.0", + "data": { + "version": "7.0.0", + "packageName": "wrap-ansi", + "hash": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + } + }, + "npm:wrap-ansi@8.1.0": { + "type": "npm", + "name": "npm:wrap-ansi@8.1.0", + "data": { + "version": "8.1.0", + "packageName": "wrap-ansi", + "hash": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==" + } + }, + "npm:wrap-ansi-cjs": { + "type": "npm", + "name": "npm:wrap-ansi-cjs", + "data": { + "version": "npm:wrap-ansi@7.0.0", + "packageName": "wrap-ansi-cjs", + "hash": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" + } + }, + "npm:wrappy": { + "type": "npm", + "name": "npm:wrappy", + "data": { + "version": "1.0.2", + "packageName": "wrappy", + "hash": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + }, + "npm:ws": { + "type": "npm", + "name": "npm:ws", + "data": { + "version": "8.18.3", + "packageName": "ws", + "hash": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==" + } + }, + "npm:xml-name-validator": { + "type": "npm", + "name": "npm:xml-name-validator", + "data": { + "version": "5.0.0", + "packageName": "xml-name-validator", + "hash": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==" + } + }, + "npm:xmlbuilder2": { + "type": "npm", + "name": "npm:xmlbuilder2", + "data": { + "version": "4.0.1", + "packageName": "xmlbuilder2", + "hash": "sha512-vXeky0YRVjhx5pseJDQLk0F6u7gyA8++ceVOS88r4dWu4lWdY/ZjbL45QrN+g0GzZLg1D5AkzThpikZa98SC/g==" + } + }, + "npm:xmlchars": { + "type": "npm", + "name": "npm:xmlchars", + "data": { + "version": "2.2.0", + "packageName": "xmlchars", + "hash": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + } + }, + "npm:y18n": { + "type": "npm", + "name": "npm:y18n", + "data": { + "version": "5.0.8", + "packageName": "y18n", + "hash": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + } + }, + "npm:yallist@3.1.1": { + "type": "npm", + "name": "npm:yallist@3.1.1", + "data": { + "version": "3.1.1", + "packageName": "yallist", + "hash": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + }, + "npm:yallist@4.0.0": { + "type": "npm", + "name": "npm:yallist@4.0.0", + "data": { + "version": "4.0.0", + "packageName": "yallist", + "hash": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "npm:yallist@5.0.0": { + "type": "npm", + "name": "npm:yallist@5.0.0", + "data": { + "version": "5.0.0", + "packageName": "yallist", + "hash": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" + } + }, + "npm:yaml": { + "type": "npm", + "name": "npm:yaml", + "data": { + "version": "2.8.1", + "packageName": "yaml", + "hash": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==" + } + }, + "npm:yargs-parser": { + "type": "npm", + "name": "npm:yargs-parser", + "data": { + "version": "21.1.1", + "packageName": "yargs-parser", + "hash": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + }, + "npm:yargs": { + "type": "npm", + "name": "npm:yargs", + "data": { + "version": "17.7.2", + "packageName": "yargs", + "hash": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==" + } + }, + "npm:yocto-queue": { + "type": "npm", + "name": "npm:yocto-queue", + "data": { + "version": "0.1.0", + "packageName": "yocto-queue", + "hash": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + } + }, + "npm:youch-core": { + "type": "npm", + "name": "npm:youch-core", + "data": { + "version": "0.3.3", + "packageName": "youch-core", + "hash": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==" + } + }, + "npm:youch": { + "type": "npm", + "name": "npm:youch", + "data": { + "version": "4.1.0-beta.11", + "packageName": "youch", + "hash": "sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==" + } + }, + "npm:zimmerframe": { + "type": "npm", + "name": "npm:zimmerframe", + "data": { + "version": "1.1.4", + "packageName": "zimmerframe", + "hash": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==" + } + }, + "npm:zip-stream": { + "type": "npm", + "name": "npm:zip-stream", + "data": { + "version": "6.0.1", + "packageName": "zip-stream", + "hash": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==" + } + }, + "npm:zod-validation-error@3.5.4": { + "type": "npm", + "name": "npm:zod-validation-error@3.5.4", + "data": { + "version": "3.5.4", + "packageName": "zod-validation-error", + "hash": "sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==" + } + }, + "npm:zod-validation-error@4.0.2": { + "type": "npm", + "name": "npm:zod-validation-error@4.0.2", + "data": { + "version": "4.0.2", + "packageName": "zod-validation-error", + "hash": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==" + } + }, + "npm:zod@3.25.76": { + "type": "npm", + "name": "npm:zod@3.25.76", + "data": { + "version": "3.25.76", + "packageName": "zod", + "hash": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" + } + }, + "npm:zod@4.1.13": { + "type": "npm", + "name": "npm:zod@4.1.13", + "data": { + "version": "4.1.13", + "packageName": "zod", + "hash": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==" + } + }, + "npm:zwitch": { + "type": "npm", + "name": "npm:zwitch", + "data": { + "version": "2.0.4", + "packageName": "zwitch", + "hash": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" + } + } + }, + "dependencies": { + "@tanstack/react-ai-devtools": [ + { + "source": "@tanstack/react-ai-devtools", + "target": "npm:react", + "type": "static" + }, + { + "source": "@tanstack/react-ai-devtools", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "@tanstack/react-ai-devtools", + "target": "npm:@tanstack/devtools-utils", + "type": "static" + }, + { + "source": "@tanstack/react-ai-devtools", + "target": "@tanstack/ai-devtools-core", + "type": "static" + } + ], + "@tanstack/solid-ai-devtools": [ + { + "source": "@tanstack/solid-ai-devtools", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "@tanstack/solid-ai-devtools", + "target": "npm:vite-plugin-solid", + "type": "static" + }, + { + "source": "@tanstack/solid-ai-devtools", + "target": "@tanstack/ai-devtools-core", + "type": "static" + }, + { + "source": "@tanstack/solid-ai-devtools", + "target": "npm:@tanstack/devtools-utils", + "type": "static" + } + ], + "@tanstack/tests-adapters": [ + { + "source": "@tanstack/tests-adapters", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "@tanstack/tests-adapters", + "target": "npm:dotenv@17.2.3", + "type": "static" + }, + { + "source": "@tanstack/tests-adapters", + "target": "npm:tsx", + "type": "static" + }, + { + "source": "@tanstack/tests-adapters", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "@tanstack/tests-adapters", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "@tanstack/tests-adapters", + "target": "@tanstack/ai-anthropic", + "type": "static" + }, + { + "source": "@tanstack/tests-adapters", + "target": "@tanstack/ai-gemini", + "type": "static" + }, + { + "source": "@tanstack/tests-adapters", + "target": "@tanstack/ai-ollama", + "type": "static" + }, + { + "source": "@tanstack/tests-adapters", + "target": "@tanstack/ai-openai", + "type": "static" + } + ], + "@tanstack/ai-anthropic": [ + { + "source": "@tanstack/ai-anthropic", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "@tanstack/ai-anthropic", + "target": "npm:@anthropic-ai/sdk", + "type": "static" + } + ], + "@tanstack/ai-devtools-core": [ + { + "source": "@tanstack/ai-devtools-core", + "target": "npm:vite-plugin-solid", + "type": "static" + }, + { + "source": "@tanstack/ai-devtools-core", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "@tanstack/ai-devtools-core", + "target": "npm:@tanstack/devtools-ui", + "type": "static" + }, + { + "source": "@tanstack/ai-devtools-core", + "target": "npm:@tanstack/devtools-utils", + "type": "static" + }, + { + "source": "@tanstack/ai-devtools-core", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "@tanstack/ai-devtools-core", + "target": "npm:goober", + "type": "static" + }, + { + "source": "@tanstack/ai-devtools-core", + "target": "npm:solid-js", + "type": "static" + } + ], + "@tanstack/ai-fallback": [ + { + "source": "@tanstack/ai-fallback", + "target": "@tanstack/ai", + "type": "static" + } + ], + "@tanstack/ai-react-ui": [ + { + "source": "@tanstack/ai-react-ui", + "target": "@tanstack/ai-client", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "@tanstack/ai-react", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:react", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:highlight.js", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:react-markdown", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:rehype-highlight", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:rehype-raw", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:rehype-sanitize", + "type": "static" + }, + { + "source": "@tanstack/ai-react-ui", + "target": "npm:remark-gfm", + "type": "static" + } + ], + "@tanstack/ai-client": [ + { + "source": "@tanstack/ai-client", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "@tanstack/ai-client", + "target": "npm:partial-json", + "type": "static" + } + ], + "@tanstack/ai-gemini": [ + { + "source": "@tanstack/ai-gemini", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "@tanstack/ai-gemini", + "target": "npm:@google/genai", + "type": "static" + } + ], + "@tanstack/ai-ollama": [ + { + "source": "@tanstack/ai-ollama", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "@tanstack/ai-ollama", + "target": "npm:ollama", + "type": "static" + } + ], + "@tanstack/ai-openai": [ + { + "source": "@tanstack/ai-openai", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "@tanstack/ai-openai", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "@tanstack/ai-openai", + "target": "npm:openai", + "type": "static" + } + ], + "@tanstack/ai-react": [ + { + "source": "@tanstack/ai-react", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "@tanstack/ai-react", + "target": "@tanstack/ai-client", + "type": "static" + }, + { + "source": "@tanstack/ai-react", + "target": "npm:react", + "type": "static" + }, + { + "source": "@tanstack/ai-react", + "target": "npm:@eslint-react/eslint-plugin", + "type": "static" + }, + { + "source": "@tanstack/ai-react", + "target": "npm:@testing-library/react", + "type": "static" + }, + { + "source": "@tanstack/ai-react", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "@tanstack/ai-react", + "target": "npm:@vitejs/plugin-react", + "type": "static" + }, + { + "source": "@tanstack/ai-react", + "target": "npm:eslint-plugin-react-compiler", + "type": "static" + }, + { + "source": "@tanstack/ai-react", + "target": "npm:eslint-plugin-react-hooks", + "type": "static" + } + ], + "@tanstack/ai": [ + { + "source": "@tanstack/ai", + "target": "npm:@tanstack/devtools-event-client", + "type": "static" + } + ], + "vanilla-chat": [ + { + "source": "vanilla-chat", + "target": "npm:vite", + "type": "static" + }, + { + "source": "vanilla-chat", + "target": "@tanstack/ai-client", + "type": "static" + } + ], + "ts-chat": [ + { + "source": "ts-chat", + "target": "npm:@testing-library/dom", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@testing-library/react", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@types/react-dom", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@vitejs/plugin-react", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:jsdom", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:vite", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:vitest", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:web-vitals", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@ai-sdk/openai", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@ai-sdk/provider", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@ai-sdk/provider-utils", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tailwindcss/vite", + "type": "static" + }, + { + "source": "ts-chat", + "target": "@tanstack/ai", + "type": "static" + }, + { + "source": "ts-chat", + "target": "@tanstack/ai-anthropic", + "type": "static" + }, + { + "source": "ts-chat", + "target": "@tanstack/ai-client", + "type": "static" + }, + { + "source": "ts-chat", + "target": "@tanstack/ai-gemini", + "type": "static" + }, + { + "source": "ts-chat", + "target": "@tanstack/ai-ollama", + "type": "static" + }, + { + "source": "ts-chat", + "target": "@tanstack/ai-openai", + "type": "static" + }, + { + "source": "ts-chat", + "target": "@tanstack/ai-react", + "type": "static" + }, + { + "source": "ts-chat", + "target": "@tanstack/ai-react-ui", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/nitro-v2-vite-plugin", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/react-devtools", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/react-router-devtools", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/react-router-ssr-query", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/react-start", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/react-store", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/router-plugin", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:@tanstack/store", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:highlight.js", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:lucide-react", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:react", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:react-markdown", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:rehype-highlight", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:rehype-raw", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:rehype-sanitize", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:remark-gfm", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:tailwindcss", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:vite-tsconfig-paths", + "type": "static" + }, + { + "source": "ts-chat", + "target": "npm:zod@4.1.13", + "type": "static" + } + ], + "root": [ + { + "source": "root", + "target": "npm:@changesets/cli", + "type": "static" + }, + { + "source": "root", + "target": "npm:@faker-js/faker", + "type": "static" + }, + { + "source": "root", + "target": "npm:@size-limit/preset-small-lib", + "type": "static" + }, + { + "source": "root", + "target": "npm:@svitejs/changesets-changelog-github-compact", + "type": "static" + }, + { + "source": "root", + "target": "npm:@tanstack/config", + "type": "static" + }, + { + "source": "root", + "target": "npm:@testing-library/jest-dom", + "type": "static" + }, + { + "source": "root", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "root", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "root", + "target": "npm:eslint-plugin-unused-imports", + "type": "static" + }, + { + "source": "root", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "root", + "target": "npm:happy-dom", + "type": "static" + }, + { + "source": "root", + "target": "npm:knip", + "type": "static" + }, + { + "source": "root", + "target": "npm:markdown-link-extractor", + "type": "static" + }, + { + "source": "root", + "target": "npm:nx", + "type": "static" + }, + { + "source": "root", + "target": "npm:premove", + "type": "static" + }, + { + "source": "root", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "root", + "target": "npm:prettier-plugin-svelte", + "type": "static" + }, + { + "source": "root", + "target": "npm:publint", + "type": "static" + }, + { + "source": "root", + "target": "npm:sherif", + "type": "static" + }, + { + "source": "root", + "target": "npm:size-limit", + "type": "static" + }, + { + "source": "root", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "root", + "target": "npm:vite", + "type": "static" + }, + { + "source": "root", + "target": "npm:vitest", + "type": "static" + } + ], + "npm:@ai-sdk/openai": [ + { + "source": "npm:@ai-sdk/openai", + "target": "npm:@ai-sdk/provider", + "type": "static" + }, + { + "source": "npm:@ai-sdk/openai", + "target": "npm:@ai-sdk/provider-utils", + "type": "static" + }, + { + "source": "npm:@ai-sdk/openai", + "target": "npm:zod@4.1.13", + "type": "static" + } + ], + "npm:@ai-sdk/provider-utils": [ + { + "source": "npm:@ai-sdk/provider-utils", + "target": "npm:@ai-sdk/provider", + "type": "static" + }, + { + "source": "npm:@ai-sdk/provider-utils", + "target": "npm:@standard-schema/spec", + "type": "static" + }, + { + "source": "npm:@ai-sdk/provider-utils", + "target": "npm:eventsource-parser", + "type": "static" + }, + { + "source": "npm:@ai-sdk/provider-utils", + "target": "npm:zod@4.1.13", + "type": "static" + } + ], + "npm:@ai-sdk/provider": [ + { + "source": "npm:@ai-sdk/provider", + "target": "npm:json-schema", + "type": "static" + } + ], + "npm:@anthropic-ai/sdk": [ + { + "source": "npm:@anthropic-ai/sdk", + "target": "npm:json-schema-to-ts", + "type": "static" + }, + { + "source": "npm:@anthropic-ai/sdk", + "target": "npm:zod@4.1.13", + "type": "static" + } + ], + "npm:@asamuzakjp/css-color": [ + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:@csstools/css-calc", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:@csstools/css-color-parser", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:@csstools/css-parser-algorithms", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:@csstools/css-tokenizer", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/css-color", + "target": "npm:lru-cache@11.2.2", + "type": "static" + } + ], + "npm:@asamuzakjp/dom-selector": [ + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:@asamuzakjp/nwsapi", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:bidi-js", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:css-tree", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:is-potential-custom-element-name", + "type": "static" + }, + { + "source": "npm:@asamuzakjp/dom-selector", + "target": "npm:lru-cache@11.2.2", + "type": "static" + } + ], + "npm:@babel/code-frame@7.26.2": [ + { + "source": "npm:@babel/code-frame@7.26.2", + "target": "npm:@babel/helper-validator-identifier@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.26.2", + "target": "npm:js-tokens@4.0.0", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.26.2", + "target": "npm:picocolors", + "type": "static" + } + ], + "npm:@babel/code-frame@7.27.1": [ + { + "source": "npm:@babel/code-frame@7.27.1", + "target": "npm:@babel/helper-validator-identifier@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.27.1", + "target": "npm:js-tokens@4.0.0", + "type": "static" + }, + { + "source": "npm:@babel/code-frame@7.27.1", + "target": "npm:picocolors", + "type": "static" + } + ], + "npm:@babel/core": [ + { + "source": "npm:@babel/core", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/generator", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/helper-compilation-targets", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/helper-module-transforms", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/helpers", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:@jridgewell/remapping", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:convert-source-map", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:gensync", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:json5", + "type": "static" + }, + { + "source": "npm:@babel/core", + "target": "npm:semver@6.3.1", + "type": "static" + } + ], + "npm:@babel/generator": [ + { + "source": "npm:@babel/generator", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:@jridgewell/gen-mapping", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:@jridgewell/trace-mapping", + "type": "static" + }, + { + "source": "npm:@babel/generator", + "target": "npm:jsesc", + "type": "static" + } + ], + "npm:@babel/helper-annotate-as-pure": [ + { + "source": "npm:@babel/helper-annotate-as-pure", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/helper-compilation-targets": [ + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:@babel/compat-data", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:@babel/helper-validator-option", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:browserslist", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:lru-cache@5.1.1", + "type": "static" + }, + { + "source": "npm:@babel/helper-compilation-targets", + "target": "npm:semver@6.3.1", + "type": "static" + } + ], + "npm:@babel/helper-create-class-features-plugin": [ + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-annotate-as-pure", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-member-expression-to-functions", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-optimise-call-expression", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-replace-supers", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/helper-skip-transparent-expression-wrappers", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-create-class-features-plugin", + "target": "npm:semver@6.3.1", + "type": "static" + } + ], + "npm:@babel/helper-member-expression-to-functions": [ + { + "source": "npm:@babel/helper-member-expression-to-functions", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-member-expression-to-functions", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/helper-module-imports@7.18.6": [ + { + "source": "npm:@babel/helper-module-imports@7.18.6", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/helper-module-imports@7.27.1": [ + { + "source": "npm:@babel/helper-module-imports@7.27.1", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-imports@7.27.1", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/helper-module-transforms": [ + { + "source": "npm:@babel/helper-module-transforms", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-transforms", + "target": "npm:@babel/helper-module-imports@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-transforms", + "target": "npm:@babel/helper-validator-identifier@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/helper-module-transforms", + "target": "npm:@babel/traverse", + "type": "static" + } + ], + "npm:@babel/helper-optimise-call-expression": [ + { + "source": "npm:@babel/helper-optimise-call-expression", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/helper-replace-supers": [ + { + "source": "npm:@babel/helper-replace-supers", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/helper-replace-supers", + "target": "npm:@babel/helper-member-expression-to-functions", + "type": "static" + }, + { + "source": "npm:@babel/helper-replace-supers", + "target": "npm:@babel/helper-optimise-call-expression", + "type": "static" + }, + { + "source": "npm:@babel/helper-replace-supers", + "target": "npm:@babel/traverse", + "type": "static" + } + ], + "npm:@babel/helper-skip-transparent-expression-wrappers": [ + { + "source": "npm:@babel/helper-skip-transparent-expression-wrappers", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@babel/helper-skip-transparent-expression-wrappers", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/helpers": [ + { + "source": "npm:@babel/helpers", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@babel/helpers", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/parser@7.28.4": [ + { + "source": "npm:@babel/parser@7.28.4", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/parser@7.28.5": [ + { + "source": "npm:@babel/parser@7.28.5", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@babel/plugin-proposal-private-methods": [ + { + "source": "npm:@babel/plugin-proposal-private-methods", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-proposal-private-methods", + "target": "npm:@babel/helper-create-class-features-plugin", + "type": "static" + }, + { + "source": "npm:@babel/plugin-proposal-private-methods", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + } + ], + "npm:@babel/plugin-syntax-jsx": [ + { + "source": "npm:@babel/plugin-syntax-jsx", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-syntax-jsx", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + } + ], + "npm:@babel/plugin-syntax-typescript": [ + { + "source": "npm:@babel/plugin-syntax-typescript", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-syntax-typescript", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + } + ], + "npm:@babel/plugin-transform-modules-commonjs": [ + { + "source": "npm:@babel/plugin-transform-modules-commonjs", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-modules-commonjs", + "target": "npm:@babel/helper-module-transforms", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-modules-commonjs", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + } + ], + "npm:@babel/plugin-transform-react-jsx-self": [ + { + "source": "npm:@babel/plugin-transform-react-jsx-self", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-react-jsx-self", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + } + ], + "npm:@babel/plugin-transform-react-jsx-source": [ + { + "source": "npm:@babel/plugin-transform-react-jsx-source", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-react-jsx-source", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + } + ], + "npm:@babel/plugin-transform-typescript": [ + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/helper-annotate-as-pure", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/helper-create-class-features-plugin", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/helper-skip-transparent-expression-wrappers", + "type": "static" + }, + { + "source": "npm:@babel/plugin-transform-typescript", + "target": "npm:@babel/plugin-syntax-typescript", + "type": "static" + } + ], + "npm:@babel/preset-typescript": [ + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/helper-plugin-utils", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/helper-validator-option", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/plugin-syntax-jsx", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/plugin-transform-modules-commonjs", + "type": "static" + }, + { + "source": "npm:@babel/preset-typescript", + "target": "npm:@babel/plugin-transform-typescript", + "type": "static" + } + ], + "npm:@babel/template": [ + { + "source": "npm:@babel/template", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/template", + "target": "npm:@babel/parser@7.28.4", + "type": "static" + }, + { + "source": "npm:@babel/template", + "target": "npm:@babel/types@7.28.4", + "type": "static" + } + ], + "npm:@babel/traverse": [ + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/generator", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/helper-globals", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@babel/traverse", + "target": "npm:debug", + "type": "static" + } + ], + "npm:@babel/types@7.28.4": [ + { + "source": "npm:@babel/types@7.28.4", + "target": "npm:@babel/helper-string-parser", + "type": "static" + }, + { + "source": "npm:@babel/types@7.28.4", + "target": "npm:@babel/helper-validator-identifier@7.27.1", + "type": "static" + } + ], + "npm:@babel/types@7.28.5": [ + { + "source": "npm:@babel/types@7.28.5", + "target": "npm:@babel/helper-string-parser", + "type": "static" + }, + { + "source": "npm:@babel/types@7.28.5", + "target": "npm:@babel/helper-validator-identifier@7.28.5", + "type": "static" + } + ], + "npm:@changesets/apply-release-plan": [ + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/config", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/get-version-range-type", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/git", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/should-skip-package", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:detect-indent", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:lodash.startcase", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:outdent", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:prettier@2.8.8", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:resolve-from@5.0.0", + "type": "static" + }, + { + "source": "npm:@changesets/apply-release-plan", + "target": "npm:semver@7.7.3", + "type": "static" + } + ], + "npm:@changesets/assemble-release-plan": [ + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@changesets/get-dependents-graph", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@changesets/should-skip-package", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/assemble-release-plan", + "target": "npm:semver@7.7.3", + "type": "static" + } + ], + "npm:@changesets/changelog-git": [ + { + "source": "npm:@changesets/changelog-git", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + } + ], + "npm:@changesets/cli": [ + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/apply-release-plan", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/assemble-release-plan", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/changelog-git", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/config", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/get-dependents-graph", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/get-release-plan", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/git", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/logger", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/pre", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/read", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/should-skip-package", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@changesets/write", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@inquirer/external-editor", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:ansi-colors", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:ci-info", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:enquirer@2.4.1", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:mri", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:p-limit@2.3.0", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:package-manager-detector@0.2.11", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:resolve-from@5.0.0", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:spawndamnit", + "type": "static" + }, + { + "source": "npm:@changesets/cli", + "target": "npm:term-size", + "type": "static" + } + ], + "npm:@changesets/config": [ + { + "source": "npm:@changesets/config", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@changesets/get-dependents-graph", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@changesets/logger", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/config", + "target": "npm:micromatch", + "type": "static" + } + ], + "npm:@changesets/errors": [ + { + "source": "npm:@changesets/errors", + "target": "npm:extendable-error", + "type": "static" + } + ], + "npm:@changesets/get-dependents-graph": [ + { + "source": "npm:@changesets/get-dependents-graph", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/get-dependents-graph", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/get-dependents-graph", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@changesets/get-dependents-graph", + "target": "npm:semver@7.7.3", + "type": "static" + } + ], + "npm:@changesets/get-github-info": [ + { + "source": "npm:@changesets/get-github-info", + "target": "npm:dataloader", + "type": "static" + }, + { + "source": "npm:@changesets/get-github-info", + "target": "npm:node-fetch@2.7.0", + "type": "static" + } + ], + "npm:@changesets/get-release-plan": [ + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/assemble-release-plan", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/config", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/pre", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/read", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/get-release-plan", + "target": "npm:@manypkg/get-packages", + "type": "static" + } + ], + "npm:@changesets/git": [ + { + "source": "npm:@changesets/git", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:is-subdir", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:micromatch", + "type": "static" + }, + { + "source": "npm:@changesets/git", + "target": "npm:spawndamnit", + "type": "static" + } + ], + "npm:@changesets/logger": [ + { + "source": "npm:@changesets/logger", + "target": "npm:picocolors", + "type": "static" + } + ], + "npm:@changesets/parse": [ + { + "source": "npm:@changesets/parse", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/parse", + "target": "npm:js-yaml@3.14.1", + "type": "static" + } + ], + "npm:@changesets/pre": [ + { + "source": "npm:@changesets/pre", + "target": "npm:@changesets/errors", + "type": "static" + }, + { + "source": "npm:@changesets/pre", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/pre", + "target": "npm:@manypkg/get-packages", + "type": "static" + }, + { + "source": "npm:@changesets/pre", + "target": "npm:fs-extra@7.0.1", + "type": "static" + } + ], + "npm:@changesets/read": [ + { + "source": "npm:@changesets/read", + "target": "npm:@changesets/git", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:@changesets/logger", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:@changesets/parse", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:p-filter", + "type": "static" + }, + { + "source": "npm:@changesets/read", + "target": "npm:picocolors", + "type": "static" + } + ], + "npm:@changesets/should-skip-package": [ + { + "source": "npm:@changesets/should-skip-package", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/should-skip-package", + "target": "npm:@manypkg/get-packages", + "type": "static" + } + ], + "npm:@changesets/write": [ + { + "source": "npm:@changesets/write", + "target": "npm:@changesets/types@6.1.0", + "type": "static" + }, + { + "source": "npm:@changesets/write", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@changesets/write", + "target": "npm:human-id", + "type": "static" + }, + { + "source": "npm:@changesets/write", + "target": "npm:prettier@2.8.8", + "type": "static" + } + ], + "npm:@cloudflare/kv-asset-handler": [ + { + "source": "npm:@cloudflare/kv-asset-handler", + "target": "npm:mime@3.0.0", + "type": "static" + } + ], + "npm:@commitlint/parse": [ + { + "source": "npm:@commitlint/parse", + "target": "npm:@commitlint/types", + "type": "static" + }, + { + "source": "npm:@commitlint/parse", + "target": "npm:conventional-changelog-angular", + "type": "static" + }, + { + "source": "npm:@commitlint/parse", + "target": "npm:conventional-commits-parser", + "type": "static" + } + ], + "npm:@commitlint/types": [ + { + "source": "npm:@commitlint/types", + "target": "npm:@types/conventional-commits-parser", + "type": "static" + }, + { + "source": "npm:@commitlint/types", + "target": "npm:chalk@5.6.2", + "type": "static" + } + ], + "npm:@csstools/css-calc": [ + { + "source": "npm:@csstools/css-calc", + "target": "npm:@csstools/css-parser-algorithms", + "type": "static" + }, + { + "source": "npm:@csstools/css-calc", + "target": "npm:@csstools/css-tokenizer", + "type": "static" + } + ], + "npm:@csstools/css-color-parser": [ + { + "source": "npm:@csstools/css-color-parser", + "target": "npm:@csstools/color-helpers", + "type": "static" + }, + { + "source": "npm:@csstools/css-color-parser", + "target": "npm:@csstools/css-calc", + "type": "static" + }, + { + "source": "npm:@csstools/css-color-parser", + "target": "npm:@csstools/css-parser-algorithms", + "type": "static" + }, + { + "source": "npm:@csstools/css-color-parser", + "target": "npm:@csstools/css-tokenizer", + "type": "static" + } + ], + "npm:@csstools/css-parser-algorithms": [ + { + "source": "npm:@csstools/css-parser-algorithms", + "target": "npm:@csstools/css-tokenizer", + "type": "static" + } + ], + "npm:@csstools/css-syntax-patches-for-csstree": [ + { + "source": "npm:@csstools/css-syntax-patches-for-csstree", + "target": "npm:postcss", + "type": "static" + } + ], + "npm:@emnapi/core": [ + { + "source": "npm:@emnapi/core", + "target": "npm:@emnapi/wasi-threads", + "type": "static" + }, + { + "source": "npm:@emnapi/core", + "target": "npm:tslib", + "type": "static" + } + ], + "npm:@emnapi/runtime": [ + { + "source": "npm:@emnapi/runtime", + "target": "npm:tslib", + "type": "static" + } + ], + "npm:@emnapi/wasi-threads": [ + { + "source": "npm:@emnapi/wasi-threads", + "target": "npm:tslib", + "type": "static" + } + ], + "npm:@eslint-community/eslint-utils": [ + { + "source": "npm:@eslint-community/eslint-utils", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-community/eslint-utils", + "target": "npm:eslint-visitor-keys@3.4.3", + "type": "static" + } + ], + "npm:@eslint-react/ast": [ + { + "source": "npm:@eslint-react/ast", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:@typescript-eslint/typescript-estree@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:@eslint-react/ast", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@eslint-react/core": [ + { + "source": "npm:@eslint-react/core", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:birecord", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:@eslint-react/core", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@eslint-react/eslint-plugin": [ + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-dom", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-hooks-extra", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-naming-convention", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-web-api", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:eslint-plugin-react-x", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@eslint-react/eslint-plugin", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@eslint-react/shared": [ + { + "source": "npm:@eslint-react/shared", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:@eslint-react/shared", + "target": "npm:zod@4.1.13", + "type": "static" + } + ], + "npm:@eslint-react/var": [ + { + "source": "npm:@eslint-react/var", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:@eslint-react/var", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@eslint/config-array": [ + { + "source": "npm:@eslint/config-array", + "target": "npm:@eslint/object-schema", + "type": "static" + }, + { + "source": "npm:@eslint/config-array", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@eslint/config-array", + "target": "npm:minimatch@3.1.2", + "type": "static" + } + ], + "npm:@eslint/config-helpers": [ + { + "source": "npm:@eslint/config-helpers", + "target": "npm:@eslint/core", + "type": "static" + } + ], + "npm:@eslint/core": [ + { + "source": "npm:@eslint/core", + "target": "npm:@types/json-schema", + "type": "static" + } + ], + "npm:@eslint/eslintrc": [ + { + "source": "npm:@eslint/eslintrc", + "target": "npm:ajv@6.12.6", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:espree", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:globals@14.0.0", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:ignore@5.3.2", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:import-fresh", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:js-yaml@4.1.1", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:minimatch@3.1.2", + "type": "static" + }, + { + "source": "npm:@eslint/eslintrc", + "target": "npm:strip-json-comments@3.1.1", + "type": "static" + } + ], + "npm:@eslint/plugin-kit": [ + { + "source": "npm:@eslint/plugin-kit", + "target": "npm:@eslint/core", + "type": "static" + }, + { + "source": "npm:@eslint/plugin-kit", + "target": "npm:levn", + "type": "static" + } + ], + "npm:@gerrit0/mini-shiki": [ + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/engine-oniguruma", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/langs", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/themes", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/types", + "type": "static" + }, + { + "source": "npm:@gerrit0/mini-shiki", + "target": "npm:@shikijs/vscode-textmate", + "type": "static" + } + ], + "npm:@google/genai": [ + { + "source": "npm:@google/genai", + "target": "npm:google-auth-library", + "type": "static" + }, + { + "source": "npm:@google/genai", + "target": "npm:ws", + "type": "static" + } + ], + "npm:@humanfs/node": [ + { + "source": "npm:@humanfs/node", + "target": "npm:@humanfs/core", + "type": "static" + }, + { + "source": "npm:@humanfs/node", + "target": "npm:@humanwhocodes/retry", + "type": "static" + } + ], + "npm:@inquirer/external-editor": [ + { + "source": "npm:@inquirer/external-editor", + "target": "npm:chardet", + "type": "static" + }, + { + "source": "npm:@inquirer/external-editor", + "target": "npm:iconv-lite@0.7.0", + "type": "static" + }, + { + "source": "npm:@inquirer/external-editor", + "target": "npm:@types/node", + "type": "static" + } + ], + "npm:@isaacs/cliui": [ + { + "source": "npm:@isaacs/cliui", + "target": "npm:string-width@5.1.2", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:string-width-cjs", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:strip-ansi@7.1.2", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:strip-ansi-cjs", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:wrap-ansi@8.1.0", + "type": "static" + }, + { + "source": "npm:@isaacs/cliui", + "target": "npm:wrap-ansi-cjs", + "type": "static" + } + ], + "npm:@isaacs/fs-minipass": [ + { + "source": "npm:@isaacs/fs-minipass", + "target": "npm:minipass", + "type": "static" + } + ], + "npm:@jest/schemas": [ + { + "source": "npm:@jest/schemas", + "target": "npm:@sinclair/typebox", + "type": "static" + } + ], + "npm:@jridgewell/gen-mapping": [ + { + "source": "npm:@jridgewell/gen-mapping", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + }, + { + "source": "npm:@jridgewell/gen-mapping", + "target": "npm:@jridgewell/trace-mapping", + "type": "static" + } + ], + "npm:@jridgewell/remapping": [ + { + "source": "npm:@jridgewell/remapping", + "target": "npm:@jridgewell/gen-mapping", + "type": "static" + }, + { + "source": "npm:@jridgewell/remapping", + "target": "npm:@jridgewell/trace-mapping", + "type": "static" + } + ], + "npm:@jridgewell/source-map": [ + { + "source": "npm:@jridgewell/source-map", + "target": "npm:@jridgewell/gen-mapping", + "type": "static" + }, + { + "source": "npm:@jridgewell/source-map", + "target": "npm:@jridgewell/trace-mapping", + "type": "static" + } + ], + "npm:@jridgewell/trace-mapping": [ + { + "source": "npm:@jridgewell/trace-mapping", + "target": "npm:@jridgewell/resolve-uri", + "type": "static" + }, + { + "source": "npm:@jridgewell/trace-mapping", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + } + ], + "npm:@kwsites/file-exists": [ + { + "source": "npm:@kwsites/file-exists", + "target": "npm:debug", + "type": "static" + } + ], + "npm:@manypkg/find-root": [ + { + "source": "npm:@manypkg/find-root", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:@manypkg/find-root", + "target": "npm:@types/node@12.20.55", + "type": "static" + }, + { + "source": "npm:@manypkg/find-root", + "target": "npm:find-up@4.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/find-root", + "target": "npm:fs-extra@8.1.0", + "type": "static" + } + ], + "npm:@manypkg/get-packages": [ + { + "source": "npm:@manypkg/get-packages", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:@changesets/types@4.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:@manypkg/find-root", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:fs-extra@8.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:globby@11.1.0", + "type": "static" + }, + { + "source": "npm:@manypkg/get-packages", + "target": "npm:read-yaml-file", + "type": "static" + } + ], + "npm:@mapbox/node-pre-gyp": [ + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:detect-libc@2.1.2", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:https-proxy-agent", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:node-fetch@2.7.0", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:nopt", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@mapbox/node-pre-gyp", + "target": "npm:tar", + "type": "static" + } + ], + "npm:@microsoft/api-extractor-model": [ + { + "source": "npm:@microsoft/api-extractor-model", + "target": "npm:@microsoft/tsdoc", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor-model", + "target": "npm:@microsoft/tsdoc-config", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor-model", + "target": "npm:@rushstack/node-core-library", + "type": "static" + } + ], + "npm:@microsoft/api-extractor": [ + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@microsoft/api-extractor-model", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@microsoft/tsdoc", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@microsoft/tsdoc-config", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@rushstack/node-core-library", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@rushstack/rig-package", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@rushstack/terminal", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:@rushstack/ts-command-line", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:lodash", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:minimatch@3.0.8", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:semver@7.5.4", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:source-map@0.6.1", + "type": "static" + }, + { + "source": "npm:@microsoft/api-extractor", + "target": "npm:typescript@5.4.2", + "type": "static" + } + ], + "npm:@microsoft/tsdoc-config": [ + { + "source": "npm:@microsoft/tsdoc-config", + "target": "npm:@microsoft/tsdoc", + "type": "static" + }, + { + "source": "npm:@microsoft/tsdoc-config", + "target": "npm:ajv@8.12.0", + "type": "static" + }, + { + "source": "npm:@microsoft/tsdoc-config", + "target": "npm:jju", + "type": "static" + }, + { + "source": "npm:@microsoft/tsdoc-config", + "target": "npm:resolve", + "type": "static" + } + ], + "npm:@napi-rs/wasm-runtime@0.2.12": [ + { + "source": "npm:@napi-rs/wasm-runtime@0.2.12", + "target": "npm:@emnapi/core", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.12", + "target": "npm:@emnapi/runtime", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.12", + "target": "npm:@tybys/wasm-util@0.10.1", + "type": "static" + } + ], + "npm:@napi-rs/wasm-runtime@0.2.4": [ + { + "source": "npm:@napi-rs/wasm-runtime@0.2.4", + "target": "npm:@emnapi/core", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.4", + "target": "npm:@emnapi/runtime", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@0.2.4", + "target": "npm:@tybys/wasm-util@0.9.0", + "type": "static" + } + ], + "npm:@napi-rs/wasm-runtime@1.0.7": [ + { + "source": "npm:@napi-rs/wasm-runtime@1.0.7", + "target": "npm:@emnapi/core", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@1.0.7", + "target": "npm:@emnapi/runtime", + "type": "static" + }, + { + "source": "npm:@napi-rs/wasm-runtime@1.0.7", + "target": "npm:@tybys/wasm-util@0.10.1", + "type": "static" + } + ], + "npm:@nodelib/fs.scandir": [ + { + "source": "npm:@nodelib/fs.scandir", + "target": "npm:@nodelib/fs.stat", + "type": "static" + }, + { + "source": "npm:@nodelib/fs.scandir", + "target": "npm:run-parallel", + "type": "static" + } + ], + "npm:@nodelib/fs.walk": [ + { + "source": "npm:@nodelib/fs.walk", + "target": "npm:@nodelib/fs.scandir", + "type": "static" + }, + { + "source": "npm:@nodelib/fs.walk", + "target": "npm:fastq", + "type": "static" + } + ], + "npm:@oozcitak/dom": [ + { + "source": "npm:@oozcitak/dom", + "target": "npm:@oozcitak/infra", + "type": "static" + }, + { + "source": "npm:@oozcitak/dom", + "target": "npm:@oozcitak/url", + "type": "static" + }, + { + "source": "npm:@oozcitak/dom", + "target": "npm:@oozcitak/util", + "type": "static" + } + ], + "npm:@oozcitak/infra": [ + { + "source": "npm:@oozcitak/infra", + "target": "npm:@oozcitak/util", + "type": "static" + } + ], + "npm:@oozcitak/url": [ + { + "source": "npm:@oozcitak/url", + "target": "npm:@oozcitak/infra", + "type": "static" + }, + { + "source": "npm:@oozcitak/url", + "target": "npm:@oozcitak/util", + "type": "static" + } + ], + "npm:@oxc-resolver/binding-wasm32-wasi": [ + { + "source": "npm:@oxc-resolver/binding-wasm32-wasi", + "target": "npm:@napi-rs/wasm-runtime@1.0.7", + "type": "static" + } + ], + "npm:@parcel/watcher-wasm": [ + { + "source": "npm:@parcel/watcher-wasm", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:@parcel/watcher-wasm", + "target": "npm:micromatch", + "type": "static" + } + ], + "npm:@parcel/watcher": [ + { + "source": "npm:@parcel/watcher", + "target": "npm:detect-libc@1.0.3", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:micromatch", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:node-addon-api", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-android-arm64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-darwin-arm64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-darwin-x64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-freebsd-x64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-arm-glibc", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-arm-musl", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-arm64-glibc", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-x64-glibc", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-win32-arm64", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-win32-ia32", + "type": "static" + }, + { + "source": "npm:@parcel/watcher", + "target": "npm:@parcel/watcher-win32-x64", + "type": "static" + } + ], + "npm:@poppinss/colors": [ + { + "source": "npm:@poppinss/colors", + "target": "npm:kleur", + "type": "static" + } + ], + "npm:@poppinss/dumper": [ + { + "source": "npm:@poppinss/dumper", + "target": "npm:@poppinss/colors", + "type": "static" + }, + { + "source": "npm:@poppinss/dumper", + "target": "npm:@sindresorhus/is", + "type": "static" + }, + { + "source": "npm:@poppinss/dumper", + "target": "npm:supports-color@10.2.2", + "type": "static" + } + ], + "npm:@rolldown/binding-wasm32-wasi": [ + { + "source": "npm:@rolldown/binding-wasm32-wasi", + "target": "npm:@napi-rs/wasm-runtime@1.0.7", + "type": "static" + } + ], + "npm:@rollup/plugin-alias": [ + { + "source": "npm:@rollup/plugin-alias", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:@rollup/plugin-commonjs": [ + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:commondir", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:fdir", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:is-reference@1.2.1", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-commonjs", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:@rollup/plugin-inject": [ + { + "source": "npm:@rollup/plugin-inject", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-inject", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-inject", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-inject", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:@rollup/plugin-json": [ + { + "source": "npm:@rollup/plugin-json", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-json", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:@rollup/plugin-node-resolve": [ + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:@types/resolve", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:deepmerge", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:is-module", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-node-resolve", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:@rollup/plugin-replace": [ + { + "source": "npm:@rollup/plugin-replace", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-replace", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-replace", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:@rollup/plugin-terser": [ + { + "source": "npm:@rollup/plugin-terser", + "target": "npm:serialize-javascript", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-terser", + "target": "npm:smob", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-terser", + "target": "npm:terser", + "type": "static" + }, + { + "source": "npm:@rollup/plugin-terser", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:@rollup/pluginutils": [ + { + "source": "npm:@rollup/pluginutils", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:@rollup/pluginutils", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@rollup/pluginutils", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:@rollup/pluginutils", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:@rushstack/node-core-library": [ + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:ajv@8.13.0", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:ajv-draft-04", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:ajv-formats", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:fs-extra@7.0.1", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:import-lazy", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:jju", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:semver@7.5.4", + "type": "static" + }, + { + "source": "npm:@rushstack/node-core-library", + "target": "npm:@types/node", + "type": "static" + } + ], + "npm:@rushstack/rig-package": [ + { + "source": "npm:@rushstack/rig-package", + "target": "npm:resolve", + "type": "static" + }, + { + "source": "npm:@rushstack/rig-package", + "target": "npm:strip-json-comments@3.1.1", + "type": "static" + } + ], + "npm:@rushstack/terminal": [ + { + "source": "npm:@rushstack/terminal", + "target": "npm:@rushstack/node-core-library", + "type": "static" + }, + { + "source": "npm:@rushstack/terminal", + "target": "npm:supports-color@8.1.1", + "type": "static" + }, + { + "source": "npm:@rushstack/terminal", + "target": "npm:@types/node", + "type": "static" + } + ], + "npm:@rushstack/ts-command-line": [ + { + "source": "npm:@rushstack/ts-command-line", + "target": "npm:@rushstack/terminal", + "type": "static" + }, + { + "source": "npm:@rushstack/ts-command-line", + "target": "npm:@types/argparse", + "type": "static" + }, + { + "source": "npm:@rushstack/ts-command-line", + "target": "npm:argparse@1.0.10", + "type": "static" + }, + { + "source": "npm:@rushstack/ts-command-line", + "target": "npm:string-argv", + "type": "static" + } + ], + "npm:@shikijs/engine-oniguruma": [ + { + "source": "npm:@shikijs/engine-oniguruma", + "target": "npm:@shikijs/types", + "type": "static" + }, + { + "source": "npm:@shikijs/engine-oniguruma", + "target": "npm:@shikijs/vscode-textmate", + "type": "static" + } + ], + "npm:@shikijs/langs": [ + { + "source": "npm:@shikijs/langs", + "target": "npm:@shikijs/types", + "type": "static" + } + ], + "npm:@shikijs/themes": [ + { + "source": "npm:@shikijs/themes", + "target": "npm:@shikijs/types", + "type": "static" + } + ], + "npm:@shikijs/types": [ + { + "source": "npm:@shikijs/types", + "target": "npm:@shikijs/vscode-textmate", + "type": "static" + }, + { + "source": "npm:@shikijs/types", + "target": "npm:@types/hast", + "type": "static" + } + ], + "npm:@size-limit/esbuild": [ + { + "source": "npm:@size-limit/esbuild", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "npm:@size-limit/esbuild", + "target": "npm:nanoid@5.1.6", + "type": "static" + }, + { + "source": "npm:@size-limit/esbuild", + "target": "npm:size-limit", + "type": "static" + } + ], + "npm:@size-limit/file": [ + { + "source": "npm:@size-limit/file", + "target": "npm:size-limit", + "type": "static" + } + ], + "npm:@size-limit/preset-small-lib": [ + { + "source": "npm:@size-limit/preset-small-lib", + "target": "npm:@size-limit/esbuild", + "type": "static" + }, + { + "source": "npm:@size-limit/preset-small-lib", + "target": "npm:@size-limit/file", + "type": "static" + }, + { + "source": "npm:@size-limit/preset-small-lib", + "target": "npm:size-limit", + "type": "static" + } + ], + "npm:@solid-primitives/event-listener": [ + { + "source": "npm:@solid-primitives/event-listener", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/event-listener", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@solid-primitives/keyboard": [ + { + "source": "npm:@solid-primitives/keyboard", + "target": "npm:@solid-primitives/event-listener", + "type": "static" + }, + { + "source": "npm:@solid-primitives/keyboard", + "target": "npm:@solid-primitives/rootless", + "type": "static" + }, + { + "source": "npm:@solid-primitives/keyboard", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/keyboard", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@solid-primitives/resize-observer": [ + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:@solid-primitives/event-listener", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:@solid-primitives/rootless", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:@solid-primitives/static-store", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/resize-observer", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@solid-primitives/rootless": [ + { + "source": "npm:@solid-primitives/rootless", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/rootless", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@solid-primitives/static-store": [ + { + "source": "npm:@solid-primitives/static-store", + "target": "npm:@solid-primitives/utils", + "type": "static" + }, + { + "source": "npm:@solid-primitives/static-store", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@solid-primitives/utils": [ + { + "source": "npm:@solid-primitives/utils", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@stylistic/eslint-plugin": [ + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:espree", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:estraverse", + "type": "static" + }, + { + "source": "npm:@stylistic/eslint-plugin", + "target": "npm:picomatch@4.0.3", + "type": "static" + } + ], + "npm:@sveltejs/acorn-typescript": [ + { + "source": "npm:@sveltejs/acorn-typescript", + "target": "npm:acorn", + "type": "static" + } + ], + "npm:@svitejs/changesets-changelog-github-compact": [ + { + "source": "npm:@svitejs/changesets-changelog-github-compact", + "target": "npm:@changesets/get-github-info", + "type": "static" + }, + { + "source": "npm:@svitejs/changesets-changelog-github-compact", + "target": "npm:dotenv@16.6.1", + "type": "static" + } + ], + "npm:@tailwindcss/node": [ + { + "source": "npm:@tailwindcss/node", + "target": "npm:@jridgewell/remapping", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:enhanced-resolve", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:lightningcss", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:source-map-js", + "type": "static" + }, + { + "source": "npm:@tailwindcss/node", + "target": "npm:tailwindcss", + "type": "static" + } + ], + "npm:@tailwindcss/oxide": [ + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-android-arm64", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-darwin-arm64", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-darwin-x64", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-freebsd-x64", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-wasm32-wasi", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:@tailwindcss/oxide", + "target": "npm:@tailwindcss/oxide-win32-x64-msvc", + "type": "static" + } + ], + "npm:@tailwindcss/vite": [ + { + "source": "npm:@tailwindcss/vite", + "target": "npm:@tailwindcss/node", + "type": "static" + }, + { + "source": "npm:@tailwindcss/vite", + "target": "npm:@tailwindcss/oxide", + "type": "static" + }, + { + "source": "npm:@tailwindcss/vite", + "target": "npm:tailwindcss", + "type": "static" + }, + { + "source": "npm:@tailwindcss/vite", + "target": "npm:vite", + "type": "static" + } + ], + "npm:@tanstack/config": [ + { + "source": "npm:@tanstack/config", + "target": "npm:@tanstack/eslint-config", + "type": "static" + }, + { + "source": "npm:@tanstack/config", + "target": "npm:@tanstack/publish-config", + "type": "static" + }, + { + "source": "npm:@tanstack/config", + "target": "npm:@tanstack/typedoc-config", + "type": "static" + }, + { + "source": "npm:@tanstack/config", + "target": "npm:@tanstack/vite-config", + "type": "static" + } + ], + "npm:@tanstack/devtools-client": [ + { + "source": "npm:@tanstack/devtools-client", + "target": "npm:@tanstack/devtools-event-client", + "type": "static" + } + ], + "npm:@tanstack/devtools-event-bus": [ + { + "source": "npm:@tanstack/devtools-event-bus", + "target": "npm:ws", + "type": "static" + } + ], + "npm:@tanstack/devtools-ui": [ + { + "source": "npm:@tanstack/devtools-ui", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-ui", + "target": "npm:goober", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-ui", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@tanstack/devtools-utils": [ + { + "source": "npm:@tanstack/devtools-utils", + "target": "npm:@tanstack/devtools-ui", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-utils", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-utils", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools-utils", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@tanstack/devtools": [ + { + "source": "npm:@tanstack/devtools", + "target": "npm:@solid-primitives/event-listener", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@solid-primitives/keyboard", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@solid-primitives/resize-observer", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@tanstack/devtools-client", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@tanstack/devtools-event-bus", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:@tanstack/devtools-ui", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:goober", + "type": "static" + }, + { + "source": "npm:@tanstack/devtools", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:@tanstack/directive-functions-plugin": [ + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:babel-dead-code-elimination", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/directive-functions-plugin", + "target": "npm:vite", + "type": "static" + } + ], + "npm:@tanstack/eslint-config": [ + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:@eslint/js", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:@stylistic/eslint-plugin", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:eslint-plugin-import-x", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:eslint-plugin-n", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:globals@16.5.0", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:typescript-eslint", + "type": "static" + }, + { + "source": "npm:@tanstack/eslint-config", + "target": "npm:vue-eslint-parser", + "type": "static" + } + ], + "npm:@tanstack/nitro-v2-vite-plugin": [ + { + "source": "npm:@tanstack/nitro-v2-vite-plugin", + "target": "npm:nitropack", + "type": "static" + }, + { + "source": "npm:@tanstack/nitro-v2-vite-plugin", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/nitro-v2-vite-plugin", + "target": "npm:vite", + "type": "static" + } + ], + "npm:@tanstack/publish-config": [ + { + "source": "npm:@tanstack/publish-config", + "target": "npm:@commitlint/parse", + "type": "static" + }, + { + "source": "npm:@tanstack/publish-config", + "target": "npm:jsonfile@6.2.0", + "type": "static" + }, + { + "source": "npm:@tanstack/publish-config", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@tanstack/publish-config", + "target": "npm:simple-git", + "type": "static" + } + ], + "npm:@tanstack/react-devtools": [ + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:@tanstack/devtools", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:@types/react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-devtools", + "target": "npm:react-dom", + "type": "static" + } + ], + "npm:@tanstack/react-query": [ + { + "source": "npm:@tanstack/react-query", + "target": "npm:@tanstack/query-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-query", + "target": "npm:react", + "type": "static" + } + ], + "npm:@tanstack/react-router-devtools": [ + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:@tanstack/router-devtools-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-devtools", + "target": "npm:@tanstack/router-core", + "type": "static" + } + ], + "npm:@tanstack/react-router-ssr-query": [ + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:@tanstack/query-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:@tanstack/react-query", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:@tanstack/router-ssr-query-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router-ssr-query", + "target": "npm:react-dom", + "type": "static" + } + ], + "npm:@tanstack/react-router": [ + { + "source": "npm:@tanstack/react-router", + "target": "npm:@tanstack/history", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:@tanstack/react-store", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:isbot", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/react-router", + "target": "npm:tiny-warning", + "type": "static" + } + ], + "npm:@tanstack/react-start-client": [ + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-client", + "target": "npm:tiny-warning", + "type": "static" + } + ], + "npm:@tanstack/react-start-server": [ + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/history", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:@tanstack/start-server-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start-server", + "target": "npm:react-dom", + "type": "static" + } + ], + "npm:@tanstack/react-start": [ + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/react-start-client", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/react-start-server", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/start-plugin-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:@tanstack/start-server-core", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-start", + "target": "npm:vite", + "type": "static" + } + ], + "npm:@tanstack/react-store": [ + { + "source": "npm:@tanstack/react-store", + "target": "npm:@tanstack/store", + "type": "static" + }, + { + "source": "npm:@tanstack/react-store", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@tanstack/react-store", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@tanstack/react-store", + "target": "npm:use-sync-external-store", + "type": "static" + } + ], + "npm:@tanstack/router-core": [ + { + "source": "npm:@tanstack/router-core", + "target": "npm:@tanstack/history", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:@tanstack/store", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:cookie-es@2.0.0", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:seroval@1.4.0", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:seroval-plugins@1.4.0", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/router-core", + "target": "npm:tiny-warning", + "type": "static" + } + ], + "npm:@tanstack/router-devtools-core": [ + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:goober", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/router-devtools-core", + "target": "npm:csstype@3.2.3", + "type": "static" + } + ], + "npm:@tanstack/router-generator": [ + { + "source": "npm:@tanstack/router-generator", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:@tanstack/virtual-file-routes", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:recast", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:source-map@0.7.6", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:tsx", + "type": "static" + }, + { + "source": "npm:@tanstack/router-generator", + "target": "npm:zod@3.25.76", + "type": "static" + } + ], + "npm:@tanstack/router-plugin": [ + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/plugin-syntax-jsx", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/plugin-syntax-typescript", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/router-generator", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/virtual-file-routes", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:babel-dead-code-elimination", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:chokidar@3.6.0", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:unplugin", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:zod@3.25.76", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:@tanstack/react-router", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/router-plugin", + "target": "npm:vite-plugin-solid", + "type": "static" + } + ], + "npm:@tanstack/router-ssr-query-core": [ + { + "source": "npm:@tanstack/router-ssr-query-core", + "target": "npm:@tanstack/query-core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-ssr-query-core", + "target": "npm:@tanstack/router-core", + "type": "static" + } + ], + "npm:@tanstack/router-utils": [ + { + "source": "npm:@tanstack/router-utils", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:@babel/generator", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:@babel/preset-typescript", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:ansis", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:diff", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/router-utils", + "target": "npm:tinyglobby", + "type": "static" + } + ], + "npm:@tanstack/server-functions-plugin": [ + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/plugin-syntax-jsx", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/plugin-syntax-typescript", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/template", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:@tanstack/directive-functions-plugin", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:babel-dead-code-elimination", + "type": "static" + }, + { + "source": "npm:@tanstack/server-functions-plugin", + "target": "npm:tiny-invariant", + "type": "static" + } + ], + "npm:@tanstack/start-client-core": [ + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:@tanstack/start-storage-context", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:seroval@1.4.0", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:@tanstack/start-client-core", + "target": "npm:tiny-warning", + "type": "static" + } + ], + "npm:@tanstack/start-plugin-core": [ + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@babel/code-frame@7.26.2", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@rolldown/pluginutils@1.0.0-beta.40", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/router-generator", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/router-plugin", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/router-utils", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/server-functions-plugin", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:@tanstack/start-server-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:babel-dead-code-elimination", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:cheerio", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:exsolve", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:srvx", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:vitefu", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:xmlbuilder2", + "type": "static" + }, + { + "source": "npm:@tanstack/start-plugin-core", + "target": "npm:zod@3.25.76", + "type": "static" + } + ], + "npm:@tanstack/start-server-core": [ + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:@tanstack/history", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:@tanstack/router-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:@tanstack/start-client-core", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:@tanstack/start-storage-context", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:h3-v2", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:seroval@1.4.0", + "type": "static" + }, + { + "source": "npm:@tanstack/start-server-core", + "target": "npm:tiny-invariant", + "type": "static" + } + ], + "npm:@tanstack/start-storage-context": [ + { + "source": "npm:@tanstack/start-storage-context", + "target": "npm:@tanstack/router-core", + "type": "static" + } + ], + "npm:@tanstack/typedoc-config": [ + { + "source": "npm:@tanstack/typedoc-config", + "target": "npm:typedoc", + "type": "static" + }, + { + "source": "npm:@tanstack/typedoc-config", + "target": "npm:typedoc-plugin-frontmatter", + "type": "static" + }, + { + "source": "npm:@tanstack/typedoc-config", + "target": "npm:typedoc-plugin-markdown", + "type": "static" + } + ], + "npm:@tanstack/vite-config": [ + { + "source": "npm:@tanstack/vite-config", + "target": "npm:rollup-plugin-preserve-directives", + "type": "static" + }, + { + "source": "npm:@tanstack/vite-config", + "target": "npm:vite-plugin-dts", + "type": "static" + }, + { + "source": "npm:@tanstack/vite-config", + "target": "npm:vite-plugin-externalize-deps", + "type": "static" + }, + { + "source": "npm:@tanstack/vite-config", + "target": "npm:vite-tsconfig-paths", + "type": "static" + } + ], + "npm:@testing-library/dom": [ + { + "source": "npm:@testing-library/dom", + "target": "npm:@babel/code-frame@7.27.1", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:@types/aria-query", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:aria-query@5.3.0", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:dom-accessibility-api@0.5.16", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:lz-string", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@testing-library/dom", + "target": "npm:pretty-format@27.5.1", + "type": "static" + } + ], + "npm:@testing-library/jest-dom": [ + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:@adobe/css-tools", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:aria-query@5.3.0", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:css.escape", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:dom-accessibility-api@0.6.3", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:@testing-library/jest-dom", + "target": "npm:redent", + "type": "static" + } + ], + "npm:@testing-library/react": [ + { + "source": "npm:@testing-library/react", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:@testing-library/dom", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:react-dom", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:@testing-library/react", + "target": "npm:@types/react-dom", + "type": "static" + } + ], + "npm:@tybys/wasm-util@0.10.1": [ + { + "source": "npm:@tybys/wasm-util@0.10.1", + "target": "npm:tslib", + "type": "static" + } + ], + "npm:@tybys/wasm-util@0.9.0": [ + { + "source": "npm:@tybys/wasm-util@0.9.0", + "target": "npm:tslib", + "type": "static" + } + ], + "npm:@types/babel__core": [ + { + "source": "npm:@types/babel__core", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@types/babel__generator", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@types/babel__template", + "type": "static" + }, + { + "source": "npm:@types/babel__core", + "target": "npm:@types/babel__traverse", + "type": "static" + } + ], + "npm:@types/babel__generator": [ + { + "source": "npm:@types/babel__generator", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@types/babel__template": [ + { + "source": "npm:@types/babel__template", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@types/babel__template", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@types/babel__traverse": [ + { + "source": "npm:@types/babel__traverse", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:@types/chai": [ + { + "source": "npm:@types/chai", + "target": "npm:@types/deep-eql", + "type": "static" + }, + { + "source": "npm:@types/chai", + "target": "npm:assertion-error", + "type": "static" + } + ], + "npm:@types/conventional-commits-parser": [ + { + "source": "npm:@types/conventional-commits-parser", + "target": "npm:@types/node", + "type": "static" + } + ], + "npm:@types/debug": [ + { + "source": "npm:@types/debug", + "target": "npm:@types/ms", + "type": "static" + } + ], + "npm:@types/estree-jsx": [ + { + "source": "npm:@types/estree-jsx", + "target": "npm:@types/estree", + "type": "static" + } + ], + "npm:@types/hast": [ + { + "source": "npm:@types/hast", + "target": "npm:@types/unist@3.0.3", + "type": "static" + } + ], + "npm:@types/mdast": [ + { + "source": "npm:@types/mdast", + "target": "npm:@types/unist@3.0.3", + "type": "static" + } + ], + "npm:@types/node@20.19.25": [ + { + "source": "npm:@types/node@20.19.25", + "target": "npm:undici-types@6.21.0", + "type": "static" + } + ], + "npm:@types/node": [ + { + "source": "npm:@types/node", + "target": "npm:undici-types@7.16.0", + "type": "static" + } + ], + "npm:@types/react-dom": [ + { + "source": "npm:@types/react-dom", + "target": "npm:@types/react", + "type": "static" + } + ], + "npm:@types/react": [ + { + "source": "npm:@types/react", + "target": "npm:csstype@3.2.3", + "type": "static" + } + ], + "npm:@typescript-eslint/eslint-plugin": [ + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@eslint-community/regexpp", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/parser", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/scope-manager@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/type-utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:@typescript-eslint/visitor-keys@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:graphemer", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:ignore@7.0.5", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:natural-compare", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/eslint-plugin", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/parser": [ + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:@typescript-eslint/scope-manager@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:@typescript-eslint/typescript-estree@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:@typescript-eslint/visitor-keys@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/parser", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/project-service@8.46.3": [ + { + "source": "npm:@typescript-eslint/project-service@8.46.3", + "target": "npm:@typescript-eslint/tsconfig-utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.46.3", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.46.3", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/project-service@8.48.0": [ + { + "source": "npm:@typescript-eslint/project-service@8.48.0", + "target": "npm:@typescript-eslint/tsconfig-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.48.0", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/project-service@8.48.0", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/scope-manager@8.46.3": [ + { + "source": "npm:@typescript-eslint/scope-manager@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/scope-manager@8.46.3", + "target": "npm:@typescript-eslint/visitor-keys@8.46.3", + "type": "static" + } + ], + "npm:@typescript-eslint/scope-manager@8.48.0": [ + { + "source": "npm:@typescript-eslint/scope-manager@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/scope-manager@8.48.0", + "target": "npm:@typescript-eslint/visitor-keys@8.48.0", + "type": "static" + } + ], + "npm:@typescript-eslint/tsconfig-utils@8.46.3": [ + { + "source": "npm:@typescript-eslint/tsconfig-utils@8.46.3", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/tsconfig-utils@8.48.0": [ + { + "source": "npm:@typescript-eslint/tsconfig-utils@8.48.0", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/type-utils@8.46.3": [ + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:@typescript-eslint/typescript-estree@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:@typescript-eslint/utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.46.3", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/type-utils@8.48.0": [ + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:@typescript-eslint/typescript-estree@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/type-utils@8.48.0", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/typescript-estree@8.46.3": [ + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:@typescript-eslint/project-service@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:@typescript-eslint/tsconfig-utils@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:@typescript-eslint/visitor-keys@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.46.3", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/typescript-estree@8.48.0": [ + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:@typescript-eslint/project-service@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:@typescript-eslint/tsconfig-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:@typescript-eslint/visitor-keys@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/typescript-estree@8.48.0", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/utils@8.46.3": [ + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:@typescript-eslint/scope-manager@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:@typescript-eslint/typescript-estree@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.46.3", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/utils@8.48.0": [ + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:@typescript-eslint/typescript-estree@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/utils@8.48.0", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@typescript-eslint/visitor-keys@8.46.3": [ + { + "source": "npm:@typescript-eslint/visitor-keys@8.46.3", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/visitor-keys@8.46.3", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + } + ], + "npm:@typescript-eslint/visitor-keys@8.48.0": [ + { + "source": "npm:@typescript-eslint/visitor-keys@8.48.0", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:@typescript-eslint/visitor-keys@8.48.0", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + } + ], + "npm:@unrs/resolver-binding-wasm32-wasi": [ + { + "source": "npm:@unrs/resolver-binding-wasm32-wasi", + "target": "npm:@napi-rs/wasm-runtime@0.2.12", + "type": "static" + } + ], + "npm:@vercel/nft": [ + { + "source": "npm:@vercel/nft", + "target": "npm:@mapbox/node-pre-gyp", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:acorn-import-attributes", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:async-sema", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:bindings", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:glob", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:node-gyp-build", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:@vercel/nft", + "target": "npm:resolve-from@5.0.0", + "type": "static" + } + ], + "npm:@vitejs/plugin-react": [ + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@babel/plugin-transform-react-jsx-self", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@babel/plugin-transform-react-jsx-source", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@rolldown/pluginutils@1.0.0-beta.47", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:@types/babel__core", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:react-refresh", + "type": "static" + }, + { + "source": "npm:@vitejs/plugin-react", + "target": "npm:vite", + "type": "static" + } + ], + "npm:@vitest/expect": [ + { + "source": "npm:@vitest/expect", + "target": "npm:@standard-schema/spec", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:@types/chai", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:@vitest/spy", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:@vitest/utils", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:chai", + "type": "static" + }, + { + "source": "npm:@vitest/expect", + "target": "npm:tinyrainbow", + "type": "static" + } + ], + "npm:@vitest/mocker": [ + { + "source": "npm:@vitest/mocker", + "target": "npm:@vitest/spy", + "type": "static" + }, + { + "source": "npm:@vitest/mocker", + "target": "npm:estree-walker@3.0.3", + "type": "static" + }, + { + "source": "npm:@vitest/mocker", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@vitest/mocker", + "target": "npm:vite", + "type": "static" + } + ], + "npm:@vitest/pretty-format": [ + { + "source": "npm:@vitest/pretty-format", + "target": "npm:tinyrainbow", + "type": "static" + } + ], + "npm:@vitest/runner": [ + { + "source": "npm:@vitest/runner", + "target": "npm:@vitest/utils", + "type": "static" + }, + { + "source": "npm:@vitest/runner", + "target": "npm:pathe@2.0.3", + "type": "static" + } + ], + "npm:@vitest/snapshot": [ + { + "source": "npm:@vitest/snapshot", + "target": "npm:@vitest/pretty-format", + "type": "static" + }, + { + "source": "npm:@vitest/snapshot", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:@vitest/snapshot", + "target": "npm:pathe@2.0.3", + "type": "static" + } + ], + "npm:@vitest/utils": [ + { + "source": "npm:@vitest/utils", + "target": "npm:@vitest/pretty-format", + "type": "static" + }, + { + "source": "npm:@vitest/utils", + "target": "npm:tinyrainbow", + "type": "static" + } + ], + "npm:@volar/language-core": [ + { + "source": "npm:@volar/language-core", + "target": "npm:@volar/source-map", + "type": "static" + } + ], + "npm:@volar/typescript": [ + { + "source": "npm:@volar/typescript", + "target": "npm:@volar/language-core", + "type": "static" + }, + { + "source": "npm:@volar/typescript", + "target": "npm:path-browserify", + "type": "static" + }, + { + "source": "npm:@volar/typescript", + "target": "npm:vscode-uri", + "type": "static" + } + ], + "npm:@vue/compiler-core": [ + { + "source": "npm:@vue/compiler-core", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:@vue/shared", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:entities@4.5.0", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:estree-walker@2.0.2", + "type": "static" + }, + { + "source": "npm:@vue/compiler-core", + "target": "npm:source-map-js", + "type": "static" + } + ], + "npm:@vue/compiler-dom": [ + { + "source": "npm:@vue/compiler-dom", + "target": "npm:@vue/compiler-core", + "type": "static" + }, + { + "source": "npm:@vue/compiler-dom", + "target": "npm:@vue/shared", + "type": "static" + } + ], + "npm:@vue/compiler-vue2": [ + { + "source": "npm:@vue/compiler-vue2", + "target": "npm:de-indent", + "type": "static" + }, + { + "source": "npm:@vue/compiler-vue2", + "target": "npm:he", + "type": "static" + } + ], + "npm:@vue/language-core": [ + { + "source": "npm:@vue/language-core", + "target": "npm:@volar/language-core", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:@vue/compiler-dom", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:@vue/compiler-vue2", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:@vue/shared", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:computeds", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:muggle-string", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:path-browserify", + "type": "static" + }, + { + "source": "npm:@vue/language-core", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:@yarnpkg/parsers": [ + { + "source": "npm:@yarnpkg/parsers", + "target": "npm:js-yaml@3.14.1", + "type": "static" + }, + { + "source": "npm:@yarnpkg/parsers", + "target": "npm:tslib", + "type": "static" + } + ], + "npm:@zkochan/js-yaml": [ + { + "source": "npm:@zkochan/js-yaml", + "target": "npm:argparse@2.0.1", + "type": "static" + } + ], + "npm:JSONStream": [ + { + "source": "npm:JSONStream", + "target": "npm:jsonparse", + "type": "static" + }, + { + "source": "npm:JSONStream", + "target": "npm:through", + "type": "static" + } + ], + "npm:abort-controller": [ + { + "source": "npm:abort-controller", + "target": "npm:event-target-shim", + "type": "static" + } + ], + "npm:acorn-import-attributes": [ + { + "source": "npm:acorn-import-attributes", + "target": "npm:acorn", + "type": "static" + } + ], + "npm:acorn-jsx": [ + { + "source": "npm:acorn-jsx", + "target": "npm:acorn", + "type": "static" + } + ], + "npm:ajv-draft-04": [ + { + "source": "npm:ajv-draft-04", + "target": "npm:ajv@8.13.0", + "type": "static" + } + ], + "npm:ajv-formats": [ + { + "source": "npm:ajv-formats", + "target": "npm:ajv@8.13.0", + "type": "static" + } + ], + "npm:ajv@6.12.6": [ + { + "source": "npm:ajv@6.12.6", + "target": "npm:fast-deep-equal", + "type": "static" + }, + { + "source": "npm:ajv@6.12.6", + "target": "npm:fast-json-stable-stringify", + "type": "static" + }, + { + "source": "npm:ajv@6.12.6", + "target": "npm:json-schema-traverse@0.4.1", + "type": "static" + }, + { + "source": "npm:ajv@6.12.6", + "target": "npm:uri-js", + "type": "static" + } + ], + "npm:ajv@8.12.0": [ + { + "source": "npm:ajv@8.12.0", + "target": "npm:fast-deep-equal", + "type": "static" + }, + { + "source": "npm:ajv@8.12.0", + "target": "npm:json-schema-traverse@1.0.0", + "type": "static" + }, + { + "source": "npm:ajv@8.12.0", + "target": "npm:require-from-string", + "type": "static" + }, + { + "source": "npm:ajv@8.12.0", + "target": "npm:uri-js", + "type": "static" + } + ], + "npm:ajv@8.13.0": [ + { + "source": "npm:ajv@8.13.0", + "target": "npm:fast-deep-equal", + "type": "static" + }, + { + "source": "npm:ajv@8.13.0", + "target": "npm:json-schema-traverse@1.0.0", + "type": "static" + }, + { + "source": "npm:ajv@8.13.0", + "target": "npm:require-from-string", + "type": "static" + }, + { + "source": "npm:ajv@8.13.0", + "target": "npm:uri-js", + "type": "static" + } + ], + "npm:ansi-styles@4.3.0": [ + { + "source": "npm:ansi-styles@4.3.0", + "target": "npm:color-convert", + "type": "static" + } + ], + "npm:anymatch": [ + { + "source": "npm:anymatch", + "target": "npm:normalize-path", + "type": "static" + }, + { + "source": "npm:anymatch", + "target": "npm:picomatch@2.3.1", + "type": "static" + } + ], + "npm:archiver-utils": [ + { + "source": "npm:archiver-utils", + "target": "npm:glob", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:is-stream@2.0.1", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:lazystream", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:lodash", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:normalize-path", + "type": "static" + }, + { + "source": "npm:archiver-utils", + "target": "npm:readable-stream@4.7.0", + "type": "static" + } + ], + "npm:archiver": [ + { + "source": "npm:archiver", + "target": "npm:archiver-utils", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:async", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:buffer-crc32", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:readable-stream@4.7.0", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:readdir-glob", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:tar-stream@3.1.7", + "type": "static" + }, + { + "source": "npm:archiver", + "target": "npm:zip-stream", + "type": "static" + } + ], + "npm:argparse@1.0.10": [ + { + "source": "npm:argparse@1.0.10", + "target": "npm:sprintf-js", + "type": "static" + } + ], + "npm:aria-query@5.3.0": [ + { + "source": "npm:aria-query@5.3.0", + "target": "npm:dequal", + "type": "static" + } + ], + "npm:ast-types": [ + { + "source": "npm:ast-types", + "target": "npm:tslib", + "type": "static" + } + ], + "npm:axios": [ + { + "source": "npm:axios", + "target": "npm:follow-redirects", + "type": "static" + }, + { + "source": "npm:axios", + "target": "npm:form-data", + "type": "static" + }, + { + "source": "npm:axios", + "target": "npm:proxy-from-env", + "type": "static" + } + ], + "npm:babel-dead-code-elimination": [ + { + "source": "npm:babel-dead-code-elimination", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:babel-dead-code-elimination", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:babel-dead-code-elimination", + "target": "npm:@babel/traverse", + "type": "static" + }, + { + "source": "npm:babel-dead-code-elimination", + "target": "npm:@babel/types@7.28.5", + "type": "static" + } + ], + "npm:babel-plugin-jsx-dom-expressions": [ + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:@babel/helper-module-imports@7.18.6", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:@babel/plugin-syntax-jsx", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:html-entities", + "type": "static" + }, + { + "source": "npm:babel-plugin-jsx-dom-expressions", + "target": "npm:parse5@7.3.0", + "type": "static" + } + ], + "npm:babel-preset-solid": [ + { + "source": "npm:babel-preset-solid", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:babel-preset-solid", + "target": "npm:babel-plugin-jsx-dom-expressions", + "type": "static" + }, + { + "source": "npm:babel-preset-solid", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:better-path-resolve": [ + { + "source": "npm:better-path-resolve", + "target": "npm:is-windows", + "type": "static" + } + ], + "npm:bidi-js": [ + { + "source": "npm:bidi-js", + "target": "npm:require-from-string", + "type": "static" + } + ], + "npm:bindings": [ + { + "source": "npm:bindings", + "target": "npm:file-uri-to-path", + "type": "static" + } + ], + "npm:bl": [ + { + "source": "npm:bl", + "target": "npm:buffer@5.7.1", + "type": "static" + }, + { + "source": "npm:bl", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:bl", + "target": "npm:readable-stream@3.6.2", + "type": "static" + } + ], + "npm:brace-expansion@1.1.12": [ + { + "source": "npm:brace-expansion@1.1.12", + "target": "npm:balanced-match", + "type": "static" + }, + { + "source": "npm:brace-expansion@1.1.12", + "target": "npm:concat-map", + "type": "static" + } + ], + "npm:brace-expansion@2.0.2": [ + { + "source": "npm:brace-expansion@2.0.2", + "target": "npm:balanced-match", + "type": "static" + } + ], + "npm:braces": [ + { + "source": "npm:braces", + "target": "npm:fill-range", + "type": "static" + } + ], + "npm:browserslist": [ + { + "source": "npm:browserslist", + "target": "npm:baseline-browser-mapping", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:caniuse-lite", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:electron-to-chromium", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:node-releases", + "type": "static" + }, + { + "source": "npm:browserslist", + "target": "npm:update-browserslist-db", + "type": "static" + } + ], + "npm:buffer@5.7.1": [ + { + "source": "npm:buffer@5.7.1", + "target": "npm:base64-js", + "type": "static" + }, + { + "source": "npm:buffer@5.7.1", + "target": "npm:ieee754", + "type": "static" + } + ], + "npm:buffer@6.0.3": [ + { + "source": "npm:buffer@6.0.3", + "target": "npm:base64-js", + "type": "static" + }, + { + "source": "npm:buffer@6.0.3", + "target": "npm:ieee754", + "type": "static" + } + ], + "npm:c12": [ + { + "source": "npm:c12", + "target": "npm:chokidar@4.0.3", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:confbox@0.2.2", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:dotenv@17.2.3", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:exsolve", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:giget", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:ohash", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:perfect-debounce", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:rc9", + "type": "static" + }, + { + "source": "npm:c12", + "target": "npm:magicast", + "type": "static" + } + ], + "npm:call-bind-apply-helpers": [ + { + "source": "npm:call-bind-apply-helpers", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:call-bind-apply-helpers", + "target": "npm:function-bind", + "type": "static" + } + ], + "npm:chalk@4.1.2": [ + { + "source": "npm:chalk@4.1.2", + "target": "npm:ansi-styles@4.3.0", + "type": "static" + }, + { + "source": "npm:chalk@4.1.2", + "target": "npm:supports-color@7.2.0", + "type": "static" + } + ], + "npm:cheerio-select": [ + { + "source": "npm:cheerio-select", + "target": "npm:boolbase", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:css-select", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:css-what", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:cheerio-select", + "target": "npm:domutils", + "type": "static" + } + ], + "npm:cheerio": [ + { + "source": "npm:cheerio", + "target": "npm:cheerio-select", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:dom-serializer", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:domutils", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:encoding-sniffer", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:htmlparser2", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:parse5@7.3.0", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:parse5-htmlparser2-tree-adapter", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:parse5-parser-stream", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:undici", + "type": "static" + }, + { + "source": "npm:cheerio", + "target": "npm:whatwg-mimetype@4.0.0", + "type": "static" + } + ], + "npm:chokidar@3.6.0": [ + { + "source": "npm:chokidar@3.6.0", + "target": "npm:anymatch", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:braces", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:glob-parent@5.1.2", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:is-binary-path", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:normalize-path", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:readdirp@3.6.0", + "type": "static" + }, + { + "source": "npm:chokidar@3.6.0", + "target": "npm:fsevents", + "type": "static" + } + ], + "npm:chokidar@4.0.3": [ + { + "source": "npm:chokidar@4.0.3", + "target": "npm:readdirp@4.1.2", + "type": "static" + } + ], + "npm:citty": [ + { + "source": "npm:citty", + "target": "npm:consola", + "type": "static" + } + ], + "npm:cli-cursor": [ + { + "source": "npm:cli-cursor", + "target": "npm:restore-cursor", + "type": "static" + } + ], + "npm:clipboardy": [ + { + "source": "npm:clipboardy", + "target": "npm:execa", + "type": "static" + }, + { + "source": "npm:clipboardy", + "target": "npm:is-wsl@3.1.0", + "type": "static" + }, + { + "source": "npm:clipboardy", + "target": "npm:is64bit", + "type": "static" + } + ], + "npm:cliui": [ + { + "source": "npm:cliui", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:cliui", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:cliui", + "target": "npm:wrap-ansi@7.0.0", + "type": "static" + } + ], + "npm:color-convert": [ + { + "source": "npm:color-convert", + "target": "npm:color-name", + "type": "static" + } + ], + "npm:combined-stream": [ + { + "source": "npm:combined-stream", + "target": "npm:delayed-stream", + "type": "static" + } + ], + "npm:compare-func": [ + { + "source": "npm:compare-func", + "target": "npm:array-ify", + "type": "static" + }, + { + "source": "npm:compare-func", + "target": "npm:dot-prop@5.3.0", + "type": "static" + } + ], + "npm:compress-commons": [ + { + "source": "npm:compress-commons", + "target": "npm:crc-32", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:crc32-stream", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:is-stream@2.0.1", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:normalize-path", + "type": "static" + }, + { + "source": "npm:compress-commons", + "target": "npm:readable-stream@4.7.0", + "type": "static" + } + ], + "npm:conventional-changelog-angular": [ + { + "source": "npm:conventional-changelog-angular", + "target": "npm:compare-func", + "type": "static" + } + ], + "npm:conventional-commits-parser": [ + { + "source": "npm:conventional-commits-parser", + "target": "npm:JSONStream", + "type": "static" + }, + { + "source": "npm:conventional-commits-parser", + "target": "npm:is-text-path", + "type": "static" + }, + { + "source": "npm:conventional-commits-parser", + "target": "npm:meow", + "type": "static" + }, + { + "source": "npm:conventional-commits-parser", + "target": "npm:split2", + "type": "static" + } + ], + "npm:crc32-stream": [ + { + "source": "npm:crc32-stream", + "target": "npm:crc-32", + "type": "static" + }, + { + "source": "npm:crc32-stream", + "target": "npm:readable-stream@4.7.0", + "type": "static" + } + ], + "npm:cross-spawn": [ + { + "source": "npm:cross-spawn", + "target": "npm:path-key@3.1.1", + "type": "static" + }, + { + "source": "npm:cross-spawn", + "target": "npm:shebang-command", + "type": "static" + }, + { + "source": "npm:cross-spawn", + "target": "npm:which", + "type": "static" + } + ], + "npm:crossws": [ + { + "source": "npm:crossws", + "target": "npm:uncrypto", + "type": "static" + } + ], + "npm:css-select": [ + { + "source": "npm:css-select", + "target": "npm:boolbase", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:css-what", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:domutils", + "type": "static" + }, + { + "source": "npm:css-select", + "target": "npm:nth-check", + "type": "static" + } + ], + "npm:css-tree": [ + { + "source": "npm:css-tree", + "target": "npm:mdn-data", + "type": "static" + }, + { + "source": "npm:css-tree", + "target": "npm:source-map-js", + "type": "static" + } + ], + "npm:cssstyle": [ + { + "source": "npm:cssstyle", + "target": "npm:@asamuzakjp/css-color", + "type": "static" + }, + { + "source": "npm:cssstyle", + "target": "npm:@csstools/css-syntax-patches-for-csstree", + "type": "static" + }, + { + "source": "npm:cssstyle", + "target": "npm:css-tree", + "type": "static" + } + ], + "npm:data-urls": [ + { + "source": "npm:data-urls", + "target": "npm:whatwg-mimetype@4.0.0", + "type": "static" + }, + { + "source": "npm:data-urls", + "target": "npm:whatwg-url@15.1.0", + "type": "static" + } + ], + "npm:debug": [ + { + "source": "npm:debug", + "target": "npm:ms", + "type": "static" + } + ], + "npm:decode-named-character-reference": [ + { + "source": "npm:decode-named-character-reference", + "target": "npm:character-entities", + "type": "static" + } + ], + "npm:defaults": [ + { + "source": "npm:defaults", + "target": "npm:clone", + "type": "static" + } + ], + "npm:devlop": [ + { + "source": "npm:devlop", + "target": "npm:dequal", + "type": "static" + } + ], + "npm:dir-glob": [ + { + "source": "npm:dir-glob", + "target": "npm:path-type@4.0.0", + "type": "static" + } + ], + "npm:dom-serializer": [ + { + "source": "npm:dom-serializer", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:dom-serializer", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:dom-serializer", + "target": "npm:entities@4.5.0", + "type": "static" + } + ], + "npm:domhandler": [ + { + "source": "npm:domhandler", + "target": "npm:domelementtype", + "type": "static" + } + ], + "npm:domutils": [ + { + "source": "npm:domutils", + "target": "npm:dom-serializer", + "type": "static" + }, + { + "source": "npm:domutils", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:domutils", + "target": "npm:domhandler", + "type": "static" + } + ], + "npm:dot-prop@10.1.0": [ + { + "source": "npm:dot-prop@10.1.0", + "target": "npm:type-fest", + "type": "static" + } + ], + "npm:dot-prop@5.3.0": [ + { + "source": "npm:dot-prop@5.3.0", + "target": "npm:is-obj", + "type": "static" + } + ], + "npm:dotenv-expand": [ + { + "source": "npm:dotenv-expand", + "target": "npm:dotenv@16.6.1", + "type": "static" + } + ], + "npm:dunder-proto": [ + { + "source": "npm:dunder-proto", + "target": "npm:call-bind-apply-helpers", + "type": "static" + }, + { + "source": "npm:dunder-proto", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:dunder-proto", + "target": "npm:gopd", + "type": "static" + } + ], + "npm:ecdsa-sig-formatter": [ + { + "source": "npm:ecdsa-sig-formatter", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + } + ], + "npm:encoding-sniffer": [ + { + "source": "npm:encoding-sniffer", + "target": "npm:iconv-lite@0.6.3", + "type": "static" + }, + { + "source": "npm:encoding-sniffer", + "target": "npm:whatwg-encoding", + "type": "static" + } + ], + "npm:end-of-stream": [ + { + "source": "npm:end-of-stream", + "target": "npm:once", + "type": "static" + } + ], + "npm:enhanced-resolve": [ + { + "source": "npm:enhanced-resolve", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:enhanced-resolve", + "target": "npm:tapable", + "type": "static" + } + ], + "npm:enquirer@2.3.6": [ + { + "source": "npm:enquirer@2.3.6", + "target": "npm:ansi-colors", + "type": "static" + } + ], + "npm:enquirer@2.4.1": [ + { + "source": "npm:enquirer@2.4.1", + "target": "npm:ansi-colors", + "type": "static" + }, + { + "source": "npm:enquirer@2.4.1", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + } + ], + "npm:es-object-atoms": [ + { + "source": "npm:es-object-atoms", + "target": "npm:es-errors", + "type": "static" + } + ], + "npm:es-set-tostringtag": [ + { + "source": "npm:es-set-tostringtag", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:es-set-tostringtag", + "target": "npm:get-intrinsic", + "type": "static" + }, + { + "source": "npm:es-set-tostringtag", + "target": "npm:has-tostringtag", + "type": "static" + }, + { + "source": "npm:es-set-tostringtag", + "target": "npm:hasown", + "type": "static" + } + ], + "npm:esbuild": [ + { + "source": "npm:esbuild", + "target": "npm:@esbuild/aix-ppc64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/android-arm", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/android-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/android-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/darwin-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/darwin-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/freebsd-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/freebsd-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-arm", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-ia32", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-loong64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-mips64el", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-ppc64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-riscv64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-s390x", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/linux-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/netbsd-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/netbsd-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/openbsd-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/openbsd-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/openharmony-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/sunos-x64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/win32-arm64", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/win32-ia32", + "type": "static" + }, + { + "source": "npm:esbuild", + "target": "npm:@esbuild/win32-x64", + "type": "static" + } + ], + "npm:eslint-compat-utils": [ + { + "source": "npm:eslint-compat-utils", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-compat-utils", + "target": "npm:semver@7.7.3", + "type": "static" + } + ], + "npm:eslint-import-context": [ + { + "source": "npm:eslint-import-context", + "target": "npm:get-tsconfig", + "type": "static" + }, + { + "source": "npm:eslint-import-context", + "target": "npm:stable-hash-x", + "type": "static" + }, + { + "source": "npm:eslint-import-context", + "target": "npm:unrs-resolver", + "type": "static" + } + ], + "npm:eslint-plugin-es-x": [ + { + "source": "npm:eslint-plugin-es-x", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:eslint-plugin-es-x", + "target": "npm:@eslint-community/regexpp", + "type": "static" + }, + { + "source": "npm:eslint-plugin-es-x", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-es-x", + "target": "npm:eslint-compat-utils", + "type": "static" + } + ], + "npm:eslint-plugin-import-x": [ + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:@typescript-eslint/types@8.46.3", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:comment-parser", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:eslint-import-context", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:stable-hash-x", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:unrs-resolver", + "type": "static" + }, + { + "source": "npm:eslint-plugin-import-x", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + } + ], + "npm:eslint-plugin-n": [ + { + "source": "npm:eslint-plugin-n", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:enhanced-resolve", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:eslint-plugin-es-x", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:get-tsconfig", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:globals@15.15.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:globrex", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:ignore@5.3.2", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:eslint-plugin-n", + "target": "npm:ts-declaration-location", + "type": "static" + } + ], + "npm:eslint-plugin-react-compiler": [ + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:@babel/plugin-proposal-private-methods", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:hermes-parser", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:zod@3.25.76", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-compiler", + "target": "npm:zod-validation-error@3.5.4", + "type": "static" + } + ], + "npm:eslint-plugin-react-dom": [ + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:compare-versions", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-dom", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:eslint-plugin-react-hooks-extra": [ + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks-extra", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:eslint-plugin-react-hooks": [ + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:hermes-parser", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:zod@4.1.13", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-hooks", + "target": "npm:zod-validation-error@4.0.2", + "type": "static" + } + ], + "npm:eslint-plugin-react-naming-convention": [ + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-naming-convention", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:eslint-plugin-react-web-api": [ + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-web-api", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:eslint-plugin-react-x": [ + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/ast", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/core", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/eff", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/shared", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@eslint-react/var", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@typescript-eslint/scope-manager@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@typescript-eslint/types@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:@typescript-eslint/utils@8.48.0", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:compare-versions", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:is-immutable-type", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:string-ts", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:ts-pattern", + "type": "static" + }, + { + "source": "npm:eslint-plugin-react-x", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:eslint-plugin-unused-imports": [ + { + "source": "npm:eslint-plugin-unused-imports", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:eslint-plugin-unused-imports", + "target": "npm:@typescript-eslint/eslint-plugin", + "type": "static" + } + ], + "npm:eslint-scope": [ + { + "source": "npm:eslint-scope", + "target": "npm:esrecurse", + "type": "static" + }, + { + "source": "npm:eslint-scope", + "target": "npm:estraverse", + "type": "static" + } + ], + "npm:eslint": [ + { + "source": "npm:eslint", + "target": "npm:@eslint-community/eslint-utils", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint-community/regexpp", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/config-array", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/config-helpers", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/core", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/eslintrc", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/js", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@eslint/plugin-kit", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@humanfs/node", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@humanwhocodes/module-importer", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@humanwhocodes/retry", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:ajv@6.12.6", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:cross-spawn", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:escape-string-regexp@4.0.0", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:eslint-scope", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:espree", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:esquery", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:esutils", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:fast-deep-equal", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:file-entry-cache", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:find-up@5.0.0", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:glob-parent@6.0.2", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:ignore@5.3.2", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:imurmurhash", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:is-glob", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:json-stable-stringify-without-jsonify", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:lodash.merge", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:minimatch@3.1.2", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:natural-compare", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:optionator", + "type": "static" + }, + { + "source": "npm:eslint", + "target": "npm:jiti", + "type": "static" + } + ], + "npm:espree": [ + { + "source": "npm:espree", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:espree", + "target": "npm:acorn-jsx", + "type": "static" + }, + { + "source": "npm:espree", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + } + ], + "npm:esquery": [ + { + "source": "npm:esquery", + "target": "npm:estraverse", + "type": "static" + } + ], + "npm:esrap": [ + { + "source": "npm:esrap", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + } + ], + "npm:esrecurse": [ + { + "source": "npm:esrecurse", + "target": "npm:estraverse", + "type": "static" + } + ], + "npm:estree-walker@3.0.3": [ + { + "source": "npm:estree-walker@3.0.3", + "target": "npm:@types/estree", + "type": "static" + } + ], + "npm:events-universal": [ + { + "source": "npm:events-universal", + "target": "npm:bare-events", + "type": "static" + } + ], + "npm:execa": [ + { + "source": "npm:execa", + "target": "npm:cross-spawn", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:get-stream", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:human-signals", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:is-stream@3.0.0", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:merge-stream", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:npm-run-path@5.3.0", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:onetime@6.0.0", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:signal-exit@4.1.0", + "type": "static" + }, + { + "source": "npm:execa", + "target": "npm:strip-final-newline", + "type": "static" + } + ], + "npm:fast-glob": [ + { + "source": "npm:fast-glob", + "target": "npm:@nodelib/fs.stat", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:@nodelib/fs.walk", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:glob-parent@5.1.2", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:merge2", + "type": "static" + }, + { + "source": "npm:fast-glob", + "target": "npm:micromatch", + "type": "static" + } + ], + "npm:fastq": [ + { + "source": "npm:fastq", + "target": "npm:reusify", + "type": "static" + } + ], + "npm:fd-package-json": [ + { + "source": "npm:fd-package-json", + "target": "npm:walk-up-path", + "type": "static" + } + ], + "npm:fdir": [ + { + "source": "npm:fdir", + "target": "npm:picomatch@4.0.3", + "type": "static" + } + ], + "npm:fetch-blob": [ + { + "source": "npm:fetch-blob", + "target": "npm:node-domexception", + "type": "static" + }, + { + "source": "npm:fetch-blob", + "target": "npm:web-streams-polyfill", + "type": "static" + } + ], + "npm:figures": [ + { + "source": "npm:figures", + "target": "npm:escape-string-regexp@1.0.5", + "type": "static" + } + ], + "npm:file-entry-cache": [ + { + "source": "npm:file-entry-cache", + "target": "npm:flat-cache", + "type": "static" + } + ], + "npm:fill-range": [ + { + "source": "npm:fill-range", + "target": "npm:to-regex-range", + "type": "static" + } + ], + "npm:find-up@4.1.0": [ + { + "source": "npm:find-up@4.1.0", + "target": "npm:locate-path@5.0.0", + "type": "static" + }, + { + "source": "npm:find-up@4.1.0", + "target": "npm:path-exists", + "type": "static" + } + ], + "npm:find-up@5.0.0": [ + { + "source": "npm:find-up@5.0.0", + "target": "npm:locate-path@6.0.0", + "type": "static" + }, + { + "source": "npm:find-up@5.0.0", + "target": "npm:path-exists", + "type": "static" + } + ], + "npm:flat-cache": [ + { + "source": "npm:flat-cache", + "target": "npm:flatted", + "type": "static" + }, + { + "source": "npm:flat-cache", + "target": "npm:keyv", + "type": "static" + } + ], + "npm:foreground-child": [ + { + "source": "npm:foreground-child", + "target": "npm:cross-spawn", + "type": "static" + }, + { + "source": "npm:foreground-child", + "target": "npm:signal-exit@4.1.0", + "type": "static" + } + ], + "npm:form-data": [ + { + "source": "npm:form-data", + "target": "npm:asynckit", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:combined-stream", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:es-set-tostringtag", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:hasown", + "type": "static" + }, + { + "source": "npm:form-data", + "target": "npm:mime-types@2.1.35", + "type": "static" + } + ], + "npm:formatly": [ + { + "source": "npm:formatly", + "target": "npm:fd-package-json", + "type": "static" + } + ], + "npm:formdata-polyfill": [ + { + "source": "npm:formdata-polyfill", + "target": "npm:fetch-blob", + "type": "static" + } + ], + "npm:front-matter": [ + { + "source": "npm:front-matter", + "target": "npm:js-yaml@3.14.1", + "type": "static" + } + ], + "npm:fs-extra@7.0.1": [ + { + "source": "npm:fs-extra@7.0.1", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:fs-extra@7.0.1", + "target": "npm:jsonfile@4.0.0", + "type": "static" + }, + { + "source": "npm:fs-extra@7.0.1", + "target": "npm:universalify@0.1.2", + "type": "static" + } + ], + "npm:fs-extra@8.1.0": [ + { + "source": "npm:fs-extra@8.1.0", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:fs-extra@8.1.0", + "target": "npm:jsonfile@4.0.0", + "type": "static" + }, + { + "source": "npm:fs-extra@8.1.0", + "target": "npm:universalify@0.1.2", + "type": "static" + } + ], + "npm:gaxios": [ + { + "source": "npm:gaxios", + "target": "npm:extend", + "type": "static" + }, + { + "source": "npm:gaxios", + "target": "npm:https-proxy-agent", + "type": "static" + }, + { + "source": "npm:gaxios", + "target": "npm:node-fetch@3.3.2", + "type": "static" + }, + { + "source": "npm:gaxios", + "target": "npm:rimraf", + "type": "static" + } + ], + "npm:gcp-metadata": [ + { + "source": "npm:gcp-metadata", + "target": "npm:gaxios", + "type": "static" + }, + { + "source": "npm:gcp-metadata", + "target": "npm:google-logging-utils", + "type": "static" + }, + { + "source": "npm:gcp-metadata", + "target": "npm:json-bigint", + "type": "static" + } + ], + "npm:get-intrinsic": [ + { + "source": "npm:get-intrinsic", + "target": "npm:call-bind-apply-helpers", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:es-define-property", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:es-errors", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:es-object-atoms", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:function-bind", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:get-proto", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:gopd", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:has-symbols", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:hasown", + "type": "static" + }, + { + "source": "npm:get-intrinsic", + "target": "npm:math-intrinsics", + "type": "static" + } + ], + "npm:get-proto": [ + { + "source": "npm:get-proto", + "target": "npm:dunder-proto", + "type": "static" + }, + { + "source": "npm:get-proto", + "target": "npm:es-object-atoms", + "type": "static" + } + ], + "npm:get-tsconfig": [ + { + "source": "npm:get-tsconfig", + "target": "npm:resolve-pkg-maps", + "type": "static" + } + ], + "npm:giget": [ + { + "source": "npm:giget", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:node-fetch-native", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:nypm", + "type": "static" + }, + { + "source": "npm:giget", + "target": "npm:pathe@2.0.3", + "type": "static" + } + ], + "npm:glob-parent@5.1.2": [ + { + "source": "npm:glob-parent@5.1.2", + "target": "npm:is-glob", + "type": "static" + } + ], + "npm:glob-parent@6.0.2": [ + { + "source": "npm:glob-parent@6.0.2", + "target": "npm:is-glob", + "type": "static" + } + ], + "npm:glob": [ + { + "source": "npm:glob", + "target": "npm:foreground-child", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:jackspeak", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:minipass", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:package-json-from-dist", + "type": "static" + }, + { + "source": "npm:glob", + "target": "npm:path-scurry", + "type": "static" + } + ], + "npm:globby@11.1.0": [ + { + "source": "npm:globby@11.1.0", + "target": "npm:array-union", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:dir-glob", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:ignore@5.3.2", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:merge2", + "type": "static" + }, + { + "source": "npm:globby@11.1.0", + "target": "npm:slash@3.0.0", + "type": "static" + } + ], + "npm:globby@15.0.0": [ + { + "source": "npm:globby@15.0.0", + "target": "npm:@sindresorhus/merge-streams", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:ignore@7.0.5", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:path-type@6.0.0", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:slash@5.1.0", + "type": "static" + }, + { + "source": "npm:globby@15.0.0", + "target": "npm:unicorn-magic", + "type": "static" + } + ], + "npm:goober": [ + { + "source": "npm:goober", + "target": "npm:csstype@3.2.3", + "type": "static" + } + ], + "npm:google-auth-library": [ + { + "source": "npm:google-auth-library", + "target": "npm:base64-js", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:ecdsa-sig-formatter", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:gaxios", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:gcp-metadata", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:google-logging-utils", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:gtoken", + "type": "static" + }, + { + "source": "npm:google-auth-library", + "target": "npm:jws", + "type": "static" + } + ], + "npm:gtoken": [ + { + "source": "npm:gtoken", + "target": "npm:gaxios", + "type": "static" + }, + { + "source": "npm:gtoken", + "target": "npm:jws", + "type": "static" + } + ], + "npm:gzip-size": [ + { + "source": "npm:gzip-size", + "target": "npm:duplexer", + "type": "static" + } + ], + "npm:h3@1.15.4": [ + { + "source": "npm:h3@1.15.4", + "target": "npm:cookie-es@1.2.2", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:crossws", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:iron-webcrypto", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:node-mock-http", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:radix3", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:h3@1.15.4", + "target": "npm:uncrypto", + "type": "static" + } + ], + "npm:h3@2.0.0-beta.5": [ + { + "source": "npm:h3@2.0.0-beta.5", + "target": "npm:cookie-es@2.0.0", + "type": "static" + }, + { + "source": "npm:h3@2.0.0-beta.5", + "target": "npm:fetchdts", + "type": "static" + }, + { + "source": "npm:h3@2.0.0-beta.5", + "target": "npm:rou3", + "type": "static" + }, + { + "source": "npm:h3@2.0.0-beta.5", + "target": "npm:srvx", + "type": "static" + } + ], + "npm:h3-v2": [ + { + "source": "npm:h3-v2", + "target": "npm:cookie-es@2.0.0", + "type": "static" + }, + { + "source": "npm:h3-v2", + "target": "npm:fetchdts", + "type": "static" + }, + { + "source": "npm:h3-v2", + "target": "npm:rou3", + "type": "static" + }, + { + "source": "npm:h3-v2", + "target": "npm:srvx", + "type": "static" + } + ], + "npm:happy-dom": [ + { + "source": "npm:happy-dom", + "target": "npm:@types/node@20.19.25", + "type": "static" + }, + { + "source": "npm:happy-dom", + "target": "npm:@types/whatwg-mimetype", + "type": "static" + }, + { + "source": "npm:happy-dom", + "target": "npm:whatwg-mimetype@3.0.0", + "type": "static" + } + ], + "npm:has-tostringtag": [ + { + "source": "npm:has-tostringtag", + "target": "npm:has-symbols", + "type": "static" + } + ], + "npm:hasown": [ + { + "source": "npm:hasown", + "target": "npm:function-bind", + "type": "static" + } + ], + "npm:hast-util-from-parse5": [ + { + "source": "npm:hast-util-from-parse5", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:hastscript", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:property-information@7.1.0", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:vfile-location", + "type": "static" + }, + { + "source": "npm:hast-util-from-parse5", + "target": "npm:web-namespaces", + "type": "static" + } + ], + "npm:hast-util-is-element": [ + { + "source": "npm:hast-util-is-element", + "target": "npm:@types/hast", + "type": "static" + } + ], + "npm:hast-util-parse-selector": [ + { + "source": "npm:hast-util-parse-selector", + "target": "npm:@types/hast", + "type": "static" + } + ], + "npm:hast-util-raw": [ + { + "source": "npm:hast-util-raw", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:@ungap/structured-clone", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:hast-util-from-parse5", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:hast-util-to-parse5", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:html-void-elements", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:mdast-util-to-hast", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:parse5@7.3.0", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:unist-util-position", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:vfile", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:web-namespaces", + "type": "static" + }, + { + "source": "npm:hast-util-raw", + "target": "npm:zwitch", + "type": "static" + } + ], + "npm:hast-util-sanitize": [ + { + "source": "npm:hast-util-sanitize", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-sanitize", + "target": "npm:@ungap/structured-clone", + "type": "static" + }, + { + "source": "npm:hast-util-sanitize", + "target": "npm:unist-util-position", + "type": "static" + } + ], + "npm:hast-util-to-jsx-runtime": [ + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:comma-separated-tokens", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:estree-util-is-identifier-name", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:hast-util-whitespace", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:mdast-util-mdx-expression", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:mdast-util-mdx-jsx", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:mdast-util-mdxjs-esm", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:property-information@7.1.0", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:space-separated-tokens", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:style-to-js", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:unist-util-position", + "type": "static" + }, + { + "source": "npm:hast-util-to-jsx-runtime", + "target": "npm:vfile-message", + "type": "static" + } + ], + "npm:hast-util-to-parse5": [ + { + "source": "npm:hast-util-to-parse5", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:comma-separated-tokens", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:property-information@6.5.0", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:space-separated-tokens", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:web-namespaces", + "type": "static" + }, + { + "source": "npm:hast-util-to-parse5", + "target": "npm:zwitch", + "type": "static" + } + ], + "npm:hast-util-to-text": [ + { + "source": "npm:hast-util-to-text", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hast-util-to-text", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:hast-util-to-text", + "target": "npm:hast-util-is-element", + "type": "static" + }, + { + "source": "npm:hast-util-to-text", + "target": "npm:unist-util-find-after", + "type": "static" + } + ], + "npm:hast-util-whitespace": [ + { + "source": "npm:hast-util-whitespace", + "target": "npm:@types/hast", + "type": "static" + } + ], + "npm:hastscript": [ + { + "source": "npm:hastscript", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:comma-separated-tokens", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:hast-util-parse-selector", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:property-information@7.1.0", + "type": "static" + }, + { + "source": "npm:hastscript", + "target": "npm:space-separated-tokens", + "type": "static" + } + ], + "npm:hermes-parser": [ + { + "source": "npm:hermes-parser", + "target": "npm:hermes-estree", + "type": "static" + } + ], + "npm:html-encoding-sniffer": [ + { + "source": "npm:html-encoding-sniffer", + "target": "npm:whatwg-encoding", + "type": "static" + } + ], + "npm:html-link-extractor": [ + { + "source": "npm:html-link-extractor", + "target": "npm:cheerio", + "type": "static" + } + ], + "npm:htmlparser2": [ + { + "source": "npm:htmlparser2", + "target": "npm:domelementtype", + "type": "static" + }, + { + "source": "npm:htmlparser2", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:htmlparser2", + "target": "npm:domutils", + "type": "static" + }, + { + "source": "npm:htmlparser2", + "target": "npm:entities@6.0.1", + "type": "static" + } + ], + "npm:http-errors": [ + { + "source": "npm:http-errors", + "target": "npm:depd", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:setprototypeof", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:statuses@2.0.1", + "type": "static" + }, + { + "source": "npm:http-errors", + "target": "npm:toidentifier", + "type": "static" + } + ], + "npm:http-proxy-agent": [ + { + "source": "npm:http-proxy-agent", + "target": "npm:agent-base", + "type": "static" + }, + { + "source": "npm:http-proxy-agent", + "target": "npm:debug", + "type": "static" + } + ], + "npm:https-proxy-agent": [ + { + "source": "npm:https-proxy-agent", + "target": "npm:agent-base", + "type": "static" + }, + { + "source": "npm:https-proxy-agent", + "target": "npm:debug", + "type": "static" + } + ], + "npm:iconv-lite@0.6.3": [ + { + "source": "npm:iconv-lite@0.6.3", + "target": "npm:safer-buffer", + "type": "static" + } + ], + "npm:iconv-lite@0.7.0": [ + { + "source": "npm:iconv-lite@0.7.0", + "target": "npm:safer-buffer", + "type": "static" + } + ], + "npm:import-fresh": [ + { + "source": "npm:import-fresh", + "target": "npm:parent-module", + "type": "static" + }, + { + "source": "npm:import-fresh", + "target": "npm:resolve-from@4.0.0", + "type": "static" + } + ], + "npm:ioredis": [ + { + "source": "npm:ioredis", + "target": "npm:@ioredis/commands", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:cluster-key-slot", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:denque", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:lodash.defaults", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:lodash.isarguments", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:redis-errors", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:redis-parser", + "type": "static" + }, + { + "source": "npm:ioredis", + "target": "npm:standard-as-callback", + "type": "static" + } + ], + "npm:is-alphanumerical": [ + { + "source": "npm:is-alphanumerical", + "target": "npm:is-alphabetical", + "type": "static" + }, + { + "source": "npm:is-alphanumerical", + "target": "npm:is-decimal", + "type": "static" + } + ], + "npm:is-binary-path": [ + { + "source": "npm:is-binary-path", + "target": "npm:binary-extensions", + "type": "static" + } + ], + "npm:is-core-module": [ + { + "source": "npm:is-core-module", + "target": "npm:hasown", + "type": "static" + } + ], + "npm:is-glob": [ + { + "source": "npm:is-glob", + "target": "npm:is-extglob", + "type": "static" + } + ], + "npm:is-immutable-type": [ + { + "source": "npm:is-immutable-type", + "target": "npm:@typescript-eslint/type-utils@8.48.0", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:ts-api-utils", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:ts-declaration-location", + "type": "static" + }, + { + "source": "npm:is-immutable-type", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:is-inside-container": [ + { + "source": "npm:is-inside-container", + "target": "npm:is-docker@3.0.0", + "type": "static" + } + ], + "npm:is-reference@1.2.1": [ + { + "source": "npm:is-reference@1.2.1", + "target": "npm:@types/estree", + "type": "static" + } + ], + "npm:is-reference@3.0.3": [ + { + "source": "npm:is-reference@3.0.3", + "target": "npm:@types/estree", + "type": "static" + } + ], + "npm:is-subdir": [ + { + "source": "npm:is-subdir", + "target": "npm:better-path-resolve", + "type": "static" + } + ], + "npm:is-text-path": [ + { + "source": "npm:is-text-path", + "target": "npm:text-extensions", + "type": "static" + } + ], + "npm:is-wsl@2.2.0": [ + { + "source": "npm:is-wsl@2.2.0", + "target": "npm:is-docker@2.2.1", + "type": "static" + } + ], + "npm:is-wsl@3.1.0": [ + { + "source": "npm:is-wsl@3.1.0", + "target": "npm:is-inside-container", + "type": "static" + } + ], + "npm:is64bit": [ + { + "source": "npm:is64bit", + "target": "npm:system-architecture", + "type": "static" + } + ], + "npm:jackspeak": [ + { + "source": "npm:jackspeak", + "target": "npm:@isaacs/cliui", + "type": "static" + }, + { + "source": "npm:jackspeak", + "target": "npm:@pkgjs/parseargs", + "type": "static" + } + ], + "npm:jest-diff": [ + { + "source": "npm:jest-diff", + "target": "npm:@jest/diff-sequences", + "type": "static" + }, + { + "source": "npm:jest-diff", + "target": "npm:@jest/get-type", + "type": "static" + }, + { + "source": "npm:jest-diff", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:jest-diff", + "target": "npm:pretty-format@30.2.0", + "type": "static" + } + ], + "npm:js-yaml@3.14.1": [ + { + "source": "npm:js-yaml@3.14.1", + "target": "npm:argparse@1.0.10", + "type": "static" + }, + { + "source": "npm:js-yaml@3.14.1", + "target": "npm:esprima", + "type": "static" + } + ], + "npm:js-yaml@4.1.1": [ + { + "source": "npm:js-yaml@4.1.1", + "target": "npm:argparse@2.0.1", + "type": "static" + } + ], + "npm:jsdom": [ + { + "source": "npm:jsdom", + "target": "npm:@acemir/cssom", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:@asamuzakjp/dom-selector", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:cssstyle", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:data-urls", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:decimal.js", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:html-encoding-sniffer", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:http-proxy-agent", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:https-proxy-agent", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:is-potential-custom-element-name", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:parse5@8.0.0", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:saxes", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:symbol-tree", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:tough-cookie", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:w3c-xmlserializer", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:webidl-conversions@8.0.0", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:whatwg-encoding", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:whatwg-mimetype@4.0.0", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:whatwg-url@15.1.0", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:ws", + "type": "static" + }, + { + "source": "npm:jsdom", + "target": "npm:xml-name-validator", + "type": "static" + } + ], + "npm:json-bigint": [ + { + "source": "npm:json-bigint", + "target": "npm:bignumber.js", + "type": "static" + } + ], + "npm:json-schema-to-ts": [ + { + "source": "npm:json-schema-to-ts", + "target": "npm:@babel/runtime", + "type": "static" + }, + { + "source": "npm:json-schema-to-ts", + "target": "npm:ts-algebra", + "type": "static" + } + ], + "npm:jsonfile@4.0.0": [ + { + "source": "npm:jsonfile@4.0.0", + "target": "npm:graceful-fs", + "type": "static" + } + ], + "npm:jsonfile@6.2.0": [ + { + "source": "npm:jsonfile@6.2.0", + "target": "npm:universalify@2.0.1", + "type": "static" + }, + { + "source": "npm:jsonfile@6.2.0", + "target": "npm:graceful-fs", + "type": "static" + } + ], + "npm:jwa": [ + { + "source": "npm:jwa", + "target": "npm:buffer-equal-constant-time", + "type": "static" + }, + { + "source": "npm:jwa", + "target": "npm:ecdsa-sig-formatter", + "type": "static" + }, + { + "source": "npm:jwa", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + } + ], + "npm:jws": [ + { + "source": "npm:jws", + "target": "npm:jwa", + "type": "static" + }, + { + "source": "npm:jws", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + } + ], + "npm:keyv": [ + { + "source": "npm:keyv", + "target": "npm:json-buffer", + "type": "static" + } + ], + "npm:knip": [ + { + "source": "npm:knip", + "target": "npm:@nodelib/fs.walk", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:fast-glob", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:formatly", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:js-yaml@4.1.1", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:minimist", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:oxc-resolver", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:smol-toml", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:strip-json-comments@5.0.3", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:knip", + "target": "npm:zod@4.1.13", + "type": "static" + } + ], + "npm:lazystream": [ + { + "source": "npm:lazystream", + "target": "npm:readable-stream@2.3.8", + "type": "static" + } + ], + "npm:levn": [ + { + "source": "npm:levn", + "target": "npm:prelude-ls", + "type": "static" + }, + { + "source": "npm:levn", + "target": "npm:type-check", + "type": "static" + } + ], + "npm:lightningcss": [ + { + "source": "npm:lightningcss", + "target": "npm:detect-libc@2.1.2", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-android-arm64", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-darwin-arm64", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-darwin-x64", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-freebsd-x64", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:lightningcss", + "target": "npm:lightningcss-win32-x64-msvc", + "type": "static" + } + ], + "npm:linkify-it": [ + { + "source": "npm:linkify-it", + "target": "npm:uc.micro", + "type": "static" + } + ], + "npm:listhen": [ + { + "source": "npm:listhen", + "target": "npm:@parcel/watcher", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:@parcel/watcher-wasm", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:clipboardy", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:crossws", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:get-port-please", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:h3@1.15.4", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:http-shutdown", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:node-forge", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:pathe@1.1.2", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:std-env", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:untun", + "type": "static" + }, + { + "source": "npm:listhen", + "target": "npm:uqr", + "type": "static" + } + ], + "npm:local-pkg@0.5.1": [ + { + "source": "npm:local-pkg@0.5.1", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:local-pkg@0.5.1", + "target": "npm:pkg-types@1.3.1", + "type": "static" + } + ], + "npm:local-pkg@1.1.2": [ + { + "source": "npm:local-pkg@1.1.2", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:local-pkg@1.1.2", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:local-pkg@1.1.2", + "target": "npm:quansync", + "type": "static" + } + ], + "npm:locate-path@5.0.0": [ + { + "source": "npm:locate-path@5.0.0", + "target": "npm:p-locate@4.1.0", + "type": "static" + } + ], + "npm:locate-path@6.0.0": [ + { + "source": "npm:locate-path@6.0.0", + "target": "npm:p-locate@5.0.0", + "type": "static" + } + ], + "npm:log-symbols": [ + { + "source": "npm:log-symbols", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:log-symbols", + "target": "npm:is-unicode-supported", + "type": "static" + } + ], + "npm:lowlight": [ + { + "source": "npm:lowlight", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:lowlight", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:lowlight", + "target": "npm:highlight.js", + "type": "static" + } + ], + "npm:lru-cache@5.1.1": [ + { + "source": "npm:lru-cache@5.1.1", + "target": "npm:yallist@3.1.1", + "type": "static" + } + ], + "npm:lru-cache@6.0.0": [ + { + "source": "npm:lru-cache@6.0.0", + "target": "npm:yallist@4.0.0", + "type": "static" + } + ], + "npm:lucide-react": [ + { + "source": "npm:lucide-react", + "target": "npm:react", + "type": "static" + } + ], + "npm:magic-string": [ + { + "source": "npm:magic-string", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + } + ], + "npm:magicast": [ + { + "source": "npm:magicast", + "target": "npm:@babel/parser@7.28.5", + "type": "static" + }, + { + "source": "npm:magicast", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:magicast", + "target": "npm:source-map-js", + "type": "static" + } + ], + "npm:markdown-it": [ + { + "source": "npm:markdown-it", + "target": "npm:argparse@2.0.1", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:entities@4.5.0", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:linkify-it", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:mdurl", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:punycode.js", + "type": "static" + }, + { + "source": "npm:markdown-it", + "target": "npm:uc.micro", + "type": "static" + } + ], + "npm:markdown-link-extractor": [ + { + "source": "npm:markdown-link-extractor", + "target": "npm:html-link-extractor", + "type": "static" + }, + { + "source": "npm:markdown-link-extractor", + "target": "npm:marked", + "type": "static" + } + ], + "npm:mdast-util-find-and-replace": [ + { + "source": "npm:mdast-util-find-and-replace", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-find-and-replace", + "target": "npm:escape-string-regexp@5.0.0", + "type": "static" + }, + { + "source": "npm:mdast-util-find-and-replace", + "target": "npm:unist-util-is", + "type": "static" + }, + { + "source": "npm:mdast-util-find-and-replace", + "target": "npm:unist-util-visit-parents", + "type": "static" + } + ], + "npm:mdast-util-from-markdown": [ + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:mdast-util-to-string", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-decode-numeric-character-reference", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-decode-string", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:mdast-util-from-markdown", + "target": "npm:unist-util-stringify-position", + "type": "static" + } + ], + "npm:mdast-util-gfm-autolink-literal": [ + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:ccount", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:mdast-util-find-and-replace", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-autolink-literal", + "target": "npm:micromark-util-character", + "type": "static" + } + ], + "npm:mdast-util-gfm-footnote": [ + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-footnote", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + } + ], + "npm:mdast-util-gfm-strikethrough": [ + { + "source": "npm:mdast-util-gfm-strikethrough", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-strikethrough", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-strikethrough", + "target": "npm:mdast-util-to-markdown", + "type": "static" + } + ], + "npm:mdast-util-gfm-table": [ + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:markdown-table", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-table", + "target": "npm:mdast-util-to-markdown", + "type": "static" + } + ], + "npm:mdast-util-gfm-task-list-item": [ + { + "source": "npm:mdast-util-gfm-task-list-item", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-task-list-item", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-task-list-item", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm-task-list-item", + "target": "npm:mdast-util-to-markdown", + "type": "static" + } + ], + "npm:mdast-util-gfm": [ + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-autolink-literal", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-footnote", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-strikethrough", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-table", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-gfm-task-list-item", + "type": "static" + }, + { + "source": "npm:mdast-util-gfm", + "target": "npm:mdast-util-to-markdown", + "type": "static" + } + ], + "npm:mdast-util-mdx-expression": [ + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:@types/estree-jsx", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-expression", + "target": "npm:mdast-util-to-markdown", + "type": "static" + } + ], + "npm:mdast-util-mdx-jsx": [ + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:@types/estree-jsx", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:ccount", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:parse-entities", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:stringify-entities", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:unist-util-stringify-position", + "type": "static" + }, + { + "source": "npm:mdast-util-mdx-jsx", + "target": "npm:vfile-message", + "type": "static" + } + ], + "npm:mdast-util-mdxjs-esm": [ + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:@types/estree-jsx", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:mdast-util-mdxjs-esm", + "target": "npm:mdast-util-to-markdown", + "type": "static" + } + ], + "npm:mdast-util-phrasing": [ + { + "source": "npm:mdast-util-phrasing", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-phrasing", + "target": "npm:unist-util-is", + "type": "static" + } + ], + "npm:mdast-util-to-hast": [ + { + "source": "npm:mdast-util-to-hast", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:@ungap/structured-clone", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:micromark-util-sanitize-uri", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:trim-lines", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:unist-util-position", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:mdast-util-to-hast", + "target": "npm:vfile", + "type": "static" + } + ], + "npm:mdast-util-to-markdown": [ + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:longest-streak", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:mdast-util-phrasing", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:mdast-util-to-string", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:micromark-util-classify-character", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:micromark-util-decode-string", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:mdast-util-to-markdown", + "target": "npm:zwitch", + "type": "static" + } + ], + "npm:mdast-util-to-string": [ + { + "source": "npm:mdast-util-to-string", + "target": "npm:@types/mdast", + "type": "static" + } + ], + "npm:merge-anything": [ + { + "source": "npm:merge-anything", + "target": "npm:is-what", + "type": "static" + } + ], + "npm:micromark-core-commonmark": [ + { + "source": "npm:micromark-core-commonmark", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-destination", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-label", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-title", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-factory-whitespace", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-classify-character", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-html-tag-name", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-resolve-all", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-subtokenize", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-core-commonmark", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-extension-gfm-autolink-literal": [ + { + "source": "npm:micromark-extension-gfm-autolink-literal", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-autolink-literal", + "target": "npm:micromark-util-sanitize-uri", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-autolink-literal", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-autolink-literal", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-extension-gfm-footnote": [ + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-core-commonmark", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-sanitize-uri", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-footnote", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-extension-gfm-strikethrough": [ + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-classify-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-resolve-all", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-strikethrough", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-extension-gfm-table": [ + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-table", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-extension-gfm-tagfilter": [ + { + "source": "npm:micromark-extension-gfm-tagfilter", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-extension-gfm-task-list-item": [ + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm-task-list-item", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-extension-gfm": [ + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-autolink-literal", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-footnote", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-strikethrough", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-table", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-tagfilter", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-extension-gfm-task-list-item", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-util-combine-extensions", + "type": "static" + }, + { + "source": "npm:micromark-extension-gfm", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-factory-destination": [ + { + "source": "npm:micromark-factory-destination", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-destination", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-factory-destination", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-factory-label": [ + { + "source": "npm:micromark-factory-label", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-factory-label", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-label", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-factory-label", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-factory-space": [ + { + "source": "npm:micromark-factory-space", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-space", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-factory-title": [ + { + "source": "npm:micromark-factory-title", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-factory-title", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-title", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-factory-title", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-factory-whitespace": [ + { + "source": "npm:micromark-factory-whitespace", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark-factory-whitespace", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-factory-whitespace", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-factory-whitespace", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-util-character": [ + { + "source": "npm:micromark-util-character", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-character", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-util-chunked": [ + { + "source": "npm:micromark-util-chunked", + "target": "npm:micromark-util-symbol", + "type": "static" + } + ], + "npm:micromark-util-classify-character": [ + { + "source": "npm:micromark-util-classify-character", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-util-classify-character", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-classify-character", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-util-combine-extensions": [ + { + "source": "npm:micromark-util-combine-extensions", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark-util-combine-extensions", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-util-decode-numeric-character-reference": [ + { + "source": "npm:micromark-util-decode-numeric-character-reference", + "target": "npm:micromark-util-symbol", + "type": "static" + } + ], + "npm:micromark-util-decode-string": [ + { + "source": "npm:micromark-util-decode-string", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:micromark-util-decode-string", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-util-decode-string", + "target": "npm:micromark-util-decode-numeric-character-reference", + "type": "static" + }, + { + "source": "npm:micromark-util-decode-string", + "target": "npm:micromark-util-symbol", + "type": "static" + } + ], + "npm:micromark-util-normalize-identifier": [ + { + "source": "npm:micromark-util-normalize-identifier", + "target": "npm:micromark-util-symbol", + "type": "static" + } + ], + "npm:micromark-util-resolve-all": [ + { + "source": "npm:micromark-util-resolve-all", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark-util-sanitize-uri": [ + { + "source": "npm:micromark-util-sanitize-uri", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark-util-sanitize-uri", + "target": "npm:micromark-util-encode", + "type": "static" + }, + { + "source": "npm:micromark-util-sanitize-uri", + "target": "npm:micromark-util-symbol", + "type": "static" + } + ], + "npm:micromark-util-subtokenize": [ + { + "source": "npm:micromark-util-subtokenize", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark-util-subtokenize", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark-util-subtokenize", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark-util-subtokenize", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromark": [ + { + "source": "npm:micromark", + "target": "npm:@types/debug", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-core-commonmark", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-factory-space", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-character", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-chunked", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-combine-extensions", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-decode-numeric-character-reference", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-encode", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-normalize-identifier", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-resolve-all", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-sanitize-uri", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-subtokenize", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-symbol", + "type": "static" + }, + { + "source": "npm:micromark", + "target": "npm:micromark-util-types", + "type": "static" + } + ], + "npm:micromatch": [ + { + "source": "npm:micromatch", + "target": "npm:braces", + "type": "static" + }, + { + "source": "npm:micromatch", + "target": "npm:picomatch@2.3.1", + "type": "static" + } + ], + "npm:mime-types@2.1.35": [ + { + "source": "npm:mime-types@2.1.35", + "target": "npm:mime-db@1.52.0", + "type": "static" + } + ], + "npm:mime-types@3.0.1": [ + { + "source": "npm:mime-types@3.0.1", + "target": "npm:mime-db@1.54.0", + "type": "static" + } + ], + "npm:minimatch@3.0.8": [ + { + "source": "npm:minimatch@3.0.8", + "target": "npm:brace-expansion@1.1.12", + "type": "static" + } + ], + "npm:minimatch@3.1.2": [ + { + "source": "npm:minimatch@3.1.2", + "target": "npm:brace-expansion@1.1.12", + "type": "static" + } + ], + "npm:minimatch@5.1.6": [ + { + "source": "npm:minimatch@5.1.6", + "target": "npm:brace-expansion@2.0.2", + "type": "static" + } + ], + "npm:minimatch@9.0.3": [ + { + "source": "npm:minimatch@9.0.3", + "target": "npm:brace-expansion@2.0.2", + "type": "static" + } + ], + "npm:minimatch@9.0.5": [ + { + "source": "npm:minimatch@9.0.5", + "target": "npm:brace-expansion@2.0.2", + "type": "static" + } + ], + "npm:minizlib": [ + { + "source": "npm:minizlib", + "target": "npm:minipass", + "type": "static" + } + ], + "npm:mlly": [ + { + "source": "npm:mlly", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:mlly", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:mlly", + "target": "npm:pkg-types@1.3.1", + "type": "static" + }, + { + "source": "npm:mlly", + "target": "npm:ufo", + "type": "static" + } + ], + "npm:nanospinner": [ + { + "source": "npm:nanospinner", + "target": "npm:picocolors", + "type": "static" + } + ], + "npm:nitropack": [ + { + "source": "npm:nitropack", + "target": "npm:@cloudflare/kv-asset-handler", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-alias", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-commonjs", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-inject", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-json", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-node-resolve", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-replace", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@rollup/plugin-terser", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:@vercel/nft", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:archiver", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:c12", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:chokidar@4.0.3", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:compatx", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:confbox@0.2.2", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:cookie-es@2.0.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:croner", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:crossws", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:db0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:dot-prop@10.1.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:escape-string-regexp@5.0.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:etag", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:exsolve", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:globby@15.0.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:gzip-size", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:h3@1.15.4", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:hookable", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:httpxy", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ioredis", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:klona", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:knitwork", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:listhen", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:magicast", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:mime@4.1.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:node-fetch-native", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:node-mock-http", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ofetch", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ohash", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:perfect-debounce", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:pretty-bytes", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:radix3", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:rollup-plugin-visualizer", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:scule", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:serve-placeholder", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:serve-static", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:source-map@0.7.6", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:std-env", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:ultrahtml", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:uncrypto", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unctx", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unenv", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unimport", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unplugin-utils", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unstorage", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:untyped", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:unwasm", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:youch", + "type": "static" + }, + { + "source": "npm:nitropack", + "target": "npm:youch-core", + "type": "static" + } + ], + "npm:node-fetch@2.7.0": [ + { + "source": "npm:node-fetch@2.7.0", + "target": "npm:whatwg-url@5.0.0", + "type": "static" + } + ], + "npm:node-fetch@3.3.2": [ + { + "source": "npm:node-fetch@3.3.2", + "target": "npm:data-uri-to-buffer", + "type": "static" + }, + { + "source": "npm:node-fetch@3.3.2", + "target": "npm:fetch-blob", + "type": "static" + }, + { + "source": "npm:node-fetch@3.3.2", + "target": "npm:formdata-polyfill", + "type": "static" + } + ], + "npm:nopt": [ + { + "source": "npm:nopt", + "target": "npm:abbrev", + "type": "static" + } + ], + "npm:npm-run-path@4.0.1": [ + { + "source": "npm:npm-run-path@4.0.1", + "target": "npm:path-key@3.1.1", + "type": "static" + } + ], + "npm:npm-run-path@5.3.0": [ + { + "source": "npm:npm-run-path@5.3.0", + "target": "npm:path-key@4.0.0", + "type": "static" + } + ], + "npm:nth-check": [ + { + "source": "npm:nth-check", + "target": "npm:boolbase", + "type": "static" + } + ], + "npm:nx": [ + { + "source": "npm:nx", + "target": "npm:@napi-rs/wasm-runtime@0.2.4", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@yarnpkg/lockfile", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@yarnpkg/parsers", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@zkochan/js-yaml", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:axios", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:cli-cursor", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:cli-spinners", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:cliui", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:dotenv@16.4.7", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:dotenv-expand", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:enquirer@2.3.6", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:figures", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:flat", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:front-matter", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:ignore@7.0.5", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:jest-diff", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:jsonc-parser", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:lines-and-columns", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:minimatch@9.0.3", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:node-machine-id", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:npm-run-path@4.0.1", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:open", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:ora", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:resolve.exports", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:semver@7.7.3", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tar-stream@2.2.0", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tmp", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tree-kill", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tsconfig-paths", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:tslib", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:yaml", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:yargs-parser", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-darwin-arm64", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-darwin-x64", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-freebsd-x64", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:nx", + "target": "npm:@nx/nx-win32-x64-msvc", + "type": "static" + } + ], + "npm:nypm": [ + { + "source": "npm:nypm", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:nypm", + "target": "npm:tinyexec@1.0.1", + "type": "static" + } + ], + "npm:ofetch": [ + { + "source": "npm:ofetch", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:ofetch", + "target": "npm:node-fetch-native", + "type": "static" + }, + { + "source": "npm:ofetch", + "target": "npm:ufo", + "type": "static" + } + ], + "npm:ollama": [ + { + "source": "npm:ollama", + "target": "npm:whatwg-fetch", + "type": "static" + } + ], + "npm:on-finished": [ + { + "source": "npm:on-finished", + "target": "npm:ee-first", + "type": "static" + } + ], + "npm:once": [ + { + "source": "npm:once", + "target": "npm:wrappy", + "type": "static" + } + ], + "npm:onetime@5.1.2": [ + { + "source": "npm:onetime@5.1.2", + "target": "npm:mimic-fn@2.1.0", + "type": "static" + } + ], + "npm:onetime@6.0.0": [ + { + "source": "npm:onetime@6.0.0", + "target": "npm:mimic-fn@4.0.0", + "type": "static" + } + ], + "npm:open": [ + { + "source": "npm:open", + "target": "npm:define-lazy-prop", + "type": "static" + }, + { + "source": "npm:open", + "target": "npm:is-docker@2.2.1", + "type": "static" + }, + { + "source": "npm:open", + "target": "npm:is-wsl@2.2.0", + "type": "static" + } + ], + "npm:openai": [ + { + "source": "npm:openai", + "target": "npm:ws", + "type": "static" + }, + { + "source": "npm:openai", + "target": "npm:zod@4.1.13", + "type": "static" + } + ], + "npm:optionator": [ + { + "source": "npm:optionator", + "target": "npm:deep-is", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:fast-levenshtein", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:levn", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:prelude-ls", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:type-check", + "type": "static" + }, + { + "source": "npm:optionator", + "target": "npm:word-wrap", + "type": "static" + } + ], + "npm:ora": [ + { + "source": "npm:ora", + "target": "npm:bl", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:chalk@4.1.2", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:cli-cursor", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:cli-spinners", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:is-interactive", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:log-symbols", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + }, + { + "source": "npm:ora", + "target": "npm:wcwidth", + "type": "static" + } + ], + "npm:oxc-resolver": [ + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-android-arm-eabi", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-android-arm64", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-darwin-arm64", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-darwin-x64", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-freebsd-x64", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-arm-musleabihf", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-ppc64-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-riscv64-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-riscv64-musl", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-s390x-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-wasm32-wasi", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-win32-ia32-msvc", + "type": "static" + }, + { + "source": "npm:oxc-resolver", + "target": "npm:@oxc-resolver/binding-win32-x64-msvc", + "type": "static" + } + ], + "npm:p-filter": [ + { + "source": "npm:p-filter", + "target": "npm:p-map", + "type": "static" + } + ], + "npm:p-limit@2.3.0": [ + { + "source": "npm:p-limit@2.3.0", + "target": "npm:p-try", + "type": "static" + } + ], + "npm:p-limit@3.1.0": [ + { + "source": "npm:p-limit@3.1.0", + "target": "npm:yocto-queue", + "type": "static" + } + ], + "npm:p-locate@4.1.0": [ + { + "source": "npm:p-locate@4.1.0", + "target": "npm:p-limit@2.3.0", + "type": "static" + } + ], + "npm:p-locate@5.0.0": [ + { + "source": "npm:p-locate@5.0.0", + "target": "npm:p-limit@3.1.0", + "type": "static" + } + ], + "npm:package-manager-detector@0.2.11": [ + { + "source": "npm:package-manager-detector@0.2.11", + "target": "npm:quansync", + "type": "static" + } + ], + "npm:parent-module": [ + { + "source": "npm:parent-module", + "target": "npm:callsites", + "type": "static" + } + ], + "npm:parse-entities": [ + { + "source": "npm:parse-entities", + "target": "npm:@types/unist@2.0.11", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:character-entities-legacy", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:character-reference-invalid", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:decode-named-character-reference", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:is-alphanumerical", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:is-decimal", + "type": "static" + }, + { + "source": "npm:parse-entities", + "target": "npm:is-hexadecimal", + "type": "static" + } + ], + "npm:parse5-htmlparser2-tree-adapter": [ + { + "source": "npm:parse5-htmlparser2-tree-adapter", + "target": "npm:domhandler", + "type": "static" + }, + { + "source": "npm:parse5-htmlparser2-tree-adapter", + "target": "npm:parse5@7.3.0", + "type": "static" + } + ], + "npm:parse5-parser-stream": [ + { + "source": "npm:parse5-parser-stream", + "target": "npm:parse5@7.3.0", + "type": "static" + } + ], + "npm:parse5@7.3.0": [ + { + "source": "npm:parse5@7.3.0", + "target": "npm:entities@6.0.1", + "type": "static" + } + ], + "npm:parse5@8.0.0": [ + { + "source": "npm:parse5@8.0.0", + "target": "npm:entities@6.0.1", + "type": "static" + } + ], + "npm:path-scurry": [ + { + "source": "npm:path-scurry", + "target": "npm:lru-cache@10.4.3", + "type": "static" + }, + { + "source": "npm:path-scurry", + "target": "npm:minipass", + "type": "static" + } + ], + "npm:pkg-types@1.3.1": [ + { + "source": "npm:pkg-types@1.3.1", + "target": "npm:confbox@0.1.8", + "type": "static" + }, + { + "source": "npm:pkg-types@1.3.1", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:pkg-types@1.3.1", + "target": "npm:pathe@2.0.3", + "type": "static" + } + ], + "npm:pkg-types@2.3.0": [ + { + "source": "npm:pkg-types@2.3.0", + "target": "npm:confbox@0.2.2", + "type": "static" + }, + { + "source": "npm:pkg-types@2.3.0", + "target": "npm:exsolve", + "type": "static" + }, + { + "source": "npm:pkg-types@2.3.0", + "target": "npm:pathe@2.0.3", + "type": "static" + } + ], + "npm:postcss": [ + { + "source": "npm:postcss", + "target": "npm:nanoid@3.3.11", + "type": "static" + }, + { + "source": "npm:postcss", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:postcss", + "target": "npm:source-map-js", + "type": "static" + } + ], + "npm:prettier-plugin-svelte": [ + { + "source": "npm:prettier-plugin-svelte", + "target": "npm:prettier", + "type": "static" + }, + { + "source": "npm:prettier-plugin-svelte", + "target": "npm:svelte", + "type": "static" + } + ], + "npm:pretty-format@27.5.1": [ + { + "source": "npm:pretty-format@27.5.1", + "target": "npm:ansi-regex@5.0.1", + "type": "static" + }, + { + "source": "npm:pretty-format@27.5.1", + "target": "npm:ansi-styles@5.2.0", + "type": "static" + }, + { + "source": "npm:pretty-format@27.5.1", + "target": "npm:react-is@17.0.2", + "type": "static" + } + ], + "npm:pretty-format@30.2.0": [ + { + "source": "npm:pretty-format@30.2.0", + "target": "npm:@jest/schemas", + "type": "static" + }, + { + "source": "npm:pretty-format@30.2.0", + "target": "npm:ansi-styles@5.2.0", + "type": "static" + }, + { + "source": "npm:pretty-format@30.2.0", + "target": "npm:react-is@18.3.1", + "type": "static" + } + ], + "npm:publint": [ + { + "source": "npm:publint", + "target": "npm:@publint/pack", + "type": "static" + }, + { + "source": "npm:publint", + "target": "npm:package-manager-detector@1.5.0", + "type": "static" + }, + { + "source": "npm:publint", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:publint", + "target": "npm:sade", + "type": "static" + } + ], + "npm:randombytes": [ + { + "source": "npm:randombytes", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + } + ], + "npm:rc9": [ + { + "source": "npm:rc9", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:rc9", + "target": "npm:destr", + "type": "static" + } + ], + "npm:react-dom": [ + { + "source": "npm:react-dom", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:react-dom", + "target": "npm:scheduler", + "type": "static" + } + ], + "npm:react-markdown": [ + { + "source": "npm:react-markdown", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:@types/react", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:hast-util-to-jsx-runtime", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:html-url-attributes", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:mdast-util-to-hast", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:react", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:remark-parse", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:remark-rehype", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:unified", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:react-markdown", + "target": "npm:vfile", + "type": "static" + } + ], + "npm:read-yaml-file": [ + { + "source": "npm:read-yaml-file", + "target": "npm:graceful-fs", + "type": "static" + }, + { + "source": "npm:read-yaml-file", + "target": "npm:js-yaml@3.14.1", + "type": "static" + }, + { + "source": "npm:read-yaml-file", + "target": "npm:pify", + "type": "static" + }, + { + "source": "npm:read-yaml-file", + "target": "npm:strip-bom", + "type": "static" + } + ], + "npm:readable-stream@2.3.8": [ + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:core-util-is", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:isarray", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:process-nextick-args", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:safe-buffer@5.1.2", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:string_decoder@1.1.1", + "type": "static" + }, + { + "source": "npm:readable-stream@2.3.8", + "target": "npm:util-deprecate", + "type": "static" + } + ], + "npm:readable-stream@3.6.2": [ + { + "source": "npm:readable-stream@3.6.2", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:readable-stream@3.6.2", + "target": "npm:string_decoder@1.3.0", + "type": "static" + }, + { + "source": "npm:readable-stream@3.6.2", + "target": "npm:util-deprecate", + "type": "static" + } + ], + "npm:readable-stream@4.7.0": [ + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:abort-controller", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:buffer@6.0.3", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:events", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:process", + "type": "static" + }, + { + "source": "npm:readable-stream@4.7.0", + "target": "npm:string_decoder@1.3.0", + "type": "static" + } + ], + "npm:readdir-glob": [ + { + "source": "npm:readdir-glob", + "target": "npm:minimatch@5.1.6", + "type": "static" + } + ], + "npm:readdirp@3.6.0": [ + { + "source": "npm:readdirp@3.6.0", + "target": "npm:picomatch@2.3.1", + "type": "static" + } + ], + "npm:recast": [ + { + "source": "npm:recast", + "target": "npm:ast-types", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:esprima", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:source-map@0.6.1", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:tiny-invariant", + "type": "static" + }, + { + "source": "npm:recast", + "target": "npm:tslib", + "type": "static" + } + ], + "npm:redent": [ + { + "source": "npm:redent", + "target": "npm:indent-string", + "type": "static" + }, + { + "source": "npm:redent", + "target": "npm:strip-indent", + "type": "static" + } + ], + "npm:redis-parser": [ + { + "source": "npm:redis-parser", + "target": "npm:redis-errors", + "type": "static" + } + ], + "npm:rehype-highlight": [ + { + "source": "npm:rehype-highlight", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:hast-util-to-text", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:lowlight", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:unist-util-visit", + "type": "static" + }, + { + "source": "npm:rehype-highlight", + "target": "npm:vfile", + "type": "static" + } + ], + "npm:rehype-raw": [ + { + "source": "npm:rehype-raw", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:rehype-raw", + "target": "npm:hast-util-raw", + "type": "static" + }, + { + "source": "npm:rehype-raw", + "target": "npm:vfile", + "type": "static" + } + ], + "npm:rehype-sanitize": [ + { + "source": "npm:rehype-sanitize", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:rehype-sanitize", + "target": "npm:hast-util-sanitize", + "type": "static" + } + ], + "npm:remark-gfm": [ + { + "source": "npm:remark-gfm", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:mdast-util-gfm", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:micromark-extension-gfm", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:remark-parse", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:remark-stringify", + "type": "static" + }, + { + "source": "npm:remark-gfm", + "target": "npm:unified", + "type": "static" + } + ], + "npm:remark-parse": [ + { + "source": "npm:remark-parse", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:remark-parse", + "target": "npm:mdast-util-from-markdown", + "type": "static" + }, + { + "source": "npm:remark-parse", + "target": "npm:micromark-util-types", + "type": "static" + }, + { + "source": "npm:remark-parse", + "target": "npm:unified", + "type": "static" + } + ], + "npm:remark-rehype": [ + { + "source": "npm:remark-rehype", + "target": "npm:@types/hast", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:mdast-util-to-hast", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:unified", + "type": "static" + }, + { + "source": "npm:remark-rehype", + "target": "npm:vfile", + "type": "static" + } + ], + "npm:remark-stringify": [ + { + "source": "npm:remark-stringify", + "target": "npm:@types/mdast", + "type": "static" + }, + { + "source": "npm:remark-stringify", + "target": "npm:mdast-util-to-markdown", + "type": "static" + }, + { + "source": "npm:remark-stringify", + "target": "npm:unified", + "type": "static" + } + ], + "npm:resolve": [ + { + "source": "npm:resolve", + "target": "npm:is-core-module", + "type": "static" + }, + { + "source": "npm:resolve", + "target": "npm:path-parse", + "type": "static" + }, + { + "source": "npm:resolve", + "target": "npm:supports-preserve-symlinks-flag", + "type": "static" + } + ], + "npm:restore-cursor": [ + { + "source": "npm:restore-cursor", + "target": "npm:onetime@5.1.2", + "type": "static" + }, + { + "source": "npm:restore-cursor", + "target": "npm:signal-exit@3.0.7", + "type": "static" + } + ], + "npm:rimraf": [ + { + "source": "npm:rimraf", + "target": "npm:glob", + "type": "static" + } + ], + "npm:rolldown": [ + { + "source": "npm:rolldown", + "target": "npm:@oxc-project/types", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/pluginutils@1.0.0-beta.51", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-android-arm64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-darwin-arm64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-darwin-x64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-freebsd-x64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-openharmony-arm64", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-wasm32-wasi", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-win32-ia32-msvc", + "type": "static" + }, + { + "source": "npm:rolldown", + "target": "npm:@rolldown/binding-win32-x64-msvc", + "type": "static" + } + ], + "npm:rollup-plugin-preserve-directives": [ + { + "source": "npm:rollup-plugin-preserve-directives", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:rollup-plugin-preserve-directives", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:rollup-plugin-preserve-directives", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:rollup-plugin-visualizer": [ + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:open", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:source-map@0.7.6", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:yargs", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:rolldown", + "type": "static" + }, + { + "source": "npm:rollup-plugin-visualizer", + "target": "npm:rollup", + "type": "static" + } + ], + "npm:rollup": [ + { + "source": "npm:rollup", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-android-arm-eabi", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-android-arm64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-darwin-arm64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-darwin-x64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-freebsd-arm64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-freebsd-x64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-arm-musleabihf", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-loong64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-ppc64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-riscv64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-riscv64-musl", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-s390x-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-openharmony-arm64", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-win32-ia32-msvc", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-win32-x64-gnu", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:@rollup/rollup-win32-x64-msvc", + "type": "static" + }, + { + "source": "npm:rollup", + "target": "npm:fsevents", + "type": "static" + } + ], + "npm:run-parallel": [ + { + "source": "npm:run-parallel", + "target": "npm:queue-microtask", + "type": "static" + } + ], + "npm:sade": [ + { + "source": "npm:sade", + "target": "npm:mri", + "type": "static" + } + ], + "npm:saxes": [ + { + "source": "npm:saxes", + "target": "npm:xmlchars", + "type": "static" + } + ], + "npm:semver@7.5.4": [ + { + "source": "npm:semver@7.5.4", + "target": "npm:lru-cache@6.0.0", + "type": "static" + } + ], + "npm:send": [ + { + "source": "npm:send", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:encodeurl", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:escape-html", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:etag", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:fresh", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:http-errors", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:mime-types@3.0.1", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:ms", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:on-finished", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:range-parser", + "type": "static" + }, + { + "source": "npm:send", + "target": "npm:statuses@2.0.2", + "type": "static" + } + ], + "npm:serialize-javascript": [ + { + "source": "npm:serialize-javascript", + "target": "npm:randombytes", + "type": "static" + } + ], + "npm:seroval-plugins@1.3.3": [ + { + "source": "npm:seroval-plugins@1.3.3", + "target": "npm:seroval@1.3.2", + "type": "static" + } + ], + "npm:seroval-plugins@1.4.0": [ + { + "source": "npm:seroval-plugins@1.4.0", + "target": "npm:seroval@1.4.0", + "type": "static" + } + ], + "npm:serve-placeholder": [ + { + "source": "npm:serve-placeholder", + "target": "npm:defu", + "type": "static" + } + ], + "npm:serve-static": [ + { + "source": "npm:serve-static", + "target": "npm:encodeurl", + "type": "static" + }, + { + "source": "npm:serve-static", + "target": "npm:escape-html", + "type": "static" + }, + { + "source": "npm:serve-static", + "target": "npm:parseurl", + "type": "static" + }, + { + "source": "npm:serve-static", + "target": "npm:send", + "type": "static" + } + ], + "npm:shebang-command": [ + { + "source": "npm:shebang-command", + "target": "npm:shebang-regex", + "type": "static" + } + ], + "npm:sherif": [ + { + "source": "npm:sherif", + "target": "npm:sherif-darwin-arm64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-darwin-x64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-linux-arm64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-linux-x64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-windows-arm64", + "type": "static" + }, + { + "source": "npm:sherif", + "target": "npm:sherif-windows-x64", + "type": "static" + } + ], + "npm:simple-git": [ + { + "source": "npm:simple-git", + "target": "npm:@kwsites/file-exists", + "type": "static" + }, + { + "source": "npm:simple-git", + "target": "npm:@kwsites/promise-deferred", + "type": "static" + }, + { + "source": "npm:simple-git", + "target": "npm:debug", + "type": "static" + } + ], + "npm:size-limit": [ + { + "source": "npm:size-limit", + "target": "npm:bytes-iec", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:chokidar@4.0.3", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:lilconfig", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:nanospinner", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:picocolors", + "type": "static" + }, + { + "source": "npm:size-limit", + "target": "npm:tinyglobby", + "type": "static" + } + ], + "npm:solid-js": [ + { + "source": "npm:solid-js", + "target": "npm:csstype@3.1.3", + "type": "static" + }, + { + "source": "npm:solid-js", + "target": "npm:seroval@1.3.2", + "type": "static" + }, + { + "source": "npm:solid-js", + "target": "npm:seroval-plugins@1.3.3", + "type": "static" + } + ], + "npm:solid-refresh": [ + { + "source": "npm:solid-refresh", + "target": "npm:@babel/generator", + "type": "static" + }, + { + "source": "npm:solid-refresh", + "target": "npm:@babel/helper-module-imports@7.27.1", + "type": "static" + }, + { + "source": "npm:solid-refresh", + "target": "npm:@babel/types@7.28.5", + "type": "static" + }, + { + "source": "npm:solid-refresh", + "target": "npm:solid-js", + "type": "static" + } + ], + "npm:source-map-support": [ + { + "source": "npm:source-map-support", + "target": "npm:buffer-from", + "type": "static" + }, + { + "source": "npm:source-map-support", + "target": "npm:source-map@0.6.1", + "type": "static" + } + ], + "npm:spawndamnit": [ + { + "source": "npm:spawndamnit", + "target": "npm:cross-spawn", + "type": "static" + }, + { + "source": "npm:spawndamnit", + "target": "npm:signal-exit@4.1.0", + "type": "static" + } + ], + "npm:streamx": [ + { + "source": "npm:streamx", + "target": "npm:events-universal", + "type": "static" + }, + { + "source": "npm:streamx", + "target": "npm:fast-fifo", + "type": "static" + }, + { + "source": "npm:streamx", + "target": "npm:text-decoder", + "type": "static" + } + ], + "npm:string-width@4.2.3": [ + { + "source": "npm:string-width@4.2.3", + "target": "npm:emoji-regex@8.0.0", + "type": "static" + }, + { + "source": "npm:string-width@4.2.3", + "target": "npm:is-fullwidth-code-point", + "type": "static" + }, + { + "source": "npm:string-width@4.2.3", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + } + ], + "npm:string-width-cjs": [ + { + "source": "npm:string-width-cjs", + "target": "npm:emoji-regex@8.0.0", + "type": "static" + }, + { + "source": "npm:string-width-cjs", + "target": "npm:is-fullwidth-code-point", + "type": "static" + }, + { + "source": "npm:string-width-cjs", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + } + ], + "npm:string-width@5.1.2": [ + { + "source": "npm:string-width@5.1.2", + "target": "npm:eastasianwidth", + "type": "static" + }, + { + "source": "npm:string-width@5.1.2", + "target": "npm:emoji-regex@9.2.2", + "type": "static" + }, + { + "source": "npm:string-width@5.1.2", + "target": "npm:strip-ansi@7.1.2", + "type": "static" + } + ], + "npm:string_decoder@1.1.1": [ + { + "source": "npm:string_decoder@1.1.1", + "target": "npm:safe-buffer@5.1.2", + "type": "static" + } + ], + "npm:string_decoder@1.3.0": [ + { + "source": "npm:string_decoder@1.3.0", + "target": "npm:safe-buffer@5.2.1", + "type": "static" + } + ], + "npm:stringify-entities": [ + { + "source": "npm:stringify-entities", + "target": "npm:character-entities-html4", + "type": "static" + }, + { + "source": "npm:stringify-entities", + "target": "npm:character-entities-legacy", + "type": "static" + } + ], + "npm:strip-ansi@6.0.1": [ + { + "source": "npm:strip-ansi@6.0.1", + "target": "npm:ansi-regex@5.0.1", + "type": "static" + } + ], + "npm:strip-ansi-cjs": [ + { + "source": "npm:strip-ansi-cjs", + "target": "npm:ansi-regex@5.0.1", + "type": "static" + } + ], + "npm:strip-ansi@7.1.2": [ + { + "source": "npm:strip-ansi@7.1.2", + "target": "npm:ansi-regex@6.2.2", + "type": "static" + } + ], + "npm:strip-indent": [ + { + "source": "npm:strip-indent", + "target": "npm:min-indent", + "type": "static" + } + ], + "npm:strip-literal": [ + { + "source": "npm:strip-literal", + "target": "npm:js-tokens@9.0.1", + "type": "static" + } + ], + "npm:style-to-js": [ + { + "source": "npm:style-to-js", + "target": "npm:style-to-object", + "type": "static" + } + ], + "npm:style-to-object": [ + { + "source": "npm:style-to-object", + "target": "npm:inline-style-parser", + "type": "static" + } + ], + "npm:supports-color@7.2.0": [ + { + "source": "npm:supports-color@7.2.0", + "target": "npm:has-flag", + "type": "static" + } + ], + "npm:supports-color@8.1.1": [ + { + "source": "npm:supports-color@8.1.1", + "target": "npm:has-flag", + "type": "static" + } + ], + "npm:svelte": [ + { + "source": "npm:svelte", + "target": "npm:@jridgewell/remapping", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:@jridgewell/sourcemap-codec", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:@sveltejs/acorn-typescript", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:@types/estree", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:aria-query@5.3.2", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:axobject-query", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:clsx", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:devalue", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:esm-env", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:esrap", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:is-reference@3.0.3", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:locate-character", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:svelte", + "target": "npm:zimmerframe", + "type": "static" + } + ], + "npm:tar-stream@2.2.0": [ + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:bl", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:end-of-stream", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:fs-constants", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:inherits", + "type": "static" + }, + { + "source": "npm:tar-stream@2.2.0", + "target": "npm:readable-stream@3.6.2", + "type": "static" + } + ], + "npm:tar-stream@3.1.7": [ + { + "source": "npm:tar-stream@3.1.7", + "target": "npm:b4a", + "type": "static" + }, + { + "source": "npm:tar-stream@3.1.7", + "target": "npm:fast-fifo", + "type": "static" + }, + { + "source": "npm:tar-stream@3.1.7", + "target": "npm:streamx", + "type": "static" + } + ], + "npm:tar": [ + { + "source": "npm:tar", + "target": "npm:@isaacs/fs-minipass", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:chownr", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:minipass", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:minizlib", + "type": "static" + }, + { + "source": "npm:tar", + "target": "npm:yallist@5.0.0", + "type": "static" + } + ], + "npm:terser": [ + { + "source": "npm:terser", + "target": "npm:@jridgewell/source-map", + "type": "static" + }, + { + "source": "npm:terser", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:terser", + "target": "npm:commander", + "type": "static" + }, + { + "source": "npm:terser", + "target": "npm:source-map-support", + "type": "static" + } + ], + "npm:text-decoder": [ + { + "source": "npm:text-decoder", + "target": "npm:b4a", + "type": "static" + } + ], + "npm:tinyglobby": [ + { + "source": "npm:tinyglobby", + "target": "npm:fdir", + "type": "static" + }, + { + "source": "npm:tinyglobby", + "target": "npm:picomatch@4.0.3", + "type": "static" + } + ], + "npm:tldts": [ + { + "source": "npm:tldts", + "target": "npm:tldts-core", + "type": "static" + } + ], + "npm:to-regex-range": [ + { + "source": "npm:to-regex-range", + "target": "npm:is-number", + "type": "static" + } + ], + "npm:tough-cookie": [ + { + "source": "npm:tough-cookie", + "target": "npm:tldts", + "type": "static" + } + ], + "npm:tr46@6.0.0": [ + { + "source": "npm:tr46@6.0.0", + "target": "npm:punycode", + "type": "static" + } + ], + "npm:ts-api-utils": [ + { + "source": "npm:ts-api-utils", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:ts-declaration-location": [ + { + "source": "npm:ts-declaration-location", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:ts-declaration-location", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:tsconfck": [ + { + "source": "npm:tsconfck", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:tsconfig-paths": [ + { + "source": "npm:tsconfig-paths", + "target": "npm:json5", + "type": "static" + }, + { + "source": "npm:tsconfig-paths", + "target": "npm:minimist", + "type": "static" + }, + { + "source": "npm:tsconfig-paths", + "target": "npm:strip-bom", + "type": "static" + } + ], + "npm:tsx": [ + { + "source": "npm:tsx", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "npm:tsx", + "target": "npm:get-tsconfig", + "type": "static" + }, + { + "source": "npm:tsx", + "target": "npm:fsevents", + "type": "static" + } + ], + "npm:type-check": [ + { + "source": "npm:type-check", + "target": "npm:prelude-ls", + "type": "static" + } + ], + "npm:type-fest": [ + { + "source": "npm:type-fest", + "target": "npm:tagged-tag", + "type": "static" + } + ], + "npm:typedoc-plugin-frontmatter": [ + { + "source": "npm:typedoc-plugin-frontmatter", + "target": "npm:typedoc-plugin-markdown", + "type": "static" + }, + { + "source": "npm:typedoc-plugin-frontmatter", + "target": "npm:yaml", + "type": "static" + } + ], + "npm:typedoc-plugin-markdown": [ + { + "source": "npm:typedoc-plugin-markdown", + "target": "npm:typedoc", + "type": "static" + } + ], + "npm:typedoc": [ + { + "source": "npm:typedoc", + "target": "npm:@gerrit0/mini-shiki", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:lunr", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:markdown-it", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:minimatch@9.0.5", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:typedoc", + "target": "npm:yaml", + "type": "static" + } + ], + "npm:typescript-eslint": [ + { + "source": "npm:typescript-eslint", + "target": "npm:@typescript-eslint/eslint-plugin", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:@typescript-eslint/parser", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:@typescript-eslint/typescript-estree@8.46.3", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:@typescript-eslint/utils@8.46.3", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:typescript-eslint", + "target": "npm:typescript", + "type": "static" + } + ], + "npm:unctx": [ + { + "source": "npm:unctx", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:unctx", + "target": "npm:estree-walker@3.0.3", + "type": "static" + }, + { + "source": "npm:unctx", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:unctx", + "target": "npm:unplugin", + "type": "static" + } + ], + "npm:unenv": [ + { + "source": "npm:unenv", + "target": "npm:pathe@2.0.3", + "type": "static" + } + ], + "npm:unified": [ + { + "source": "npm:unified", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:bail", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:devlop", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:extend", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:is-plain-obj", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:trough", + "type": "static" + }, + { + "source": "npm:unified", + "target": "npm:vfile", + "type": "static" + } + ], + "npm:unimport": [ + { + "source": "npm:unimport", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:escape-string-regexp@5.0.0", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:estree-walker@3.0.3", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:local-pkg@1.1.2", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:scule", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:strip-literal", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:unplugin", + "type": "static" + }, + { + "source": "npm:unimport", + "target": "npm:unplugin-utils", + "type": "static" + } + ], + "npm:unist-util-find-after": [ + { + "source": "npm:unist-util-find-after", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-find-after", + "target": "npm:unist-util-is", + "type": "static" + } + ], + "npm:unist-util-is": [ + { + "source": "npm:unist-util-is", + "target": "npm:@types/unist@3.0.3", + "type": "static" + } + ], + "npm:unist-util-position": [ + { + "source": "npm:unist-util-position", + "target": "npm:@types/unist@3.0.3", + "type": "static" + } + ], + "npm:unist-util-stringify-position": [ + { + "source": "npm:unist-util-stringify-position", + "target": "npm:@types/unist@3.0.3", + "type": "static" + } + ], + "npm:unist-util-visit-parents": [ + { + "source": "npm:unist-util-visit-parents", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-visit-parents", + "target": "npm:unist-util-is", + "type": "static" + } + ], + "npm:unist-util-visit": [ + { + "source": "npm:unist-util-visit", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:unist-util-visit", + "target": "npm:unist-util-is", + "type": "static" + }, + { + "source": "npm:unist-util-visit", + "target": "npm:unist-util-visit-parents", + "type": "static" + } + ], + "npm:unplugin-utils": [ + { + "source": "npm:unplugin-utils", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:unplugin-utils", + "target": "npm:picomatch@4.0.3", + "type": "static" + } + ], + "npm:unplugin": [ + { + "source": "npm:unplugin", + "target": "npm:@jridgewell/remapping", + "type": "static" + }, + { + "source": "npm:unplugin", + "target": "npm:acorn", + "type": "static" + }, + { + "source": "npm:unplugin", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:unplugin", + "target": "npm:webpack-virtual-modules", + "type": "static" + } + ], + "npm:unrs-resolver": [ + { + "source": "npm:unrs-resolver", + "target": "npm:napi-postinstall", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-android-arm-eabi", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-android-arm64", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-darwin-arm64", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-darwin-x64", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-freebsd-x64", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-arm-gnueabihf", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-arm-musleabihf", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-arm64-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-arm64-musl", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-ppc64-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-riscv64-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-riscv64-musl", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-s390x-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-x64-gnu", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-linux-x64-musl", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-wasm32-wasi", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-win32-arm64-msvc", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-win32-ia32-msvc", + "type": "static" + }, + { + "source": "npm:unrs-resolver", + "target": "npm:@unrs/resolver-binding-win32-x64-msvc", + "type": "static" + } + ], + "npm:unstorage": [ + { + "source": "npm:unstorage", + "target": "npm:anymatch", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:chokidar@4.0.3", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:destr", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:h3@1.15.4", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:lru-cache@10.4.3", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:node-fetch-native", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:ofetch", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:ufo", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:db0", + "type": "static" + }, + { + "source": "npm:unstorage", + "target": "npm:ioredis", + "type": "static" + } + ], + "npm:untun": [ + { + "source": "npm:untun", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:untun", + "target": "npm:consola", + "type": "static" + }, + { + "source": "npm:untun", + "target": "npm:pathe@1.1.2", + "type": "static" + } + ], + "npm:untyped": [ + { + "source": "npm:untyped", + "target": "npm:citty", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:defu", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:knitwork", + "type": "static" + }, + { + "source": "npm:untyped", + "target": "npm:scule", + "type": "static" + } + ], + "npm:unwasm": [ + { + "source": "npm:unwasm", + "target": "npm:knitwork", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:mlly", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:pkg-types@2.3.0", + "type": "static" + }, + { + "source": "npm:unwasm", + "target": "npm:unplugin", + "type": "static" + } + ], + "npm:update-browserslist-db": [ + { + "source": "npm:update-browserslist-db", + "target": "npm:browserslist", + "type": "static" + }, + { + "source": "npm:update-browserslist-db", + "target": "npm:escalade", + "type": "static" + }, + { + "source": "npm:update-browserslist-db", + "target": "npm:picocolors", + "type": "static" + } + ], + "npm:uri-js": [ + { + "source": "npm:uri-js", + "target": "npm:punycode", + "type": "static" + } + ], + "npm:use-sync-external-store": [ + { + "source": "npm:use-sync-external-store", + "target": "npm:react", + "type": "static" + } + ], + "npm:vfile-location": [ + { + "source": "npm:vfile-location", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:vfile-location", + "target": "npm:vfile", + "type": "static" + } + ], + "npm:vfile-message": [ + { + "source": "npm:vfile-message", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:vfile-message", + "target": "npm:unist-util-stringify-position", + "type": "static" + } + ], + "npm:vfile": [ + { + "source": "npm:vfile", + "target": "npm:@types/unist@3.0.3", + "type": "static" + }, + { + "source": "npm:vfile", + "target": "npm:vfile-message", + "type": "static" + } + ], + "npm:vite-plugin-dts": [ + { + "source": "npm:vite-plugin-dts", + "target": "npm:@microsoft/api-extractor", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:@rollup/pluginutils", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:@volar/typescript", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:@vue/language-core", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:compare-versions", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:kolorist", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:local-pkg@0.5.1", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:typescript", + "type": "static" + }, + { + "source": "npm:vite-plugin-dts", + "target": "npm:vite", + "type": "static" + } + ], + "npm:vite-plugin-externalize-deps": [ + { + "source": "npm:vite-plugin-externalize-deps", + "target": "npm:vite", + "type": "static" + } + ], + "npm:vite-plugin-solid": [ + { + "source": "npm:vite-plugin-solid", + "target": "npm:@babel/core", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:@types/babel__core", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:babel-preset-solid", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:merge-anything", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:solid-js", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:solid-refresh", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:vitefu", + "type": "static" + }, + { + "source": "npm:vite-plugin-solid", + "target": "npm:@testing-library/jest-dom", + "type": "static" + } + ], + "npm:vite-tsconfig-paths": [ + { + "source": "npm:vite-tsconfig-paths", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:vite-tsconfig-paths", + "target": "npm:globrex", + "type": "static" + }, + { + "source": "npm:vite-tsconfig-paths", + "target": "npm:tsconfck", + "type": "static" + }, + { + "source": "npm:vite-tsconfig-paths", + "target": "npm:vite", + "type": "static" + } + ], + "npm:vite": [ + { + "source": "npm:vite", + "target": "npm:esbuild", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:fdir", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:postcss", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:rollup", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:fsevents", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:jiti", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:lightningcss", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:terser", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:tsx", + "type": "static" + }, + { + "source": "npm:vite", + "target": "npm:yaml", + "type": "static" + } + ], + "npm:vitefu": [ + { + "source": "npm:vitefu", + "target": "npm:vite", + "type": "static" + } + ], + "npm:vitest": [ + { + "source": "npm:vitest", + "target": "npm:@vitest/expect", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/mocker", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/pretty-format", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/runner", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/snapshot", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/spy", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@vitest/utils", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:es-module-lexer", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:expect-type", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:magic-string", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:obug", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:pathe@2.0.3", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:picomatch@4.0.3", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:std-env", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:tinybench", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:tinyexec@0.3.2", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:tinyglobby", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:tinyrainbow", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:vite", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:why-is-node-running", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:@types/node", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:happy-dom", + "type": "static" + }, + { + "source": "npm:vitest", + "target": "npm:jsdom", + "type": "static" + } + ], + "npm:vue-eslint-parser": [ + { + "source": "npm:vue-eslint-parser", + "target": "npm:debug", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:eslint", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:eslint-scope", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:eslint-visitor-keys@4.2.1", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:espree", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:esquery", + "type": "static" + }, + { + "source": "npm:vue-eslint-parser", + "target": "npm:semver@7.7.3", + "type": "static" + } + ], + "npm:w3c-xmlserializer": [ + { + "source": "npm:w3c-xmlserializer", + "target": "npm:xml-name-validator", + "type": "static" + } + ], + "npm:wcwidth": [ + { + "source": "npm:wcwidth", + "target": "npm:defaults", + "type": "static" + } + ], + "npm:whatwg-encoding": [ + { + "source": "npm:whatwg-encoding", + "target": "npm:iconv-lite@0.6.3", + "type": "static" + } + ], + "npm:whatwg-url@15.1.0": [ + { + "source": "npm:whatwg-url@15.1.0", + "target": "npm:tr46@6.0.0", + "type": "static" + }, + { + "source": "npm:whatwg-url@15.1.0", + "target": "npm:webidl-conversions@8.0.0", + "type": "static" + } + ], + "npm:whatwg-url@5.0.0": [ + { + "source": "npm:whatwg-url@5.0.0", + "target": "npm:tr46@0.0.3", + "type": "static" + }, + { + "source": "npm:whatwg-url@5.0.0", + "target": "npm:webidl-conversions@3.0.1", + "type": "static" + } + ], + "npm:which": [ + { + "source": "npm:which", + "target": "npm:isexe", + "type": "static" + } + ], + "npm:why-is-node-running": [ + { + "source": "npm:why-is-node-running", + "target": "npm:siginfo", + "type": "static" + }, + { + "source": "npm:why-is-node-running", + "target": "npm:stackback", + "type": "static" + } + ], + "npm:wrap-ansi@7.0.0": [ + { + "source": "npm:wrap-ansi@7.0.0", + "target": "npm:ansi-styles@4.3.0", + "type": "static" + }, + { + "source": "npm:wrap-ansi@7.0.0", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:wrap-ansi@7.0.0", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + } + ], + "npm:wrap-ansi-cjs": [ + { + "source": "npm:wrap-ansi-cjs", + "target": "npm:ansi-styles@4.3.0", + "type": "static" + }, + { + "source": "npm:wrap-ansi-cjs", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:wrap-ansi-cjs", + "target": "npm:strip-ansi@6.0.1", + "type": "static" + } + ], + "npm:wrap-ansi@8.1.0": [ + { + "source": "npm:wrap-ansi@8.1.0", + "target": "npm:ansi-styles@6.2.3", + "type": "static" + }, + { + "source": "npm:wrap-ansi@8.1.0", + "target": "npm:string-width@5.1.2", + "type": "static" + }, + { + "source": "npm:wrap-ansi@8.1.0", + "target": "npm:strip-ansi@7.1.2", + "type": "static" + } + ], + "npm:xmlbuilder2": [ + { + "source": "npm:xmlbuilder2", + "target": "npm:@oozcitak/dom", + "type": "static" + }, + { + "source": "npm:xmlbuilder2", + "target": "npm:@oozcitak/infra", + "type": "static" + }, + { + "source": "npm:xmlbuilder2", + "target": "npm:@oozcitak/util", + "type": "static" + }, + { + "source": "npm:xmlbuilder2", + "target": "npm:js-yaml@4.1.1", + "type": "static" + } + ], + "npm:yargs": [ + { + "source": "npm:yargs", + "target": "npm:cliui", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:escalade", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:get-caller-file", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:require-directory", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:string-width@4.2.3", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:y18n", + "type": "static" + }, + { + "source": "npm:yargs", + "target": "npm:yargs-parser", + "type": "static" + } + ], + "npm:youch-core": [ + { + "source": "npm:youch-core", + "target": "npm:@poppinss/exception", + "type": "static" + }, + { + "source": "npm:youch-core", + "target": "npm:error-stack-parser-es", + "type": "static" + } + ], + "npm:youch": [ + { + "source": "npm:youch", + "target": "npm:@poppinss/colors", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:@poppinss/dumper", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:@speed-highlight/core", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:cookie", + "type": "static" + }, + { + "source": "npm:youch", + "target": "npm:youch-core", + "type": "static" + } + ], + "npm:zip-stream": [ + { + "source": "npm:zip-stream", + "target": "npm:archiver-utils", + "type": "static" + }, + { + "source": "npm:zip-stream", + "target": "npm:compress-commons", + "type": "static" + }, + { + "source": "npm:zip-stream", + "target": "npm:readable-stream@4.7.0", + "type": "static" + } + ], + "npm:zod-validation-error@3.5.4": [ + { + "source": "npm:zod-validation-error@3.5.4", + "target": "npm:zod@3.25.76", + "type": "static" + } + ], + "npm:zod-validation-error@4.0.2": [ + { + "source": "npm:zod-validation-error@4.0.2", + "target": "npm:zod@4.1.13", + "type": "static" + } + ] + }, + "version": "6.0", + "errors": [], + "computedAt": 1764194322687 +} \ No newline at end of file diff --git a/.nx/workspace-data/source-maps.json b/.nx/workspace-data/source-maps.json new file mode 100644 index 000000000..d146952f1 --- /dev/null +++ b/.nx/workspace-data/source-maps.json @@ -0,0 +1,5602 @@ +{ + "examples/ts-chat": { + "root": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "name": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "tags": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "tags.npm:private": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.dev": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.executor": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.options": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.metadata": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.options.script": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.metadata.scriptContent": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.metadata.runCommand": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.serve": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.serve.executor": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.serve.options": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.serve.metadata": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.serve.options.script": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.serve.metadata.scriptContent": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.serve.metadata.runCommand": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.test": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.test.executor": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.test.options": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.test.metadata": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.test.options.script": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.test.metadata.scriptContent": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.test.metadata.runCommand": [ + "examples/ts-chat/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "examples/vanilla-chat": { + "root": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "name": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "tags": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "tags.npm:private": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.dev": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.executor": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.options": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.metadata": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.options.script": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.metadata.scriptContent": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.dev.metadata.runCommand": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.preview": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.preview.executor": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.preview.options": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.preview.metadata": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.preview.options.script": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.preview.metadata.scriptContent": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.preview.metadata.runCommand": [ + "examples/vanilla-chat/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + ".": { + "root": [ + "package.json", + "nx/core/package-json" + ], + "name": [ + "package.json", + "nx/core/package-json" + ], + "includedScripts": [ + "package.json", + "nx/core/package-json" + ], + "tags": [ + "package.json", + "nx/core/package-json" + ], + "tags.npm:private": [ + "package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "package.json", + "nx/core/package-json" + ], + "targets": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:knip": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:knip.executor": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:knip.options": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:knip.metadata": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:knip.options.script": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:knip.metadata.scriptContent": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:knip.metadata.runCommand": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:sherif": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:sherif.executor": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:sherif.options": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:sherif.metadata": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:sherif.options.script": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:sherif.metadata.scriptContent": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:sherif.metadata.runCommand": [ + "package.json", + "nx/core/package-json" + ], + "targets.test:knip.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:knip.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:knip.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:sherif.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:sherif.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:sherif.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai": { + "root": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "tags.npm:sdk": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "tags.npm:llm": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "tags.npm:chat": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "tags.npm:embeddings": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-anthropic": { + "root": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "tags.npm:anthropic": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "tags.npm:claude": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "tags.npm:adapter": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-anthropic/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-client": { + "root": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "tags.npm:client": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "tags.npm:headless": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "tags.npm:chat": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "tags.npm:streaming": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-client/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-devtools": { + "root": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:sdk": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:llm": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:chat": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:embeddings": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-fallback": { + "root": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "tags.npm:fallback": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "tags.npm:adapter": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "tags.npm:retry": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-fallback/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-gemini": { + "root": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "tags.npm:gemini": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "tags.npm:google": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "tags.npm:adapter": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-gemini/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-ollama": { + "root": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "tags.npm:ollama": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "tags.npm:llama": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "tags.npm:mistral": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "tags.npm:adapter": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-ollama/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-openai": { + "root": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "tags.npm:openai": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "tags.npm:gpt": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "tags.npm:adapter": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-openai/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-react": { + "root": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "tags.npm:react": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "tags.npm:hooks": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "tags.npm:chat": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "tags.npm:streaming": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-react/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/ai-react-ui": { + "root": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags.npm:react": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags.npm:chat": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags.npm:ui": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags.npm:headless": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "tags.npm:components": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.js.packageMain": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/ai-react-ui/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/react-ai-devtools": { + "root": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/react-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/solid-ai-devtools": { + "root": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:ai": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:tanstack": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:sdk": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:llm": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:chat": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "tags.npm:embeddings": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.2": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.3": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.4": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.5": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.6": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.7": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.packageExports": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.executor": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.options": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.options.script": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.scriptContent": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.metadata.runCommand": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.executor": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.options": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.options.script": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.scriptContent": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.clean.metadata.runCommand": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.executor": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.options.script": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.scriptContent": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.lint:fix.metadata.runCommand": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.executor": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.options": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.options.script": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.scriptContent": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:build.metadata.runCommand": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.executor": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.options.script": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.scriptContent": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:eslint.metadata.runCommand": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.executor": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.options.script": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.scriptContent": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib.metadata.runCommand": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.executor": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.options.script": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.scriptContent": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:lib:dev.metadata.runCommand": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.executor": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.options": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.options.script": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.scriptContent": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.test:types.metadata.runCommand": [ + "packages/typescript/solid-ai-devtools/package.json", + "nx/core/package-json" + ], + "targets.build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:build.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:eslint.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.outputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:lib.parallelism": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.cache": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.dependsOn": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.inputs": [ + "nx.json", + "nx/target-defaults" + ], + "targets.test:types.parallelism": [ + "nx.json", + "nx/target-defaults" + ] + }, + "packages/typescript/tests-adapters": { + "root": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "name": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "tags": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "tags.npm:public": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.0": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.targetGroups.NPM Scripts.1": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.description": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.js": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.js.packageName": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.js.packageVersion": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "metadata.js.isInPackageManagerWorkspaces": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.start": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.start.executor": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.start.options": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.start.metadata": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.start.options.script": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.start.metadata.scriptContent": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.start.metadata.runCommand": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.typecheck": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.typecheck.executor": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.typecheck.options": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.typecheck.metadata": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.typecheck.options.script": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.typecheck.metadata.scriptContent": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ], + "targets.typecheck.metadata.runCommand": [ + "packages/typescript/tests-adapters/package.json", + "nx/core/package-json" + ] + } +} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..e2414c1b2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,10 @@ +**/.nx/ +**/.nx/cache +**/.svelte-kit +**/build +**/coverage +**/dist +**/docs +pnpm-lock.yaml + +.angular diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..fa111aa2d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,81 @@ +--- +title: Code of Conduct +id: code-of-conduct +--- + +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at TANNERLINSLEY@GMAIL.COM. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..308cb68dc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Tanner Linsley + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/config.json b/config.json new file mode 100644 index 000000000..174cf479e --- /dev/null +++ b/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": [ + "@svitejs/changesets-changelog-github-compact", + { "repo": "TanStack/ai" } + ], + "commit": false, + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "fixed": [], + "linked": [], + "ignore": [] +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..95261a887 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,25 @@ +// @ts-check + +// @ts-ignore Needed due to moduleResolution Node vs Bundler +import { tanstackConfig } from '@tanstack/config/eslint' +import unusedImports from 'eslint-plugin-unused-imports' + +/** @type {import('eslint').Linter.FlatConfig[]} */ +const config = [ + ...tanstackConfig, + { + name: 'tanstack/temp', + plugins: { + 'unused-imports': unusedImports, + }, + rules: { + 'no-case-declarations': 'off', + 'no-shadow': 'off', + 'unused-imports/no-unused-imports': 'warn', + 'pnpm/enforce-catalog': 'off', + 'pnpm/json-enforce-catalog': 'off', + }, + }, +] + +export default config diff --git a/examples/ts-chat/package.json b/examples/ts-chat/package.json index 45a5dfcdd..035cdb28f 100644 --- a/examples/ts-chat/package.json +++ b/examples/ts-chat/package.json @@ -9,10 +9,10 @@ "test": "exit 0" }, "dependencies": { - "@ai-sdk/openai": "^2.0.52", + "@ai-sdk/openai": "^2.0.73", "@ai-sdk/provider": "^2.0.0", - "@ai-sdk/provider-utils": "^3.0.12", - "@tailwindcss/vite": "^4.0.6", + "@ai-sdk/provider-utils": "^3.0.17", + "@tailwindcss/vite": "^4.1.17", "@tanstack/ai": "workspace:*", "@tanstack/ai-anthropic": "workspace:*", "@tanstack/ai-client": "workspace:*", @@ -21,39 +21,39 @@ "@tanstack/ai-openai": "workspace:*", "@tanstack/ai-react": "workspace:*", "@tanstack/ai-react-ui": "workspace:*", - "@tanstack/nitro-v2-vite-plugin": "^1.132.31", - "@tanstack/react-devtools": "^0.8.0", - "@tanstack/react-router": "^1.132.0", - "@tanstack/react-router-devtools": "^1.132.0", - "@tanstack/react-router-ssr-query": "^1.131.7", - "@tanstack/react-start": "^1.132.0", - "@tanstack/react-store": "^0.7.0", - "@tanstack/router-plugin": "^1.132.0", - "@tanstack/store": "^0.7.0", + "@tanstack/nitro-v2-vite-plugin": "^1.139.0", + "@tanstack/react-devtools": "^0.8.2", + "@tanstack/react-router": "^1.139.7", + "@tanstack/react-router-devtools": "^1.139.7", + "@tanstack/react-router-ssr-query": "^1.139.7", + "@tanstack/react-start": "^1.139.8", + "@tanstack/react-store": "^0.8.0", + "@tanstack/router-plugin": "^1.139.7", + "@tanstack/store": "^0.8.0", "highlight.js": "^11.11.1", - "lucide-react": "^0.544.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "lucide-react": "^0.555.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", "react-markdown": "^10.1.0", - "rehype-highlight": "^7.0.0", + "rehype-highlight": "^7.0.2", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1", - "tailwindcss": "^4.0.6", + "tailwindcss": "^4.1.17", "vite-tsconfig-paths": "^5.1.4", - "zod": "^4.1.11" + "zod": "^4.1.13" }, "devDependencies": { - "@testing-library/dom": "^10.4.0", - "@testing-library/react": "^16.2.0", - "@types/node": "^22.10.2", - "@types/react": "^19.0.8", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^5.0.4", - "jsdom": "^27.0.0", - "typescript": "^5.7.2", - "vite": "^7.1.7", - "vitest": "^4.0.13", + "@testing-library/dom": "^10.4.1", + "@testing-library/react": "^16.3.0", + "@types/node": "^24.10.1", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "jsdom": "^27.2.0", + "typescript": "^5.9.3", + "vite": "^7.2.4", + "vitest": "^4.0.14", "web-vitals": "^5.1.0" } } diff --git a/examples/vanilla-chat/package.json b/examples/vanilla-chat/package.json index 650840479..11e24475b 100644 --- a/examples/vanilla-chat/package.json +++ b/examples/vanilla-chat/package.json @@ -12,6 +12,6 @@ "@tanstack/ai-client": "workspace:*" }, "devDependencies": { - "vite": "^7.1.7" + "vite": "^7.2.4" } } diff --git a/knip.json b/knip.json new file mode 100644 index 000000000..2a761388c --- /dev/null +++ b/knip.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://unpkg.com/knip@5/schema.json", + "ignoreDependencies": ["@faker-js/faker"], + "ignoreWorkspaces": ["examples/**"], + "workspaces": { + "packages/react-ai": { + "ignore": [] + } + } +} diff --git a/nx.json b/nx.json new file mode 100644 index 000000000..adfddd411 --- /dev/null +++ b/nx.json @@ -0,0 +1,63 @@ +{ + "$schema": "./node_modules/nx/schemas/nx-schema.json", + "tui": { + "enabled": false + }, + "defaultBase": "main", + "useInferencePlugins": false, + "parallel": 5, + "namedInputs": { + "sharedGlobals": [ + "{workspaceRoot}/.nvmrc", + "{workspaceRoot}/package.json", + "{workspaceRoot}/tsconfig.json" + ], + "default": [ + "sharedGlobals", + "{projectRoot}/**/*", + "!{projectRoot}/**/*.md" + ], + "production": [ + "default", + "!{projectRoot}/tests/**/*", + "!{projectRoot}/eslint.config.js" + ] + }, + "targetDefaults": { + "test:lib": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["default", "^production"], + "outputs": ["{projectRoot}/coverage"] + }, + "test:eslint": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["default", "^production", "{workspaceRoot}/eslint.config.js"] + }, + "test:types": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["default", "^production"] + }, + "test:build": { + "cache": true, + "dependsOn": ["build"], + "inputs": ["production"] + }, + "build": { + "cache": true, + "dependsOn": ["^build"], + "inputs": ["production", "^production"], + "outputs": ["{projectRoot}/build", "{projectRoot}/dist"] + }, + "test:knip": { + "cache": true, + "inputs": ["{workspaceRoot}/**/*"] + }, + "test:sherif": { + "cache": true, + "inputs": ["{workspaceRoot}/**/package.json"] + } + } +} diff --git a/package.json b/package.json index 823679346..443e8a7fc 100644 --- a/package.json +++ b/package.json @@ -8,21 +8,95 @@ "packageManager": "pnpm@10.17.0", "type": "module", "scripts": { - "build": "pnpm run -r build", - "dev": "pnpm run --filter '@tanstack/ai*' build && pnpm run -r --parallel dev", "dev:packages": "pnpm run --filter '@tanstack/ai*' dev", - "test": "pnpm run -r test", "typecheck": "pnpm run -r typecheck", "lint": "pnpm run -r lint", - "clean": "./scripts/clean.sh", "cli": "cd examples/cli && pnpm dev", "cli:build": "cd examples/cli && pnpm build && pnpm start", - "demo:tools": "cd examples/cli && pnpm tools" + "demo:tools": "cd examples/cli && pnpm tools", + "build": "nx affected --skip-nx-cache --targets=build --exclude=examples/** && size-limit", + "build:all": "nx run-many --targets=build --exclude=examples/** && size-limit", + "build:core": "nx run-many --targets=build --projects=packages/ai && size-limit", + "changeset": "changeset", + "changeset:publish": "changeset publish", + "changeset:version": "changeset version && pnpm install --no-frozen-lockfile && pnpm prettier:write", + "clean": "find . -name 'dist' -type d -prune -exec rm -rf {} +", + "clean:node_modules": "find . -name 'node_modules' -type d -prune -exec rm -rf {} +", + "clean:all": "pnpm run clean && pnpm run clean:node_modules", + "copy:readme": "cp README.md packages/typescript/ai/README.md && cp README.md packages/typescript/ai-devtools/README.md && cp README.md packages/typescript/ai-client/README.md && cp README.md packages/typescript/ai-fallback/README.md && cp README.md packages/typescript/ai-gemini/README.md && cp README.md packages/typescript/ai-ollama/README.md && cp README.md packages/typescript/ai-openai/README.md && cp README.md packages/typescript/ai-react/README.md && cp README.md packages/typescript/ai-react-ui/README.md && cp README.md packages/typescript/react-ai-devtools/README.md && cp README.md packages/typescript/solid-ai-devtools/README.md && cp README.md packages/typescript/tests-adapters/README.md", + "dev": "pnpm run watch", + "docs:generate": "node scripts/generateDocs.js && pnpm run copy:readme", + "format": "pnpm run prettier:write", + "lint:fix": "nx affected --target=lint:fix --exclude=examples/**", + "lint:fix:all": "pnpm run format && nx run-many --targets=lint --fix", + "preinstall": "node -e \"if(process.env.CI == 'true') {console.log('Skipping preinstall...'); process.exit(1)}\" || npx -y only-allow pnpm", + "prettier": "prettier --ignore-unknown '**/*'", + "prettier:write": "pnpm run prettier --write", + "size": "size-limit", + "test": "pnpm run test:ci", + "test:build": "nx affected --target=test:build --exclude=examples/**", + "test:ci": "nx run-many --targets=test:format,test:eslint,test:sherif,test:knip,test:lib,test:types,test:build,test:verify-links", + "test:eslint": "nx affected --target=test:eslint --exclude=examples/**", + "test:format": "pnpm run prettier --check", + "test:knip": "knip", + "test:lib": "nx affected --targets=test:lib --exclude=examples/**", + "test:lib:dev": "pnpm test:lib && nx watch --all -- pnpm test:lib", + "test:pr": "nx affected --targets=test:format,test:eslint,test:sherif,test:knip,test:lib,test:types,test:build,build", + "test:sherif": "sherif", + "test:types": "nx affected --targets=test:types --exclude=examples/**", + "test:verify-links": "node scripts/verify-links.ts", + "watch": "pnpm run build:all && nx watch --all -- pnpm run build:all" }, + "nx": { + "includedScripts": [ + "test:knip", + "test:sherif" + ] + }, + "size-limit": [ + { + "path": "packages/typescript/ai/dist/esm/index.js", + "limit": "10 KB" + } + ], "devDependencies": { - "@types/node": "^22.10.2", - "tsdown": "^0.15.9", - "typescript": "^5.7.2", - "vitest": "^4.0.13" + "@changesets/cli": "^2.29.7", + "@faker-js/faker": "^10.1.0", + "@size-limit/preset-small-lib": "^11.2.0", + "@svitejs/changesets-changelog-github-compact": "^1.2.0", + "@tanstack/config": "0.22.1", + "@testing-library/jest-dom": "^6.9.1", + "@types/node": "^24.10.1", + "eslint": "^9.39.1", + "eslint-plugin-unused-imports": "^4.3.0", + "fast-glob": "^3.3.3", + "happy-dom": "^20.0.10", + "knip": "^5.70.2", + "markdown-link-extractor": "^4.0.3", + "nx": "^22.1.2", + "premove": "^4.0.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "publint": "^0.3.15", + "sherif": "^1.9.0", + "size-limit": "^11.2.0", + "typescript": "5.9.3", + "vite": "^7.2.4", + "vitest": "^4.0.14" + }, + "overrides": { + "@tanstack/ai": "workspace:*", + "@tanstack/ai-anthropic": "workspace:*", + "@tanstack/ai-client": "workspace:*", + "@tanstack/ai-devtools": "workspace:*", + "@tanstack/ai-fallback": "workspace:*", + "@tanstack/ai-gemini": "workspace:*", + "@tanstack/ai-ollama": "workspace:*", + "@tanstack/ai-openai": "workspace:*", + "@tanstack/ai-react": "workspace:*", + "@tanstack/ai-react-ui": "workspace:*", + "@tanstack/react-ai-devtools": "workspace:*", + "@tanstack/solid-ai-devtools": "workspace:*", + "@tanstack/tests-adapters": "workspace:*" } } diff --git a/packages/typescript/ai-anthropic/eslint.config.js b/packages/typescript/ai-anthropic/eslint.config.js new file mode 100644 index 000000000..c3d273991 --- /dev/null +++ b/packages/typescript/ai-anthropic/eslint.config.js @@ -0,0 +1,9 @@ +import rootConfig from '../../../eslint.config.js' + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + ...rootConfig, + { + rules: {}, + }, +] diff --git a/packages/typescript/ai-anthropic/package.json b/packages/typescript/ai-anthropic/package.json index d6fe9e897..43aefbff9 100644 --- a/packages/typescript/ai-anthropic/package.json +++ b/packages/typescript/ai-anthropic/package.json @@ -9,6 +9,13 @@ "url": "git+https://github.com/TanStack/ai.git", "directory": "packages/typescript/ai-anthropic" }, + "keywords": [ + "ai", + "anthropic", + "claude", + "tanstack", + "adapter" + ], "type": "module", "module": "./dist/index.js", "types": "./dist/index.d.ts", @@ -23,34 +30,21 @@ "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, - "keywords": [ - "ai", - "anthropic", - "claude", - "tanstack", - "adapter" - ], "dependencies": { - "@anthropic-ai/sdk": "^0.70.0", + "@anthropic-ai/sdk": "^0.71.0", "@tanstack/ai": "workspace:*" }, - "devDependencies": { - "@types/node": "^22.10.2", - "@vitest/coverage-v8": "4.0.13", - "tsdown": "^0.15.9", - "typescript": "^5.7.2", - "vitest": "^4.0.13" - }, + "devDependencies": {}, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-anthropic/tsconfig.json b/packages/typescript/ai-anthropic/tsconfig.json index 204ca8d3f..e34123465 100644 --- a/packages/typescript/ai-anthropic/tsconfig.json +++ b/packages/typescript/ai-anthropic/tsconfig.json @@ -4,7 +4,6 @@ "outDir": "dist", "rootDir": "src" }, - "include": ["src/**/*.ts", "src/**/*.tsx"], - "exclude": ["node_modules", "dist", "**/*.config.ts"], - "references": [{ "path": "../ai" }] + "include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "vite.config.ts"], + "exclude": ["node_modules", "dist", "**/*.config.ts", "eslint.config.js"] } diff --git a/packages/typescript/ai-anthropic/tsdown.config.ts b/packages/typescript/ai-anthropic/tsdown.config.ts deleted file mode 100644 index c6316dbdc..000000000 --- a/packages/typescript/ai-anthropic/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from "tsdown"; - -export default defineConfig({ - entry: ["./src/index.ts"], - format: ["esm"], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, - external: ["@anthropic-ai/sdk"], -}); diff --git a/packages/typescript/ai-anthropic/vite.config.ts b/packages/typescript/ai-anthropic/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/ai-anthropic/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/ai-anthropic/vitest.config.ts b/packages/typescript/ai-anthropic/vitest.config.ts deleted file mode 100644 index 8fa8bfb9e..000000000 --- a/packages/typescript/ai-anthropic/vitest.config.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - globals: true, - environment: "node", - include: ["tests/**/*.test.ts"], - coverage: { - provider: "v8", - reporter: ["text", "json", "html", "lcov"], - exclude: [ - "node_modules/", - "dist/", - "tests/", - "**/*.test.ts", - "**/*.config.ts", - "**/types.ts", - ], - include: ["src/**/*.ts"], - }, - }, -}); diff --git a/packages/typescript/ai-client/eslint.config.js b/packages/typescript/ai-client/eslint.config.js new file mode 100644 index 000000000..c3d273991 --- /dev/null +++ b/packages/typescript/ai-client/eslint.config.js @@ -0,0 +1,9 @@ +import rootConfig from '../../../eslint.config.js' + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + ...rootConfig, + { + rules: {}, + }, +] diff --git a/packages/typescript/ai-client/package.json b/packages/typescript/ai-client/package.json index ac0f27d95..9756c3235 100644 --- a/packages/typescript/ai-client/package.json +++ b/packages/typescript/ai-client/package.json @@ -9,6 +9,14 @@ "url": "git+https://github.com/TanStack/ai.git", "directory": "packages/typescript/ai-client" }, + "keywords": [ + "ai", + "client", + "headless", + "tanstack", + "chat", + "streaming" + ], "type": "module", "module": "./dist/index.js", "types": "./dist/index.d.ts", @@ -23,32 +31,18 @@ "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, - "keywords": [ - "ai", - "client", - "headless", - "tanstack", - "chat", - "streaming" - ], "dependencies": { "@tanstack/ai": "workspace:*", "partial-json": "^0.1.7" }, - "devDependencies": { - "@types/node": "^22.10.2", - "@vitest/coverage-v8": "4.0.13", - "tsdown": "^0.15.9", - "typescript": "^5.7.2", - "vitest": "^4.0.13" - } -} \ No newline at end of file + "devDependencies": {} +} diff --git a/packages/typescript/ai-client/tsconfig.json b/packages/typescript/ai-client/tsconfig.json index d42a93c54..3e93ac127 100644 --- a/packages/typescript/ai-client/tsconfig.json +++ b/packages/typescript/ai-client/tsconfig.json @@ -1,12 +1,8 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "outDir": "dist", - "rootDir": ".", - "moduleResolution": "bundler", - "lib": ["ES2023", "DOM"] + "outDir": "dist" }, - "include": ["src/**/*.ts", "tests/**/*.ts"], - "exclude": ["node_modules", "dist", "**/*.config.ts"], - "references": [{ "path": "../ai" }] + "include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "vite.config.ts"], + "exclude": ["node_modules", "dist", "**/*.config.ts", "eslint.config.js"] } diff --git a/packages/typescript/ai-client/tsdown.config.ts b/packages/typescript/ai-client/tsdown.config.ts deleted file mode 100644 index 01597a963..000000000 --- a/packages/typescript/ai-client/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from "tsdown"; - -export default defineConfig({ - entry: ["./src/index.ts"], - format: ["esm"], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, -}); - diff --git a/packages/typescript/ai-client/vite.config.ts b/packages/typescript/ai-client/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/ai-client/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/ai-client/vitest.config.ts b/packages/typescript/ai-client/vitest.config.ts deleted file mode 100644 index 606c0a8ce..000000000 --- a/packages/typescript/ai-client/vitest.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { defineConfig } from "vitest/config"; -import { resolve } from "path"; -import { fileURLToPath } from "url"; - -const __dirname = fileURLToPath(new URL(".", import.meta.url)); - -export default defineConfig({ - test: { - globals: true, - environment: "node", - include: ["tests/**/*.test.ts"], - coverage: { - provider: "v8", - reporter: ["text", "json", "html", "lcov"], - exclude: [ - "node_modules/", - "dist/", - "tests/", - "**/*.test.ts", - "**/*.config.ts", - "**/types.ts", - ], - include: ["src/**/*.ts"], - }, - }, - resolve: { - alias: { - "@tanstack/ai/event-client": resolve(__dirname, "../ai/src/event-client.ts"), - }, - }, -}); - diff --git a/packages/typescript/ai-devtools/package.json b/packages/typescript/ai-devtools/package.json index b9a8818dd..f7a159300 100644 --- a/packages/typescript/ai-devtools/package.json +++ b/packages/typescript/ai-devtools/package.json @@ -28,13 +28,14 @@ "src" ], "scripts": { - "build": "vite build ", - "dev": "tsdown --watch", - "test": "exit 0", - "test:watch": "vitest", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, "keywords": [ "ai", @@ -46,16 +47,13 @@ ], "dependencies": { "@tanstack/ai": "workspace:*", - "@tanstack/devtools-ui": "^0.4.3", - "@tanstack/devtools-utils": "^0.0.6", + "@tanstack/devtools-ui": "^0.4.4", + "@tanstack/devtools-utils": "^0.0.8", "clsx": "^2.1.1", - "goober": "^2.1.16", - "solid-js": "^1.9.9" + "goober": "^2.1.18", + "solid-js": "^1.9.10" }, "devDependencies": { - "@tanstack/config": "^0.22.0", - "solid-js": "^1.9.9", - "vite": "^7.1.6", - "vite-plugin-solid": "^2.11.8" + "vite-plugin-solid": "^2.11.10" } } diff --git a/packages/typescript/ai-fallback/package.json b/packages/typescript/ai-fallback/package.json index 60ff99efd..99f796290 100644 --- a/packages/typescript/ai-fallback/package.json +++ b/packages/typescript/ai-fallback/package.json @@ -23,13 +23,14 @@ "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "exit 0", - "test:watch": "vitest", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, "keywords": [ "ai", @@ -41,13 +42,8 @@ "dependencies": { "@tanstack/ai": "workspace:*" }, - "devDependencies": { - "@types/node": "^22.10.2", - "tsdown": "^0.15.9", - "typescript": "^5.7.2", - "vitest": "^4.0.13" - }, + "devDependencies": {}, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-gemini/package.json b/packages/typescript/ai-gemini/package.json index 28111ace4..a8173dff6 100644 --- a/packages/typescript/ai-gemini/package.json +++ b/packages/typescript/ai-gemini/package.json @@ -23,14 +23,14 @@ "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, "keywords": [ "ai", @@ -43,14 +43,8 @@ "@google/genai": "^1.30.0", "@tanstack/ai": "workspace:*" }, - "devDependencies": { - "@types/node": "^22.10.2", - "@vitest/coverage-v8": "4.0.13", - "tsdown": "^0.15.9", - "typescript": "^5.7.2", - "vitest": "^4.0.13" - }, + "devDependencies": {}, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-ollama/package.json b/packages/typescript/ai-ollama/package.json index 8488f7532..6079e949d 100644 --- a/packages/typescript/ai-ollama/package.json +++ b/packages/typescript/ai-ollama/package.json @@ -23,11 +23,14 @@ "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, "keywords": [ "ai", @@ -39,13 +42,9 @@ ], "dependencies": { "@tanstack/ai": "workspace:*", - "ollama": "^0.5.0" - }, - "devDependencies": { - "@types/node": "^22.10.2", - "tsdown": "^0.15.9", - "typescript": "^5.7.2" + "ollama": "^0.6.3" }, + "devDependencies": {}, "peerDependencies": { "@tanstack/ai": "workspace:*" } diff --git a/packages/typescript/ai-openai/package.json b/packages/typescript/ai-openai/package.json index 312256651..a9f28acde 100644 --- a/packages/typescript/ai-openai/package.json +++ b/packages/typescript/ai-openai/package.json @@ -23,14 +23,14 @@ "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, "keywords": [ "ai", @@ -44,15 +44,9 @@ "openai": "^6.9.1" }, "devDependencies": { - "@types/node": "^22.10.2", - "@vitest/coverage-v8": "4.0.13", - "tsdown": "^0.15.9", - "tsx": "^4.20.6", - "typescript": "^5.7.2", - "vitest": "^4.0.13", - "zod": "^4.1.12" + "zod": "^4.1.13" }, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-react-ui/package.json b/packages/typescript/ai-react-ui/package.json index 5bd412955..f6a65231e 100644 --- a/packages/typescript/ai-react-ui/package.json +++ b/packages/typescript/ai-react-ui/package.json @@ -13,10 +13,13 @@ } }, "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "exit 0", - "test:watch": "vitest" + "build": "vite build", + "clean": "premove ./build ./dist", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest --passWithNoTests", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, "keywords": [ "tanstack", @@ -30,7 +33,7 @@ "dependencies": { "highlight.js": "^11.11.1", "react-markdown": "^10.1.0", - "rehype-highlight": "^7.0.0", + "rehype-highlight": "^7.0.2", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1" @@ -42,11 +45,8 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { - "@types/react": "^18.2.0", - "@types/react-dom": "^18.2.0", - "tsdown": "^0.15.9", - "typescript": "^5.6.3", - "vitest": "^4.0.13" + "@types/react": "^19.2.7", + "react": "^19.2.0" }, "files": [ "dist" diff --git a/packages/typescript/ai-react/package.json b/packages/typescript/ai-react/package.json index f68483b7f..c3fa58934 100644 --- a/packages/typescript/ai-react/package.json +++ b/packages/typescript/ai-react/package.json @@ -23,14 +23,14 @@ "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc", + "test:build": "publint --strict", + "build": "vite build" }, "keywords": [ "ai", @@ -45,15 +45,13 @@ "@tanstack/ai-client": "workspace:*" }, "devDependencies": { + "@eslint-react/eslint-plugin": "^2.3.9", "@testing-library/react": "^16.3.0", - "@types/node": "^22.10.2", - "@types/react": "^18.2.66", - "@vitest/coverage-v8": "^4.0.13", - "jsdom": "^25.0.1", - "react": "^18.2.0", - "tsdown": "^0.15.9", - "typescript": "^5.7.2", - "vitest": "^4.0.13" + "@types/react": "^19.2.7", + "@vitejs/plugin-react": "^5.1.1", + "eslint-plugin-react-compiler": "19.1.0-rc.2", + "eslint-plugin-react-hooks": "^7.0.1", + "react": "^19.2.0" }, "peerDependencies": { "@tanstack/ai": "workspace:*", diff --git a/packages/typescript/ai/eslint.config.js b/packages/typescript/ai/eslint.config.js new file mode 100644 index 000000000..c3d273991 --- /dev/null +++ b/packages/typescript/ai/eslint.config.js @@ -0,0 +1,9 @@ +import rootConfig from '../../../eslint.config.js' + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + ...rootConfig, + { + rules: {}, + }, +] diff --git a/packages/typescript/ai/package.json b/packages/typescript/ai/package.json index 0f6933c52..0d1668cd9 100644 --- a/packages/typescript/ai/package.json +++ b/packages/typescript/ai/package.json @@ -2,7 +2,7 @@ "name": "@tanstack/ai", "version": "0.1.0", "description": "Core TanStack AI library - Open source AI SDK", - "author": "", + "author": "Tanner Linsley", "license": "MIT", "repository": { "type": "git", @@ -22,19 +22,23 @@ "import": "./dist/event-client.js" } }, + "sideEffects": false, + "engines": { + "node": ">=18" + }, "files": [ "dist", "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "vitest run", - "test:watch": "vitest", - "test:coverage": "vitest run --coverage", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, "keywords": [ "ai", @@ -45,13 +49,7 @@ "embeddings" ], "dependencies": { - "@tanstack/devtools-event-client": "^0.3.4" + "@tanstack/devtools-event-client": "^0.3.5" }, - "devDependencies": { - "@types/node": "^22.10.2", - "@vitest/coverage-v8": "4.0.13", - "tsdown": "^0.15.9", - "typescript": "^5.7.2", - "vitest": "^4.0.13" - } + "devDependencies": {} } \ No newline at end of file diff --git a/packages/typescript/ai/tsconfig.docs.json b/packages/typescript/ai/tsconfig.docs.json new file mode 100644 index 000000000..2880b4dfa --- /dev/null +++ b/packages/typescript/ai/tsconfig.docs.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["tests", "src"] +} diff --git a/packages/typescript/ai/tsconfig.json b/packages/typescript/ai/tsconfig.json index 4f525af58..3e93ac127 100644 --- a/packages/typescript/ai/tsconfig.json +++ b/packages/typescript/ai/tsconfig.json @@ -1,9 +1,8 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "outDir": "dist", - "rootDir": "." + "outDir": "dist" }, - "include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts"], - "exclude": ["node_modules", "dist", "**/*.config.ts"] + "include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "vite.config.ts"], + "exclude": ["node_modules", "dist", "**/*.config.ts", "eslint.config.js"] } diff --git a/packages/typescript/ai/tsdown.config.ts b/packages/typescript/ai/tsdown.config.ts deleted file mode 100644 index 09faf432e..000000000 --- a/packages/typescript/ai/tsdown.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from "tsdown"; - -export default defineConfig({ - entry: ["./src/index.ts", "./src/event-client.ts"], - format: ["esm"], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, -}); diff --git a/packages/typescript/ai/vite.config.ts b/packages/typescript/ai/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/ai/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/ai/vitest.config.ts b/packages/typescript/ai/vitest.config.ts deleted file mode 100644 index 03b549476..000000000 --- a/packages/typescript/ai/vitest.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - globals: true, - environment: "node", - include: ["tests/**/*.test.ts"], - coverage: { - provider: "v8", - reporter: ["text", "json", "html", "lcov"], - exclude: [ - "node_modules/", - "dist/", - "tests/", - "**/*.test.ts", - "**/*.config.ts", - "**/types.ts", - ], - include: ["src/**/*.ts"], - }, - }, -}); - diff --git a/packages/typescript/react-ai-devtools/package.json b/packages/typescript/react-ai-devtools/package.json index 2127d25a1..4c542867e 100644 --- a/packages/typescript/react-ai-devtools/package.json +++ b/packages/typescript/react-ai-devtools/package.json @@ -15,13 +15,14 @@ "url": "https://github.com/sponsors/tannerlinsley" }, "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "exit 0", - "test:watch": "vitest", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc", + "test:build": "publint --strict", + "build": "vite build" }, "type": "module", "types": "dist/index.d.ts", @@ -47,12 +48,12 @@ "src" ], "dependencies": { - "@tanstack/devtools-utils": "^0.0.6", + "@tanstack/devtools-utils": "^0.0.8", "@tanstack/ai-devtools-core": "workspace:*" }, "devDependencies": { - "@types/react": "^19.0.7", - "react": "^19.0.0" + "@types/react": "^19.2.7", + "react": "^19.2.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0" diff --git a/packages/typescript/solid-ai-devtools/package.json b/packages/typescript/solid-ai-devtools/package.json index ad758a37f..67f79e981 100644 --- a/packages/typescript/solid-ai-devtools/package.json +++ b/packages/typescript/solid-ai-devtools/package.json @@ -29,13 +29,14 @@ "src" ], "scripts": { - "build": "tsdown", - "dev": "tsdown --watch", - "test": "exit 0", - "test:watch": "vitest", - "clean": "rm -rf dist node_modules", - "typecheck": "tsc --noEmit", - "lint": "tsc --noEmit" + "build": "vite build", + "clean": "premove ./build ./dist", + "lint:fix": "eslint ./src --fix", + "test:build": "publint --strict", + "test:eslint": "eslint ./src", + "test:lib": "vitest", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc" }, "keywords": [ "ai", @@ -47,13 +48,10 @@ ], "dependencies": { "@tanstack/ai-devtools-core": "workspace:*", - "@tanstack/devtools-utils": "^0.0.6" + "@tanstack/devtools-utils": "^0.0.8" }, "devDependencies": { - "@types/node": "^22.10.2", - "tsdown": "^0.15.9", - "typescript": "^5.7.2", - "vitest": "^4.0.13" + "vite-plugin-solid": "^2.11.10" }, "peerDependencies": { "solid-js": ">=1.9.7" diff --git a/packages/typescript/tests-adapters/package.json b/packages/typescript/tests-adapters/package.json index 61ba1676b..ddd4d10f6 100644 --- a/packages/typescript/tests-adapters/package.json +++ b/packages/typescript/tests-adapters/package.json @@ -17,10 +17,10 @@ "@tanstack/ai-openai": "workspace:*" }, "devDependencies": { - "@types/node": "^22.10.2", - "dotenv": "^16.4.7", - "tsx": "^4.19.2", - "typescript": "^5.7.2" + "@types/node": "^24.10.1", + "dotenv": "^17.2.3", + "tsx": "^4.20.6", + "typescript": "^5.9.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89f729461..a54a85611 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,33 +8,90 @@ importers: .: devDependencies: + '@changesets/cli': + specifier: ^2.29.7 + version: 2.29.7(@types/node@24.10.1) + '@faker-js/faker': + specifier: ^10.1.0 + version: 10.1.0 + '@size-limit/preset-small-lib': + specifier: ^11.2.0 + version: 11.2.0(size-limit@11.2.0) + '@svitejs/changesets-changelog-github-compact': + specifier: ^1.2.0 + version: 1.2.0 + '@tanstack/config': + specifier: 0.22.1 + version: 0.22.1(@types/node@24.10.1)(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@testing-library/jest-dom': + specifier: ^6.9.1 + version: 6.9.1 '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) + specifier: ^24.10.1 + version: 24.10.1 + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) + eslint-plugin-unused-imports: + specifier: ^4.3.0 + version: 4.3.0(@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)) + fast-glob: + specifier: ^3.3.3 + version: 3.3.3 + happy-dom: + specifier: ^20.0.10 + version: 20.0.10 + knip: + specifier: ^5.70.2 + version: 5.70.2(@types/node@24.10.1)(typescript@5.9.3) + markdown-link-extractor: + specifier: ^4.0.3 + version: 4.0.3 + nx: + specifier: ^22.1.2 + version: 22.1.2 + premove: + specifier: ^4.0.0 + version: 4.0.0 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + prettier-plugin-svelte: + specifier: ^3.4.0 + version: 3.4.0(prettier@3.6.2)(svelte@5.44.1) + publint: + specifier: ^0.3.15 + version: 0.3.15 + sherif: + specifier: ^1.9.0 + version: 1.9.0 + size-limit: + specifier: ^11.2.0 + version: 11.2.0 typescript: - specifier: ^5.7.2 + specifier: 5.9.3 version: 5.9.3 + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) examples/ts-chat: dependencies: '@ai-sdk/openai': - specifier: ^2.0.52 - version: 2.0.59(zod@4.1.12) + specifier: ^2.0.73 + version: 2.0.73(zod@4.1.13) '@ai-sdk/provider': specifier: ^2.0.0 version: 2.0.0 '@ai-sdk/provider-utils': - specifier: ^3.0.12 - version: 3.0.15(zod@4.1.12) + specifier: ^3.0.17 + version: 3.0.17(zod@4.1.13) '@tailwindcss/vite': - specifier: ^4.0.6 - version: 4.1.16(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^4.1.17 + version: 4.1.17(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/ai': specifier: workspace:* version: link:../../packages/typescript/ai @@ -44,9 +101,6 @@ importers: '@tanstack/ai-client': specifier: workspace:* version: link:../../packages/typescript/ai-client - '@tanstack/ai-devtools-core': - specifier: workspace:* - version: link:../../packages/typescript/ai-devtools '@tanstack/ai-gemini': specifier: workspace:* version: link:../../packages/typescript/ai-gemini @@ -63,52 +117,49 @@ importers: specifier: workspace:* version: link:../../packages/typescript/ai-react-ui '@tanstack/nitro-v2-vite-plugin': - specifier: ^1.132.31 - version: 1.133.19(rolldown@1.0.0-beta.44)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/react-ai-devtools': - specifier: workspace:* - version: link:../../packages/typescript/react-ai-devtools + specifier: ^1.139.0 + version: 1.139.0(rolldown@1.0.0-beta.51)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/react-devtools': - specifier: ^0.8.0 - version: 0.8.0(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(csstype@3.1.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10) + specifier: ^0.8.2 + version: 0.8.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(csstype@3.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10) '@tanstack/react-router': - specifier: ^1.132.0 - version: 1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^1.139.7 + version: 1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-router-devtools': - specifier: ^1.132.0 - version: 1.134.4(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.134.4)(@types/node@22.18.8)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^1.139.7 + version: 1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.139.7)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/react-router-ssr-query': - specifier: ^1.131.7 - version: 1.134.4(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.134.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^1.139.7 + version: 1.139.7(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.139.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-start': - specifier: ^1.132.0 - version: 1.134.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.139.8 + version: 1.139.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/react-store': - specifier: ^0.7.0 - version: 0.7.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^0.8.0 + version: 0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/router-plugin': - specifier: ^1.132.0 - version: 1.134.6(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.139.7 + version: 1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/store': - specifier: ^0.7.0 - version: 0.7.7 + specifier: ^0.8.0 + version: 0.8.0 highlight.js: specifier: ^11.11.1 version: 11.11.1 lucide-react: - specifier: ^0.544.0 - version: 0.544.0(react@19.2.0) + specifier: ^0.555.0 + version: 0.555.0(react@19.2.0) react: - specifier: ^19.0.0 + specifier: ^19.2.0 version: 19.2.0 react-dom: - specifier: ^19.0.0 + specifier: ^19.2.0 version: 19.2.0(react@19.2.0) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.2.2)(react@19.2.0) + version: 10.1.0(@types/react@19.2.7)(react@19.2.0) rehype-highlight: - specifier: ^7.0.0 + specifier: ^7.0.2 version: 7.0.2 rehype-raw: specifier: ^7.0.0 @@ -120,51 +171,45 @@ importers: specifier: ^4.0.1 version: 4.0.1 tailwindcss: - specifier: ^4.0.6 - version: 4.1.16 + specifier: ^4.1.17 + version: 4.1.17 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) zod: - specifier: ^4.1.11 - version: 4.1.12 + specifier: ^4.1.13 + version: 4.1.13 devDependencies: - '@tanstack/devtools-event-client': - specifier: ^0.3.4 - version: 0.3.4 - '@tanstack/devtools-vite': - specifier: ^0.3.11 - version: 0.3.11(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@testing-library/dom': - specifier: ^10.4.0 + specifier: ^10.4.1 version: 10.4.1 '@testing-library/react': - specifier: ^16.2.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^16.3.0 + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/node': - specifier: ^22.10.2 - version: 22.18.8 + specifier: ^24.10.1 + version: 24.10.1 '@types/react': - specifier: ^19.0.8 - version: 19.2.2 + specifier: ^19.2.7 + version: 19.2.7 '@types/react-dom': - specifier: ^19.0.3 - version: 19.2.2(@types/react@19.2.2) + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react': - specifier: ^5.0.4 - version: 5.1.0(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^5.1.1 + version: 5.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) jsdom: - specifier: ^27.0.0 - version: 27.0.0(postcss@8.5.6) + specifier: ^27.2.0 + version: 27.2.0(postcss@8.5.6) typescript: - specifier: ^5.7.2 + specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^7.1.7 - version: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^4.0.14 + version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) web-vitals: specifier: ^5.1.0 version: 5.1.0 @@ -176,55 +221,23 @@ importers: version: link:../../packages/typescript/ai-client devDependencies: vite: - specifier: ^7.1.7 - version: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai: dependencies: '@tanstack/devtools-event-client': - specifier: ^0.3.4 - version: 0.3.4 - devDependencies: - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - '@vitest/coverage-v8': - specifier: 4.0.13 - version: 4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^0.3.5 + version: 0.3.5 packages/typescript/ai-anthropic: dependencies: '@anthropic-ai/sdk': - specifier: ^0.70.0 - version: 0.70.1(zod@4.1.12) + specifier: ^0.71.0 + version: 0.71.0(zod@4.1.13) '@tanstack/ai': specifier: workspace:* version: link:../ai - devDependencies: - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - '@vitest/coverage-v8': - specifier: 4.0.13 - version: 4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai-client: dependencies: @@ -234,22 +247,6 @@ importers: partial-json: specifier: ^0.1.7 version: 0.1.7 - devDependencies: - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - '@vitest/coverage-v8': - specifier: 4.0.13 - version: 4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai-devtools: dependencies: @@ -257,49 +254,30 @@ importers: specifier: workspace:* version: link:../ai '@tanstack/devtools-ui': - specifier: ^0.4.3 - version: 0.4.4(csstype@3.1.3)(solid-js@1.9.10) + specifier: ^0.4.4 + version: 0.4.4(csstype@3.2.3)(solid-js@1.9.10) '@tanstack/devtools-utils': - specifier: ^0.0.6 - version: 0.0.6(@types/react@19.2.2)(csstype@3.1.3)(react@19.2.0)(solid-js@1.9.10) + specifier: ^0.0.8 + version: 0.0.8(@types/react@19.2.7)(csstype@3.2.3)(react@19.2.0)(solid-js@1.9.10) clsx: specifier: ^2.1.1 version: 2.1.1 goober: - specifier: ^2.1.16 - version: 2.1.18(csstype@3.1.3) + specifier: ^2.1.18 + version: 2.1.18(csstype@3.2.3) solid-js: - specifier: ^1.9.9 + specifier: ^1.9.10 version: 1.9.10 devDependencies: - '@tanstack/config': - specifier: ^0.22.0 - version: 0.22.0(@types/node@22.18.8)(@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - vite: - specifier: ^7.1.6 - version: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-solid: - specifier: ^2.11.8 - version: 2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^2.11.10 + version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/typescript/ai-fallback: dependencies: '@tanstack/ai': specifier: workspace:* version: link:../ai - devDependencies: - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai-gemini: dependencies: @@ -309,22 +287,6 @@ importers: '@tanstack/ai': specifier: workspace:* version: link:../ai - devDependencies: - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - '@vitest/coverage-v8': - specifier: 4.0.13 - version: 4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai-ollama: dependencies: @@ -332,18 +294,8 @@ importers: specifier: workspace:* version: link:../ai ollama: - specifier: ^0.5.0 - version: 0.5.18 - devDependencies: - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 + specifier: ^0.6.3 + version: 0.6.3 packages/typescript/ai-openai: dependencies: @@ -352,29 +304,11 @@ importers: version: link:../ai openai: specifier: ^6.9.1 - version: 6.9.1(ws@8.18.3)(zod@4.1.12) + version: 6.9.1(ws@8.18.3)(zod@4.1.13) devDependencies: - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - '@vitest/coverage-v8': - specifier: 4.0.13 - version: 4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - tsx: - specifier: ^4.20.6 - version: 4.20.6 - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) zod: - specifier: ^4.1.12 - version: 4.1.12 + specifier: ^4.1.13 + version: 4.1.13 packages/typescript/ai-react: dependencies: @@ -385,33 +319,27 @@ importers: specifier: workspace:* version: link:../ai-client devDependencies: + '@eslint-react/eslint-plugin': + specifier: ^2.3.9 + version: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@19.2.0(react@18.3.1))(react@18.3.1) - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/react': - specifier: ^18.2.66 - version: 18.3.26 - '@vitest/coverage-v8': - specifier: ^4.0.13 - version: 4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - jsdom: - specifier: ^25.0.1 - version: 25.0.1 + specifier: ^19.2.7 + version: 19.2.7 + '@vitejs/plugin-react': + specifier: ^5.1.1 + version: 5.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + eslint-plugin-react-compiler: + specifier: 19.1.0-rc.2 + version: 19.1.0-rc.2(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-react-hooks: + specifier: ^7.0.1 + version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) react: - specifier: ^18.2.0 - version: 18.3.1 - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^19.2.0 + version: 19.2.0 packages/typescript/ai-react-ui: dependencies: @@ -424,17 +352,14 @@ importers: highlight.js: specifier: ^11.11.1 version: 11.11.1 - react: - specifier: ^18.0.0 || ^19.0.0 - version: 19.2.0 react-dom: specifier: ^18.0.0 || ^19.0.0 version: 19.2.0(react@19.2.0) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@18.3.26)(react@19.2.0) + version: 10.1.0(@types/react@19.2.7)(react@19.2.0) rehype-highlight: - specifier: ^7.0.0 + specifier: ^7.0.2 version: 7.0.2 rehype-raw: specifier: ^7.0.0 @@ -447,20 +372,11 @@ importers: version: 4.0.1 devDependencies: '@types/react': - specifier: ^18.2.0 - version: 18.3.26 - '@types/react-dom': - specifier: ^18.2.0 - version: 18.3.7(@types/react@18.3.26) - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.6.3 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^19.2.7 + version: 19.2.7 + react: + specifier: ^19.2.0 + version: 19.2.0 packages/typescript/react-ai-devtools: dependencies: @@ -468,14 +384,14 @@ importers: specifier: workspace:* version: link:../ai-devtools '@tanstack/devtools-utils': - specifier: ^0.0.6 - version: 0.0.6(@types/react@19.2.2)(csstype@3.1.3)(react@19.2.0)(solid-js@1.9.10) + specifier: ^0.0.8 + version: 0.0.8(@types/react@19.2.7)(csstype@3.2.3)(react@19.2.0)(solid-js@1.9.10) devDependencies: '@types/react': - specifier: ^19.0.7 - version: 19.2.2 + specifier: ^19.2.7 + version: 19.2.7 react: - specifier: ^19.0.0 + specifier: ^19.2.0 version: 19.2.0 packages/typescript/solid-ai-devtools: @@ -484,24 +400,15 @@ importers: specifier: workspace:* version: link:../ai-devtools '@tanstack/devtools-utils': - specifier: ^0.0.6 - version: 0.0.6(@types/react@19.2.2)(csstype@3.1.3)(react@19.2.0)(solid-js@1.9.10) + specifier: ^0.0.8 + version: 0.0.8(@types/react@19.2.7)(csstype@3.2.3)(react@19.2.0)(solid-js@1.9.10) solid-js: specifier: '>=1.9.7' version: 1.9.10 devDependencies: - '@types/node': - specifier: ^22.10.2 - version: 22.18.8 - tsdown: - specifier: ^0.15.9 - version: 0.15.9(typescript@5.9.3) - typescript: - specifier: ^5.7.2 - version: 5.9.3 - vitest: - specifier: ^4.0.13 - version: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-solid: + specifier: ^2.11.10 + version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/typescript/tests-adapters: dependencies: @@ -522,28 +429,34 @@ importers: version: link:../ai-openai devDependencies: '@types/node': - specifier: ^22.10.2 - version: 22.18.8 + specifier: ^24.10.1 + version: 24.10.1 dotenv: - specifier: ^16.4.7 - version: 16.6.1 + specifier: ^17.2.3 + version: 17.2.3 tsx: - specifier: ^4.19.2 + specifier: ^4.20.6 version: 4.20.6 typescript: - specifier: ^5.7.2 + specifier: ^5.9.3 version: 5.9.3 packages: - '@ai-sdk/openai@2.0.59': - resolution: {integrity: sha512-ylaL91BrMyqHsprEI0+brvvGwDjRlKxsJTRL1kpzx6AhG37JqpECQwuqNk7aq+T5Qww9w7dqn1JMUuVPvyZtsA==} + '@acemir/cssom@0.9.24': + resolution: {integrity: sha512-5YjgMmAiT2rjJZU7XK1SNI7iqTy92DpaYVgG6x63FxkJ11UpYfLndHJATtinWJClAXiOlW9XWaUyAQf8pMrQPg==} + + '@adobe/css-tools@4.4.4': + resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + + '@ai-sdk/openai@2.0.73': + resolution: {integrity: sha512-TOGoxkeJMgcxq80ZfyCAqKcfvGPgFsEQEK8SgI/w3He0fqi16KlnZVMexOlg8HOLumF6szweg/YrOmQixsPVGw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.15': - resolution: {integrity: sha512-kOc6Pxb7CsRlNt+sLZKL7/VGQUd7ccl3/tIK+Bqf5/QhHR0Qm3qRBMz1IwU1RmjJEZA73x+KB5cUckbDl2WF7Q==} + '@ai-sdk/provider-utils@3.0.17': + resolution: {integrity: sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -552,8 +465,8 @@ packages: resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@anthropic-ai/sdk@0.70.1': - resolution: {integrity: sha512-AGEhifuvE22VxfQ5ROxViTgM8NuVQzEvqcN8bttR4AP24ythmNE/cL/SrOz79xiv7/osrsmCyErjsistJi7Z8A==} + '@anthropic-ai/sdk@0.71.0': + resolution: {integrity: sha512-go1XeWXmpxuiTkosSXpb8tokLk2ZLkIRcXpbWVwJM6gH5OBtHOVsfPfGuqI1oW7RRt4qc59EmYbrXRZ0Ng06Jw==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -561,14 +474,11 @@ packages: zod: optional: true - '@asamuzakjp/css-color@3.2.0': - resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@asamuzakjp/css-color@4.0.5': resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} - '@asamuzakjp/dom-selector@6.6.1': - resolution: {integrity: sha512-8QT9pokVe1fUt1C8IrJketaeFOdRfTOS96DL3EBjE8CRZm3eHnwMlQe2NPoOSEYPwJ5Q25uYoX1+m9044l3ysQ==} + '@asamuzakjp/dom-selector@6.7.4': + resolution: {integrity: sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -589,10 +499,6 @@ packages: resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} @@ -681,6 +587,13 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.27.1': resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} @@ -743,20 +656,74 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} + '@changesets/apply-release-plan@7.0.13': + resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.7': + resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} + hasBin: true + + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-github-info@0.6.0': + resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} + + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@commitlint/parse@19.8.1': - resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} + '@commitlint/parse@20.0.0': + resolution: {integrity: sha512-j/PHCDX2bGM5xGcWObOvpOc54cXjn9g6xScXzAeOLwTsScaL4Y+qd0pFC6HBwTtrH92NvJQc+2Lx9HFkVi48cg==} engines: {node: '>=v18'} - '@commitlint/types@19.8.1': - resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} + '@commitlint/types@20.0.0': + resolution: {integrity: sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==} engines: {node: '>=v18'} '@csstools/color-helpers@5.1.0': @@ -802,312 +769,156 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.25.11': - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.11': - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.12': resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.12': resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.11': - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.12': resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.11': - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.12': resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.11': - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.12': resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.11': - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.12': resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.12': resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.12': resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.11': - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.12': resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.12': resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.12': resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.11': - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.12': resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.12': resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.11': - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.12': resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.12': resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.11': - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': - resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.11': - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.12': resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.11': - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.12': resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.12': resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.11': - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.12': resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} @@ -1124,6 +935,45 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-react/ast@2.3.9': + resolution: {integrity: sha512-/RiruPxlQs6CMLJ8tiNT1jV8Zq4u80MTWYkNFz2PP9pht23bdcpngDKFoz8RQYDPt71dwiRURHiQAF75v8bIIw==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint-react/core@2.3.9': + resolution: {integrity: sha512-pIkrGuQWyW/GgrAp0kC7nv/Jn53Xjs1/rbBqUcUYvEZnVKuUifnlXQtnmioOEj9PYsuWuOxAPijExrnNavm73w==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint-react/eff@2.3.9': + resolution: {integrity: sha512-pkRWIPnH/jedRn5ZMEA0nDPn5BFuUHKOORbR+hfrAMFp4c3o+1/P1G/eB0vSQvAHAZdPwLZXdgxydz+2rbb8nQ==} + engines: {node: '>=20.19.0'} + + '@eslint-react/eslint-plugin@2.3.9': + resolution: {integrity: sha512-wKeXNa0vc8ACmvBoZPnRZ+s/z0KEmMKRxpOfRthcBvd0TPMIprohT/uwBXd8k15/j3CmaYe74pJFVVagJY3U3g==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint-react/shared@2.3.9': + resolution: {integrity: sha512-LVtD76ycDC7D4OFKDQ8jyATTVxz986J+e9nzydyEUtEf1l+WYiOivPBeJUAs6JEySBl24nO76oEHDABw6l4hig==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@eslint-react/var@2.3.9': + resolution: {integrity: sha512-Bc36K8Lw6KV/5NMaEaFS7as4kgSgZ1wElFejgUEBPZnhUVmq2mITV1BsnMoMYM4jojnkMN80WNALyhONjOx9Jw==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@eslint/config-array@0.21.1': resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1152,6 +1002,10 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@faker-js/faker@10.1.0': + resolution: {integrity: sha512-C3mrr3b5dRVlKPJdfrAXS8+dq+rq8Qm5SNRazca0JKgw1HQERFmrVb0towvMmw5uu8hHKNiQasMaR/tydf3Zsg==} + engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'} + '@gerrit0/mini-shiki@3.15.0': resolution: {integrity: sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ==} @@ -1180,6 +1034,15 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@ioredis/commands@1.4.0': resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} @@ -1191,6 +1054,18 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1216,6 +1091,12 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mapbox/node-pre-gyp@2.0.0': resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} engines: {node: '>=18'} @@ -1237,6 +1118,9 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@0.2.4': + resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} @@ -1252,24 +1136,169 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oozcitak/dom@1.15.10': - resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} - engines: {node: '>=8.0'} + '@nx/nx-darwin-arm64@22.1.2': + resolution: {integrity: sha512-xT6U9oRjze9QTLp8ieoNOno6GHA5S2R36tzergMfTevCTnpJBE0GX8vtI6fmcK3NkVmbdPI9Vb/FmBPcvD9eEQ==} + cpu: [arm64] + os: [darwin] - '@oozcitak/infra@1.0.8': - resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} - engines: {node: '>=6.0'} + '@nx/nx-darwin-x64@22.1.2': + resolution: {integrity: sha512-20n1KPgPNV4gym3rzs/vgDJb0ybNIHuVYU+5m6/+ee5jZNApa5Ivi5Kqpm1RKLiKYgcm97ZbWbGi/K0CXqt1dw==} + cpu: [x64] + os: [darwin] - '@oozcitak/url@1.0.4': - resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} - engines: {node: '>=8.0'} + '@nx/nx-freebsd-x64@22.1.2': + resolution: {integrity: sha512-Z1AMFUuT1MAay09s0MWSRBdb9fY0DVwOm2TnvLRc1zJ2eMVnbK+Z2NMMOMM10udyogLbxGUHefbl+HtAAcJdxQ==} + cpu: [x64] + os: [freebsd] - '@oozcitak/util@8.3.8': - resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} - engines: {node: '>=8.0'} + '@nx/nx-linux-arm-gnueabihf@22.1.2': + resolution: {integrity: sha512-bR82Id9frpz4GbxXXMsiXAQZ6tI7d3Veifyqj6th/9A3/UyZR4YKYpGm2QEsm0hp4n3BO8K5JxCxhGDgp5YwVg==} + cpu: [arm] + os: [linux] + + '@nx/nx-linux-arm64-gnu@22.1.2': + resolution: {integrity: sha512-K6l/qa1rUM1saFlcT/KnJfhRtLyPkpYCxWGNYaMQ3gEFozPCHYdAJUQ+sKS8kVyWt2anAWx2XkmXUaz04OB8BQ==} + cpu: [arm64] + os: [linux] + + '@nx/nx-linux-arm64-musl@22.1.2': + resolution: {integrity: sha512-vZUAUsaop5fdcyWpYzED+hWTKOuDtwG9DNNYUlII0dZhSA8kZwmXoYmrCGeMe5nQX9tF4pNzF+oddC/E169Z6g==} + cpu: [arm64] + os: [linux] + + '@nx/nx-linux-x64-gnu@22.1.2': + resolution: {integrity: sha512-+NiA5uNh1cdpk2k984NlfIxRXaO0Bu0S4qCvWWKmL/150f31qJ/eHN6rd78/Re2qKO1NDoyDZLW6jqRXIm/GgA==} + cpu: [x64] + os: [linux] + + '@nx/nx-linux-x64-musl@22.1.2': + resolution: {integrity: sha512-8O7dXems/Of/biCKeuGMh3nmbS2PNvaL8R4xQzaBl94XitzFMxVFjjoTST7y3Ksmsa5Wrbzwyh+kHOMoIMlVpA==} + cpu: [x64] + os: [linux] + + '@nx/nx-win32-arm64-msvc@22.1.2': + resolution: {integrity: sha512-/Wt3kdj5BksswSWL4N8tef6B+d5r0LbdEPqZimx3AqDMC9H1YkVuwwdBWFGOh+ldj/N8adRuZKjEMQfa/oqPGg==} + cpu: [arm64] + os: [win32] + + '@nx/nx-win32-x64-msvc@22.1.2': + resolution: {integrity: sha512-vihs1hIVMyQYoKul5rfwvU+4WKhbajJ8lSUTVvxjV2j+8F0BYMvRQtB2jDZfBpjEpSBmgP4ApIsLkQzQQBzLug==} + cpu: [x64] + os: [win32] + + '@oozcitak/dom@2.0.2': + resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} + engines: {node: '>=20.0'} + + '@oozcitak/infra@2.0.2': + resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} + engines: {node: '>=20.0'} + + '@oozcitak/url@3.0.0': + resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} + engines: {node: '>=20.0'} + + '@oozcitak/util@10.0.0': + resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} + engines: {node: '>=20.0'} + + '@oxc-project/types@0.98.0': + resolution: {integrity: sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==} + + '@oxc-resolver/binding-android-arm-eabi@11.14.0': + resolution: {integrity: sha512-jB47iZ/thvhE+USCLv+XY3IknBbkKr/p7OBsQDTHode/GPw+OHRlit3NQ1bjt1Mj8V2CS7iHdSDYobZ1/0gagQ==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.14.0': + resolution: {integrity: sha512-XFJ9t7d/Cz+dWLyqtTy3Xrekz+qqN4hmOU2iOUgr7u71OQsPUHIIeS9/wKanEK0l413gPwapIkyc5x9ltlOtyw==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.14.0': + resolution: {integrity: sha512-gwehBS9smA1mzK8frDsmUCHz+6baJVwkKF6qViHhoqA3kRKvIZ3k6WNP4JmF19JhOiGxRcoPa8gZRfzNgXwP2A==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.14.0': + resolution: {integrity: sha512-5wwJvfuoahKiAqqAsMLOI28rqdh3P2K7HkjIWUXNMWAZq6ErX0L5rwJzu6T32+Zxw3k18C7R9IS4wDq/3Ar+6w==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.14.0': + resolution: {integrity: sha512-MWTt+LOQNcQ6fa+Uu5VikkihLi1PSIrQqqp0QD44k2AORasNWl0jRGBTcMSBIgNe82qEQWYvlGzvOEEOBp01Og==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.14.0': + resolution: {integrity: sha512-b6/IBqYrS3o0XiLVBsnex/wK8pTTK+hbGfAMOHVU6p7DBpwPPLgC/tav4IXoOIUCssTFz7aWh/xtUok0swn8VQ==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.14.0': + resolution: {integrity: sha512-o2Qh5+y5YoqVK6YfzkalHdpmQ5bkbGGxuLg1pZLQ1Ift0x+Vix7DaFEpdCl5Z9xvYXogd/TwOlL0TPl4+MTFLA==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.14.0': + resolution: {integrity: sha512-lk8mCSg0Tg4sEG73RiPjb7keGcEPwqQnBHX3Z+BR2SWe+qNHpoHcyFMNafzSvEC18vlxC04AUSoa6kJl/C5zig==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@11.14.0': + resolution: {integrity: sha512-KykeIVhCM7pn93ABa0fNe8vk4XvnbfZMELne2s6P9tdJH9KMBsCFBi7a2BmSdUtTqWCAJokAcm46lpczU52Xaw==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.14.0': + resolution: {integrity: sha512-QqPPWAcZU/jHAuam4f3zV8OdEkYRPD2XR0peVet3hoMMgsihR3Lhe7J/bLclmod297FG0+OgBYQVMh2nTN6oWA==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.14.0': + resolution: {integrity: sha512-DunWA+wafeG3hj1NADUD3c+DRvmyVNqF5LSHVUWA2bzswqmuEZXl3VYBSzxfD0j+UnRTFYLxf27AMptoMsepYg==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.14.0': + resolution: {integrity: sha512-4SRvwKTTk2k67EQr9Ny4NGf/BhlwggCI1CXwBbA9IV4oP38DH8b+NAPxDY0ySGRsWbPkG92FYOqM4AWzG4GSgA==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.14.0': + resolution: {integrity: sha512-hZKvkbsurj4JOom//R1Ab2MlC4cGeVm5zzMt4IsS3XySQeYjyMJ5TDZ3J5rQ8bVj3xi4FpJU2yFZ72GApsHQ6A==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.14.0': + resolution: {integrity: sha512-hABxQXFXJurivw+0amFdeEcK67cF1BGBIN1+sSHzq3TRv4RoG8n5q2JE04Le2n2Kpt6xg4Y5+lcv+rb2mCJLgQ==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.14.0': + resolution: {integrity: sha512-Ln73wUB5migZRvC7obAAdqVwvFvk7AUs2JLt4g9QHr8FnqivlsjpUC9Nf2ssrybdjyQzEMjttUxPZz6aKPSAHw==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-wasm32-wasi@11.14.0': + resolution: {integrity: sha512-z+NbELmCOKNtWOqEB5qDfHXOSWB3kGQIIehq6nHtZwHLzdVO2oBq6De/ayhY3ygriC1XhgaIzzniY7jgrNl4Kw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.14.0': + resolution: {integrity: sha512-Ft0+qd7HSO61qCTLJ4LCdBGZkpKyDj1rG0OVSZL1DxWQoh97m7vEHd7zAvUtw8EcWjOMBQuX4mfRap/x2MOCpQ==} + cpu: [arm64] + os: [win32] - '@oxc-project/types@0.95.0': - resolution: {integrity: sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==} + '@oxc-resolver/binding-win32-ia32-msvc@11.14.0': + resolution: {integrity: sha512-o54jYNSfGdPxHSvXEhZg8FOV3K99mJ1f7hb1alRFb+Yec1GQXNrJXxZPIxNMYeFT13kwAWB7zuQ0HZLnDHFxfw==} + cpu: [ia32] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.14.0': + resolution: {integrity: sha512-j97icaORyM6A7GjgmUzfn7V+KGzVvctRA+eAlJb0c2OQNaETFxl6BXZdnGBDb+6oA0Y4Sr/wnekd1kQ0aVyKGg==} + cpu: [x64] + os: [win32] '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} @@ -1372,88 +1401,89 @@ packages: '@poppinss/exception@1.2.2': resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} - '@quansync/fs@0.1.5': - resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + '@publint/pack@0.1.2': + resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} + engines: {node: '>=18'} - '@rolldown/binding-android-arm64@1.0.0-beta.44': - resolution: {integrity: sha512-g9ejDOehJFhxC1DIXQuZQ9bKv4lRDioOTL42cJjFjqKPl1L7DVb9QQQE1FxokGEIMr6FezLipxwnzOXWe7DNPg==} + '@rolldown/binding-android-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.44': - resolution: {integrity: sha512-PxAW1PXLPmCzfhfKIS53kwpjLGTUdIfX4Ht+l9mj05C3lYCGaGowcNsYi2rdxWH24vSTmeK+ajDNRmmmrK0M7g==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.44': - resolution: {integrity: sha512-/CtQqs1oO9uSb5Ju60rZvsdjE7Pzn8EK2ISAdl2jedjMzeD/4neNyCbwyJOAPzU+GIQTZVyrFZJX+t7HXR1R/g==} + '@rolldown/binding-darwin-x64@1.0.0-beta.51': + resolution: {integrity: sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.44': - resolution: {integrity: sha512-V5Q5W9c4+2GJ4QabmjmVV6alY97zhC/MZBaLkDtHwGy3qwzbM4DYgXUbun/0a8AH5hGhuU27tUIlYz6ZBlvgOA==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.51': + resolution: {integrity: sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44': - resolution: {integrity: sha512-X6adjkHeFqKsTU0FXdNN9HY4LDozPqIfHcnXovE5RkYLWIjMWuc489mIZ6iyhrMbCqMUla9IOsh5dvXSGT9o9A==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51': + resolution: {integrity: sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44': - resolution: {integrity: sha512-kRRKGZI4DXWa6ANFr3dLA85aSVkwPdgXaRjfanwY84tfc3LncDiIjyWCb042e3ckPzYhHSZ3LmisO+cdOIYL6Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51': + resolution: {integrity: sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.44': - resolution: {integrity: sha512-hMtiN9xX1NhxXBa2U3Up4XkVcsVp2h73yYtMDY59z9CDLEZLrik9RVLhBL5QtoX4zZKJ8HZKJtWuGYvtmkCbIQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': + resolution: {integrity: sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.44': - resolution: {integrity: sha512-rd1LzbpXQuR8MTG43JB9VyXDjG7ogSJbIkBpZEHJ8oMKzL6j47kQT5BpIXrg3b5UVygW9QCI2fpFdMocT5Kudg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': + resolution: {integrity: sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.44': - resolution: {integrity: sha512-qI2IiPqmPRW25exXkuQr3TlweCDc05YvvbSDRPCuPsWkwb70dTiSoXn8iFxT4PWqTi71wWHg1Wyta9PlVhX5VA==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': + resolution: {integrity: sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.44': - resolution: {integrity: sha512-+vHvEc1pL5iJRFlldLC8mjm6P4Qciyfh2bh5ZI6yxDQKbYhCHRKNURaKz1mFcwxhVL5YMYsLyaqM3qizVif9MQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.44': - resolution: {integrity: sha512-XSgLxRrtFj6RpTeMYmmQDAwHjKseYGKUn5LPiIdW4Cq+f5SBSStL2ToBDxkbdxKPEbCZptnLPQ/nfKcAxrC8Xg==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.51': + resolution: {integrity: sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44': - resolution: {integrity: sha512-cF1LJdDIX02cJrFrX3wwQ6IzFM7I74BYeKFkzdcIA4QZ0+2WA7/NsKIgjvrunupepWb1Y6PFWdRlHSaz5AW1Wg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44': - resolution: {integrity: sha512-5uaJonDafhHiMn+iEh7qUp3QQ4Gihv3lEOxKfN8Vwadpy0e+5o28DWI42DpJ9YBYMrVy4JOWJ/3etB/sptpUwA==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.44': - resolution: {integrity: sha512-vsqhWAFJkkmgfBN/lkLCWTXF1PuPhMjfnAyru48KvF7mVh2+K7WkKYHezF3Fjz4X/mPScOcIv+g6cf6wnI6eWg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1461,11 +1491,11 @@ packages: '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} - '@rolldown/pluginutils@1.0.0-beta.43': - resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} + '@rolldown/pluginutils@1.0.0-beta.47': + resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==} - '@rolldown/pluginutils@1.0.0-beta.44': - resolution: {integrity: sha512-g6eW7Zwnr2c5RADIoqziHoVs6b3W5QTQ4+qbpfjbkMJ9x+8Og211VW/oot2dj9dVwaK/UyC6Yo+02gV+wWQVNg==} + '@rolldown/pluginutils@1.0.0-beta.51': + resolution: {integrity: sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==} '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -1539,221 +1569,111 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.5': - resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.53.3': resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.5': - resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.53.3': resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.5': - resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.53.3': resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.5': - resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.5': - resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.53.3': resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.5': - resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': - resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.5': - resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.3': resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.5': - resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.3': resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.5': - resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.3': resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.5': - resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.3': resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.5': - resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.5': - resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.5': - resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.3': resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.5': - resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.3': resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.5': - resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.3': resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.5': - resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.3': resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.5': - resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} - cpu: [arm64] - os: [openharmony] - '@rollup/rollup-openharmony-arm64@4.53.3': resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.5': - resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.53.3': resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.5': - resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.3': resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.5': - resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.5': - resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.3': resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} cpu: [x64] @@ -1796,6 +1716,9 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sindresorhus/is@7.1.1': resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} engines: {node: '>=18'} @@ -1804,6 +1727,23 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@size-limit/esbuild@11.2.0': + resolution: {integrity: sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + size-limit: 11.2.0 + + '@size-limit/file@11.2.0': + resolution: {integrity: sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + size-limit: 11.2.0 + + '@size-limit/preset-small-lib@11.2.0': + resolution: {integrity: sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==} + peerDependencies: + size-limit: 11.2.0 + '@solid-primitives/event-listener@2.4.3': resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} peerDependencies: @@ -1846,65 +1786,74 @@ packages: peerDependencies: eslint: '>=9.0.0' - '@tailwindcss/node@4.1.16': - resolution: {integrity: sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==} + '@sveltejs/acorn-typescript@1.0.7': + resolution: {integrity: sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==} + peerDependencies: + acorn: ^8.9.0 + + '@svitejs/changesets-changelog-github-compact@1.2.0': + resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} + engines: {node: ^14.13.1 || ^16.0.0 || >=18} + + '@tailwindcss/node@4.1.17': + resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} - '@tailwindcss/oxide-android-arm64@4.1.16': - resolution: {integrity: sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==} + '@tailwindcss/oxide-android-arm64@4.1.17': + resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.16': - resolution: {integrity: sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==} + '@tailwindcss/oxide-darwin-arm64@4.1.17': + resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.16': - resolution: {integrity: sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==} + '@tailwindcss/oxide-darwin-x64@4.1.17': + resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.16': - resolution: {integrity: sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==} + '@tailwindcss/oxide-freebsd-x64@4.1.17': + resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': - resolution: {integrity: sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': - resolution: {integrity: sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.16': - resolution: {integrity: sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.16': - resolution: {integrity: sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.16': - resolution: {integrity: sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==} + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.16': - resolution: {integrity: sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==} + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1915,29 +1864,29 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': - resolution: {integrity: sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.16': - resolution: {integrity: sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.16': - resolution: {integrity: sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==} + '@tailwindcss/oxide@4.1.17': + resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} engines: {node: '>= 10'} - '@tailwindcss/vite@4.1.16': - resolution: {integrity: sha512-bbguNBcDxsRmi9nnlWJxhfDWamY3lmcyACHcdO1crxfzuLpOhHLLtEIN/nCbbAtj5rchUgQD17QVAKi1f7IsKg==} + '@tailwindcss/vite@4.1.17': + resolution: {integrity: sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 - '@tanstack/config@0.22.0': - resolution: {integrity: sha512-7Wwfw6wBv2Kc+OBNIJQzBSJ6q7GABtwVT+VOQ/7/Gl7z8z1rtEYUZrxUrNvbbrHY+J5/WNZNZjJjTWDf8nTUBw==} + '@tanstack/config@0.22.1': + resolution: {integrity: sha512-0m+gqjrIE6el20VpGIzT54SIjvu27lDRHr+9NiK2nYya5fm0e/19+NfKRoDekZhSBfjaGytUaSpbofzvbSw8zw==} engines: {node: '>=18'} '@tanstack/devtools-client@0.0.4': @@ -1948,8 +1897,8 @@ packages: resolution: {integrity: sha512-lWl88uLAz7ZhwNdLH6A3tBOSEuBCrvnY9Fzr5JPdzJRFdM5ZFdyNWz1Bf5l/F3GU57VodrN0KCFi9OA26H5Kpg==} engines: {node: '>=18'} - '@tanstack/devtools-event-client@0.3.4': - resolution: {integrity: sha512-eq+PpuutUyubXu+ycC1GIiVwBs86NF/8yYJJAKSpPcJLWl6R/761F1H4F/9ziX6zKezltFUH1ah3Cz8Ah+KJrw==} + '@tanstack/devtools-event-client@0.3.5': + resolution: {integrity: sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==} engines: {node: '>=18'} '@tanstack/devtools-ui@0.4.4': @@ -1958,13 +1907,14 @@ packages: peerDependencies: solid-js: '>=1.9.7' - '@tanstack/devtools-utils@0.0.6': - resolution: {integrity: sha512-0sje/N5C5sqsr+hsNQe785i5b5Nix2xWRStjl3s605MtvKoYX/yDGg0Y4bzYSbkA6j7M394tjsLYhhcvRoAzUg==} + '@tanstack/devtools-utils@0.0.8': + resolution: {integrity: sha512-cWoohW9OswidFclwopYRsW0FR3jOoC5iMy0pUHm/31uAnlTb3ViFoZ1VqMf7vZESYdDeee8OjaICS1YbKksDxg==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=19.0.0' react: '>=19.0.0' solid-js: '>=1.9.7' + vue: '>=3.2.0' peerDependenciesMeta: '@types/react': optional: true @@ -1972,48 +1922,44 @@ packages: optional: true solid-js: optional: true + vue: + optional: true - '@tanstack/devtools-vite@0.3.11': - resolution: {integrity: sha512-t5jaWJNgkXOQTxuNrwkz71cN86zPZnLJY2Rz0IaMDgjb0ib1EKHeRgdqHMR/2YL96yhCHHDCHroBQXsw5Da4dg==} - engines: {node: '>=18'} - peerDependencies: - vite: ^6.0.0 || ^7.0.0 - - '@tanstack/devtools@0.8.0': - resolution: {integrity: sha512-j6tBkMpAyTkiGH4ELiHzFSpV0f9fCYtAMEqTEiXEOVVfB57C36KR8LyIHtdeGzK6eQ5sKEdgLbHG9EU31L3Jng==} + '@tanstack/devtools@0.8.2': + resolution: {integrity: sha512-ltVS+MpOrA37CiVunSOCcXctaDnQOJV6FPE5Y2uLq3m8b0spmHwp0edp1PRd2CMG4LnGIlRf7lYdhHa2p9CHNA==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/directive-functions-plugin@1.134.5': - resolution: {integrity: sha512-J3oawV8uBRBbPoLgMdyHt+LxzTNuWRKNJJuCLWsm/yq6v0IQSvIVCgfD2+liIiSnDPxGZ8ExduPXy8IzS70eXw==} + '@tanstack/directive-functions-plugin@1.139.0': + resolution: {integrity: sha512-qLGxldnWa0pp/siZEFEYDU+eB/j40bd1V3IuTzP0sFnrYi11Ldx1yVkOruDKUbO1WM0o+OlPhp22Q1h+LMdDMA==} engines: {node: '>=12'} peerDependencies: vite: '>=6.0.0 || >=7.0.0' - '@tanstack/eslint-config@0.3.2': - resolution: {integrity: sha512-2g+PuGR3GuvvCiR3xZs+IMqAvnYU9bvH+jRml0BFBSxHBj22xFCTNvJWhvgj7uICFF9IchDkFUto91xDPMu5cg==} + '@tanstack/eslint-config@0.3.3': + resolution: {integrity: sha512-8VFyAaIFV9onJcfc5yVj5WWl6DmN3W4m+t0Mb+nZrQmqHy+kDndw5O5Xv2BHVWRRPTqnhlJYh6wHWGh0R81ZzQ==} engines: {node: '>=18'} - '@tanstack/history@1.133.28': - resolution: {integrity: sha512-B7+x7eP2FFvi3fgd3rNH9o/Eixt+pp0zCIdGhnQbAJjFrlwIKGjGnwyJjhWJ5fMQlGks/E2LdDTqEV4W9Plx7g==} + '@tanstack/history@1.139.0': + resolution: {integrity: sha512-l6wcxwDBeh/7Dhles23U1O8lp9kNJmAb2yNjekR6olZwCRNAVA8TCXlVCrueELyFlYZqvQkh0ofxnzG62A1Kkg==} engines: {node: '>=12'} - '@tanstack/nitro-v2-vite-plugin@1.133.19': - resolution: {integrity: sha512-PtQ5rA3WKSSN4D9VZKIxvu+vPB4T7QFg0pky1AzuWxdMVUynqRwenJNXl8eOinB/QdZsRjZcdJ9qcTsce+Pt0Q==} + '@tanstack/nitro-v2-vite-plugin@1.139.0': + resolution: {integrity: sha512-TedrzuMjtHA08x47wCaU6KTrrat8gyzn8a4HUswTwjAa0sMpz4vbOOUDDZyYaJpmjKKbTjgTs6iRr4MONneKTQ==} engines: {node: '>=22.12'} peerDependencies: vite: '>=7.0.0' - '@tanstack/publish-config@0.2.1': - resolution: {integrity: sha512-URVXmXwlZXL75AFyvyOORef1tv2f16dEaFntwLYnBHoKLQMxyWYRzQrnXooxO1xf+GidJuDSZSC6Rc9UX1aK7g==} + '@tanstack/publish-config@0.2.2': + resolution: {integrity: sha512-hTW2rLeZLBMmpwVzWmUJ5L50hPlf4Ea74rZtecbT6qQYCT16JEAbryfHm1u07KIICI2vEArsm2YguckjODqx0w==} engines: {node: '>=18'} '@tanstack/query-core@5.90.5': resolution: {integrity: sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==} - '@tanstack/react-devtools@0.8.0': - resolution: {integrity: sha512-0TsFICBPr68us3iWHFXCIBSEilTo8j1OdIJLW48LNQNjC/Puno82uqX4qFuaZWfZv6K37QnS6UeRxzWJItMFSA==} + '@tanstack/react-devtools@0.8.2': + resolution: {integrity: sha512-D1oG2QivpAmiT4iq7PxbsajmoYmtnhwg9gEK7q9mDiVcnyPjwnhg1ujDvKIzP+ZaRTkQzpJYwtTmS9DzYp8Akg==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -2026,16 +1972,20 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.134.4': - resolution: {integrity: sha512-5egZR8X02DjvuACmBni+EJoP0YkA7hRt+AMlx9cBoVhSe4mWpp5qhqOmG9F9LCRZ2goa82YJXyvas80gjH4fSQ==} + '@tanstack/react-router-devtools@1.139.7': + resolution: {integrity: sha512-ySuFWfR5mHtbs/le5SUb56OxCWTZskwynPp6E9qnyDgB4vX6P7OJDqdgv7rqiorYNjFmAaywraaVZGQ8WuB4+g==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.134.4 + '@tanstack/react-router': ^1.139.7 + '@tanstack/router-core': ^1.139.7 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' + peerDependenciesMeta: + '@tanstack/router-core': + optional: true - '@tanstack/react-router-ssr-query@1.134.4': - resolution: {integrity: sha512-isU5+yTpUgtHa3tnPGHzU47xmg+BiNjGvErhsXOaWspeGIdG2VbGNqkrML0n0bSwuFaH27IhXa8pEcC0122FMw==} + '@tanstack/react-router-ssr-query@1.139.7': + resolution: {integrity: sha512-S38TJsBrA7NRxFzdCTb7uDIls1JEtRJAuSLWQrlVigmFEHY2yk2/r45aSKu0cc/ucxRRZ+0JxUo4lFInoFYt1w==} engines: {node: '>=12'} peerDependencies: '@tanstack/query-core': '>=5.90.0' @@ -2044,73 +1994,66 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.134.4': - resolution: {integrity: sha512-AJfO4SOltCjyHKwZ+NHkDxwLj1CJQdgvmvHh8U2ikF2d4rjMlQ0bRjEpDJ8eY5AO2Z09cak/5goqNvcpRQjhfQ==} + '@tanstack/react-router@1.139.7': + resolution: {integrity: sha512-5vhwIAwoxWl7oeIZRNgk5wh9TCkaAinK9qbfdKuKzwGtMHqnv1bRrfKwam3/MaMwHCmvnNfnFj0RYfnBA/ilEg==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.134.4': - resolution: {integrity: sha512-Do7tszYy2SaxPevDAI5et1RnBbn/SUSqarddBZKNFXrIjXnjT8cfCisfK07ydw9SHOj9XuGpxBuTH7m4qX9zgw==} + '@tanstack/react-start-client@1.139.7': + resolution: {integrity: sha512-082eg9SvYdg4+kZFO6fhiwazoWOa8TUWLIi2Um3OLcnlBJzAf3cwsYE+Ub4siPucRX4DxzSDrY5TgH+uMYKtBQ==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-server@1.134.5': - resolution: {integrity: sha512-eSBTbKHNdrsKZ+uoJN1uMrdnhL8fe42nxIkrS1XwXbSg0dmAyOD2IaUoSKNtUtWuLXKEsjtBr4kCpayrdwuEJw==} + '@tanstack/react-start-server@1.139.8': + resolution: {integrity: sha512-7lmu6a2PDpxd1J438FmV/lxc5vRRvy34dV9NYRNvOj6fxcGfagxix1qi6NKtgmiSQQ83DNfrckHno0wlOJJLOg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.134.6': - resolution: {integrity: sha512-xEqD6AgD+2s4cs7OgbtX61WL8jXxsbl5k4eBkdzX4DwXdhPDVF/5rEuMmj71V5kY1K3h+VQMkYH4G+M0ghCNbg==} + '@tanstack/react-start@1.139.8': + resolution: {integrity: sha512-vNSd1w+NCDAmTzkiPC6klnwVZBH8EjXg+c5sf7+PPUYXMZMb7kYCRiH8xKjCBRQkubgQeA8bnVsbRWqC21hQHw==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' vite: '>=7.0.0' - '@tanstack/react-store@0.7.7': - resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/react-store@0.8.0': resolution: {integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.134.4': - resolution: {integrity: sha512-f3lzOx3aX+z+gfVyl9D+APArwM395E7mW26A0od9QB+yOAbFnEtJ8mUDWJAY57BPR9fOCnkMEaEVx9m7eL3u4w==} + '@tanstack/router-core@1.139.7': + resolution: {integrity: sha512-mqgsJi4/B2Jo6PXRUs1AsWA+06nqiqVZe1aXioA3vR6PesNeKUSXWfmIoYF6wOx3osiV0BnwB1JCBrInCOQSWA==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.134.4': - resolution: {integrity: sha512-fhRGPjJTBP/bkPr4Qf+HCI574R/cPpygbeW3AfsoJ08nhW7hePBGbDUMk0rtEwvGO5uHESQcq0un6xrrNIxtQQ==} + '@tanstack/router-devtools-core@1.139.7': + resolution: {integrity: sha512-Tx6+rCyjthlH7KS9Jz6YdT2KQ6rZQ66F+XJOj7Rel8zGAvyqx8USzcqTRvC+QjaU1jIJq+mNPWpMdKkkxPSOVA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.134.4 + '@tanstack/router-core': ^1.139.7 csstype: ^3.0.10 solid-js: '>=1.9.5' - tiny-invariant: ^1.3.3 peerDependenciesMeta: csstype: optional: true - '@tanstack/router-generator@1.134.4': - resolution: {integrity: sha512-8qGpsNpNdSJUuaGN04osRYaW8QZBVglUvHO6zLjQyVSfyj2zUmSdSwEbsFijftiroQU3SMz7Ugc1dA8Ky9iEAA==} + '@tanstack/router-generator@1.139.7': + resolution: {integrity: sha512-xnmF1poNH/dHtwFxecCcRsaLRIXVnXRZiWYUpvtyaPv4pQYayCrFQCg2ygDbCV0/8H7ctMBJh5MIL7GgPR7+xw==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.134.6': - resolution: {integrity: sha512-6XvjKepegiNEHPH4Bgt0uGVMhw4me2xSEnF8S5cJU/9mNal9n7/bdNrC/HaIkIsn0AXcKbXagvO8J6j9yH2kRg==} + '@tanstack/router-plugin@1.139.7': + resolution: {integrity: sha512-sgB8nOoVKr0A2lw5p7kQ3MtEA03d1t+Qvqyy+f/QkHy5pGk8Yohg64TEX+2e98plfM3j5vAOu/JhAyoLLrp1Jw==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.134.4 + '@tanstack/react-router': ^1.139.7 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.10 webpack: '>=5.92.0' @@ -2126,61 +2069,62 @@ packages: webpack: optional: true - '@tanstack/router-ssr-query-core@1.134.4': - resolution: {integrity: sha512-K2NGBGx4ofC+3EmljtgWoJDpuc+qvr9U6P2kbr3AJI8DeqsyVcAxIkx5+OsyAij1LoX9qtlfgG9CxhJZRH6shw==} + '@tanstack/router-ssr-query-core@1.139.7': + resolution: {integrity: sha512-Ei4P2g/7xNO99OgvBOAAeVLI6VnqXYcSTI1Q6b1NYBzsb4aIo8Ne38cgVnanDlnIRrUJjIDQdZTAtu0AdANiyg==} engines: {node: '>=12'} peerDependencies: '@tanstack/query-core': '>=5.90.0' '@tanstack/router-core': '>=1.127.0' - '@tanstack/router-utils@1.133.19': - resolution: {integrity: sha512-WEp5D2gPxvlLDRXwD/fV7RXjYtqaqJNXKB/L6OyZEbT+9BG/Ib2d7oG9GSUZNNMGPGYAlhBUOi3xutySsk6rxA==} + '@tanstack/router-utils@1.139.0': + resolution: {integrity: sha512-jT7D6NimWqoFSkid4vCno8gvTyfL1+NHpgm3es0B2UNhKKRV3LngOGilm1m6v8Qvk/gy6Fh/tvB+s+hBl6GhOg==} engines: {node: '>=12'} - '@tanstack/server-functions-plugin@1.134.5': - resolution: {integrity: sha512-2sWxq70T+dOEUlE3sHlXjEPhaFZfdPYlWTSkHchWXrFGw2YOAa+hzD6L9wHMjGDQezYd03ue8tQlHG+9Jzbzgw==} + '@tanstack/server-functions-plugin@1.139.0': + resolution: {integrity: sha512-IpNFiCoy2YU6gY/4lCKIVlFyU67ltlcUMGcdnrevqOgq20AbMyeLbbBVo9tAA3TkHK9F+9Hd7DqGXsup2pmBLg==} engines: {node: '>=12'} - '@tanstack/start-client-core@1.134.4': - resolution: {integrity: sha512-FGtA+J6yWW+AH4IihukqKvlUxJs9R8PoUjHY4wsvZfsNILBRGFmdX6443X5spOx8AdH07k9Lak+UauhkcI+ToA==} + '@tanstack/start-client-core@1.139.7': + resolution: {integrity: sha512-omG032CeYUWlwQt6s7VFqhc9dGHKWNJ0C5PoIckL+G/HcV+0/RxYkiKzx/HTTzWt+K+LpsBDFFNnrTUUyTE5sw==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.134.6': - resolution: {integrity: sha512-6Nm9TN0fpEJvAUsK33QGVR40acwT8gmpvBuBTSsIOGNkjGnVNlBVglZgEeCriabWWJBCmLu8VPx+Aj+lkEFkqQ==} + '@tanstack/start-plugin-core@1.139.8': + resolution: {integrity: sha512-u1+rof/1vNHzFVR0yPWWSVwzbCtvndQsfjBR104xSTLCLB0oGvFvkCU0xLLyKtxhqsrYZFrqudg5B8aVH2plOg==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' - '@tanstack/start-server-core@1.134.5': - resolution: {integrity: sha512-/0hV2Xkwc3bFS896qzt8WwV6LRoQi3Sf9iRR9DrrF3njuZ0C1vT+bBeGW3Z9Pe1gPUCDditog0cjKfAogRzwww==} + '@tanstack/start-server-core@1.139.8': + resolution: {integrity: sha512-jKC83uMS2kgCHoqlHmxh9hAK1pN9Wd8l+Lhkibwp9PKKMW4Z1bxy5xCx6sr3TD2yJEOP25SRhYMrtAKmrLmYGA==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.134.4': - resolution: {integrity: sha512-B2N82ygzd6I0v5SA/T5k4Z2vWgN6qWeniO1OOsMJfUiWQKslBAl53H1rcAJZ3TZtP/GXDoLGyOHAAcsEtHDCIA==} + '@tanstack/start-storage-context@1.139.7': + resolution: {integrity: sha512-l2utb0CXLE+wfj1wlAUPHohiq7n5nOBMl3pflhl3JzCXt+6D9AAogkfrysyxOAvx3KnLh3oG+qwf1KHWIDB9HA==} engines: {node: '>=22.12.0'} - '@tanstack/store@0.7.7': - resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} - '@tanstack/store@0.8.0': resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} - '@tanstack/typedoc-config@0.3.0': - resolution: {integrity: sha512-g7sfxscIq0wYUGtOLegnTbiMTsNiAz6r28CDgdZqIIjI1naWZoIlABpWH2qdI3IIJUDWvhOaVwAo6sfqzm6GsQ==} + '@tanstack/typedoc-config@0.3.1': + resolution: {integrity: sha512-frgA1vjzxbdU5/xn/Z/UqyOd1yuegEfAnx9QNbcX+1XQ3TCzD+x89cMZH9iyxdTC1Tasx2gq7DCNCvX962X9WA==} engines: {node: '>=18'} - '@tanstack/virtual-file-routes@1.133.19': - resolution: {integrity: sha512-IKwZENsK7owmW1Lm5FhuHegY/SyQ8KqtL/7mTSnzoKJgfzhrrf9qwKB1rmkKkt+svUuy/Zw3uVEpZtUzQruWtA==} + '@tanstack/virtual-file-routes@1.139.0': + resolution: {integrity: sha512-9PImF1d1tovTUIpjFVa0W7Fwj/MHif7BaaczgJJfbv3sDt1Gh+oW9W9uCw9M3ndEJynnp5ZD/TTs0RGubH5ssg==} engines: {node: '>=12'} - '@tanstack/vite-config@0.4.0': - resolution: {integrity: sha512-sTlzLXTvFwtPFAFrRNmU93ppl+atpX9ehWQDu+ZqfEX9vXxX/d1hUQp3wcbpgudA2SsIV7z0a8Hv6MBU63sGwQ==} + '@tanstack/vite-config@0.4.1': + resolution: {integrity: sha512-FOl8EF6SAcljanKSm5aBeJaflFcxQAytTbxtNW8HC6D4x+UBW68IC4tBcrlrsI0wXHBmC/Gz4Ovvv8qCtiXSgQ==} engines: {node: '>=18'} '@testing-library/dom@10.4.1': resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + '@testing-library/react@16.3.0': resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} engines: {node: '>=18'} @@ -2199,6 +2143,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -2247,27 +2194,22 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.18.8': - resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@types/node@20.19.25': + resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} - peerDependencies: - '@types/react': ^18.0.0 + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} - '@types/react-dom@19.2.2': - resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@18.3.26': - resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} - - '@types/react@19.2.2': - resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -2278,6 +2220,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@typescript-eslint/eslint-plugin@8.46.3': resolution: {integrity: sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2299,16 +2244,32 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.48.0': + resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.46.3': resolution: {integrity: sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.48.0': + resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.46.3': resolution: {integrity: sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.48.0': + resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.46.3': resolution: {integrity: sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2316,16 +2277,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.48.0': + resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.46.3': resolution: {integrity: sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.48.0': + resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.46.3': resolution: {integrity: sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.48.0': + resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.46.3': resolution: {integrity: sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2333,10 +2311,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.48.0': + resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.46.3': resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.48.0': + resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -2440,26 +2429,17 @@ packages: engines: {node: '>=18'} hasBin: true - '@vitejs/plugin-react@5.1.0': - resolution: {integrity: sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==} + '@vitejs/plugin-react@5.1.1': + resolution: {integrity: sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/coverage-v8@4.0.13': - resolution: {integrity: sha512-w77N6bmtJ3CFnL/YHiYotwW/JI3oDlR3K38WEIqegRfdMSScaYxwYKB/0jSNpOTZzUjQkG8HHEz4sdWQMWpQ5g==} - peerDependencies: - '@vitest/browser': 4.0.13 - vitest: 4.0.13 - peerDependenciesMeta: - '@vitest/browser': - optional: true - - '@vitest/expect@4.0.13': - resolution: {integrity: sha512-zYtcnNIBm6yS7Gpr7nFTmq8ncowlMdOJkWLqYvhr/zweY6tFbDkDi8BPPOeHxEtK1rSI69H7Fd4+1sqvEGli6w==} + '@vitest/expect@4.0.14': + resolution: {integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==} - '@vitest/mocker@4.0.13': - resolution: {integrity: sha512-eNCwzrI5djoauklwP1fuslHBjrbR8rqIVbvNlAnkq1OTa6XT+lX68mrtPirNM9TnR69XUPt4puBCx2Wexseylg==} + '@vitest/mocker@4.0.14': + resolution: {integrity: sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -2469,20 +2449,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.13': - resolution: {integrity: sha512-ooqfze8URWbI2ozOeLDMh8YZxWDpGXoeY3VOgcDnsUxN0jPyPWSUvjPQWqDGCBks+opWlN1E4oP1UYl3C/2EQA==} + '@vitest/pretty-format@4.0.14': + resolution: {integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==} - '@vitest/runner@4.0.13': - resolution: {integrity: sha512-9IKlAru58wcVaWy7hz6qWPb2QzJTKt+IOVKjAx5vb5rzEFPTL6H4/R9BMvjZ2ppkxKgTrFONEJFtzvnyEpiT+A==} + '@vitest/runner@4.0.14': + resolution: {integrity: sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==} - '@vitest/snapshot@4.0.13': - resolution: {integrity: sha512-hb7Usvyika1huG6G6l191qu1urNPsq1iFc2hmdzQY3F5/rTgqQnwwplyf8zoYHkpt7H6rw5UfIw6i/3qf9oSxQ==} + '@vitest/snapshot@4.0.14': + resolution: {integrity: sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==} - '@vitest/spy@4.0.13': - resolution: {integrity: sha512-hSu+m4se0lDV5yVIcNWqjuncrmBgwaXa2utFLIrBkQCQkt+pSwyZTPFQAZiiF/63j8jYa8uAeUZ3RSfcdWaYWw==} + '@vitest/spy@4.0.14': + resolution: {integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==} - '@vitest/utils@4.0.13': - resolution: {integrity: sha512-ydozWyQ4LZuu8rLp47xFUWis5VOKMdHjXCWhs1LuJsTNKww+pTHQNK4e0assIB9K80TxFyskENL6vCu3j34EYA==} + '@vitest/utils@4.0.14': + resolution: {integrity: sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==} '@volar/language-core@2.4.23': resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} @@ -2513,6 +2493,17 @@ packages: '@vue/shared@3.5.24': resolution: {integrity: sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==} + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + '@yarnpkg/parsers@3.0.2': + resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} + engines: {node: '>=18.12.0'} + + '@zkochan/js-yaml@0.0.7': + resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} + hasBin: true + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -2569,6 +2560,10 @@ packages: ajv@8.13.0: resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2614,24 +2609,25 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-kit@2.1.3: - resolution: {integrity: sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g==} - engines: {node: '>=20.19.0'} - ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.8: - resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} - async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -2641,6 +2637,13 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + b4a@1.7.3: resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} peerDependencies: @@ -2687,6 +2690,10 @@ packages: resolution: {integrity: sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==} hasBin: true + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -2700,8 +2707,11 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - birpc@2.6.1: - resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} + birecord@0.1.1: + resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2731,9 +2741,16 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bytes-iec@3.1.1: + resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} + engines: {node: '>= 0.8'} + c12@3.3.1: resolution: {integrity: sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ==} peerDependencies: @@ -2742,10 +2759,6 @@ packages: magicast: optional: true - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2784,6 +2797,9 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -2803,9 +2819,21 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} @@ -2814,6 +2842,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2931,29 +2963,30 @@ packages: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} - cssstyle@4.6.0: - resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} - engines: {node: '>=18'} + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssstyle@5.3.1: - resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==} + cssstyle@5.3.3: + resolution: {integrity: sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==} engines: {node: '>=20'} csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - data-urls@6.0.0: resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} engines: {node: '>=20'} + dataloader@1.4.0: + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + db0@0.3.4: resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} peerDependencies: @@ -3002,6 +3035,9 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -3028,6 +3064,10 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -3037,6 +3077,9 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + devalue@5.5.0: + resolution: {integrity: sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -3044,9 +3087,16 @@ packages: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -3068,6 +3118,14 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -3076,15 +3134,6 @@ packages: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} - dts-resolver@2.1.2: - resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} - engines: {node: '>=20.18.0'} - peerDependencies: - oxc-resolver: '>=11.0.0' - peerDependenciesMeta: - oxc-resolver: - optional: true - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -3110,10 +3159,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - empathic@2.0.0: - resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} - engines: {node: '>=14'} - encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -3121,10 +3166,21 @@ packages: encoding-sniffer@0.2.1: resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3155,11 +3211,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.25.11: - resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.12: resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} @@ -3172,6 +3223,10 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -3220,6 +3275,62 @@ packages: peerDependencies: eslint: '>=8.23.0' + eslint-plugin-react-compiler@19.1.0-rc.2: + resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} + engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react-dom@2.3.9: + resolution: {integrity: sha512-xflcmWONib2KN54bJ25AvrYSPrp0qDWwWoG+tZJWD7xe0OcvC42zpERKyMuqTMuXfKPJNUOs2ZB1z6e3HNRviw==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-react-hooks-extra@2.3.9: + resolution: {integrity: sha512-ImANssr1gfBNMahqCufe2nhb1CZpqMBjKYgwtYF6u0pV11UXnGj181MW+YBEPEB+qIN4NK3hKxSsQngQJPBfQQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-naming-convention@2.3.9: + resolution: {integrity: sha512-3cxHcn6oA29awTQr20LCw9XBhms65giuHHclU3KyLtFVoHSX/LUJtXUpv/KezkhRiaavT8PmxGTGMZiGGY9vHw==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-react-web-api@2.3.9: + resolution: {integrity: sha512-AlSBt0ITf1nT1I6U4Kyj9GoFEpfLh8sR62sl+6uYSladmhPAKXMOSB7Ban7VX6jZcA7LHp+acKAJCv18fKxaUg==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-react-x@2.3.9: + resolution: {integrity: sha512-G0Aqk7oHMVmMNnulpQ2nb/Iq2o9JNkk3WQT70zBVQJYIz6NUrXp/1ujL2+cXb5A8ZapEN53F0pP9ZoQRIzNhsA==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-unused-imports@4.3.0: + resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3242,6 +3353,9 @@ packages: jiti: optional: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3255,6 +3369,9 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} + esrap@2.2.0: + resolution: {integrity: sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3309,6 +3426,9 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3328,6 +3448,9 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3344,6 +3467,10 @@ packages: fetchdts@0.1.7: resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -3355,6 +3482,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -3363,9 +3494,22 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -3374,6 +3518,11 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} + engines: {node: '>=18.3.0'} + hasBin: true + formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -3382,10 +3531,20 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} + front-matter@4.0.2: + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3456,6 +3615,10 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + globby@15.0.0: resolution: {integrity: sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==} engines: {node: '>=20'} @@ -3497,8 +3660,8 @@ packages: h3@1.15.4: resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} - h3@2.0.0-beta.4: - resolution: {integrity: sha512-/JdwHUGuHjbBXAVxQN7T7QeI9cVlhsqMKVNFHebZVs9RoEYH85Ogh9O1DEy/1ZiJkmMwa1gNg6bBcGhc1Itjdg==} + h3@2.0.0-beta.5: + resolution: {integrity: sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==} engines: {node: '>=20.11.1'} peerDependencies: crossws: ^0.4.1 @@ -3506,6 +3669,10 @@ packages: crossws: optional: true + happy-dom@20.0.10: + resolution: {integrity: sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==} + engines: {node: '>=20.0.0'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3556,6 +3723,12 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} @@ -3570,8 +3743,8 @@ packages: html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-link-extractor@1.0.5: + resolution: {integrity: sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==} html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} @@ -3601,6 +3774,10 @@ packages: httpxy@0.1.7: resolution: {integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==} + human-id@4.1.2: + resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} + hasBin: true + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -3609,6 +3786,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3632,6 +3813,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3687,11 +3872,21 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-immutable-type@5.0.1: + resolution: {integrity: sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==} + peerDependencies: + eslint: '*' + typescript: '>=4.7.4' + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} hasBin: true + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -3713,6 +3908,9 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -3721,14 +3919,26 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + is-text-path@2.0.0: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -3751,25 +3961,13 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} - - istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -3791,18 +3989,9 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdom@25.0.1: - resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - - jsdom@27.0.0: - resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} - engines: {node: '>=20'} + jsdom@27.2.0: + resolution: {integrity: sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -3841,6 +4030,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -3868,15 +4060,20 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} + knip@5.70.2: + resolution: {integrity: sha512-LI7DbeVnk7h9+FAet5KzzHNdDwJyqDa2+cn4uQfZYTfpuVjEqtGmYD9r5b9JEuOs4eVkf/7sskNhWXxELm3C/Q==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4 <7' + knitwork@1.2.0: resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - launch-editor@2.12.0: - resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} - lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -3955,6 +4152,14 @@ packages: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -3970,6 +4175,13 @@ packages: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3983,16 +4195,19 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - lowlight@3.3.0: resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} @@ -4010,8 +4225,8 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lucide-react@0.544.0: - resolution: {integrity: sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw==} + lucide-react@0.555.0: + resolution: {integrity: sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4022,26 +4237,27 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.30.19: - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} magicast@0.5.1: resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + markdown-link-extractor@4.0.3: + resolution: {integrity: sha512-aEltJiQ4/oC0h6Jbw/uuATGSHZPkcH8DIunNH1A0e+GSFkvZ6BbBkdvBTVfIV8r6HapCU3yTd0eFdi3ZeM1eAQ==} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@17.0.1: + resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} + engines: {node: '>= 20'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -4226,10 +4442,18 @@ packages: engines: {node: '>=16'} hasBin: true + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} @@ -4240,10 +4464,17 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4255,6 +4486,10 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4266,6 +4501,14 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + nanospinner@1.2.2: + resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} + napi-postinstall@0.3.4: resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -4316,6 +4559,9 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + node-mock-http@1.0.3: resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} @@ -4331,6 +4577,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4338,27 +4588,46 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.22: - resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + nx@22.1.2: + resolution: {integrity: sha512-sD1CoYFPMsoiRG095qUhEhzL6ZbSY1a68dw9gJNRg60gM06O7l6X2Kyu+dEEwIZ5PutD82Pt4/S2nzK6mdhfew==} + hasBin: true + peerDependencies: + '@swc-node/register': ^1.8.0 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true nypm@0.6.2: resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + ofetch@1.5.0: resolution: {integrity: sha512-A7llJ7eZyziA5xq9//3ZurA8OhFqtS99K5/V1sLBJ5j137CM/OAjlbA/TEJXBuOWwOfLqih+oH5U3ran4za1FQ==} ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - ollama@0.5.18: - resolution: {integrity: sha512-lTFqTf9bo7Cd3hpF6CviBe/DEhewjoZYd9N/uCe7O20qYTvGqrNOFOBDj3lbZgFWHUgDv5EeyusYxsZSLS8nvg==} + ollama@0.6.3: + resolution: {integrity: sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -4383,17 +4652,53 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.3.0: + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + oxc-resolver@11.14.0: + resolution: {integrity: sha512-i4wNrqhOd+4YdHJfHglHtFiqqSxXuzFA+RUqmmWN1aMD3r1HqUSrIhw17tSO4jwKfhLs9uw1wzFPmvMsWacStg==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + package-manager-detector@1.5.0: + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4410,6 +4715,9 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -4439,6 +4747,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + path-type@6.0.0: resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} engines: {node: '>=18'} @@ -4463,6 +4775,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -4477,6 +4793,22 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + premove@4.0.0: + resolution: {integrity: sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==} + engines: {node: '>=6'} + hasBin: true + + prettier-plugin-svelte@3.4.0: + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + prettier@3.6.2: resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} @@ -4490,6 +4822,10 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -4503,6 +4839,14 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + publint@0.3.15: + resolution: {integrity: sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A==} + engines: {node: '>=18'} + hasBin: true + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -4538,6 +4882,9 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: @@ -4548,17 +4895,21 @@ packages: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - react@19.2.0: resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readable-stream@4.7.0: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4578,6 +4929,10 @@ packages: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -4626,11 +4981,19 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4639,27 +5002,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown-plugin-dts@0.16.12: - resolution: {integrity: sha512-9dGjm5oqtKcbZNhpzyBgb8KrYiU616A7IqcFWG7Msp1RKAXQ/hapjivRg+g5IYWSiFhnk3OKYV5T4Ft1t8Cczg==} - engines: {node: '>=20.18.0'} - peerDependencies: - '@ts-macro/tsc': ^0.3.6 - '@typescript/native-preview': '>=7.0.0-dev.20250601.1' - rolldown: ^1.0.0-beta.9 - typescript: ^5.0.0 - vue-tsc: ~3.1.0 - peerDependenciesMeta: - '@ts-macro/tsc': - optional: true - '@typescript/native-preview': - optional: true - typescript: - optional: true - vue-tsc: - optional: true - - rolldown@1.0.0-beta.44: - resolution: {integrity: sha512-gcqgyCi3g93Fhr49PKvymE8PoaGS0sf6ajQrsYaQ8o5de6aUEbD6rJZiJbhOfpcqOnycgsAsUNPYri1h25NgsQ==} + rolldown@1.0.0-beta.51: + resolution: {integrity: sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -4681,11 +5025,6 @@ packages: rollup: optional: true - rollup@4.52.5: - resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.53.3: resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4694,15 +5033,13 @@ packages: rou3@0.7.10: resolution: {integrity: sha512-aoFj6f7MJZ5muJ+Of79nrhs9N3oLGqi2VEMe94Zbkjb6Wupha46EuoYgpWSOZlXww3bbd8ojgXTAA2mzimX5Ww==} - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - - rrweb-cssom@0.8.0: - resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -4749,10 +5086,20 @@ packages: peerDependencies: seroval: ^1.0 + seroval-plugins@1.4.0: + resolution: {integrity: sha512-zir1aWzoiax6pbBVjoYVd0O1QQXgIL3eVGBMsBsNmM8Ukq90yGaWlfx0AB9dTS8GPqrOrbXn79vmItCUP9U3BQ==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + seroval@1.3.2: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} + seroval@1.4.0: + resolution: {integrity: sha512-BdrNXdzlofomLTiRnwJTSEAaGKyHHZkbMXIywOh7zlzp4uZnXErEwl9XZ+N1hJSNpeTtNxWvVwN0wUzAIQ4Hpg==} + engines: {node: '>=10'} + serve-placeholder@2.0.2: resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} @@ -4771,26 +5118,82 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} + sherif-darwin-arm64@1.9.0: + resolution: {integrity: sha512-R+RpKSzlqZgBHean04CqHrdlmBBKu6Dhd/9BcdCpjx/KpqsalZsh9LzBVxTWLTtT9IBb/ccr23PNqFzWQTuh6A==} + cpu: [arm64] + os: [darwin] - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + sherif-darwin-x64@1.9.0: + resolution: {integrity: sha512-b/KX9MczzkzmyEjngGxYuBq/rOdM6CbGcDLFdQ0H990Dmn9foj4C/UpLlyqSxXcsJhy586ATMEVN68aM2hFQdQ==} + cpu: [x64] + os: [darwin] - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + sherif-linux-arm64-musl@1.9.0: + resolution: {integrity: sha512-OZ4cKcCXTJTl8zaTxKnP8z0wu05nDeGtttxRQjaXHSKK+fjBwGkH/1qqFEVDcRANUxtLRLLdwmDyxvqQrCzhPQ==} + cpu: [arm64] + os: [linux] - simple-git@3.30.0: - resolution: {integrity: sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==} + sherif-linux-arm64@1.9.0: + resolution: {integrity: sha512-TyuGhaD/efCxGIk4scx09n6NsTr3qfKvH5qHYdyxtelv1mHRgbzVHwJ+Jj98jVktuzOZoexHpxr/hz7RUjd/nw==} + cpu: [arm64] + os: [linux] - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} + sherif-linux-x64-musl@1.9.0: + resolution: {integrity: sha512-JSbA6DN0HkWSabYU858BUkS4cMmkTsAamDZEYuUVDW+XvW9IjaI6o0HNatUr7oCjrITIfcjzqlqy7uizmNlr/A==} + cpu: [x64] + os: [linux] - smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + sherif-linux-x64@1.9.0: + resolution: {integrity: sha512-iO+hTxndO36r0hgmipBRjntWFqFHKrrYFRODz0WnmDquVek88LInSzAY1xpS18/Thbff8IVc6ssefYNVFQQPWw==} + cpu: [x64] + os: [linux] + + sherif-windows-arm64@1.9.0: + resolution: {integrity: sha512-lPqQXDB/95SJodtIbGAJc90O/KyxcunvKTycZqo+6RGjkOSYZB/XnRzm/tJ7If/6kz0/wcDP4uvkJmJxrxcj3A==} + cpu: [arm64] + os: [win32] + + sherif-windows-x64@1.9.0: + resolution: {integrity: sha512-3cL+XVGLpmyLC3UOZYiPr4vY2OFBQqPZnCoCwoRKN+ONm8VfGMirO9iqI0OckgFBUtJoG4AQY/MWxoPhNmzD8A==} + cpu: [x64] + os: [win32] + + sherif@1.9.0: + resolution: {integrity: sha512-5n7zqPAjL+RzR7n09NPKpWBXmDCtuRpQzIL+ycj8pe6MayV7cDuFmceoyPQJ0c95oFj6feY7SZvhX/+S0i1ukg==} + hasBin: true + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-git@3.30.0: + resolution: {integrity: sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==} + + size-limit@11.2.0: + resolution: {integrity: sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + smol-toml@1.5.2: + resolution: {integrity: sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==} + engines: {node: '>= 18'} solid-js@1.9.10: resolution: {integrity: sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==} @@ -4818,6 +5221,9 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -4858,6 +5264,9 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-ts@2.2.1: + resolution: {integrity: sha512-Q2u0gko67PLLhbte5HmPfdOjNvUKbKQM+mCNQae6jE91DmoFHY6HH9GcdqCeNx87DZ2KKjiFxmA0R/42OneGWw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4883,14 +5292,26 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} @@ -4916,6 +5337,10 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte@5.44.1: + resolution: {integrity: sha512-8VnkRXpa6tJ9IqiwKvzZBNnBy9tZg0N63duDz0EJqiozsmBEAZfHiZzWWWAneIN+cAWkK1JkafW1xIbC4YrdBA==} + engines: {node: '>=18'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -4927,13 +5352,17 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwindcss@4.1.16: - resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} + tailwindcss@4.1.17: + resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -4941,6 +5370,10 @@ packages: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + terser@5.44.0: resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} @@ -4979,20 +5412,17 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} - tldts-core@6.1.86: - resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - tldts-core@7.0.16: resolution: {integrity: sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==} - tldts@6.1.86: - resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} - hasBin: true - tldts@7.0.16: resolution: {integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==} hasBin: true + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5001,10 +5431,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tough-cookie@5.1.2: - resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} - engines: {node: '>=16'} - tough-cookie@6.0.0: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} @@ -5012,10 +5438,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} - engines: {node: '>=18'} - tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -5044,6 +5466,9 @@ packages: peerDependencies: typescript: '>=4.0.0' + ts-pattern@5.9.0: + resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} + tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -5054,27 +5479,9 @@ packages: typescript: optional: true - tsdown@0.15.9: - resolution: {integrity: sha512-C0EJYpXIYdlJokTumIL4lmv/wEiB20oa6iiYsXFE7Q0VKF3Ju6TQ7XAn4JQdm+2iQGEfl8cnEKcX5DB7iVR5Dw==} - engines: {node: '>=20.19.0'} - hasBin: true - peerDependencies: - '@arethetypeswrong/core': ^0.18.1 - publint: ^0.3.0 - typescript: ^5.0.0 - unplugin-lightningcss: ^0.4.0 - unplugin-unused: ^0.5.0 - peerDependenciesMeta: - '@arethetypeswrong/core': - optional: true - publint: - optional: true - typescript: - optional: true - unplugin-lightningcss: - optional: true - unplugin-unused: - optional: true + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -5136,9 +5543,6 @@ packages: ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} - unconfig@7.3.3: - resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} - uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -5148,6 +5552,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@7.16.0: resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} engines: {node: '>=20.18.1'} @@ -5338,46 +5745,6 @@ packages: vite: optional: true - vite@7.1.9: - resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.2.4: resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5426,19 +5793,18 @@ packages: vite: optional: true - vitest@4.0.13: - resolution: {integrity: sha512-QSD4I0fN6uZQfftryIXuqvqgBxTvJ3ZNkF6RWECd82YGAYAfhcppBLFXzXJHQAAhVFyYEuFTrq6h0hQqjB7jIQ==} + vitest@4.0.14: + resolution: {integrity: sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 - '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.13 - '@vitest/browser-preview': 4.0.13 - '@vitest/browser-webdriverio': 4.0.13 - '@vitest/ui': 4.0.13 + '@vitest/browser-playwright': 4.0.14 + '@vitest/browser-preview': 4.0.14 + '@vitest/browser-webdriverio': 4.0.14 + '@vitest/ui': 4.0.14 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5446,8 +5812,6 @@ packages: optional: true '@opentelemetry/api': optional: true - '@types/debug': - optional: true '@types/node': optional: true '@vitest/browser-playwright': @@ -5476,6 +5840,13 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -5489,10 +5860,6 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - webidl-conversions@8.0.0: resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} engines: {node: '>=20'} @@ -5507,14 +5874,14 @@ packages: whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.2.0: - resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} - engines: {node: '>=18'} - whatwg-url@15.1.0: resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} engines: {node: '>=20'} @@ -5544,6 +5911,9 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -5560,9 +5930,9 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xmlbuilder2@3.1.1: - resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} - engines: {node: '>=12.0'} + xmlbuilder2@4.0.1: + resolution: {integrity: sha512-vXeky0YRVjhx5pseJDQLk0F6u7gyA8++ceVOS88r4dWu4lWdY/ZjbL45QrN+g0GzZLg1D5AkzThpikZa98SC/g==} + engines: {node: '>=20.0'} xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -5604,51 +5974,62 @@ packages: youch@4.1.0-beta.11: resolution: {integrity: sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} + zod-validation-error@3.5.4: + resolution: {integrity: sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.24.4 + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.1.12: - resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@ai-sdk/openai@2.0.59(zod@4.1.12)': + '@acemir/cssom@0.9.24': {} + + '@adobe/css-tools@4.4.4': {} + + '@ai-sdk/openai@2.0.73(zod@4.1.13)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.15(zod@4.1.12) - zod: 4.1.12 + '@ai-sdk/provider-utils': 3.0.17(zod@4.1.13) + zod: 4.1.13 - '@ai-sdk/provider-utils@3.0.15(zod@4.1.12)': + '@ai-sdk/provider-utils@3.0.17(zod@4.1.13)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.0.0 eventsource-parser: 3.0.6 - zod: 4.1.12 + zod: 4.1.13 '@ai-sdk/provider@2.0.0': dependencies: json-schema: 0.4.0 - '@anthropic-ai/sdk@0.70.1(zod@4.1.12)': + '@anthropic-ai/sdk@0.71.0(zod@4.1.13)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: - zod: 4.1.12 - - '@asamuzakjp/css-color@3.2.0': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 10.4.3 + zod: 4.1.13 '@asamuzakjp/css-color@4.0.5': dependencies: @@ -5658,7 +6039,7 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 11.2.2 - '@asamuzakjp/dom-selector@6.6.1': + '@asamuzakjp/dom-selector@6.7.4': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 @@ -5670,7 +6051,7 @@ snapshots: '@babel/code-frame@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -5702,14 +6083,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.3': - dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - '@babel/generator@7.28.5': dependencies: '@babel/parser': 7.28.5 @@ -5815,6 +6188,14 @@ snapshots: dependencies: '@babel/types': 7.28.5 + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -5895,19 +6276,168 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@bcoe/v8-coverage@1.0.2': {} + '@changesets/apply-release-plan@7.0.13': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.3 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.3 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.7(@types/node@24.10.1)': + dependencies: + '@changesets/apply-release-plan': 7.0.13 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@24.10.1) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.3 + + '@changesets/get-github-info@0.6.0': + dependencies: + dataloader: 1.4.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@changesets/get-release-plan@4.0.13': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.2 + prettier: 2.8.8 '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 - '@commitlint/parse@19.8.1': + '@commitlint/parse@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - '@commitlint/types@19.8.1': + '@commitlint/types@20.0.0': dependencies: '@types/conventional-commits-parser': 5.0.2 chalk: 5.6.2 @@ -5940,171 +6470,90 @@ snapshots: dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 - optional: true '@emnapi/runtime@1.6.0': dependencies: tslib: 2.8.1 - optional: true '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.25.11': - optional: true '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.11': - optional: true - '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.25.11': - optional: true - '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.25.11': - optional: true - '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.25.11': - optional: true - '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.11': - optional: true - '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.25.11': - optional: true - '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.11': - optional: true - '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.25.11': - optional: true - '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.25.11': - optional: true - '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.25.11': - optional: true - '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.11': - optional: true - '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.25.11': - optional: true - '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.11': - optional: true - '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.25.11': - optional: true - '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.11': - optional: true - '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.25.11': - optional: true - '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.11': - optional: true - '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.25.11': - optional: true - '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.11': - optional: true - '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.25.11': - optional: true - '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.11': - optional: true - '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.25.11': - optional: true - '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.25.11': - optional: true - '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.25.11': - optional: true - '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-x64@0.25.11': - optional: true - '@esbuild/win32-x64@0.25.12': optional: true @@ -6115,6 +6564,79 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} + '@eslint-react/ast@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/eff': 2.3.9 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + string-ts: 2.2.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/core@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.9 + '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + birecord: 0.1.1 + eslint: 9.39.1(jiti@2.6.1) + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/eff@2.3.9': {} + + '@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/eff': 2.3.9 + '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + eslint-plugin-react-dom: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks-extra: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-naming-convention: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-web-api: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-x: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@eslint-react/shared@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/eff': 2.3.9 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + ts-pattern: 5.9.0 + typescript: 5.9.3 + zod: 4.1.13 + transitivePeerDependencies: + - supports-color + + '@eslint-react/var@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.9 + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 @@ -6154,6 +6676,8 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@faker-js/faker@10.1.0': {} + '@gerrit0/mini-shiki@3.15.0': dependencies: '@shikijs/engine-oniguruma': 3.15.0 @@ -6182,6 +6706,13 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@inquirer/external-editor@1.0.3(@types/node@24.10.1)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.10.1 + '@ioredis/commands@1.4.0': {} '@isaacs/cliui@8.0.2': @@ -6197,6 +6728,14 @@ snapshots: dependencies: minipass: 7.1.2 + '@jest/diff-sequences@30.0.1': {} + + '@jest/get-type@30.1.0': {} + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.41 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6229,6 +6768,22 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + '@mapbox/node-pre-gyp@2.0.0': dependencies: consola: 3.4.2 @@ -6242,23 +6797,23 @@ snapshots: - encoding - supports-color - '@microsoft/api-extractor-model@7.29.6(@types/node@22.18.8)': + '@microsoft/api-extractor-model@7.29.6(@types/node@24.10.1)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@22.18.8) + '@rushstack/node-core-library': 5.7.0(@types/node@24.10.1) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@22.18.8)': + '@microsoft/api-extractor@7.47.7(@types/node@24.10.1)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@22.18.8) + '@microsoft/api-extractor-model': 7.29.6(@types/node@24.10.1) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@22.18.8) + '@rushstack/node-core-library': 5.7.0(@types/node@24.10.1) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@22.18.8) - '@rushstack/ts-command-line': 4.22.6(@types/node@22.18.8) + '@rushstack/terminal': 0.14.0(@types/node@24.10.1) + '@rushstack/ts-command-line': 4.22.6(@types/node@24.10.1) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.11 @@ -6268,59 +6823,155 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/tsdoc-config@0.17.1': + '@microsoft/tsdoc-config@0.17.1': + dependencies: + '@microsoft/tsdoc': 0.15.1 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.11 + + '@microsoft/tsdoc@0.15.1': {} + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@0.2.4': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.9.0 + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@nx/nx-darwin-arm64@22.1.2': + optional: true + + '@nx/nx-darwin-x64@22.1.2': + optional: true + + '@nx/nx-freebsd-x64@22.1.2': + optional: true + + '@nx/nx-linux-arm-gnueabihf@22.1.2': + optional: true + + '@nx/nx-linux-arm64-gnu@22.1.2': + optional: true + + '@nx/nx-linux-arm64-musl@22.1.2': + optional: true + + '@nx/nx-linux-x64-gnu@22.1.2': + optional: true + + '@nx/nx-linux-x64-musl@22.1.2': + optional: true + + '@nx/nx-win32-arm64-msvc@22.1.2': + optional: true + + '@nx/nx-win32-x64-msvc@22.1.2': + optional: true + + '@oozcitak/dom@2.0.2': dependencies: - '@microsoft/tsdoc': 0.15.1 - ajv: 8.12.0 - jju: 1.4.0 - resolve: 1.22.11 + '@oozcitak/infra': 2.0.2 + '@oozcitak/url': 3.0.0 + '@oozcitak/util': 10.0.0 - '@microsoft/tsdoc@0.15.1': {} + '@oozcitak/infra@2.0.2': + dependencies: + '@oozcitak/util': 10.0.0 - '@napi-rs/wasm-runtime@0.2.12': + '@oozcitak/url@3.0.0': dependencies: - '@emnapi/core': 1.6.0 - '@emnapi/runtime': 1.6.0 - '@tybys/wasm-util': 0.10.1 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + + '@oozcitak/util@10.0.0': {} + + '@oxc-project/types@0.98.0': optional: true - '@napi-rs/wasm-runtime@1.0.7': - dependencies: - '@emnapi/core': 1.6.0 - '@emnapi/runtime': 1.6.0 - '@tybys/wasm-util': 0.10.1 + '@oxc-resolver/binding-android-arm-eabi@11.14.0': optional: true - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@oxc-resolver/binding-android-arm64@11.14.0': + optional: true - '@nodelib/fs.stat@2.0.5': {} + '@oxc-resolver/binding-darwin-arm64@11.14.0': + optional: true - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + '@oxc-resolver/binding-darwin-x64@11.14.0': + optional: true - '@oozcitak/dom@1.15.10': - dependencies: - '@oozcitak/infra': 1.0.8 - '@oozcitak/url': 1.0.4 - '@oozcitak/util': 8.3.8 + '@oxc-resolver/binding-freebsd-x64@11.14.0': + optional: true - '@oozcitak/infra@1.0.8': - dependencies: - '@oozcitak/util': 8.3.8 + '@oxc-resolver/binding-linux-arm-gnueabihf@11.14.0': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.14.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.14.0': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.14.0': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.14.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.14.0': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.14.0': + optional: true - '@oozcitak/url@1.0.4': + '@oxc-resolver/binding-linux-s390x-gnu@11.14.0': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.14.0': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.14.0': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.14.0': dependencies: - '@oozcitak/infra': 1.0.8 - '@oozcitak/util': 8.3.8 + '@napi-rs/wasm-runtime': 1.0.7 + optional: true - '@oozcitak/util@8.3.8': {} + '@oxc-resolver/binding-win32-arm64-msvc@11.14.0': + optional: true + + '@oxc-resolver/binding-win32-ia32-msvc@11.14.0': + optional: true - '@oxc-project/types@0.95.0': {} + '@oxc-resolver/binding-win32-x64-msvc@11.14.0': + optional: true '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -6402,67 +7053,66 @@ snapshots: '@poppinss/exception@1.2.2': {} - '@quansync/fs@0.1.5': - dependencies: - quansync: 0.2.11 + '@publint/pack@0.1.2': {} - '@rolldown/binding-android-arm64@1.0.0-beta.44': + '@rolldown/binding-android-arm64@1.0.0-beta.51': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.44': + '@rolldown/binding-darwin-arm64@1.0.0-beta.51': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.44': + '@rolldown/binding-darwin-x64@1.0.0-beta.51': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.44': + '@rolldown/binding-freebsd-x64@1.0.0-beta.51': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.44': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.44': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.44': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.44': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.44': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.51': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.44': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.51': optional: true '@rolldown/pluginutils@1.0.0-beta.40': {} - '@rolldown/pluginutils@1.0.0-beta.43': {} + '@rolldown/pluginutils@1.0.0-beta.47': {} - '@rolldown/pluginutils@1.0.0-beta.44': {} + '@rolldown/pluginutils@1.0.0-beta.51': + optional: true - '@rollup/plugin-alias@5.1.1(rollup@4.52.5)': + '@rollup/plugin-alias@5.1.1(rollup@4.53.3)': optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-commonjs@28.0.9(rollup@4.52.5)': + '@rollup/plugin-commonjs@28.0.9(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -6470,54 +7120,46 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-inject@5.0.5(rollup@4.52.5)': + '@rollup/plugin-inject@5.0.5(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) estree-walker: 2.0.2 magic-string: 0.30.21 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-json@6.1.0(rollup@4.52.5)': + '@rollup/plugin-json@6.1.0(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.52.5)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-replace@6.0.3(rollup@4.52.5)': + '@rollup/plugin-replace@6.0.3(rollup@4.53.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) magic-string: 0.30.21 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 - '@rollup/plugin-terser@0.4.4(rollup@4.52.5)': + '@rollup/plugin-terser@0.4.4(rollup@4.53.3)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.44.0 optionalDependencies: - rollup: 4.52.5 - - '@rollup/pluginutils@5.3.0(rollup@4.52.5)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.3 '@rollup/pluginutils@5.3.0(rollup@4.53.3)': dependencies: @@ -6527,139 +7169,73 @@ snapshots: optionalDependencies: rollup: 4.53.3 - '@rollup/rollup-android-arm-eabi@4.52.5': - optional: true - '@rollup/rollup-android-arm-eabi@4.53.3': optional: true - '@rollup/rollup-android-arm64@4.52.5': - optional: true - '@rollup/rollup-android-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-arm64@4.52.5': - optional: true - '@rollup/rollup-darwin-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-x64@4.52.5': - optional: true - '@rollup/rollup-darwin-x64@4.53.3': optional: true - '@rollup/rollup-freebsd-arm64@4.52.5': - optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': optional: true - '@rollup/rollup-freebsd-x64@4.52.5': - optional: true - '@rollup/rollup-freebsd-x64@4.53.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.5': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.5': - optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.5': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-musl@4.52.5': - optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': optional: true - '@rollup/rollup-openharmony-arm64@4.52.5': - optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.5': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.5': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.5': - optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.5': - optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true - '@rushstack/node-core-library@5.7.0(@types/node@22.18.8)': + '@rushstack/node-core-library@5.7.0(@types/node@24.10.1)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -6670,23 +7246,23 @@ snapshots: resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 24.10.1 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.11 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@22.18.8)': + '@rushstack/terminal@0.14.0(@types/node@24.10.1)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@22.18.8) + '@rushstack/node-core-library': 5.7.0(@types/node@24.10.1) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 24.10.1 - '@rushstack/ts-command-line@4.22.6(@types/node@22.18.8)': + '@rushstack/ts-command-line@4.22.6(@types/node@24.10.1)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@22.18.8) + '@rushstack/terminal': 0.14.0(@types/node@24.10.1) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -6713,10 +7289,28 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sinclair/typebox@0.34.41': {} + '@sindresorhus/is@7.1.1': {} '@sindresorhus/merge-streams@4.0.0': {} + '@size-limit/esbuild@11.2.0(size-limit@11.2.0)': + dependencies: + esbuild: 0.25.12 + nanoid: 5.1.6 + size-limit: 11.2.0 + + '@size-limit/file@11.2.0(size-limit@11.2.0)': + dependencies: + size-limit: 11.2.0 + + '@size-limit/preset-small-lib@11.2.0(size-limit@11.2.0)': + dependencies: + '@size-limit/esbuild': 11.2.0(size-limit@11.2.0) + '@size-limit/file': 11.2.0(size-limit@11.2.0) + size-limit: 11.2.0 + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.10)': dependencies: '@solid-primitives/utils': 6.3.2(solid-js@1.9.10) @@ -6765,80 +7359,91 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.3 - '@tailwindcss/node@4.1.16': + '@sveltejs/acorn-typescript@1.0.7(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@svitejs/changesets-changelog-github-compact@1.2.0': + dependencies: + '@changesets/get-github-info': 0.6.0 + dotenv: 16.6.1 + transitivePeerDependencies: + - encoding + + '@tailwindcss/node@4.1.17': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.18.3 jiti: 2.6.1 lightningcss: 1.30.2 - magic-string: 0.30.19 + magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.16 + tailwindcss: 4.1.17 - '@tailwindcss/oxide-android-arm64@4.1.16': + '@tailwindcss/oxide-android-arm64@4.1.17': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.16': + '@tailwindcss/oxide-darwin-arm64@4.1.17': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.16': + '@tailwindcss/oxide-darwin-x64@4.1.17': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.16': + '@tailwindcss/oxide-freebsd-x64@4.1.17': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.16': + '@tailwindcss/oxide-linux-x64-musl@4.1.17': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.16': + '@tailwindcss/oxide-wasm32-wasi@4.1.17': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': optional: true - '@tailwindcss/oxide@4.1.16': + '@tailwindcss/oxide@4.1.17': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.16 - '@tailwindcss/oxide-darwin-arm64': 4.1.16 - '@tailwindcss/oxide-darwin-x64': 4.1.16 - '@tailwindcss/oxide-freebsd-x64': 4.1.16 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.16 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.16 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.16 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.16 - '@tailwindcss/oxide-linux-x64-musl': 4.1.16 - '@tailwindcss/oxide-wasm32-wasi': 4.1.16 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.16 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.16 - - '@tailwindcss/vite@4.1.16(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - '@tailwindcss/node': 4.1.16 - '@tailwindcss/oxide': 4.1.16 - tailwindcss: 4.1.16 - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - - '@tanstack/config@0.22.0(@types/node@22.18.8)(@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - '@tanstack/eslint-config': 0.3.2(@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@tanstack/publish-config': 0.2.1 - '@tanstack/typedoc-config': 0.3.0(typescript@5.9.3) - '@tanstack/vite-config': 0.4.0(@types/node@22.18.8)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tailwindcss/oxide-android-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-x64': 4.1.17 + '@tailwindcss/oxide-freebsd-x64': 4.1.17 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-x64-musl': 4.1.17 + '@tailwindcss/oxide-wasm32-wasi': 4.1.17 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 + + '@tailwindcss/vite@4.1.17(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.1.17 + '@tailwindcss/oxide': 4.1.17 + tailwindcss: 4.1.17 + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + + '@tanstack/config@0.22.1(@types/node@24.10.1)(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@tanstack/eslint-config': 0.3.3(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@tanstack/publish-config': 0.2.2 + '@tanstack/typedoc-config': 0.3.1(typescript@5.9.3) + '@tanstack/vite-config': 0.4.1(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - '@typescript-eslint/utils' @@ -6851,7 +7456,7 @@ snapshots: '@tanstack/devtools-client@0.0.4': dependencies: - '@tanstack/devtools-event-client': 0.3.4 + '@tanstack/devtools-event-client': 0.3.5 '@tanstack/devtools-event-bus@0.3.3': dependencies: @@ -6860,79 +7465,61 @@ snapshots: - bufferutil - utf-8-validate - '@tanstack/devtools-event-client@0.3.4': {} + '@tanstack/devtools-event-client@0.3.5': {} - '@tanstack/devtools-ui@0.4.4(csstype@3.1.3)(solid-js@1.9.10)': + '@tanstack/devtools-ui@0.4.4(csstype@3.2.3)(solid-js@1.9.10)': dependencies: clsx: 2.1.1 - goober: 2.1.18(csstype@3.1.3) + goober: 2.1.18(csstype@3.2.3) solid-js: 1.9.10 transitivePeerDependencies: - csstype - '@tanstack/devtools-utils@0.0.6(@types/react@19.2.2)(csstype@3.1.3)(react@19.2.0)(solid-js@1.9.10)': + '@tanstack/devtools-utils@0.0.8(@types/react@19.2.7)(csstype@3.2.3)(react@19.2.0)(solid-js@1.9.10)': dependencies: - '@tanstack/devtools-ui': 0.4.4(csstype@3.1.3)(solid-js@1.9.10) + '@tanstack/devtools-ui': 0.4.4(csstype@3.2.3)(solid-js@1.9.10) optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.7 react: 19.2.0 solid-js: 1.9.10 transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.3.11(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@tanstack/devtools-client': 0.0.4 - '@tanstack/devtools-event-bus': 0.3.3 - chalk: 5.6.2 - launch-editor: 2.12.0 - picomatch: 4.0.3 - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@tanstack/devtools@0.8.0(csstype@3.1.3)(solid-js@1.9.10)': + '@tanstack/devtools@0.8.2(csstype@3.2.3)(solid-js@1.9.10)': dependencies: '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.10) '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.10) '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.10) '@tanstack/devtools-client': 0.0.4 '@tanstack/devtools-event-bus': 0.3.3 - '@tanstack/devtools-ui': 0.4.4(csstype@3.1.3)(solid-js@1.9.10) + '@tanstack/devtools-ui': 0.4.4(csstype@3.2.3)(solid-js@1.9.10) clsx: 2.1.1 - goober: 2.1.18(csstype@3.1.3) + goober: 2.1.18(csstype@3.2.3) solid-js: 1.9.10 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/directive-functions-plugin@1.134.5(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.139.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 - '@tanstack/router-utils': 1.133.19 + '@tanstack/router-utils': 1.139.0 babel-dead-code-elimination: 1.0.10 pathe: 2.0.3 tiny-invariant: 1.3.3 - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@tanstack/eslint-config@0.3.3(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint/js': 9.39.1 '@stylistic/eslint-plugin': 5.5.0(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-n: 17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) globals: 16.5.0 typescript-eslint: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) @@ -6944,13 +7531,13 @@ snapshots: - supports-color - typescript - '@tanstack/history@1.133.28': {} + '@tanstack/history@1.139.0': {} - '@tanstack/nitro-v2-vite-plugin@1.133.19(rolldown@1.0.0-beta.44)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/nitro-v2-vite-plugin@1.139.0(rolldown@1.0.0-beta.51)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - nitropack: 2.12.9(rolldown@1.0.0-beta.44) + nitropack: 2.12.9(rolldown@1.0.0-beta.51) pathe: 2.0.3 - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6982,9 +7569,9 @@ snapshots: - uploadthing - xml2js - '@tanstack/publish-config@0.2.1': + '@tanstack/publish-config@0.2.2': dependencies: - '@commitlint/parse': 19.8.1 + '@commitlint/parse': 20.0.0 jsonfile: 6.2.0 semver: 7.7.3 simple-git: 3.30.0 @@ -6993,11 +7580,11 @@ snapshots: '@tanstack/query-core@5.90.5': {} - '@tanstack/react-devtools@0.8.0(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(csstype@3.1.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)': + '@tanstack/react-devtools@0.8.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(csstype@3.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)': dependencies: - '@tanstack/devtools': 0.8.0(csstype@3.1.3)(solid-js@1.9.10) - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@tanstack/devtools': 0.8.2(csstype@3.2.3)(solid-js@1.9.10) + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3(@types/react@19.2.7) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: @@ -7011,15 +7598,16 @@ snapshots: '@tanstack/query-core': 5.90.5 react: 19.2.0 - '@tanstack/react-router-devtools@1.134.4(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.134.4)(@types/node@22.18.8)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.139.7)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/react-router': 1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.134.4(@tanstack/router-core@1.134.4)(@types/node@22.18.8)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router': 1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-devtools-core': 1.139.7(@tanstack/router-core@1.139.7)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + optionalDependencies: + '@tanstack/router-core': 1.139.7 transitivePeerDependencies: - - '@tanstack/router-core' - '@types/node' - csstype - jiti @@ -7031,67 +7619,66 @@ snapshots: - stylus - sugarss - terser - - tiny-invariant - tsx - yaml - '@tanstack/react-router-ssr-query@1.134.4(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.134.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-router-ssr-query@1.139.7(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.139.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/query-core': 5.90.5 '@tanstack/react-query': 5.90.5(react@19.2.0) - '@tanstack/react-router': 1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-ssr-query-core': 1.134.4(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.134.4) + '@tanstack/react-router': 1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-ssr-query-core': 1.139.7(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.139.7) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - '@tanstack/router-core' - '@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/history': 1.133.28 + '@tanstack/history': 1.139.0 '@tanstack/react-store': 0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.134.4 + '@tanstack/router-core': 1.139.7 isbot: 5.1.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-start-client@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/react-router': 1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.134.4 - '@tanstack/start-client-core': 1.134.4 + '@tanstack/react-router': 1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.139.7 + '@tanstack/start-client-core': 1.139.7 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.134.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-start-server@1.139.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/history': 1.133.28 - '@tanstack/react-router': 1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.134.4 - '@tanstack/start-client-core': 1.134.4 - '@tanstack/start-server-core': 1.134.5 + '@tanstack/history': 1.139.0 + '@tanstack/react-router': 1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.139.7 + '@tanstack/start-client-core': 1.139.7 + '@tanstack/start-server-core': 1.139.8 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.134.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/react-start@1.139.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/react-router': 1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-start-client': 1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-start-server': 1.134.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-utils': 1.133.19 - '@tanstack/start-client-core': 1.134.4 - '@tanstack/start-plugin-core': 1.134.6(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.134.5 + '@tanstack/react-router': 1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-start-client': 1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-start-server': 1.139.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-utils': 1.139.0 + '@tanstack/start-client-core': 1.139.7 + '@tanstack/start-plugin-core': 1.139.8(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.139.8 pathe: 2.0.3 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -7099,13 +7686,6 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-store@0.7.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': - dependencies: - '@tanstack/store': 0.7.7 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) - '@tanstack/react-store@0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/store': 0.8.0 @@ -7113,26 +7693,26 @@ snapshots: react-dom: 19.2.0(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) - '@tanstack/router-core@1.134.4': + '@tanstack/router-core@1.139.7': dependencies: - '@tanstack/history': 1.133.28 + '@tanstack/history': 1.139.0 '@tanstack/store': 0.8.0 cookie-es: 2.0.0 - seroval: 1.3.2 - seroval-plugins: 1.3.3(seroval@1.3.2) + seroval: 1.4.0 + seroval-plugins: 1.4.0(seroval@1.4.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.134.4(@tanstack/router-core@1.134.4)(@types/node@22.18.8)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.139.7(@tanstack/router-core@1.139.7)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/router-core': 1.134.4 + '@tanstack/router-core': 1.139.7 clsx: 2.1.1 - goober: 2.1.18(csstype@3.1.3) + goober: 2.1.18(csstype@3.2.3) solid-js: 1.9.10 tiny-invariant: 1.3.3 - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - csstype: 3.1.3 + csstype: 3.2.3 transitivePeerDependencies: - '@types/node' - jiti @@ -7146,11 +7726,11 @@ snapshots: - tsx - yaml - '@tanstack/router-generator@1.134.4': + '@tanstack/router-generator@1.139.7': dependencies: - '@tanstack/router-core': 1.134.4 - '@tanstack/router-utils': 1.133.19 - '@tanstack/virtual-file-routes': 1.133.19 + '@tanstack/router-core': 1.139.7 + '@tanstack/router-utils': 1.139.0 + '@tanstack/virtual-file-routes': 1.139.0 prettier: 3.6.2 recast: 0.23.11 source-map: 0.7.6 @@ -7159,39 +7739,39 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.134.6(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 - '@babel/types': 7.28.4 - '@tanstack/router-core': 1.134.4 - '@tanstack/router-generator': 1.134.4 - '@tanstack/router-utils': 1.133.19 - '@tanstack/virtual-file-routes': 1.133.19 + '@babel/types': 7.28.5 + '@tanstack/router-core': 1.139.7 + '@tanstack/router-generator': 1.139.7 + '@tanstack/router-utils': 1.139.0 + '@tanstack/virtual-file-routes': 1.139.0 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid: 2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/react-router': 1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-solid: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@tanstack/router-ssr-query-core@1.134.4(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.134.4)': + '@tanstack/router-ssr-query-core@1.139.7(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.139.7)': dependencies: '@tanstack/query-core': 5.90.5 - '@tanstack/router-core': 1.134.4 + '@tanstack/router-core': 1.139.7 - '@tanstack/router-utils@1.133.19': + '@tanstack/router-utils@1.139.0': dependencies: '@babel/core': 7.28.5 - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) ansis: 4.2.0 diff: 8.0.2 @@ -7200,7 +7780,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.134.5(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.139.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 @@ -7209,34 +7789,34 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 - '@tanstack/directive-functions-plugin': 1.134.5(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.139.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/start-client-core@1.134.4': + '@tanstack/start-client-core@1.139.7': dependencies: - '@tanstack/router-core': 1.134.4 - '@tanstack/start-storage-context': 1.134.4 - seroval: 1.3.2 + '@tanstack/router-core': 1.139.7 + '@tanstack/start-storage-context': 1.139.7 + seroval: 1.4.0 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.134.6(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.139.8(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.5 '@babel/types': 7.28.5 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.134.4 - '@tanstack/router-generator': 1.134.4 - '@tanstack/router-plugin': 1.134.6(@tanstack/react-router@1.134.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/router-utils': 1.133.19 - '@tanstack/server-functions-plugin': 1.134.5(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-client-core': 1.134.4 - '@tanstack/start-server-core': 1.134.5 + '@tanstack/router-core': 1.139.7 + '@tanstack/router-generator': 1.139.7 + '@tanstack/router-plugin': 1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-utils': 1.139.0 + '@tanstack/server-functions-plugin': 1.139.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-client-core': 1.139.7 + '@tanstack/start-server-core': 1.139.8 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 @@ -7244,9 +7824,9 @@ snapshots: srvx: 0.8.16 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - xmlbuilder2: 3.1.1 + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + xmlbuilder2: 4.0.1 zod: 3.25.76 transitivePeerDependencies: - '@rsbuild/core' @@ -7256,27 +7836,25 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.134.5': + '@tanstack/start-server-core@1.139.8': dependencies: - '@tanstack/history': 1.133.28 - '@tanstack/router-core': 1.134.4 - '@tanstack/start-client-core': 1.134.4 - '@tanstack/start-storage-context': 1.134.4 - h3-v2: h3@2.0.0-beta.4 - seroval: 1.3.2 + '@tanstack/history': 1.139.0 + '@tanstack/router-core': 1.139.7 + '@tanstack/start-client-core': 1.139.7 + '@tanstack/start-storage-context': 1.139.7 + h3-v2: h3@2.0.0-beta.5 + seroval: 1.4.0 tiny-invariant: 1.3.3 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.134.4': + '@tanstack/start-storage-context@1.139.7': dependencies: - '@tanstack/router-core': 1.134.4 - - '@tanstack/store@0.7.7': {} + '@tanstack/router-core': 1.139.7 '@tanstack/store@0.8.0': {} - '@tanstack/typedoc-config@0.3.0(typescript@5.9.3)': + '@tanstack/typedoc-config@0.3.1(typescript@5.9.3)': dependencies: typedoc: 0.28.14(typescript@5.9.3) typedoc-plugin-frontmatter: 1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))) @@ -7284,14 +7862,14 @@ snapshots: transitivePeerDependencies: - typescript - '@tanstack/virtual-file-routes@1.133.19': {} + '@tanstack/virtual-file-routes@1.139.0': {} - '@tanstack/vite-config@0.4.0(@types/node@22.18.8)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/vite-config@0.4.1(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.53.3) - vite-plugin-dts: 4.2.3(@types/node@22.18.8)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - vite-plugin-externalize-deps: 0.10.0(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-plugin-dts: 4.2.3(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-plugin-externalize-deps: 0.10.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - rollup @@ -7310,31 +7888,34 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@19.2.0(react@18.3.1))(react@18.3.1)': + '@testing-library/jest-dom@6.9.1': dependencies: - '@babel/runtime': 7.28.4 - '@testing-library/dom': 10.4.1 - react: 18.3.1 - react-dom: 19.2.0(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.26 - '@types/react-dom': 19.2.2(@types/react@18.3.26) + '@adobe/css-tools': 4.4.4 + aria-query: 5.3.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3(@types/react@19.2.7) '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + '@types/argparse@1.0.38': {} '@types/aria-query@5.0.4': {} @@ -7367,7 +7948,7 @@ snapshots: '@types/conventional-commits-parser@5.0.2': dependencies: - '@types/node': 22.18.8 + '@types/node': 24.10.1 '@types/debug@4.1.12': dependencies: @@ -7393,33 +7974,23 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.18.8': - dependencies: - undici-types: 6.21.0 - - '@types/prop-types@15.7.15': {} - - '@types/react-dom@18.3.7(@types/react@18.3.26)': - dependencies: - '@types/react': 18.3.26 + '@types/node@12.20.55': {} - '@types/react-dom@19.2.2(@types/react@18.3.26)': + '@types/node@20.19.25': dependencies: - '@types/react': 18.3.26 - optional: true + undici-types: 6.21.0 - '@types/react-dom@19.2.2(@types/react@19.2.2)': + '@types/node@24.10.1': dependencies: - '@types/react': 19.2.2 + undici-types: 7.16.0 - '@types/react@18.3.26': + '@types/react-dom@19.2.3(@types/react@19.2.7)': dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + '@types/react': 19.2.7 - '@types/react@19.2.2': + '@types/react@19.2.7': dependencies: - csstype: 3.1.3 + csstype: 3.2.3 '@types/resolve@1.20.2': {} @@ -7427,6 +7998,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/whatwg-mimetype@3.0.2': {} + '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -7465,15 +8038,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.46.3': dependencies: '@typescript-eslint/types': 8.46.3 '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/scope-manager@8.48.0': + dependencies: + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)': dependencies: typescript: 5.9.3 + '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + '@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.46.3 @@ -7486,8 +8077,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.1(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.46.3': {} + '@typescript-eslint/types@8.48.0': {} + '@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.46.3(typescript@5.9.3) @@ -7504,6 +8109,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.48.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/visitor-keys': 8.48.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) @@ -7515,11 +8135,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.46.3': dependencies: '@typescript-eslint/types': 8.46.3 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.48.0': + dependencies: + '@typescript-eslint/types': 8.48.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -7581,10 +8217,10 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vercel/nft@0.30.3(rollup@4.52.5)': + '@vercel/nft@0.30.3(rollup@4.53.3)': dependencies: '@mapbox/node-pre-gyp': 2.0.0 - '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@rollup/pluginutils': 5.3.0(rollup@4.53.3) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -7600,89 +8236,55 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-react@5.1.0(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) - '@rolldown/pluginutils': 1.0.0-beta.43 + '@rolldown/pluginutils': 1.0.0-beta.47 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - supports-color - - '@vitest/coverage-v8@4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.13 - ast-v8-to-istanbul: 0.3.8 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.2.0 - magicast: 0.5.1 - std-env: 3.10.0 - tinyrainbow: 3.0.3 - vitest: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - supports-color - - '@vitest/coverage-v8@4.0.13(vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.13 - ast-v8-to-istanbul: 0.3.8 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.2.0 - magicast: 0.5.1 - std-env: 3.10.0 - tinyrainbow: 3.0.3 - vitest: 4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.13': + '@vitest/expect@4.0.14': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.13 - '@vitest/utils': 4.0.13 + '@vitest/spy': 4.0.14 + '@vitest/utils': 4.0.14 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.13(vite@7.2.4(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.14(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.13 + '@vitest/spy': 4.0.14 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.2.4(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/pretty-format@4.0.13': + '@vitest/pretty-format@4.0.14': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.13': + '@vitest/runner@4.0.14': dependencies: - '@vitest/utils': 4.0.13 + '@vitest/utils': 4.0.14 pathe: 2.0.3 - '@vitest/snapshot@4.0.13': + '@vitest/snapshot@4.0.14': dependencies: - '@vitest/pretty-format': 4.0.13 + '@vitest/pretty-format': 4.0.14 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.13': {} + '@vitest/spy@4.0.14': {} - '@vitest/utils@4.0.13': + '@vitest/utils@4.0.14': dependencies: - '@vitest/pretty-format': 4.0.13 + '@vitest/pretty-format': 4.0.14 tinyrainbow: 3.0.3 '@volar/language-core@2.4.23': @@ -7730,6 +8332,17 @@ snapshots: '@vue/shared@3.5.24': {} + '@yarnpkg/lockfile@1.1.0': {} + + '@yarnpkg/parsers@3.0.2': + dependencies: + js-yaml: 3.14.1 + tslib: 2.8.1 + + '@zkochan/js-yaml@0.0.7': + dependencies: + argparse: 2.0.1 + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -7782,6 +8395,8 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ansi-colors@4.1.3: {} + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -7834,39 +8449,42 @@ snapshots: dependencies: dequal: 2.0.3 + aria-query@5.3.2: {} + array-ify@1.0.0: {} - assertion-error@2.0.1: {} + array-union@2.1.0: {} - ast-kit@2.1.3: - dependencies: - '@babel/parser': 7.28.5 - pathe: 2.0.3 + assertion-error@2.0.1: {} ast-types@0.16.1: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.8: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - estree-walker: 3.0.3 - js-tokens: 9.0.1 - async-sema@3.1.1: {} async@3.2.6: {} asynckit@0.4.0: {} + axios@1.13.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@4.1.0: {} + b4a@1.7.3: {} babel-dead-code-elimination@1.0.10: dependencies: '@babel/core': 7.28.5 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/traverse': 7.28.5 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -7896,6 +8514,10 @@ snapshots: baseline-browser-mapping@2.8.22: {} + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 @@ -7908,7 +8530,13 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 - birpc@2.6.1: {} + birecord@0.1.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 boolbase@1.0.0: {} @@ -7939,11 +8567,18 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + bytes-iec@3.1.1: {} + c12@3.3.1(magicast@0.5.1): dependencies: chokidar: 4.0.3 @@ -7961,8 +8596,6 @@ snapshots: optionalDependencies: magicast: 0.5.1 - cac@6.7.14: {} - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -7991,6 +8624,8 @@ snapshots: character-reference-invalid@2.0.1: {} + chardet@2.1.1: {} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 @@ -8032,10 +8667,18 @@ snapshots: chownr@3.0.0: {} + ci-info@3.9.0: {} + citty@0.1.6: dependencies: consola: 3.4.2 + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.6.1: {} + clipboardy@4.0.0: dependencies: execa: 8.0.1 @@ -8048,6 +8691,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone@1.0.4: {} + clsx@2.1.1: {} cluster-key-slot@1.1.2: {} @@ -8152,12 +8797,9 @@ snapshots: css-what@6.2.2: {} - cssstyle@4.6.0: - dependencies: - '@asamuzakjp/css-color': 3.2.0 - rrweb-cssom: 0.8.0 + css.escape@1.5.1: {} - cssstyle@5.3.1(postcss@8.5.6): + cssstyle@5.3.3(postcss@8.5.6): dependencies: '@asamuzakjp/css-color': 4.0.5 '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) @@ -8167,18 +8809,17 @@ snapshots: csstype@3.1.3: {} - data-uri-to-buffer@4.0.1: {} + csstype@3.2.3: {} - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 + data-uri-to-buffer@4.0.1: {} data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 + dataloader@1.4.0: {} + db0@0.3.4: {} de-indent@1.0.2: {} @@ -8197,6 +8838,10 @@ snapshots: deepmerge@4.3.1: {} + defaults@1.0.4: + dependencies: + clone: 1.0.4 + define-lazy-prop@2.0.0: {} defu@6.1.4: {} @@ -8211,18 +8856,28 @@ snapshots: destr@2.0.5: {} + detect-indent@6.1.0: {} + detect-libc@1.0.3: {} detect-libc@2.1.2: {} + devalue@5.5.0: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 diff@8.0.2: {} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + dom-accessibility-api@0.5.16: {} + dom-accessibility-api@0.6.3: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -8249,12 +8904,16 @@ snapshots: dependencies: is-obj: 2.0.0 + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.6.1 + + dotenv@16.4.7: {} + dotenv@16.6.1: {} dotenv@17.2.3: {} - dts-resolver@2.1.2: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -8277,8 +8936,6 @@ snapshots: emoji-regex@9.2.2: {} - empathic@2.0.0: {} - encodeurl@2.0.0: {} encoding-sniffer@0.2.1: @@ -8286,11 +8943,24 @@ snapshots: iconv-lite: 0.6.3 whatwg-encoding: 3.1.1 + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 + enquirer@2.3.6: + dependencies: + ansi-colors: 4.1.3 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + entities@4.5.0: {} entities@6.0.1: {} @@ -8314,35 +8984,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.25.11: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.11 - '@esbuild/android-arm': 0.25.11 - '@esbuild/android-arm64': 0.25.11 - '@esbuild/android-x64': 0.25.11 - '@esbuild/darwin-arm64': 0.25.11 - '@esbuild/darwin-x64': 0.25.11 - '@esbuild/freebsd-arm64': 0.25.11 - '@esbuild/freebsd-x64': 0.25.11 - '@esbuild/linux-arm': 0.25.11 - '@esbuild/linux-arm64': 0.25.11 - '@esbuild/linux-ia32': 0.25.11 - '@esbuild/linux-loong64': 0.25.11 - '@esbuild/linux-mips64el': 0.25.11 - '@esbuild/linux-ppc64': 0.25.11 - '@esbuild/linux-riscv64': 0.25.11 - '@esbuild/linux-s390x': 0.25.11 - '@esbuild/linux-x64': 0.25.11 - '@esbuild/netbsd-arm64': 0.25.11 - '@esbuild/netbsd-x64': 0.25.11 - '@esbuild/openbsd-arm64': 0.25.11 - '@esbuild/openbsd-x64': 0.25.11 - '@esbuild/openharmony-arm64': 0.25.11 - '@esbuild/sunos-x64': 0.25.11 - '@esbuild/win32-arm64': 0.25.11 - '@esbuild/win32-ia32': 0.25.11 - '@esbuild/win32-x64': 0.25.11 - esbuild@0.25.12: optionalDependencies: '@esbuild/aix-ppc64': 0.25.12 @@ -8376,6 +9017,8 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -8399,7 +9042,7 @@ snapshots: eslint: 9.39.1(jiti@2.6.1) eslint-compat-utils: 0.5.1(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)): dependencies: '@typescript-eslint/types': 8.46.3 comment-parser: 1.4.1 @@ -8412,7 +9055,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - supports-color @@ -8431,6 +9074,127 @@ snapshots: transitivePeerDependencies: - typescript + eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.39.1(jiti@2.6.1)): + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.5) + eslint: 9.39.1(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 3.25.76 + zod-validation-error: 3.5.4(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-dom@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.9 + '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + compare-versions: 6.1.1 + eslint: 9.39.1(jiti@2.6.1) + string-ts: 2.2.1 + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-hooks-extra@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.9 + '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + string-ts: 2.2.1 + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)): + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + eslint: 9.39.1(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 4.1.13 + zod-validation-error: 4.0.2(zod@4.1.13) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-naming-convention@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.9 + '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + string-ts: 2.2.1 + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-web-api@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.9 + '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + string-ts: 2.2.1 + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-x@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.9 + '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.0 + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + compare-versions: 6.1.1 + eslint: 9.39.1(jiti@2.6.1) + is-immutable-type: 5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + string-ts: 2.2.1 + ts-api-utils: 2.1.0(typescript@5.9.3) + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)): + dependencies: + eslint: 9.39.1(jiti@2.6.1) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -8481,6 +9245,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-env@1.2.2: {} + espree@10.4.0: dependencies: acorn: 8.15.0 @@ -8493,6 +9259,10 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@2.2.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -8541,6 +9311,8 @@ snapshots: extend@3.0.2: {} + extendable-error@0.1.7: {} + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -8561,6 +9333,10 @@ snapshots: dependencies: reusify: 1.1.0 + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -8572,6 +9348,10 @@ snapshots: fetchdts@0.1.7: {} + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -8582,6 +9362,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -8592,8 +9377,12 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 + flat@5.0.2: {} + flatted@3.3.3: {} + follow-redirects@1.15.11: {} + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -8607,18 +9396,34 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + formatly@0.3.0: + dependencies: + fd-package-json: 2.0.0 + formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 fresh@2.0.0: {} + front-matter@4.0.2: + dependencies: + js-yaml: 3.14.1 + + fs-constants@1.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fsevents@2.3.3: optional: true @@ -8703,6 +9508,15 @@ snapshots: globals@16.5.0: {} + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + globby@15.0.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 @@ -8714,9 +9528,9 @@ snapshots: globrex@0.1.2: {} - goober@2.1.18(csstype@3.1.3): + goober@2.1.18(csstype@3.2.3): dependencies: - csstype: 3.1.3 + csstype: 3.2.3 google-auth-library@10.5.0: dependencies: @@ -8761,13 +9575,19 @@ snapshots: ufo: 1.6.1 uncrypto: 0.1.3 - h3@2.0.0-beta.4: + h3@2.0.0-beta.5: dependencies: cookie-es: 2.0.0 fetchdts: 0.1.7 rou3: 0.7.10 srvx: 0.8.16 + happy-dom@20.0.10: + dependencies: + '@types/node': 20.19.25 + '@types/whatwg-mimetype': 3.0.2 + whatwg-mimetype: 3.0.0 + has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -8872,6 +9692,12 @@ snapshots: he@1.2.0: {} + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + highlight.js@11.11.1: {} hookable@5.5.3: {} @@ -8882,7 +9708,9 @@ snapshots: html-entities@2.3.3: {} - html-escaper@2.0.2: {} + html-link-extractor@1.0.5: + dependencies: + cheerio: 1.1.2 html-url-attributes@3.0.1: {} @@ -8921,12 +9749,18 @@ snapshots: httpxy@0.1.7: {} + human-id@4.1.2: {} + human-signals@5.0.0: {} iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -8942,6 +9776,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + inherits@2.0.4: {} inline-style-parser@0.2.4: {} @@ -8993,10 +9829,22 @@ snapshots: is-hexadecimal@2.0.1: {} + is-immutable-type@5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + ts-declaration-location: 1.0.7(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 + is-interactive@1.0.0: {} + is-module@1.0.0: {} is-number@7.0.0: {} @@ -9011,16 +9859,28 @@ snapshots: dependencies: '@types/estree': 1.0.8 + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + is-stream@2.0.1: {} is-stream@3.0.0: {} + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 + is-unicode-supported@0.1.0: {} + is-what@4.1.16: {} + is-windows@1.0.2: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -9039,33 +9899,19 @@ snapshots: isexe@2.0.0: {} - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@5.0.6: - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.2.0: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jest-diff@30.2.0: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.2.0 + jiti@2.6.1: {} jju@1.4.0: {} @@ -9083,46 +9929,18 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@25.0.1: + jsdom@27.2.0(postcss@8.5.6): dependencies: - cssstyle: 4.6.0 - data-urls: 5.0.0 - decimal.js: 10.6.0 - form-data: 4.0.4 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.22 - parse5: 7.3.0 - rrweb-cssom: 0.7.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 5.1.2 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 - ws: 8.18.3 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jsdom@27.0.0(postcss@8.5.6): - dependencies: - '@asamuzakjp/dom-selector': 6.6.1 - cssstyle: 5.3.1(postcss@8.5.6) + '@acemir/cssom': 0.9.24 + '@asamuzakjp/dom-selector': 6.7.4 + cssstyle: 5.3.3(postcss@8.5.6) data-urls: 6.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - parse5: 7.3.0 - rrweb-cssom: 0.8.0 + parse5: 8.0.0 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.0 @@ -9162,6 +9980,8 @@ snapshots: json5@2.2.3: {} + jsonc-parser@3.2.0: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -9193,15 +10013,27 @@ snapshots: klona@2.0.6: {} + knip@5.70.2(@types/node@24.10.1)(typescript@5.9.3): + dependencies: + '@nodelib/fs.walk': 1.2.8 + '@types/node': 24.10.1 + fast-glob: 3.3.3 + formatly: 0.3.0 + jiti: 2.6.1 + js-yaml: 4.1.1 + minimist: 1.2.8 + oxc-resolver: 11.14.0 + picocolors: 1.1.1 + picomatch: 4.0.3 + smol-toml: 1.5.2 + strip-json-comments: 5.0.3 + typescript: 5.9.3 + zod: 4.1.13 + knitwork@1.2.0: {} kolorist@1.8.0: {} - launch-editor@2.12.0: - dependencies: - picocolors: 1.1.1 - shell-quote: 1.8.3 - lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -9260,6 +10092,10 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + lilconfig@3.1.3: {} + + lines-and-columns@2.0.3: {} + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 @@ -9296,6 +10132,12 @@ snapshots: pkg-types: 2.3.0 quansync: 0.2.11 + locate-character@3.0.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -9306,13 +10148,16 @@ snapshots: lodash.merge@4.6.2: {} - lodash@4.17.21: {} + lodash.startcase@4.4.0: {} - longest-streak@3.1.0: {} + lodash@4.17.21: {} - loose-envify@1.4.0: + log-symbols@4.1.0: dependencies: - js-tokens: 4.0.0 + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + longest-streak@3.1.0: {} lowlight@3.3.0: dependencies: @@ -9332,7 +10177,7 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.544.0(react@19.2.0): + lucide-react@0.555.0(react@19.2.0): dependencies: react: 19.2.0 @@ -9340,10 +10185,6 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.19: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -9354,10 +10195,6 @@ snapshots: '@babel/types': 7.28.5 source-map-js: 1.2.1 - make-dir@4.0.0: - dependencies: - semver: 7.7.3 - markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -9367,8 +10204,15 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + markdown-link-extractor@4.0.3: + dependencies: + html-link-extractor: 1.0.5 + marked: 17.0.1 + markdown-table@3.0.4: {} + marked@17.0.1: {} + math-intrinsics@1.1.0: {} mdast-util-find-and-replace@3.0.2: @@ -9750,8 +10594,12 @@ snapshots: mime@4.1.0: {} + mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + min-indent@1.0.1: {} + minimatch@3.0.8: dependencies: brace-expansion: 1.1.12 @@ -9764,10 +10612,16 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.2 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} minizlib@3.1.0: @@ -9781,27 +10635,35 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mri@1.2.0: {} + ms@2.1.3: {} muggle-string@0.4.1: {} nanoid@3.3.11: {} + nanoid@5.1.6: {} + + nanospinner@1.2.2: + dependencies: + picocolors: 1.1.1 + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} - nitropack@2.12.9(rolldown@1.0.0-beta.44): + nitropack@2.12.9(rolldown@1.0.0-beta.51): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@rollup/plugin-alias': 5.1.1(rollup@4.52.5) - '@rollup/plugin-commonjs': 28.0.9(rollup@4.52.5) - '@rollup/plugin-inject': 5.0.5(rollup@4.52.5) - '@rollup/plugin-json': 6.1.0(rollup@4.52.5) - '@rollup/plugin-node-resolve': 16.0.3(rollup@4.52.5) - '@rollup/plugin-replace': 6.0.3(rollup@4.52.5) - '@rollup/plugin-terser': 0.4.4(rollup@4.52.5) - '@vercel/nft': 0.30.3(rollup@4.52.5) + '@rollup/plugin-alias': 5.1.1(rollup@4.53.3) + '@rollup/plugin-commonjs': 28.0.9(rollup@4.53.3) + '@rollup/plugin-inject': 5.0.5(rollup@4.53.3) + '@rollup/plugin-json': 6.1.0(rollup@4.53.3) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.53.3) + '@rollup/plugin-replace': 6.0.3(rollup@4.53.3) + '@rollup/plugin-terser': 0.4.4(rollup@4.53.3) + '@vercel/nft': 0.30.3(rollup@4.53.3) archiver: 7.0.1 c12: 3.3.1(magicast@0.5.1) chokidar: 4.0.3 @@ -9816,7 +10678,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 dot-prop: 10.1.0 - esbuild: 0.25.11 + esbuild: 0.25.12 escape-string-regexp: 5.0.0 etag: 1.8.1 exsolve: 1.0.7 @@ -9843,8 +10705,8 @@ snapshots: pkg-types: 2.3.0 pretty-bytes: 7.1.0 radix3: 1.1.2 - rollup: 4.52.5 - rollup-plugin-visualizer: 6.0.5(rolldown@1.0.0-beta.44)(rollup@4.52.5) + rollup: 4.53.3 + rollup-plugin-visualizer: 6.0.5(rolldown@1.0.0-beta.51)(rollup@4.53.3) scule: 1.3.0 semver: 7.7.3 serve-placeholder: 2.0.2 @@ -9913,6 +10775,8 @@ snapshots: node-gyp-build@4.8.4: {} + node-machine-id@1.1.12: {} + node-mock-http@1.0.3: {} node-releases@2.0.27: {} @@ -9923,6 +10787,10 @@ snapshots: normalize-path@3.0.0: {} + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -9931,7 +10799,56 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.22: {} + nx@22.1.2: + dependencies: + '@napi-rs/wasm-runtime': 0.2.4 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.2 + '@zkochan/js-yaml': 0.0.7 + axios: 1.13.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + enquirer: 2.3.6 + figures: 3.2.0 + flat: 5.0.2 + front-matter: 4.0.2 + ignore: 7.0.5 + jest-diff: 30.2.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + minimatch: 9.0.3 + node-machine-id: 1.1.12 + npm-run-path: 4.0.1 + open: 8.4.2 + ora: 5.3.0 + resolve.exports: 2.0.3 + semver: 7.7.3 + string-width: 4.2.3 + tar-stream: 2.2.0 + tmp: 0.2.5 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tslib: 2.8.1 + yaml: 2.8.1 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 22.1.2 + '@nx/nx-darwin-x64': 22.1.2 + '@nx/nx-freebsd-x64': 22.1.2 + '@nx/nx-linux-arm-gnueabihf': 22.1.2 + '@nx/nx-linux-arm64-gnu': 22.1.2 + '@nx/nx-linux-arm64-musl': 22.1.2 + '@nx/nx-linux-x64-gnu': 22.1.2 + '@nx/nx-linux-x64-musl': 22.1.2 + '@nx/nx-win32-arm64-msvc': 22.1.2 + '@nx/nx-win32-x64-msvc': 22.1.2 + transitivePeerDependencies: + - debug nypm@0.6.2: dependencies: @@ -9941,6 +10858,8 @@ snapshots: pkg-types: 2.3.0 tinyexec: 1.0.1 + obug@2.1.1: {} + ofetch@1.5.0: dependencies: destr: 2.0.5 @@ -9949,7 +10868,7 @@ snapshots: ohash@2.0.11: {} - ollama@0.5.18: + ollama@0.6.3: dependencies: whatwg-fetch: 3.6.20 @@ -9957,6 +10876,14 @@ snapshots: dependencies: ee-first: 1.1.1 + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -9967,10 +10894,10 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@6.9.1(ws@8.18.3)(zod@4.1.12): + openai@6.9.1(ws@8.18.3)(zod@4.1.13): optionalDependencies: ws: 8.18.3 - zod: 4.1.12 + zod: 4.1.13 optionator@0.9.4: dependencies: @@ -9981,16 +10908,73 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@5.3.0: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + is-interactive: 1.0.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + outdent@0.5.0: {} + + oxc-resolver@11.14.0: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.14.0 + '@oxc-resolver/binding-android-arm64': 11.14.0 + '@oxc-resolver/binding-darwin-arm64': 11.14.0 + '@oxc-resolver/binding-darwin-x64': 11.14.0 + '@oxc-resolver/binding-freebsd-x64': 11.14.0 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.14.0 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.14.0 + '@oxc-resolver/binding-linux-arm64-gnu': 11.14.0 + '@oxc-resolver/binding-linux-arm64-musl': 11.14.0 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.14.0 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.14.0 + '@oxc-resolver/binding-linux-riscv64-musl': 11.14.0 + '@oxc-resolver/binding-linux-s390x-gnu': 11.14.0 + '@oxc-resolver/binding-linux-x64-gnu': 11.14.0 + '@oxc-resolver/binding-linux-x64-musl': 11.14.0 + '@oxc-resolver/binding-wasm32-wasi': 11.14.0 + '@oxc-resolver/binding-win32-arm64-msvc': 11.14.0 + '@oxc-resolver/binding-win32-ia32-msvc': 11.14.0 + '@oxc-resolver/binding-win32-x64-msvc': 11.14.0 + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-map@2.1.0: {} + + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + package-manager-detector@1.5.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -10018,6 +11002,10 @@ snapshots: dependencies: entities: 6.0.1 + parse5@8.0.0: + dependencies: + entities: 6.0.1 + parseurl@1.3.3: {} partial-json@0.1.7: {} @@ -10037,6 +11025,8 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-type@4.0.0: {} + path-type@6.0.0: {} pathe@1.1.2: {} @@ -10051,6 +11041,8 @@ snapshots: picomatch@4.0.3: {} + pify@4.0.1: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -10071,6 +11063,15 @@ snapshots: prelude-ls@1.2.1: {} + premove@4.0.0: {} + + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.44.1): + dependencies: + prettier: 3.6.2 + svelte: 5.44.1 + + prettier@2.8.8: {} + prettier@3.6.2: {} pretty-bytes@7.1.0: {} @@ -10081,6 +11082,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + process-nextick-args@2.0.1: {} process@0.11.10: {} @@ -10089,6 +11096,15 @@ snapshots: property-information@7.1.0: {} + proxy-from-env@1.1.0: {} + + publint@0.3.15: + dependencies: + '@publint/pack': 0.1.2 + package-manager-detector: 1.5.0 + picocolors: 1.1.1 + sade: 1.8.1 + punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -10110,11 +11126,6 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - react-dom@19.2.0(react@18.3.1): - dependencies: - react: 18.3.1 - scheduler: 0.27.0 - react-dom@19.2.0(react@19.2.0): dependencies: react: 19.2.0 @@ -10122,29 +11133,13 @@ snapshots: react-is@17.0.2: {} - react-markdown@10.1.0(@types/react@18.3.26)(react@19.2.0): - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/react': 18.3.26 - devlop: 1.1.0 - hast-util-to-jsx-runtime: 2.3.6 - html-url-attributes: 3.0.1 - mdast-util-to-hast: 13.2.0 - react: 19.2.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - unified: 11.0.5 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color + react-is@18.3.1: {} - react-markdown@10.1.0(@types/react@19.2.2)(react@19.2.0): + react-markdown@10.1.0(@types/react@19.2.7)(react@19.2.0): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 19.2.2 + '@types/react': 19.2.7 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 @@ -10160,12 +11155,15 @@ snapshots: react-refresh@0.18.0: {} - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - react@19.2.0: {} + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -10176,6 +11174,12 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readable-stream@4.7.0: dependencies: abort-controller: 3.0.0 @@ -10202,6 +11206,11 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -10271,55 +11280,45 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.3: {} + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + reusify@1.1.0: {} rimraf@5.0.10: dependencies: glob: 10.4.5 - rolldown-plugin-dts@0.16.12(rolldown@1.0.0-beta.44)(typescript@5.9.3): - dependencies: - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - ast-kit: 2.1.3 - birpc: 2.6.1 - debug: 4.4.3 - dts-resolver: 2.1.2 - get-tsconfig: 4.13.0 - magic-string: 0.30.19 - rolldown: 1.0.0-beta.44 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - oxc-resolver - - supports-color - - rolldown@1.0.0-beta.44: + rolldown@1.0.0-beta.51: dependencies: - '@oxc-project/types': 0.95.0 - '@rolldown/pluginutils': 1.0.0-beta.44 + '@oxc-project/types': 0.98.0 + '@rolldown/pluginutils': 1.0.0-beta.51 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.44 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.44 - '@rolldown/binding-darwin-x64': 1.0.0-beta.44 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.44 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.44 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.44 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.44 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.44 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.44 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.44 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.44 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.44 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.44 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.44 + '@rolldown/binding-android-arm64': 1.0.0-beta.51 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.51 + '@rolldown/binding-darwin-x64': 1.0.0-beta.51 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.51 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.51 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.51 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.51 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.51 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.51 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.51 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.51 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.51 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.51 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.51 + optional: true rollup-plugin-preserve-directives@0.4.0(rollup@4.53.3): dependencies: @@ -10327,43 +11326,15 @@ snapshots: magic-string: 0.30.21 rollup: 4.53.3 - rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-beta.44)(rollup@4.52.5): + rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-beta.51)(rollup@4.53.3): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.0-beta.44 - rollup: 4.52.5 - - rollup@4.52.5: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.5 - '@rollup/rollup-android-arm64': 4.52.5 - '@rollup/rollup-darwin-arm64': 4.52.5 - '@rollup/rollup-darwin-x64': 4.52.5 - '@rollup/rollup-freebsd-arm64': 4.52.5 - '@rollup/rollup-freebsd-x64': 4.52.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 - '@rollup/rollup-linux-arm-musleabihf': 4.52.5 - '@rollup/rollup-linux-arm64-gnu': 4.52.5 - '@rollup/rollup-linux-arm64-musl': 4.52.5 - '@rollup/rollup-linux-loong64-gnu': 4.52.5 - '@rollup/rollup-linux-ppc64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-musl': 4.52.5 - '@rollup/rollup-linux-s390x-gnu': 4.52.5 - '@rollup/rollup-linux-x64-gnu': 4.52.5 - '@rollup/rollup-linux-x64-musl': 4.52.5 - '@rollup/rollup-openharmony-arm64': 4.52.5 - '@rollup/rollup-win32-arm64-msvc': 4.52.5 - '@rollup/rollup-win32-ia32-msvc': 4.52.5 - '@rollup/rollup-win32-x64-gnu': 4.52.5 - '@rollup/rollup-win32-x64-msvc': 4.52.5 - fsevents: 2.3.3 + rolldown: 1.0.0-beta.51 + rollup: 4.53.3 rollup@4.53.3: dependencies: @@ -10395,14 +11366,14 @@ snapshots: rou3@0.7.10: {} - rrweb-cssom@0.7.1: {} - - rrweb-cssom@0.8.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} @@ -10449,8 +11420,14 @@ snapshots: dependencies: seroval: 1.3.2 + seroval-plugins@1.4.0(seroval@1.4.0): + dependencies: + seroval: 1.4.0 + seroval@1.3.2: {} + seroval@1.4.0: {} + serve-placeholder@2.0.2: dependencies: defu: 6.1.4 @@ -10472,10 +11449,45 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} + sherif-darwin-arm64@1.9.0: + optional: true + + sherif-darwin-x64@1.9.0: + optional: true + + sherif-linux-arm64-musl@1.9.0: + optional: true + + sherif-linux-arm64@1.9.0: + optional: true + + sherif-linux-x64-musl@1.9.0: + optional: true + + sherif-linux-x64@1.9.0: + optional: true + + sherif-windows-arm64@1.9.0: + optional: true + + sherif-windows-x64@1.9.0: + optional: true + + sherif@1.9.0: + optionalDependencies: + sherif-darwin-arm64: 1.9.0 + sherif-darwin-x64: 1.9.0 + sherif-linux-arm64: 1.9.0 + sherif-linux-arm64-musl: 1.9.0 + sherif-linux-x64: 1.9.0 + sherif-linux-x64-musl: 1.9.0 + sherif-windows-arm64: 1.9.0 + sherif-windows-x64: 1.9.0 siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} simple-git@3.30.0: @@ -10486,10 +11498,24 @@ snapshots: transitivePeerDependencies: - supports-color + size-limit@11.2.0: + dependencies: + bytes-iec: 3.1.1 + chokidar: 4.0.3 + jiti: 2.6.1 + lilconfig: 3.1.3 + nanospinner: 1.2.2 + picocolors: 1.1.1 + tinyglobby: 0.2.15 + + slash@3.0.0: {} + slash@5.1.0: {} smob@1.5.0: {} + smol-toml@1.5.2: {} + solid-js@1.9.10: dependencies: csstype: 3.1.3 @@ -10518,6 +11544,11 @@ snapshots: space-separated-tokens@2.0.2: {} + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -10547,6 +11578,8 @@ snapshots: string-argv@0.3.2: {} + string-ts@2.2.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -10580,10 +11613,18 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom@3.0.0: {} + strip-final-newline@3.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 @@ -10608,16 +11649,42 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte@5.44.1: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.7(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.5.0 + esm-env: 1.2.2 + esrap: 2.2.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + symbol-tree@3.2.4: {} system-architecture@0.1.0: {} tagged-tag@1.0.0: {} - tailwindcss@4.1.16: {} + tailwindcss@4.1.17: {} tapable@2.3.0: {} + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + tar-stream@3.1.7: dependencies: b4a: 1.7.3 @@ -10635,6 +11702,8 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 + term-size@2.2.1: {} + terser@5.44.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -10669,38 +11738,26 @@ snapshots: tinyrainbow@3.0.3: {} - tldts-core@6.1.86: {} - tldts-core@7.0.16: {} - tldts@6.1.86: - dependencies: - tldts-core: 6.1.86 - tldts@7.0.16: dependencies: tldts-core: 7.0.16 + tmp@0.2.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toidentifier@1.0.1: {} - tough-cookie@5.1.2: - dependencies: - tldts: 6.1.86 - tough-cookie@6.0.0: dependencies: tldts: 7.0.16 tr46@0.0.3: {} - tr46@5.1.1: - dependencies: - punycode: 2.3.1 - tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -10722,34 +11779,17 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.3 + ts-pattern@5.9.0: {} + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 - tsdown@0.15.9(typescript@5.9.3): + tsconfig-paths@4.2.0: dependencies: - ansis: 4.2.0 - cac: 6.7.14 - chokidar: 4.0.3 - debug: 4.4.3 - diff: 8.0.2 - empathic: 2.0.0 - hookable: 5.5.3 - rolldown: 1.0.0-beta.44 - rolldown-plugin-dts: 0.16.12(rolldown@1.0.0-beta.44)(typescript@5.9.3) - semver: 7.7.3 - tinyexec: 1.0.1 - tinyglobby: 0.2.15 - tree-kill: 1.2.2 - unconfig: 7.3.3 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@ts-macro/tsc' - - '@typescript/native-preview' - - oxc-resolver - - supports-color - - vue-tsc + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 tslib@2.8.1: {} @@ -10807,13 +11847,6 @@ snapshots: ultrahtml@1.6.0: {} - unconfig@7.3.3: - dependencies: - '@quansync/fs': 0.1.5 - defu: 6.1.4 - jiti: 2.6.1 - quansync: 0.2.11 - uncrypto@0.1.3: {} unctx@2.4.1: @@ -10825,6 +11858,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.16.0: {} + undici@7.16.0: {} unenv@2.0.0-rc.24: @@ -10998,9 +12033,9 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-dts@4.2.3(@types/node@22.18.8)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-dts@4.2.3(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@22.18.8) + '@microsoft/api-extractor': 7.47.7(@types/node@24.10.1) '@rollup/pluginutils': 5.3.0(rollup@4.53.3) '@volar/typescript': 2.4.23 '@vue/language-core': 2.1.6(typescript@5.9.3) @@ -11011,17 +12046,17 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.10.0(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-externalize-deps@0.10.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@babel/core': 7.28.5 '@types/babel__core': 7.20.5 @@ -11029,40 +12064,25 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.10 solid-refresh: 0.6.3(solid-js@1.9.10) - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + optionalDependencies: + '@testing-library/jest-dom': 6.9.1 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - esbuild: 0.25.11 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.52.5 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.18.8 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - terser: 5.44.0 - tsx: 4.20.6 - yaml: 2.8.1 - - vite@7.2.4(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -11071,7 +12091,7 @@ snapshots: rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.8 + '@types/node': 24.10.1 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 @@ -11079,63 +12099,23 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitefu@1.1.1(vite@7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.9(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - - vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - '@vitest/expect': 4.0.13 - '@vitest/mocker': 4.0.13(vite@7.2.4(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.13 - '@vitest/runner': 4.0.13 - '@vitest/snapshot': 4.0.13 - '@vitest/spy': 4.0.13 - '@vitest/utils': 4.0.13 - debug: 4.4.3 - es-module-lexer: 1.7.0 - expect-type: 1.2.2 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.2.4(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 22.18.8 - jsdom: 25.0.1 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vitest@4.0.13(@types/debug@4.1.12)(@types/node@22.18.8)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.13 - '@vitest/mocker': 4.0.13(vite@7.2.4(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.13 - '@vitest/runner': 4.0.13 - '@vitest/snapshot': 4.0.13 - '@vitest/spy': 4.0.13 - '@vitest/utils': 4.0.13 - debug: 4.4.3 + '@vitest/expect': 4.0.14 + '@vitest/mocker': 4.0.14(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.14 + '@vitest/runner': 4.0.14 + '@vitest/snapshot': 4.0.14 + '@vitest/spy': 4.0.14 + '@vitest/utils': 4.0.14 es-module-lexer: 1.7.0 expect-type: 1.2.2 magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 std-env: 3.10.0 @@ -11143,12 +12123,12 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.4(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 22.18.8 - jsdom: 27.0.0(postcss@8.5.6) + '@types/node': 24.10.1 + happy-dom: 20.0.10 + jsdom: 27.2.0(postcss@8.5.6) transitivePeerDependencies: - jiti - less @@ -11158,7 +12138,6 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml @@ -11181,6 +12160,12 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + walk-up-path@4.0.0: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} @@ -11189,8 +12174,6 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@7.0.0: {} - webidl-conversions@8.0.0: {} webpack-virtual-modules@0.6.2: {} @@ -11201,12 +12184,9 @@ snapshots: whatwg-fetch@3.6.20: {} - whatwg-mimetype@4.0.0: {} + whatwg-mimetype@3.0.0: {} - whatwg-url@14.2.0: - dependencies: - tr46: 5.1.1 - webidl-conversions: 7.0.0 + whatwg-mimetype@4.0.0: {} whatwg-url@15.1.0: dependencies: @@ -11241,16 +12221,18 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.2 + wrappy@1.0.2: {} + ws@8.18.3: {} xml-name-validator@5.0.0: {} - xmlbuilder2@3.1.1: + xmlbuilder2@4.0.1: dependencies: - '@oozcitak/dom': 1.15.10 - '@oozcitak/infra': 1.0.8 - '@oozcitak/util': 8.3.8 - js-yaml: 3.14.1 + '@oozcitak/dom': 2.0.2 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + js-yaml: 4.1.1 xmlchars@2.2.0: {} @@ -11291,14 +12273,24 @@ snapshots: cookie: 1.0.2 youch-core: 0.3.3 + zimmerframe@1.1.4: {} + zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 readable-stream: 4.7.0 + zod-validation-error@3.5.4(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-validation-error@4.0.2(zod@4.1.13): + dependencies: + zod: 4.1.13 + zod@3.25.76: {} - zod@4.1.12: {} + zod@4.1.13: {} zwitch@2.0.4: {} diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 000000000..dbb08b111 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,12 @@ +// @ts-check + +/** @type {import('prettier').Config} */ +const config = { + semi: false, + singleQuote: true, + trailingComma: 'all', + plugins: ['prettier-plugin-svelte'], + overrides: [{ files: '*.svelte', options: { parser: 'svelte' } }], +} + +export default config diff --git a/scripts/check-missing-docs.sh b/scripts/check-missing-docs.sh new file mode 100755 index 000000000..2d7daae4a --- /dev/null +++ b/scripts/check-missing-docs.sh @@ -0,0 +1,213 @@ +#!/bin/bash + +# Script to check for missing API references and examples in docs/config.json +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${GREEN}🔍 Checking for missing API references and examples in config.json${NC}" +echo "==================================================================" + +# Function to extract hook names from TypeScript files +extract_hooks_from_package() { + local package_path="$1" + local prefix="$2" + + if [ ! -d "$package_path" ]; then + return + fi + + # Find all TypeScript files that start with the prefix and extract hook names + find "$package_path" -name "${prefix}*.ts" -type f | while read -r file; do + basename "$file" .ts + done | sort +} + +# Function to extract examples from examples directory +extract_examples_from_framework() { + local framework="$1" + local examples_path="examples/$framework" + + if [ ! -d "$examples_path" ]; then + return + fi + + # List all directories in examples/framework + find "$examples_path" -maxdepth 1 -type d | while read -r dir; do + if [ "$dir" != "$examples_path" ]; then + basename "$dir" + fi + done | sort +} + +# Function to extract API references from config.json +extract_api_refs_from_config() { + local framework="$1" + local section="$2" + + # Extract API references for a specific framework and section + jq -r " + .sections[] | + select(.label == \"$section\") | + .frameworks[]? | + select(.label == \"$framework\") | + .children[]? | + .label + " docs/config.json 2>/dev/null | sort +} + +# Function to extract examples from config.json +extract_examples_from_config() { + local framework="$1" + local section="$2" + + # Extract examples for a specific framework and section + jq -r " + .sections[] | + select(.label == \"$section\") | + .frameworks[]? | + select(.label == \"$framework\") | + .children[]? | + .label + " docs/config.json 2>/dev/null | sort +} + +# Function to find items in first list that are not in second list +find_missing() { + local actual_file="$1" + local expected_file="$2" + + # Use comm to find items in actual that are not in expected + comm -23 <(sort "$actual_file") <(sort "$expected_file") 2>/dev/null +} + +# Function to check framework +check_framework() { + local framework="$1" + local hook_prefix="$2" + + echo -e "\n${YELLOW}📋 Checking $framework framework${NC}" + echo "----------------------------------------" + + # Get actual hooks from packages + local package_path="packages/$framework-ai/src" + + # Create temporary files + local temp_dir=$(mktemp -d) + local actual_hooks_file="$temp_dir/actual_hooks" + local actual_examples_file="$temp_dir/actual_examples" + local config_apis_file="$temp_dir/config_apis" + local config_examples_file="$temp_dir/config_examples" + + # Collect all hooks + { + extract_hooks_from_package "$package_path" "$hook_prefix" + } | sort -u > "$actual_hooks_file" + + # Get actual examples + extract_examples_from_framework "$framework" > "$actual_examples_file" + + # Check API references for each major section + local api_sections=( + "Debouncer API Reference" + "Throttler API Reference" + "Rate Limiter API Reference" + "Queue API Reference" + "Batcher API Reference" + ) + + { + for section in "${api_sections[@]}"; do + extract_api_refs_from_config "$framework" "$section" + done + } | sort -u > "$config_apis_file" + + # Check examples for each major section + local example_sections=( + "Debouncer Examples" + "Throttler Examples" + "Rate Limiter Examples" + "Queue Examples" + "Batcher Examples" + ) + + { + for section in "${example_sections[@]}"; do + extract_examples_from_config "$framework" "$section" + done + } | sort -u > "$config_examples_file" + + # Count items + local actual_hooks_count=$(wc -l < "$actual_hooks_file") + local config_apis_count=$(wc -l < "$config_apis_file") + local actual_examples_count=$(wc -l < "$actual_examples_file") + local config_examples_count=$(wc -l < "$config_examples_file") + + echo "📊 Found $actual_hooks_count hooks, $config_apis_count API refs in config" + echo "📊 Found $actual_examples_count examples, $config_examples_count example refs in config" + + # Find missing API references + local missing_apis_file="$temp_dir/missing_apis" + find_missing "$actual_hooks_file" "$config_apis_file" > "$missing_apis_file" + + # Find missing examples + local missing_examples_file="$temp_dir/missing_examples" + find_missing "$actual_examples_file" "$config_examples_file" > "$missing_examples_file" + + # Report results + if [ -s "$missing_apis_file" ]; then + echo -e "\n${RED}❌ Missing API References:${NC}" + cat "$missing_apis_file" + else + echo -e "\n${GREEN}✅ All API references are documented${NC}" + fi + + if [ -s "$missing_examples_file" ]; then + echo -e "\n${RED}❌ Missing Examples:${NC}" + cat "$missing_examples_file" + else + echo -e "\n${GREEN}✅ All examples are documented${NC}" + fi + + # Report extra items in config (might be outdated) + local extra_apis_file="$temp_dir/extra_apis" + find_missing "$config_apis_file" "$actual_hooks_file" > "$extra_apis_file" + + local extra_examples_file="$temp_dir/extra_examples" + find_missing "$config_examples_file" "$actual_examples_file" > "$extra_examples_file" + + if [ -s "$extra_apis_file" ]; then + echo -e "\n${YELLOW}⚠️ Extra API References in config (may be outdated):${NC}" + cat "$extra_apis_file" + fi + + if [ -s "$extra_examples_file" ]; then + echo -e "\n${YELLOW}⚠️ Extra Examples in config (may be outdated):${NC}" + cat "$extra_examples_file" + fi + + # Cleanup + rm -rf "$temp_dir" +} + +# Check if jq is available +if ! command -v jq &> /dev/null; then + echo -e "${RED}❌ jq is required but not installed. Please install jq to run this script.${NC}" + exit 1 +fi + +# Check if config.json exists +if [ ! -f "docs/config.json" ]; then + echo -e "${RED}❌ docs/config.json not found. Please run this script from the project root.${NC}" + exit 1 +fi + +# Check React framework +check_framework "react" "use" + +# Check Solid framework +check_framework "solid" "create" + +echo -e "\n${GREEN}🎉 Documentation check complete!${NC}" \ No newline at end of file diff --git a/scripts/generateDocs.js b/scripts/generateDocs.js new file mode 100644 index 000000000..f7488ac94 --- /dev/null +++ b/scripts/generateDocs.js @@ -0,0 +1,64 @@ +import { resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { readFileSync, writeFileSync } from 'node:fs' +import { generateReferenceDocs } from '@tanstack/config/typedoc' + +import fg from 'fast-glob' + +const __dirname = fileURLToPath(new URL('.', import.meta.url)) + +/** @type {import('@tanstack/config/typedoc').Package[]} */ +const packages = [ + { + name: 'ai', + entryPoints: [resolve(__dirname, '../packages/ai/src/index.ts')], + tsconfig: resolve(__dirname, '../packages/ai/tsconfig.docs.json'), + outputDir: resolve(__dirname, '../docs/reference'), + }, + { + name: 'react-ai', + entryPoints: [resolve(__dirname, '../packages/react-ai/src/index.ts')], + tsconfig: resolve(__dirname, '../packages/react-ai/tsconfig.docs.json'), + outputDir: resolve(__dirname, '../docs/framework/react/reference'), + exclude: ['packages/ai/**/*'], + }, + { + name: 'solid-ai', + entryPoints: [resolve(__dirname, '../packages/solid-ai/src/index.ts')], + tsconfig: resolve(__dirname, '../packages/solid-ai/tsconfig.docs.json'), + outputDir: resolve(__dirname, '../docs/framework/solid/reference'), + exclude: ['packages/ai/**/*'], + }, +] + +await generateReferenceDocs({ packages }) + +// Find all markdown files matching the pattern +const markdownFiles = [ + ...(await fg('docs/reference/**/*.md')), + ...(await fg('docs/framework/*/reference/**/*.md')), +] + +console.log(`Found ${markdownFiles.length} markdown files to process\n`) + +// Process each markdown file +markdownFiles.forEach((file) => { + const content = readFileSync(file, 'utf-8') + let updatedContent = content + updatedContent = updatedContent.replaceAll(/\]\(\.\.\//gm, '](../../') + // updatedContent = content.replaceAll(/\]\(\.\//gm, '](../') + updatedContent = updatedContent.replaceAll( + /\]\((?!https?:\/\/|\/\/|\/|\.\/|\.\.\/|#)([^)]+)\)/gm, + (match, p1) => `](../${p1})`, + ) + + // Write the updated content back to the file + if (updatedContent !== content) { + writeFileSync(file, updatedContent, 'utf-8') + console.log(`Processed file: ${file}`) + } +}) + +console.log('\n✅ All markdown files have been processed!') + +process.exit(0) diff --git a/scripts/verify-links.ts b/scripts/verify-links.ts new file mode 100644 index 000000000..31d786c44 --- /dev/null +++ b/scripts/verify-links.ts @@ -0,0 +1,133 @@ +import { existsSync, readFileSync, statSync } from 'node:fs' +import path, { resolve } from 'node:path' +import fg from 'fast-glob' +// @ts-ignore - this is a valid import +import markdownLinkExtractor from 'markdown-link-extractor' + +function isRelativeLink(link: string) { + return ( + link && + !link.startsWith('/') && + !link.startsWith('http://') && + !link.startsWith('https://') && + !link.startsWith('//') && + !link.startsWith('#') && + !link.startsWith('mailto:') + ) +} + +function normalizePath(p: string): string { + // Remove any trailing .md + p = p.replace(`${path.extname(p)}`, '') + return p +} + +function fileExistsForLink( + link: string, + markdownFile: string, + errors: Array, +): boolean { + // Remove hash if present + const filePart = link.split('#')[0] + // If the link is empty after removing hash, it's not a file + if (!filePart) return false + + // Normalize the markdown file path + markdownFile = normalizePath(markdownFile) + + // Normalize the path + const normalizedPath = normalizePath(filePart) + + // Resolve the path relative to the markdown file's directory + let absPath = resolve(markdownFile, normalizedPath) + + // Ensure the resolved path is within /docs + const docsRoot = resolve('docs') + if (!absPath.startsWith(docsRoot)) { + errors.push({ + link, + markdownFile, + resolvedPath: absPath, + reason: 'navigates above /docs, invalid', + }) + return false + } + + // Check if this is an example path + const isExample = absPath.includes('/examples/') + + let exists = false + + if (isExample) { + // Transform /docs/framework/{framework}/examples/ to /examples/{framework}/ + absPath = absPath.replace( + /\/docs\/framework\/([^/]+)\/examples\//, + '/examples/$1/', + ) + // For examples, we want to check if the directory exists + exists = existsSync(absPath) && statSync(absPath).isDirectory() + } else { + // For non-examples, we want to check if the .md file exists + if (!absPath.endsWith('.md')) { + absPath = `${absPath}.md` + } + exists = existsSync(absPath) + } + + if (!exists) { + errors.push({ + link, + markdownFile, + resolvedPath: absPath, + reason: 'not found', + }) + } + return exists +} + +async function findMarkdownLinks() { + // Find all markdown files in docs directory + const markdownFiles = await fg('docs/**/*.md', { + ignore: ['**/node_modules/**'], + }) + + console.log(`Found ${markdownFiles.length} markdown files\n`) + + const errors: Array = [] + + // Process each file + for (const file of markdownFiles) { + const content = readFileSync(file, 'utf-8') + const links: Array = markdownLinkExtractor(content) + + const filteredLinks = links.filter((link: any) => { + if (typeof link === 'string') { + return isRelativeLink(link) + } else if (link && typeof link.href === 'string') { + return isRelativeLink(link.href) + } + return false + }) + + if (filteredLinks.length > 0) { + filteredLinks.forEach((link: any) => { + const href = typeof link === 'string' ? link : link.href + fileExistsForLink(href, file, errors) + }) + } + } + + if (errors.length > 0) { + console.log(`\n❌ Found ${errors.length} broken links:`) + errors.forEach((err) => { + console.log( + `${err.link}\n in: ${err.markdownFile}\n path: ${err.resolvedPath}\n why: ${err.reason}\n`, + ) + }) + process.exit(1) + } else { + console.log('\n✅ No broken links found!') + } +} + +findMarkdownLinks().catch(console.error) diff --git a/tsconfig.json b/tsconfig.json index 4a9fc7c61..533d8b6ba 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,25 +1,33 @@ { + "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { - "target": "ES2022", - "lib": ["ES2022"], - "module": "ESNext", - "moduleResolution": "node", + "allowJs": true, "allowSyntheticDefaultImports": true, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "checkJs": true, + "declaration": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "outDir": "dist", - "rootDir": "src", - "composite": true, + "isolatedModules": true, + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "module": "ES2022", + "moduleResolution": "Bundler", + "noEmit": true, + "noImplicitReturns": true, + "noUncheckedIndexedAccess": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2020", + "noErrorTruncation": true }, - "exclude": ["node_modules", "dist", "build", "*.config.*"] + "include": [ + "prettier.config.js", + "scripts", + "eslint.config.js", + "vitest.workspace.js" + ] } diff --git a/vitest.workspace.js b/vitest.workspace.js new file mode 100644 index 000000000..9b7d3a768 --- /dev/null +++ b/vitest.workspace.js @@ -0,0 +1,14 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + projects: [ + './packages/ai/vite.config.ts', + './packages/ai-lite/vite.config.ts', + './packages/react-ai/vite.config.ts', + './packages/react-ai-devtools/vite.config.ts', + './packages/solid-ai/vite.config.ts', + './packages/solid-ai-devtools/vite.config.ts', + ], + }, +}) From e3c531c0cdff37c089090a844313913adeb87b53 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 10:20:31 +0100 Subject: [PATCH 02/24] remove nx files from git --- .gitignore | 1 + .nx/cache/run.json | 98 - .../terminalOutputs/10212416127652217168 | 15 - .../terminalOutputs/10602608975826075496 | 15 - .../terminalOutputs/10899295964426828110 | 15 - .../terminalOutputs/12189398981347784299 | 129 - .../terminalOutputs/12311986898317374245 | 15 - .../terminalOutputs/13891177766533542103 | 49 - .../terminalOutputs/15134291999248278184 | 41 - .../terminalOutputs/15289852906145915523 | 15 - .../terminalOutputs/16048335657332254327 | 41 - .../terminalOutputs/16380270685398234527 | 15 - .nx/cache/terminalOutputs/2686292967587754244 | 15 - .nx/cache/terminalOutputs/3505369680714718251 | 57 - .nx/cache/terminalOutputs/3741776693305569249 | 15 - .nx/cache/terminalOutputs/5434208491390619494 | 15 - .nx/cache/terminalOutputs/5934932795746721533 | 129 - .nx/cache/terminalOutputs/6767593282717562448 | 15 - .nx/cache/terminalOutputs/6900745953598375882 | 15 - .../A0C6373D-4A79-501D-A64C-0B2F2C38049E.db | Bin 4096 -> 0 bytes ...0C6373D-4A79-501D-A64C-0B2F2C38049E.db-shm | Bin 32768 -> 0 bytes ...0C6373D-4A79-501D-A64C-0B2F2C38049E.db-wal | Bin 144232 -> 0 bytes .nx/workspace-data/d/server-process.json | 5 - .nx/workspace-data/file-map.json | 1634 - .nx/workspace-data/lockfile-dependencies.hash | 1 - .nx/workspace-data/lockfile-nodes.hash | 1 - .nx/workspace-data/nx_files.nxt | Bin 32748 -> 0 bytes .../parsed-lock-file.dependencies.json | 12687 ------- .../parsed-lock-file.nodes.json | 15406 --------- .nx/workspace-data/project-graph.json | 28748 ---------------- .nx/workspace-data/source-maps.json | 5602 --- 31 files changed, 1 insertion(+), 64793 deletions(-) delete mode 100644 .nx/cache/run.json delete mode 100644 .nx/cache/terminalOutputs/10212416127652217168 delete mode 100644 .nx/cache/terminalOutputs/10602608975826075496 delete mode 100644 .nx/cache/terminalOutputs/10899295964426828110 delete mode 100644 .nx/cache/terminalOutputs/12189398981347784299 delete mode 100644 .nx/cache/terminalOutputs/12311986898317374245 delete mode 100644 .nx/cache/terminalOutputs/13891177766533542103 delete mode 100644 .nx/cache/terminalOutputs/15134291999248278184 delete mode 100644 .nx/cache/terminalOutputs/15289852906145915523 delete mode 100644 .nx/cache/terminalOutputs/16048335657332254327 delete mode 100644 .nx/cache/terminalOutputs/16380270685398234527 delete mode 100644 .nx/cache/terminalOutputs/2686292967587754244 delete mode 100644 .nx/cache/terminalOutputs/3505369680714718251 delete mode 100644 .nx/cache/terminalOutputs/3741776693305569249 delete mode 100644 .nx/cache/terminalOutputs/5434208491390619494 delete mode 100644 .nx/cache/terminalOutputs/5934932795746721533 delete mode 100644 .nx/cache/terminalOutputs/6767593282717562448 delete mode 100644 .nx/cache/terminalOutputs/6900745953598375882 delete mode 100644 .nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db delete mode 100644 .nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db-shm delete mode 100644 .nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db-wal delete mode 100644 .nx/workspace-data/d/server-process.json delete mode 100644 .nx/workspace-data/file-map.json delete mode 100644 .nx/workspace-data/lockfile-dependencies.hash delete mode 100644 .nx/workspace-data/lockfile-nodes.hash delete mode 100644 .nx/workspace-data/nx_files.nxt delete mode 100644 .nx/workspace-data/parsed-lock-file.dependencies.json delete mode 100644 .nx/workspace-data/parsed-lock-file.nodes.json delete mode 100644 .nx/workspace-data/project-graph.json delete mode 100644 .nx/workspace-data/source-maps.json diff --git a/.gitignore b/.gitignore index 95f95223f..8e5f0188c 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ output/ # My TODOs. Feel free to ignore this. *-TODO.md +.nx diff --git a/.nx/cache/run.json b/.nx/cache/run.json deleted file mode 100644 index c8af8461b..000000000 --- a/.nx/cache/run.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "run": { - "command": "nx affected --skip-nx-cache --targets=build --exclude=examples/**", - "startTime": "2025-11-26T21:58:42.705Z", - "endTime": "2025-11-26T21:58:47.233Z", - "inner": false - }, - "tasks": [ - { - "taskId": "@tanstack/ai:build", - "target": "build", - "projectName": "@tanstack/ai", - "hash": "15134291999248278184", - "startTime": "2025-11-26T21:58:42.741Z", - "endTime": "2025-11-26T21:58:44.946Z", - "params": "", - "cacheStatus": "cache-miss", - "status": 0 - }, - { - "taskId": "@tanstack/ai-openai:build", - "target": "build", - "projectName": "@tanstack/ai-openai", - "hash": "6767593282717562448", - "startTime": "2025-11-26T21:58:44.953Z", - "endTime": "2025-11-26T21:58:45.563Z", - "params": "", - "cacheStatus": "cache-miss", - "status": 1 - }, - { - "taskId": "@tanstack/ai-gemini:build", - "target": "build", - "projectName": "@tanstack/ai-gemini", - "hash": "10602608975826075496", - "startTime": "2025-11-26T21:58:44.953Z", - "endTime": "2025-11-26T21:58:45.563Z", - "params": "", - "cacheStatus": "cache-miss", - "status": 1 - }, - { - "taskId": "@tanstack/ai-ollama:build", - "target": "build", - "projectName": "@tanstack/ai-ollama", - "hash": "10212416127652217168", - "startTime": "2025-11-26T21:58:45.564Z", - "endTime": "2025-11-26T21:58:46.123Z", - "params": "", - "cacheStatus": "cache-miss", - "status": 1 - }, - { - "taskId": "@tanstack/ai-fallback:build", - "target": "build", - "projectName": "@tanstack/ai-fallback", - "hash": "5434208491390619494", - "startTime": "2025-11-26T21:58:45.566Z", - "endTime": "2025-11-26T21:58:46.123Z", - "params": "", - "cacheStatus": "cache-miss", - "status": 1 - }, - { - "taskId": "@tanstack/ai-client:build", - "target": "build", - "projectName": "@tanstack/ai-client", - "hash": "13891177766533542103", - "startTime": "2025-11-26T21:58:44.953Z", - "endTime": "2025-11-26T21:58:46.751Z", - "params": "", - "cacheStatus": "cache-miss", - "status": 1 - }, - { - "taskId": "@tanstack/ai-anthropic:build", - "target": "build", - "projectName": "@tanstack/ai-anthropic", - "hash": "3505369680714718251", - "startTime": "2025-11-26T21:58:44.953Z", - "endTime": "2025-11-26T21:58:46.767Z", - "params": "", - "cacheStatus": "cache-miss", - "status": 1 - }, - { - "taskId": "@tanstack/ai-devtools-core:build", - "target": "build", - "projectName": "@tanstack/ai-devtools-core", - "hash": "5934932795746721533", - "startTime": "2025-11-26T21:58:44.953Z", - "endTime": "2025-11-26T21:58:47.232Z", - "params": "", - "cacheStatus": "cache-miss", - "status": 1 - } - ] -} \ No newline at end of file diff --git a/.nx/cache/terminalOutputs/10212416127652217168 b/.nx/cache/terminalOutputs/10212416127652217168 deleted file mode 100644 index 4c0b7ccbe..000000000 --- a/.nx/cache/terminalOutputs/10212416127652217168 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-ollama@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-ollama -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 7ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/10602608975826075496 b/.nx/cache/terminalOutputs/10602608975826075496 deleted file mode 100644 index 29ee11116..000000000 --- a/.nx/cache/terminalOutputs/10602608975826075496 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-gemini@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-gemini -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 7ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/10899295964426828110 b/.nx/cache/terminalOutputs/10899295964426828110 deleted file mode 100644 index f1474b1a9..000000000 --- a/.nx/cache/terminalOutputs/10899295964426828110 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-openai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-openai -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 7ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/12189398981347784299 b/.nx/cache/terminalOutputs/12189398981347784299 deleted file mode 100644 index f3442aad8..000000000 --- a/.nx/cache/terminalOutputs/12189398981347784299 +++ /dev/null @@ -1,129 +0,0 @@ - -> @tanstack/ai-devtools-core@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-devtools -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -src/store/ai-context.tsx:3:31 - error TS2307: Cannot find module '@tanstack/ai/event-client' or its corresponding type declarations. - -3 import { aiEventClient } from "@tanstack/ai/event-client"; -   ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src/store/ai-context.tsx:430:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -430 (e) => { -   ~ -src/store/ai-context.tsx:442:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -442 (e) => { -   ~ -src/store/ai-context.tsx:462:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -462 (e) => { -   ~ -src/store/ai-context.tsx:485:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -485 (e) => { -   ~ -src/store/ai-context.tsx:498:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -498 (e) => { -   ~ -src/store/ai-context.tsx:511:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -511 (e) => { -   ~ -src/store/ai-context.tsx:524:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -524 (e) => { -   ~ -src/store/ai-context.tsx:541:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -541 (e) => { -   ~ -src/store/ai-context.tsx:554:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -554 (e) => { -   ~ -src/store/ai-context.tsx:584:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -584 (e) => { -   ~ -src/store/ai-context.tsx:634:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -634 (e) => { -   ~ -src/store/ai-context.tsx:664:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -664 (e) => { -   ~ -src/store/ai-context.tsx:692:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -692 (e) => { -   ~ -src/store/ai-context.tsx:722:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -722 (e) => { -   ~ -src/store/ai-context.tsx:764:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -764 (e) => { -   ~ -src/store/ai-context.tsx:793:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -793 (e) => { -   ~ -src/store/ai-context.tsx:822:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -822 (e) => { -   ~ -src/store/ai-context.tsx:868:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -868 (e) => { -   ~ -src/store/ai-context.tsx:904:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -904 (e) => { -   ~ -src/store/ai-context.tsx:943:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -943 (e) => { -   ~ -src/store/ai-context.tsx:973:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -973 (e) => { -   ~ -src/store/ai-context.tsx:987:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -987 (e) => { -   ~ -src/store/ai-context.tsx:1040:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1040 (e) => { -   ~ -src/store/ai-context.tsx:1080:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1080 (e) => { -   ~ -src/store/ai-context.tsx:1114:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1114 (e) => { -   ~ -src/store/ai-context.tsx:1145:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1145 (e) => { -   ~ -src/store/ai-context.tsx:1160:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1160 (e) => { -   ~ -src/store/ai-context.tsx:1176:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1176 (e) => { -   ~ -src/store/ai-context.tsx:1191:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1191 (e) => { -   ~ - -Please fix the above type errors - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/12311986898317374245 b/.nx/cache/terminalOutputs/12311986898317374245 deleted file mode 100644 index 1b2b844a1..000000000 --- a/.nx/cache/terminalOutputs/12311986898317374245 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-gemini@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-gemini -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 6ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/13891177766533542103 b/.nx/cache/terminalOutputs/13891177766533542103 deleted file mode 100644 index 8ab87333b..000000000 --- a/.nx/cache/terminalOutputs/13891177766533542103 +++ /dev/null @@ -1,49 +0,0 @@ - -> @tanstack/ai-client@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-client -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -src/chat-client.ts:1:35 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -1 import type { ModelMessage } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/chat-client.ts:353:48 - error TS2550: Property 'findLastIndex' does not exist on type 'UIMessage[]'. Do you need to change your target library? Try changing the 'lib' compiler option to 'es2023' or later. - -353 const lastUserMessageIndex = this.messages.findLastIndex( -   ~~~~~~~~~~~~~ -src/chat-client.ts:513:41 - error TS2550: Property 'findLast' does not exist on type 'UIMessage[]'. Do you need to change your target library? Try changing the 'lib' compiler option to 'es2023' or later. - -513 const lastAssistant = this.messages.findLast( -   ~~~~~~~~ -src/chat-client.ts:520:8 - error TS7006: Parameter 'p' implicitly has an 'any' type. - -520 (p): p is ToolCallPart => p.type === "tool-call" -   ~ -src/chat-client.ts:527:8 - error TS7006: Parameter 'part' implicitly has an 'any' type. - -527 (part) => -   ~~~~ -src/connection-adapters.ts:1:48 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -1 import type { StreamChunk, ModelMessage } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/events.ts:1:31 - error TS2307: Cannot find module '@tanstack/ai/event-client' or its corresponding type declarations. - -1 import { aiEventClient } from "@tanstack/ai/event-client"; -   ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src/message-converters.ts:1:35 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -1 import type { ModelMessage } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/message-updaters.ts:3:3 - error TS6196: 'MessagePart' is declared but never used. - -3 MessagePart, -   ~~~~~~~~~~~ -src/types.ts:1:48 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -1 import type { ModelMessage, StreamChunk } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ - -Please fix the above type errors - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/15134291999248278184 b/.nx/cache/terminalOutputs/15134291999248278184 deleted file mode 100644 index 1f13f503f..000000000 --- a/.nx/cache/terminalOutputs/15134291999248278184 +++ /dev/null @@ -1,41 +0,0 @@ - -> @tanstack/ai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -transforming... -✓ 12 modules transformed. -rendering chunks... - -[vite:dts] Start generate declaration files... - -[vite:dts] Start generate declaration files... -computing gzip size... -dist/esm/tools/tool-utils.js  0.10 kB │ gzip: 0.11 kB │ map: 3.03 kB -dist/esm/utilities/chat-options.js  0.12 kB │ gzip: 0.11 kB │ map: 0.97 kB -dist/esm/core/summarize.js  0.22 kB │ gzip: 0.16 kB │ map: 0.89 kB -dist/esm/core/embedding.js  0.23 kB │ gzip: 0.17 kB │ map: 0.86 kB -dist/esm/base-adapter.js  0.25 kB │ gzip: 0.20 kB │ map: 2.58 kB -dist/esm/utilities/agent-loop-strategies.js  0.58 kB │ gzip: 0.27 kB │ map: 2.77 kB -dist/esm/index.js  0.86 kB │ gzip: 0.35 kB │ map: 0.10 kB -dist/esm/utilities/stream-to-response.js  1.55 kB │ gzip: 0.58 kB │ map: 4.87 kB -dist/esm/event-client.js  1.94 kB │ gzip: 0.70 kB │ map: 11.71 kB -dist/esm/tools/tool-calls.js  6.80 kB │ gzip: 1.59 kB │ map: 15.82 kB -dist/esm/core/chat.js 15.59 kB │ gzip: 3.11 kB │ map: 31.91 kB -[vite:dts] Declaration files built in 937ms. - -[vite:dts] Declaration files built in 363ms. - -dist/cjs/tools/tool-utils.cjs  0.19 kB │ gzip: 0.17 kB │ map: 3.04 kB -dist/cjs/utilities/chat-options.cjs  0.22 kB │ gzip: 0.18 kB │ map: 0.98 kB -dist/cjs/core/summarize.cjs  0.31 kB │ gzip: 0.22 kB │ map: 0.89 kB -dist/cjs/core/embedding.cjs  0.32 kB │ gzip: 0.23 kB │ map: 0.86 kB -dist/cjs/base-adapter.cjs  0.35 kB │ gzip: 0.26 kB │ map: 2.58 kB -dist/cjs/utilities/agent-loop-strategies.cjs  0.73 kB │ gzip: 0.34 kB │ map: 2.78 kB -dist/cjs/index.cjs  1.35 kB │ gzip: 0.47 kB │ map: 0.12 kB -dist/cjs/utilities/stream-to-response.cjs  1.69 kB │ gzip: 0.64 kB │ map: 4.88 kB -dist/cjs/event-client.cjs  2.09 kB │ gzip: 0.76 kB │ map: 11.74 kB -dist/cjs/tools/tool-calls.cjs  6.93 kB │ gzip: 1.65 kB │ map: 15.83 kB -dist/cjs/core/chat.cjs 15.94 kB │ gzip: 3.19 kB │ map: 32.14 kB -✓ built in 1.06s diff --git a/.nx/cache/terminalOutputs/15289852906145915523 b/.nx/cache/terminalOutputs/15289852906145915523 deleted file mode 100644 index 89f055242..000000000 --- a/.nx/cache/terminalOutputs/15289852906145915523 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-anthropic@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-anthropic -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 7ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/16048335657332254327 b/.nx/cache/terminalOutputs/16048335657332254327 deleted file mode 100644 index 8ec2ec72a..000000000 --- a/.nx/cache/terminalOutputs/16048335657332254327 +++ /dev/null @@ -1,41 +0,0 @@ - -> @tanstack/ai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -transforming... -✓ 12 modules transformed. -rendering chunks... - -[vite:dts] Start generate declaration files... - -[vite:dts] Start generate declaration files... -computing gzip size... -dist/esm/tools/tool-utils.js  0.10 kB │ gzip: 0.11 kB │ map: 3.03 kB -dist/esm/utilities/chat-options.js  0.12 kB │ gzip: 0.11 kB │ map: 0.97 kB -dist/esm/core/summarize.js  0.22 kB │ gzip: 0.16 kB │ map: 0.89 kB -dist/esm/core/embedding.js  0.23 kB │ gzip: 0.17 kB │ map: 0.86 kB -dist/esm/base-adapter.js  0.25 kB │ gzip: 0.20 kB │ map: 2.58 kB -dist/esm/utilities/agent-loop-strategies.js  0.58 kB │ gzip: 0.27 kB │ map: 2.77 kB -dist/esm/index.js  0.86 kB │ gzip: 0.35 kB │ map: 0.10 kB -dist/esm/utilities/stream-to-response.js  1.55 kB │ gzip: 0.58 kB │ map: 4.87 kB -dist/esm/event-client.js  1.94 kB │ gzip: 0.70 kB │ map: 11.71 kB -dist/esm/tools/tool-calls.js  6.80 kB │ gzip: 1.59 kB │ map: 15.82 kB -dist/esm/core/chat.js 15.59 kB │ gzip: 3.11 kB │ map: 31.91 kB -[vite:dts] Declaration files built in 970ms. - -[vite:dts] Declaration files built in 383ms. - -dist/cjs/tools/tool-utils.cjs  0.19 kB │ gzip: 0.17 kB │ map: 3.04 kB -dist/cjs/utilities/chat-options.cjs  0.22 kB │ gzip: 0.18 kB │ map: 0.98 kB -dist/cjs/core/summarize.cjs  0.31 kB │ gzip: 0.22 kB │ map: 0.89 kB -dist/cjs/core/embedding.cjs  0.32 kB │ gzip: 0.23 kB │ map: 0.86 kB -dist/cjs/base-adapter.cjs  0.35 kB │ gzip: 0.26 kB │ map: 2.58 kB -dist/cjs/utilities/agent-loop-strategies.cjs  0.73 kB │ gzip: 0.34 kB │ map: 2.78 kB -dist/cjs/index.cjs  1.35 kB │ gzip: 0.47 kB │ map: 0.12 kB -dist/cjs/utilities/stream-to-response.cjs  1.69 kB │ gzip: 0.64 kB │ map: 4.88 kB -dist/cjs/event-client.cjs  2.09 kB │ gzip: 0.76 kB │ map: 11.74 kB -dist/cjs/tools/tool-calls.cjs  6.93 kB │ gzip: 1.65 kB │ map: 15.83 kB -dist/cjs/core/chat.cjs 15.94 kB │ gzip: 3.19 kB │ map: 32.14 kB -✓ built in 1.09s diff --git a/.nx/cache/terminalOutputs/16380270685398234527 b/.nx/cache/terminalOutputs/16380270685398234527 deleted file mode 100644 index 69d804507..000000000 --- a/.nx/cache/terminalOutputs/16380270685398234527 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-fallback@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-fallback -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 6ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/2686292967587754244 b/.nx/cache/terminalOutputs/2686292967587754244 deleted file mode 100644 index fbf0de9a3..000000000 --- a/.nx/cache/terminalOutputs/2686292967587754244 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 5ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/3505369680714718251 b/.nx/cache/terminalOutputs/3505369680714718251 deleted file mode 100644 index 4dca9b831..000000000 --- a/.nx/cache/terminalOutputs/3505369680714718251 +++ /dev/null @@ -1,57 +0,0 @@ - -> @tanstack/ai-anthropic@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-anthropic -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -src/anthropic-adapter.ts:12:8 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -12 } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/anthropic-adapter.ts:91:14 - error TS2339: Property 'generateId' does not exist on type 'Anthropic'. - -91 this.generateId() -   ~~~~~~~~~~ -src/anthropic-adapter.ts:107:18 - error TS2339: Property 'generateId' does not exist on type 'Anthropic'. - -107 id: this.generateId(), -   ~~~~~~~~~~ -src/tools/bash-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -2 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/tools/code-execution-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -2 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/tools/computer-use-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -2 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/tools/custom-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -2 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/tools/memory-tool.ts:2:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -2 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/tools/text-editor-tool.ts:3:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -3 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/tools/tool-converter.ts:1:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -1 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/tools/web-fetch-tool.ts:3:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -3 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ -src/tools/web-search-tool.ts:3:27 - error TS2307: Cannot find module '@tanstack/ai' or its corresponding type declarations. - -3 import type { Tool } from "@tanstack/ai"; -   ~~~~~~~~~~~~~~ - -Please fix the above type errors - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/3741776693305569249 b/.nx/cache/terminalOutputs/3741776693305569249 deleted file mode 100644 index ce57c990d..000000000 --- a/.nx/cache/terminalOutputs/3741776693305569249 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-ollama@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-ollama -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 6ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/5434208491390619494 b/.nx/cache/terminalOutputs/5434208491390619494 deleted file mode 100644 index 69d804507..000000000 --- a/.nx/cache/terminalOutputs/5434208491390619494 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-fallback@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-fallback -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 6ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/5934932795746721533 b/.nx/cache/terminalOutputs/5934932795746721533 deleted file mode 100644 index f3442aad8..000000000 --- a/.nx/cache/terminalOutputs/5934932795746721533 +++ /dev/null @@ -1,129 +0,0 @@ - -> @tanstack/ai-devtools-core@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-devtools -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -src/store/ai-context.tsx:3:31 - error TS2307: Cannot find module '@tanstack/ai/event-client' or its corresponding type declarations. - -3 import { aiEventClient } from "@tanstack/ai/event-client"; -   ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -src/store/ai-context.tsx:430:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -430 (e) => { -   ~ -src/store/ai-context.tsx:442:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -442 (e) => { -   ~ -src/store/ai-context.tsx:462:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -462 (e) => { -   ~ -src/store/ai-context.tsx:485:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -485 (e) => { -   ~ -src/store/ai-context.tsx:498:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -498 (e) => { -   ~ -src/store/ai-context.tsx:511:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -511 (e) => { -   ~ -src/store/ai-context.tsx:524:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -524 (e) => { -   ~ -src/store/ai-context.tsx:541:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -541 (e) => { -   ~ -src/store/ai-context.tsx:554:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -554 (e) => { -   ~ -src/store/ai-context.tsx:584:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -584 (e) => { -   ~ -src/store/ai-context.tsx:634:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -634 (e) => { -   ~ -src/store/ai-context.tsx:664:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -664 (e) => { -   ~ -src/store/ai-context.tsx:692:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -692 (e) => { -   ~ -src/store/ai-context.tsx:722:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -722 (e) => { -   ~ -src/store/ai-context.tsx:764:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -764 (e) => { -   ~ -src/store/ai-context.tsx:793:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -793 (e) => { -   ~ -src/store/ai-context.tsx:822:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -822 (e) => { -   ~ -src/store/ai-context.tsx:868:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -868 (e) => { -   ~ -src/store/ai-context.tsx:904:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -904 (e) => { -   ~ -src/store/ai-context.tsx:943:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -943 (e) => { -   ~ -src/store/ai-context.tsx:973:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -973 (e) => { -   ~ -src/store/ai-context.tsx:987:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -987 (e) => { -   ~ -src/store/ai-context.tsx:1040:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1040 (e) => { -   ~ -src/store/ai-context.tsx:1080:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1080 (e) => { -   ~ -src/store/ai-context.tsx:1114:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1114 (e) => { -   ~ -src/store/ai-context.tsx:1145:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1145 (e) => { -   ~ -src/store/ai-context.tsx:1160:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1160 (e) => { -   ~ -src/store/ai-context.tsx:1176:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1176 (e) => { -   ~ -src/store/ai-context.tsx:1191:10 - error TS7006: Parameter 'e' implicitly has an 'any' type. - -1191 (e) => { -   ~ - -Please fix the above type errors - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/6767593282717562448 b/.nx/cache/terminalOutputs/6767593282717562448 deleted file mode 100644 index dd1ef646e..000000000 --- a/.nx/cache/terminalOutputs/6767593282717562448 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-openai@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-openai -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 6ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/cache/terminalOutputs/6900745953598375882 b/.nx/cache/terminalOutputs/6900745953598375882 deleted file mode 100644 index c18520014..000000000 --- a/.nx/cache/terminalOutputs/6900745953598375882 +++ /dev/null @@ -1,15 +0,0 @@ - -> @tanstack/ai-client@0.1.0 build /Users/kevinvancott/Documents/tanstack/ai/packages/typescript/ai-client -> vite build - -You are using Node.js 20.18.1. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version. -vite v7.2.4 building client environment for production... -✓ 0 modules transformed. -✗ Build failed in 6ms -error during build: -Could not resolve entry module "index.html". - at getRollupError (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:401:41) - at error (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/parseAst.js:397:42) - at ModuleLoader.loadEntryModule (file:///Users/kevinvancott/Documents/tanstack/ai/node_modules/.pnpm/rollup@4.53.3/node_modules/rollup/dist/es/shared/node-entry.js:21611:20) - at async Promise.all (index 0) - ELIFECYCLE  Command failed with exit code 1. diff --git a/.nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db b/.nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db deleted file mode 100644 index 7ee7c113a09428e4daafacb6e70a35d18573e608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|@t|AVoG{WYDWB;00+HAlr;ljiVtj n8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O6ovo*4{!$i diff --git a/.nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db-shm b/.nx/workspace-data/A0C6373D-4A79-501D-A64C-0B2F2C38049E.db-shm deleted file mode 100644 index 85432392fcaf73bb8fd861fd92e37d4bb2cac9c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)J1&Jm6bJBgJ+8;~xZcw z)EQpt$^|B4Db}OBMXd-<`*zXV9v8{l>G9W+*2kK_j<8G18obEt( z!jOs6xEQyoo5bTZah>TD<2aexjoUcwU_708?ADAkw2kYub!%rjb}{WhlYtIyI&PZ` zecs(WX;-^|W2gh@za#11+kKz+Ju8!SOH1gEY?kV_(07E{ zG!ACp+I&Kfc6+YpLB*C(&u4a|`S(LD{IU?gjDIz#63&4D2!H?xfB*=900@8p2!H?x zfWRe2;DM{d@yxt=;Ro)o=eL%vF{_?0=Ii<9W6ScvzTTm}>`?C~*YstZXR}M%v(t|4 z)}HK8-{zt0z&iTgv}R3q{b2vv-oY)|)qPuT@>SoJFHcxr15cgqWi7GH@_FGNq@m(zc=@1bH9J&#WbA@^FI#J7Y+~r z0T2KI5C8!X009sH0T2KI5CDP8pTJe&$bxGJHV@z3H@LBX-GC(Zh&>Wbi}?s5%{YSF zmKu*Nl#jjMPA9|s=@5P4009sH0T2KI5C8!X009sH0T2KI5V&Fpq$3LwQ{DlZmS-Qq zXNxZ_>MuUdpJyLI)P;k^8+_<}1g+^a_CA928ScMaZK4PQAOHd&00JNY0w4eaAOHd& z@X-)>pdN{5y1K%9m)ddh^?YsnaFK%JOXZro-0F#scV7vJksr<1Mp@Xr9VhP!kDrX0 z_s7Za7_Z)I73vL}W^BE`UOhiPVx7NQp<3Bi8krc+*Gtuk)2KJ>UT=+MR(G8(?A|@U zVbT38dL`~7u>YrT#tUqC>fM7^9kXs``v@A61Ru>xL@yu!0w4eaAOHd&00JNY0w4ea zAOHft3rd!KuedyrelU7tRYK1dgEfB*=900@8p z2!H?xfB*=900>-c0^O;o+?5GQnxRRiWNNx<=(?&%igHIiU!l1E!uDnP(${Fb;*zoLzP6qV=`iml`77_#j3c4Zd3KhJ)Y|EF+TWLae zKSn$%FVBQzLo;MiRRx)*Vw#eqy1J=V%cWv2U&bPb1xvVuRian}RT6Yv)Kr~r zmQFWK^DKs3pmb-NoS992z*UNc2mF+}<)oAgLLJp;>E>Z9Y;9i@V8MT^)IFOZ78 zu;TSO+2t%=AjQ2E;$Pzz@k#y@+-d$e{}A^Ue>cCMukg=b?8T4vKmY_l00ck)1V8`; zKmY_l00cnb;u6S2G!$A&}q;tXVHfgsn1UN?$j)mU^(#HA@aC5}j`2Z(I z%x);aMG<8N0Un4}c0Rz-5V0Eya3-{5B5ESYWkAe5x`U?|f9FTJSN7d_9^Ju&>s~Rx z!iUx!Y)kH%)E!LSo9av+p%XYj00ck)1V8`;KmY_lU`7xaY>Q0Td;WtJ`tZ?Wa*8VS*B*3Jp5Qn02yjeA7trd?c8q2%s2k!APZ*-=~K zZr{k1#9d>q?)k(#t+}rRNZgf*+5Ul{zEypL?)>lB-c3X6`Uj|?wS5CqDdPPycD6#E zCyl(njzia*JKkTbP%T=MLpi%{9yK;z&kpsk?b|riyLSCKl=!Sl@dMRcxo)tpf7Jj> zd!Jom-?{8y-^#whzJcX^8=ZyH&=G80_6qPpcaUCxJIkfIHJqQQSMAr%u)XLS)MkM0 zV2r)xHuVMm;r9=`AkP2d9_S9vh+jmQBnW^22!H?xfB*=900@8p2!H?x#2JF7U*N9X zf5!{2y>|?L0W1s<009sH0T2KI5C8!X009sH0T7rG1lrgvn|^^GZhG&`k$*k*@5o0m zBknyW2?8Jh0w4eaAOHd&00JNY0w4eaOe-MK^a~iL-dMc5@-go?w@4gz{@Z@=P2a_%`OrPLG>khUj_W5)N6Z?|4xY|b% z1V8`;KmY_l00d?ZfxU7fo>{y&{7{!I$yUf0My=uMM199Zz2 ztI?yauC{)#e{JvJ7F(q3?BZz5%+^uMegGvkR=HOCj71Mk1-SFHO!>I#R&hA*)?ZuE zx3YKBnxX9SO@pMEHZ(k`%;r~kV;$xTBz{-Bz(y`iu`QeJHrr#FwTr_cM?7%4c$w$s z42zzpN$3t*Zbd!3m00ck)1V8`;KmY_l z00d?<0ruH{vgsH2l?^Zd$M=44=oaiFn9*wjlLrA1009sH0T2KI5C8!X009t~IRrfW z2#Wo$?CU&v_`&n+Be25>8i-gvgAcurAk{V$xR0Q1C~?=!xdoUh2!H?xfB*)p6n9mTKAfGEHkewY}wly*!Gd>Ew*`DY}W9%$F6j*kHs=emxj04 z8(SI~-fPy*39CX|IGjBb&8KnCt9aVQC6)Y`brV(X-a9)Q&vbQ#_l?+Xy65UHV;=$b z5v-%P;Z4{_U@rvw$F6*N!t(xp^8WH!))LDspLe#65o5G#r1qTR#00@8p2!H?xfB*=900@8p2wd?5m> zMcI}wl_$on@Ynxh{+IT#pO1cyrp5FDCjA1RHanl{N&d-K9KXP+5P#}&nK;G?0w4ea zAOHd&00JNY0w4eaAOHd&a2^7DIMS7H%Xv_JTW6rTk0AT)!*^~x_@i&IeFS0tM2Nm{ zfB*=900@8p2!H?xfB*=900@8p2wd(2u8GKrfDi(jR)W4K^#%5?`n$3H@zJ@CU*M-9 z{->Aw#4&yl009sH0T2KI5C8!X009sH0T2KI4}tc`+(ctf0iCyV3^wBhR()stZy*2M z?a#7(1f9t_A^r&e7+>He?tSh>?m=!HcYXRq`e6Fu^rrN})XCKMQhQT(rqaoON`5n0 zOWr{SI6wddKmY_l00ck)1VG>lA#h`7RPD-yL`_f(SynYwmt{#(6 zS-!M&qEs%5nW!pLUBNJEFRyB9ib9{tNros2?z*|^4y)2I5w3~KWFqT|sOy?$%CexU znkgx!*P>j`kL8_Cu68<+WKlE?%`gpF)X82_RFBDsHCC!PK-cDJ^H%sW&>O_2myGYO}t=^~r#)F^3c&Oj#| zlmchpFU=GLT~P^#O8jZlwjp_J3gwbjsoUKs>8NVbj8vj$sFEpYA{nx7WRFR{QXd_! z?kE*(tL{`(rezoKp|0D=t|}&-1);07b6l5Iwk&j7dZOZ@P4jTAIKbb9?# z+0fjyCl|SE(Y4x(P9YG)T&7X#hNNhw?!C8Di%yC}WqK(Zf}m*<-7sC%G?|b{uIWu* zb7D*56|YJHy$&ZhbULe73q3m4~hVplEh#1PLU+>7oGTY zPg}EoKyZtz{?TVy{bSGN;tj?90B480`X4#fdt%Mz1H1>W`p$5UKGPFz)(`NR1l4bC z)(>#X1k}$(8p99pa`>x1-P6LFZzGxk;Y+oNLcyxl*hJrWnEia`o(s%J@a3gn->^mu zJ?i8mI2qzkp6gcQ8VG;@2!H?xfB*=900@8p2!H?xfWYNLU>2n#2-owq?Zcy`TD>~H zhiMLa@)6v>-_=O?bAFz;rh#%wsmcNxh!EfRZT|TqLNI?JuKmY_l z00ck)1V8`;KmY_l;35!kV)OlbA)IXl0Wl8FHUhtVNZf8IAZo$cM-UL65Vb7=;t=eO z1OWjD&PIZO$byy+n2+GS`|iEHerF;bZKhs`0Zz8A})XE87b0+c;ARj@wC?g+%ldQy* z1mm*GN1z{mV)Zw)L!&HSU{UIKLX?T{4R=n0^ykxYo-PDsCP+W-h@s;#w z+DLtqWhqE!FZ9m<*n)Xe@BdHS zSH1I858sra4+vfH*MB?5HAmx*7;;sga~m7YHQRgA&E^BbnB4VmZPZUq*7v(YT=kvV z&bcL*Y%1dWeJugid)k|d_yI9nQ;PVxgvy4~@k8VzP!vj#C>f$COyO*#UpV^ArJax9 zi6h_2R9tzUgF+#auRS~=G&Wj3Ap?CP23-H!`x})C%BON0b39N0T2KI5C8!X z009sH0T8(237loSMaNloNz6LiwhG?ahvCy_;cSC|u!^*E!5=@7Vl4%1N=e!V0TB`H z_62E%HH-;@00@8p2!H?x xfB*=900@8p2!Mc>fJ^7U!&RQ;D)X)~=PIXN<&>+OWaY-DjCR-g|L=SR{|E3fafJW? diff --git a/.nx/workspace-data/d/server-process.json b/.nx/workspace-data/d/server-process.json deleted file mode 100644 index 8ff2ed6c9..000000000 --- a/.nx/workspace-data/d/server-process.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "processId": 64114, - "socketPath": "/private/var/folders/nr/plzz2tfs15lb437g_jckt51c0000gn/T/e9cca2e0653d03945493/d.sock", - "nxVersion": "22.1.2" -} diff --git a/.nx/workspace-data/file-map.json b/.nx/workspace-data/file-map.json deleted file mode 100644 index e8aeac66e..000000000 --- a/.nx/workspace-data/file-map.json +++ /dev/null @@ -1,1634 +0,0 @@ -{ - "version": "6.0", - "nxVersion": "22.1.2", - "pathMappings": {}, - "nxJsonPlugins": [], - "fileMap": { - "nonProjectFiles": [], - "projectFileMap": { - "@tanstack/react-ai-devtools": [ - { - "file": "packages/typescript/react-ai-devtools/package.json", - "hash": "5015851932444334730", - "deps": [ - "npm:react", - "npm:@types/react", - "npm:@tanstack/devtools-utils", - "@tanstack/ai-devtools-core" - ] - }, - { - "file": "packages/typescript/react-ai-devtools/src/AiDevtools.tsx", - "hash": "17643008749647550551" - }, - { - "file": "packages/typescript/react-ai-devtools/src/index.ts", - "hash": "690820935095618943" - }, - { - "file": "packages/typescript/react-ai-devtools/src/plugin.tsx", - "hash": "1797088302951387346" - }, - { - "file": "packages/typescript/react-ai-devtools/src/production.ts", - "hash": "10817458403881338401" - }, - { - "file": "packages/typescript/react-ai-devtools/tsconfig.json", - "hash": "1306631043222942463" - }, - { - "file": "packages/typescript/react-ai-devtools/tsdown.config.ts", - "hash": "15766826510434865934" - }, - { - "file": "packages/typescript/react-ai-devtools/vitest.config.ts", - "hash": "16166077380570933860" - } - ], - "vanilla-chat": [ - { - "file": "examples/vanilla-chat/README.md", - "hash": "9282960027394310212" - }, - { - "file": "examples/vanilla-chat/index.html", - "hash": "3209670018771939917" - }, - { - "file": "examples/vanilla-chat/package.json", - "hash": "13621716808609472163", - "deps": [ - "npm:vite", - "@tanstack/ai-client" - ] - }, - { - "file": "examples/vanilla-chat/src/main.js", - "hash": "1065820847750448268" - }, - { - "file": "examples/vanilla-chat/src/style.css", - "hash": "14790050755339330948" - }, - { - "file": "examples/vanilla-chat/vite.config.ts", - "hash": "6591996030399873107" - } - ], - "@tanstack/ai": [ - { - "file": "packages/typescript/ai/eslint.config.js", - "hash": "7781284990019102288" - }, - { - "file": "packages/typescript/ai/package.json", - "hash": "10739163436894203899", - "deps": [ - "npm:@tanstack/devtools-event-client" - ] - }, - { - "file": "packages/typescript/ai/src/base-adapter.ts", - "hash": "13842223249309044261" - }, - { - "file": "packages/typescript/ai/src/core/chat-common-options.ts", - "hash": "13732596118621246713" - }, - { - "file": "packages/typescript/ai/src/core/chat.ts", - "hash": "12762273026036705103" - }, - { - "file": "packages/typescript/ai/src/core/embedding.ts", - "hash": "18109869585387630047" - }, - { - "file": "packages/typescript/ai/src/core/summarize.ts", - "hash": "8329969047525284909" - }, - { - "file": "packages/typescript/ai/src/event-client.ts", - "hash": "5947644555025204395" - }, - { - "file": "packages/typescript/ai/src/index.ts", - "hash": "5252227405372573747" - }, - { - "file": "packages/typescript/ai/src/tools/tool-calls.ts", - "hash": "294229199782255549" - }, - { - "file": "packages/typescript/ai/src/tools/tool-utils.ts", - "hash": "9677695668996805044" - }, - { - "file": "packages/typescript/ai/src/types.ts", - "hash": "1498944371269991886" - }, - { - "file": "packages/typescript/ai/src/utilities/agent-loop-strategies.ts", - "hash": "17859911512439261438" - }, - { - "file": "packages/typescript/ai/src/utilities/chat-options.ts", - "hash": "9438458523939521628" - }, - { - "file": "packages/typescript/ai/src/utilities/stream-to-response.ts", - "hash": "1030951040095494792" - }, - { - "file": "packages/typescript/ai/tests/agent-loop-strategies.test.ts", - "hash": "8175830577546117963" - }, - { - "file": "packages/typescript/ai/tests/ai-abort.test.ts", - "hash": "8957232303273549186" - }, - { - "file": "packages/typescript/ai/tests/ai-chat.test.ts", - "hash": "939114443809333927" - }, - { - "file": "packages/typescript/ai/tests/tool-call-manager.test.ts", - "hash": "10866637994353260616" - }, - { - "file": "packages/typescript/ai/tsconfig.docs.json", - "hash": "2740853684691565937" - }, - { - "file": "packages/typescript/ai/tsconfig.json", - "hash": "15143473186599245443" - }, - { - "file": "packages/typescript/ai/vite.config.ts", - "hash": "13571564677928348694" - } - ], - "@tanstack/ai-react-ui": [ - { - "file": "packages/typescript/ai-react-ui/README.md", - "hash": "7762262271587316281" - }, - { - "file": "packages/typescript/ai-react-ui/package.json", - "hash": "13894561176105700241", - "deps": [ - "@tanstack/ai-client", - "@tanstack/ai-react", - "npm:react", - "npm:react-dom", - "npm:@types/react", - "npm:highlight.js", - "npm:react-markdown", - "npm:rehype-highlight", - "npm:rehype-raw", - "npm:rehype-sanitize", - "npm:remark-gfm" - ] - }, - { - "file": "packages/typescript/ai-react-ui/src/chat-input.tsx", - "hash": "1312131526151862082" - }, - { - "file": "packages/typescript/ai-react-ui/src/chat-message.tsx", - "hash": "16334200844161387003" - }, - { - "file": "packages/typescript/ai-react-ui/src/chat-messages.tsx", - "hash": "15402841597094476201" - }, - { - "file": "packages/typescript/ai-react-ui/src/chat.tsx", - "hash": "10666081882078630987" - }, - { - "file": "packages/typescript/ai-react-ui/src/index.ts", - "hash": "15518305576287772683" - }, - { - "file": "packages/typescript/ai-react-ui/src/text-part.tsx", - "hash": "6246961682484374625" - }, - { - "file": "packages/typescript/ai-react-ui/src/thinking-part.tsx", - "hash": "7613963373764019353" - }, - { - "file": "packages/typescript/ai-react-ui/src/tool-approval.tsx", - "hash": "14768010954960151780" - }, - { - "file": "packages/typescript/ai-react-ui/tsconfig.json", - "hash": "2942896667779417629" - }, - { - "file": "packages/typescript/ai-react-ui/tsdown.config.ts", - "hash": "9791912542407287867" - } - ], - "@tanstack/ai-anthropic": [ - { - "file": "packages/typescript/ai-anthropic/eslint.config.js", - "hash": "7781284990019102288" - }, - { - "file": "packages/typescript/ai-anthropic/package.json", - "hash": "255041631379239819", - "deps": [ - "@tanstack/ai", - "npm:@anthropic-ai/sdk" - ] - }, - { - "file": "packages/typescript/ai-anthropic/src/anthropic-adapter.ts", - "hash": "8452625336753771146" - }, - { - "file": "packages/typescript/ai-anthropic/src/index.ts", - "hash": "4457152849778296411" - }, - { - "file": "packages/typescript/ai-anthropic/src/model-meta.ts", - "hash": "2973921560232992175" - }, - { - "file": "packages/typescript/ai-anthropic/src/text/text-provider-options.ts", - "hash": "9811312919833032040" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/bash-tool.ts", - "hash": "5635051266500890101" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts", - "hash": "4749996097298750598" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts", - "hash": "7363039983717111771" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/custom-tool.ts", - "hash": "15345835199061424144" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/index.ts", - "hash": "11852213418084872939" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/memory-tool.ts", - "hash": "14522848837255695837" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts", - "hash": "12200075178713181007" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/tool-converter.ts", - "hash": "15111552880358185635" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/web-fetch-tool.ts", - "hash": "4532834429160796109" - }, - { - "file": "packages/typescript/ai-anthropic/src/tools/web-search-tool.ts", - "hash": "4969863907768659443" - }, - { - "file": "packages/typescript/ai-anthropic/tests/anthropic-adapter.test.ts", - "hash": "6294716220417392970" - }, - { - "file": "packages/typescript/ai-anthropic/tests/model-meta.test.ts", - "hash": "7328118497274933719" - }, - { - "file": "packages/typescript/ai-anthropic/tsconfig.json", - "hash": "15143473186599245443" - }, - { - "file": "packages/typescript/ai-anthropic/vite.config.ts", - "hash": "13571564677928348694" - } - ], - "@tanstack/ai-openai": [ - { - "file": "packages/typescript/ai-openai/live-tests/example-guitars.ts", - "hash": "1493943760047990028" - }, - { - "file": "packages/typescript/ai-openai/live-tests/test-tool-arguments.ts", - "hash": "12342243970170325003" - }, - { - "file": "packages/typescript/ai-openai/package.json", - "hash": "7764975492596503120", - "deps": [ - "@tanstack/ai", - "npm:zod@4.1.13", - "npm:openai" - ] - }, - { - "file": "packages/typescript/ai-openai/src/audio/audio-provider-options.ts", - "hash": "10818012445548783744" - }, - { - "file": "packages/typescript/ai-openai/src/audio/transcribe-provider-options.ts", - "hash": "910546854844516167" - }, - { - "file": "packages/typescript/ai-openai/src/image/image-provider-options.ts", - "hash": "9316185050507450776" - }, - { - "file": "packages/typescript/ai-openai/src/index.ts", - "hash": "335888904215592625" - }, - { - "file": "packages/typescript/ai-openai/src/model-meta.ts", - "hash": "11671332892395364932" - }, - { - "file": "packages/typescript/ai-openai/src/openai-adapter.test.ts", - "hash": "3244421341483603138" - }, - { - "file": "packages/typescript/ai-openai/src/openai-adapter.ts", - "hash": "13786492348929263638" - }, - { - "file": "packages/typescript/ai-openai/src/text/text-provider-options.ts", - "hash": "13626697959231180124" - }, - { - "file": "packages/typescript/ai-openai/src/tools/apply-patch-tool.ts", - "hash": "5282601921021569029" - }, - { - "file": "packages/typescript/ai-openai/src/tools/code-interpreter-tool.ts", - "hash": "3392726200035777548" - }, - { - "file": "packages/typescript/ai-openai/src/tools/computer-use-tool.ts", - "hash": "13114041725619852690" - }, - { - "file": "packages/typescript/ai-openai/src/tools/custom-tool.ts", - "hash": "5378563049750912791" - }, - { - "file": "packages/typescript/ai-openai/src/tools/file-search-tool.ts", - "hash": "11462259817792926669" - }, - { - "file": "packages/typescript/ai-openai/src/tools/function-tool.ts", - "hash": "15011563170559954290" - }, - { - "file": "packages/typescript/ai-openai/src/tools/image-generation-tool.ts", - "hash": "2908656132541537390" - }, - { - "file": "packages/typescript/ai-openai/src/tools/index.ts", - "hash": "596820970272461274" - }, - { - "file": "packages/typescript/ai-openai/src/tools/local-shell-tool.ts", - "hash": "1051724757058026172" - }, - { - "file": "packages/typescript/ai-openai/src/tools/mcp-tool.ts", - "hash": "6641889725054347333" - }, - { - "file": "packages/typescript/ai-openai/src/tools/shell-tool.ts", - "hash": "3107394209009363292" - }, - { - "file": "packages/typescript/ai-openai/src/tools/tool-choice.ts", - "hash": "17054044197549173919" - }, - { - "file": "packages/typescript/ai-openai/src/tools/tool-converter.ts", - "hash": "634804831991671352" - }, - { - "file": "packages/typescript/ai-openai/src/tools/web-search-preview-tool.ts", - "hash": "10276043415596020796" - }, - { - "file": "packages/typescript/ai-openai/src/tools/web-search-tool.ts", - "hash": "9855407685045802773" - }, - { - "file": "packages/typescript/ai-openai/tests/model-meta.test.ts", - "hash": "4161644311984483570" - }, - { - "file": "packages/typescript/ai-openai/tests/openai-adapter.test.ts", - "hash": "2092197395591848867" - }, - { - "file": "packages/typescript/ai-openai/tsconfig.json", - "hash": "17487793864479620212" - }, - { - "file": "packages/typescript/ai-openai/tsdown.config.ts", - "hash": "13668403277050289523" - }, - { - "file": "packages/typescript/ai-openai/vitest.config.ts", - "hash": "14379467452428811752" - } - ], - "@tanstack/tests-adapters": [ - { - "file": "packages/typescript/tests-adapters/README.md", - "hash": "826524314342396419" - }, - { - "file": "packages/typescript/tests-adapters/env.example", - "hash": "4509017829091090490" - }, - { - "file": "packages/typescript/tests-adapters/package.json", - "hash": "3885918433353695660", - "deps": [ - "npm:@types/node", - "npm:dotenv@17.2.3", - "npm:tsx", - "npm:typescript", - "@tanstack/ai", - "@tanstack/ai-anthropic", - "@tanstack/ai-gemini", - "@tanstack/ai-ollama", - "@tanstack/ai-openai" - ] - }, - { - "file": "packages/typescript/tests-adapters/src/harness.ts", - "hash": "4035746237938299335" - }, - { - "file": "packages/typescript/tests-adapters/src/index.ts", - "hash": "11309426036128408512" - }, - { - "file": "packages/typescript/tests-adapters/tsconfig.json", - "hash": "8391116500506156774" - } - ], - "@tanstack/ai-ollama": [ - { - "file": "packages/typescript/ai-ollama/package.json", - "hash": "18202516038182883121", - "deps": [ - "@tanstack/ai", - "npm:ollama" - ] - }, - { - "file": "packages/typescript/ai-ollama/src/index.ts", - "hash": "9052190880257909266" - }, - { - "file": "packages/typescript/ai-ollama/src/ollama-adapter.ts", - "hash": "12042754145895646581" - }, - { - "file": "packages/typescript/ai-ollama/tsconfig.json", - "hash": "17487793864479620212" - }, - { - "file": "packages/typescript/ai-ollama/tsdown.config.ts", - "hash": "17860578175650129157" - } - ], - "root": [ - { - "file": ".changeset/config.json", - "hash": "1979795190074309818" - }, - { - "file": ".cursorignore", - "hash": "10338563896281470751" - }, - { - "file": ".github/FUNDING.yml", - "hash": "7147761140472713877" - }, - { - "file": ".github/ISSUE_TEMPLATE/bug_report.yml", - "hash": "11317197335965284772" - }, - { - "file": ".github/ISSUE_TEMPLATE/config.yml", - "hash": "10669642839954630116" - }, - { - "file": ".github/instructions/copilot-instructions.md", - "hash": "15770608591728561680" - }, - { - "file": ".github/workflows/autofix.yml", - "hash": "370305525201108569" - }, - { - "file": ".github/workflows/pr.yml", - "hash": "7322719433044986181" - }, - { - "file": ".github/workflows/release.yml", - "hash": "132751124063330986" - }, - { - "file": ".gitignore", - "hash": "8782263177283243594" - }, - { - "file": ".npmrc", - "hash": "8974250228043845607" - }, - { - "file": ".nvmrc", - "hash": "6593500695046679622" - }, - { - "file": ".prettierignore", - "hash": "5046726174050070668" - }, - { - "file": "CHANGELOG.md", - "hash": "13449318543508998288" - }, - { - "file": "CODE_OF_CONDUCT.md", - "hash": "3955647879993932925" - }, - { - "file": "LICENSE", - "hash": "5598561347454435878" - }, - { - "file": "README.md", - "hash": "16523691990671060021" - }, - { - "file": "ai-docs/AGENT_LOOP_STRATEGIES.md", - "hash": "16788710745196204407" - }, - { - "file": "ai-docs/CONNECTION_ADAPTERS_GUIDE.md", - "hash": "8600094686360457444" - }, - { - "file": "ai-docs/EVENT_CLIENT.md", - "hash": "11871789519419303513" - }, - { - "file": "ai-docs/EVENT_CLIENT_INTEGRATION.md", - "hash": "8112599375147974081" - }, - { - "file": "ai-docs/IMPLEMENTATION_SUMMARY.md", - "hash": "3969375475616031936" - }, - { - "file": "ai-docs/MIGRATION_UNIFIED_CHAT.md", - "hash": "10665420318505031653" - }, - { - "file": "ai-docs/TOOL_EXECUTION_LOOP.md", - "hash": "14065856400555761" - }, - { - "file": "ai-docs/TOOL_REGISTRY.md", - "hash": "2227881596927978911" - }, - { - "file": "ai-docs/TOOL_REGISTRY_IMPLEMENTATION.md", - "hash": "13645556165741441006" - }, - { - "file": "ai-docs/TOOL_REGISTRY_QUICK_START.md", - "hash": "15556890364568236303" - }, - { - "file": "ai-docs/TOOL_STATES_MIGRATION.md", - "hash": "7331657546383995199" - }, - { - "file": "ai-docs/TYPE_NARROWING_SOLUTION.md", - "hash": "5004707700951043696" - }, - { - "file": "ai-docs/TYPE_NARROWING_UNIFIED_CHAT.md", - "hash": "6376887632264014064" - }, - { - "file": "ai-docs/TYPE_SAFETY.md", - "hash": "12958538935603381694" - }, - { - "file": "ai-docs/UNIFIED_CHAT_API.md", - "hash": "12941557287753927406" - }, - { - "file": "ai-docs/UNIFIED_CHAT_IMPLEMENTATION.md", - "hash": "10176413661467073230" - }, - { - "file": "ai-docs/UNIFIED_CHAT_QUICK_REFERENCE.md", - "hash": "11439126419747039363" - }, - { - "file": "config.json", - "hash": "1979795190074309818" - }, - { - "file": "docs/adapters/anthropic.md", - "hash": "7129345997887719987" - }, - { - "file": "docs/adapters/gemini.md", - "hash": "540059042078142732" - }, - { - "file": "docs/adapters/ollama.md", - "hash": "3058607039178797574" - }, - { - "file": "docs/adapters/openai.md", - "hash": "15429933950232890800" - }, - { - "file": "docs/api/ai-client.md", - "hash": "2397914678360586517" - }, - { - "file": "docs/api/ai-react.md", - "hash": "2320953645316671287" - }, - { - "file": "docs/api/ai.md", - "hash": "1370750673706961555" - }, - { - "file": "docs/config.json", - "hash": "3543987359207085772" - }, - { - "file": "docs/getting-started/overview.md", - "hash": "15637309927992079791" - }, - { - "file": "docs/getting-started/quick-start.md", - "hash": "6694145494986083252" - }, - { - "file": "docs/guides/client-tools.md", - "hash": "14273519025856902502" - }, - { - "file": "docs/guides/connection-adapters.md", - "hash": "5245658969227204189" - }, - { - "file": "docs/guides/per-model-type-safety.md", - "hash": "3256030617826363071" - }, - { - "file": "docs/guides/server-tools.md", - "hash": "4809632627542721144" - }, - { - "file": "docs/guides/streaming.md", - "hash": "13013784700607286584" - }, - { - "file": "docs/guides/tool-approval.md", - "hash": "9066464042807483682" - }, - { - "file": "docs/guides/tools.md", - "hash": "16325322421985179421" - }, - { - "file": "docs/overview.md", - "hash": "16666925762002954668" - }, - { - "file": "docs/reference/protocol.md", - "hash": "8437841165773395669" - }, - { - "file": "eslint.config.js", - "hash": "10663859121837952639" - }, - { - "file": "examples/README.md", - "hash": "16748359222545040135" - }, - { - "file": "examples/package.json", - "hash": "11863219418170316689" - }, - { - "file": "examples/php-slim/.gitignore", - "hash": "3275384530925908016" - }, - { - "file": "examples/php-slim/README.md", - "hash": "10421311013957019558" - }, - { - "file": "examples/php-slim/composer.json", - "hash": "9613264207567594538" - }, - { - "file": "examples/php-slim/env.example", - "hash": "2131297201349357703" - }, - { - "file": "examples/php-slim/public/anthropic-server.php", - "hash": "6311121037195650420" - }, - { - "file": "examples/php-slim/public/index.php", - "hash": "2417837903883103534" - }, - { - "file": "examples/php-slim/public/openai-server.php", - "hash": "18173659856399553725" - }, - { - "file": "examples/python-fastapi/.gitignore", - "hash": "11531535563237820121" - }, - { - "file": "examples/python-fastapi/README.md", - "hash": "5085251051733439297" - }, - { - "file": "examples/python-fastapi/anthropic-server.py", - "hash": "10221115995696279382" - }, - { - "file": "examples/python-fastapi/env.example", - "hash": "14678751538489270367" - }, - { - "file": "examples/python-fastapi/openai-server.py", - "hash": "7741447488157475855" - }, - { - "file": "examples/python-fastapi/requirements.txt", - "hash": "3121617484010492675" - }, - { - "file": "knip.json", - "hash": "11637693389368211248" - }, - { - "file": "media/header_ai.png", - "hash": "16155595980942402433" - }, - { - "file": "media/partner_logo.svg", - "hash": "55685859315047251" - }, - { - "file": "nx.json", - "hash": "11819268650244387774" - }, - { - "file": "package.json", - "hash": "5827453522906564370", - "deps": [ - "npm:@changesets/cli", - "npm:@faker-js/faker", - "npm:@size-limit/preset-small-lib", - "npm:@svitejs/changesets-changelog-github-compact", - "npm:@tanstack/config", - "npm:@testing-library/jest-dom", - "npm:@types/node", - "npm:eslint", - "npm:eslint-plugin-unused-imports", - "npm:fast-glob", - "npm:happy-dom", - "npm:knip", - "npm:markdown-link-extractor", - "npm:nx", - "npm:premove", - "npm:prettier", - "npm:prettier-plugin-svelte", - "npm:publint", - "npm:sherif", - "npm:size-limit", - "npm:typescript", - "npm:vite", - "npm:vitest" - ] - }, - { - "file": "packages/php/tanstack-ai/.gitignore", - "hash": "15588699489279568883" - }, - { - "file": "packages/php/tanstack-ai/README.md", - "hash": "14854683634744827928" - }, - { - "file": "packages/php/tanstack-ai/composer.json", - "hash": "17598689768029783959" - }, - { - "file": "packages/php/tanstack-ai/example.php", - "hash": "14073889928254486253" - }, - { - "file": "packages/php/tanstack-ai/src/MessageFormatters.php", - "hash": "16119010945492383537" - }, - { - "file": "packages/php/tanstack-ai/src/SSEFormatter.php", - "hash": "9492084713636225998" - }, - { - "file": "packages/php/tanstack-ai/src/StreamChunkConverter.php", - "hash": "2495321638741191992" - }, - { - "file": "packages/python/tanstack-ai-python/src/tanstack_ai/__init__.py", - "hash": "4392043494746650704" - }, - { - "file": "packages/python/tanstack-ai-python/src/tanstack_ai/sse.py", - "hash": "3781166003489317394" - }, - { - "file": "packages/python/tanstack-ai/.gitignore", - "hash": "735431749966809933" - }, - { - "file": "packages/python/tanstack-ai/README.md", - "hash": "7496802787493610327" - }, - { - "file": "packages/python/tanstack-ai/pyproject.toml", - "hash": "6598604233429293988" - }, - { - "file": "packages/python/tanstack-ai/src/tanstack_ai/__init__.py", - "hash": "4392043494746650704" - }, - { - "file": "packages/python/tanstack-ai/src/tanstack_ai/converter.py", - "hash": "7339881801740414188" - }, - { - "file": "packages/python/tanstack-ai/src/tanstack_ai/message_formatters.py", - "hash": "17833046626683851183" - }, - { - "file": "packages/python/tanstack-ai/src/tanstack_ai/sse.py", - "hash": "3781166003489317394" - }, - { - "file": "pnpm-lock.yaml", - "hash": "227571855288972724" - }, - { - "file": "pnpm-workspace.yaml", - "hash": "2090281309662519133" - }, - { - "file": "prettier.config.js", - "hash": "2787958131156490758" - }, - { - "file": "scripts/check-missing-docs.sh", - "hash": "11439736034311242627" - }, - { - "file": "scripts/clean.sh", - "hash": "10230301901856519645" - }, - { - "file": "scripts/generateDocs.js", - "hash": "18321528774381021538" - }, - { - "file": "scripts/verify-links.ts", - "hash": "18258403061743395029" - }, - { - "file": "tsconfig.json", - "hash": "13311735335697620841" - }, - { - "file": "vitest.workspace.js", - "hash": "8308533316281028689" - } - ], - "@tanstack/ai-client": [ - { - "file": "packages/typescript/ai-client/ARCHITECTURE.md", - "hash": "1156419891256257170" - }, - { - "file": "packages/typescript/ai-client/README.md", - "hash": "5543195337634330446" - }, - { - "file": "packages/typescript/ai-client/eslint.config.js", - "hash": "7781284990019102288" - }, - { - "file": "packages/typescript/ai-client/package.json", - "hash": "12632833071421560934", - "deps": [ - "@tanstack/ai", - "npm:partial-json" - ] - }, - { - "file": "packages/typescript/ai-client/src/chat-client.ts", - "hash": "16167047103358159454" - }, - { - "file": "packages/typescript/ai-client/src/connection-adapters.ts", - "hash": "178778201273564075" - }, - { - "file": "packages/typescript/ai-client/src/events.ts", - "hash": "18016358239974477463" - }, - { - "file": "packages/typescript/ai-client/src/index.ts", - "hash": "7985168791015933538" - }, - { - "file": "packages/typescript/ai-client/src/loose-json-parser.ts", - "hash": "13253506103878445394" - }, - { - "file": "packages/typescript/ai-client/src/message-converters.ts", - "hash": "2511075561940546371" - }, - { - "file": "packages/typescript/ai-client/src/message-updaters.ts", - "hash": "18016414492299754786" - }, - { - "file": "packages/typescript/ai-client/src/stream/chunk-strategies.ts", - "hash": "2836835351429937060" - }, - { - "file": "packages/typescript/ai-client/src/stream/index.ts", - "hash": "1774238058981540450" - }, - { - "file": "packages/typescript/ai-client/src/stream/processor.ts", - "hash": "11144364974656194641" - }, - { - "file": "packages/typescript/ai-client/src/stream/types.ts", - "hash": "16593686214685650636" - }, - { - "file": "packages/typescript/ai-client/src/types.ts", - "hash": "16739993363026862954" - }, - { - "file": "packages/typescript/ai-client/tests/chat-client-abort.test.ts", - "hash": "15480987846955152030" - }, - { - "file": "packages/typescript/ai-client/tests/chat-client.test.ts", - "hash": "12693817585488672562" - }, - { - "file": "packages/typescript/ai-client/tests/connection-adapters-abort.test.ts", - "hash": "5366545113871363164" - }, - { - "file": "packages/typescript/ai-client/tests/connection-adapters.test.ts", - "hash": "7581613334078935759" - }, - { - "file": "packages/typescript/ai-client/tests/events.test.ts", - "hash": "10612527988580290080" - }, - { - "file": "packages/typescript/ai-client/tests/message-converters.test.ts", - "hash": "2431256036758945666" - }, - { - "file": "packages/typescript/ai-client/tests/message-updaters.test.ts", - "hash": "16542851151413230193" - }, - { - "file": "packages/typescript/ai-client/tests/stream-processor.test.ts", - "hash": "12032369673415444495" - }, - { - "file": "packages/typescript/ai-client/tests/stream/chunk-strategies.test.ts", - "hash": "12821827081381005259" - }, - { - "file": "packages/typescript/ai-client/tests/stream/processor.test.ts", - "hash": "4884899484554597541" - }, - { - "file": "packages/typescript/ai-client/tests/test-utils.ts", - "hash": "1914520340230290122" - }, - { - "file": "packages/typescript/ai-client/tsconfig.json", - "hash": "15143473186599245443" - }, - { - "file": "packages/typescript/ai-client/vite.config.ts", - "hash": "13571564677928348694" - } - ], - "@tanstack/ai-react": [ - { - "file": "packages/typescript/ai-react/README.md", - "hash": "7153120479544687075" - }, - { - "file": "packages/typescript/ai-react/package.json", - "hash": "8932078632468042145", - "deps": [ - "@tanstack/ai", - "@tanstack/ai-client", - "npm:react", - "npm:@eslint-react/eslint-plugin", - "npm:@testing-library/react", - "npm:@types/react", - "npm:@vitejs/plugin-react", - "npm:eslint-plugin-react-compiler", - "npm:eslint-plugin-react-hooks" - ] - }, - { - "file": "packages/typescript/ai-react/src/index.ts", - "hash": "15989044881223344136" - }, - { - "file": "packages/typescript/ai-react/src/types.ts", - "hash": "6386419347199255664" - }, - { - "file": "packages/typescript/ai-react/src/use-chat.ts", - "hash": "6854434043721794412" - }, - { - "file": "packages/typescript/ai-react/tests/test-utils.ts", - "hash": "7818138902521845568" - }, - { - "file": "packages/typescript/ai-react/tests/use-chat.test.ts", - "hash": "12578468655140039264" - }, - { - "file": "packages/typescript/ai-react/tsconfig.json", - "hash": "5405973005111661208" - }, - { - "file": "packages/typescript/ai-react/tsdown.config.ts", - "hash": "15858091543790361771" - }, - { - "file": "packages/typescript/ai-react/vitest.config.ts", - "hash": "8557672221221695996" - } - ], - "@tanstack/ai-devtools-core": [ - { - "file": "packages/typescript/ai-devtools/package.json", - "hash": "16807938235866892752", - "deps": [ - "npm:vite-plugin-solid", - "@tanstack/ai", - "npm:@tanstack/devtools-ui", - "npm:@tanstack/devtools-utils", - "npm:clsx", - "npm:goober", - "npm:solid-js" - ] - }, - { - "file": "packages/typescript/ai-devtools/src/components/ConversationDetails.tsx", - "hash": "12734242460332145705" - }, - { - "file": "packages/typescript/ai-devtools/src/components/ConversationsList.tsx", - "hash": "3302316628300575077" - }, - { - "file": "packages/typescript/ai-devtools/src/components/Shell.tsx", - "hash": "16027474093298434279" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/ChunkBadges.tsx", - "hash": "6521719718475907925" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/ChunkItem.tsx", - "hash": "15636051996732514371" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/ChunksCollapsible.tsx", - "hash": "7525547476706586118" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/ChunksTab.tsx", - "hash": "12075376337752252644" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/ConversationHeader.tsx", - "hash": "10988238669684967982" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/ConversationTabs.tsx", - "hash": "1542237355685355507" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/MessageCard.tsx", - "hash": "18042535898588816273" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/MessageGroup.tsx", - "hash": "8185853742723965863" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/MessagesTab.tsx", - "hash": "2508769078004343842" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/ToolCallDisplay.tsx", - "hash": "17831326395086798160" - }, - { - "file": "packages/typescript/ai-devtools/src/components/conversation/index.ts", - "hash": "2409654139849153307" - }, - { - "file": "packages/typescript/ai-devtools/src/components/list/ConversationRow.tsx", - "hash": "9225191833044278525" - }, - { - "file": "packages/typescript/ai-devtools/src/components/list/index.ts", - "hash": "6982889723429263661" - }, - { - "file": "packages/typescript/ai-devtools/src/components/utils/format.ts", - "hash": "9915902800726047345" - }, - { - "file": "packages/typescript/ai-devtools/src/components/utils/index.ts", - "hash": "14393207116636301480" - }, - { - "file": "packages/typescript/ai-devtools/src/core.tsx", - "hash": "1477975059824520481" - }, - { - "file": "packages/typescript/ai-devtools/src/index.ts", - "hash": "7474352075292438948" - }, - { - "file": "packages/typescript/ai-devtools/src/production.ts", - "hash": "10347483870229824551" - }, - { - "file": "packages/typescript/ai-devtools/src/store/ai-context.tsx", - "hash": "11691516537858892483" - }, - { - "file": "packages/typescript/ai-devtools/src/store/ai-store.ts", - "hash": "3120989652886489610" - }, - { - "file": "packages/typescript/ai-devtools/src/styles/tokens.ts", - "hash": "10856849725541711873" - }, - { - "file": "packages/typescript/ai-devtools/src/styles/use-styles.ts", - "hash": "17476975403922516340" - }, - { - "file": "packages/typescript/ai-devtools/tsconfig.json", - "hash": "2560743061830725618" - }, - { - "file": "packages/typescript/ai-devtools/vite.config.ts", - "hash": "13228817740114069865" - }, - { - "file": "packages/typescript/ai-devtools/vitest.config.ts", - "hash": "16166077380570933860" - } - ], - "@tanstack/ai-fallback": [ - { - "file": "packages/typescript/ai-fallback/README.md", - "hash": "6761501137729243856" - }, - { - "file": "packages/typescript/ai-fallback/package.json", - "hash": "737870455585130161", - "deps": [ - "@tanstack/ai" - ] - }, - { - "file": "packages/typescript/ai-fallback/src/bound-ai.ts", - "hash": "8736322061514036670" - }, - { - "file": "packages/typescript/ai-fallback/src/fallback-ai.ts", - "hash": "12060290602746820311" - }, - { - "file": "packages/typescript/ai-fallback/src/index.ts", - "hash": "4337915932762348500" - }, - { - "file": "packages/typescript/ai-fallback/src/types.ts", - "hash": "11422455793641892216" - }, - { - "file": "packages/typescript/ai-fallback/tests/fallback.test.ts", - "hash": "9312394412985838318" - }, - { - "file": "packages/typescript/ai-fallback/tsconfig.json", - "hash": "17487793864479620212" - }, - { - "file": "packages/typescript/ai-fallback/tsdown.config.ts", - "hash": "10187296086296757619" - }, - { - "file": "packages/typescript/ai-fallback/vitest.config.ts", - "hash": "7615621961327142822" - } - ], - "ts-chat": [ - { - "file": "examples/ts-chat/.cta.json", - "hash": "17957252993989621813" - }, - { - "file": "examples/ts-chat/.gitignore", - "hash": "9533296198461232274" - }, - { - "file": "examples/ts-chat/README.md", - "hash": "7996730016093040806" - }, - { - "file": "examples/ts-chat/api-verification.ts", - "hash": "14298611812373499017" - }, - { - "file": "examples/ts-chat/env.example", - "hash": "18377011614814965924" - }, - { - "file": "examples/ts-chat/package.json", - "hash": "17167067345745576093", - "deps": [ - "npm:@testing-library/dom", - "npm:@testing-library/react", - "npm:@types/node", - "npm:@types/react", - "npm:@types/react-dom", - "npm:@vitejs/plugin-react", - "npm:jsdom", - "npm:typescript", - "npm:vite", - "npm:vitest", - "npm:web-vitals", - "npm:@ai-sdk/openai", - "npm:@ai-sdk/provider", - "npm:@ai-sdk/provider-utils", - "npm:@tailwindcss/vite", - "@tanstack/ai", - "@tanstack/ai-anthropic", - "@tanstack/ai-client", - "@tanstack/ai-gemini", - "@tanstack/ai-ollama", - "@tanstack/ai-openai", - "@tanstack/ai-react", - "@tanstack/ai-react-ui", - "npm:@tanstack/nitro-v2-vite-plugin", - "npm:@tanstack/react-devtools", - "npm:@tanstack/react-router", - "npm:@tanstack/react-router-devtools", - "npm:@tanstack/react-router-ssr-query", - "npm:@tanstack/react-start", - "npm:@tanstack/react-store", - "npm:@tanstack/router-plugin", - "npm:@tanstack/store", - "npm:highlight.js", - "npm:lucide-react", - "npm:react", - "npm:react-dom", - "npm:react-markdown", - "npm:rehype-highlight", - "npm:rehype-raw", - "npm:rehype-sanitize", - "npm:remark-gfm", - "npm:tailwindcss", - "npm:vite-tsconfig-paths", - "npm:zod@4.1.13" - ] - }, - { - "file": "examples/ts-chat/public/example-guitar-flowers.jpg", - "hash": "3860872875571240335" - }, - { - "file": "examples/ts-chat/public/example-guitar-motherboard.jpg", - "hash": "2741907069919080163" - }, - { - "file": "examples/ts-chat/public/example-guitar-racing.jpg", - "hash": "6536003299929325317" - }, - { - "file": "examples/ts-chat/public/example-guitar-steamer-trunk.jpg", - "hash": "146542270860809738" - }, - { - "file": "examples/ts-chat/public/example-guitar-superhero.jpg", - "hash": "2110668839341553839" - }, - { - "file": "examples/ts-chat/public/example-guitar-traveling.jpg", - "hash": "5435312409484947607" - }, - { - "file": "examples/ts-chat/public/example-guitar-video-games.jpg", - "hash": "1491568140000221261" - }, - { - "file": "examples/ts-chat/public/favicon.ico", - "hash": "2949791817221603359" - }, - { - "file": "examples/ts-chat/public/logo192.png", - "hash": "7585273181698778288" - }, - { - "file": "examples/ts-chat/public/logo512.png", - "hash": "9339365414554387981" - }, - { - "file": "examples/ts-chat/public/manifest.json", - "hash": "425001267799769451" - }, - { - "file": "examples/ts-chat/public/robots.txt", - "hash": "2790380794362165217" - }, - { - "file": "examples/ts-chat/public/tanstack-circle-logo.png", - "hash": "1267347947504420788" - }, - { - "file": "examples/ts-chat/public/tanstack-word-logo-white.svg", - "hash": "2437888107770601788" - }, - { - "file": "examples/ts-chat/src/components/Approval.tsx", - "hash": "7910045894079159035" - }, - { - "file": "examples/ts-chat/src/components/Header.tsx", - "hash": "15489940022761222780" - }, - { - "file": "examples/ts-chat/src/components/example-GuitarRecommendation.tsx", - "hash": "6697137368594663627" - }, - { - "file": "examples/ts-chat/src/data/example-guitars.ts", - "hash": "1493943760047990028" - }, - { - "file": "examples/ts-chat/src/lib/guitar-tools.ts", - "hash": "2543780594518725512" - }, - { - "file": "examples/ts-chat/src/lib/stub-adapter.ts", - "hash": "1509607428678335901" - }, - { - "file": "examples/ts-chat/src/lib/stub-llm.ts", - "hash": "10932251380340004125" - }, - { - "file": "examples/ts-chat/src/logo.svg", - "hash": "3942313435587414446" - }, - { - "file": "examples/ts-chat/src/routeTree.gen.ts", - "hash": "12338247319306000875" - }, - { - "file": "examples/ts-chat/src/router.tsx", - "hash": "3872645124130335506" - }, - { - "file": "examples/ts-chat/src/routes/__root.tsx", - "hash": "16414886355281670793" - }, - { - "file": "examples/ts-chat/src/routes/api.tanchat.ts", - "hash": "17234137480219775210" - }, - { - "file": "examples/ts-chat/src/routes/api.test-chat.ts", - "hash": "11255984911709387429" - }, - { - "file": "examples/ts-chat/src/routes/demo.tsx", - "hash": "16388829717604153208" - }, - { - "file": "examples/ts-chat/src/routes/example.guitars/$guitarId.tsx", - "hash": "17562506041613072548" - }, - { - "file": "examples/ts-chat/src/routes/example.guitars/index.tsx", - "hash": "14231250696734596752" - }, - { - "file": "examples/ts-chat/src/routes/index.tsx", - "hash": "8185393998693565299" - }, - { - "file": "examples/ts-chat/src/routes/tanchat.css", - "hash": "5438259874171855668" - }, - { - "file": "examples/ts-chat/src/styles.css", - "hash": "16519577060105603698" - }, - { - "file": "examples/ts-chat/src/utils/demo.tools.ts", - "hash": "13761334072357408477" - }, - { - "file": "examples/ts-chat/tsconfig.json", - "hash": "18286238709166217558" - }, - { - "file": "examples/ts-chat/vite.config.ts", - "hash": "7763138038252414933" - } - ], - "@tanstack/ai-gemini": [ - { - "file": "packages/typescript/ai-gemini/package.json", - "hash": "2232407804374453143", - "deps": [ - "@tanstack/ai", - "npm:@google/genai" - ] - }, - { - "file": "packages/typescript/ai-gemini/src/gemini-adapter.ts", - "hash": "15344987649265123847" - }, - { - "file": "packages/typescript/ai-gemini/src/index.ts", - "hash": "1810521445822028207" - }, - { - "file": "packages/typescript/ai-gemini/src/model-meta.ts", - "hash": "16187662143579125151" - }, - { - "file": "packages/typescript/ai-gemini/src/text/text-provider-options.ts", - "hash": "9043538609512896446" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/code-execution-tool.ts", - "hash": "12270816637141460797" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/computer-use-tool.ts", - "hash": "17977892481738570344" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/file-search-tool.ts", - "hash": "2852673093464598373" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts", - "hash": "6778001202763125943" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/google-maps-tool.ts", - "hash": "2981941627762861366" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts", - "hash": "12394937234886637812" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/google-search-tool.ts", - "hash": "11790355173669636127" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/index.ts", - "hash": "388511333951589562" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/tool-converter.ts", - "hash": "17848454382125284680" - }, - { - "file": "packages/typescript/ai-gemini/src/tools/url-context-tool.ts", - "hash": "5805711885094551762" - }, - { - "file": "packages/typescript/ai-gemini/tests/gemini-adapter.test.ts", - "hash": "2889544286000887040" - }, - { - "file": "packages/typescript/ai-gemini/tests/model-meta.test.ts", - "hash": "17565011756602352194" - }, - { - "file": "packages/typescript/ai-gemini/tsconfig.json", - "hash": "17487793864479620212" - }, - { - "file": "packages/typescript/ai-gemini/tsdown.config.ts", - "hash": "13921512206456352195" - }, - { - "file": "packages/typescript/ai-gemini/vitest.config.ts", - "hash": "14379467452428811752" - } - ], - "@tanstack/solid-ai-devtools": [ - { - "file": "packages/typescript/solid-ai-devtools/package.json", - "hash": "12030619632275185766", - "deps": [ - "npm:solid-js", - "npm:vite-plugin-solid", - "@tanstack/ai-devtools-core", - "npm:@tanstack/devtools-utils" - ] - }, - { - "file": "packages/typescript/solid-ai-devtools/src/AiDevtools.tsx", - "hash": "831131791389423336" - }, - { - "file": "packages/typescript/solid-ai-devtools/src/index.ts", - "hash": "13634138679122569959" - }, - { - "file": "packages/typescript/solid-ai-devtools/src/plugin.tsx", - "hash": "6245929956183148441" - }, - { - "file": "packages/typescript/solid-ai-devtools/src/production.ts", - "hash": "14512530177798002641" - }, - { - "file": "packages/typescript/solid-ai-devtools/tsconfig.json", - "hash": "1306631043222942463" - }, - { - "file": "packages/typescript/solid-ai-devtools/tsdown.config.ts", - "hash": "15766826510434865934" - }, - { - "file": "packages/typescript/solid-ai-devtools/vitest.config.ts", - "hash": "16166077380570933860" - } - ] - } - }, - "externalNodesHash": "3578599483009164216" -} \ No newline at end of file diff --git a/.nx/workspace-data/lockfile-dependencies.hash b/.nx/workspace-data/lockfile-dependencies.hash deleted file mode 100644 index a8fd66e7e..000000000 --- a/.nx/workspace-data/lockfile-dependencies.hash +++ /dev/null @@ -1 +0,0 @@ -4773244219203613534 \ No newline at end of file diff --git a/.nx/workspace-data/lockfile-nodes.hash b/.nx/workspace-data/lockfile-nodes.hash deleted file mode 100644 index a8fd66e7e..000000000 --- a/.nx/workspace-data/lockfile-nodes.hash +++ /dev/null @@ -1 +0,0 @@ -4773244219203613534 \ No newline at end of file diff --git a/.nx/workspace-data/nx_files.nxt b/.nx/workspace-data/nx_files.nxt deleted file mode 100644 index bc396a47facfb182d985bd996fde625599727bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32748 zcmb`Q3!G$Cedh<`LVQ7hFd(o>L`Bf*uBuy4A2@AK&(JUrnCamaKejd9HQmK@cU7vY z=K)b$qcMI&L?eD8#?=G`9~%sWCI~+AL8Z19QvOAKEnHt89GD{9Jmtf;~am+p*}vtnZK2*dHDiI)b3i| zf05%lj_5kkXFw}A@DkB~?cd+%&-(l(UcSO{Gl#x^E9bxGxQ!$F-W~q4J2~I&@vn3K zhJUYi-!$*<@$a8ce;T_!zZWbT-+iX-1H2c1J>oITYx*AWijME`qVo@Vd7R@X96#ky zo2cKz`CRn>1pjyc*^~YpwR;Ns=LX~L$}f4*S#5sB8(ma`6)jxHA%;H8x7Fu|dtC4J zC%!$xV@Gk;cZDCv`{OzE`Kg>w;}D+nXWjQG@A==g*Jp)Qv@p$Q0AAt{t-mVoYo3m- zr|YQC*LnQ)ocZ5jQJd2N)^Ut;OmJ-A2zxwmK;PB-jUGFL^I87=X3kqU_hek<^7>xx?aQJ`i>5@(VxDz(|q1(%v(1IvVzb{E>GukiLakb<6bq%GT&)+11zujKwjqYjno4x+XOnYfpYcA}mQps1VK`mdd=IcRFtK`#qqK{pT zg@v7rbF|-^ZSP$&edHNUv0lm7D!f+9)k>kRYqn>4qf=YAZkpaUv2k+y)V2$z&)G3K ze%AE%sj+QSBa5?za=Bco)$>86#JLz$f_#v1?Z#4nzT57!W`^gYSg!{4Vxe5g7lUG* zchz!pUt_VepxNx@X674x_odlJzcK1R$;~ad`i*W+6HuxL^-@r+i0&^ zXf|e>UB0`oKz3*5J2r0~+japn8PqHF zfa_Gtl|m&S6zW0cU~fWWW|G>inWko=nlG2~rBb0zZ}kE*Td2ErY|J(~++uIEy|B<& zZ0MT#GQ3jF)1+Ff(!N^CxMs|J;$w5uFyS7$Z1h|0rP0mJUXL9x-ssM{X{hB(#d1)t z)obNityZWMtIy6G{`w;q_1a7D6{}jRRSTtRP|X)Ib_i2Dv(RD<9FH{jXf-qswS1w% z)r&#BUM-cX)lwzv^4(@*rk`658AII0CUv*sZle+eB^aT`lvWBstqMz|&C>8j)m(KJ zmgiba>ZejHmFsXf>st#7C3Tn9O*j^@OSIozH{JH^@{DF#cb2aes-<$Rln zbB&$tZhyqdA;ts0=j*jVtkR^ZyX1d?p*Uxnt>c~wGqbVRnm>O2SQY^=V z>dbdW`;8^;Xl6H}FcJYH;Du5i!N+zh){5m)3Gr19;<<=qhwsQSRiRp_RP&W;P=edb z2s$KY{DoDM*KPjZa;w{13^{6FKPVJo0XUKg&zI^&1Z6zNL8(8mc&(+`=05JRTB;)K zi}`A~STB}>TD_Dhr`!&8{2YC`o-Y>*^?a?CFQPBV*fNTfT1VZH0{E@C-jETME8)^Jrs zUAfB6;hyq^BArxI2e8ndYmfBy%%M_>K_Otp%C)M7TS}d9w>RQh8*MJ_8S&kg%K3U8 z!CGXs3cM}V^Qjl?wwDphx=Dmf5k*>HcF?0-IG=jSbV(C2N&zLz_iGhd6-Bmqy&S9Z ziF46B)8m^ab(-8VHL-D<(?cwFt$+j*yw^>V(L#TT)?p_PpYb}%5>75?h*yA*M; zUM^KCSvw}-z))DlbhI>)u)@A6Ap(lxXIUNf>hP*`mUk{-r|fF%X|Xd#c;QQR<`eEg zcCw9va(!qm{kIkyORZfp(4@jpfO(j$QpGN*R_d(npel}s$=z0AN;U}%Yqe^XjZ&*d zR>Sz#En6nWoy9P=e(db2iEZ1bH}05RKcR)g?8(=e!b(tKhoI_GmG~+?)q>17x=ZLe z76VPf7c0fUDFe75dv}Ev)R6rcur%~itYUp&f7Q#yR3&M2%0XD5Rz!vB%ZZa7cP))m z39!&Gau7}hD^5@gx!yu+adc#^)o;x$wYyCQRz^>j0|Y0+L#9E7_=s1;h_b!Sow;4j z{>*$N&FH9D3rZ!V2=)_dE1$IkoWdKmvba_cPywt~ku}3YDwHxM*=lQbai$ZEpi)5` z*XmXHt6U1OkAfiDt~2vZ)Z}8T*J~}!ITL=QH_rqGSlO^{iH%k)Y34F!V8}@B%{Lbo zq6-HF6fU9>frjSfF6vpv!%#nsPG@013g1j*8MR%>7clwrvj6MZqQskc{hs%GoPiif zEYvW_@~kY9s}Pt^F@X6Gjg!wKr!Y_o!#2F%vwkmopCY#hrP$8RHLwClF6zwTUof^B zrUrlP|6(Pv+*X?=+E?5Atoq{k{PNQ7ac3V(ywk8)s>3%JrP3z_%yKhzq2)1P<*2L3 z>Y2vsnV!ax>`zZ)!m*afub_k|Lnf9n;ZyfKyUn@VjvyyxE^y?%-}=6eP0jKT&Z12d+V8_g-k=>{ zMu?YDQF3x*MR4Dep!3T+M<=&$-!U;gHG%g!HZ?K2b9rvM+w8~(*uS{I7qF_4E@;Jy z22`ycgiL5H;wz52*PQG;_FOmD?#Rc{yw|yWp@wwhKMZx^8yVB?~*F}!XJ z)*z2$fqU}hLO#>NH|81)h7*kYf}W`1{p-6K(>k<9%UvAsHem!D8m$+jC@UIMKt^K) zYPlIx+}moQ;T&odoOe*zg2Ys+EGyPY4FfAnxy1X%=&E6MVL=JgVD+Qqk%48L;&>#3 zyV6MP$eLtL@!c_A5zn}}aJ4>C# z+(LV1_sIUn;sOiA^wiwA&|=kMmH->rR9TS+Cu@7-GW|Qf*3JdRLH6NhmD#SyA^bf8 z9V|x1eGiMZ)>3ELxuvjnkpo#o^a1ZOpXn=ynqHF;%^iYJGgrb%FBSy7 z&$nzj$Miugk1*=z5H=1)6dvOHB2SG<)9=@3j18=yv*oAll3Rp?`nds#n+!MA* z7*zH9A(T5}5643RrCn8lDN*K#YnYSH{jA zkPgHf&;pFvy+H)9cQN~%PO4Q9>e%VlrEsDWqcjXMEY9MLRzYf1vpp)Jk1*RJZy&%4v{gGA$>R3 zZqH#xE+TECZHZY^sKao0fQSqDEEs}NNP{$0<7y))-Oqhg{_=IJuS=ObWgfK>8^HJdx zNMKY-@(}C9rwP|pQ!UF-T}U`YrneO&h)v`!2@K6AYLDfKT+_McQnQO?y`H=hTOIX+ zSs~?uG3z|Q^eG>{-v2`mEY@|ar%?eOCE_HYstk$2eZ(Hk_X_J`Lh{+8hkVr|? zh-(orfp_r+(ylUm%LCpGV!eWaj-nvFB$1k#+c0b|c}GIcWs8hILAa1O1To<{(F_d# za_WGFH?CcC1T7;fC?tbnhcaLf$E+XO3Ysmizer7tAe-buvh#?lDP)PvB??d{+eSDb zZBpR4#7fBG;VPjSOg-Xt1Qyv&cqZahWioB}Q<|EbCsI!#0y35+Q$*|Q=xDbje4LaiR1Ezm~Qo;B~@Uea3@eEq( zLlQa7QbLbnGm>f`Y#Fd5*y0%mkkeH=8yHzW{I5m94}!Va#Y~ONSWMt(BCQoLJ!}D? zOK_Rd0P?8_7Zo$}K?4q|S93E8oS?%cDCSy(V6@U25V0b%7gZwDk{0Ac%JoRF%q%n; zOA2$5L535F`N+{>VX?(BrZ89 z-D{d(tK=Oa1!N=62|@<0&sdb4&t!;W!nbyHi2o?|$rz<)N;o)44lrfIO;2~*?a-r9 zG@}Na$@fw&jF@l66d4mFii}_f5uf+55j;Gs2idx$Wr)tR*M>GdJ3Z$T2(1~HCDuX` zH+Ak|f-1*RlJP;%6Fw{DE8fz-7Dl1E{5+z7=jijX09@E@KyoUB3?ZyZ0TLZ)lCN2cYnreOW!}`vFdH@^7h+YCd(33sQ1qfWmZTSU zHq+!UsaPZx41|G8MjW;s5?R`W3TTBswbKR~Hhj$j=26QSIMN82To*F!fWd~FMpzt2 zMbS7I47*|Iy6Lf$UY}%wDwDdX#V{Qqms@&}a;-d_COxrmVdl$s6^a5-GRjgliU(on zVdNx>#k%tb_r2jH25lj?H|b~0^*Ey&9y(1QU&R4#RAxsgOe=nZ5r<>itK$G3xzFpJQ>QJz3zYS%)0Z*R2Q z#3VyQD?gy@tCEg+N~x5HdzL6@I0;c9mpA_KF3@MVOY(IQ8nAvE*9`kjV#cHjOExi+ zC%L2WH0DRvV1|?;v1=szKr$3rg6~2shb#l5!t>5j@o|LF?G06k$`Ha5QZ5J!OzB*7 zXJ%U3m|_d7trGHMYpV_mQ>H!~G%*|8%bt-aei(7bK1L)y&*Pq| zL`t=w8MhQFWkfnTc1nmy<}CGzFtw3D#&pNGgIO?^RMmn?!zD2CYQS&`$1vYtTwwch zVfLM?gCN#x?889`;Uz6R(i=?-1kW-UJxY#Mkklk0bn#?PJnw|@Mgsc;BGA1!O2mB- zal_Ren!Gs6VZ0Q{i4l>j zMG?h*c#)_BVxNl95y~hf8g#Y(i3L$yeK_Aijv@=VRUC7bVi7&g7>3`03z$^7P$uZr ziRN6RJGboX@^B2fWpNiZqO2d>n_i*GotbSEu0U9=t+`jA5oVzt1M7fsVF#v-Yd8)f z&KPU0_n|Pl+J}lo8DS=?#*YO_?}_1r(u%^<*o;>6lq_4ZN(`+UT6mFcZBYQ(4U0fk zvDaxWwENU9C!p4tVr6V<$!DxcB_Z%NVQbckeL&ou-AA}L*$0uUIAE-(Mv!74R16Uz zWd*SMMrM|~y>>S&r(yN5&alvk&Qlj5z6uMQy3Jk9ZgXj-sr+}pJwqy#3MJW1R6LLn zAxA8IF}%HG=0-twDkY_Dl{}=VQ>B80aYnHHmng4q_EoK@%6FG47_RY%7j3l_8_zNB zuS`IKHe?4&L=^DU;%^PgmsMIlF7^)HU|;tf2~QLpxds9s1W$>^qUx&A+9i6ivD|O( zYVDI=WFIQM#x1f&tXaym7?JHlX5#-SXoi?(%X1}|o*G_cP^uyyP22gDey}u#3%oQsUag3%O(8=B1z&u4Ve)y zg|aY~9WAP-8PYNr-ZEDz2I;Bf7_*P$aiJU;+pJ8MkvPDOE`OkK?(U{5m~b5A!kz?{ zlo>^SJoDH?nVJ^a2^AZYw*&*qsDicxvYWMaDn861aypwbV5cv#NFEF@RXhg|4G+&nO_ARRNhy<$y^yDAk!mMgTv#^gY@wYe~&KYV~s1-7avTOov=N!f!;G zVDl_7;njRReKaM#fp9{v;I_a`!D@pkyW@qixFdO z?w2MM3bFx^LxjZf77!}vvy7!P!p)}UU|pqU5G{3t6CM}pFvBK~q*A!EQBuQ|B;nR3 zYYk^(nQ&h!kf>(X7!AmrtX$U=lQqsFt#9=@3yuA=^;NfuE{ zkada8;S)K%sm4xqkCBHBicrBlClsh$MOb&B=SfI1PDf?@@H-wODvojviW)NO?)>Br z+ChXgap1Lo*m+2y>=5ojO_RTejYL^Gx(QWd5y?Yy!(50M+>mEy4abXs^Q@p4tS4T4`YF26cZ-o@ockWc~Aix_Yf9!*U}_J&WpR3TAk3A#7RcQ5PMOm ziie&k?a1gnwnd#y6_(lTQ&tVZMNxYA1QMb6OpPA1IffQu-bK1G7m1?Qv+Uo4TW+)V zEV@i=Jvc%pp2B9?YP?bl7p9I?e91FRJorn=!R#ncAhT+f74Sxj z)v}f~W~Bk8EMJW9A78~nCf>kvl^M4mS=MgoUS!7s^l;1!MTK87!IW6iBxH0pz+*lH zqQHOn7G}a|WQ%a`3i!jfID9GDsZQ4!xQbArB)AoFqq3OfBS^BTM0{8m z#(YgRpdM8qpvOECx?nQ1q=R+zpE0Y7Z^g93p+_AVf|9iG z9l`mHbFlV;zQ;rD%E7fXT&zR?H~#k>6NB4e%vjJV>7{+DsG`+Fvsu$%;3I zYD6xu%Ye~K6mk|_y zU=t%Bu}`G1%OSTJt4ZvLELZsrQ%0#@Rvt1mC8P8sf>SkyYKWgoE_I zFQAit&PF#moNduMdmkwbHZcOibm(P_Zhn$Nt~(VX86z-O$ZBz_a23%C0!6COA?w2~ z%jza;md1^S?row_N)v>LBr%M0LFydcqUZ5qQ55BnOlX^glS124Y3w2d88udNMl&BV zFfOs<1c^VELcX{Jh0<600f3Ad@!uZXHh#wB6c5Vp*cKXguqvWgMcsrsnAxldlxNu0 zmafa0LeIXYx ziyj_yMtOxC3hYNr59OY<`kskQa@BWzP(Q5X%u#+@hpB?WzV|EPh4_Jrn0QLY%U+Go?wp!10 zSz>~w(JF3qKaaJo$w%bLd7PObp*FIn7a@WFKzGu@#`+Cyo;axIg-iI$3q%;m8zX+v zuM7n%i@lv8zLVV`K^H%k#Y}7UoxDXLpbB_ej35$qO*k^c4}^Jn64fr|W?Eh9yxmhw z?x8Y0v`$=>ktiBPC^%!02Zv+kDl|^QC<>!O1ya93@{d?QGFbI587p=$qH{gJ^A^@S z?$bk?Jfp!=8Z4xK@PTrnxaSl@)0qJ#-V^FA_t3$9Wzbmwwgwgw>w(seyD~b|si&lT zYkm74C+PHYY(r3j@_OUWuA<>Ha7&b{l7eDphh zf`XtGzu$z5qJn0zHhZ25;`AE(;Vm~5x=ML&EFO=Unbq6Y@IyGyHZJj|#w;}lZr`BE z@fC=N!EfXpvctonW#H^VC9Zf%ZV88t$gVdK2+%8aMiDJH3!|~gGsbBIgRfQ@em0_q zMkd~e7$y{hwp95?Mt8>Qj}3BM3~r2wF;N^?pIwyp<@BN#g4X6I4oKAE?ZB4!gKQzi zQ_{M!(=T0_6nzj*l9GiRNxNcc;`$`JWN-of#Dp{Lr^bZP!-+;tVFZaeiO5iVOF|@L zKvq2|?Khh8BN+_IJ>sJQI?D<{da&I^vrSl$8Kz80&$}xDon_DX0S(y_2WgKCZx-#p zXcT14Gz#LHBrB*o%q(dgnido7!fDfwG(~l?l%dOPb&(JL_rc$sn^)(z;+ciAxI$!-oFnIwR3R5|cQv9(TaJ zA;ynkZQ~9Er*dK9Si2?HYw(*z`*GWFXq0rvr)DN(O;=a_3RO4@a`1G2Sls$eFXfx5 z)kwWtJ5+nCL{emZ;o}nz!UaLaq}}PN$%-Qwdg@n2CrZoU@?yKEeS7uAcea<8^b4u1 z7A~*?z|v|+5DGoAEK=tOy9(o|)T!UY9>QkRv-|v39<>(CLdNBj+{MA{(3o8#KS?v@ z<5hb6SC6TMWqZhCaY?-vC1Y3p?20#4RZ>k{gb70SizgLHDOAEJU-ToNp|EF7iG)#S zqB2XKJ|W#@lBokiHHkrmMksb8g)7MqvdCyuVg$3C=s)rcGm>8c*s^hA)7FjR9o2=x zkunQ-NXb1@6W@C5t(XcM1*`CP$q@4l7$pdV-ZSPqMcnJrjwoa5^(uv9%E!nkgpc{l zT)${v4OF2KUQtaw%g+X7LX)Q*-J@Xq;_cML_UZVS5V&JZF&0l@Rt10c80l~-QETly z{i$xVIYPc(GKG>*egg=Gjm4zRVLf++?M;O7P-t5kJDuz(1hUfqG4Tlv%$G|GU>5IPjYrPH{h3J_>yz zwD1oYT))e{(c?E6JP*F#;}07A<=~%z)^E@s_SvNWBJ@{1K4NhF2KaNj;J@gF^OFPr z9cYc`-KM>M$9~e|HyFGG-htLQ|78{aDc^qW=acK|x9;!t_!|ta{+|P_>+Ui58=y~x zR{vKSTx+}2x4+HcT9?Z_{xIi_{qVm2Gx)X8>gRxI|0?LOdHj`MNXDu4`mx8)GPu^| zNNA0-!#SEa;T350f0=3jGUzw^_O}_l4!+;F|FOY!-D`dOqyK9%o)Pf-ef!rKT=#Xr z<2wwl_QyhNJZ*!&6nY)B#{Z`V7vEm!+uv;PlfnPUxBn*R=zhglS9|WFp zMKb>10{d_)k6FGWhGjUjnUhe$e3BcT*m}f^)RK zF95&T<9C|&k~1qF|KA4Jb+7aItNt<>kM{fj@c3H{uJIfVt^2yn;Ob`*TI0Ok;My-2 zd;DJwE_rn=wE8*Wy5zd*=er(1!{A!?!=TmvZ3b8WC1_puR)bGKw|x7@I7jm%KKz_- zf5P?2b;rQJ?%Th?;HQ8e3a#tD+2G>yQ=xU;KQ_4L=M3Ne27|v6{Oun9H-n3>J_W7) za@1cXIibeEZjepY8dOfA3+kY2`-htMAeb?aP z=TAUuJkP%&8BY!RHgNU-N`p&I{x9FpW`j!}9to}X7aLsbSoio127e=X6I$c>s=?Pn zf6}-AvB5RY>wNnc{&g}=t=Ij&{b>f*IDhWjzs2C>G6-5_R{0? z9{()oC%yi4^X~CmO?%0=k3j45Ck!q=|GdW!{ZcZ1$)ATjel&PA9<9f}d;GPgz2^DX z9^Ykf&GRdub=@lrUV=Wyp$GPuU`=N>=i#$YohIZ>_aE)`qxBrg8w}E$j`$KL@`U${q1=szS4KBX=H{VYKJX%MM^QF)l&wEXK z?f1>l8qX~TS3f=9{vLztzOM1@|Bt~nZ(s5F=vR_)${zb?a9wwo!6ko=hZcUR!8M+3 z9>3P$l4JWk{u6_bgJ0?KUvQ50h3tn1Jw9@CG9KO6_dUMb;F80~Lu))&8eH>yp2u(D z9QCj9{2{dF?FrLf`s=g4{o%JH*OmNy$hRLixW@BKkI#cg>!o=ZfmZ*QnD)m(Z}<2W z2A7?-%i~`&xW=>M@$Va4{C~a2*Zxg1PVwirz%>si8(e&L2(<93!8M*Epf%2E&e8lx zKIr?xKWf@*-Oq$pKMxpuBlJ5x{)E9#0KWrT{rsA9G(Vyr_V}xBO~x-ie;i!>Pa0hJ zyB1pC+hcIat1`6Ozms#+zxbyCt^2;+wBG=|2(5m;Z*chqf8p`x|7|iJt>d@A)z2FY zE_wAc-~IxFOa7k%t^O}Dxb(|_-{4xW z6QOn84;cKl(Bsg$?#%`dp!fOqKj0kAoBZW#pmo2$Hn{B1Z$qn})BZjgkJjr);JWUG z1}{Ocg%*Cf!KE)Ipw-Wp4X*KD;_=4~E`GksYlN7dc0Kvb4`7)DKhp_nP)Efxf`EzudHc5qJ+;*S*@bmp$aP@PV!B2wzrN?Is zu6?%_TJ0|}xa`uc&>H8B2A95`^Z0`XmtMZg<4+r0{CNko`mfxTj8o(Pk#B#l!KJTX z2Ca2}hr#9Vk3nlZpE9`SxdpBMZ#TI1`};lqubiX#7oU95<7@9u#v}RpkKpS69D{40 zJ_lO;f85|(pggklk3W_e*|3pOdEU?^lv~5 zztZ6ApwIO9XAQ1)@A3GTI7jy@{Ewk^-TO>??Ylqo_|pd0JpV1UzE}N5GES}6;~rlR z9`&zvdKt9ZFPir1XB1l3{e;0K|IhdB?=-mNH7o8oUU-vTK)X?Hk{JPumpyv*S83pPS)Ja-se_j|F&?=!f*|3#1g z%HZP9TRootb}~-&^8;{wZ^q!_{}Z5f-MyTn`8*DKE423UpP2Squbt59=W2tCewWAZ zF}UXW!yf;>!KF{X0Fr=4_kcu z8&=_aefxhgxa7|#efwkXOU5JoTOL2j;POY-Kx;gw8(jSG0%*zk^9(LK>Qrcr^X&%L zeqRTzdA{1jew61%R!2{@1pf&!_8(j9) zxgNjE;JU9Xpw-V$3@-WeSHAt)`;+l#{vY)1-)L~%?;+6YXScy6H(u@W%M30#a2~YA z`8k8jp1j!O|739aBOmej4>-TV$3{j`(fU z!AsC} zX!ZYjgG-;zd;AfDi*G*)t$t2^FuAVmrMrClDTAy1;m~S-slla>)_MFogNr}+LTfzV zGq~jKpL+a74<*+Xf8GnO{wEBs{(s@yUt)0aTOL~b_Zow1e&(Qc-FpqL{y*f~KW%W$ z&&|Gl{o!OhiW~e8T;rKHcmVwhXyG%QBmNxW-#C%p7yb^@UV3c{w8nG2!L_~@dHhj> z%kKRz(CX)iN0RYq{_pnqh{47Gzx4gAGx)LKFNRh>^9GlEdkwVa?SrfE?Y{ku2G@A@ zd;C#@YkjYR)_pzi(PW&myYBM%%MC8M@iUK)fk*SE`S~qqjc3ZV*Z6bL>i^va*F2o= z@kiap};IcQK r2d#1LFu3&WY0&EDody?wj`{ZQ;~dSyi@+D4n}^_!t{gb9!u$UVRGEt~ diff --git a/.nx/workspace-data/parsed-lock-file.dependencies.json b/.nx/workspace-data/parsed-lock-file.dependencies.json deleted file mode 100644 index 5b0b9e516..000000000 --- a/.nx/workspace-data/parsed-lock-file.dependencies.json +++ /dev/null @@ -1,12687 +0,0 @@ -[ - { - "source": "npm:@ai-sdk/openai", - "target": "npm:@ai-sdk/provider", - "type": "static" - }, - { - "source": "npm:@ai-sdk/openai", - "target": "npm:@ai-sdk/provider-utils", - "type": "static" - }, - { - "source": "npm:@ai-sdk/openai", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "npm:@ai-sdk/provider-utils", - "target": "npm:@ai-sdk/provider", - "type": "static" - }, - { - "source": "npm:@ai-sdk/provider-utils", - "target": "npm:@standard-schema/spec", - "type": "static" - }, - { - "source": "npm:@ai-sdk/provider-utils", - "target": "npm:eventsource-parser", - "type": "static" - }, - { - "source": "npm:@ai-sdk/provider-utils", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "npm:@ai-sdk/provider", - "target": "npm:json-schema", - "type": "static" - }, - { - "source": "npm:@anthropic-ai/sdk", - "target": "npm:json-schema-to-ts", - "type": "static" - }, - { - "source": "npm:@anthropic-ai/sdk", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:@csstools/css-calc", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:@csstools/css-color-parser", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:@csstools/css-parser-algorithms", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:@csstools/css-tokenizer", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:lru-cache@11.2.2", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:@asamuzakjp/nwsapi", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:bidi-js", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:css-tree", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:is-potential-custom-element-name", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:lru-cache@11.2.2", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.26.2", - "target": "npm:@babel/helper-validator-identifier@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.26.2", - "target": "npm:js-tokens@4.0.0", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.26.2", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.27.1", - "target": "npm:@babel/helper-validator-identifier@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.27.1", - "target": "npm:js-tokens@4.0.0", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.27.1", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/generator", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/helper-compilation-targets", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/helper-module-transforms", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/helpers", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@jridgewell/remapping", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:convert-source-map", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:gensync", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:json5", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:semver@6.3.1", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:@jridgewell/gen-mapping", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:@jridgewell/trace-mapping", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:jsesc", - "type": "static" - }, - { - "source": "npm:@babel/helper-annotate-as-pure", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:@babel/compat-data", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:@babel/helper-validator-option", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:browserslist", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:lru-cache@5.1.1", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:semver@6.3.1", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-annotate-as-pure", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-member-expression-to-functions", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-optimise-call-expression", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-replace-supers", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-skip-transparent-expression-wrappers", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:semver@6.3.1", - "type": "static" - }, - { - "source": "npm:@babel/helper-member-expression-to-functions", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-member-expression-to-functions", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-imports@7.18.6", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-imports@7.27.1", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-imports@7.27.1", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-transforms", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-transforms", - "target": "npm:@babel/helper-module-imports@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-transforms", - "target": "npm:@babel/helper-validator-identifier@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-transforms", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-optimise-call-expression", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/helper-replace-supers", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/helper-replace-supers", - "target": "npm:@babel/helper-member-expression-to-functions", - "type": "static" - }, - { - "source": "npm:@babel/helper-replace-supers", - "target": "npm:@babel/helper-optimise-call-expression", - "type": "static" - }, - { - "source": "npm:@babel/helper-replace-supers", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-skip-transparent-expression-wrappers", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-skip-transparent-expression-wrappers", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/helpers", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@babel/helpers", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/parser@7.28.4", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/parser@7.28.5", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/plugin-proposal-private-methods", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-proposal-private-methods", - "target": "npm:@babel/helper-create-class-features-plugin", - "type": "static" - }, - { - "source": "npm:@babel/plugin-proposal-private-methods", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/plugin-syntax-jsx", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-syntax-jsx", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/plugin-syntax-typescript", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-syntax-typescript", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-modules-commonjs", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-modules-commonjs", - "target": "npm:@babel/helper-module-transforms", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-modules-commonjs", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-react-jsx-self", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-react-jsx-self", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-react-jsx-source", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-react-jsx-source", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/helper-annotate-as-pure", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/helper-create-class-features-plugin", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/helper-skip-transparent-expression-wrappers", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/plugin-syntax-typescript", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/helper-validator-option", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/plugin-syntax-jsx", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/plugin-transform-modules-commonjs", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/plugin-transform-typescript", - "type": "static" - }, - { - "source": "npm:@babel/template", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/template", - "target": "npm:@babel/parser@7.28.4", - "type": "static" - }, - { - "source": "npm:@babel/template", - "target": "npm:@babel/types@7.28.4", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/generator", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/helper-globals", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@babel/types@7.28.4", - "target": "npm:@babel/helper-string-parser", - "type": "static" - }, - { - "source": "npm:@babel/types@7.28.4", - "target": "npm:@babel/helper-validator-identifier@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/types@7.28.5", - "target": "npm:@babel/helper-string-parser", - "type": "static" - }, - { - "source": "npm:@babel/types@7.28.5", - "target": "npm:@babel/helper-validator-identifier@7.28.5", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/config", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/get-version-range-type", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/git", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/should-skip-package", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:detect-indent", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:lodash.startcase", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:outdent", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:prettier@2.8.8", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:resolve-from@5.0.0", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@changesets/get-dependents-graph", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@changesets/should-skip-package", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@changesets/changelog-git", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/apply-release-plan", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/assemble-release-plan", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/changelog-git", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/config", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/get-dependents-graph", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/get-release-plan", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/git", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/logger", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/pre", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/read", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/should-skip-package", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/write", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@inquirer/external-editor", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:ansi-colors", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:ci-info", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:enquirer@2.4.1", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:mri", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:p-limit@2.3.0", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:package-manager-detector@0.2.11", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:resolve-from@5.0.0", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:spawndamnit", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:term-size", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@changesets/get-dependents-graph", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@changesets/logger", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:micromatch", - "type": "static" - }, - { - "source": "npm:@changesets/errors", - "target": "npm:extendable-error", - "type": "static" - }, - { - "source": "npm:@changesets/get-dependents-graph", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/get-dependents-graph", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/get-dependents-graph", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@changesets/get-dependents-graph", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@changesets/get-github-info", - "target": "npm:dataloader", - "type": "static" - }, - { - "source": "npm:@changesets/get-github-info", - "target": "npm:node-fetch@2.7.0", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/assemble-release-plan", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/config", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/pre", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/read", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:is-subdir", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:micromatch", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:spawndamnit", - "type": "static" - }, - { - "source": "npm:@changesets/logger", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@changesets/parse", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/parse", - "target": "npm:js-yaml@3.14.1", - "type": "static" - }, - { - "source": "npm:@changesets/pre", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/pre", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/pre", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/pre", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:@changesets/git", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:@changesets/logger", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:@changesets/parse", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:p-filter", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@changesets/should-skip-package", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/should-skip-package", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/write", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/write", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/write", - "target": "npm:human-id", - "type": "static" - }, - { - "source": "npm:@changesets/write", - "target": "npm:prettier@2.8.8", - "type": "static" - }, - { - "source": "npm:@cloudflare/kv-asset-handler", - "target": "npm:mime@3.0.0", - "type": "static" - }, - { - "source": "npm:@commitlint/parse", - "target": "npm:@commitlint/types", - "type": "static" - }, - { - "source": "npm:@commitlint/parse", - "target": "npm:conventional-changelog-angular", - "type": "static" - }, - { - "source": "npm:@commitlint/parse", - "target": "npm:conventional-commits-parser", - "type": "static" - }, - { - "source": "npm:@commitlint/types", - "target": "npm:@types/conventional-commits-parser", - "type": "static" - }, - { - "source": "npm:@commitlint/types", - "target": "npm:chalk@5.6.2", - "type": "static" - }, - { - "source": "npm:@csstools/css-calc", - "target": "npm:@csstools/css-parser-algorithms", - "type": "static" - }, - { - "source": "npm:@csstools/css-calc", - "target": "npm:@csstools/css-tokenizer", - "type": "static" - }, - { - "source": "npm:@csstools/css-color-parser", - "target": "npm:@csstools/color-helpers", - "type": "static" - }, - { - "source": "npm:@csstools/css-color-parser", - "target": "npm:@csstools/css-calc", - "type": "static" - }, - { - "source": "npm:@csstools/css-color-parser", - "target": "npm:@csstools/css-parser-algorithms", - "type": "static" - }, - { - "source": "npm:@csstools/css-color-parser", - "target": "npm:@csstools/css-tokenizer", - "type": "static" - }, - { - "source": "npm:@csstools/css-parser-algorithms", - "target": "npm:@csstools/css-tokenizer", - "type": "static" - }, - { - "source": "npm:@csstools/css-syntax-patches-for-csstree", - "target": "npm:postcss", - "type": "static" - }, - { - "source": "npm:@emnapi/core", - "target": "npm:@emnapi/wasi-threads", - "type": "static" - }, - { - "source": "npm:@emnapi/core", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:@emnapi/runtime", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:@emnapi/wasi-threads", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:@eslint-community/eslint-utils", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-community/eslint-utils", - "target": "npm:eslint-visitor-keys@3.4.3", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:@typescript-eslint/typescript-estree@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:birecord", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-dom", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-hooks-extra", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-naming-convention", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-web-api", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-x", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@eslint/config-array", - "target": "npm:@eslint/object-schema", - "type": "static" - }, - { - "source": "npm:@eslint/config-array", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@eslint/config-array", - "target": "npm:minimatch@3.1.2", - "type": "static" - }, - { - "source": "npm:@eslint/config-helpers", - "target": "npm:@eslint/core", - "type": "static" - }, - { - "source": "npm:@eslint/core", - "target": "npm:@types/json-schema", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:ajv@6.12.6", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:espree", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:globals@14.0.0", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:ignore@5.3.2", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:import-fresh", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:js-yaml@4.1.1", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:minimatch@3.1.2", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:strip-json-comments@3.1.1", - "type": "static" - }, - { - "source": "npm:@eslint/plugin-kit", - "target": "npm:@eslint/core", - "type": "static" - }, - { - "source": "npm:@eslint/plugin-kit", - "target": "npm:levn", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/engine-oniguruma", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/langs", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/themes", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/types", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/vscode-textmate", - "type": "static" - }, - { - "source": "npm:@google/genai", - "target": "npm:google-auth-library", - "type": "static" - }, - { - "source": "npm:@google/genai", - "target": "npm:ws", - "type": "static" - }, - { - "source": "npm:@humanfs/node", - "target": "npm:@humanfs/core", - "type": "static" - }, - { - "source": "npm:@humanfs/node", - "target": "npm:@humanwhocodes/retry", - "type": "static" - }, - { - "source": "npm:@inquirer/external-editor", - "target": "npm:chardet", - "type": "static" - }, - { - "source": "npm:@inquirer/external-editor", - "target": "npm:iconv-lite@0.7.0", - "type": "static" - }, - { - "source": "npm:@inquirer/external-editor", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:string-width@5.1.2", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:string-width-cjs", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:strip-ansi@7.1.2", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:strip-ansi-cjs", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:wrap-ansi@8.1.0", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:wrap-ansi-cjs", - "type": "static" - }, - { - "source": "npm:@isaacs/fs-minipass", - "target": "npm:minipass", - "type": "static" - }, - { - "source": "npm:@jest/schemas", - "target": "npm:@sinclair/typebox", - "type": "static" - }, - { - "source": "npm:@jridgewell/gen-mapping", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - }, - { - "source": "npm:@jridgewell/gen-mapping", - "target": "npm:@jridgewell/trace-mapping", - "type": "static" - }, - { - "source": "npm:@jridgewell/remapping", - "target": "npm:@jridgewell/gen-mapping", - "type": "static" - }, - { - "source": "npm:@jridgewell/remapping", - "target": "npm:@jridgewell/trace-mapping", - "type": "static" - }, - { - "source": "npm:@jridgewell/source-map", - "target": "npm:@jridgewell/gen-mapping", - "type": "static" - }, - { - "source": "npm:@jridgewell/source-map", - "target": "npm:@jridgewell/trace-mapping", - "type": "static" - }, - { - "source": "npm:@jridgewell/trace-mapping", - "target": "npm:@jridgewell/resolve-uri", - "type": "static" - }, - { - "source": "npm:@jridgewell/trace-mapping", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - }, - { - "source": "npm:@kwsites/file-exists", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@manypkg/find-root", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:@manypkg/find-root", - "target": "npm:@types/node@12.20.55", - "type": "static" - }, - { - "source": "npm:@manypkg/find-root", - "target": "npm:find-up@4.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/find-root", - "target": "npm:fs-extra@8.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:@changesets/types@4.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:@manypkg/find-root", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:fs-extra@8.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:globby@11.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:read-yaml-file", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:detect-libc@2.1.2", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:https-proxy-agent", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:node-fetch@2.7.0", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:nopt", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:tar", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor-model", - "target": "npm:@microsoft/tsdoc", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor-model", - "target": "npm:@microsoft/tsdoc-config", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor-model", - "target": "npm:@rushstack/node-core-library", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@microsoft/api-extractor-model", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@microsoft/tsdoc", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@microsoft/tsdoc-config", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@rushstack/node-core-library", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@rushstack/rig-package", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@rushstack/terminal", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@rushstack/ts-command-line", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:lodash", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:minimatch@3.0.8", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:semver@7.5.4", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:source-map@0.6.1", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:typescript@5.4.2", - "type": "static" - }, - { - "source": "npm:@microsoft/tsdoc-config", - "target": "npm:@microsoft/tsdoc", - "type": "static" - }, - { - "source": "npm:@microsoft/tsdoc-config", - "target": "npm:ajv@8.12.0", - "type": "static" - }, - { - "source": "npm:@microsoft/tsdoc-config", - "target": "npm:jju", - "type": "static" - }, - { - "source": "npm:@microsoft/tsdoc-config", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.12", - "target": "npm:@emnapi/core", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.12", - "target": "npm:@emnapi/runtime", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.12", - "target": "npm:@tybys/wasm-util@0.10.1", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.4", - "target": "npm:@emnapi/core", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.4", - "target": "npm:@emnapi/runtime", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.4", - "target": "npm:@tybys/wasm-util@0.9.0", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@1.0.7", - "target": "npm:@emnapi/core", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@1.0.7", - "target": "npm:@emnapi/runtime", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@1.0.7", - "target": "npm:@tybys/wasm-util@0.10.1", - "type": "static" - }, - { - "source": "npm:@nodelib/fs.scandir", - "target": "npm:@nodelib/fs.stat", - "type": "static" - }, - { - "source": "npm:@nodelib/fs.scandir", - "target": "npm:run-parallel", - "type": "static" - }, - { - "source": "npm:@nodelib/fs.walk", - "target": "npm:@nodelib/fs.scandir", - "type": "static" - }, - { - "source": "npm:@nodelib/fs.walk", - "target": "npm:fastq", - "type": "static" - }, - { - "source": "npm:@oozcitak/dom", - "target": "npm:@oozcitak/infra", - "type": "static" - }, - { - "source": "npm:@oozcitak/dom", - "target": "npm:@oozcitak/url", - "type": "static" - }, - { - "source": "npm:@oozcitak/dom", - "target": "npm:@oozcitak/util", - "type": "static" - }, - { - "source": "npm:@oozcitak/infra", - "target": "npm:@oozcitak/util", - "type": "static" - }, - { - "source": "npm:@oozcitak/url", - "target": "npm:@oozcitak/infra", - "type": "static" - }, - { - "source": "npm:@oozcitak/url", - "target": "npm:@oozcitak/util", - "type": "static" - }, - { - "source": "npm:@oxc-resolver/binding-wasm32-wasi", - "target": "npm:@napi-rs/wasm-runtime@1.0.7", - "type": "static" - }, - { - "source": "npm:@parcel/watcher-wasm", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:@parcel/watcher-wasm", - "target": "npm:micromatch", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:detect-libc@1.0.3", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:micromatch", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:node-addon-api", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-android-arm64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-darwin-arm64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-darwin-x64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-freebsd-x64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-arm-glibc", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-arm-musl", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-arm64-glibc", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-x64-glibc", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-win32-arm64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-win32-ia32", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-win32-x64", - "type": "static" - }, - { - "source": "npm:@poppinss/colors", - "target": "npm:kleur", - "type": "static" - }, - { - "source": "npm:@poppinss/dumper", - "target": "npm:@poppinss/colors", - "type": "static" - }, - { - "source": "npm:@poppinss/dumper", - "target": "npm:@sindresorhus/is", - "type": "static" - }, - { - "source": "npm:@poppinss/dumper", - "target": "npm:supports-color@10.2.2", - "type": "static" - }, - { - "source": "npm:@rolldown/binding-wasm32-wasi", - "target": "npm:@napi-rs/wasm-runtime@1.0.7", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-alias", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:commondir", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:fdir", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:is-reference@1.2.1", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-inject", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-inject", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-inject", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-inject", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-json", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-json", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:@types/resolve", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:deepmerge", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:is-module", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-replace", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-replace", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-replace", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-terser", - "target": "npm:serialize-javascript", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-terser", - "target": "npm:smob", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-terser", - "target": "npm:terser", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-terser", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:@rollup/pluginutils", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:@rollup/pluginutils", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@rollup/pluginutils", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:@rollup/pluginutils", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:ajv@8.13.0", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:ajv-draft-04", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:ajv-formats", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:import-lazy", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:jju", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:semver@7.5.4", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:@rushstack/rig-package", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@rushstack/rig-package", - "target": "npm:strip-json-comments@3.1.1", - "type": "static" - }, - { - "source": "npm:@rushstack/terminal", - "target": "npm:@rushstack/node-core-library", - "type": "static" - }, - { - "source": "npm:@rushstack/terminal", - "target": "npm:supports-color@8.1.1", - "type": "static" - }, - { - "source": "npm:@rushstack/terminal", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:@rushstack/ts-command-line", - "target": "npm:@rushstack/terminal", - "type": "static" - }, - { - "source": "npm:@rushstack/ts-command-line", - "target": "npm:@types/argparse", - "type": "static" - }, - { - "source": "npm:@rushstack/ts-command-line", - "target": "npm:argparse@1.0.10", - "type": "static" - }, - { - "source": "npm:@rushstack/ts-command-line", - "target": "npm:string-argv", - "type": "static" - }, - { - "source": "npm:@shikijs/engine-oniguruma", - "target": "npm:@shikijs/types", - "type": "static" - }, - { - "source": "npm:@shikijs/engine-oniguruma", - "target": "npm:@shikijs/vscode-textmate", - "type": "static" - }, - { - "source": "npm:@shikijs/langs", - "target": "npm:@shikijs/types", - "type": "static" - }, - { - "source": "npm:@shikijs/themes", - "target": "npm:@shikijs/types", - "type": "static" - }, - { - "source": "npm:@shikijs/types", - "target": "npm:@shikijs/vscode-textmate", - "type": "static" - }, - { - "source": "npm:@shikijs/types", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:@size-limit/esbuild", - "target": "npm:esbuild", - "type": "static" - }, - { - "source": "npm:@size-limit/esbuild", - "target": "npm:nanoid@5.1.6", - "type": "static" - }, - { - "source": "npm:@size-limit/esbuild", - "target": "npm:size-limit", - "type": "static" - }, - { - "source": "npm:@size-limit/file", - "target": "npm:size-limit", - "type": "static" - }, - { - "source": "npm:@size-limit/preset-small-lib", - "target": "npm:@size-limit/esbuild", - "type": "static" - }, - { - "source": "npm:@size-limit/preset-small-lib", - "target": "npm:@size-limit/file", - "type": "static" - }, - { - "source": "npm:@size-limit/preset-small-lib", - "target": "npm:size-limit", - "type": "static" - }, - { - "source": "npm:@solid-primitives/event-listener", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/event-listener", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@solid-primitives/keyboard", - "target": "npm:@solid-primitives/event-listener", - "type": "static" - }, - { - "source": "npm:@solid-primitives/keyboard", - "target": "npm:@solid-primitives/rootless", - "type": "static" - }, - { - "source": "npm:@solid-primitives/keyboard", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/keyboard", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:@solid-primitives/event-listener", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:@solid-primitives/rootless", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:@solid-primitives/static-store", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@solid-primitives/rootless", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/rootless", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@solid-primitives/static-store", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/static-store", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@solid-primitives/utils", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:espree", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:estraverse", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:@sveltejs/acorn-typescript", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:@svitejs/changesets-changelog-github-compact", - "target": "npm:@changesets/get-github-info", - "type": "static" - }, - { - "source": "npm:@svitejs/changesets-changelog-github-compact", - "target": "npm:dotenv@16.6.1", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:@jridgewell/remapping", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:enhanced-resolve", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:lightningcss", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:source-map-js", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:tailwindcss", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-android-arm64", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-darwin-arm64", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-darwin-x64", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-freebsd-x64", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-wasm32-wasi", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-win32-x64-msvc", - "type": "static" - }, - { - "source": "npm:@tailwindcss/vite", - "target": "npm:@tailwindcss/node", - "type": "static" - }, - { - "source": "npm:@tailwindcss/vite", - "target": "npm:@tailwindcss/oxide", - "type": "static" - }, - { - "source": "npm:@tailwindcss/vite", - "target": "npm:tailwindcss", - "type": "static" - }, - { - "source": "npm:@tailwindcss/vite", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/config", - "target": "npm:@tanstack/eslint-config", - "type": "static" - }, - { - "source": "npm:@tanstack/config", - "target": "npm:@tanstack/publish-config", - "type": "static" - }, - { - "source": "npm:@tanstack/config", - "target": "npm:@tanstack/typedoc-config", - "type": "static" - }, - { - "source": "npm:@tanstack/config", - "target": "npm:@tanstack/vite-config", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-client", - "target": "npm:@tanstack/devtools-event-client", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-event-bus", - "target": "npm:ws", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-ui", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-ui", - "target": "npm:goober", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-ui", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-utils", - "target": "npm:@tanstack/devtools-ui", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-utils", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-utils", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-utils", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@solid-primitives/event-listener", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@solid-primitives/keyboard", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@solid-primitives/resize-observer", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@tanstack/devtools-client", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@tanstack/devtools-event-bus", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@tanstack/devtools-ui", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:goober", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:babel-dead-code-elimination", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:@eslint/js", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:@stylistic/eslint-plugin", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:eslint-plugin-import-x", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:eslint-plugin-n", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:globals@16.5.0", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:typescript-eslint", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:vue-eslint-parser", - "type": "static" - }, - { - "source": "npm:@tanstack/nitro-v2-vite-plugin", - "target": "npm:nitropack", - "type": "static" - }, - { - "source": "npm:@tanstack/nitro-v2-vite-plugin", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/nitro-v2-vite-plugin", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/publish-config", - "target": "npm:@commitlint/parse", - "type": "static" - }, - { - "source": "npm:@tanstack/publish-config", - "target": "npm:jsonfile@6.2.0", - "type": "static" - }, - { - "source": "npm:@tanstack/publish-config", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@tanstack/publish-config", - "target": "npm:simple-git", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:@tanstack/devtools", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:@types/react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-query", - "target": "npm:@tanstack/query-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-query", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:@tanstack/router-devtools-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:@tanstack/query-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:@tanstack/react-query", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:@tanstack/router-ssr-query-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:@tanstack/history", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:@tanstack/react-store", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:isbot", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:tiny-warning", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:tiny-warning", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/history", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/start-server-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/react-start-client", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/react-start-server", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/start-plugin-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/start-server-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/react-store", - "target": "npm:@tanstack/store", - "type": "static" - }, - { - "source": "npm:@tanstack/react-store", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-store", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-store", - "target": "npm:use-sync-external-store", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:@tanstack/history", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:@tanstack/store", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:cookie-es@2.0.0", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:seroval@1.4.0", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:seroval-plugins@1.4.0", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:tiny-warning", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:goober", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:csstype@3.2.3", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:@tanstack/virtual-file-routes", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:prettier", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:recast", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:source-map@0.7.6", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:tsx", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:zod@3.25.76", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/plugin-syntax-jsx", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/plugin-syntax-typescript", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/router-generator", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/virtual-file-routes", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:babel-dead-code-elimination", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:chokidar@3.6.0", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:unplugin", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:zod@3.25.76", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:vite-plugin-solid", - "type": "static" - }, - { - "source": "npm:@tanstack/router-ssr-query-core", - "target": "npm:@tanstack/query-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-ssr-query-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:@babel/generator", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:@babel/preset-typescript", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:ansis", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:diff", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/plugin-syntax-jsx", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/plugin-syntax-typescript", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@tanstack/directive-functions-plugin", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:babel-dead-code-elimination", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:@tanstack/start-storage-context", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:seroval@1.4.0", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:tiny-warning", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@babel/code-frame@7.26.2", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@rolldown/pluginutils@1.0.0-beta.40", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/router-generator", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/router-plugin", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/server-functions-plugin", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/start-server-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:babel-dead-code-elimination", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:cheerio", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:exsolve", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:srvx", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:vitefu", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:xmlbuilder2", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:zod@3.25.76", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:@tanstack/history", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:@tanstack/start-storage-context", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:h3-v2", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:seroval@1.4.0", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/start-storage-context", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/typedoc-config", - "target": "npm:typedoc", - "type": "static" - }, - { - "source": "npm:@tanstack/typedoc-config", - "target": "npm:typedoc-plugin-frontmatter", - "type": "static" - }, - { - "source": "npm:@tanstack/typedoc-config", - "target": "npm:typedoc-plugin-markdown", - "type": "static" - }, - { - "source": "npm:@tanstack/vite-config", - "target": "npm:rollup-plugin-preserve-directives", - "type": "static" - }, - { - "source": "npm:@tanstack/vite-config", - "target": "npm:vite-plugin-dts", - "type": "static" - }, - { - "source": "npm:@tanstack/vite-config", - "target": "npm:vite-plugin-externalize-deps", - "type": "static" - }, - { - "source": "npm:@tanstack/vite-config", - "target": "npm:vite-tsconfig-paths", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:@types/aria-query", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:aria-query@5.3.0", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:dom-accessibility-api@0.5.16", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:lz-string", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:pretty-format@27.5.1", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:@adobe/css-tools", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:aria-query@5.3.0", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:css.escape", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:dom-accessibility-api@0.6.3", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:redent", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:@testing-library/dom", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:@types/react-dom", - "type": "static" - }, - { - "source": "npm:@tybys/wasm-util@0.10.1", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:@tybys/wasm-util@0.9.0", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@types/babel__generator", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@types/babel__template", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@types/babel__traverse", - "type": "static" - }, - { - "source": "npm:@types/babel__generator", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/babel__template", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/babel__template", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/babel__traverse", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/chai", - "target": "npm:@types/deep-eql", - "type": "static" - }, - { - "source": "npm:@types/chai", - "target": "npm:assertion-error", - "type": "static" - }, - { - "source": "npm:@types/conventional-commits-parser", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:@types/debug", - "target": "npm:@types/ms", - "type": "static" - }, - { - "source": "npm:@types/estree-jsx", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:@types/hast", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:@types/mdast", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:@types/node@20.19.25", - "target": "npm:undici-types@6.21.0", - "type": "static" - }, - { - "source": "npm:@types/node", - "target": "npm:undici-types@7.16.0", - "type": "static" - }, - { - "source": "npm:@types/react-dom", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:@types/react", - "target": "npm:csstype@3.2.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@eslint-community/regexpp", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/parser", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/scope-manager@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/type-utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/visitor-keys@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:graphemer", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:ignore@7.0.5", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:natural-compare", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:@typescript-eslint/scope-manager@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:@typescript-eslint/typescript-estree@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:@typescript-eslint/visitor-keys@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.46.3", - "target": "npm:@typescript-eslint/tsconfig-utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.46.3", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.46.3", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.48.0", - "target": "npm:@typescript-eslint/tsconfig-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.48.0", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.48.0", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/scope-manager@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/scope-manager@8.46.3", - "target": "npm:@typescript-eslint/visitor-keys@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/scope-manager@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/scope-manager@8.48.0", - "target": "npm:@typescript-eslint/visitor-keys@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/tsconfig-utils@8.46.3", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/tsconfig-utils@8.48.0", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:@typescript-eslint/typescript-estree@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:@typescript-eslint/utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:@typescript-eslint/typescript-estree@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:@typescript-eslint/project-service@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:@typescript-eslint/tsconfig-utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:@typescript-eslint/visitor-keys@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:@typescript-eslint/project-service@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:@typescript-eslint/tsconfig-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:@typescript-eslint/visitor-keys@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:@typescript-eslint/scope-manager@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:@typescript-eslint/typescript-estree@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:@typescript-eslint/typescript-estree@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/visitor-keys@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/visitor-keys@8.46.3", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/visitor-keys@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/visitor-keys@8.48.0", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:@unrs/resolver-binding-wasm32-wasi", - "target": "npm:@napi-rs/wasm-runtime@0.2.12", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:@mapbox/node-pre-gyp", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:acorn-import-attributes", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:async-sema", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:bindings", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:glob", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:node-gyp-build", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:resolve-from@5.0.0", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@babel/plugin-transform-react-jsx-self", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@babel/plugin-transform-react-jsx-source", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@rolldown/pluginutils@1.0.0-beta.47", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@types/babel__core", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:react-refresh", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:@standard-schema/spec", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:@types/chai", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:@vitest/spy", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:@vitest/utils", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:chai", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:tinyrainbow", - "type": "static" - }, - { - "source": "npm:@vitest/mocker", - "target": "npm:@vitest/spy", - "type": "static" - }, - { - "source": "npm:@vitest/mocker", - "target": "npm:estree-walker@3.0.3", - "type": "static" - }, - { - "source": "npm:@vitest/mocker", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@vitest/mocker", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@vitest/pretty-format", - "target": "npm:tinyrainbow", - "type": "static" - }, - { - "source": "npm:@vitest/runner", - "target": "npm:@vitest/utils", - "type": "static" - }, - { - "source": "npm:@vitest/runner", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@vitest/snapshot", - "target": "npm:@vitest/pretty-format", - "type": "static" - }, - { - "source": "npm:@vitest/snapshot", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@vitest/snapshot", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@vitest/utils", - "target": "npm:@vitest/pretty-format", - "type": "static" - }, - { - "source": "npm:@vitest/utils", - "target": "npm:tinyrainbow", - "type": "static" - }, - { - "source": "npm:@volar/language-core", - "target": "npm:@volar/source-map", - "type": "static" - }, - { - "source": "npm:@volar/typescript", - "target": "npm:@volar/language-core", - "type": "static" - }, - { - "source": "npm:@volar/typescript", - "target": "npm:path-browserify", - "type": "static" - }, - { - "source": "npm:@volar/typescript", - "target": "npm:vscode-uri", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:@vue/shared", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:entities@4.5.0", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:source-map-js", - "type": "static" - }, - { - "source": "npm:@vue/compiler-dom", - "target": "npm:@vue/compiler-core", - "type": "static" - }, - { - "source": "npm:@vue/compiler-dom", - "target": "npm:@vue/shared", - "type": "static" - }, - { - "source": "npm:@vue/compiler-vue2", - "target": "npm:de-indent", - "type": "static" - }, - { - "source": "npm:@vue/compiler-vue2", - "target": "npm:he", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:@volar/language-core", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:@vue/compiler-dom", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:@vue/compiler-vue2", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:@vue/shared", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:computeds", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:muggle-string", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:path-browserify", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@yarnpkg/parsers", - "target": "npm:js-yaml@3.14.1", - "type": "static" - }, - { - "source": "npm:@yarnpkg/parsers", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:@zkochan/js-yaml", - "target": "npm:argparse@2.0.1", - "type": "static" - }, - { - "source": "npm:JSONStream", - "target": "npm:jsonparse", - "type": "static" - }, - { - "source": "npm:JSONStream", - "target": "npm:through", - "type": "static" - }, - { - "source": "npm:abort-controller", - "target": "npm:event-target-shim", - "type": "static" - }, - { - "source": "npm:acorn-import-attributes", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:acorn-jsx", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:ajv-draft-04", - "target": "npm:ajv@8.13.0", - "type": "static" - }, - { - "source": "npm:ajv-formats", - "target": "npm:ajv@8.13.0", - "type": "static" - }, - { - "source": "npm:ajv@6.12.6", - "target": "npm:fast-deep-equal", - "type": "static" - }, - { - "source": "npm:ajv@6.12.6", - "target": "npm:fast-json-stable-stringify", - "type": "static" - }, - { - "source": "npm:ajv@6.12.6", - "target": "npm:json-schema-traverse@0.4.1", - "type": "static" - }, - { - "source": "npm:ajv@6.12.6", - "target": "npm:uri-js", - "type": "static" - }, - { - "source": "npm:ajv@8.12.0", - "target": "npm:fast-deep-equal", - "type": "static" - }, - { - "source": "npm:ajv@8.12.0", - "target": "npm:json-schema-traverse@1.0.0", - "type": "static" - }, - { - "source": "npm:ajv@8.12.0", - "target": "npm:require-from-string", - "type": "static" - }, - { - "source": "npm:ajv@8.12.0", - "target": "npm:uri-js", - "type": "static" - }, - { - "source": "npm:ajv@8.13.0", - "target": "npm:fast-deep-equal", - "type": "static" - }, - { - "source": "npm:ajv@8.13.0", - "target": "npm:json-schema-traverse@1.0.0", - "type": "static" - }, - { - "source": "npm:ajv@8.13.0", - "target": "npm:require-from-string", - "type": "static" - }, - { - "source": "npm:ajv@8.13.0", - "target": "npm:uri-js", - "type": "static" - }, - { - "source": "npm:ansi-styles@4.3.0", - "target": "npm:color-convert", - "type": "static" - }, - { - "source": "npm:anymatch", - "target": "npm:normalize-path", - "type": "static" - }, - { - "source": "npm:anymatch", - "target": "npm:picomatch@2.3.1", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:glob", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:is-stream@2.0.1", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:lazystream", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:lodash", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:normalize-path", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:readable-stream@4.7.0", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:archiver-utils", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:async", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:buffer-crc32", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:readable-stream@4.7.0", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:readdir-glob", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:tar-stream@3.1.7", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:zip-stream", - "type": "static" - }, - { - "source": "npm:argparse@1.0.10", - "target": "npm:sprintf-js", - "type": "static" - }, - { - "source": "npm:aria-query@5.3.0", - "target": "npm:dequal", - "type": "static" - }, - { - "source": "npm:ast-types", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:axios", - "target": "npm:follow-redirects", - "type": "static" - }, - { - "source": "npm:axios", - "target": "npm:form-data", - "type": "static" - }, - { - "source": "npm:axios", - "target": "npm:proxy-from-env", - "type": "static" - }, - { - "source": "npm:babel-dead-code-elimination", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:babel-dead-code-elimination", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:babel-dead-code-elimination", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:babel-dead-code-elimination", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:@babel/helper-module-imports@7.18.6", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:@babel/plugin-syntax-jsx", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:html-entities", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:parse5@7.3.0", - "type": "static" - }, - { - "source": "npm:babel-preset-solid", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:babel-preset-solid", - "target": "npm:babel-plugin-jsx-dom-expressions", - "type": "static" - }, - { - "source": "npm:babel-preset-solid", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:better-path-resolve", - "target": "npm:is-windows", - "type": "static" - }, - { - "source": "npm:bidi-js", - "target": "npm:require-from-string", - "type": "static" - }, - { - "source": "npm:bindings", - "target": "npm:file-uri-to-path", - "type": "static" - }, - { - "source": "npm:bl", - "target": "npm:buffer@5.7.1", - "type": "static" - }, - { - "source": "npm:bl", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:bl", - "target": "npm:readable-stream@3.6.2", - "type": "static" - }, - { - "source": "npm:brace-expansion@1.1.12", - "target": "npm:balanced-match", - "type": "static" - }, - { - "source": "npm:brace-expansion@1.1.12", - "target": "npm:concat-map", - "type": "static" - }, - { - "source": "npm:brace-expansion@2.0.2", - "target": "npm:balanced-match", - "type": "static" - }, - { - "source": "npm:braces", - "target": "npm:fill-range", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:baseline-browser-mapping", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:caniuse-lite", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:electron-to-chromium", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:node-releases", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:update-browserslist-db", - "type": "static" - }, - { - "source": "npm:buffer@5.7.1", - "target": "npm:base64-js", - "type": "static" - }, - { - "source": "npm:buffer@5.7.1", - "target": "npm:ieee754", - "type": "static" - }, - { - "source": "npm:buffer@6.0.3", - "target": "npm:base64-js", - "type": "static" - }, - { - "source": "npm:buffer@6.0.3", - "target": "npm:ieee754", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:chokidar@4.0.3", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:confbox@0.2.2", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:dotenv@17.2.3", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:exsolve", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:giget", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:ohash", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:perfect-debounce", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:rc9", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:magicast", - "type": "static" - }, - { - "source": "npm:call-bind-apply-helpers", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:call-bind-apply-helpers", - "target": "npm:function-bind", - "type": "static" - }, - { - "source": "npm:chalk@4.1.2", - "target": "npm:ansi-styles@4.3.0", - "type": "static" - }, - { - "source": "npm:chalk@4.1.2", - "target": "npm:supports-color@7.2.0", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:boolbase", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:css-select", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:css-what", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:domutils", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:cheerio-select", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:dom-serializer", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:domutils", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:encoding-sniffer", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:htmlparser2", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:parse5@7.3.0", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:parse5-htmlparser2-tree-adapter", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:parse5-parser-stream", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:undici", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:whatwg-mimetype@4.0.0", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:anymatch", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:braces", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:glob-parent@5.1.2", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:is-binary-path", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:normalize-path", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:readdirp@3.6.0", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:fsevents", - "type": "static" - }, - { - "source": "npm:chokidar@4.0.3", - "target": "npm:readdirp@4.1.2", - "type": "static" - }, - { - "source": "npm:citty", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:cli-cursor", - "target": "npm:restore-cursor", - "type": "static" - }, - { - "source": "npm:clipboardy", - "target": "npm:execa", - "type": "static" - }, - { - "source": "npm:clipboardy", - "target": "npm:is-wsl@3.1.0", - "type": "static" - }, - { - "source": "npm:clipboardy", - "target": "npm:is64bit", - "type": "static" - }, - { - "source": "npm:cliui", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:cliui", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:cliui", - "target": "npm:wrap-ansi@7.0.0", - "type": "static" - }, - { - "source": "npm:color-convert", - "target": "npm:color-name", - "type": "static" - }, - { - "source": "npm:combined-stream", - "target": "npm:delayed-stream", - "type": "static" - }, - { - "source": "npm:compare-func", - "target": "npm:array-ify", - "type": "static" - }, - { - "source": "npm:compare-func", - "target": "npm:dot-prop@5.3.0", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:crc-32", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:crc32-stream", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:is-stream@2.0.1", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:normalize-path", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:readable-stream@4.7.0", - "type": "static" - }, - { - "source": "npm:conventional-changelog-angular", - "target": "npm:compare-func", - "type": "static" - }, - { - "source": "npm:conventional-commits-parser", - "target": "npm:JSONStream", - "type": "static" - }, - { - "source": "npm:conventional-commits-parser", - "target": "npm:is-text-path", - "type": "static" - }, - { - "source": "npm:conventional-commits-parser", - "target": "npm:meow", - "type": "static" - }, - { - "source": "npm:conventional-commits-parser", - "target": "npm:split2", - "type": "static" - }, - { - "source": "npm:crc32-stream", - "target": "npm:crc-32", - "type": "static" - }, - { - "source": "npm:crc32-stream", - "target": "npm:readable-stream@4.7.0", - "type": "static" - }, - { - "source": "npm:cross-spawn", - "target": "npm:path-key@3.1.1", - "type": "static" - }, - { - "source": "npm:cross-spawn", - "target": "npm:shebang-command", - "type": "static" - }, - { - "source": "npm:cross-spawn", - "target": "npm:which", - "type": "static" - }, - { - "source": "npm:crossws", - "target": "npm:uncrypto", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:boolbase", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:css-what", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:domutils", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:nth-check", - "type": "static" - }, - { - "source": "npm:css-tree", - "target": "npm:mdn-data", - "type": "static" - }, - { - "source": "npm:css-tree", - "target": "npm:source-map-js", - "type": "static" - }, - { - "source": "npm:cssstyle", - "target": "npm:@asamuzakjp/css-color", - "type": "static" - }, - { - "source": "npm:cssstyle", - "target": "npm:@csstools/css-syntax-patches-for-csstree", - "type": "static" - }, - { - "source": "npm:cssstyle", - "target": "npm:css-tree", - "type": "static" - }, - { - "source": "npm:data-urls", - "target": "npm:whatwg-mimetype@4.0.0", - "type": "static" - }, - { - "source": "npm:data-urls", - "target": "npm:whatwg-url@15.1.0", - "type": "static" - }, - { - "source": "npm:debug", - "target": "npm:ms", - "type": "static" - }, - { - "source": "npm:decode-named-character-reference", - "target": "npm:character-entities", - "type": "static" - }, - { - "source": "npm:defaults", - "target": "npm:clone", - "type": "static" - }, - { - "source": "npm:devlop", - "target": "npm:dequal", - "type": "static" - }, - { - "source": "npm:dir-glob", - "target": "npm:path-type@4.0.0", - "type": "static" - }, - { - "source": "npm:dom-serializer", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:dom-serializer", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:dom-serializer", - "target": "npm:entities@4.5.0", - "type": "static" - }, - { - "source": "npm:domhandler", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:domutils", - "target": "npm:dom-serializer", - "type": "static" - }, - { - "source": "npm:domutils", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:domutils", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:dot-prop@10.1.0", - "target": "npm:type-fest", - "type": "static" - }, - { - "source": "npm:dot-prop@5.3.0", - "target": "npm:is-obj", - "type": "static" - }, - { - "source": "npm:dotenv-expand", - "target": "npm:dotenv@16.6.1", - "type": "static" - }, - { - "source": "npm:dunder-proto", - "target": "npm:call-bind-apply-helpers", - "type": "static" - }, - { - "source": "npm:dunder-proto", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:dunder-proto", - "target": "npm:gopd", - "type": "static" - }, - { - "source": "npm:ecdsa-sig-formatter", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - }, - { - "source": "npm:encoding-sniffer", - "target": "npm:iconv-lite@0.6.3", - "type": "static" - }, - { - "source": "npm:encoding-sniffer", - "target": "npm:whatwg-encoding", - "type": "static" - }, - { - "source": "npm:end-of-stream", - "target": "npm:once", - "type": "static" - }, - { - "source": "npm:enhanced-resolve", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:enhanced-resolve", - "target": "npm:tapable", - "type": "static" - }, - { - "source": "npm:enquirer@2.3.6", - "target": "npm:ansi-colors", - "type": "static" - }, - { - "source": "npm:enquirer@2.4.1", - "target": "npm:ansi-colors", - "type": "static" - }, - { - "source": "npm:enquirer@2.4.1", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:es-object-atoms", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:es-set-tostringtag", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:es-set-tostringtag", - "target": "npm:get-intrinsic", - "type": "static" - }, - { - "source": "npm:es-set-tostringtag", - "target": "npm:has-tostringtag", - "type": "static" - }, - { - "source": "npm:es-set-tostringtag", - "target": "npm:hasown", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/aix-ppc64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/android-arm", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/android-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/android-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/darwin-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/darwin-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/freebsd-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/freebsd-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-arm", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-ia32", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-loong64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-mips64el", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-ppc64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-riscv64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-s390x", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/netbsd-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/netbsd-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/openbsd-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/openbsd-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/openharmony-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/sunos-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/win32-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/win32-ia32", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/win32-x64", - "type": "static" - }, - { - "source": "npm:eslint-compat-utils", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-compat-utils", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:eslint-import-context", - "target": "npm:get-tsconfig", - "type": "static" - }, - { - "source": "npm:eslint-import-context", - "target": "npm:stable-hash-x", - "type": "static" - }, - { - "source": "npm:eslint-import-context", - "target": "npm:unrs-resolver", - "type": "static" - }, - { - "source": "npm:eslint-plugin-es-x", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:eslint-plugin-es-x", - "target": "npm:@eslint-community/regexpp", - "type": "static" - }, - { - "source": "npm:eslint-plugin-es-x", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-es-x", - "target": "npm:eslint-compat-utils", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:comment-parser", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:eslint-import-context", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:stable-hash-x", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:unrs-resolver", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:enhanced-resolve", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:eslint-plugin-es-x", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:get-tsconfig", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:globals@15.15.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:globrex", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:ignore@5.3.2", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:ts-declaration-location", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:@babel/plugin-proposal-private-methods", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:hermes-parser", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:zod@3.25.76", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:zod-validation-error@3.5.4", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:compare-versions", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:hermes-parser", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:zod-validation-error@4.0.2", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:compare-versions", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:is-immutable-type", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:eslint-plugin-unused-imports", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-unused-imports", - "target": "npm:@typescript-eslint/eslint-plugin", - "type": "static" - }, - { - "source": "npm:eslint-scope", - "target": "npm:esrecurse", - "type": "static" - }, - { - "source": "npm:eslint-scope", - "target": "npm:estraverse", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint-community/regexpp", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/config-array", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/config-helpers", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/core", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/eslintrc", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/js", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/plugin-kit", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@humanfs/node", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@humanwhocodes/module-importer", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@humanwhocodes/retry", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:ajv@6.12.6", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:cross-spawn", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:escape-string-regexp@4.0.0", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:eslint-scope", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:espree", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:esquery", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:esutils", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:fast-deep-equal", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:file-entry-cache", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:find-up@5.0.0", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:glob-parent@6.0.2", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:ignore@5.3.2", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:imurmurhash", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:json-stable-stringify-without-jsonify", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:lodash.merge", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:minimatch@3.1.2", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:natural-compare", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:optionator", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:espree", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:espree", - "target": "npm:acorn-jsx", - "type": "static" - }, - { - "source": "npm:espree", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:esquery", - "target": "npm:estraverse", - "type": "static" - }, - { - "source": "npm:esrap", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - }, - { - "source": "npm:esrecurse", - "target": "npm:estraverse", - "type": "static" - }, - { - "source": "npm:estree-walker@3.0.3", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:events-universal", - "target": "npm:bare-events", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:cross-spawn", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:get-stream", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:human-signals", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:is-stream@3.0.0", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:merge-stream", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:npm-run-path@5.3.0", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:onetime@6.0.0", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:signal-exit@4.1.0", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:strip-final-newline", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:@nodelib/fs.stat", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:@nodelib/fs.walk", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:glob-parent@5.1.2", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:merge2", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:micromatch", - "type": "static" - }, - { - "source": "npm:fastq", - "target": "npm:reusify", - "type": "static" - }, - { - "source": "npm:fd-package-json", - "target": "npm:walk-up-path", - "type": "static" - }, - { - "source": "npm:fdir", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:fetch-blob", - "target": "npm:node-domexception", - "type": "static" - }, - { - "source": "npm:fetch-blob", - "target": "npm:web-streams-polyfill", - "type": "static" - }, - { - "source": "npm:figures", - "target": "npm:escape-string-regexp@1.0.5", - "type": "static" - }, - { - "source": "npm:file-entry-cache", - "target": "npm:flat-cache", - "type": "static" - }, - { - "source": "npm:fill-range", - "target": "npm:to-regex-range", - "type": "static" - }, - { - "source": "npm:find-up@4.1.0", - "target": "npm:locate-path@5.0.0", - "type": "static" - }, - { - "source": "npm:find-up@4.1.0", - "target": "npm:path-exists", - "type": "static" - }, - { - "source": "npm:find-up@5.0.0", - "target": "npm:locate-path@6.0.0", - "type": "static" - }, - { - "source": "npm:find-up@5.0.0", - "target": "npm:path-exists", - "type": "static" - }, - { - "source": "npm:flat-cache", - "target": "npm:flatted", - "type": "static" - }, - { - "source": "npm:flat-cache", - "target": "npm:keyv", - "type": "static" - }, - { - "source": "npm:foreground-child", - "target": "npm:cross-spawn", - "type": "static" - }, - { - "source": "npm:foreground-child", - "target": "npm:signal-exit@4.1.0", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:asynckit", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:combined-stream", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:es-set-tostringtag", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:hasown", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:mime-types@2.1.35", - "type": "static" - }, - { - "source": "npm:formatly", - "target": "npm:fd-package-json", - "type": "static" - }, - { - "source": "npm:formdata-polyfill", - "target": "npm:fetch-blob", - "type": "static" - }, - { - "source": "npm:front-matter", - "target": "npm:js-yaml@3.14.1", - "type": "static" - }, - { - "source": "npm:fs-extra@7.0.1", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:fs-extra@7.0.1", - "target": "npm:jsonfile@4.0.0", - "type": "static" - }, - { - "source": "npm:fs-extra@7.0.1", - "target": "npm:universalify@0.1.2", - "type": "static" - }, - { - "source": "npm:fs-extra@8.1.0", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:fs-extra@8.1.0", - "target": "npm:jsonfile@4.0.0", - "type": "static" - }, - { - "source": "npm:fs-extra@8.1.0", - "target": "npm:universalify@0.1.2", - "type": "static" - }, - { - "source": "npm:gaxios", - "target": "npm:extend", - "type": "static" - }, - { - "source": "npm:gaxios", - "target": "npm:https-proxy-agent", - "type": "static" - }, - { - "source": "npm:gaxios", - "target": "npm:node-fetch@3.3.2", - "type": "static" - }, - { - "source": "npm:gaxios", - "target": "npm:rimraf", - "type": "static" - }, - { - "source": "npm:gcp-metadata", - "target": "npm:gaxios", - "type": "static" - }, - { - "source": "npm:gcp-metadata", - "target": "npm:google-logging-utils", - "type": "static" - }, - { - "source": "npm:gcp-metadata", - "target": "npm:json-bigint", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:call-bind-apply-helpers", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:es-define-property", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:es-object-atoms", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:function-bind", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:get-proto", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:gopd", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:has-symbols", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:hasown", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:math-intrinsics", - "type": "static" - }, - { - "source": "npm:get-proto", - "target": "npm:dunder-proto", - "type": "static" - }, - { - "source": "npm:get-proto", - "target": "npm:es-object-atoms", - "type": "static" - }, - { - "source": "npm:get-tsconfig", - "target": "npm:resolve-pkg-maps", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:node-fetch-native", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:nypm", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:glob-parent@5.1.2", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:glob-parent@6.0.2", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:foreground-child", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:jackspeak", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:minipass", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:package-json-from-dist", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:path-scurry", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:array-union", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:dir-glob", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:ignore@5.3.2", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:merge2", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:slash@3.0.0", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:@sindresorhus/merge-streams", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:ignore@7.0.5", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:path-type@6.0.0", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:slash@5.1.0", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:unicorn-magic", - "type": "static" - }, - { - "source": "npm:goober", - "target": "npm:csstype@3.2.3", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:base64-js", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:ecdsa-sig-formatter", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:gaxios", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:gcp-metadata", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:google-logging-utils", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:gtoken", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:jws", - "type": "static" - }, - { - "source": "npm:gtoken", - "target": "npm:gaxios", - "type": "static" - }, - { - "source": "npm:gtoken", - "target": "npm:jws", - "type": "static" - }, - { - "source": "npm:gzip-size", - "target": "npm:duplexer", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:cookie-es@1.2.2", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:crossws", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:iron-webcrypto", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:node-mock-http", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:radix3", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:uncrypto", - "type": "static" - }, - { - "source": "npm:h3@2.0.0-beta.5", - "target": "npm:cookie-es@2.0.0", - "type": "static" - }, - { - "source": "npm:h3@2.0.0-beta.5", - "target": "npm:fetchdts", - "type": "static" - }, - { - "source": "npm:h3@2.0.0-beta.5", - "target": "npm:rou3", - "type": "static" - }, - { - "source": "npm:h3@2.0.0-beta.5", - "target": "npm:srvx", - "type": "static" - }, - { - "source": "npm:h3-v2", - "target": "npm:cookie-es@2.0.0", - "type": "static" - }, - { - "source": "npm:h3-v2", - "target": "npm:fetchdts", - "type": "static" - }, - { - "source": "npm:h3-v2", - "target": "npm:rou3", - "type": "static" - }, - { - "source": "npm:h3-v2", - "target": "npm:srvx", - "type": "static" - }, - { - "source": "npm:happy-dom", - "target": "npm:@types/node@20.19.25", - "type": "static" - }, - { - "source": "npm:happy-dom", - "target": "npm:@types/whatwg-mimetype", - "type": "static" - }, - { - "source": "npm:happy-dom", - "target": "npm:whatwg-mimetype@3.0.0", - "type": "static" - }, - { - "source": "npm:has-tostringtag", - "target": "npm:has-symbols", - "type": "static" - }, - { - "source": "npm:hasown", - "target": "npm:function-bind", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:hastscript", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:property-information@7.1.0", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:vfile-location", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:web-namespaces", - "type": "static" - }, - { - "source": "npm:hast-util-is-element", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-parse-selector", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:@ungap/structured-clone", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:hast-util-from-parse5", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:hast-util-to-parse5", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:html-void-elements", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:mdast-util-to-hast", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:parse5@7.3.0", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:unist-util-position", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:web-namespaces", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:zwitch", - "type": "static" - }, - { - "source": "npm:hast-util-sanitize", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-sanitize", - "target": "npm:@ungap/structured-clone", - "type": "static" - }, - { - "source": "npm:hast-util-sanitize", - "target": "npm:unist-util-position", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:comma-separated-tokens", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:estree-util-is-identifier-name", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:hast-util-whitespace", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:mdast-util-mdx-expression", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:mdast-util-mdx-jsx", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:mdast-util-mdxjs-esm", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:property-information@7.1.0", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:space-separated-tokens", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:style-to-js", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:unist-util-position", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:vfile-message", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:comma-separated-tokens", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:property-information@6.5.0", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:space-separated-tokens", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:web-namespaces", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:zwitch", - "type": "static" - }, - { - "source": "npm:hast-util-to-text", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-to-text", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:hast-util-to-text", - "target": "npm:hast-util-is-element", - "type": "static" - }, - { - "source": "npm:hast-util-to-text", - "target": "npm:unist-util-find-after", - "type": "static" - }, - { - "source": "npm:hast-util-whitespace", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:comma-separated-tokens", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:hast-util-parse-selector", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:property-information@7.1.0", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:space-separated-tokens", - "type": "static" - }, - { - "source": "npm:hermes-parser", - "target": "npm:hermes-estree", - "type": "static" - }, - { - "source": "npm:html-encoding-sniffer", - "target": "npm:whatwg-encoding", - "type": "static" - }, - { - "source": "npm:html-link-extractor", - "target": "npm:cheerio", - "type": "static" - }, - { - "source": "npm:htmlparser2", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:htmlparser2", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:htmlparser2", - "target": "npm:domutils", - "type": "static" - }, - { - "source": "npm:htmlparser2", - "target": "npm:entities@6.0.1", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:depd", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:setprototypeof", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:statuses@2.0.1", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:toidentifier", - "type": "static" - }, - { - "source": "npm:http-proxy-agent", - "target": "npm:agent-base", - "type": "static" - }, - { - "source": "npm:http-proxy-agent", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:https-proxy-agent", - "target": "npm:agent-base", - "type": "static" - }, - { - "source": "npm:https-proxy-agent", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:iconv-lite@0.6.3", - "target": "npm:safer-buffer", - "type": "static" - }, - { - "source": "npm:iconv-lite@0.7.0", - "target": "npm:safer-buffer", - "type": "static" - }, - { - "source": "npm:import-fresh", - "target": "npm:parent-module", - "type": "static" - }, - { - "source": "npm:import-fresh", - "target": "npm:resolve-from@4.0.0", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:@ioredis/commands", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:cluster-key-slot", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:denque", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:lodash.defaults", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:lodash.isarguments", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:redis-errors", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:redis-parser", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:standard-as-callback", - "type": "static" - }, - { - "source": "npm:is-alphanumerical", - "target": "npm:is-alphabetical", - "type": "static" - }, - { - "source": "npm:is-alphanumerical", - "target": "npm:is-decimal", - "type": "static" - }, - { - "source": "npm:is-binary-path", - "target": "npm:binary-extensions", - "type": "static" - }, - { - "source": "npm:is-core-module", - "target": "npm:hasown", - "type": "static" - }, - { - "source": "npm:is-glob", - "target": "npm:is-extglob", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:ts-declaration-location", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:is-inside-container", - "target": "npm:is-docker@3.0.0", - "type": "static" - }, - { - "source": "npm:is-reference@1.2.1", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:is-reference@3.0.3", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:is-subdir", - "target": "npm:better-path-resolve", - "type": "static" - }, - { - "source": "npm:is-text-path", - "target": "npm:text-extensions", - "type": "static" - }, - { - "source": "npm:is-wsl@2.2.0", - "target": "npm:is-docker@2.2.1", - "type": "static" - }, - { - "source": "npm:is-wsl@3.1.0", - "target": "npm:is-inside-container", - "type": "static" - }, - { - "source": "npm:is64bit", - "target": "npm:system-architecture", - "type": "static" - }, - { - "source": "npm:jackspeak", - "target": "npm:@isaacs/cliui", - "type": "static" - }, - { - "source": "npm:jackspeak", - "target": "npm:@pkgjs/parseargs", - "type": "static" - }, - { - "source": "npm:jest-diff", - "target": "npm:@jest/diff-sequences", - "type": "static" - }, - { - "source": "npm:jest-diff", - "target": "npm:@jest/get-type", - "type": "static" - }, - { - "source": "npm:jest-diff", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:jest-diff", - "target": "npm:pretty-format@30.2.0", - "type": "static" - }, - { - "source": "npm:js-yaml@3.14.1", - "target": "npm:argparse@1.0.10", - "type": "static" - }, - { - "source": "npm:js-yaml@3.14.1", - "target": "npm:esprima", - "type": "static" - }, - { - "source": "npm:js-yaml@4.1.1", - "target": "npm:argparse@2.0.1", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:@acemir/cssom", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:@asamuzakjp/dom-selector", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:cssstyle", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:data-urls", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:decimal.js", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:html-encoding-sniffer", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:http-proxy-agent", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:https-proxy-agent", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:is-potential-custom-element-name", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:parse5@8.0.0", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:saxes", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:symbol-tree", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:tough-cookie", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:w3c-xmlserializer", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:webidl-conversions@8.0.0", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:whatwg-encoding", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:whatwg-mimetype@4.0.0", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:whatwg-url@15.1.0", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:ws", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:xml-name-validator", - "type": "static" - }, - { - "source": "npm:json-bigint", - "target": "npm:bignumber.js", - "type": "static" - }, - { - "source": "npm:json-schema-to-ts", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:json-schema-to-ts", - "target": "npm:ts-algebra", - "type": "static" - }, - { - "source": "npm:jsonfile@4.0.0", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:jsonfile@6.2.0", - "target": "npm:universalify@2.0.1", - "type": "static" - }, - { - "source": "npm:jsonfile@6.2.0", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:jwa", - "target": "npm:buffer-equal-constant-time", - "type": "static" - }, - { - "source": "npm:jwa", - "target": "npm:ecdsa-sig-formatter", - "type": "static" - }, - { - "source": "npm:jwa", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - }, - { - "source": "npm:jws", - "target": "npm:jwa", - "type": "static" - }, - { - "source": "npm:jws", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - }, - { - "source": "npm:keyv", - "target": "npm:json-buffer", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:@nodelib/fs.walk", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:formatly", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:js-yaml@4.1.1", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:minimist", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:oxc-resolver", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:smol-toml", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:strip-json-comments@5.0.3", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "npm:lazystream", - "target": "npm:readable-stream@2.3.8", - "type": "static" - }, - { - "source": "npm:levn", - "target": "npm:prelude-ls", - "type": "static" - }, - { - "source": "npm:levn", - "target": "npm:type-check", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:detect-libc@2.1.2", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-android-arm64", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-darwin-arm64", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-darwin-x64", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-freebsd-x64", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-win32-x64-msvc", - "type": "static" - }, - { - "source": "npm:linkify-it", - "target": "npm:uc.micro", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:@parcel/watcher", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:@parcel/watcher-wasm", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:clipboardy", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:crossws", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:get-port-please", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:h3@1.15.4", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:http-shutdown", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:node-forge", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:pathe@1.1.2", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:std-env", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:untun", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:uqr", - "type": "static" - }, - { - "source": "npm:local-pkg@0.5.1", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:local-pkg@0.5.1", - "target": "npm:pkg-types@1.3.1", - "type": "static" - }, - { - "source": "npm:local-pkg@1.1.2", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:local-pkg@1.1.2", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:local-pkg@1.1.2", - "target": "npm:quansync", - "type": "static" - }, - { - "source": "npm:locate-path@5.0.0", - "target": "npm:p-locate@4.1.0", - "type": "static" - }, - { - "source": "npm:locate-path@6.0.0", - "target": "npm:p-locate@5.0.0", - "type": "static" - }, - { - "source": "npm:log-symbols", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:log-symbols", - "target": "npm:is-unicode-supported", - "type": "static" - }, - { - "source": "npm:lowlight", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:lowlight", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:lowlight", - "target": "npm:highlight.js", - "type": "static" - }, - { - "source": "npm:lru-cache@5.1.1", - "target": "npm:yallist@3.1.1", - "type": "static" - }, - { - "source": "npm:lru-cache@6.0.0", - "target": "npm:yallist@4.0.0", - "type": "static" - }, - { - "source": "npm:lucide-react", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:magic-string", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - }, - { - "source": "npm:magicast", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:magicast", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:magicast", - "target": "npm:source-map-js", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:argparse@2.0.1", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:entities@4.5.0", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:linkify-it", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:mdurl", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:punycode.js", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:uc.micro", - "type": "static" - }, - { - "source": "npm:markdown-link-extractor", - "target": "npm:html-link-extractor", - "type": "static" - }, - { - "source": "npm:markdown-link-extractor", - "target": "npm:marked", - "type": "static" - }, - { - "source": "npm:mdast-util-find-and-replace", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-find-and-replace", - "target": "npm:escape-string-regexp@5.0.0", - "type": "static" - }, - { - "source": "npm:mdast-util-find-and-replace", - "target": "npm:unist-util-is", - "type": "static" - }, - { - "source": "npm:mdast-util-find-and-replace", - "target": "npm:unist-util-visit-parents", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:mdast-util-to-string", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-decode-numeric-character-reference", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-decode-string", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:unist-util-stringify-position", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:ccount", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:mdast-util-find-and-replace", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-strikethrough", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-strikethrough", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-strikethrough", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:markdown-table", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-task-list-item", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-task-list-item", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-task-list-item", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-task-list-item", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-autolink-literal", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-footnote", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-strikethrough", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-table", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-task-list-item", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:@types/estree-jsx", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:@types/estree-jsx", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:ccount", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:parse-entities", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:stringify-entities", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:unist-util-stringify-position", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:vfile-message", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:@types/estree-jsx", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-phrasing", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-phrasing", - "target": "npm:unist-util-is", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:@ungap/structured-clone", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:micromark-util-sanitize-uri", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:trim-lines", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:unist-util-position", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:longest-streak", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:mdast-util-phrasing", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:mdast-util-to-string", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:micromark-util-classify-character", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:micromark-util-decode-string", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:zwitch", - "type": "static" - }, - { - "source": "npm:mdast-util-to-string", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:merge-anything", - "target": "npm:is-what", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-destination", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-label", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-title", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-whitespace", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-classify-character", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-html-tag-name", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-resolve-all", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-subtokenize", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-autolink-literal", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-autolink-literal", - "target": "npm:micromark-util-sanitize-uri", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-autolink-literal", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-autolink-literal", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-core-commonmark", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-sanitize-uri", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-classify-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-resolve-all", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-tagfilter", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-autolink-literal", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-footnote", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-strikethrough", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-table", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-tagfilter", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-task-list-item", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-util-combine-extensions", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-factory-destination", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-destination", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-factory-destination", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-factory-label", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-factory-label", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-label", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-factory-label", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-factory-space", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-space", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-factory-title", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-factory-title", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-title", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-factory-title", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-factory-whitespace", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-factory-whitespace", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-whitespace", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-factory-whitespace", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-util-character", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-character", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-util-chunked", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-classify-character", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-util-classify-character", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-classify-character", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-util-combine-extensions", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark-util-combine-extensions", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-util-decode-numeric-character-reference", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-decode-string", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:micromark-util-decode-string", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-util-decode-string", - "target": "npm:micromark-util-decode-numeric-character-reference", - "type": "static" - }, - { - "source": "npm:micromark-util-decode-string", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-normalize-identifier", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-resolve-all", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark-util-sanitize-uri", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-util-sanitize-uri", - "target": "npm:micromark-util-encode", - "type": "static" - }, - { - "source": "npm:micromark-util-sanitize-uri", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-subtokenize", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-util-subtokenize", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark-util-subtokenize", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-subtokenize", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:@types/debug", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-core-commonmark", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-combine-extensions", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-decode-numeric-character-reference", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-encode", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-resolve-all", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-sanitize-uri", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-subtokenize", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:micromatch", - "target": "npm:braces", - "type": "static" - }, - { - "source": "npm:micromatch", - "target": "npm:picomatch@2.3.1", - "type": "static" - }, - { - "source": "npm:mime-types@2.1.35", - "target": "npm:mime-db@1.52.0", - "type": "static" - }, - { - "source": "npm:mime-types@3.0.1", - "target": "npm:mime-db@1.54.0", - "type": "static" - }, - { - "source": "npm:minimatch@3.0.8", - "target": "npm:brace-expansion@1.1.12", - "type": "static" - }, - { - "source": "npm:minimatch@3.1.2", - "target": "npm:brace-expansion@1.1.12", - "type": "static" - }, - { - "source": "npm:minimatch@5.1.6", - "target": "npm:brace-expansion@2.0.2", - "type": "static" - }, - { - "source": "npm:minimatch@9.0.3", - "target": "npm:brace-expansion@2.0.2", - "type": "static" - }, - { - "source": "npm:minimatch@9.0.5", - "target": "npm:brace-expansion@2.0.2", - "type": "static" - }, - { - "source": "npm:minizlib", - "target": "npm:minipass", - "type": "static" - }, - { - "source": "npm:mlly", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:mlly", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:mlly", - "target": "npm:pkg-types@1.3.1", - "type": "static" - }, - { - "source": "npm:mlly", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:nanospinner", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@cloudflare/kv-asset-handler", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-alias", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-commonjs", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-inject", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-json", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-node-resolve", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-replace", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-terser", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@vercel/nft", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:archiver", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:c12", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:chokidar@4.0.3", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:compatx", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:confbox@0.2.2", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:cookie-es@2.0.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:croner", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:crossws", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:db0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:dot-prop@10.1.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:esbuild", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:escape-string-regexp@5.0.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:etag", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:exsolve", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:globby@15.0.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:gzip-size", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:h3@1.15.4", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:hookable", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:httpxy", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ioredis", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:klona", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:knitwork", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:listhen", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:magicast", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:mime@4.1.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:node-fetch-native", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:node-mock-http", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ofetch", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ohash", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:perfect-debounce", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:pretty-bytes", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:radix3", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:rollup-plugin-visualizer", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:scule", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:serve-placeholder", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:serve-static", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:source-map@0.7.6", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:std-env", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ultrahtml", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:uncrypto", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unctx", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unenv", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unimport", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unplugin-utils", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unstorage", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:untyped", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unwasm", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:youch", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:youch-core", - "type": "static" - }, - { - "source": "npm:node-fetch@2.7.0", - "target": "npm:whatwg-url@5.0.0", - "type": "static" - }, - { - "source": "npm:node-fetch@3.3.2", - "target": "npm:data-uri-to-buffer", - "type": "static" - }, - { - "source": "npm:node-fetch@3.3.2", - "target": "npm:fetch-blob", - "type": "static" - }, - { - "source": "npm:node-fetch@3.3.2", - "target": "npm:formdata-polyfill", - "type": "static" - }, - { - "source": "npm:nopt", - "target": "npm:abbrev", - "type": "static" - }, - { - "source": "npm:npm-run-path@4.0.1", - "target": "npm:path-key@3.1.1", - "type": "static" - }, - { - "source": "npm:npm-run-path@5.3.0", - "target": "npm:path-key@4.0.0", - "type": "static" - }, - { - "source": "npm:nth-check", - "target": "npm:boolbase", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@napi-rs/wasm-runtime@0.2.4", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@yarnpkg/lockfile", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@yarnpkg/parsers", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@zkochan/js-yaml", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:axios", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:cli-cursor", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:cli-spinners", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:cliui", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:dotenv@16.4.7", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:dotenv-expand", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:enquirer@2.3.6", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:figures", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:flat", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:front-matter", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:ignore@7.0.5", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:jest-diff", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:jsonc-parser", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:lines-and-columns", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:minimatch@9.0.3", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:node-machine-id", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:npm-run-path@4.0.1", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:open", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:ora", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:resolve.exports", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tar-stream@2.2.0", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tmp", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tree-kill", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tsconfig-paths", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:yaml", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:yargs", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:yargs-parser", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-darwin-arm64", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-darwin-x64", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-freebsd-x64", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-win32-x64-msvc", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:tinyexec@1.0.1", - "type": "static" - }, - { - "source": "npm:ofetch", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:ofetch", - "target": "npm:node-fetch-native", - "type": "static" - }, - { - "source": "npm:ofetch", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:ollama", - "target": "npm:whatwg-fetch", - "type": "static" - }, - { - "source": "npm:on-finished", - "target": "npm:ee-first", - "type": "static" - }, - { - "source": "npm:once", - "target": "npm:wrappy", - "type": "static" - }, - { - "source": "npm:onetime@5.1.2", - "target": "npm:mimic-fn@2.1.0", - "type": "static" - }, - { - "source": "npm:onetime@6.0.0", - "target": "npm:mimic-fn@4.0.0", - "type": "static" - }, - { - "source": "npm:open", - "target": "npm:define-lazy-prop", - "type": "static" - }, - { - "source": "npm:open", - "target": "npm:is-docker@2.2.1", - "type": "static" - }, - { - "source": "npm:open", - "target": "npm:is-wsl@2.2.0", - "type": "static" - }, - { - "source": "npm:openai", - "target": "npm:ws", - "type": "static" - }, - { - "source": "npm:openai", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:deep-is", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:fast-levenshtein", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:levn", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:prelude-ls", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:type-check", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:word-wrap", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:bl", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:cli-cursor", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:cli-spinners", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:is-interactive", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:log-symbols", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:wcwidth", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-android-arm-eabi", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-android-arm64", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-darwin-arm64", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-darwin-x64", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-freebsd-x64", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-arm-musleabihf", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-ppc64-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-riscv64-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-riscv64-musl", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-s390x-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-wasm32-wasi", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-win32-ia32-msvc", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-win32-x64-msvc", - "type": "static" - }, - { - "source": "npm:p-filter", - "target": "npm:p-map", - "type": "static" - }, - { - "source": "npm:p-limit@2.3.0", - "target": "npm:p-try", - "type": "static" - }, - { - "source": "npm:p-limit@3.1.0", - "target": "npm:yocto-queue", - "type": "static" - }, - { - "source": "npm:p-locate@4.1.0", - "target": "npm:p-limit@2.3.0", - "type": "static" - }, - { - "source": "npm:p-locate@5.0.0", - "target": "npm:p-limit@3.1.0", - "type": "static" - }, - { - "source": "npm:package-manager-detector@0.2.11", - "target": "npm:quansync", - "type": "static" - }, - { - "source": "npm:parent-module", - "target": "npm:callsites", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:@types/unist@2.0.11", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:character-entities-legacy", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:character-reference-invalid", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:is-alphanumerical", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:is-decimal", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:is-hexadecimal", - "type": "static" - }, - { - "source": "npm:parse5-htmlparser2-tree-adapter", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:parse5-htmlparser2-tree-adapter", - "target": "npm:parse5@7.3.0", - "type": "static" - }, - { - "source": "npm:parse5-parser-stream", - "target": "npm:parse5@7.3.0", - "type": "static" - }, - { - "source": "npm:parse5@7.3.0", - "target": "npm:entities@6.0.1", - "type": "static" - }, - { - "source": "npm:parse5@8.0.0", - "target": "npm:entities@6.0.1", - "type": "static" - }, - { - "source": "npm:path-scurry", - "target": "npm:lru-cache@10.4.3", - "type": "static" - }, - { - "source": "npm:path-scurry", - "target": "npm:minipass", - "type": "static" - }, - { - "source": "npm:pkg-types@1.3.1", - "target": "npm:confbox@0.1.8", - "type": "static" - }, - { - "source": "npm:pkg-types@1.3.1", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:pkg-types@1.3.1", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:pkg-types@2.3.0", - "target": "npm:confbox@0.2.2", - "type": "static" - }, - { - "source": "npm:pkg-types@2.3.0", - "target": "npm:exsolve", - "type": "static" - }, - { - "source": "npm:pkg-types@2.3.0", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:postcss", - "target": "npm:nanoid@3.3.11", - "type": "static" - }, - { - "source": "npm:postcss", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:postcss", - "target": "npm:source-map-js", - "type": "static" - }, - { - "source": "npm:prettier-plugin-svelte", - "target": "npm:prettier", - "type": "static" - }, - { - "source": "npm:prettier-plugin-svelte", - "target": "npm:svelte", - "type": "static" - }, - { - "source": "npm:pretty-format@27.5.1", - "target": "npm:ansi-regex@5.0.1", - "type": "static" - }, - { - "source": "npm:pretty-format@27.5.1", - "target": "npm:ansi-styles@5.2.0", - "type": "static" - }, - { - "source": "npm:pretty-format@27.5.1", - "target": "npm:react-is@17.0.2", - "type": "static" - }, - { - "source": "npm:pretty-format@30.2.0", - "target": "npm:@jest/schemas", - "type": "static" - }, - { - "source": "npm:pretty-format@30.2.0", - "target": "npm:ansi-styles@5.2.0", - "type": "static" - }, - { - "source": "npm:pretty-format@30.2.0", - "target": "npm:react-is@18.3.1", - "type": "static" - }, - { - "source": "npm:publint", - "target": "npm:@publint/pack", - "type": "static" - }, - { - "source": "npm:publint", - "target": "npm:package-manager-detector@1.5.0", - "type": "static" - }, - { - "source": "npm:publint", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:publint", - "target": "npm:sade", - "type": "static" - }, - { - "source": "npm:randombytes", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - }, - { - "source": "npm:rc9", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:rc9", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:react-dom", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:react-dom", - "target": "npm:scheduler", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:hast-util-to-jsx-runtime", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:html-url-attributes", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:mdast-util-to-hast", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:remark-parse", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:remark-rehype", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:unified", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:read-yaml-file", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:read-yaml-file", - "target": "npm:js-yaml@3.14.1", - "type": "static" - }, - { - "source": "npm:read-yaml-file", - "target": "npm:pify", - "type": "static" - }, - { - "source": "npm:read-yaml-file", - "target": "npm:strip-bom", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:core-util-is", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:isarray", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:process-nextick-args", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:safe-buffer@5.1.2", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:string_decoder@1.1.1", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:util-deprecate", - "type": "static" - }, - { - "source": "npm:readable-stream@3.6.2", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:readable-stream@3.6.2", - "target": "npm:string_decoder@1.3.0", - "type": "static" - }, - { - "source": "npm:readable-stream@3.6.2", - "target": "npm:util-deprecate", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:abort-controller", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:buffer@6.0.3", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:events", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:process", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:string_decoder@1.3.0", - "type": "static" - }, - { - "source": "npm:readdir-glob", - "target": "npm:minimatch@5.1.6", - "type": "static" - }, - { - "source": "npm:readdirp@3.6.0", - "target": "npm:picomatch@2.3.1", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:ast-types", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:esprima", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:source-map@0.6.1", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:redent", - "target": "npm:indent-string", - "type": "static" - }, - { - "source": "npm:redent", - "target": "npm:strip-indent", - "type": "static" - }, - { - "source": "npm:redis-parser", - "target": "npm:redis-errors", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:hast-util-to-text", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:lowlight", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:rehype-raw", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:rehype-raw", - "target": "npm:hast-util-raw", - "type": "static" - }, - { - "source": "npm:rehype-raw", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:rehype-sanitize", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:rehype-sanitize", - "target": "npm:hast-util-sanitize", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:mdast-util-gfm", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:micromark-extension-gfm", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:remark-parse", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:remark-stringify", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:unified", - "type": "static" - }, - { - "source": "npm:remark-parse", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:remark-parse", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:remark-parse", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:remark-parse", - "target": "npm:unified", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:mdast-util-to-hast", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:unified", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:remark-stringify", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:remark-stringify", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:remark-stringify", - "target": "npm:unified", - "type": "static" - }, - { - "source": "npm:resolve", - "target": "npm:is-core-module", - "type": "static" - }, - { - "source": "npm:resolve", - "target": "npm:path-parse", - "type": "static" - }, - { - "source": "npm:resolve", - "target": "npm:supports-preserve-symlinks-flag", - "type": "static" - }, - { - "source": "npm:restore-cursor", - "target": "npm:onetime@5.1.2", - "type": "static" - }, - { - "source": "npm:restore-cursor", - "target": "npm:signal-exit@3.0.7", - "type": "static" - }, - { - "source": "npm:rimraf", - "target": "npm:glob", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@oxc-project/types", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/pluginutils@1.0.0-beta.51", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-android-arm64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-darwin-arm64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-darwin-x64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-freebsd-x64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-openharmony-arm64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-wasm32-wasi", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-win32-ia32-msvc", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-win32-x64-msvc", - "type": "static" - }, - { - "source": "npm:rollup-plugin-preserve-directives", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:rollup-plugin-preserve-directives", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:rollup-plugin-preserve-directives", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:open", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:source-map@0.7.6", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:yargs", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:rolldown", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-android-arm-eabi", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-android-arm64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-darwin-arm64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-darwin-x64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-freebsd-arm64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-freebsd-x64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-arm-musleabihf", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-loong64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-ppc64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-riscv64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-riscv64-musl", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-s390x-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-openharmony-arm64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-win32-ia32-msvc", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-win32-x64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-win32-x64-msvc", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:fsevents", - "type": "static" - }, - { - "source": "npm:run-parallel", - "target": "npm:queue-microtask", - "type": "static" - }, - { - "source": "npm:sade", - "target": "npm:mri", - "type": "static" - }, - { - "source": "npm:saxes", - "target": "npm:xmlchars", - "type": "static" - }, - { - "source": "npm:semver@7.5.4", - "target": "npm:lru-cache@6.0.0", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:encodeurl", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:escape-html", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:etag", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:fresh", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:http-errors", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:mime-types@3.0.1", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:ms", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:on-finished", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:range-parser", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:statuses@2.0.2", - "type": "static" - }, - { - "source": "npm:serialize-javascript", - "target": "npm:randombytes", - "type": "static" - }, - { - "source": "npm:seroval-plugins@1.3.3", - "target": "npm:seroval@1.3.2", - "type": "static" - }, - { - "source": "npm:seroval-plugins@1.4.0", - "target": "npm:seroval@1.4.0", - "type": "static" - }, - { - "source": "npm:serve-placeholder", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:serve-static", - "target": "npm:encodeurl", - "type": "static" - }, - { - "source": "npm:serve-static", - "target": "npm:escape-html", - "type": "static" - }, - { - "source": "npm:serve-static", - "target": "npm:parseurl", - "type": "static" - }, - { - "source": "npm:serve-static", - "target": "npm:send", - "type": "static" - }, - { - "source": "npm:shebang-command", - "target": "npm:shebang-regex", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-darwin-arm64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-darwin-x64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-linux-arm64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-linux-x64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-windows-arm64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-windows-x64", - "type": "static" - }, - { - "source": "npm:simple-git", - "target": "npm:@kwsites/file-exists", - "type": "static" - }, - { - "source": "npm:simple-git", - "target": "npm:@kwsites/promise-deferred", - "type": "static" - }, - { - "source": "npm:simple-git", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:bytes-iec", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:chokidar@4.0.3", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:lilconfig", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:nanospinner", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:solid-js", - "target": "npm:csstype@3.1.3", - "type": "static" - }, - { - "source": "npm:solid-js", - "target": "npm:seroval@1.3.2", - "type": "static" - }, - { - "source": "npm:solid-js", - "target": "npm:seroval-plugins@1.3.3", - "type": "static" - }, - { - "source": "npm:solid-refresh", - "target": "npm:@babel/generator", - "type": "static" - }, - { - "source": "npm:solid-refresh", - "target": "npm:@babel/helper-module-imports@7.27.1", - "type": "static" - }, - { - "source": "npm:solid-refresh", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:solid-refresh", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:source-map-support", - "target": "npm:buffer-from", - "type": "static" - }, - { - "source": "npm:source-map-support", - "target": "npm:source-map@0.6.1", - "type": "static" - }, - { - "source": "npm:spawndamnit", - "target": "npm:cross-spawn", - "type": "static" - }, - { - "source": "npm:spawndamnit", - "target": "npm:signal-exit@4.1.0", - "type": "static" - }, - { - "source": "npm:streamx", - "target": "npm:events-universal", - "type": "static" - }, - { - "source": "npm:streamx", - "target": "npm:fast-fifo", - "type": "static" - }, - { - "source": "npm:streamx", - "target": "npm:text-decoder", - "type": "static" - }, - { - "source": "npm:string-width@4.2.3", - "target": "npm:emoji-regex@8.0.0", - "type": "static" - }, - { - "source": "npm:string-width@4.2.3", - "target": "npm:is-fullwidth-code-point", - "type": "static" - }, - { - "source": "npm:string-width@4.2.3", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:string-width-cjs", - "target": "npm:emoji-regex@8.0.0", - "type": "static" - }, - { - "source": "npm:string-width-cjs", - "target": "npm:is-fullwidth-code-point", - "type": "static" - }, - { - "source": "npm:string-width-cjs", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:string-width@5.1.2", - "target": "npm:eastasianwidth", - "type": "static" - }, - { - "source": "npm:string-width@5.1.2", - "target": "npm:emoji-regex@9.2.2", - "type": "static" - }, - { - "source": "npm:string-width@5.1.2", - "target": "npm:strip-ansi@7.1.2", - "type": "static" - }, - { - "source": "npm:string_decoder@1.1.1", - "target": "npm:safe-buffer@5.1.2", - "type": "static" - }, - { - "source": "npm:string_decoder@1.3.0", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - }, - { - "source": "npm:stringify-entities", - "target": "npm:character-entities-html4", - "type": "static" - }, - { - "source": "npm:stringify-entities", - "target": "npm:character-entities-legacy", - "type": "static" - }, - { - "source": "npm:strip-ansi@6.0.1", - "target": "npm:ansi-regex@5.0.1", - "type": "static" - }, - { - "source": "npm:strip-ansi-cjs", - "target": "npm:ansi-regex@5.0.1", - "type": "static" - }, - { - "source": "npm:strip-ansi@7.1.2", - "target": "npm:ansi-regex@6.2.2", - "type": "static" - }, - { - "source": "npm:strip-indent", - "target": "npm:min-indent", - "type": "static" - }, - { - "source": "npm:strip-literal", - "target": "npm:js-tokens@9.0.1", - "type": "static" - }, - { - "source": "npm:style-to-js", - "target": "npm:style-to-object", - "type": "static" - }, - { - "source": "npm:style-to-object", - "target": "npm:inline-style-parser", - "type": "static" - }, - { - "source": "npm:supports-color@7.2.0", - "target": "npm:has-flag", - "type": "static" - }, - { - "source": "npm:supports-color@8.1.1", - "target": "npm:has-flag", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:@jridgewell/remapping", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:@sveltejs/acorn-typescript", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:aria-query@5.3.2", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:axobject-query", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:devalue", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:esm-env", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:esrap", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:is-reference@3.0.3", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:locate-character", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:zimmerframe", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:bl", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:end-of-stream", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:fs-constants", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:readable-stream@3.6.2", - "type": "static" - }, - { - "source": "npm:tar-stream@3.1.7", - "target": "npm:b4a", - "type": "static" - }, - { - "source": "npm:tar-stream@3.1.7", - "target": "npm:fast-fifo", - "type": "static" - }, - { - "source": "npm:tar-stream@3.1.7", - "target": "npm:streamx", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:@isaacs/fs-minipass", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:chownr", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:minipass", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:minizlib", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:yallist@5.0.0", - "type": "static" - }, - { - "source": "npm:terser", - "target": "npm:@jridgewell/source-map", - "type": "static" - }, - { - "source": "npm:terser", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:terser", - "target": "npm:commander", - "type": "static" - }, - { - "source": "npm:terser", - "target": "npm:source-map-support", - "type": "static" - }, - { - "source": "npm:text-decoder", - "target": "npm:b4a", - "type": "static" - }, - { - "source": "npm:tinyglobby", - "target": "npm:fdir", - "type": "static" - }, - { - "source": "npm:tinyglobby", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:tldts", - "target": "npm:tldts-core", - "type": "static" - }, - { - "source": "npm:to-regex-range", - "target": "npm:is-number", - "type": "static" - }, - { - "source": "npm:tough-cookie", - "target": "npm:tldts", - "type": "static" - }, - { - "source": "npm:tr46@6.0.0", - "target": "npm:punycode", - "type": "static" - }, - { - "source": "npm:ts-api-utils", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:ts-declaration-location", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:ts-declaration-location", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:tsconfck", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:tsconfig-paths", - "target": "npm:json5", - "type": "static" - }, - { - "source": "npm:tsconfig-paths", - "target": "npm:minimist", - "type": "static" - }, - { - "source": "npm:tsconfig-paths", - "target": "npm:strip-bom", - "type": "static" - }, - { - "source": "npm:tsx", - "target": "npm:esbuild", - "type": "static" - }, - { - "source": "npm:tsx", - "target": "npm:get-tsconfig", - "type": "static" - }, - { - "source": "npm:tsx", - "target": "npm:fsevents", - "type": "static" - }, - { - "source": "npm:type-check", - "target": "npm:prelude-ls", - "type": "static" - }, - { - "source": "npm:type-fest", - "target": "npm:tagged-tag", - "type": "static" - }, - { - "source": "npm:typedoc-plugin-frontmatter", - "target": "npm:typedoc-plugin-markdown", - "type": "static" - }, - { - "source": "npm:typedoc-plugin-frontmatter", - "target": "npm:yaml", - "type": "static" - }, - { - "source": "npm:typedoc-plugin-markdown", - "target": "npm:typedoc", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:@gerrit0/mini-shiki", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:lunr", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:markdown-it", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:yaml", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:@typescript-eslint/eslint-plugin", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:@typescript-eslint/parser", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:@typescript-eslint/typescript-estree@8.46.3", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:@typescript-eslint/utils@8.46.3", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:unctx", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:unctx", - "target": "npm:estree-walker@3.0.3", - "type": "static" - }, - { - "source": "npm:unctx", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:unctx", - "target": "npm:unplugin", - "type": "static" - }, - { - "source": "npm:unenv", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:bail", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:extend", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:is-plain-obj", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:trough", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:escape-string-regexp@5.0.0", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:estree-walker@3.0.3", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:local-pkg@1.1.2", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:scule", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:strip-literal", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:unplugin", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:unplugin-utils", - "type": "static" - }, - { - "source": "npm:unist-util-find-after", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-find-after", - "target": "npm:unist-util-is", - "type": "static" - }, - { - "source": "npm:unist-util-is", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-position", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-stringify-position", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-visit-parents", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-visit-parents", - "target": "npm:unist-util-is", - "type": "static" - }, - { - "source": "npm:unist-util-visit", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-visit", - "target": "npm:unist-util-is", - "type": "static" - }, - { - "source": "npm:unist-util-visit", - "target": "npm:unist-util-visit-parents", - "type": "static" - }, - { - "source": "npm:unplugin-utils", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:unplugin-utils", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:unplugin", - "target": "npm:@jridgewell/remapping", - "type": "static" - }, - { - "source": "npm:unplugin", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:unplugin", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:unplugin", - "target": "npm:webpack-virtual-modules", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:napi-postinstall", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-android-arm-eabi", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-android-arm64", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-darwin-arm64", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-darwin-x64", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-freebsd-x64", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-arm-musleabihf", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-ppc64-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-riscv64-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-riscv64-musl", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-s390x-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-wasm32-wasi", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-win32-ia32-msvc", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-win32-x64-msvc", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:anymatch", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:chokidar@4.0.3", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:h3@1.15.4", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:lru-cache@10.4.3", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:node-fetch-native", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:ofetch", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:db0", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:ioredis", - "type": "static" - }, - { - "source": "npm:untun", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:untun", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:untun", - "target": "npm:pathe@1.1.2", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:knitwork", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:scule", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:knitwork", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:unplugin", - "type": "static" - }, - { - "source": "npm:update-browserslist-db", - "target": "npm:browserslist", - "type": "static" - }, - { - "source": "npm:update-browserslist-db", - "target": "npm:escalade", - "type": "static" - }, - { - "source": "npm:update-browserslist-db", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:uri-js", - "target": "npm:punycode", - "type": "static" - }, - { - "source": "npm:use-sync-external-store", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:vfile-location", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:vfile-location", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:vfile-message", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:vfile-message", - "target": "npm:unist-util-stringify-position", - "type": "static" - }, - { - "source": "npm:vfile", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:vfile", - "target": "npm:vfile-message", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:@microsoft/api-extractor", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:@volar/typescript", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:@vue/language-core", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:compare-versions", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:kolorist", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:local-pkg@0.5.1", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:vite-plugin-externalize-deps", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:@types/babel__core", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:babel-preset-solid", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:merge-anything", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:solid-refresh", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:vitefu", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:@testing-library/jest-dom", - "type": "static" - }, - { - "source": "npm:vite-tsconfig-paths", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:vite-tsconfig-paths", - "target": "npm:globrex", - "type": "static" - }, - { - "source": "npm:vite-tsconfig-paths", - "target": "npm:tsconfck", - "type": "static" - }, - { - "source": "npm:vite-tsconfig-paths", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:esbuild", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:fdir", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:postcss", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:fsevents", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:lightningcss", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:terser", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:tsx", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:yaml", - "type": "static" - }, - { - "source": "npm:vitefu", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/expect", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/mocker", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/pretty-format", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/runner", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/snapshot", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/spy", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/utils", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:es-module-lexer", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:expect-type", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:obug", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:std-env", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:tinybench", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:tinyexec@0.3.2", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:tinyrainbow", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:why-is-node-running", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:happy-dom", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:jsdom", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:eslint-scope", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:espree", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:esquery", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:w3c-xmlserializer", - "target": "npm:xml-name-validator", - "type": "static" - }, - { - "source": "npm:wcwidth", - "target": "npm:defaults", - "type": "static" - }, - { - "source": "npm:whatwg-encoding", - "target": "npm:iconv-lite@0.6.3", - "type": "static" - }, - { - "source": "npm:whatwg-url@15.1.0", - "target": "npm:tr46@6.0.0", - "type": "static" - }, - { - "source": "npm:whatwg-url@15.1.0", - "target": "npm:webidl-conversions@8.0.0", - "type": "static" - }, - { - "source": "npm:whatwg-url@5.0.0", - "target": "npm:tr46@0.0.3", - "type": "static" - }, - { - "source": "npm:whatwg-url@5.0.0", - "target": "npm:webidl-conversions@3.0.1", - "type": "static" - }, - { - "source": "npm:which", - "target": "npm:isexe", - "type": "static" - }, - { - "source": "npm:why-is-node-running", - "target": "npm:siginfo", - "type": "static" - }, - { - "source": "npm:why-is-node-running", - "target": "npm:stackback", - "type": "static" - }, - { - "source": "npm:wrap-ansi@7.0.0", - "target": "npm:ansi-styles@4.3.0", - "type": "static" - }, - { - "source": "npm:wrap-ansi@7.0.0", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:wrap-ansi@7.0.0", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:wrap-ansi-cjs", - "target": "npm:ansi-styles@4.3.0", - "type": "static" - }, - { - "source": "npm:wrap-ansi-cjs", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:wrap-ansi-cjs", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:wrap-ansi@8.1.0", - "target": "npm:ansi-styles@6.2.3", - "type": "static" - }, - { - "source": "npm:wrap-ansi@8.1.0", - "target": "npm:string-width@5.1.2", - "type": "static" - }, - { - "source": "npm:wrap-ansi@8.1.0", - "target": "npm:strip-ansi@7.1.2", - "type": "static" - }, - { - "source": "npm:xmlbuilder2", - "target": "npm:@oozcitak/dom", - "type": "static" - }, - { - "source": "npm:xmlbuilder2", - "target": "npm:@oozcitak/infra", - "type": "static" - }, - { - "source": "npm:xmlbuilder2", - "target": "npm:@oozcitak/util", - "type": "static" - }, - { - "source": "npm:xmlbuilder2", - "target": "npm:js-yaml@4.1.1", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:cliui", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:escalade", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:get-caller-file", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:require-directory", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:y18n", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:yargs-parser", - "type": "static" - }, - { - "source": "npm:youch-core", - "target": "npm:@poppinss/exception", - "type": "static" - }, - { - "source": "npm:youch-core", - "target": "npm:error-stack-parser-es", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:@poppinss/colors", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:@poppinss/dumper", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:@speed-highlight/core", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:cookie", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:youch-core", - "type": "static" - }, - { - "source": "npm:zip-stream", - "target": "npm:archiver-utils", - "type": "static" - }, - { - "source": "npm:zip-stream", - "target": "npm:compress-commons", - "type": "static" - }, - { - "source": "npm:zip-stream", - "target": "npm:readable-stream@4.7.0", - "type": "static" - }, - { - "source": "npm:zod-validation-error@3.5.4", - "target": "npm:zod@3.25.76", - "type": "static" - }, - { - "source": "npm:zod-validation-error@4.0.2", - "target": "npm:zod@4.1.13", - "type": "static" - } -] \ No newline at end of file diff --git a/.nx/workspace-data/parsed-lock-file.nodes.json b/.nx/workspace-data/parsed-lock-file.nodes.json deleted file mode 100644 index 3c615ac4b..000000000 --- a/.nx/workspace-data/parsed-lock-file.nodes.json +++ /dev/null @@ -1,15406 +0,0 @@ -{ - "nodes": { - "npm:@acemir/cssom": { - "type": "npm", - "name": "npm:@acemir/cssom", - "data": { - "version": "0.9.24", - "packageName": "@acemir/cssom", - "hash": "sha512-5YjgMmAiT2rjJZU7XK1SNI7iqTy92DpaYVgG6x63FxkJ11UpYfLndHJATtinWJClAXiOlW9XWaUyAQf8pMrQPg==" - } - }, - "npm:@adobe/css-tools": { - "type": "npm", - "name": "npm:@adobe/css-tools", - "data": { - "version": "4.4.4", - "packageName": "@adobe/css-tools", - "hash": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==" - } - }, - "npm:@ai-sdk/openai": { - "type": "npm", - "name": "npm:@ai-sdk/openai", - "data": { - "version": "2.0.73", - "packageName": "@ai-sdk/openai", - "hash": "sha512-TOGoxkeJMgcxq80ZfyCAqKcfvGPgFsEQEK8SgI/w3He0fqi16KlnZVMexOlg8HOLumF6szweg/YrOmQixsPVGw==" - } - }, - "npm:@ai-sdk/provider-utils": { - "type": "npm", - "name": "npm:@ai-sdk/provider-utils", - "data": { - "version": "3.0.17", - "packageName": "@ai-sdk/provider-utils", - "hash": "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==" - } - }, - "npm:@ai-sdk/provider": { - "type": "npm", - "name": "npm:@ai-sdk/provider", - "data": { - "version": "2.0.0", - "packageName": "@ai-sdk/provider", - "hash": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==" - } - }, - "npm:@anthropic-ai/sdk": { - "type": "npm", - "name": "npm:@anthropic-ai/sdk", - "data": { - "version": "0.71.0", - "packageName": "@anthropic-ai/sdk", - "hash": "sha512-go1XeWXmpxuiTkosSXpb8tokLk2ZLkIRcXpbWVwJM6gH5OBtHOVsfPfGuqI1oW7RRt4qc59EmYbrXRZ0Ng06Jw==" - } - }, - "npm:@asamuzakjp/css-color": { - "type": "npm", - "name": "npm:@asamuzakjp/css-color", - "data": { - "version": "4.0.5", - "packageName": "@asamuzakjp/css-color", - "hash": "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==" - } - }, - "npm:@asamuzakjp/dom-selector": { - "type": "npm", - "name": "npm:@asamuzakjp/dom-selector", - "data": { - "version": "6.7.4", - "packageName": "@asamuzakjp/dom-selector", - "hash": "sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==" - } - }, - "npm:@asamuzakjp/nwsapi": { - "type": "npm", - "name": "npm:@asamuzakjp/nwsapi", - "data": { - "version": "2.3.9", - "packageName": "@asamuzakjp/nwsapi", - "hash": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==" - } - }, - "npm:@babel/code-frame@7.26.2": { - "type": "npm", - "name": "npm:@babel/code-frame@7.26.2", - "data": { - "version": "7.26.2", - "packageName": "@babel/code-frame", - "hash": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==" - } - }, - "npm:@babel/code-frame@7.27.1": { - "type": "npm", - "name": "npm:@babel/code-frame@7.27.1", - "data": { - "version": "7.27.1", - "packageName": "@babel/code-frame", - "hash": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==" - } - }, - "npm:@babel/compat-data": { - "type": "npm", - "name": "npm:@babel/compat-data", - "data": { - "version": "7.28.5", - "packageName": "@babel/compat-data", - "hash": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==" - } - }, - "npm:@babel/core": { - "type": "npm", - "name": "npm:@babel/core", - "data": { - "version": "7.28.5", - "packageName": "@babel/core", - "hash": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==" - } - }, - "npm:@babel/generator": { - "type": "npm", - "name": "npm:@babel/generator", - "data": { - "version": "7.28.5", - "packageName": "@babel/generator", - "hash": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==" - } - }, - "npm:@babel/helper-annotate-as-pure": { - "type": "npm", - "name": "npm:@babel/helper-annotate-as-pure", - "data": { - "version": "7.27.3", - "packageName": "@babel/helper-annotate-as-pure", - "hash": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==" - } - }, - "npm:@babel/helper-compilation-targets": { - "type": "npm", - "name": "npm:@babel/helper-compilation-targets", - "data": { - "version": "7.27.2", - "packageName": "@babel/helper-compilation-targets", - "hash": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==" - } - }, - "npm:@babel/helper-create-class-features-plugin": { - "type": "npm", - "name": "npm:@babel/helper-create-class-features-plugin", - "data": { - "version": "7.28.5", - "packageName": "@babel/helper-create-class-features-plugin", - "hash": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==" - } - }, - "npm:@babel/helper-globals": { - "type": "npm", - "name": "npm:@babel/helper-globals", - "data": { - "version": "7.28.0", - "packageName": "@babel/helper-globals", - "hash": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" - } - }, - "npm:@babel/helper-member-expression-to-functions": { - "type": "npm", - "name": "npm:@babel/helper-member-expression-to-functions", - "data": { - "version": "7.28.5", - "packageName": "@babel/helper-member-expression-to-functions", - "hash": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==" - } - }, - "npm:@babel/helper-module-imports@7.18.6": { - "type": "npm", - "name": "npm:@babel/helper-module-imports@7.18.6", - "data": { - "version": "7.18.6", - "packageName": "@babel/helper-module-imports", - "hash": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==" - } - }, - "npm:@babel/helper-module-imports@7.27.1": { - "type": "npm", - "name": "npm:@babel/helper-module-imports@7.27.1", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-module-imports", - "hash": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==" - } - }, - "npm:@babel/helper-module-transforms": { - "type": "npm", - "name": "npm:@babel/helper-module-transforms", - "data": { - "version": "7.28.3", - "packageName": "@babel/helper-module-transforms", - "hash": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==" - } - }, - "npm:@babel/helper-optimise-call-expression": { - "type": "npm", - "name": "npm:@babel/helper-optimise-call-expression", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-optimise-call-expression", - "hash": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==" - } - }, - "npm:@babel/helper-plugin-utils": { - "type": "npm", - "name": "npm:@babel/helper-plugin-utils", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-plugin-utils", - "hash": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" - } - }, - "npm:@babel/helper-replace-supers": { - "type": "npm", - "name": "npm:@babel/helper-replace-supers", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-replace-supers", - "hash": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==" - } - }, - "npm:@babel/helper-skip-transparent-expression-wrappers": { - "type": "npm", - "name": "npm:@babel/helper-skip-transparent-expression-wrappers", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-skip-transparent-expression-wrappers", - "hash": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==" - } - }, - "npm:@babel/helper-string-parser": { - "type": "npm", - "name": "npm:@babel/helper-string-parser", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-string-parser", - "hash": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" - } - }, - "npm:@babel/helper-validator-identifier@7.27.1": { - "type": "npm", - "name": "npm:@babel/helper-validator-identifier@7.27.1", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-validator-identifier", - "hash": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" - } - }, - "npm:@babel/helper-validator-identifier@7.28.5": { - "type": "npm", - "name": "npm:@babel/helper-validator-identifier@7.28.5", - "data": { - "version": "7.28.5", - "packageName": "@babel/helper-validator-identifier", - "hash": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" - } - }, - "npm:@babel/helper-validator-option": { - "type": "npm", - "name": "npm:@babel/helper-validator-option", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-validator-option", - "hash": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" - } - }, - "npm:@babel/helpers": { - "type": "npm", - "name": "npm:@babel/helpers", - "data": { - "version": "7.28.4", - "packageName": "@babel/helpers", - "hash": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==" - } - }, - "npm:@babel/parser@7.28.4": { - "type": "npm", - "name": "npm:@babel/parser@7.28.4", - "data": { - "version": "7.28.4", - "packageName": "@babel/parser", - "hash": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==" - } - }, - "npm:@babel/parser@7.28.5": { - "type": "npm", - "name": "npm:@babel/parser@7.28.5", - "data": { - "version": "7.28.5", - "packageName": "@babel/parser", - "hash": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==" - } - }, - "npm:@babel/plugin-proposal-private-methods": { - "type": "npm", - "name": "npm:@babel/plugin-proposal-private-methods", - "data": { - "version": "7.18.6", - "packageName": "@babel/plugin-proposal-private-methods", - "hash": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==" - } - }, - "npm:@babel/plugin-syntax-jsx": { - "type": "npm", - "name": "npm:@babel/plugin-syntax-jsx", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-syntax-jsx", - "hash": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==" - } - }, - "npm:@babel/plugin-syntax-typescript": { - "type": "npm", - "name": "npm:@babel/plugin-syntax-typescript", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-syntax-typescript", - "hash": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==" - } - }, - "npm:@babel/plugin-transform-modules-commonjs": { - "type": "npm", - "name": "npm:@babel/plugin-transform-modules-commonjs", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-transform-modules-commonjs", - "hash": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==" - } - }, - "npm:@babel/plugin-transform-react-jsx-self": { - "type": "npm", - "name": "npm:@babel/plugin-transform-react-jsx-self", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-transform-react-jsx-self", - "hash": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==" - } - }, - "npm:@babel/plugin-transform-react-jsx-source": { - "type": "npm", - "name": "npm:@babel/plugin-transform-react-jsx-source", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-transform-react-jsx-source", - "hash": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==" - } - }, - "npm:@babel/plugin-transform-typescript": { - "type": "npm", - "name": "npm:@babel/plugin-transform-typescript", - "data": { - "version": "7.28.5", - "packageName": "@babel/plugin-transform-typescript", - "hash": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==" - } - }, - "npm:@babel/preset-typescript": { - "type": "npm", - "name": "npm:@babel/preset-typescript", - "data": { - "version": "7.28.5", - "packageName": "@babel/preset-typescript", - "hash": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==" - } - }, - "npm:@babel/runtime": { - "type": "npm", - "name": "npm:@babel/runtime", - "data": { - "version": "7.28.4", - "packageName": "@babel/runtime", - "hash": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==" - } - }, - "npm:@babel/template": { - "type": "npm", - "name": "npm:@babel/template", - "data": { - "version": "7.27.2", - "packageName": "@babel/template", - "hash": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==" - } - }, - "npm:@babel/traverse": { - "type": "npm", - "name": "npm:@babel/traverse", - "data": { - "version": "7.28.5", - "packageName": "@babel/traverse", - "hash": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==" - } - }, - "npm:@babel/types@7.28.4": { - "type": "npm", - "name": "npm:@babel/types@7.28.4", - "data": { - "version": "7.28.4", - "packageName": "@babel/types", - "hash": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==" - } - }, - "npm:@babel/types@7.28.5": { - "type": "npm", - "name": "npm:@babel/types@7.28.5", - "data": { - "version": "7.28.5", - "packageName": "@babel/types", - "hash": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==" - } - }, - "npm:@changesets/apply-release-plan": { - "type": "npm", - "name": "npm:@changesets/apply-release-plan", - "data": { - "version": "7.0.13", - "packageName": "@changesets/apply-release-plan", - "hash": "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==" - } - }, - "npm:@changesets/assemble-release-plan": { - "type": "npm", - "name": "npm:@changesets/assemble-release-plan", - "data": { - "version": "6.0.9", - "packageName": "@changesets/assemble-release-plan", - "hash": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==" - } - }, - "npm:@changesets/changelog-git": { - "type": "npm", - "name": "npm:@changesets/changelog-git", - "data": { - "version": "0.2.1", - "packageName": "@changesets/changelog-git", - "hash": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==" - } - }, - "npm:@changesets/cli": { - "type": "npm", - "name": "npm:@changesets/cli", - "data": { - "version": "2.29.7", - "packageName": "@changesets/cli", - "hash": "sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==" - } - }, - "npm:@changesets/config": { - "type": "npm", - "name": "npm:@changesets/config", - "data": { - "version": "3.1.1", - "packageName": "@changesets/config", - "hash": "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==" - } - }, - "npm:@changesets/errors": { - "type": "npm", - "name": "npm:@changesets/errors", - "data": { - "version": "0.2.0", - "packageName": "@changesets/errors", - "hash": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==" - } - }, - "npm:@changesets/get-dependents-graph": { - "type": "npm", - "name": "npm:@changesets/get-dependents-graph", - "data": { - "version": "2.1.3", - "packageName": "@changesets/get-dependents-graph", - "hash": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==" - } - }, - "npm:@changesets/get-github-info": { - "type": "npm", - "name": "npm:@changesets/get-github-info", - "data": { - "version": "0.6.0", - "packageName": "@changesets/get-github-info", - "hash": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==" - } - }, - "npm:@changesets/get-release-plan": { - "type": "npm", - "name": "npm:@changesets/get-release-plan", - "data": { - "version": "4.0.13", - "packageName": "@changesets/get-release-plan", - "hash": "sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==" - } - }, - "npm:@changesets/get-version-range-type": { - "type": "npm", - "name": "npm:@changesets/get-version-range-type", - "data": { - "version": "0.4.0", - "packageName": "@changesets/get-version-range-type", - "hash": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==" - } - }, - "npm:@changesets/git": { - "type": "npm", - "name": "npm:@changesets/git", - "data": { - "version": "3.0.4", - "packageName": "@changesets/git", - "hash": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==" - } - }, - "npm:@changesets/logger": { - "type": "npm", - "name": "npm:@changesets/logger", - "data": { - "version": "0.1.1", - "packageName": "@changesets/logger", - "hash": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==" - } - }, - "npm:@changesets/parse": { - "type": "npm", - "name": "npm:@changesets/parse", - "data": { - "version": "0.4.1", - "packageName": "@changesets/parse", - "hash": "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==" - } - }, - "npm:@changesets/pre": { - "type": "npm", - "name": "npm:@changesets/pre", - "data": { - "version": "2.0.2", - "packageName": "@changesets/pre", - "hash": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==" - } - }, - "npm:@changesets/read": { - "type": "npm", - "name": "npm:@changesets/read", - "data": { - "version": "0.6.5", - "packageName": "@changesets/read", - "hash": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==" - } - }, - "npm:@changesets/should-skip-package": { - "type": "npm", - "name": "npm:@changesets/should-skip-package", - "data": { - "version": "0.1.2", - "packageName": "@changesets/should-skip-package", - "hash": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==" - } - }, - "npm:@changesets/types@4.1.0": { - "type": "npm", - "name": "npm:@changesets/types@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "@changesets/types", - "hash": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==" - } - }, - "npm:@changesets/types@6.1.0": { - "type": "npm", - "name": "npm:@changesets/types@6.1.0", - "data": { - "version": "6.1.0", - "packageName": "@changesets/types", - "hash": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==" - } - }, - "npm:@changesets/write": { - "type": "npm", - "name": "npm:@changesets/write", - "data": { - "version": "0.4.0", - "packageName": "@changesets/write", - "hash": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==" - } - }, - "npm:@cloudflare/kv-asset-handler": { - "type": "npm", - "name": "npm:@cloudflare/kv-asset-handler", - "data": { - "version": "0.4.0", - "packageName": "@cloudflare/kv-asset-handler", - "hash": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==" - } - }, - "npm:@commitlint/parse": { - "type": "npm", - "name": "npm:@commitlint/parse", - "data": { - "version": "20.0.0", - "packageName": "@commitlint/parse", - "hash": "sha512-j/PHCDX2bGM5xGcWObOvpOc54cXjn9g6xScXzAeOLwTsScaL4Y+qd0pFC6HBwTtrH92NvJQc+2Lx9HFkVi48cg==" - } - }, - "npm:@commitlint/types": { - "type": "npm", - "name": "npm:@commitlint/types", - "data": { - "version": "20.0.0", - "packageName": "@commitlint/types", - "hash": "sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==" - } - }, - "npm:@csstools/color-helpers": { - "type": "npm", - "name": "npm:@csstools/color-helpers", - "data": { - "version": "5.1.0", - "packageName": "@csstools/color-helpers", - "hash": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==" - } - }, - "npm:@csstools/css-calc": { - "type": "npm", - "name": "npm:@csstools/css-calc", - "data": { - "version": "2.1.4", - "packageName": "@csstools/css-calc", - "hash": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==" - } - }, - "npm:@csstools/css-color-parser": { - "type": "npm", - "name": "npm:@csstools/css-color-parser", - "data": { - "version": "3.1.0", - "packageName": "@csstools/css-color-parser", - "hash": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==" - } - }, - "npm:@csstools/css-parser-algorithms": { - "type": "npm", - "name": "npm:@csstools/css-parser-algorithms", - "data": { - "version": "3.0.5", - "packageName": "@csstools/css-parser-algorithms", - "hash": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==" - } - }, - "npm:@csstools/css-syntax-patches-for-csstree": { - "type": "npm", - "name": "npm:@csstools/css-syntax-patches-for-csstree", - "data": { - "version": "1.0.14", - "packageName": "@csstools/css-syntax-patches-for-csstree", - "hash": "sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==" - } - }, - "npm:@csstools/css-tokenizer": { - "type": "npm", - "name": "npm:@csstools/css-tokenizer", - "data": { - "version": "3.0.4", - "packageName": "@csstools/css-tokenizer", - "hash": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" - } - }, - "npm:@emnapi/core": { - "type": "npm", - "name": "npm:@emnapi/core", - "data": { - "version": "1.6.0", - "packageName": "@emnapi/core", - "hash": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==" - } - }, - "npm:@emnapi/runtime": { - "type": "npm", - "name": "npm:@emnapi/runtime", - "data": { - "version": "1.6.0", - "packageName": "@emnapi/runtime", - "hash": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==" - } - }, - "npm:@emnapi/wasi-threads": { - "type": "npm", - "name": "npm:@emnapi/wasi-threads", - "data": { - "version": "1.1.0", - "packageName": "@emnapi/wasi-threads", - "hash": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==" - } - }, - "npm:@esbuild/aix-ppc64": { - "type": "npm", - "name": "npm:@esbuild/aix-ppc64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/aix-ppc64", - "hash": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==" - } - }, - "npm:@esbuild/android-arm64": { - "type": "npm", - "name": "npm:@esbuild/android-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/android-arm64", - "hash": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==" - } - }, - "npm:@esbuild/android-arm": { - "type": "npm", - "name": "npm:@esbuild/android-arm", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/android-arm", - "hash": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==" - } - }, - "npm:@esbuild/android-x64": { - "type": "npm", - "name": "npm:@esbuild/android-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/android-x64", - "hash": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==" - } - }, - "npm:@esbuild/darwin-arm64": { - "type": "npm", - "name": "npm:@esbuild/darwin-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/darwin-arm64", - "hash": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==" - } - }, - "npm:@esbuild/darwin-x64": { - "type": "npm", - "name": "npm:@esbuild/darwin-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/darwin-x64", - "hash": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==" - } - }, - "npm:@esbuild/freebsd-arm64": { - "type": "npm", - "name": "npm:@esbuild/freebsd-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/freebsd-arm64", - "hash": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==" - } - }, - "npm:@esbuild/freebsd-x64": { - "type": "npm", - "name": "npm:@esbuild/freebsd-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/freebsd-x64", - "hash": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==" - } - }, - "npm:@esbuild/linux-arm64": { - "type": "npm", - "name": "npm:@esbuild/linux-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-arm64", - "hash": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==" - } - }, - "npm:@esbuild/linux-arm": { - "type": "npm", - "name": "npm:@esbuild/linux-arm", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-arm", - "hash": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==" - } - }, - "npm:@esbuild/linux-ia32": { - "type": "npm", - "name": "npm:@esbuild/linux-ia32", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-ia32", - "hash": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==" - } - }, - "npm:@esbuild/linux-loong64": { - "type": "npm", - "name": "npm:@esbuild/linux-loong64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-loong64", - "hash": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==" - } - }, - "npm:@esbuild/linux-mips64el": { - "type": "npm", - "name": "npm:@esbuild/linux-mips64el", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-mips64el", - "hash": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==" - } - }, - "npm:@esbuild/linux-ppc64": { - "type": "npm", - "name": "npm:@esbuild/linux-ppc64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-ppc64", - "hash": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==" - } - }, - "npm:@esbuild/linux-riscv64": { - "type": "npm", - "name": "npm:@esbuild/linux-riscv64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-riscv64", - "hash": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==" - } - }, - "npm:@esbuild/linux-s390x": { - "type": "npm", - "name": "npm:@esbuild/linux-s390x", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-s390x", - "hash": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==" - } - }, - "npm:@esbuild/linux-x64": { - "type": "npm", - "name": "npm:@esbuild/linux-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-x64", - "hash": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==" - } - }, - "npm:@esbuild/netbsd-arm64": { - "type": "npm", - "name": "npm:@esbuild/netbsd-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/netbsd-arm64", - "hash": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==" - } - }, - "npm:@esbuild/netbsd-x64": { - "type": "npm", - "name": "npm:@esbuild/netbsd-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/netbsd-x64", - "hash": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==" - } - }, - "npm:@esbuild/openbsd-arm64": { - "type": "npm", - "name": "npm:@esbuild/openbsd-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/openbsd-arm64", - "hash": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==" - } - }, - "npm:@esbuild/openbsd-x64": { - "type": "npm", - "name": "npm:@esbuild/openbsd-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/openbsd-x64", - "hash": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==" - } - }, - "npm:@esbuild/openharmony-arm64": { - "type": "npm", - "name": "npm:@esbuild/openharmony-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/openharmony-arm64", - "hash": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==" - } - }, - "npm:@esbuild/sunos-x64": { - "type": "npm", - "name": "npm:@esbuild/sunos-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/sunos-x64", - "hash": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==" - } - }, - "npm:@esbuild/win32-arm64": { - "type": "npm", - "name": "npm:@esbuild/win32-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/win32-arm64", - "hash": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==" - } - }, - "npm:@esbuild/win32-ia32": { - "type": "npm", - "name": "npm:@esbuild/win32-ia32", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/win32-ia32", - "hash": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==" - } - }, - "npm:@esbuild/win32-x64": { - "type": "npm", - "name": "npm:@esbuild/win32-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/win32-x64", - "hash": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==" - } - }, - "npm:@eslint-community/eslint-utils": { - "type": "npm", - "name": "npm:@eslint-community/eslint-utils", - "data": { - "version": "4.9.0", - "packageName": "@eslint-community/eslint-utils", - "hash": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==" - } - }, - "npm:@eslint-community/regexpp": { - "type": "npm", - "name": "npm:@eslint-community/regexpp", - "data": { - "version": "4.12.2", - "packageName": "@eslint-community/regexpp", - "hash": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==" - } - }, - "npm:@eslint-react/ast": { - "type": "npm", - "name": "npm:@eslint-react/ast", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/ast", - "hash": "sha512-/RiruPxlQs6CMLJ8tiNT1jV8Zq4u80MTWYkNFz2PP9pht23bdcpngDKFoz8RQYDPt71dwiRURHiQAF75v8bIIw==" - } - }, - "npm:@eslint-react/core": { - "type": "npm", - "name": "npm:@eslint-react/core", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/core", - "hash": "sha512-pIkrGuQWyW/GgrAp0kC7nv/Jn53Xjs1/rbBqUcUYvEZnVKuUifnlXQtnmioOEj9PYsuWuOxAPijExrnNavm73w==" - } - }, - "npm:@eslint-react/eff": { - "type": "npm", - "name": "npm:@eslint-react/eff", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/eff", - "hash": "sha512-pkRWIPnH/jedRn5ZMEA0nDPn5BFuUHKOORbR+hfrAMFp4c3o+1/P1G/eB0vSQvAHAZdPwLZXdgxydz+2rbb8nQ==" - } - }, - "npm:@eslint-react/eslint-plugin": { - "type": "npm", - "name": "npm:@eslint-react/eslint-plugin", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/eslint-plugin", - "hash": "sha512-wKeXNa0vc8ACmvBoZPnRZ+s/z0KEmMKRxpOfRthcBvd0TPMIprohT/uwBXd8k15/j3CmaYe74pJFVVagJY3U3g==" - } - }, - "npm:@eslint-react/shared": { - "type": "npm", - "name": "npm:@eslint-react/shared", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/shared", - "hash": "sha512-LVtD76ycDC7D4OFKDQ8jyATTVxz986J+e9nzydyEUtEf1l+WYiOivPBeJUAs6JEySBl24nO76oEHDABw6l4hig==" - } - }, - "npm:@eslint-react/var": { - "type": "npm", - "name": "npm:@eslint-react/var", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/var", - "hash": "sha512-Bc36K8Lw6KV/5NMaEaFS7as4kgSgZ1wElFejgUEBPZnhUVmq2mITV1BsnMoMYM4jojnkMN80WNALyhONjOx9Jw==" - } - }, - "npm:@eslint/config-array": { - "type": "npm", - "name": "npm:@eslint/config-array", - "data": { - "version": "0.21.1", - "packageName": "@eslint/config-array", - "hash": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==" - } - }, - "npm:@eslint/config-helpers": { - "type": "npm", - "name": "npm:@eslint/config-helpers", - "data": { - "version": "0.4.2", - "packageName": "@eslint/config-helpers", - "hash": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==" - } - }, - "npm:@eslint/core": { - "type": "npm", - "name": "npm:@eslint/core", - "data": { - "version": "0.17.0", - "packageName": "@eslint/core", - "hash": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==" - } - }, - "npm:@eslint/eslintrc": { - "type": "npm", - "name": "npm:@eslint/eslintrc", - "data": { - "version": "3.3.1", - "packageName": "@eslint/eslintrc", - "hash": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==" - } - }, - "npm:@eslint/js": { - "type": "npm", - "name": "npm:@eslint/js", - "data": { - "version": "9.39.1", - "packageName": "@eslint/js", - "hash": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==" - } - }, - "npm:@eslint/object-schema": { - "type": "npm", - "name": "npm:@eslint/object-schema", - "data": { - "version": "2.1.7", - "packageName": "@eslint/object-schema", - "hash": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==" - } - }, - "npm:@eslint/plugin-kit": { - "type": "npm", - "name": "npm:@eslint/plugin-kit", - "data": { - "version": "0.4.1", - "packageName": "@eslint/plugin-kit", - "hash": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==" - } - }, - "npm:@faker-js/faker": { - "type": "npm", - "name": "npm:@faker-js/faker", - "data": { - "version": "10.1.0", - "packageName": "@faker-js/faker", - "hash": "sha512-C3mrr3b5dRVlKPJdfrAXS8+dq+rq8Qm5SNRazca0JKgw1HQERFmrVb0towvMmw5uu8hHKNiQasMaR/tydf3Zsg==" - } - }, - "npm:@gerrit0/mini-shiki": { - "type": "npm", - "name": "npm:@gerrit0/mini-shiki", - "data": { - "version": "3.15.0", - "packageName": "@gerrit0/mini-shiki", - "hash": "sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ==" - } - }, - "npm:@google/genai": { - "type": "npm", - "name": "npm:@google/genai", - "data": { - "version": "1.30.0", - "packageName": "@google/genai", - "hash": "sha512-3MRcgczBFbUat1wIlZoLJ0vCCfXgm7Qxjh59cZi2X08RgWLtm9hKOspzp7TOg1TV2e26/MLxR2GR5yD5GmBV2w==" - } - }, - "npm:@humanfs/core": { - "type": "npm", - "name": "npm:@humanfs/core", - "data": { - "version": "0.19.1", - "packageName": "@humanfs/core", - "hash": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==" - } - }, - "npm:@humanfs/node": { - "type": "npm", - "name": "npm:@humanfs/node", - "data": { - "version": "0.16.7", - "packageName": "@humanfs/node", - "hash": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==" - } - }, - "npm:@humanwhocodes/module-importer": { - "type": "npm", - "name": "npm:@humanwhocodes/module-importer", - "data": { - "version": "1.0.1", - "packageName": "@humanwhocodes/module-importer", - "hash": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" - } - }, - "npm:@humanwhocodes/retry": { - "type": "npm", - "name": "npm:@humanwhocodes/retry", - "data": { - "version": "0.4.3", - "packageName": "@humanwhocodes/retry", - "hash": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==" - } - }, - "npm:@inquirer/external-editor": { - "type": "npm", - "name": "npm:@inquirer/external-editor", - "data": { - "version": "1.0.3", - "packageName": "@inquirer/external-editor", - "hash": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==" - } - }, - "npm:@ioredis/commands": { - "type": "npm", - "name": "npm:@ioredis/commands", - "data": { - "version": "1.4.0", - "packageName": "@ioredis/commands", - "hash": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==" - } - }, - "npm:@isaacs/cliui": { - "type": "npm", - "name": "npm:@isaacs/cliui", - "data": { - "version": "8.0.2", - "packageName": "@isaacs/cliui", - "hash": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==" - } - }, - "npm:@isaacs/fs-minipass": { - "type": "npm", - "name": "npm:@isaacs/fs-minipass", - "data": { - "version": "4.0.1", - "packageName": "@isaacs/fs-minipass", - "hash": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==" - } - }, - "npm:@jest/diff-sequences": { - "type": "npm", - "name": "npm:@jest/diff-sequences", - "data": { - "version": "30.0.1", - "packageName": "@jest/diff-sequences", - "hash": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==" - } - }, - "npm:@jest/get-type": { - "type": "npm", - "name": "npm:@jest/get-type", - "data": { - "version": "30.1.0", - "packageName": "@jest/get-type", - "hash": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==" - } - }, - "npm:@jest/schemas": { - "type": "npm", - "name": "npm:@jest/schemas", - "data": { - "version": "30.0.5", - "packageName": "@jest/schemas", - "hash": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==" - } - }, - "npm:@jridgewell/gen-mapping": { - "type": "npm", - "name": "npm:@jridgewell/gen-mapping", - "data": { - "version": "0.3.13", - "packageName": "@jridgewell/gen-mapping", - "hash": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==" - } - }, - "npm:@jridgewell/remapping": { - "type": "npm", - "name": "npm:@jridgewell/remapping", - "data": { - "version": "2.3.5", - "packageName": "@jridgewell/remapping", - "hash": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==" - } - }, - "npm:@jridgewell/resolve-uri": { - "type": "npm", - "name": "npm:@jridgewell/resolve-uri", - "data": { - "version": "3.1.2", - "packageName": "@jridgewell/resolve-uri", - "hash": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" - } - }, - "npm:@jridgewell/source-map": { - "type": "npm", - "name": "npm:@jridgewell/source-map", - "data": { - "version": "0.3.11", - "packageName": "@jridgewell/source-map", - "hash": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==" - } - }, - "npm:@jridgewell/sourcemap-codec": { - "type": "npm", - "name": "npm:@jridgewell/sourcemap-codec", - "data": { - "version": "1.5.5", - "packageName": "@jridgewell/sourcemap-codec", - "hash": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - } - }, - "npm:@jridgewell/trace-mapping": { - "type": "npm", - "name": "npm:@jridgewell/trace-mapping", - "data": { - "version": "0.3.31", - "packageName": "@jridgewell/trace-mapping", - "hash": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==" - } - }, - "npm:@kwsites/file-exists": { - "type": "npm", - "name": "npm:@kwsites/file-exists", - "data": { - "version": "1.1.1", - "packageName": "@kwsites/file-exists", - "hash": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==" - } - }, - "npm:@kwsites/promise-deferred": { - "type": "npm", - "name": "npm:@kwsites/promise-deferred", - "data": { - "version": "1.1.1", - "packageName": "@kwsites/promise-deferred", - "hash": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" - } - }, - "npm:@manypkg/find-root": { - "type": "npm", - "name": "npm:@manypkg/find-root", - "data": { - "version": "1.1.0", - "packageName": "@manypkg/find-root", - "hash": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==" - } - }, - "npm:@manypkg/get-packages": { - "type": "npm", - "name": "npm:@manypkg/get-packages", - "data": { - "version": "1.1.3", - "packageName": "@manypkg/get-packages", - "hash": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==" - } - }, - "npm:@mapbox/node-pre-gyp": { - "type": "npm", - "name": "npm:@mapbox/node-pre-gyp", - "data": { - "version": "2.0.0", - "packageName": "@mapbox/node-pre-gyp", - "hash": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==" - } - }, - "npm:@microsoft/api-extractor-model": { - "type": "npm", - "name": "npm:@microsoft/api-extractor-model", - "data": { - "version": "7.29.6", - "packageName": "@microsoft/api-extractor-model", - "hash": "sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==" - } - }, - "npm:@microsoft/api-extractor": { - "type": "npm", - "name": "npm:@microsoft/api-extractor", - "data": { - "version": "7.47.7", - "packageName": "@microsoft/api-extractor", - "hash": "sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==" - } - }, - "npm:@microsoft/tsdoc-config": { - "type": "npm", - "name": "npm:@microsoft/tsdoc-config", - "data": { - "version": "0.17.1", - "packageName": "@microsoft/tsdoc-config", - "hash": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==" - } - }, - "npm:@microsoft/tsdoc": { - "type": "npm", - "name": "npm:@microsoft/tsdoc", - "data": { - "version": "0.15.1", - "packageName": "@microsoft/tsdoc", - "hash": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==" - } - }, - "npm:@napi-rs/wasm-runtime@0.2.12": { - "type": "npm", - "name": "npm:@napi-rs/wasm-runtime@0.2.12", - "data": { - "version": "0.2.12", - "packageName": "@napi-rs/wasm-runtime", - "hash": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==" - } - }, - "npm:@napi-rs/wasm-runtime@0.2.4": { - "type": "npm", - "name": "npm:@napi-rs/wasm-runtime@0.2.4", - "data": { - "version": "0.2.4", - "packageName": "@napi-rs/wasm-runtime", - "hash": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==" - } - }, - "npm:@napi-rs/wasm-runtime@1.0.7": { - "type": "npm", - "name": "npm:@napi-rs/wasm-runtime@1.0.7", - "data": { - "version": "1.0.7", - "packageName": "@napi-rs/wasm-runtime", - "hash": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==" - } - }, - "npm:@nodelib/fs.scandir": { - "type": "npm", - "name": "npm:@nodelib/fs.scandir", - "data": { - "version": "2.1.5", - "packageName": "@nodelib/fs.scandir", - "hash": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - } - }, - "npm:@nodelib/fs.stat": { - "type": "npm", - "name": "npm:@nodelib/fs.stat", - "data": { - "version": "2.0.5", - "packageName": "@nodelib/fs.stat", - "hash": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - } - }, - "npm:@nodelib/fs.walk": { - "type": "npm", - "name": "npm:@nodelib/fs.walk", - "data": { - "version": "1.2.8", - "packageName": "@nodelib/fs.walk", - "hash": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - } - }, - "npm:@nx/nx-darwin-arm64": { - "type": "npm", - "name": "npm:@nx/nx-darwin-arm64", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-darwin-arm64", - "hash": "sha512-xT6U9oRjze9QTLp8ieoNOno6GHA5S2R36tzergMfTevCTnpJBE0GX8vtI6fmcK3NkVmbdPI9Vb/FmBPcvD9eEQ==" - } - }, - "npm:@nx/nx-darwin-x64": { - "type": "npm", - "name": "npm:@nx/nx-darwin-x64", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-darwin-x64", - "hash": "sha512-20n1KPgPNV4gym3rzs/vgDJb0ybNIHuVYU+5m6/+ee5jZNApa5Ivi5Kqpm1RKLiKYgcm97ZbWbGi/K0CXqt1dw==" - } - }, - "npm:@nx/nx-freebsd-x64": { - "type": "npm", - "name": "npm:@nx/nx-freebsd-x64", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-freebsd-x64", - "hash": "sha512-Z1AMFUuT1MAay09s0MWSRBdb9fY0DVwOm2TnvLRc1zJ2eMVnbK+Z2NMMOMM10udyogLbxGUHefbl+HtAAcJdxQ==" - } - }, - "npm:@nx/nx-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@nx/nx-linux-arm-gnueabihf", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-arm-gnueabihf", - "hash": "sha512-bR82Id9frpz4GbxXXMsiXAQZ6tI7d3Veifyqj6th/9A3/UyZR4YKYpGm2QEsm0hp4n3BO8K5JxCxhGDgp5YwVg==" - } - }, - "npm:@nx/nx-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@nx/nx-linux-arm64-gnu", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-arm64-gnu", - "hash": "sha512-K6l/qa1rUM1saFlcT/KnJfhRtLyPkpYCxWGNYaMQ3gEFozPCHYdAJUQ+sKS8kVyWt2anAWx2XkmXUaz04OB8BQ==" - } - }, - "npm:@nx/nx-linux-arm64-musl": { - "type": "npm", - "name": "npm:@nx/nx-linux-arm64-musl", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-arm64-musl", - "hash": "sha512-vZUAUsaop5fdcyWpYzED+hWTKOuDtwG9DNNYUlII0dZhSA8kZwmXoYmrCGeMe5nQX9tF4pNzF+oddC/E169Z6g==" - } - }, - "npm:@nx/nx-linux-x64-gnu": { - "type": "npm", - "name": "npm:@nx/nx-linux-x64-gnu", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-x64-gnu", - "hash": "sha512-+NiA5uNh1cdpk2k984NlfIxRXaO0Bu0S4qCvWWKmL/150f31qJ/eHN6rd78/Re2qKO1NDoyDZLW6jqRXIm/GgA==" - } - }, - "npm:@nx/nx-linux-x64-musl": { - "type": "npm", - "name": "npm:@nx/nx-linux-x64-musl", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-x64-musl", - "hash": "sha512-8O7dXems/Of/biCKeuGMh3nmbS2PNvaL8R4xQzaBl94XitzFMxVFjjoTST7y3Ksmsa5Wrbzwyh+kHOMoIMlVpA==" - } - }, - "npm:@nx/nx-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@nx/nx-win32-arm64-msvc", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-win32-arm64-msvc", - "hash": "sha512-/Wt3kdj5BksswSWL4N8tef6B+d5r0LbdEPqZimx3AqDMC9H1YkVuwwdBWFGOh+ldj/N8adRuZKjEMQfa/oqPGg==" - } - }, - "npm:@nx/nx-win32-x64-msvc": { - "type": "npm", - "name": "npm:@nx/nx-win32-x64-msvc", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-win32-x64-msvc", - "hash": "sha512-vihs1hIVMyQYoKul5rfwvU+4WKhbajJ8lSUTVvxjV2j+8F0BYMvRQtB2jDZfBpjEpSBmgP4ApIsLkQzQQBzLug==" - } - }, - "npm:@oozcitak/dom": { - "type": "npm", - "name": "npm:@oozcitak/dom", - "data": { - "version": "2.0.2", - "packageName": "@oozcitak/dom", - "hash": "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==" - } - }, - "npm:@oozcitak/infra": { - "type": "npm", - "name": "npm:@oozcitak/infra", - "data": { - "version": "2.0.2", - "packageName": "@oozcitak/infra", - "hash": "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==" - } - }, - "npm:@oozcitak/url": { - "type": "npm", - "name": "npm:@oozcitak/url", - "data": { - "version": "3.0.0", - "packageName": "@oozcitak/url", - "hash": "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==" - } - }, - "npm:@oozcitak/util": { - "type": "npm", - "name": "npm:@oozcitak/util", - "data": { - "version": "10.0.0", - "packageName": "@oozcitak/util", - "hash": "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==" - } - }, - "npm:@oxc-project/types": { - "type": "npm", - "name": "npm:@oxc-project/types", - "data": { - "version": "0.98.0", - "packageName": "@oxc-project/types", - "hash": "sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==" - } - }, - "npm:@oxc-resolver/binding-android-arm-eabi": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-android-arm-eabi", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-android-arm-eabi", - "hash": "sha512-jB47iZ/thvhE+USCLv+XY3IknBbkKr/p7OBsQDTHode/GPw+OHRlit3NQ1bjt1Mj8V2CS7iHdSDYobZ1/0gagQ==" - } - }, - "npm:@oxc-resolver/binding-android-arm64": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-android-arm64", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-android-arm64", - "hash": "sha512-XFJ9t7d/Cz+dWLyqtTy3Xrekz+qqN4hmOU2iOUgr7u71OQsPUHIIeS9/wKanEK0l413gPwapIkyc5x9ltlOtyw==" - } - }, - "npm:@oxc-resolver/binding-darwin-arm64": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-darwin-arm64", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-darwin-arm64", - "hash": "sha512-gwehBS9smA1mzK8frDsmUCHz+6baJVwkKF6qViHhoqA3kRKvIZ3k6WNP4JmF19JhOiGxRcoPa8gZRfzNgXwP2A==" - } - }, - "npm:@oxc-resolver/binding-darwin-x64": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-darwin-x64", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-darwin-x64", - "hash": "sha512-5wwJvfuoahKiAqqAsMLOI28rqdh3P2K7HkjIWUXNMWAZq6ErX0L5rwJzu6T32+Zxw3k18C7R9IS4wDq/3Ar+6w==" - } - }, - "npm:@oxc-resolver/binding-freebsd-x64": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-freebsd-x64", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-freebsd-x64", - "hash": "sha512-MWTt+LOQNcQ6fa+Uu5VikkihLi1PSIrQqqp0QD44k2AORasNWl0jRGBTcMSBIgNe82qEQWYvlGzvOEEOBp01Og==" - } - }, - "npm:@oxc-resolver/binding-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-arm-gnueabihf", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-arm-gnueabihf", - "hash": "sha512-b6/IBqYrS3o0XiLVBsnex/wK8pTTK+hbGfAMOHVU6p7DBpwPPLgC/tav4IXoOIUCssTFz7aWh/xtUok0swn8VQ==" - } - }, - "npm:@oxc-resolver/binding-linux-arm-musleabihf": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-arm-musleabihf", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-arm-musleabihf", - "hash": "sha512-o2Qh5+y5YoqVK6YfzkalHdpmQ5bkbGGxuLg1pZLQ1Ift0x+Vix7DaFEpdCl5Z9xvYXogd/TwOlL0TPl4+MTFLA==" - } - }, - "npm:@oxc-resolver/binding-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-arm64-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-arm64-gnu", - "hash": "sha512-lk8mCSg0Tg4sEG73RiPjb7keGcEPwqQnBHX3Z+BR2SWe+qNHpoHcyFMNafzSvEC18vlxC04AUSoa6kJl/C5zig==" - } - }, - "npm:@oxc-resolver/binding-linux-arm64-musl": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-arm64-musl", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-arm64-musl", - "hash": "sha512-KykeIVhCM7pn93ABa0fNe8vk4XvnbfZMELne2s6P9tdJH9KMBsCFBi7a2BmSdUtTqWCAJokAcm46lpczU52Xaw==" - } - }, - "npm:@oxc-resolver/binding-linux-ppc64-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-ppc64-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-ppc64-gnu", - "hash": "sha512-QqPPWAcZU/jHAuam4f3zV8OdEkYRPD2XR0peVet3hoMMgsihR3Lhe7J/bLclmod297FG0+OgBYQVMh2nTN6oWA==" - } - }, - "npm:@oxc-resolver/binding-linux-riscv64-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-riscv64-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-riscv64-gnu", - "hash": "sha512-DunWA+wafeG3hj1NADUD3c+DRvmyVNqF5LSHVUWA2bzswqmuEZXl3VYBSzxfD0j+UnRTFYLxf27AMptoMsepYg==" - } - }, - "npm:@oxc-resolver/binding-linux-riscv64-musl": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-riscv64-musl", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-riscv64-musl", - "hash": "sha512-4SRvwKTTk2k67EQr9Ny4NGf/BhlwggCI1CXwBbA9IV4oP38DH8b+NAPxDY0ySGRsWbPkG92FYOqM4AWzG4GSgA==" - } - }, - "npm:@oxc-resolver/binding-linux-s390x-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-s390x-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-s390x-gnu", - "hash": "sha512-hZKvkbsurj4JOom//R1Ab2MlC4cGeVm5zzMt4IsS3XySQeYjyMJ5TDZ3J5rQ8bVj3xi4FpJU2yFZ72GApsHQ6A==" - } - }, - "npm:@oxc-resolver/binding-linux-x64-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-x64-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-x64-gnu", - "hash": "sha512-hABxQXFXJurivw+0amFdeEcK67cF1BGBIN1+sSHzq3TRv4RoG8n5q2JE04Le2n2Kpt6xg4Y5+lcv+rb2mCJLgQ==" - } - }, - "npm:@oxc-resolver/binding-linux-x64-musl": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-x64-musl", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-x64-musl", - "hash": "sha512-Ln73wUB5migZRvC7obAAdqVwvFvk7AUs2JLt4g9QHr8FnqivlsjpUC9Nf2ssrybdjyQzEMjttUxPZz6aKPSAHw==" - } - }, - "npm:@oxc-resolver/binding-wasm32-wasi": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-wasm32-wasi", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-wasm32-wasi", - "hash": "sha512-z+NbELmCOKNtWOqEB5qDfHXOSWB3kGQIIehq6nHtZwHLzdVO2oBq6De/ayhY3ygriC1XhgaIzzniY7jgrNl4Kw==" - } - }, - "npm:@oxc-resolver/binding-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-win32-arm64-msvc", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-win32-arm64-msvc", - "hash": "sha512-Ft0+qd7HSO61qCTLJ4LCdBGZkpKyDj1rG0OVSZL1DxWQoh97m7vEHd7zAvUtw8EcWjOMBQuX4mfRap/x2MOCpQ==" - } - }, - "npm:@oxc-resolver/binding-win32-ia32-msvc": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-win32-ia32-msvc", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-win32-ia32-msvc", - "hash": "sha512-o54jYNSfGdPxHSvXEhZg8FOV3K99mJ1f7hb1alRFb+Yec1GQXNrJXxZPIxNMYeFT13kwAWB7zuQ0HZLnDHFxfw==" - } - }, - "npm:@oxc-resolver/binding-win32-x64-msvc": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-win32-x64-msvc", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-win32-x64-msvc", - "hash": "sha512-j97icaORyM6A7GjgmUzfn7V+KGzVvctRA+eAlJb0c2OQNaETFxl6BXZdnGBDb+6oA0Y4Sr/wnekd1kQ0aVyKGg==" - } - }, - "npm:@parcel/watcher-android-arm64": { - "type": "npm", - "name": "npm:@parcel/watcher-android-arm64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-android-arm64", - "hash": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==" - } - }, - "npm:@parcel/watcher-darwin-arm64": { - "type": "npm", - "name": "npm:@parcel/watcher-darwin-arm64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-darwin-arm64", - "hash": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==" - } - }, - "npm:@parcel/watcher-darwin-x64": { - "type": "npm", - "name": "npm:@parcel/watcher-darwin-x64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-darwin-x64", - "hash": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==" - } - }, - "npm:@parcel/watcher-freebsd-x64": { - "type": "npm", - "name": "npm:@parcel/watcher-freebsd-x64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-freebsd-x64", - "hash": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==" - } - }, - "npm:@parcel/watcher-linux-arm-glibc": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-arm-glibc", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-arm-glibc", - "hash": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==" - } - }, - "npm:@parcel/watcher-linux-arm-musl": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-arm-musl", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-arm-musl", - "hash": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==" - } - }, - "npm:@parcel/watcher-linux-arm64-glibc": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-arm64-glibc", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-arm64-glibc", - "hash": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==" - } - }, - "npm:@parcel/watcher-linux-arm64-musl": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-arm64-musl", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-arm64-musl", - "hash": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==" - } - }, - "npm:@parcel/watcher-linux-x64-glibc": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-x64-glibc", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-x64-glibc", - "hash": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==" - } - }, - "npm:@parcel/watcher-linux-x64-musl": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-x64-musl", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-x64-musl", - "hash": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==" - } - }, - "npm:@parcel/watcher-wasm": { - "type": "npm", - "name": "npm:@parcel/watcher-wasm", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-wasm", - "hash": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==" - } - }, - "npm:@parcel/watcher-win32-arm64": { - "type": "npm", - "name": "npm:@parcel/watcher-win32-arm64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-win32-arm64", - "hash": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==" - } - }, - "npm:@parcel/watcher-win32-ia32": { - "type": "npm", - "name": "npm:@parcel/watcher-win32-ia32", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-win32-ia32", - "hash": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==" - } - }, - "npm:@parcel/watcher-win32-x64": { - "type": "npm", - "name": "npm:@parcel/watcher-win32-x64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-win32-x64", - "hash": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==" - } - }, - "npm:@parcel/watcher": { - "type": "npm", - "name": "npm:@parcel/watcher", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher", - "hash": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==" - } - }, - "npm:@pkgjs/parseargs": { - "type": "npm", - "name": "npm:@pkgjs/parseargs", - "data": { - "version": "0.11.0", - "packageName": "@pkgjs/parseargs", - "hash": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" - } - }, - "npm:@poppinss/colors": { - "type": "npm", - "name": "npm:@poppinss/colors", - "data": { - "version": "4.1.5", - "packageName": "@poppinss/colors", - "hash": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==" - } - }, - "npm:@poppinss/dumper": { - "type": "npm", - "name": "npm:@poppinss/dumper", - "data": { - "version": "0.6.4", - "packageName": "@poppinss/dumper", - "hash": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==" - } - }, - "npm:@poppinss/exception": { - "type": "npm", - "name": "npm:@poppinss/exception", - "data": { - "version": "1.2.2", - "packageName": "@poppinss/exception", - "hash": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==" - } - }, - "npm:@publint/pack": { - "type": "npm", - "name": "npm:@publint/pack", - "data": { - "version": "0.1.2", - "packageName": "@publint/pack", - "hash": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==" - } - }, - "npm:@rolldown/binding-android-arm64": { - "type": "npm", - "name": "npm:@rolldown/binding-android-arm64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-android-arm64", - "hash": "sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==" - } - }, - "npm:@rolldown/binding-darwin-arm64": { - "type": "npm", - "name": "npm:@rolldown/binding-darwin-arm64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-darwin-arm64", - "hash": "sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==" - } - }, - "npm:@rolldown/binding-darwin-x64": { - "type": "npm", - "name": "npm:@rolldown/binding-darwin-x64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-darwin-x64", - "hash": "sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==" - } - }, - "npm:@rolldown/binding-freebsd-x64": { - "type": "npm", - "name": "npm:@rolldown/binding-freebsd-x64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-freebsd-x64", - "hash": "sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==" - } - }, - "npm:@rolldown/binding-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-arm-gnueabihf", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-arm-gnueabihf", - "hash": "sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==" - } - }, - "npm:@rolldown/binding-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-arm64-gnu", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-arm64-gnu", - "hash": "sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==" - } - }, - "npm:@rolldown/binding-linux-arm64-musl": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-arm64-musl", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-arm64-musl", - "hash": "sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==" - } - }, - "npm:@rolldown/binding-linux-x64-gnu": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-x64-gnu", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-x64-gnu", - "hash": "sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==" - } - }, - "npm:@rolldown/binding-linux-x64-musl": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-x64-musl", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-x64-musl", - "hash": "sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==" - } - }, - "npm:@rolldown/binding-openharmony-arm64": { - "type": "npm", - "name": "npm:@rolldown/binding-openharmony-arm64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-openharmony-arm64", - "hash": "sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==" - } - }, - "npm:@rolldown/binding-wasm32-wasi": { - "type": "npm", - "name": "npm:@rolldown/binding-wasm32-wasi", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-wasm32-wasi", - "hash": "sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==" - } - }, - "npm:@rolldown/binding-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@rolldown/binding-win32-arm64-msvc", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-win32-arm64-msvc", - "hash": "sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==" - } - }, - "npm:@rolldown/binding-win32-ia32-msvc": { - "type": "npm", - "name": "npm:@rolldown/binding-win32-ia32-msvc", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-win32-ia32-msvc", - "hash": "sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==" - } - }, - "npm:@rolldown/binding-win32-x64-msvc": { - "type": "npm", - "name": "npm:@rolldown/binding-win32-x64-msvc", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-win32-x64-msvc", - "hash": "sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==" - } - }, - "npm:@rolldown/pluginutils@1.0.0-beta.40": { - "type": "npm", - "name": "npm:@rolldown/pluginutils@1.0.0-beta.40", - "data": { - "version": "1.0.0-beta.40", - "packageName": "@rolldown/pluginutils", - "hash": "sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==" - } - }, - "npm:@rolldown/pluginutils@1.0.0-beta.47": { - "type": "npm", - "name": "npm:@rolldown/pluginutils@1.0.0-beta.47", - "data": { - "version": "1.0.0-beta.47", - "packageName": "@rolldown/pluginutils", - "hash": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==" - } - }, - "npm:@rolldown/pluginutils@1.0.0-beta.51": { - "type": "npm", - "name": "npm:@rolldown/pluginutils@1.0.0-beta.51", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/pluginutils", - "hash": "sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==" - } - }, - "npm:@rollup/plugin-alias": { - "type": "npm", - "name": "npm:@rollup/plugin-alias", - "data": { - "version": "5.1.1", - "packageName": "@rollup/plugin-alias", - "hash": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==" - } - }, - "npm:@rollup/plugin-commonjs": { - "type": "npm", - "name": "npm:@rollup/plugin-commonjs", - "data": { - "version": "28.0.9", - "packageName": "@rollup/plugin-commonjs", - "hash": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==" - } - }, - "npm:@rollup/plugin-inject": { - "type": "npm", - "name": "npm:@rollup/plugin-inject", - "data": { - "version": "5.0.5", - "packageName": "@rollup/plugin-inject", - "hash": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==" - } - }, - "npm:@rollup/plugin-json": { - "type": "npm", - "name": "npm:@rollup/plugin-json", - "data": { - "version": "6.1.0", - "packageName": "@rollup/plugin-json", - "hash": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==" - } - }, - "npm:@rollup/plugin-node-resolve": { - "type": "npm", - "name": "npm:@rollup/plugin-node-resolve", - "data": { - "version": "16.0.3", - "packageName": "@rollup/plugin-node-resolve", - "hash": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==" - } - }, - "npm:@rollup/plugin-replace": { - "type": "npm", - "name": "npm:@rollup/plugin-replace", - "data": { - "version": "6.0.3", - "packageName": "@rollup/plugin-replace", - "hash": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==" - } - }, - "npm:@rollup/plugin-terser": { - "type": "npm", - "name": "npm:@rollup/plugin-terser", - "data": { - "version": "0.4.4", - "packageName": "@rollup/plugin-terser", - "hash": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==" - } - }, - "npm:@rollup/pluginutils": { - "type": "npm", - "name": "npm:@rollup/pluginutils", - "data": { - "version": "5.3.0", - "packageName": "@rollup/pluginutils", - "hash": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==" - } - }, - "npm:@rollup/rollup-android-arm-eabi": { - "type": "npm", - "name": "npm:@rollup/rollup-android-arm-eabi", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-android-arm-eabi", - "hash": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==" - } - }, - "npm:@rollup/rollup-android-arm64": { - "type": "npm", - "name": "npm:@rollup/rollup-android-arm64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-android-arm64", - "hash": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==" - } - }, - "npm:@rollup/rollup-darwin-arm64": { - "type": "npm", - "name": "npm:@rollup/rollup-darwin-arm64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-darwin-arm64", - "hash": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==" - } - }, - "npm:@rollup/rollup-darwin-x64": { - "type": "npm", - "name": "npm:@rollup/rollup-darwin-x64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-darwin-x64", - "hash": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==" - } - }, - "npm:@rollup/rollup-freebsd-arm64": { - "type": "npm", - "name": "npm:@rollup/rollup-freebsd-arm64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-freebsd-arm64", - "hash": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==" - } - }, - "npm:@rollup/rollup-freebsd-x64": { - "type": "npm", - "name": "npm:@rollup/rollup-freebsd-x64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-freebsd-x64", - "hash": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==" - } - }, - "npm:@rollup/rollup-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-arm-gnueabihf", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-arm-gnueabihf", - "hash": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==" - } - }, - "npm:@rollup/rollup-linux-arm-musleabihf": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-arm-musleabihf", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-arm-musleabihf", - "hash": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==" - } - }, - "npm:@rollup/rollup-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-arm64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-arm64-gnu", - "hash": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==" - } - }, - "npm:@rollup/rollup-linux-arm64-musl": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-arm64-musl", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-arm64-musl", - "hash": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==" - } - }, - "npm:@rollup/rollup-linux-loong64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-loong64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-loong64-gnu", - "hash": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==" - } - }, - "npm:@rollup/rollup-linux-ppc64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-ppc64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-ppc64-gnu", - "hash": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==" - } - }, - "npm:@rollup/rollup-linux-riscv64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-riscv64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-riscv64-gnu", - "hash": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==" - } - }, - "npm:@rollup/rollup-linux-riscv64-musl": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-riscv64-musl", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-riscv64-musl", - "hash": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==" - } - }, - "npm:@rollup/rollup-linux-s390x-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-s390x-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-s390x-gnu", - "hash": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==" - } - }, - "npm:@rollup/rollup-linux-x64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-x64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-x64-gnu", - "hash": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==" - } - }, - "npm:@rollup/rollup-linux-x64-musl": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-x64-musl", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-x64-musl", - "hash": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==" - } - }, - "npm:@rollup/rollup-openharmony-arm64": { - "type": "npm", - "name": "npm:@rollup/rollup-openharmony-arm64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-openharmony-arm64", - "hash": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==" - } - }, - "npm:@rollup/rollup-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@rollup/rollup-win32-arm64-msvc", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-win32-arm64-msvc", - "hash": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==" - } - }, - "npm:@rollup/rollup-win32-ia32-msvc": { - "type": "npm", - "name": "npm:@rollup/rollup-win32-ia32-msvc", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-win32-ia32-msvc", - "hash": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==" - } - }, - "npm:@rollup/rollup-win32-x64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-win32-x64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-win32-x64-gnu", - "hash": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==" - } - }, - "npm:@rollup/rollup-win32-x64-msvc": { - "type": "npm", - "name": "npm:@rollup/rollup-win32-x64-msvc", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-win32-x64-msvc", - "hash": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==" - } - }, - "npm:@rushstack/node-core-library": { - "type": "npm", - "name": "npm:@rushstack/node-core-library", - "data": { - "version": "5.7.0", - "packageName": "@rushstack/node-core-library", - "hash": "sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==" - } - }, - "npm:@rushstack/rig-package": { - "type": "npm", - "name": "npm:@rushstack/rig-package", - "data": { - "version": "0.5.3", - "packageName": "@rushstack/rig-package", - "hash": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==" - } - }, - "npm:@rushstack/terminal": { - "type": "npm", - "name": "npm:@rushstack/terminal", - "data": { - "version": "0.14.0", - "packageName": "@rushstack/terminal", - "hash": "sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==" - } - }, - "npm:@rushstack/ts-command-line": { - "type": "npm", - "name": "npm:@rushstack/ts-command-line", - "data": { - "version": "4.22.6", - "packageName": "@rushstack/ts-command-line", - "hash": "sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==" - } - }, - "npm:@shikijs/engine-oniguruma": { - "type": "npm", - "name": "npm:@shikijs/engine-oniguruma", - "data": { - "version": "3.15.0", - "packageName": "@shikijs/engine-oniguruma", - "hash": "sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==" - } - }, - "npm:@shikijs/langs": { - "type": "npm", - "name": "npm:@shikijs/langs", - "data": { - "version": "3.15.0", - "packageName": "@shikijs/langs", - "hash": "sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==" - } - }, - "npm:@shikijs/themes": { - "type": "npm", - "name": "npm:@shikijs/themes", - "data": { - "version": "3.15.0", - "packageName": "@shikijs/themes", - "hash": "sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==" - } - }, - "npm:@shikijs/types": { - "type": "npm", - "name": "npm:@shikijs/types", - "data": { - "version": "3.15.0", - "packageName": "@shikijs/types", - "hash": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==" - } - }, - "npm:@shikijs/vscode-textmate": { - "type": "npm", - "name": "npm:@shikijs/vscode-textmate", - "data": { - "version": "10.0.2", - "packageName": "@shikijs/vscode-textmate", - "hash": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" - } - }, - "npm:@sinclair/typebox": { - "type": "npm", - "name": "npm:@sinclair/typebox", - "data": { - "version": "0.34.41", - "packageName": "@sinclair/typebox", - "hash": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==" - } - }, - "npm:@sindresorhus/is": { - "type": "npm", - "name": "npm:@sindresorhus/is", - "data": { - "version": "7.1.1", - "packageName": "@sindresorhus/is", - "hash": "sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==" - } - }, - "npm:@sindresorhus/merge-streams": { - "type": "npm", - "name": "npm:@sindresorhus/merge-streams", - "data": { - "version": "4.0.0", - "packageName": "@sindresorhus/merge-streams", - "hash": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==" - } - }, - "npm:@size-limit/esbuild": { - "type": "npm", - "name": "npm:@size-limit/esbuild", - "data": { - "version": "11.2.0", - "packageName": "@size-limit/esbuild", - "hash": "sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==" - } - }, - "npm:@size-limit/file": { - "type": "npm", - "name": "npm:@size-limit/file", - "data": { - "version": "11.2.0", - "packageName": "@size-limit/file", - "hash": "sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==" - } - }, - "npm:@size-limit/preset-small-lib": { - "type": "npm", - "name": "npm:@size-limit/preset-small-lib", - "data": { - "version": "11.2.0", - "packageName": "@size-limit/preset-small-lib", - "hash": "sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==" - } - }, - "npm:@solid-primitives/event-listener": { - "type": "npm", - "name": "npm:@solid-primitives/event-listener", - "data": { - "version": "2.4.3", - "packageName": "@solid-primitives/event-listener", - "hash": "sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==" - } - }, - "npm:@solid-primitives/keyboard": { - "type": "npm", - "name": "npm:@solid-primitives/keyboard", - "data": { - "version": "1.3.3", - "packageName": "@solid-primitives/keyboard", - "hash": "sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==" - } - }, - "npm:@solid-primitives/resize-observer": { - "type": "npm", - "name": "npm:@solid-primitives/resize-observer", - "data": { - "version": "2.1.3", - "packageName": "@solid-primitives/resize-observer", - "hash": "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==" - } - }, - "npm:@solid-primitives/rootless": { - "type": "npm", - "name": "npm:@solid-primitives/rootless", - "data": { - "version": "1.5.2", - "packageName": "@solid-primitives/rootless", - "hash": "sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==" - } - }, - "npm:@solid-primitives/static-store": { - "type": "npm", - "name": "npm:@solid-primitives/static-store", - "data": { - "version": "0.1.2", - "packageName": "@solid-primitives/static-store", - "hash": "sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==" - } - }, - "npm:@solid-primitives/utils": { - "type": "npm", - "name": "npm:@solid-primitives/utils", - "data": { - "version": "6.3.2", - "packageName": "@solid-primitives/utils", - "hash": "sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==" - } - }, - "npm:@speed-highlight/core": { - "type": "npm", - "name": "npm:@speed-highlight/core", - "data": { - "version": "1.2.8", - "packageName": "@speed-highlight/core", - "hash": "sha512-IGytNtnUnPIobIbOq5Y6LIlqiHNX+vnToQIS7lj6L5819C+rA8TXRDkkG8vePsiBOGcoW9R6i+dp2YBUKdB09Q==" - } - }, - "npm:@standard-schema/spec": { - "type": "npm", - "name": "npm:@standard-schema/spec", - "data": { - "version": "1.0.0", - "packageName": "@standard-schema/spec", - "hash": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==" - } - }, - "npm:@stylistic/eslint-plugin": { - "type": "npm", - "name": "npm:@stylistic/eslint-plugin", - "data": { - "version": "5.5.0", - "packageName": "@stylistic/eslint-plugin", - "hash": "sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==" - } - }, - "npm:@sveltejs/acorn-typescript": { - "type": "npm", - "name": "npm:@sveltejs/acorn-typescript", - "data": { - "version": "1.0.7", - "packageName": "@sveltejs/acorn-typescript", - "hash": "sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==" - } - }, - "npm:@svitejs/changesets-changelog-github-compact": { - "type": "npm", - "name": "npm:@svitejs/changesets-changelog-github-compact", - "data": { - "version": "1.2.0", - "packageName": "@svitejs/changesets-changelog-github-compact", - "hash": "sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==" - } - }, - "npm:@tailwindcss/node": { - "type": "npm", - "name": "npm:@tailwindcss/node", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/node", - "hash": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==" - } - }, - "npm:@tailwindcss/oxide-android-arm64": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-android-arm64", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-android-arm64", - "hash": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==" - } - }, - "npm:@tailwindcss/oxide-darwin-arm64": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-darwin-arm64", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-darwin-arm64", - "hash": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==" - } - }, - "npm:@tailwindcss/oxide-darwin-x64": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-darwin-x64", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-darwin-x64", - "hash": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==" - } - }, - "npm:@tailwindcss/oxide-freebsd-x64": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-freebsd-x64", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-freebsd-x64", - "hash": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==" - } - }, - "npm:@tailwindcss/oxide-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-arm-gnueabihf", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-arm-gnueabihf", - "hash": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==" - } - }, - "npm:@tailwindcss/oxide-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-arm64-gnu", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-arm64-gnu", - "hash": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==" - } - }, - "npm:@tailwindcss/oxide-linux-arm64-musl": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-arm64-musl", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-arm64-musl", - "hash": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==" - } - }, - "npm:@tailwindcss/oxide-linux-x64-gnu": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-x64-gnu", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-x64-gnu", - "hash": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==" - } - }, - "npm:@tailwindcss/oxide-linux-x64-musl": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-x64-musl", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-x64-musl", - "hash": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==" - } - }, - "npm:@tailwindcss/oxide-wasm32-wasi": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-wasm32-wasi", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-wasm32-wasi", - "hash": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==" - } - }, - "npm:@tailwindcss/oxide-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-win32-arm64-msvc", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-win32-arm64-msvc", - "hash": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==" - } - }, - "npm:@tailwindcss/oxide-win32-x64-msvc": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-win32-x64-msvc", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-win32-x64-msvc", - "hash": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==" - } - }, - "npm:@tailwindcss/oxide": { - "type": "npm", - "name": "npm:@tailwindcss/oxide", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide", - "hash": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==" - } - }, - "npm:@tailwindcss/vite": { - "type": "npm", - "name": "npm:@tailwindcss/vite", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/vite", - "hash": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==" - } - }, - "npm:@tanstack/config": { - "type": "npm", - "name": "npm:@tanstack/config", - "data": { - "version": "0.22.1", - "packageName": "@tanstack/config", - "hash": "sha512-0m+gqjrIE6el20VpGIzT54SIjvu27lDRHr+9NiK2nYya5fm0e/19+NfKRoDekZhSBfjaGytUaSpbofzvbSw8zw==" - } - }, - "npm:@tanstack/devtools-client": { - "type": "npm", - "name": "npm:@tanstack/devtools-client", - "data": { - "version": "0.0.4", - "packageName": "@tanstack/devtools-client", - "hash": "sha512-LefnH9KE9uRDEWifc3QDcooskA8ikfs41bybDTgpYQpyTUspZnaEdUdya9Hry0KYxZ8nos0S3nNbsP79KHqr6Q==" - } - }, - "npm:@tanstack/devtools-event-bus": { - "type": "npm", - "name": "npm:@tanstack/devtools-event-bus", - "data": { - "version": "0.3.3", - "packageName": "@tanstack/devtools-event-bus", - "hash": "sha512-lWl88uLAz7ZhwNdLH6A3tBOSEuBCrvnY9Fzr5JPdzJRFdM5ZFdyNWz1Bf5l/F3GU57VodrN0KCFi9OA26H5Kpg==" - } - }, - "npm:@tanstack/devtools-event-client": { - "type": "npm", - "name": "npm:@tanstack/devtools-event-client", - "data": { - "version": "0.3.5", - "packageName": "@tanstack/devtools-event-client", - "hash": "sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==" - } - }, - "npm:@tanstack/devtools-ui": { - "type": "npm", - "name": "npm:@tanstack/devtools-ui", - "data": { - "version": "0.4.4", - "packageName": "@tanstack/devtools-ui", - "hash": "sha512-5xHXFyX3nom0UaNfiOM92o6ziaHjGo3mcSGe2HD5Xs8dWRZNpdZ0Smd0B9ddEhy0oB+gXyMzZgUJb9DmrZV0Mg==" - } - }, - "npm:@tanstack/devtools-utils": { - "type": "npm", - "name": "npm:@tanstack/devtools-utils", - "data": { - "version": "0.0.8", - "packageName": "@tanstack/devtools-utils", - "hash": "sha512-cWoohW9OswidFclwopYRsW0FR3jOoC5iMy0pUHm/31uAnlTb3ViFoZ1VqMf7vZESYdDeee8OjaICS1YbKksDxg==" - } - }, - "npm:@tanstack/devtools": { - "type": "npm", - "name": "npm:@tanstack/devtools", - "data": { - "version": "0.8.2", - "packageName": "@tanstack/devtools", - "hash": "sha512-ltVS+MpOrA37CiVunSOCcXctaDnQOJV6FPE5Y2uLq3m8b0spmHwp0edp1PRd2CMG4LnGIlRf7lYdhHa2p9CHNA==" - } - }, - "npm:@tanstack/directive-functions-plugin": { - "type": "npm", - "name": "npm:@tanstack/directive-functions-plugin", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/directive-functions-plugin", - "hash": "sha512-qLGxldnWa0pp/siZEFEYDU+eB/j40bd1V3IuTzP0sFnrYi11Ldx1yVkOruDKUbO1WM0o+OlPhp22Q1h+LMdDMA==" - } - }, - "npm:@tanstack/eslint-config": { - "type": "npm", - "name": "npm:@tanstack/eslint-config", - "data": { - "version": "0.3.3", - "packageName": "@tanstack/eslint-config", - "hash": "sha512-8VFyAaIFV9onJcfc5yVj5WWl6DmN3W4m+t0Mb+nZrQmqHy+kDndw5O5Xv2BHVWRRPTqnhlJYh6wHWGh0R81ZzQ==" - } - }, - "npm:@tanstack/history": { - "type": "npm", - "name": "npm:@tanstack/history", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/history", - "hash": "sha512-l6wcxwDBeh/7Dhles23U1O8lp9kNJmAb2yNjekR6olZwCRNAVA8TCXlVCrueELyFlYZqvQkh0ofxnzG62A1Kkg==" - } - }, - "npm:@tanstack/nitro-v2-vite-plugin": { - "type": "npm", - "name": "npm:@tanstack/nitro-v2-vite-plugin", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/nitro-v2-vite-plugin", - "hash": "sha512-TedrzuMjtHA08x47wCaU6KTrrat8gyzn8a4HUswTwjAa0sMpz4vbOOUDDZyYaJpmjKKbTjgTs6iRr4MONneKTQ==" - } - }, - "npm:@tanstack/publish-config": { - "type": "npm", - "name": "npm:@tanstack/publish-config", - "data": { - "version": "0.2.2", - "packageName": "@tanstack/publish-config", - "hash": "sha512-hTW2rLeZLBMmpwVzWmUJ5L50hPlf4Ea74rZtecbT6qQYCT16JEAbryfHm1u07KIICI2vEArsm2YguckjODqx0w==" - } - }, - "npm:@tanstack/query-core": { - "type": "npm", - "name": "npm:@tanstack/query-core", - "data": { - "version": "5.90.5", - "packageName": "@tanstack/query-core", - "hash": "sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==" - } - }, - "npm:@tanstack/react-devtools": { - "type": "npm", - "name": "npm:@tanstack/react-devtools", - "data": { - "version": "0.8.2", - "packageName": "@tanstack/react-devtools", - "hash": "sha512-D1oG2QivpAmiT4iq7PxbsajmoYmtnhwg9gEK7q9mDiVcnyPjwnhg1ujDvKIzP+ZaRTkQzpJYwtTmS9DzYp8Akg==" - } - }, - "npm:@tanstack/react-query": { - "type": "npm", - "name": "npm:@tanstack/react-query", - "data": { - "version": "5.90.5", - "packageName": "@tanstack/react-query", - "hash": "sha512-pN+8UWpxZkEJ/Rnnj2v2Sxpx1WFlaa9L6a4UO89p6tTQbeo+m0MS8oYDjbggrR8QcTyjKoYWKS3xJQGr3ExT8Q==" - } - }, - "npm:@tanstack/react-router-devtools": { - "type": "npm", - "name": "npm:@tanstack/react-router-devtools", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/react-router-devtools", - "hash": "sha512-ySuFWfR5mHtbs/le5SUb56OxCWTZskwynPp6E9qnyDgB4vX6P7OJDqdgv7rqiorYNjFmAaywraaVZGQ8WuB4+g==" - } - }, - "npm:@tanstack/react-router-ssr-query": { - "type": "npm", - "name": "npm:@tanstack/react-router-ssr-query", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/react-router-ssr-query", - "hash": "sha512-S38TJsBrA7NRxFzdCTb7uDIls1JEtRJAuSLWQrlVigmFEHY2yk2/r45aSKu0cc/ucxRRZ+0JxUo4lFInoFYt1w==" - } - }, - "npm:@tanstack/react-router": { - "type": "npm", - "name": "npm:@tanstack/react-router", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/react-router", - "hash": "sha512-5vhwIAwoxWl7oeIZRNgk5wh9TCkaAinK9qbfdKuKzwGtMHqnv1bRrfKwam3/MaMwHCmvnNfnFj0RYfnBA/ilEg==" - } - }, - "npm:@tanstack/react-start-client": { - "type": "npm", - "name": "npm:@tanstack/react-start-client", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/react-start-client", - "hash": "sha512-082eg9SvYdg4+kZFO6fhiwazoWOa8TUWLIi2Um3OLcnlBJzAf3cwsYE+Ub4siPucRX4DxzSDrY5TgH+uMYKtBQ==" - } - }, - "npm:@tanstack/react-start-server": { - "type": "npm", - "name": "npm:@tanstack/react-start-server", - "data": { - "version": "1.139.8", - "packageName": "@tanstack/react-start-server", - "hash": "sha512-7lmu6a2PDpxd1J438FmV/lxc5vRRvy34dV9NYRNvOj6fxcGfagxix1qi6NKtgmiSQQ83DNfrckHno0wlOJJLOg==" - } - }, - "npm:@tanstack/react-start": { - "type": "npm", - "name": "npm:@tanstack/react-start", - "data": { - "version": "1.139.8", - "packageName": "@tanstack/react-start", - "hash": "sha512-vNSd1w+NCDAmTzkiPC6klnwVZBH8EjXg+c5sf7+PPUYXMZMb7kYCRiH8xKjCBRQkubgQeA8bnVsbRWqC21hQHw==" - } - }, - "npm:@tanstack/react-store": { - "type": "npm", - "name": "npm:@tanstack/react-store", - "data": { - "version": "0.8.0", - "packageName": "@tanstack/react-store", - "hash": "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==" - } - }, - "npm:@tanstack/router-core": { - "type": "npm", - "name": "npm:@tanstack/router-core", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-core", - "hash": "sha512-mqgsJi4/B2Jo6PXRUs1AsWA+06nqiqVZe1aXioA3vR6PesNeKUSXWfmIoYF6wOx3osiV0BnwB1JCBrInCOQSWA==" - } - }, - "npm:@tanstack/router-devtools-core": { - "type": "npm", - "name": "npm:@tanstack/router-devtools-core", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-devtools-core", - "hash": "sha512-Tx6+rCyjthlH7KS9Jz6YdT2KQ6rZQ66F+XJOj7Rel8zGAvyqx8USzcqTRvC+QjaU1jIJq+mNPWpMdKkkxPSOVA==" - } - }, - "npm:@tanstack/router-generator": { - "type": "npm", - "name": "npm:@tanstack/router-generator", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-generator", - "hash": "sha512-xnmF1poNH/dHtwFxecCcRsaLRIXVnXRZiWYUpvtyaPv4pQYayCrFQCg2ygDbCV0/8H7ctMBJh5MIL7GgPR7+xw==" - } - }, - "npm:@tanstack/router-plugin": { - "type": "npm", - "name": "npm:@tanstack/router-plugin", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-plugin", - "hash": "sha512-sgB8nOoVKr0A2lw5p7kQ3MtEA03d1t+Qvqyy+f/QkHy5pGk8Yohg64TEX+2e98plfM3j5vAOu/JhAyoLLrp1Jw==" - } - }, - "npm:@tanstack/router-ssr-query-core": { - "type": "npm", - "name": "npm:@tanstack/router-ssr-query-core", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-ssr-query-core", - "hash": "sha512-Ei4P2g/7xNO99OgvBOAAeVLI6VnqXYcSTI1Q6b1NYBzsb4aIo8Ne38cgVnanDlnIRrUJjIDQdZTAtu0AdANiyg==" - } - }, - "npm:@tanstack/router-utils": { - "type": "npm", - "name": "npm:@tanstack/router-utils", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/router-utils", - "hash": "sha512-jT7D6NimWqoFSkid4vCno8gvTyfL1+NHpgm3es0B2UNhKKRV3LngOGilm1m6v8Qvk/gy6Fh/tvB+s+hBl6GhOg==" - } - }, - "npm:@tanstack/server-functions-plugin": { - "type": "npm", - "name": "npm:@tanstack/server-functions-plugin", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/server-functions-plugin", - "hash": "sha512-IpNFiCoy2YU6gY/4lCKIVlFyU67ltlcUMGcdnrevqOgq20AbMyeLbbBVo9tAA3TkHK9F+9Hd7DqGXsup2pmBLg==" - } - }, - "npm:@tanstack/start-client-core": { - "type": "npm", - "name": "npm:@tanstack/start-client-core", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/start-client-core", - "hash": "sha512-omG032CeYUWlwQt6s7VFqhc9dGHKWNJ0C5PoIckL+G/HcV+0/RxYkiKzx/HTTzWt+K+LpsBDFFNnrTUUyTE5sw==" - } - }, - "npm:@tanstack/start-plugin-core": { - "type": "npm", - "name": "npm:@tanstack/start-plugin-core", - "data": { - "version": "1.139.8", - "packageName": "@tanstack/start-plugin-core", - "hash": "sha512-u1+rof/1vNHzFVR0yPWWSVwzbCtvndQsfjBR104xSTLCLB0oGvFvkCU0xLLyKtxhqsrYZFrqudg5B8aVH2plOg==" - } - }, - "npm:@tanstack/start-server-core": { - "type": "npm", - "name": "npm:@tanstack/start-server-core", - "data": { - "version": "1.139.8", - "packageName": "@tanstack/start-server-core", - "hash": "sha512-jKC83uMS2kgCHoqlHmxh9hAK1pN9Wd8l+Lhkibwp9PKKMW4Z1bxy5xCx6sr3TD2yJEOP25SRhYMrtAKmrLmYGA==" - } - }, - "npm:@tanstack/start-storage-context": { - "type": "npm", - "name": "npm:@tanstack/start-storage-context", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/start-storage-context", - "hash": "sha512-l2utb0CXLE+wfj1wlAUPHohiq7n5nOBMl3pflhl3JzCXt+6D9AAogkfrysyxOAvx3KnLh3oG+qwf1KHWIDB9HA==" - } - }, - "npm:@tanstack/store": { - "type": "npm", - "name": "npm:@tanstack/store", - "data": { - "version": "0.8.0", - "packageName": "@tanstack/store", - "hash": "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==" - } - }, - "npm:@tanstack/typedoc-config": { - "type": "npm", - "name": "npm:@tanstack/typedoc-config", - "data": { - "version": "0.3.1", - "packageName": "@tanstack/typedoc-config", - "hash": "sha512-frgA1vjzxbdU5/xn/Z/UqyOd1yuegEfAnx9QNbcX+1XQ3TCzD+x89cMZH9iyxdTC1Tasx2gq7DCNCvX962X9WA==" - } - }, - "npm:@tanstack/virtual-file-routes": { - "type": "npm", - "name": "npm:@tanstack/virtual-file-routes", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/virtual-file-routes", - "hash": "sha512-9PImF1d1tovTUIpjFVa0W7Fwj/MHif7BaaczgJJfbv3sDt1Gh+oW9W9uCw9M3ndEJynnp5ZD/TTs0RGubH5ssg==" - } - }, - "npm:@tanstack/vite-config": { - "type": "npm", - "name": "npm:@tanstack/vite-config", - "data": { - "version": "0.4.1", - "packageName": "@tanstack/vite-config", - "hash": "sha512-FOl8EF6SAcljanKSm5aBeJaflFcxQAytTbxtNW8HC6D4x+UBW68IC4tBcrlrsI0wXHBmC/Gz4Ovvv8qCtiXSgQ==" - } - }, - "npm:@testing-library/dom": { - "type": "npm", - "name": "npm:@testing-library/dom", - "data": { - "version": "10.4.1", - "packageName": "@testing-library/dom", - "hash": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==" - } - }, - "npm:@testing-library/jest-dom": { - "type": "npm", - "name": "npm:@testing-library/jest-dom", - "data": { - "version": "6.9.1", - "packageName": "@testing-library/jest-dom", - "hash": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==" - } - }, - "npm:@testing-library/react": { - "type": "npm", - "name": "npm:@testing-library/react", - "data": { - "version": "16.3.0", - "packageName": "@testing-library/react", - "hash": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==" - } - }, - "npm:@tybys/wasm-util@0.10.1": { - "type": "npm", - "name": "npm:@tybys/wasm-util@0.10.1", - "data": { - "version": "0.10.1", - "packageName": "@tybys/wasm-util", - "hash": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==" - } - }, - "npm:@tybys/wasm-util@0.9.0": { - "type": "npm", - "name": "npm:@tybys/wasm-util@0.9.0", - "data": { - "version": "0.9.0", - "packageName": "@tybys/wasm-util", - "hash": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==" - } - }, - "npm:@types/argparse": { - "type": "npm", - "name": "npm:@types/argparse", - "data": { - "version": "1.0.38", - "packageName": "@types/argparse", - "hash": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" - } - }, - "npm:@types/aria-query": { - "type": "npm", - "name": "npm:@types/aria-query", - "data": { - "version": "5.0.4", - "packageName": "@types/aria-query", - "hash": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" - } - }, - "npm:@types/babel__core": { - "type": "npm", - "name": "npm:@types/babel__core", - "data": { - "version": "7.20.5", - "packageName": "@types/babel__core", - "hash": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==" - } - }, - "npm:@types/babel__generator": { - "type": "npm", - "name": "npm:@types/babel__generator", - "data": { - "version": "7.27.0", - "packageName": "@types/babel__generator", - "hash": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==" - } - }, - "npm:@types/babel__template": { - "type": "npm", - "name": "npm:@types/babel__template", - "data": { - "version": "7.4.4", - "packageName": "@types/babel__template", - "hash": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==" - } - }, - "npm:@types/babel__traverse": { - "type": "npm", - "name": "npm:@types/babel__traverse", - "data": { - "version": "7.28.0", - "packageName": "@types/babel__traverse", - "hash": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==" - } - }, - "npm:@types/chai": { - "type": "npm", - "name": "npm:@types/chai", - "data": { - "version": "5.2.3", - "packageName": "@types/chai", - "hash": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==" - } - }, - "npm:@types/conventional-commits-parser": { - "type": "npm", - "name": "npm:@types/conventional-commits-parser", - "data": { - "version": "5.0.2", - "packageName": "@types/conventional-commits-parser", - "hash": "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==" - } - }, - "npm:@types/debug": { - "type": "npm", - "name": "npm:@types/debug", - "data": { - "version": "4.1.12", - "packageName": "@types/debug", - "hash": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==" - } - }, - "npm:@types/deep-eql": { - "type": "npm", - "name": "npm:@types/deep-eql", - "data": { - "version": "4.0.2", - "packageName": "@types/deep-eql", - "hash": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" - } - }, - "npm:@types/estree-jsx": { - "type": "npm", - "name": "npm:@types/estree-jsx", - "data": { - "version": "1.0.5", - "packageName": "@types/estree-jsx", - "hash": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==" - } - }, - "npm:@types/estree": { - "type": "npm", - "name": "npm:@types/estree", - "data": { - "version": "1.0.8", - "packageName": "@types/estree", - "hash": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" - } - }, - "npm:@types/hast": { - "type": "npm", - "name": "npm:@types/hast", - "data": { - "version": "3.0.4", - "packageName": "@types/hast", - "hash": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==" - } - }, - "npm:@types/json-schema": { - "type": "npm", - "name": "npm:@types/json-schema", - "data": { - "version": "7.0.15", - "packageName": "@types/json-schema", - "hash": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - } - }, - "npm:@types/mdast": { - "type": "npm", - "name": "npm:@types/mdast", - "data": { - "version": "4.0.4", - "packageName": "@types/mdast", - "hash": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==" - } - }, - "npm:@types/ms": { - "type": "npm", - "name": "npm:@types/ms", - "data": { - "version": "2.1.0", - "packageName": "@types/ms", - "hash": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" - } - }, - "npm:@types/node@12.20.55": { - "type": "npm", - "name": "npm:@types/node@12.20.55", - "data": { - "version": "12.20.55", - "packageName": "@types/node", - "hash": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - } - }, - "npm:@types/node@20.19.25": { - "type": "npm", - "name": "npm:@types/node@20.19.25", - "data": { - "version": "20.19.25", - "packageName": "@types/node", - "hash": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==" - } - }, - "npm:@types/node": { - "type": "npm", - "name": "npm:@types/node", - "data": { - "version": "24.10.1", - "packageName": "@types/node", - "hash": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==" - } - }, - "npm:@types/react-dom": { - "type": "npm", - "name": "npm:@types/react-dom", - "data": { - "version": "19.2.3", - "packageName": "@types/react-dom", - "hash": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==" - } - }, - "npm:@types/react": { - "type": "npm", - "name": "npm:@types/react", - "data": { - "version": "19.2.7", - "packageName": "@types/react", - "hash": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==" - } - }, - "npm:@types/resolve": { - "type": "npm", - "name": "npm:@types/resolve", - "data": { - "version": "1.20.2", - "packageName": "@types/resolve", - "hash": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" - } - }, - "npm:@types/unist@2.0.11": { - "type": "npm", - "name": "npm:@types/unist@2.0.11", - "data": { - "version": "2.0.11", - "packageName": "@types/unist", - "hash": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - } - }, - "npm:@types/unist@3.0.3": { - "type": "npm", - "name": "npm:@types/unist@3.0.3", - "data": { - "version": "3.0.3", - "packageName": "@types/unist", - "hash": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - } - }, - "npm:@types/whatwg-mimetype": { - "type": "npm", - "name": "npm:@types/whatwg-mimetype", - "data": { - "version": "3.0.2", - "packageName": "@types/whatwg-mimetype", - "hash": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==" - } - }, - "npm:@typescript-eslint/eslint-plugin": { - "type": "npm", - "name": "npm:@typescript-eslint/eslint-plugin", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/eslint-plugin", - "hash": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==" - } - }, - "npm:@typescript-eslint/parser": { - "type": "npm", - "name": "npm:@typescript-eslint/parser", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/parser", - "hash": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==" - } - }, - "npm:@typescript-eslint/project-service@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/project-service@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/project-service", - "hash": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==" - } - }, - "npm:@typescript-eslint/project-service@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/project-service@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/project-service", - "hash": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==" - } - }, - "npm:@typescript-eslint/scope-manager@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/scope-manager@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/scope-manager", - "hash": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==" - } - }, - "npm:@typescript-eslint/scope-manager@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/scope-manager@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/scope-manager", - "hash": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==" - } - }, - "npm:@typescript-eslint/tsconfig-utils@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/tsconfig-utils@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/tsconfig-utils", - "hash": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==" - } - }, - "npm:@typescript-eslint/tsconfig-utils@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/tsconfig-utils@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/tsconfig-utils", - "hash": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==" - } - }, - "npm:@typescript-eslint/type-utils@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/type-utils@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/type-utils", - "hash": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==" - } - }, - "npm:@typescript-eslint/type-utils@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/type-utils@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/type-utils", - "hash": "sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==" - } - }, - "npm:@typescript-eslint/types@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/types@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/types", - "hash": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==" - } - }, - "npm:@typescript-eslint/types@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/types@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/types", - "hash": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==" - } - }, - "npm:@typescript-eslint/typescript-estree@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/typescript-estree@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/typescript-estree", - "hash": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==" - } - }, - "npm:@typescript-eslint/typescript-estree@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/typescript-estree@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/typescript-estree", - "hash": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==" - } - }, - "npm:@typescript-eslint/utils@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/utils@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/utils", - "hash": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==" - } - }, - "npm:@typescript-eslint/utils@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/utils@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/utils", - "hash": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==" - } - }, - "npm:@typescript-eslint/visitor-keys@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/visitor-keys@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/visitor-keys", - "hash": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==" - } - }, - "npm:@typescript-eslint/visitor-keys@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/visitor-keys@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/visitor-keys", - "hash": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==" - } - }, - "npm:@ungap/structured-clone": { - "type": "npm", - "name": "npm:@ungap/structured-clone", - "data": { - "version": "1.3.0", - "packageName": "@ungap/structured-clone", - "hash": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" - } - }, - "npm:@unrs/resolver-binding-android-arm-eabi": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-android-arm-eabi", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-android-arm-eabi", - "hash": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==" - } - }, - "npm:@unrs/resolver-binding-android-arm64": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-android-arm64", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-android-arm64", - "hash": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==" - } - }, - "npm:@unrs/resolver-binding-darwin-arm64": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-darwin-arm64", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-darwin-arm64", - "hash": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==" - } - }, - "npm:@unrs/resolver-binding-darwin-x64": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-darwin-x64", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-darwin-x64", - "hash": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==" - } - }, - "npm:@unrs/resolver-binding-freebsd-x64": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-freebsd-x64", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-freebsd-x64", - "hash": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==" - } - }, - "npm:@unrs/resolver-binding-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-arm-gnueabihf", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-arm-gnueabihf", - "hash": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==" - } - }, - "npm:@unrs/resolver-binding-linux-arm-musleabihf": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-arm-musleabihf", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-arm-musleabihf", - "hash": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==" - } - }, - "npm:@unrs/resolver-binding-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-arm64-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-arm64-gnu", - "hash": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==" - } - }, - "npm:@unrs/resolver-binding-linux-arm64-musl": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-arm64-musl", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-arm64-musl", - "hash": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==" - } - }, - "npm:@unrs/resolver-binding-linux-ppc64-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-ppc64-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-ppc64-gnu", - "hash": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==" - } - }, - "npm:@unrs/resolver-binding-linux-riscv64-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-riscv64-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-riscv64-gnu", - "hash": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==" - } - }, - "npm:@unrs/resolver-binding-linux-riscv64-musl": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-riscv64-musl", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-riscv64-musl", - "hash": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==" - } - }, - "npm:@unrs/resolver-binding-linux-s390x-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-s390x-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-s390x-gnu", - "hash": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==" - } - }, - "npm:@unrs/resolver-binding-linux-x64-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-x64-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-x64-gnu", - "hash": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==" - } - }, - "npm:@unrs/resolver-binding-linux-x64-musl": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-x64-musl", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-x64-musl", - "hash": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==" - } - }, - "npm:@unrs/resolver-binding-wasm32-wasi": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-wasm32-wasi", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-wasm32-wasi", - "hash": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==" - } - }, - "npm:@unrs/resolver-binding-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-win32-arm64-msvc", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-win32-arm64-msvc", - "hash": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==" - } - }, - "npm:@unrs/resolver-binding-win32-ia32-msvc": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-win32-ia32-msvc", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-win32-ia32-msvc", - "hash": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==" - } - }, - "npm:@unrs/resolver-binding-win32-x64-msvc": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-win32-x64-msvc", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-win32-x64-msvc", - "hash": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==" - } - }, - "npm:@vercel/nft": { - "type": "npm", - "name": "npm:@vercel/nft", - "data": { - "version": "0.30.3", - "packageName": "@vercel/nft", - "hash": "sha512-UEq+eF0ocEf9WQCV1gktxKhha36KDs7jln5qii6UpPf5clMqDc0p3E7d9l2Smx0i9Pm1qpq4S4lLfNl97bbv6w==" - } - }, - "npm:@vitejs/plugin-react": { - "type": "npm", - "name": "npm:@vitejs/plugin-react", - "data": { - "version": "5.1.1", - "packageName": "@vitejs/plugin-react", - "hash": "sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==" - } - }, - "npm:@vitest/expect": { - "type": "npm", - "name": "npm:@vitest/expect", - "data": { - "version": "4.0.14", - "packageName": "@vitest/expect", - "hash": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==" - } - }, - "npm:@vitest/mocker": { - "type": "npm", - "name": "npm:@vitest/mocker", - "data": { - "version": "4.0.14", - "packageName": "@vitest/mocker", - "hash": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==" - } - }, - "npm:@vitest/pretty-format": { - "type": "npm", - "name": "npm:@vitest/pretty-format", - "data": { - "version": "4.0.14", - "packageName": "@vitest/pretty-format", - "hash": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==" - } - }, - "npm:@vitest/runner": { - "type": "npm", - "name": "npm:@vitest/runner", - "data": { - "version": "4.0.14", - "packageName": "@vitest/runner", - "hash": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==" - } - }, - "npm:@vitest/snapshot": { - "type": "npm", - "name": "npm:@vitest/snapshot", - "data": { - "version": "4.0.14", - "packageName": "@vitest/snapshot", - "hash": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==" - } - }, - "npm:@vitest/spy": { - "type": "npm", - "name": "npm:@vitest/spy", - "data": { - "version": "4.0.14", - "packageName": "@vitest/spy", - "hash": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==" - } - }, - "npm:@vitest/utils": { - "type": "npm", - "name": "npm:@vitest/utils", - "data": { - "version": "4.0.14", - "packageName": "@vitest/utils", - "hash": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==" - } - }, - "npm:@volar/language-core": { - "type": "npm", - "name": "npm:@volar/language-core", - "data": { - "version": "2.4.23", - "packageName": "@volar/language-core", - "hash": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==" - } - }, - "npm:@volar/source-map": { - "type": "npm", - "name": "npm:@volar/source-map", - "data": { - "version": "2.4.23", - "packageName": "@volar/source-map", - "hash": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==" - } - }, - "npm:@volar/typescript": { - "type": "npm", - "name": "npm:@volar/typescript", - "data": { - "version": "2.4.23", - "packageName": "@volar/typescript", - "hash": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==" - } - }, - "npm:@vue/compiler-core": { - "type": "npm", - "name": "npm:@vue/compiler-core", - "data": { - "version": "3.5.24", - "packageName": "@vue/compiler-core", - "hash": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==" - } - }, - "npm:@vue/compiler-dom": { - "type": "npm", - "name": "npm:@vue/compiler-dom", - "data": { - "version": "3.5.24", - "packageName": "@vue/compiler-dom", - "hash": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==" - } - }, - "npm:@vue/compiler-vue2": { - "type": "npm", - "name": "npm:@vue/compiler-vue2", - "data": { - "version": "2.7.16", - "packageName": "@vue/compiler-vue2", - "hash": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==" - } - }, - "npm:@vue/language-core": { - "type": "npm", - "name": "npm:@vue/language-core", - "data": { - "version": "2.1.6", - "packageName": "@vue/language-core", - "hash": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==" - } - }, - "npm:@vue/shared": { - "type": "npm", - "name": "npm:@vue/shared", - "data": { - "version": "3.5.24", - "packageName": "@vue/shared", - "hash": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==" - } - }, - "npm:@yarnpkg/lockfile": { - "type": "npm", - "name": "npm:@yarnpkg/lockfile", - "data": { - "version": "1.1.0", - "packageName": "@yarnpkg/lockfile", - "hash": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" - } - }, - "npm:@yarnpkg/parsers": { - "type": "npm", - "name": "npm:@yarnpkg/parsers", - "data": { - "version": "3.0.2", - "packageName": "@yarnpkg/parsers", - "hash": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==" - } - }, - "npm:@zkochan/js-yaml": { - "type": "npm", - "name": "npm:@zkochan/js-yaml", - "data": { - "version": "0.0.7", - "packageName": "@zkochan/js-yaml", - "hash": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==" - } - }, - "npm:JSONStream": { - "type": "npm", - "name": "npm:JSONStream", - "data": { - "version": "1.3.5", - "packageName": "JSONStream", - "hash": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==" - } - }, - "npm:abbrev": { - "type": "npm", - "name": "npm:abbrev", - "data": { - "version": "3.0.1", - "packageName": "abbrev", - "hash": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" - } - }, - "npm:abort-controller": { - "type": "npm", - "name": "npm:abort-controller", - "data": { - "version": "3.0.0", - "packageName": "abort-controller", - "hash": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==" - } - }, - "npm:acorn-import-attributes": { - "type": "npm", - "name": "npm:acorn-import-attributes", - "data": { - "version": "1.9.5", - "packageName": "acorn-import-attributes", - "hash": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==" - } - }, - "npm:acorn-jsx": { - "type": "npm", - "name": "npm:acorn-jsx", - "data": { - "version": "5.3.2", - "packageName": "acorn-jsx", - "hash": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - } - }, - "npm:acorn": { - "type": "npm", - "name": "npm:acorn", - "data": { - "version": "8.15.0", - "packageName": "acorn", - "hash": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" - } - }, - "npm:agent-base": { - "type": "npm", - "name": "npm:agent-base", - "data": { - "version": "7.1.4", - "packageName": "agent-base", - "hash": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" - } - }, - "npm:ajv-draft-04": { - "type": "npm", - "name": "npm:ajv-draft-04", - "data": { - "version": "1.0.0", - "packageName": "ajv-draft-04", - "hash": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==" - } - }, - "npm:ajv-formats": { - "type": "npm", - "name": "npm:ajv-formats", - "data": { - "version": "3.0.1", - "packageName": "ajv-formats", - "hash": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==" - } - }, - "npm:ajv@6.12.6": { - "type": "npm", - "name": "npm:ajv@6.12.6", - "data": { - "version": "6.12.6", - "packageName": "ajv", - "hash": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - } - }, - "npm:ajv@8.12.0": { - "type": "npm", - "name": "npm:ajv@8.12.0", - "data": { - "version": "8.12.0", - "packageName": "ajv", - "hash": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==" - } - }, - "npm:ajv@8.13.0": { - "type": "npm", - "name": "npm:ajv@8.13.0", - "data": { - "version": "8.13.0", - "packageName": "ajv", - "hash": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==" - } - }, - "npm:ansi-colors": { - "type": "npm", - "name": "npm:ansi-colors", - "data": { - "version": "4.1.3", - "packageName": "ansi-colors", - "hash": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" - } - }, - "npm:ansi-regex@5.0.1": { - "type": "npm", - "name": "npm:ansi-regex@5.0.1", - "data": { - "version": "5.0.1", - "packageName": "ansi-regex", - "hash": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - }, - "npm:ansi-regex@6.2.2": { - "type": "npm", - "name": "npm:ansi-regex@6.2.2", - "data": { - "version": "6.2.2", - "packageName": "ansi-regex", - "hash": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" - } - }, - "npm:ansi-styles@4.3.0": { - "type": "npm", - "name": "npm:ansi-styles@4.3.0", - "data": { - "version": "4.3.0", - "packageName": "ansi-styles", - "hash": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - } - }, - "npm:ansi-styles@5.2.0": { - "type": "npm", - "name": "npm:ansi-styles@5.2.0", - "data": { - "version": "5.2.0", - "packageName": "ansi-styles", - "hash": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - }, - "npm:ansi-styles@6.2.3": { - "type": "npm", - "name": "npm:ansi-styles@6.2.3", - "data": { - "version": "6.2.3", - "packageName": "ansi-styles", - "hash": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" - } - }, - "npm:ansis": { - "type": "npm", - "name": "npm:ansis", - "data": { - "version": "4.2.0", - "packageName": "ansis", - "hash": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==" - } - }, - "npm:anymatch": { - "type": "npm", - "name": "npm:anymatch", - "data": { - "version": "3.1.3", - "packageName": "anymatch", - "hash": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" - } - }, - "npm:archiver-utils": { - "type": "npm", - "name": "npm:archiver-utils", - "data": { - "version": "5.0.2", - "packageName": "archiver-utils", - "hash": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==" - } - }, - "npm:archiver": { - "type": "npm", - "name": "npm:archiver", - "data": { - "version": "7.0.1", - "packageName": "archiver", - "hash": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==" - } - }, - "npm:argparse@1.0.10": { - "type": "npm", - "name": "npm:argparse@1.0.10", - "data": { - "version": "1.0.10", - "packageName": "argparse", - "hash": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" - } - }, - "npm:argparse@2.0.1": { - "type": "npm", - "name": "npm:argparse@2.0.1", - "data": { - "version": "2.0.1", - "packageName": "argparse", - "hash": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - } - }, - "npm:aria-query@5.3.0": { - "type": "npm", - "name": "npm:aria-query@5.3.0", - "data": { - "version": "5.3.0", - "packageName": "aria-query", - "hash": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==" - } - }, - "npm:aria-query@5.3.2": { - "type": "npm", - "name": "npm:aria-query@5.3.2", - "data": { - "version": "5.3.2", - "packageName": "aria-query", - "hash": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" - } - }, - "npm:array-ify": { - "type": "npm", - "name": "npm:array-ify", - "data": { - "version": "1.0.0", - "packageName": "array-ify", - "hash": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" - } - }, - "npm:array-union": { - "type": "npm", - "name": "npm:array-union", - "data": { - "version": "2.1.0", - "packageName": "array-union", - "hash": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - } - }, - "npm:assertion-error": { - "type": "npm", - "name": "npm:assertion-error", - "data": { - "version": "2.0.1", - "packageName": "assertion-error", - "hash": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" - } - }, - "npm:ast-types": { - "type": "npm", - "name": "npm:ast-types", - "data": { - "version": "0.16.1", - "packageName": "ast-types", - "hash": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==" - } - }, - "npm:async-sema": { - "type": "npm", - "name": "npm:async-sema", - "data": { - "version": "3.1.1", - "packageName": "async-sema", - "hash": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" - } - }, - "npm:async": { - "type": "npm", - "name": "npm:async", - "data": { - "version": "3.2.6", - "packageName": "async", - "hash": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - } - }, - "npm:asynckit": { - "type": "npm", - "name": "npm:asynckit", - "data": { - "version": "0.4.0", - "packageName": "asynckit", - "hash": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - } - }, - "npm:axios": { - "type": "npm", - "name": "npm:axios", - "data": { - "version": "1.13.2", - "packageName": "axios", - "hash": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==" - } - }, - "npm:axobject-query": { - "type": "npm", - "name": "npm:axobject-query", - "data": { - "version": "4.1.0", - "packageName": "axobject-query", - "hash": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==" - } - }, - "npm:b4a": { - "type": "npm", - "name": "npm:b4a", - "data": { - "version": "1.7.3", - "packageName": "b4a", - "hash": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==" - } - }, - "npm:babel-dead-code-elimination": { - "type": "npm", - "name": "npm:babel-dead-code-elimination", - "data": { - "version": "1.0.10", - "packageName": "babel-dead-code-elimination", - "hash": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==" - } - }, - "npm:babel-plugin-jsx-dom-expressions": { - "type": "npm", - "name": "npm:babel-plugin-jsx-dom-expressions", - "data": { - "version": "0.40.3", - "packageName": "babel-plugin-jsx-dom-expressions", - "hash": "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==" - } - }, - "npm:babel-preset-solid": { - "type": "npm", - "name": "npm:babel-preset-solid", - "data": { - "version": "1.9.10", - "packageName": "babel-preset-solid", - "hash": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==" - } - }, - "npm:bail": { - "type": "npm", - "name": "npm:bail", - "data": { - "version": "2.0.2", - "packageName": "bail", - "hash": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - } - }, - "npm:balanced-match": { - "type": "npm", - "name": "npm:balanced-match", - "data": { - "version": "1.0.2", - "packageName": "balanced-match", - "hash": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - } - }, - "npm:bare-events": { - "type": "npm", - "name": "npm:bare-events", - "data": { - "version": "2.8.1", - "packageName": "bare-events", - "hash": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==" - } - }, - "npm:base64-js": { - "type": "npm", - "name": "npm:base64-js", - "data": { - "version": "1.5.1", - "packageName": "base64-js", - "hash": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - } - }, - "npm:baseline-browser-mapping": { - "type": "npm", - "name": "npm:baseline-browser-mapping", - "data": { - "version": "2.8.22", - "packageName": "baseline-browser-mapping", - "hash": "sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==" - } - }, - "npm:better-path-resolve": { - "type": "npm", - "name": "npm:better-path-resolve", - "data": { - "version": "1.0.0", - "packageName": "better-path-resolve", - "hash": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==" - } - }, - "npm:bidi-js": { - "type": "npm", - "name": "npm:bidi-js", - "data": { - "version": "1.0.3", - "packageName": "bidi-js", - "hash": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==" - } - }, - "npm:bignumber.js": { - "type": "npm", - "name": "npm:bignumber.js", - "data": { - "version": "9.3.1", - "packageName": "bignumber.js", - "hash": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" - } - }, - "npm:binary-extensions": { - "type": "npm", - "name": "npm:binary-extensions", - "data": { - "version": "2.3.0", - "packageName": "binary-extensions", - "hash": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" - } - }, - "npm:bindings": { - "type": "npm", - "name": "npm:bindings", - "data": { - "version": "1.5.0", - "packageName": "bindings", - "hash": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==" - } - }, - "npm:birecord": { - "type": "npm", - "name": "npm:birecord", - "data": { - "version": "0.1.1", - "packageName": "birecord", - "hash": "sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==" - } - }, - "npm:bl": { - "type": "npm", - "name": "npm:bl", - "data": { - "version": "4.1.0", - "packageName": "bl", - "hash": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==" - } - }, - "npm:boolbase": { - "type": "npm", - "name": "npm:boolbase", - "data": { - "version": "1.0.0", - "packageName": "boolbase", - "hash": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - } - }, - "npm:brace-expansion@1.1.12": { - "type": "npm", - "name": "npm:brace-expansion@1.1.12", - "data": { - "version": "1.1.12", - "packageName": "brace-expansion", - "hash": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==" - } - }, - "npm:brace-expansion@2.0.2": { - "type": "npm", - "name": "npm:brace-expansion@2.0.2", - "data": { - "version": "2.0.2", - "packageName": "brace-expansion", - "hash": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==" - } - }, - "npm:braces": { - "type": "npm", - "name": "npm:braces", - "data": { - "version": "3.0.3", - "packageName": "braces", - "hash": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==" - } - }, - "npm:browserslist": { - "type": "npm", - "name": "npm:browserslist", - "data": { - "version": "4.27.0", - "packageName": "browserslist", - "hash": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==" - } - }, - "npm:buffer-crc32": { - "type": "npm", - "name": "npm:buffer-crc32", - "data": { - "version": "1.0.0", - "packageName": "buffer-crc32", - "hash": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==" - } - }, - "npm:buffer-equal-constant-time": { - "type": "npm", - "name": "npm:buffer-equal-constant-time", - "data": { - "version": "1.0.1", - "packageName": "buffer-equal-constant-time", - "hash": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - } - }, - "npm:buffer-from": { - "type": "npm", - "name": "npm:buffer-from", - "data": { - "version": "1.1.2", - "packageName": "buffer-from", - "hash": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - } - }, - "npm:buffer@5.7.1": { - "type": "npm", - "name": "npm:buffer@5.7.1", - "data": { - "version": "5.7.1", - "packageName": "buffer", - "hash": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" - } - }, - "npm:buffer@6.0.3": { - "type": "npm", - "name": "npm:buffer@6.0.3", - "data": { - "version": "6.0.3", - "packageName": "buffer", - "hash": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==" - } - }, - "npm:bytes-iec": { - "type": "npm", - "name": "npm:bytes-iec", - "data": { - "version": "3.1.1", - "packageName": "bytes-iec", - "hash": "sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==" - } - }, - "npm:c12": { - "type": "npm", - "name": "npm:c12", - "data": { - "version": "3.3.1", - "packageName": "c12", - "hash": "sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ==" - } - }, - "npm:call-bind-apply-helpers": { - "type": "npm", - "name": "npm:call-bind-apply-helpers", - "data": { - "version": "1.0.2", - "packageName": "call-bind-apply-helpers", - "hash": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==" - } - }, - "npm:callsites": { - "type": "npm", - "name": "npm:callsites", - "data": { - "version": "3.1.0", - "packageName": "callsites", - "hash": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } - }, - "npm:caniuse-lite": { - "type": "npm", - "name": "npm:caniuse-lite", - "data": { - "version": "1.0.30001752", - "packageName": "caniuse-lite", - "hash": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==" - } - }, - "npm:ccount": { - "type": "npm", - "name": "npm:ccount", - "data": { - "version": "2.0.1", - "packageName": "ccount", - "hash": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" - } - }, - "npm:chai": { - "type": "npm", - "name": "npm:chai", - "data": { - "version": "6.2.1", - "packageName": "chai", - "hash": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==" - } - }, - "npm:chalk@4.1.2": { - "type": "npm", - "name": "npm:chalk@4.1.2", - "data": { - "version": "4.1.2", - "packageName": "chalk", - "hash": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - } - }, - "npm:chalk@5.6.2": { - "type": "npm", - "name": "npm:chalk@5.6.2", - "data": { - "version": "5.6.2", - "packageName": "chalk", - "hash": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" - } - }, - "npm:character-entities-html4": { - "type": "npm", - "name": "npm:character-entities-html4", - "data": { - "version": "2.1.0", - "packageName": "character-entities-html4", - "hash": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" - } - }, - "npm:character-entities-legacy": { - "type": "npm", - "name": "npm:character-entities-legacy", - "data": { - "version": "3.0.0", - "packageName": "character-entities-legacy", - "hash": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" - } - }, - "npm:character-entities": { - "type": "npm", - "name": "npm:character-entities", - "data": { - "version": "2.0.2", - "packageName": "character-entities", - "hash": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" - } - }, - "npm:character-reference-invalid": { - "type": "npm", - "name": "npm:character-reference-invalid", - "data": { - "version": "2.0.1", - "packageName": "character-reference-invalid", - "hash": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" - } - }, - "npm:chardet": { - "type": "npm", - "name": "npm:chardet", - "data": { - "version": "2.1.1", - "packageName": "chardet", - "hash": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==" - } - }, - "npm:cheerio-select": { - "type": "npm", - "name": "npm:cheerio-select", - "data": { - "version": "2.1.0", - "packageName": "cheerio-select", - "hash": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==" - } - }, - "npm:cheerio": { - "type": "npm", - "name": "npm:cheerio", - "data": { - "version": "1.1.2", - "packageName": "cheerio", - "hash": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==" - } - }, - "npm:chokidar@3.6.0": { - "type": "npm", - "name": "npm:chokidar@3.6.0", - "data": { - "version": "3.6.0", - "packageName": "chokidar", - "hash": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==" - } - }, - "npm:chokidar@4.0.3": { - "type": "npm", - "name": "npm:chokidar@4.0.3", - "data": { - "version": "4.0.3", - "packageName": "chokidar", - "hash": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==" - } - }, - "npm:chownr": { - "type": "npm", - "name": "npm:chownr", - "data": { - "version": "3.0.0", - "packageName": "chownr", - "hash": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - } - }, - "npm:ci-info": { - "type": "npm", - "name": "npm:ci-info", - "data": { - "version": "3.9.0", - "packageName": "ci-info", - "hash": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" - } - }, - "npm:citty": { - "type": "npm", - "name": "npm:citty", - "data": { - "version": "0.1.6", - "packageName": "citty", - "hash": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==" - } - }, - "npm:cli-cursor": { - "type": "npm", - "name": "npm:cli-cursor", - "data": { - "version": "3.1.0", - "packageName": "cli-cursor", - "hash": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==" - } - }, - "npm:cli-spinners": { - "type": "npm", - "name": "npm:cli-spinners", - "data": { - "version": "2.6.1", - "packageName": "cli-spinners", - "hash": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" - } - }, - "npm:clipboardy": { - "type": "npm", - "name": "npm:clipboardy", - "data": { - "version": "4.0.0", - "packageName": "clipboardy", - "hash": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==" - } - }, - "npm:cliui": { - "type": "npm", - "name": "npm:cliui", - "data": { - "version": "8.0.1", - "packageName": "cliui", - "hash": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==" - } - }, - "npm:clone": { - "type": "npm", - "name": "npm:clone", - "data": { - "version": "1.0.4", - "packageName": "clone", - "hash": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" - } - }, - "npm:clsx": { - "type": "npm", - "name": "npm:clsx", - "data": { - "version": "2.1.1", - "packageName": "clsx", - "hash": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" - } - }, - "npm:cluster-key-slot": { - "type": "npm", - "name": "npm:cluster-key-slot", - "data": { - "version": "1.1.2", - "packageName": "cluster-key-slot", - "hash": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" - } - }, - "npm:color-convert": { - "type": "npm", - "name": "npm:color-convert", - "data": { - "version": "2.0.1", - "packageName": "color-convert", - "hash": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - } - }, - "npm:color-name": { - "type": "npm", - "name": "npm:color-name", - "data": { - "version": "1.1.4", - "packageName": "color-name", - "hash": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - }, - "npm:combined-stream": { - "type": "npm", - "name": "npm:combined-stream", - "data": { - "version": "1.0.8", - "packageName": "combined-stream", - "hash": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - } - }, - "npm:comma-separated-tokens": { - "type": "npm", - "name": "npm:comma-separated-tokens", - "data": { - "version": "2.0.3", - "packageName": "comma-separated-tokens", - "hash": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" - } - }, - "npm:commander": { - "type": "npm", - "name": "npm:commander", - "data": { - "version": "2.20.3", - "packageName": "commander", - "hash": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - }, - "npm:comment-parser": { - "type": "npm", - "name": "npm:comment-parser", - "data": { - "version": "1.4.1", - "packageName": "comment-parser", - "hash": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==" - } - }, - "npm:commondir": { - "type": "npm", - "name": "npm:commondir", - "data": { - "version": "1.0.1", - "packageName": "commondir", - "hash": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - } - }, - "npm:compare-func": { - "type": "npm", - "name": "npm:compare-func", - "data": { - "version": "2.0.0", - "packageName": "compare-func", - "hash": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==" - } - }, - "npm:compare-versions": { - "type": "npm", - "name": "npm:compare-versions", - "data": { - "version": "6.1.1", - "packageName": "compare-versions", - "hash": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==" - } - }, - "npm:compatx": { - "type": "npm", - "name": "npm:compatx", - "data": { - "version": "0.2.0", - "packageName": "compatx", - "hash": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==" - } - }, - "npm:compress-commons": { - "type": "npm", - "name": "npm:compress-commons", - "data": { - "version": "6.0.2", - "packageName": "compress-commons", - "hash": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==" - } - }, - "npm:computeds": { - "type": "npm", - "name": "npm:computeds", - "data": { - "version": "0.0.1", - "packageName": "computeds", - "hash": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==" - } - }, - "npm:concat-map": { - "type": "npm", - "name": "npm:concat-map", - "data": { - "version": "0.0.1", - "packageName": "concat-map", - "hash": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - } - }, - "npm:confbox@0.1.8": { - "type": "npm", - "name": "npm:confbox@0.1.8", - "data": { - "version": "0.1.8", - "packageName": "confbox", - "hash": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" - } - }, - "npm:confbox@0.2.2": { - "type": "npm", - "name": "npm:confbox@0.2.2", - "data": { - "version": "0.2.2", - "packageName": "confbox", - "hash": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==" - } - }, - "npm:consola": { - "type": "npm", - "name": "npm:consola", - "data": { - "version": "3.4.2", - "packageName": "consola", - "hash": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==" - } - }, - "npm:conventional-changelog-angular": { - "type": "npm", - "name": "npm:conventional-changelog-angular", - "data": { - "version": "7.0.0", - "packageName": "conventional-changelog-angular", - "hash": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==" - } - }, - "npm:conventional-commits-parser": { - "type": "npm", - "name": "npm:conventional-commits-parser", - "data": { - "version": "5.0.0", - "packageName": "conventional-commits-parser", - "hash": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==" - } - }, - "npm:convert-source-map": { - "type": "npm", - "name": "npm:convert-source-map", - "data": { - "version": "2.0.0", - "packageName": "convert-source-map", - "hash": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - } - }, - "npm:cookie-es@1.2.2": { - "type": "npm", - "name": "npm:cookie-es@1.2.2", - "data": { - "version": "1.2.2", - "packageName": "cookie-es", - "hash": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" - } - }, - "npm:cookie-es@2.0.0": { - "type": "npm", - "name": "npm:cookie-es@2.0.0", - "data": { - "version": "2.0.0", - "packageName": "cookie-es", - "hash": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==" - } - }, - "npm:cookie": { - "type": "npm", - "name": "npm:cookie", - "data": { - "version": "1.0.2", - "packageName": "cookie", - "hash": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==" - } - }, - "npm:core-util-is": { - "type": "npm", - "name": "npm:core-util-is", - "data": { - "version": "1.0.3", - "packageName": "core-util-is", - "hash": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - } - }, - "npm:crc-32": { - "type": "npm", - "name": "npm:crc-32", - "data": { - "version": "1.2.2", - "packageName": "crc-32", - "hash": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" - } - }, - "npm:crc32-stream": { - "type": "npm", - "name": "npm:crc32-stream", - "data": { - "version": "6.0.0", - "packageName": "crc32-stream", - "hash": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==" - } - }, - "npm:croner": { - "type": "npm", - "name": "npm:croner", - "data": { - "version": "9.1.0", - "packageName": "croner", - "hash": "sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==" - } - }, - "npm:cross-spawn": { - "type": "npm", - "name": "npm:cross-spawn", - "data": { - "version": "7.0.6", - "packageName": "cross-spawn", - "hash": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==" - } - }, - "npm:crossws": { - "type": "npm", - "name": "npm:crossws", - "data": { - "version": "0.3.5", - "packageName": "crossws", - "hash": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==" - } - }, - "npm:css-select": { - "type": "npm", - "name": "npm:css-select", - "data": { - "version": "5.2.2", - "packageName": "css-select", - "hash": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==" - } - }, - "npm:css-tree": { - "type": "npm", - "name": "npm:css-tree", - "data": { - "version": "3.1.0", - "packageName": "css-tree", - "hash": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==" - } - }, - "npm:css-what": { - "type": "npm", - "name": "npm:css-what", - "data": { - "version": "6.2.2", - "packageName": "css-what", - "hash": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" - } - }, - "npm:css.escape": { - "type": "npm", - "name": "npm:css.escape", - "data": { - "version": "1.5.1", - "packageName": "css.escape", - "hash": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - } - }, - "npm:cssstyle": { - "type": "npm", - "name": "npm:cssstyle", - "data": { - "version": "5.3.3", - "packageName": "cssstyle", - "hash": "sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==" - } - }, - "npm:csstype@3.1.3": { - "type": "npm", - "name": "npm:csstype@3.1.3", - "data": { - "version": "3.1.3", - "packageName": "csstype", - "hash": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - } - }, - "npm:csstype@3.2.3": { - "type": "npm", - "name": "npm:csstype@3.2.3", - "data": { - "version": "3.2.3", - "packageName": "csstype", - "hash": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" - } - }, - "npm:data-uri-to-buffer": { - "type": "npm", - "name": "npm:data-uri-to-buffer", - "data": { - "version": "4.0.1", - "packageName": "data-uri-to-buffer", - "hash": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" - } - }, - "npm:data-urls": { - "type": "npm", - "name": "npm:data-urls", - "data": { - "version": "6.0.0", - "packageName": "data-urls", - "hash": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==" - } - }, - "npm:dataloader": { - "type": "npm", - "name": "npm:dataloader", - "data": { - "version": "1.4.0", - "packageName": "dataloader", - "hash": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" - } - }, - "npm:db0": { - "type": "npm", - "name": "npm:db0", - "data": { - "version": "0.3.4", - "packageName": "db0", - "hash": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==" - } - }, - "npm:de-indent": { - "type": "npm", - "name": "npm:de-indent", - "data": { - "version": "1.0.2", - "packageName": "de-indent", - "hash": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" - } - }, - "npm:debug": { - "type": "npm", - "name": "npm:debug", - "data": { - "version": "4.4.3", - "packageName": "debug", - "hash": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==" - } - }, - "npm:decimal.js": { - "type": "npm", - "name": "npm:decimal.js", - "data": { - "version": "10.6.0", - "packageName": "decimal.js", - "hash": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==" - } - }, - "npm:decode-named-character-reference": { - "type": "npm", - "name": "npm:decode-named-character-reference", - "data": { - "version": "1.2.0", - "packageName": "decode-named-character-reference", - "hash": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==" - } - }, - "npm:deep-is": { - "type": "npm", - "name": "npm:deep-is", - "data": { - "version": "0.1.4", - "packageName": "deep-is", - "hash": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - } - }, - "npm:deepmerge": { - "type": "npm", - "name": "npm:deepmerge", - "data": { - "version": "4.3.1", - "packageName": "deepmerge", - "hash": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - } - }, - "npm:defaults": { - "type": "npm", - "name": "npm:defaults", - "data": { - "version": "1.0.4", - "packageName": "defaults", - "hash": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==" - } - }, - "npm:define-lazy-prop": { - "type": "npm", - "name": "npm:define-lazy-prop", - "data": { - "version": "2.0.0", - "packageName": "define-lazy-prop", - "hash": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - } - }, - "npm:defu": { - "type": "npm", - "name": "npm:defu", - "data": { - "version": "6.1.4", - "packageName": "defu", - "hash": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" - } - }, - "npm:delayed-stream": { - "type": "npm", - "name": "npm:delayed-stream", - "data": { - "version": "1.0.0", - "packageName": "delayed-stream", - "hash": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - } - }, - "npm:denque": { - "type": "npm", - "name": "npm:denque", - "data": { - "version": "2.1.0", - "packageName": "denque", - "hash": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" - } - }, - "npm:depd": { - "type": "npm", - "name": "npm:depd", - "data": { - "version": "2.0.0", - "packageName": "depd", - "hash": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } - }, - "npm:dequal": { - "type": "npm", - "name": "npm:dequal", - "data": { - "version": "2.0.3", - "packageName": "dequal", - "hash": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - } - }, - "npm:destr": { - "type": "npm", - "name": "npm:destr", - "data": { - "version": "2.0.5", - "packageName": "destr", - "hash": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" - } - }, - "npm:detect-indent": { - "type": "npm", - "name": "npm:detect-indent", - "data": { - "version": "6.1.0", - "packageName": "detect-indent", - "hash": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" - } - }, - "npm:detect-libc@1.0.3": { - "type": "npm", - "name": "npm:detect-libc@1.0.3", - "data": { - "version": "1.0.3", - "packageName": "detect-libc", - "hash": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" - } - }, - "npm:detect-libc@2.1.2": { - "type": "npm", - "name": "npm:detect-libc@2.1.2", - "data": { - "version": "2.1.2", - "packageName": "detect-libc", - "hash": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" - } - }, - "npm:devalue": { - "type": "npm", - "name": "npm:devalue", - "data": { - "version": "5.5.0", - "packageName": "devalue", - "hash": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==" - } - }, - "npm:devlop": { - "type": "npm", - "name": "npm:devlop", - "data": { - "version": "1.1.0", - "packageName": "devlop", - "hash": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==" - } - }, - "npm:diff": { - "type": "npm", - "name": "npm:diff", - "data": { - "version": "8.0.2", - "packageName": "diff", - "hash": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==" - } - }, - "npm:dir-glob": { - "type": "npm", - "name": "npm:dir-glob", - "data": { - "version": "3.0.1", - "packageName": "dir-glob", - "hash": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" - } - }, - "npm:dom-accessibility-api@0.5.16": { - "type": "npm", - "name": "npm:dom-accessibility-api@0.5.16", - "data": { - "version": "0.5.16", - "packageName": "dom-accessibility-api", - "hash": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - } - }, - "npm:dom-accessibility-api@0.6.3": { - "type": "npm", - "name": "npm:dom-accessibility-api@0.6.3", - "data": { - "version": "0.6.3", - "packageName": "dom-accessibility-api", - "hash": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" - } - }, - "npm:dom-serializer": { - "type": "npm", - "name": "npm:dom-serializer", - "data": { - "version": "2.0.0", - "packageName": "dom-serializer", - "hash": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==" - } - }, - "npm:domelementtype": { - "type": "npm", - "name": "npm:domelementtype", - "data": { - "version": "2.3.0", - "packageName": "domelementtype", - "hash": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - } - }, - "npm:domhandler": { - "type": "npm", - "name": "npm:domhandler", - "data": { - "version": "5.0.3", - "packageName": "domhandler", - "hash": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==" - } - }, - "npm:domutils": { - "type": "npm", - "name": "npm:domutils", - "data": { - "version": "3.2.2", - "packageName": "domutils", - "hash": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==" - } - }, - "npm:dot-prop@10.1.0": { - "type": "npm", - "name": "npm:dot-prop@10.1.0", - "data": { - "version": "10.1.0", - "packageName": "dot-prop", - "hash": "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==" - } - }, - "npm:dot-prop@5.3.0": { - "type": "npm", - "name": "npm:dot-prop@5.3.0", - "data": { - "version": "5.3.0", - "packageName": "dot-prop", - "hash": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" - } - }, - "npm:dotenv-expand": { - "type": "npm", - "name": "npm:dotenv-expand", - "data": { - "version": "11.0.7", - "packageName": "dotenv-expand", - "hash": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==" - } - }, - "npm:dotenv@16.4.7": { - "type": "npm", - "name": "npm:dotenv@16.4.7", - "data": { - "version": "16.4.7", - "packageName": "dotenv", - "hash": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==" - } - }, - "npm:dotenv@16.6.1": { - "type": "npm", - "name": "npm:dotenv@16.6.1", - "data": { - "version": "16.6.1", - "packageName": "dotenv", - "hash": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==" - } - }, - "npm:dotenv@17.2.3": { - "type": "npm", - "name": "npm:dotenv@17.2.3", - "data": { - "version": "17.2.3", - "packageName": "dotenv", - "hash": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==" - } - }, - "npm:dunder-proto": { - "type": "npm", - "name": "npm:dunder-proto", - "data": { - "version": "1.0.1", - "packageName": "dunder-proto", - "hash": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==" - } - }, - "npm:duplexer": { - "type": "npm", - "name": "npm:duplexer", - "data": { - "version": "0.1.2", - "packageName": "duplexer", - "hash": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - } - }, - "npm:eastasianwidth": { - "type": "npm", - "name": "npm:eastasianwidth", - "data": { - "version": "0.2.0", - "packageName": "eastasianwidth", - "hash": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - } - }, - "npm:ecdsa-sig-formatter": { - "type": "npm", - "name": "npm:ecdsa-sig-formatter", - "data": { - "version": "1.0.11", - "packageName": "ecdsa-sig-formatter", - "hash": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==" - } - }, - "npm:ee-first": { - "type": "npm", - "name": "npm:ee-first", - "data": { - "version": "1.1.1", - "packageName": "ee-first", - "hash": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - } - }, - "npm:electron-to-chromium": { - "type": "npm", - "name": "npm:electron-to-chromium", - "data": { - "version": "1.5.244", - "packageName": "electron-to-chromium", - "hash": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==" - } - }, - "npm:emoji-regex@8.0.0": { - "type": "npm", - "name": "npm:emoji-regex@8.0.0", - "data": { - "version": "8.0.0", - "packageName": "emoji-regex", - "hash": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } - }, - "npm:emoji-regex@9.2.2": { - "type": "npm", - "name": "npm:emoji-regex@9.2.2", - "data": { - "version": "9.2.2", - "packageName": "emoji-regex", - "hash": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - } - }, - "npm:encodeurl": { - "type": "npm", - "name": "npm:encodeurl", - "data": { - "version": "2.0.0", - "packageName": "encodeurl", - "hash": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" - } - }, - "npm:encoding-sniffer": { - "type": "npm", - "name": "npm:encoding-sniffer", - "data": { - "version": "0.2.1", - "packageName": "encoding-sniffer", - "hash": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==" - } - }, - "npm:end-of-stream": { - "type": "npm", - "name": "npm:end-of-stream", - "data": { - "version": "1.4.5", - "packageName": "end-of-stream", - "hash": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==" - } - }, - "npm:enhanced-resolve": { - "type": "npm", - "name": "npm:enhanced-resolve", - "data": { - "version": "5.18.3", - "packageName": "enhanced-resolve", - "hash": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==" - } - }, - "npm:enquirer@2.3.6": { - "type": "npm", - "name": "npm:enquirer@2.3.6", - "data": { - "version": "2.3.6", - "packageName": "enquirer", - "hash": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" - } - }, - "npm:enquirer@2.4.1": { - "type": "npm", - "name": "npm:enquirer@2.4.1", - "data": { - "version": "2.4.1", - "packageName": "enquirer", - "hash": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==" - } - }, - "npm:entities@4.5.0": { - "type": "npm", - "name": "npm:entities@4.5.0", - "data": { - "version": "4.5.0", - "packageName": "entities", - "hash": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - } - }, - "npm:entities@6.0.1": { - "type": "npm", - "name": "npm:entities@6.0.1", - "data": { - "version": "6.0.1", - "packageName": "entities", - "hash": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" - } - }, - "npm:error-stack-parser-es": { - "type": "npm", - "name": "npm:error-stack-parser-es", - "data": { - "version": "1.0.5", - "packageName": "error-stack-parser-es", - "hash": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==" - } - }, - "npm:es-define-property": { - "type": "npm", - "name": "npm:es-define-property", - "data": { - "version": "1.0.1", - "packageName": "es-define-property", - "hash": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" - } - }, - "npm:es-errors": { - "type": "npm", - "name": "npm:es-errors", - "data": { - "version": "1.3.0", - "packageName": "es-errors", - "hash": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - } - }, - "npm:es-module-lexer": { - "type": "npm", - "name": "npm:es-module-lexer", - "data": { - "version": "1.7.0", - "packageName": "es-module-lexer", - "hash": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" - } - }, - "npm:es-object-atoms": { - "type": "npm", - "name": "npm:es-object-atoms", - "data": { - "version": "1.1.1", - "packageName": "es-object-atoms", - "hash": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==" - } - }, - "npm:es-set-tostringtag": { - "type": "npm", - "name": "npm:es-set-tostringtag", - "data": { - "version": "2.1.0", - "packageName": "es-set-tostringtag", - "hash": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==" - } - }, - "npm:esbuild": { - "type": "npm", - "name": "npm:esbuild", - "data": { - "version": "0.25.12", - "packageName": "esbuild", - "hash": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==" - } - }, - "npm:escalade": { - "type": "npm", - "name": "npm:escalade", - "data": { - "version": "3.2.0", - "packageName": "escalade", - "hash": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" - } - }, - "npm:escape-html": { - "type": "npm", - "name": "npm:escape-html", - "data": { - "version": "1.0.3", - "packageName": "escape-html", - "hash": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - } - }, - "npm:escape-string-regexp@1.0.5": { - "type": "npm", - "name": "npm:escape-string-regexp@1.0.5", - "data": { - "version": "1.0.5", - "packageName": "escape-string-regexp", - "hash": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - } - }, - "npm:escape-string-regexp@4.0.0": { - "type": "npm", - "name": "npm:escape-string-regexp@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "escape-string-regexp", - "hash": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - } - }, - "npm:escape-string-regexp@5.0.0": { - "type": "npm", - "name": "npm:escape-string-regexp@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "escape-string-regexp", - "hash": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - } - }, - "npm:eslint-compat-utils": { - "type": "npm", - "name": "npm:eslint-compat-utils", - "data": { - "version": "0.5.1", - "packageName": "eslint-compat-utils", - "hash": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==" - } - }, - "npm:eslint-import-context": { - "type": "npm", - "name": "npm:eslint-import-context", - "data": { - "version": "0.1.9", - "packageName": "eslint-import-context", - "hash": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==" - } - }, - "npm:eslint-plugin-es-x": { - "type": "npm", - "name": "npm:eslint-plugin-es-x", - "data": { - "version": "7.8.0", - "packageName": "eslint-plugin-es-x", - "hash": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==" - } - }, - "npm:eslint-plugin-import-x": { - "type": "npm", - "name": "npm:eslint-plugin-import-x", - "data": { - "version": "4.16.1", - "packageName": "eslint-plugin-import-x", - "hash": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==" - } - }, - "npm:eslint-plugin-n": { - "type": "npm", - "name": "npm:eslint-plugin-n", - "data": { - "version": "17.23.1", - "packageName": "eslint-plugin-n", - "hash": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==" - } - }, - "npm:eslint-plugin-react-compiler": { - "type": "npm", - "name": "npm:eslint-plugin-react-compiler", - "data": { - "version": "19.1.0-rc.2", - "packageName": "eslint-plugin-react-compiler", - "hash": "sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==" - } - }, - "npm:eslint-plugin-react-dom": { - "type": "npm", - "name": "npm:eslint-plugin-react-dom", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-dom", - "hash": "sha512-xflcmWONib2KN54bJ25AvrYSPrp0qDWwWoG+tZJWD7xe0OcvC42zpERKyMuqTMuXfKPJNUOs2ZB1z6e3HNRviw==" - } - }, - "npm:eslint-plugin-react-hooks-extra": { - "type": "npm", - "name": "npm:eslint-plugin-react-hooks-extra", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-hooks-extra", - "hash": "sha512-ImANssr1gfBNMahqCufe2nhb1CZpqMBjKYgwtYF6u0pV11UXnGj181MW+YBEPEB+qIN4NK3hKxSsQngQJPBfQQ==" - } - }, - "npm:eslint-plugin-react-hooks": { - "type": "npm", - "name": "npm:eslint-plugin-react-hooks", - "data": { - "version": "7.0.1", - "packageName": "eslint-plugin-react-hooks", - "hash": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==" - } - }, - "npm:eslint-plugin-react-naming-convention": { - "type": "npm", - "name": "npm:eslint-plugin-react-naming-convention", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-naming-convention", - "hash": "sha512-3cxHcn6oA29awTQr20LCw9XBhms65giuHHclU3KyLtFVoHSX/LUJtXUpv/KezkhRiaavT8PmxGTGMZiGGY9vHw==" - } - }, - "npm:eslint-plugin-react-web-api": { - "type": "npm", - "name": "npm:eslint-plugin-react-web-api", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-web-api", - "hash": "sha512-AlSBt0ITf1nT1I6U4Kyj9GoFEpfLh8sR62sl+6uYSladmhPAKXMOSB7Ban7VX6jZcA7LHp+acKAJCv18fKxaUg==" - } - }, - "npm:eslint-plugin-react-x": { - "type": "npm", - "name": "npm:eslint-plugin-react-x", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-x", - "hash": "sha512-G0Aqk7oHMVmMNnulpQ2nb/Iq2o9JNkk3WQT70zBVQJYIz6NUrXp/1ujL2+cXb5A8ZapEN53F0pP9ZoQRIzNhsA==" - } - }, - "npm:eslint-plugin-unused-imports": { - "type": "npm", - "name": "npm:eslint-plugin-unused-imports", - "data": { - "version": "4.3.0", - "packageName": "eslint-plugin-unused-imports", - "hash": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==" - } - }, - "npm:eslint-scope": { - "type": "npm", - "name": "npm:eslint-scope", - "data": { - "version": "8.4.0", - "packageName": "eslint-scope", - "hash": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==" - } - }, - "npm:eslint-visitor-keys@3.4.3": { - "type": "npm", - "name": "npm:eslint-visitor-keys@3.4.3", - "data": { - "version": "3.4.3", - "packageName": "eslint-visitor-keys", - "hash": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" - } - }, - "npm:eslint-visitor-keys@4.2.1": { - "type": "npm", - "name": "npm:eslint-visitor-keys@4.2.1", - "data": { - "version": "4.2.1", - "packageName": "eslint-visitor-keys", - "hash": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==" - } - }, - "npm:eslint": { - "type": "npm", - "name": "npm:eslint", - "data": { - "version": "9.39.1", - "packageName": "eslint", - "hash": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==" - } - }, - "npm:esm-env": { - "type": "npm", - "name": "npm:esm-env", - "data": { - "version": "1.2.2", - "packageName": "esm-env", - "hash": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" - } - }, - "npm:espree": { - "type": "npm", - "name": "npm:espree", - "data": { - "version": "10.4.0", - "packageName": "espree", - "hash": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==" - } - }, - "npm:esprima": { - "type": "npm", - "name": "npm:esprima", - "data": { - "version": "4.0.1", - "packageName": "esprima", - "hash": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - } - }, - "npm:esquery": { - "type": "npm", - "name": "npm:esquery", - "data": { - "version": "1.6.0", - "packageName": "esquery", - "hash": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==" - } - }, - "npm:esrap": { - "type": "npm", - "name": "npm:esrap", - "data": { - "version": "2.2.0", - "packageName": "esrap", - "hash": "sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg==" - } - }, - "npm:esrecurse": { - "type": "npm", - "name": "npm:esrecurse", - "data": { - "version": "4.3.0", - "packageName": "esrecurse", - "hash": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" - } - }, - "npm:estraverse": { - "type": "npm", - "name": "npm:estraverse", - "data": { - "version": "5.3.0", - "packageName": "estraverse", - "hash": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - } - }, - "npm:estree-util-is-identifier-name": { - "type": "npm", - "name": "npm:estree-util-is-identifier-name", - "data": { - "version": "3.0.0", - "packageName": "estree-util-is-identifier-name", - "hash": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==" - } - }, - "npm:estree-walker@2.0.2": { - "type": "npm", - "name": "npm:estree-walker@2.0.2", - "data": { - "version": "2.0.2", - "packageName": "estree-walker", - "hash": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - } - }, - "npm:estree-walker@3.0.3": { - "type": "npm", - "name": "npm:estree-walker@3.0.3", - "data": { - "version": "3.0.3", - "packageName": "estree-walker", - "hash": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==" - } - }, - "npm:esutils": { - "type": "npm", - "name": "npm:esutils", - "data": { - "version": "2.0.3", - "packageName": "esutils", - "hash": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - } - }, - "npm:etag": { - "type": "npm", - "name": "npm:etag", - "data": { - "version": "1.8.1", - "packageName": "etag", - "hash": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - } - }, - "npm:event-target-shim": { - "type": "npm", - "name": "npm:event-target-shim", - "data": { - "version": "5.0.1", - "packageName": "event-target-shim", - "hash": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - } - }, - "npm:events-universal": { - "type": "npm", - "name": "npm:events-universal", - "data": { - "version": "1.0.1", - "packageName": "events-universal", - "hash": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==" - } - }, - "npm:events": { - "type": "npm", - "name": "npm:events", - "data": { - "version": "3.3.0", - "packageName": "events", - "hash": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - } - }, - "npm:eventsource-parser": { - "type": "npm", - "name": "npm:eventsource-parser", - "data": { - "version": "3.0.6", - "packageName": "eventsource-parser", - "hash": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==" - } - }, - "npm:execa": { - "type": "npm", - "name": "npm:execa", - "data": { - "version": "8.0.1", - "packageName": "execa", - "hash": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==" - } - }, - "npm:expect-type": { - "type": "npm", - "name": "npm:expect-type", - "data": { - "version": "1.2.2", - "packageName": "expect-type", - "hash": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==" - } - }, - "npm:exsolve": { - "type": "npm", - "name": "npm:exsolve", - "data": { - "version": "1.0.7", - "packageName": "exsolve", - "hash": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==" - } - }, - "npm:extend": { - "type": "npm", - "name": "npm:extend", - "data": { - "version": "3.0.2", - "packageName": "extend", - "hash": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - } - }, - "npm:extendable-error": { - "type": "npm", - "name": "npm:extendable-error", - "data": { - "version": "0.1.7", - "packageName": "extendable-error", - "hash": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==" - } - }, - "npm:fast-deep-equal": { - "type": "npm", - "name": "npm:fast-deep-equal", - "data": { - "version": "3.1.3", - "packageName": "fast-deep-equal", - "hash": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - } - }, - "npm:fast-fifo": { - "type": "npm", - "name": "npm:fast-fifo", - "data": { - "version": "1.3.2", - "packageName": "fast-fifo", - "hash": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - } - }, - "npm:fast-glob": { - "type": "npm", - "name": "npm:fast-glob", - "data": { - "version": "3.3.3", - "packageName": "fast-glob", - "hash": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==" - } - }, - "npm:fast-json-stable-stringify": { - "type": "npm", - "name": "npm:fast-json-stable-stringify", - "data": { - "version": "2.1.0", - "packageName": "fast-json-stable-stringify", - "hash": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - } - }, - "npm:fast-levenshtein": { - "type": "npm", - "name": "npm:fast-levenshtein", - "data": { - "version": "2.0.6", - "packageName": "fast-levenshtein", - "hash": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - } - }, - "npm:fastq": { - "type": "npm", - "name": "npm:fastq", - "data": { - "version": "1.19.1", - "packageName": "fastq", - "hash": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==" - } - }, - "npm:fd-package-json": { - "type": "npm", - "name": "npm:fd-package-json", - "data": { - "version": "2.0.0", - "packageName": "fd-package-json", - "hash": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==" - } - }, - "npm:fdir": { - "type": "npm", - "name": "npm:fdir", - "data": { - "version": "6.5.0", - "packageName": "fdir", - "hash": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==" - } - }, - "npm:fetch-blob": { - "type": "npm", - "name": "npm:fetch-blob", - "data": { - "version": "3.2.0", - "packageName": "fetch-blob", - "hash": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==" - } - }, - "npm:fetchdts": { - "type": "npm", - "name": "npm:fetchdts", - "data": { - "version": "0.1.7", - "packageName": "fetchdts", - "hash": "sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==" - } - }, - "npm:figures": { - "type": "npm", - "name": "npm:figures", - "data": { - "version": "3.2.0", - "packageName": "figures", - "hash": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" - } - }, - "npm:file-entry-cache": { - "type": "npm", - "name": "npm:file-entry-cache", - "data": { - "version": "8.0.0", - "packageName": "file-entry-cache", - "hash": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==" - } - }, - "npm:file-uri-to-path": { - "type": "npm", - "name": "npm:file-uri-to-path", - "data": { - "version": "1.0.0", - "packageName": "file-uri-to-path", - "hash": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - } - }, - "npm:fill-range": { - "type": "npm", - "name": "npm:fill-range", - "data": { - "version": "7.1.1", - "packageName": "fill-range", - "hash": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==" - } - }, - "npm:find-up@4.1.0": { - "type": "npm", - "name": "npm:find-up@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "find-up", - "hash": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" - } - }, - "npm:find-up@5.0.0": { - "type": "npm", - "name": "npm:find-up@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "find-up", - "hash": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" - } - }, - "npm:flat-cache": { - "type": "npm", - "name": "npm:flat-cache", - "data": { - "version": "4.0.1", - "packageName": "flat-cache", - "hash": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==" - } - }, - "npm:flat": { - "type": "npm", - "name": "npm:flat", - "data": { - "version": "5.0.2", - "packageName": "flat", - "hash": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - } - }, - "npm:flatted": { - "type": "npm", - "name": "npm:flatted", - "data": { - "version": "3.3.3", - "packageName": "flatted", - "hash": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" - } - }, - "npm:follow-redirects": { - "type": "npm", - "name": "npm:follow-redirects", - "data": { - "version": "1.15.11", - "packageName": "follow-redirects", - "hash": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" - } - }, - "npm:foreground-child": { - "type": "npm", - "name": "npm:foreground-child", - "data": { - "version": "3.3.1", - "packageName": "foreground-child", - "hash": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==" - } - }, - "npm:form-data": { - "type": "npm", - "name": "npm:form-data", - "data": { - "version": "4.0.4", - "packageName": "form-data", - "hash": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==" - } - }, - "npm:formatly": { - "type": "npm", - "name": "npm:formatly", - "data": { - "version": "0.3.0", - "packageName": "formatly", - "hash": "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==" - } - }, - "npm:formdata-polyfill": { - "type": "npm", - "name": "npm:formdata-polyfill", - "data": { - "version": "4.0.10", - "packageName": "formdata-polyfill", - "hash": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==" - } - }, - "npm:fresh": { - "type": "npm", - "name": "npm:fresh", - "data": { - "version": "2.0.0", - "packageName": "fresh", - "hash": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" - } - }, - "npm:front-matter": { - "type": "npm", - "name": "npm:front-matter", - "data": { - "version": "4.0.2", - "packageName": "front-matter", - "hash": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==" - } - }, - "npm:fs-constants": { - "type": "npm", - "name": "npm:fs-constants", - "data": { - "version": "1.0.0", - "packageName": "fs-constants", - "hash": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - } - }, - "npm:fs-extra@7.0.1": { - "type": "npm", - "name": "npm:fs-extra@7.0.1", - "data": { - "version": "7.0.1", - "packageName": "fs-extra", - "hash": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==" - } - }, - "npm:fs-extra@8.1.0": { - "type": "npm", - "name": "npm:fs-extra@8.1.0", - "data": { - "version": "8.1.0", - "packageName": "fs-extra", - "hash": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==" - } - }, - "npm:fsevents": { - "type": "npm", - "name": "npm:fsevents", - "data": { - "version": "2.3.3", - "packageName": "fsevents", - "hash": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" - } - }, - "npm:function-bind": { - "type": "npm", - "name": "npm:function-bind", - "data": { - "version": "1.1.2", - "packageName": "function-bind", - "hash": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - } - }, - "npm:gaxios": { - "type": "npm", - "name": "npm:gaxios", - "data": { - "version": "7.1.3", - "packageName": "gaxios", - "hash": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==" - } - }, - "npm:gcp-metadata": { - "type": "npm", - "name": "npm:gcp-metadata", - "data": { - "version": "8.1.2", - "packageName": "gcp-metadata", - "hash": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==" - } - }, - "npm:gensync": { - "type": "npm", - "name": "npm:gensync", - "data": { - "version": "1.0.0-beta.2", - "packageName": "gensync", - "hash": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - } - }, - "npm:get-caller-file": { - "type": "npm", - "name": "npm:get-caller-file", - "data": { - "version": "2.0.5", - "packageName": "get-caller-file", - "hash": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - } - }, - "npm:get-intrinsic": { - "type": "npm", - "name": "npm:get-intrinsic", - "data": { - "version": "1.3.0", - "packageName": "get-intrinsic", - "hash": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==" - } - }, - "npm:get-port-please": { - "type": "npm", - "name": "npm:get-port-please", - "data": { - "version": "3.2.0", - "packageName": "get-port-please", - "hash": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==" - } - }, - "npm:get-proto": { - "type": "npm", - "name": "npm:get-proto", - "data": { - "version": "1.0.1", - "packageName": "get-proto", - "hash": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==" - } - }, - "npm:get-stream": { - "type": "npm", - "name": "npm:get-stream", - "data": { - "version": "8.0.1", - "packageName": "get-stream", - "hash": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" - } - }, - "npm:get-tsconfig": { - "type": "npm", - "name": "npm:get-tsconfig", - "data": { - "version": "4.13.0", - "packageName": "get-tsconfig", - "hash": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==" - } - }, - "npm:giget": { - "type": "npm", - "name": "npm:giget", - "data": { - "version": "2.0.0", - "packageName": "giget", - "hash": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==" - } - }, - "npm:glob-parent@5.1.2": { - "type": "npm", - "name": "npm:glob-parent@5.1.2", - "data": { - "version": "5.1.2", - "packageName": "glob-parent", - "hash": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - } - }, - "npm:glob-parent@6.0.2": { - "type": "npm", - "name": "npm:glob-parent@6.0.2", - "data": { - "version": "6.0.2", - "packageName": "glob-parent", - "hash": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" - } - }, - "npm:glob": { - "type": "npm", - "name": "npm:glob", - "data": { - "version": "10.4.5", - "packageName": "glob", - "hash": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==" - } - }, - "npm:globals@14.0.0": { - "type": "npm", - "name": "npm:globals@14.0.0", - "data": { - "version": "14.0.0", - "packageName": "globals", - "hash": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" - } - }, - "npm:globals@15.15.0": { - "type": "npm", - "name": "npm:globals@15.15.0", - "data": { - "version": "15.15.0", - "packageName": "globals", - "hash": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==" - } - }, - "npm:globals@16.5.0": { - "type": "npm", - "name": "npm:globals@16.5.0", - "data": { - "version": "16.5.0", - "packageName": "globals", - "hash": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==" - } - }, - "npm:globby@11.1.0": { - "type": "npm", - "name": "npm:globby@11.1.0", - "data": { - "version": "11.1.0", - "packageName": "globby", - "hash": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" - } - }, - "npm:globby@15.0.0": { - "type": "npm", - "name": "npm:globby@15.0.0", - "data": { - "version": "15.0.0", - "packageName": "globby", - "hash": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==" - } - }, - "npm:globrex": { - "type": "npm", - "name": "npm:globrex", - "data": { - "version": "0.1.2", - "packageName": "globrex", - "hash": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" - } - }, - "npm:goober": { - "type": "npm", - "name": "npm:goober", - "data": { - "version": "2.1.18", - "packageName": "goober", - "hash": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==" - } - }, - "npm:google-auth-library": { - "type": "npm", - "name": "npm:google-auth-library", - "data": { - "version": "10.5.0", - "packageName": "google-auth-library", - "hash": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==" - } - }, - "npm:google-logging-utils": { - "type": "npm", - "name": "npm:google-logging-utils", - "data": { - "version": "1.1.3", - "packageName": "google-logging-utils", - "hash": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==" - } - }, - "npm:gopd": { - "type": "npm", - "name": "npm:gopd", - "data": { - "version": "1.2.0", - "packageName": "gopd", - "hash": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - } - }, - "npm:graceful-fs": { - "type": "npm", - "name": "npm:graceful-fs", - "data": { - "version": "4.2.11", - "packageName": "graceful-fs", - "hash": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - } - }, - "npm:graphemer": { - "type": "npm", - "name": "npm:graphemer", - "data": { - "version": "1.4.0", - "packageName": "graphemer", - "hash": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - } - }, - "npm:gtoken": { - "type": "npm", - "name": "npm:gtoken", - "data": { - "version": "8.0.0", - "packageName": "gtoken", - "hash": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==" - } - }, - "npm:gzip-size": { - "type": "npm", - "name": "npm:gzip-size", - "data": { - "version": "7.0.0", - "packageName": "gzip-size", - "hash": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==" - } - }, - "npm:h3@1.15.4": { - "type": "npm", - "name": "npm:h3@1.15.4", - "data": { - "version": "1.15.4", - "packageName": "h3", - "hash": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==" - } - }, - "npm:h3@2.0.0-beta.5": { - "type": "npm", - "name": "npm:h3@2.0.0-beta.5", - "data": { - "version": "2.0.0-beta.5", - "packageName": "h3", - "hash": "sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==" - } - }, - "npm:h3-v2": { - "type": "npm", - "name": "npm:h3-v2", - "data": { - "version": "npm:h3@2.0.0-beta.5", - "packageName": "h3-v2", - "hash": "sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==" - } - }, - "npm:happy-dom": { - "type": "npm", - "name": "npm:happy-dom", - "data": { - "version": "20.0.10", - "packageName": "happy-dom", - "hash": "sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==" - } - }, - "npm:has-flag": { - "type": "npm", - "name": "npm:has-flag", - "data": { - "version": "4.0.0", - "packageName": "has-flag", - "hash": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - } - }, - "npm:has-symbols": { - "type": "npm", - "name": "npm:has-symbols", - "data": { - "version": "1.1.0", - "packageName": "has-symbols", - "hash": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - } - }, - "npm:has-tostringtag": { - "type": "npm", - "name": "npm:has-tostringtag", - "data": { - "version": "1.0.2", - "packageName": "has-tostringtag", - "hash": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==" - } - }, - "npm:hasown": { - "type": "npm", - "name": "npm:hasown", - "data": { - "version": "2.0.2", - "packageName": "hasown", - "hash": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==" - } - }, - "npm:hast-util-from-parse5": { - "type": "npm", - "name": "npm:hast-util-from-parse5", - "data": { - "version": "8.0.3", - "packageName": "hast-util-from-parse5", - "hash": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==" - } - }, - "npm:hast-util-is-element": { - "type": "npm", - "name": "npm:hast-util-is-element", - "data": { - "version": "3.0.0", - "packageName": "hast-util-is-element", - "hash": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==" - } - }, - "npm:hast-util-parse-selector": { - "type": "npm", - "name": "npm:hast-util-parse-selector", - "data": { - "version": "4.0.0", - "packageName": "hast-util-parse-selector", - "hash": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==" - } - }, - "npm:hast-util-raw": { - "type": "npm", - "name": "npm:hast-util-raw", - "data": { - "version": "9.1.0", - "packageName": "hast-util-raw", - "hash": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==" - } - }, - "npm:hast-util-sanitize": { - "type": "npm", - "name": "npm:hast-util-sanitize", - "data": { - "version": "5.0.2", - "packageName": "hast-util-sanitize", - "hash": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==" - } - }, - "npm:hast-util-to-jsx-runtime": { - "type": "npm", - "name": "npm:hast-util-to-jsx-runtime", - "data": { - "version": "2.3.6", - "packageName": "hast-util-to-jsx-runtime", - "hash": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==" - } - }, - "npm:hast-util-to-parse5": { - "type": "npm", - "name": "npm:hast-util-to-parse5", - "data": { - "version": "8.0.0", - "packageName": "hast-util-to-parse5", - "hash": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==" - } - }, - "npm:hast-util-to-text": { - "type": "npm", - "name": "npm:hast-util-to-text", - "data": { - "version": "4.0.2", - "packageName": "hast-util-to-text", - "hash": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==" - } - }, - "npm:hast-util-whitespace": { - "type": "npm", - "name": "npm:hast-util-whitespace", - "data": { - "version": "3.0.0", - "packageName": "hast-util-whitespace", - "hash": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==" - } - }, - "npm:hastscript": { - "type": "npm", - "name": "npm:hastscript", - "data": { - "version": "9.0.1", - "packageName": "hastscript", - "hash": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==" - } - }, - "npm:he": { - "type": "npm", - "name": "npm:he", - "data": { - "version": "1.2.0", - "packageName": "he", - "hash": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - } - }, - "npm:hermes-estree": { - "type": "npm", - "name": "npm:hermes-estree", - "data": { - "version": "0.25.1", - "packageName": "hermes-estree", - "hash": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==" - } - }, - "npm:hermes-parser": { - "type": "npm", - "name": "npm:hermes-parser", - "data": { - "version": "0.25.1", - "packageName": "hermes-parser", - "hash": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==" - } - }, - "npm:highlight.js": { - "type": "npm", - "name": "npm:highlight.js", - "data": { - "version": "11.11.1", - "packageName": "highlight.js", - "hash": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==" - } - }, - "npm:hookable": { - "type": "npm", - "name": "npm:hookable", - "data": { - "version": "5.5.3", - "packageName": "hookable", - "hash": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" - } - }, - "npm:html-encoding-sniffer": { - "type": "npm", - "name": "npm:html-encoding-sniffer", - "data": { - "version": "4.0.0", - "packageName": "html-encoding-sniffer", - "hash": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==" - } - }, - "npm:html-entities": { - "type": "npm", - "name": "npm:html-entities", - "data": { - "version": "2.3.3", - "packageName": "html-entities", - "hash": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - } - }, - "npm:html-link-extractor": { - "type": "npm", - "name": "npm:html-link-extractor", - "data": { - "version": "1.0.5", - "packageName": "html-link-extractor", - "hash": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==" - } - }, - "npm:html-url-attributes": { - "type": "npm", - "name": "npm:html-url-attributes", - "data": { - "version": "3.0.1", - "packageName": "html-url-attributes", - "hash": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==" - } - }, - "npm:html-void-elements": { - "type": "npm", - "name": "npm:html-void-elements", - "data": { - "version": "3.0.0", - "packageName": "html-void-elements", - "hash": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" - } - }, - "npm:htmlparser2": { - "type": "npm", - "name": "npm:htmlparser2", - "data": { - "version": "10.0.0", - "packageName": "htmlparser2", - "hash": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==" - } - }, - "npm:http-errors": { - "type": "npm", - "name": "npm:http-errors", - "data": { - "version": "2.0.0", - "packageName": "http-errors", - "hash": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" - } - }, - "npm:http-proxy-agent": { - "type": "npm", - "name": "npm:http-proxy-agent", - "data": { - "version": "7.0.2", - "packageName": "http-proxy-agent", - "hash": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==" - } - }, - "npm:http-shutdown": { - "type": "npm", - "name": "npm:http-shutdown", - "data": { - "version": "1.2.2", - "packageName": "http-shutdown", - "hash": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==" - } - }, - "npm:https-proxy-agent": { - "type": "npm", - "name": "npm:https-proxy-agent", - "data": { - "version": "7.0.6", - "packageName": "https-proxy-agent", - "hash": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==" - } - }, - "npm:httpxy": { - "type": "npm", - "name": "npm:httpxy", - "data": { - "version": "0.1.7", - "packageName": "httpxy", - "hash": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==" - } - }, - "npm:human-id": { - "type": "npm", - "name": "npm:human-id", - "data": { - "version": "4.1.2", - "packageName": "human-id", - "hash": "sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==" - } - }, - "npm:human-signals": { - "type": "npm", - "name": "npm:human-signals", - "data": { - "version": "5.0.0", - "packageName": "human-signals", - "hash": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" - } - }, - "npm:iconv-lite@0.6.3": { - "type": "npm", - "name": "npm:iconv-lite@0.6.3", - "data": { - "version": "0.6.3", - "packageName": "iconv-lite", - "hash": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" - } - }, - "npm:iconv-lite@0.7.0": { - "type": "npm", - "name": "npm:iconv-lite@0.7.0", - "data": { - "version": "0.7.0", - "packageName": "iconv-lite", - "hash": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==" - } - }, - "npm:ieee754": { - "type": "npm", - "name": "npm:ieee754", - "data": { - "version": "1.2.1", - "packageName": "ieee754", - "hash": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - } - }, - "npm:ignore@5.3.2": { - "type": "npm", - "name": "npm:ignore@5.3.2", - "data": { - "version": "5.3.2", - "packageName": "ignore", - "hash": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" - } - }, - "npm:ignore@7.0.5": { - "type": "npm", - "name": "npm:ignore@7.0.5", - "data": { - "version": "7.0.5", - "packageName": "ignore", - "hash": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==" - } - }, - "npm:import-fresh": { - "type": "npm", - "name": "npm:import-fresh", - "data": { - "version": "3.3.1", - "packageName": "import-fresh", - "hash": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==" - } - }, - "npm:import-lazy": { - "type": "npm", - "name": "npm:import-lazy", - "data": { - "version": "4.0.0", - "packageName": "import-lazy", - "hash": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==" - } - }, - "npm:imurmurhash": { - "type": "npm", - "name": "npm:imurmurhash", - "data": { - "version": "0.1.4", - "packageName": "imurmurhash", - "hash": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - } - }, - "npm:indent-string": { - "type": "npm", - "name": "npm:indent-string", - "data": { - "version": "4.0.0", - "packageName": "indent-string", - "hash": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - } - }, - "npm:inherits": { - "type": "npm", - "name": "npm:inherits", - "data": { - "version": "2.0.4", - "packageName": "inherits", - "hash": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - }, - "npm:inline-style-parser": { - "type": "npm", - "name": "npm:inline-style-parser", - "data": { - "version": "0.2.4", - "packageName": "inline-style-parser", - "hash": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" - } - }, - "npm:ioredis": { - "type": "npm", - "name": "npm:ioredis", - "data": { - "version": "5.8.2", - "packageName": "ioredis", - "hash": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==" - } - }, - "npm:iron-webcrypto": { - "type": "npm", - "name": "npm:iron-webcrypto", - "data": { - "version": "1.2.1", - "packageName": "iron-webcrypto", - "hash": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==" - } - }, - "npm:is-alphabetical": { - "type": "npm", - "name": "npm:is-alphabetical", - "data": { - "version": "2.0.1", - "packageName": "is-alphabetical", - "hash": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" - } - }, - "npm:is-alphanumerical": { - "type": "npm", - "name": "npm:is-alphanumerical", - "data": { - "version": "2.0.1", - "packageName": "is-alphanumerical", - "hash": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==" - } - }, - "npm:is-binary-path": { - "type": "npm", - "name": "npm:is-binary-path", - "data": { - "version": "2.1.0", - "packageName": "is-binary-path", - "hash": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - } - }, - "npm:is-core-module": { - "type": "npm", - "name": "npm:is-core-module", - "data": { - "version": "2.16.1", - "packageName": "is-core-module", - "hash": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==" - } - }, - "npm:is-decimal": { - "type": "npm", - "name": "npm:is-decimal", - "data": { - "version": "2.0.1", - "packageName": "is-decimal", - "hash": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" - } - }, - "npm:is-docker@2.2.1": { - "type": "npm", - "name": "npm:is-docker@2.2.1", - "data": { - "version": "2.2.1", - "packageName": "is-docker", - "hash": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - } - }, - "npm:is-docker@3.0.0": { - "type": "npm", - "name": "npm:is-docker@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "is-docker", - "hash": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" - } - }, - "npm:is-extglob": { - "type": "npm", - "name": "npm:is-extglob", - "data": { - "version": "2.1.1", - "packageName": "is-extglob", - "hash": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - } - }, - "npm:is-fullwidth-code-point": { - "type": "npm", - "name": "npm:is-fullwidth-code-point", - "data": { - "version": "3.0.0", - "packageName": "is-fullwidth-code-point", - "hash": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - } - }, - "npm:is-glob": { - "type": "npm", - "name": "npm:is-glob", - "data": { - "version": "4.0.3", - "packageName": "is-glob", - "hash": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - } - }, - "npm:is-hexadecimal": { - "type": "npm", - "name": "npm:is-hexadecimal", - "data": { - "version": "2.0.1", - "packageName": "is-hexadecimal", - "hash": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" - } - }, - "npm:is-immutable-type": { - "type": "npm", - "name": "npm:is-immutable-type", - "data": { - "version": "5.0.1", - "packageName": "is-immutable-type", - "hash": "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==" - } - }, - "npm:is-inside-container": { - "type": "npm", - "name": "npm:is-inside-container", - "data": { - "version": "1.0.0", - "packageName": "is-inside-container", - "hash": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==" - } - }, - "npm:is-interactive": { - "type": "npm", - "name": "npm:is-interactive", - "data": { - "version": "1.0.0", - "packageName": "is-interactive", - "hash": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" - } - }, - "npm:is-module": { - "type": "npm", - "name": "npm:is-module", - "data": { - "version": "1.0.0", - "packageName": "is-module", - "hash": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - } - }, - "npm:is-number": { - "type": "npm", - "name": "npm:is-number", - "data": { - "version": "7.0.0", - "packageName": "is-number", - "hash": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - } - }, - "npm:is-obj": { - "type": "npm", - "name": "npm:is-obj", - "data": { - "version": "2.0.0", - "packageName": "is-obj", - "hash": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - } - }, - "npm:is-plain-obj": { - "type": "npm", - "name": "npm:is-plain-obj", - "data": { - "version": "4.1.0", - "packageName": "is-plain-obj", - "hash": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" - } - }, - "npm:is-potential-custom-element-name": { - "type": "npm", - "name": "npm:is-potential-custom-element-name", - "data": { - "version": "1.0.1", - "packageName": "is-potential-custom-element-name", - "hash": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - } - }, - "npm:is-reference@1.2.1": { - "type": "npm", - "name": "npm:is-reference@1.2.1", - "data": { - "version": "1.2.1", - "packageName": "is-reference", - "hash": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==" - } - }, - "npm:is-reference@3.0.3": { - "type": "npm", - "name": "npm:is-reference@3.0.3", - "data": { - "version": "3.0.3", - "packageName": "is-reference", - "hash": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==" - } - }, - "npm:is-stream@2.0.1": { - "type": "npm", - "name": "npm:is-stream@2.0.1", - "data": { - "version": "2.0.1", - "packageName": "is-stream", - "hash": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - } - }, - "npm:is-stream@3.0.0": { - "type": "npm", - "name": "npm:is-stream@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "is-stream", - "hash": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - } - }, - "npm:is-subdir": { - "type": "npm", - "name": "npm:is-subdir", - "data": { - "version": "1.2.0", - "packageName": "is-subdir", - "hash": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==" - } - }, - "npm:is-text-path": { - "type": "npm", - "name": "npm:is-text-path", - "data": { - "version": "2.0.0", - "packageName": "is-text-path", - "hash": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==" - } - }, - "npm:is-unicode-supported": { - "type": "npm", - "name": "npm:is-unicode-supported", - "data": { - "version": "0.1.0", - "packageName": "is-unicode-supported", - "hash": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" - } - }, - "npm:is-what": { - "type": "npm", - "name": "npm:is-what", - "data": { - "version": "4.1.16", - "packageName": "is-what", - "hash": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==" - } - }, - "npm:is-windows": { - "type": "npm", - "name": "npm:is-windows", - "data": { - "version": "1.0.2", - "packageName": "is-windows", - "hash": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - } - }, - "npm:is-wsl@2.2.0": { - "type": "npm", - "name": "npm:is-wsl@2.2.0", - "data": { - "version": "2.2.0", - "packageName": "is-wsl", - "hash": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==" - } - }, - "npm:is-wsl@3.1.0": { - "type": "npm", - "name": "npm:is-wsl@3.1.0", - "data": { - "version": "3.1.0", - "packageName": "is-wsl", - "hash": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==" - } - }, - "npm:is64bit": { - "type": "npm", - "name": "npm:is64bit", - "data": { - "version": "2.0.0", - "packageName": "is64bit", - "hash": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==" - } - }, - "npm:isarray": { - "type": "npm", - "name": "npm:isarray", - "data": { - "version": "1.0.0", - "packageName": "isarray", - "hash": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - } - }, - "npm:isbot": { - "type": "npm", - "name": "npm:isbot", - "data": { - "version": "5.1.31", - "packageName": "isbot", - "hash": "sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==" - } - }, - "npm:isexe": { - "type": "npm", - "name": "npm:isexe", - "data": { - "version": "2.0.0", - "packageName": "isexe", - "hash": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - } - }, - "npm:jackspeak": { - "type": "npm", - "name": "npm:jackspeak", - "data": { - "version": "3.4.3", - "packageName": "jackspeak", - "hash": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==" - } - }, - "npm:jest-diff": { - "type": "npm", - "name": "npm:jest-diff", - "data": { - "version": "30.2.0", - "packageName": "jest-diff", - "hash": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==" - } - }, - "npm:jiti": { - "type": "npm", - "name": "npm:jiti", - "data": { - "version": "2.6.1", - "packageName": "jiti", - "hash": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==" - } - }, - "npm:jju": { - "type": "npm", - "name": "npm:jju", - "data": { - "version": "1.4.0", - "packageName": "jju", - "hash": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" - } - }, - "npm:js-tokens@4.0.0": { - "type": "npm", - "name": "npm:js-tokens@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "js-tokens", - "hash": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } - }, - "npm:js-tokens@9.0.1": { - "type": "npm", - "name": "npm:js-tokens@9.0.1", - "data": { - "version": "9.0.1", - "packageName": "js-tokens", - "hash": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - } - }, - "npm:js-yaml@3.14.1": { - "type": "npm", - "name": "npm:js-yaml@3.14.1", - "data": { - "version": "3.14.1", - "packageName": "js-yaml", - "hash": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" - } - }, - "npm:js-yaml@4.1.1": { - "type": "npm", - "name": "npm:js-yaml@4.1.1", - "data": { - "version": "4.1.1", - "packageName": "js-yaml", - "hash": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==" - } - }, - "npm:jsdom": { - "type": "npm", - "name": "npm:jsdom", - "data": { - "version": "27.2.0", - "packageName": "jsdom", - "hash": "sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==" - } - }, - "npm:jsesc": { - "type": "npm", - "name": "npm:jsesc", - "data": { - "version": "3.1.0", - "packageName": "jsesc", - "hash": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" - } - }, - "npm:json-bigint": { - "type": "npm", - "name": "npm:json-bigint", - "data": { - "version": "1.0.0", - "packageName": "json-bigint", - "hash": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==" - } - }, - "npm:json-buffer": { - "type": "npm", - "name": "npm:json-buffer", - "data": { - "version": "3.0.1", - "packageName": "json-buffer", - "hash": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - } - }, - "npm:json-schema-to-ts": { - "type": "npm", - "name": "npm:json-schema-to-ts", - "data": { - "version": "3.1.1", - "packageName": "json-schema-to-ts", - "hash": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==" - } - }, - "npm:json-schema-traverse@0.4.1": { - "type": "npm", - "name": "npm:json-schema-traverse@0.4.1", - "data": { - "version": "0.4.1", - "packageName": "json-schema-traverse", - "hash": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - }, - "npm:json-schema-traverse@1.0.0": { - "type": "npm", - "name": "npm:json-schema-traverse@1.0.0", - "data": { - "version": "1.0.0", - "packageName": "json-schema-traverse", - "hash": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - }, - "npm:json-schema": { - "type": "npm", - "name": "npm:json-schema", - "data": { - "version": "0.4.0", - "packageName": "json-schema", - "hash": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - } - }, - "npm:json-stable-stringify-without-jsonify": { - "type": "npm", - "name": "npm:json-stable-stringify-without-jsonify", - "data": { - "version": "1.0.1", - "packageName": "json-stable-stringify-without-jsonify", - "hash": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - } - }, - "npm:json5": { - "type": "npm", - "name": "npm:json5", - "data": { - "version": "2.2.3", - "packageName": "json5", - "hash": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - } - }, - "npm:jsonc-parser": { - "type": "npm", - "name": "npm:jsonc-parser", - "data": { - "version": "3.2.0", - "packageName": "jsonc-parser", - "hash": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" - } - }, - "npm:jsonfile@4.0.0": { - "type": "npm", - "name": "npm:jsonfile@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "jsonfile", - "hash": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" - } - }, - "npm:jsonfile@6.2.0": { - "type": "npm", - "name": "npm:jsonfile@6.2.0", - "data": { - "version": "6.2.0", - "packageName": "jsonfile", - "hash": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==" - } - }, - "npm:jsonparse": { - "type": "npm", - "name": "npm:jsonparse", - "data": { - "version": "1.3.1", - "packageName": "jsonparse", - "hash": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" - } - }, - "npm:jwa": { - "type": "npm", - "name": "npm:jwa", - "data": { - "version": "2.0.1", - "packageName": "jwa", - "hash": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==" - } - }, - "npm:jws": { - "type": "npm", - "name": "npm:jws", - "data": { - "version": "4.0.0", - "packageName": "jws", - "hash": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==" - } - }, - "npm:keyv": { - "type": "npm", - "name": "npm:keyv", - "data": { - "version": "4.5.4", - "packageName": "keyv", - "hash": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==" - } - }, - "npm:kleur": { - "type": "npm", - "name": "npm:kleur", - "data": { - "version": "4.1.5", - "packageName": "kleur", - "hash": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" - } - }, - "npm:klona": { - "type": "npm", - "name": "npm:klona", - "data": { - "version": "2.0.6", - "packageName": "klona", - "hash": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" - } - }, - "npm:knip": { - "type": "npm", - "name": "npm:knip", - "data": { - "version": "5.70.2", - "packageName": "knip", - "hash": "sha512-LI7DbeVnk7h9+FAet5KzzHNdDwJyqDa2+cn4uQfZYTfpuVjEqtGmYD9r5b9JEuOs4eVkf/7sskNhWXxELm3C/Q==" - } - }, - "npm:knitwork": { - "type": "npm", - "name": "npm:knitwork", - "data": { - "version": "1.2.0", - "packageName": "knitwork", - "hash": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==" - } - }, - "npm:kolorist": { - "type": "npm", - "name": "npm:kolorist", - "data": { - "version": "1.8.0", - "packageName": "kolorist", - "hash": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" - } - }, - "npm:lazystream": { - "type": "npm", - "name": "npm:lazystream", - "data": { - "version": "1.0.1", - "packageName": "lazystream", - "hash": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==" - } - }, - "npm:levn": { - "type": "npm", - "name": "npm:levn", - "data": { - "version": "0.4.1", - "packageName": "levn", - "hash": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" - } - }, - "npm:lightningcss-android-arm64": { - "type": "npm", - "name": "npm:lightningcss-android-arm64", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-android-arm64", - "hash": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==" - } - }, - "npm:lightningcss-darwin-arm64": { - "type": "npm", - "name": "npm:lightningcss-darwin-arm64", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-darwin-arm64", - "hash": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==" - } - }, - "npm:lightningcss-darwin-x64": { - "type": "npm", - "name": "npm:lightningcss-darwin-x64", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-darwin-x64", - "hash": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==" - } - }, - "npm:lightningcss-freebsd-x64": { - "type": "npm", - "name": "npm:lightningcss-freebsd-x64", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-freebsd-x64", - "hash": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==" - } - }, - "npm:lightningcss-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:lightningcss-linux-arm-gnueabihf", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-arm-gnueabihf", - "hash": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==" - } - }, - "npm:lightningcss-linux-arm64-gnu": { - "type": "npm", - "name": "npm:lightningcss-linux-arm64-gnu", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-arm64-gnu", - "hash": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==" - } - }, - "npm:lightningcss-linux-arm64-musl": { - "type": "npm", - "name": "npm:lightningcss-linux-arm64-musl", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-arm64-musl", - "hash": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==" - } - }, - "npm:lightningcss-linux-x64-gnu": { - "type": "npm", - "name": "npm:lightningcss-linux-x64-gnu", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-x64-gnu", - "hash": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==" - } - }, - "npm:lightningcss-linux-x64-musl": { - "type": "npm", - "name": "npm:lightningcss-linux-x64-musl", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-x64-musl", - "hash": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==" - } - }, - "npm:lightningcss-win32-arm64-msvc": { - "type": "npm", - "name": "npm:lightningcss-win32-arm64-msvc", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-win32-arm64-msvc", - "hash": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==" - } - }, - "npm:lightningcss-win32-x64-msvc": { - "type": "npm", - "name": "npm:lightningcss-win32-x64-msvc", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-win32-x64-msvc", - "hash": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==" - } - }, - "npm:lightningcss": { - "type": "npm", - "name": "npm:lightningcss", - "data": { - "version": "1.30.2", - "packageName": "lightningcss", - "hash": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==" - } - }, - "npm:lilconfig": { - "type": "npm", - "name": "npm:lilconfig", - "data": { - "version": "3.1.3", - "packageName": "lilconfig", - "hash": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" - } - }, - "npm:lines-and-columns": { - "type": "npm", - "name": "npm:lines-and-columns", - "data": { - "version": "2.0.3", - "packageName": "lines-and-columns", - "hash": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==" - } - }, - "npm:linkify-it": { - "type": "npm", - "name": "npm:linkify-it", - "data": { - "version": "5.0.0", - "packageName": "linkify-it", - "hash": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==" - } - }, - "npm:listhen": { - "type": "npm", - "name": "npm:listhen", - "data": { - "version": "1.9.0", - "packageName": "listhen", - "hash": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==" - } - }, - "npm:local-pkg@0.5.1": { - "type": "npm", - "name": "npm:local-pkg@0.5.1", - "data": { - "version": "0.5.1", - "packageName": "local-pkg", - "hash": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==" - } - }, - "npm:local-pkg@1.1.2": { - "type": "npm", - "name": "npm:local-pkg@1.1.2", - "data": { - "version": "1.1.2", - "packageName": "local-pkg", - "hash": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==" - } - }, - "npm:locate-character": { - "type": "npm", - "name": "npm:locate-character", - "data": { - "version": "3.0.0", - "packageName": "locate-character", - "hash": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" - } - }, - "npm:locate-path@5.0.0": { - "type": "npm", - "name": "npm:locate-path@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "locate-path", - "hash": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" - } - }, - "npm:locate-path@6.0.0": { - "type": "npm", - "name": "npm:locate-path@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "locate-path", - "hash": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" - } - }, - "npm:lodash.defaults": { - "type": "npm", - "name": "npm:lodash.defaults", - "data": { - "version": "4.2.0", - "packageName": "lodash.defaults", - "hash": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - } - }, - "npm:lodash.isarguments": { - "type": "npm", - "name": "npm:lodash.isarguments", - "data": { - "version": "3.1.0", - "packageName": "lodash.isarguments", - "hash": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - } - }, - "npm:lodash.merge": { - "type": "npm", - "name": "npm:lodash.merge", - "data": { - "version": "4.6.2", - "packageName": "lodash.merge", - "hash": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - } - }, - "npm:lodash.startcase": { - "type": "npm", - "name": "npm:lodash.startcase", - "data": { - "version": "4.4.0", - "packageName": "lodash.startcase", - "hash": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==" - } - }, - "npm:lodash": { - "type": "npm", - "name": "npm:lodash", - "data": { - "version": "4.17.21", - "packageName": "lodash", - "hash": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - } - }, - "npm:log-symbols": { - "type": "npm", - "name": "npm:log-symbols", - "data": { - "version": "4.1.0", - "packageName": "log-symbols", - "hash": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==" - } - }, - "npm:longest-streak": { - "type": "npm", - "name": "npm:longest-streak", - "data": { - "version": "3.1.0", - "packageName": "longest-streak", - "hash": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" - } - }, - "npm:lowlight": { - "type": "npm", - "name": "npm:lowlight", - "data": { - "version": "3.3.0", - "packageName": "lowlight", - "hash": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==" - } - }, - "npm:lru-cache@10.4.3": { - "type": "npm", - "name": "npm:lru-cache@10.4.3", - "data": { - "version": "10.4.3", - "packageName": "lru-cache", - "hash": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - } - }, - "npm:lru-cache@11.2.2": { - "type": "npm", - "name": "npm:lru-cache@11.2.2", - "data": { - "version": "11.2.2", - "packageName": "lru-cache", - "hash": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==" - } - }, - "npm:lru-cache@5.1.1": { - "type": "npm", - "name": "npm:lru-cache@5.1.1", - "data": { - "version": "5.1.1", - "packageName": "lru-cache", - "hash": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" - } - }, - "npm:lru-cache@6.0.0": { - "type": "npm", - "name": "npm:lru-cache@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "lru-cache", - "hash": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - } - }, - "npm:lucide-react": { - "type": "npm", - "name": "npm:lucide-react", - "data": { - "version": "0.555.0", - "packageName": "lucide-react", - "hash": "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==" - } - }, - "npm:lunr": { - "type": "npm", - "name": "npm:lunr", - "data": { - "version": "2.3.9", - "packageName": "lunr", - "hash": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" - } - }, - "npm:lz-string": { - "type": "npm", - "name": "npm:lz-string", - "data": { - "version": "1.5.0", - "packageName": "lz-string", - "hash": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" - } - }, - "npm:magic-string": { - "type": "npm", - "name": "npm:magic-string", - "data": { - "version": "0.30.21", - "packageName": "magic-string", - "hash": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==" - } - }, - "npm:magicast": { - "type": "npm", - "name": "npm:magicast", - "data": { - "version": "0.5.1", - "packageName": "magicast", - "hash": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==" - } - }, - "npm:markdown-it": { - "type": "npm", - "name": "npm:markdown-it", - "data": { - "version": "14.1.0", - "packageName": "markdown-it", - "hash": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==" - } - }, - "npm:markdown-link-extractor": { - "type": "npm", - "name": "npm:markdown-link-extractor", - "data": { - "version": "4.0.3", - "packageName": "markdown-link-extractor", - "hash": "sha512-aEltJiQ4/oC0h6Jbw/uuATGSHZPkcH8DIunNH1A0e+GSFkvZ6BbBkdvBTVfIV8r6HapCU3yTd0eFdi3ZeM1eAQ==" - } - }, - "npm:markdown-table": { - "type": "npm", - "name": "npm:markdown-table", - "data": { - "version": "3.0.4", - "packageName": "markdown-table", - "hash": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" - } - }, - "npm:marked": { - "type": "npm", - "name": "npm:marked", - "data": { - "version": "17.0.1", - "packageName": "marked", - "hash": "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==" - } - }, - "npm:math-intrinsics": { - "type": "npm", - "name": "npm:math-intrinsics", - "data": { - "version": "1.1.0", - "packageName": "math-intrinsics", - "hash": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - } - }, - "npm:mdast-util-find-and-replace": { - "type": "npm", - "name": "npm:mdast-util-find-and-replace", - "data": { - "version": "3.0.2", - "packageName": "mdast-util-find-and-replace", - "hash": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==" - } - }, - "npm:mdast-util-from-markdown": { - "type": "npm", - "name": "npm:mdast-util-from-markdown", - "data": { - "version": "2.0.2", - "packageName": "mdast-util-from-markdown", - "hash": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==" - } - }, - "npm:mdast-util-gfm-autolink-literal": { - "type": "npm", - "name": "npm:mdast-util-gfm-autolink-literal", - "data": { - "version": "2.0.1", - "packageName": "mdast-util-gfm-autolink-literal", - "hash": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==" - } - }, - "npm:mdast-util-gfm-footnote": { - "type": "npm", - "name": "npm:mdast-util-gfm-footnote", - "data": { - "version": "2.1.0", - "packageName": "mdast-util-gfm-footnote", - "hash": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==" - } - }, - "npm:mdast-util-gfm-strikethrough": { - "type": "npm", - "name": "npm:mdast-util-gfm-strikethrough", - "data": { - "version": "2.0.0", - "packageName": "mdast-util-gfm-strikethrough", - "hash": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==" - } - }, - "npm:mdast-util-gfm-table": { - "type": "npm", - "name": "npm:mdast-util-gfm-table", - "data": { - "version": "2.0.0", - "packageName": "mdast-util-gfm-table", - "hash": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==" - } - }, - "npm:mdast-util-gfm-task-list-item": { - "type": "npm", - "name": "npm:mdast-util-gfm-task-list-item", - "data": { - "version": "2.0.0", - "packageName": "mdast-util-gfm-task-list-item", - "hash": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==" - } - }, - "npm:mdast-util-gfm": { - "type": "npm", - "name": "npm:mdast-util-gfm", - "data": { - "version": "3.1.0", - "packageName": "mdast-util-gfm", - "hash": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==" - } - }, - "npm:mdast-util-mdx-expression": { - "type": "npm", - "name": "npm:mdast-util-mdx-expression", - "data": { - "version": "2.0.1", - "packageName": "mdast-util-mdx-expression", - "hash": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==" - } - }, - "npm:mdast-util-mdx-jsx": { - "type": "npm", - "name": "npm:mdast-util-mdx-jsx", - "data": { - "version": "3.2.0", - "packageName": "mdast-util-mdx-jsx", - "hash": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==" - } - }, - "npm:mdast-util-mdxjs-esm": { - "type": "npm", - "name": "npm:mdast-util-mdxjs-esm", - "data": { - "version": "2.0.1", - "packageName": "mdast-util-mdxjs-esm", - "hash": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==" - } - }, - "npm:mdast-util-phrasing": { - "type": "npm", - "name": "npm:mdast-util-phrasing", - "data": { - "version": "4.1.0", - "packageName": "mdast-util-phrasing", - "hash": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==" - } - }, - "npm:mdast-util-to-hast": { - "type": "npm", - "name": "npm:mdast-util-to-hast", - "data": { - "version": "13.2.0", - "packageName": "mdast-util-to-hast", - "hash": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==" - } - }, - "npm:mdast-util-to-markdown": { - "type": "npm", - "name": "npm:mdast-util-to-markdown", - "data": { - "version": "2.1.2", - "packageName": "mdast-util-to-markdown", - "hash": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==" - } - }, - "npm:mdast-util-to-string": { - "type": "npm", - "name": "npm:mdast-util-to-string", - "data": { - "version": "4.0.0", - "packageName": "mdast-util-to-string", - "hash": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==" - } - }, - "npm:mdn-data": { - "type": "npm", - "name": "npm:mdn-data", - "data": { - "version": "2.12.2", - "packageName": "mdn-data", - "hash": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" - } - }, - "npm:mdurl": { - "type": "npm", - "name": "npm:mdurl", - "data": { - "version": "2.0.0", - "packageName": "mdurl", - "hash": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" - } - }, - "npm:meow": { - "type": "npm", - "name": "npm:meow", - "data": { - "version": "12.1.1", - "packageName": "meow", - "hash": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==" - } - }, - "npm:merge-anything": { - "type": "npm", - "name": "npm:merge-anything", - "data": { - "version": "5.1.7", - "packageName": "merge-anything", - "hash": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==" - } - }, - "npm:merge-stream": { - "type": "npm", - "name": "npm:merge-stream", - "data": { - "version": "2.0.0", - "packageName": "merge-stream", - "hash": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - } - }, - "npm:merge2": { - "type": "npm", - "name": "npm:merge2", - "data": { - "version": "1.4.1", - "packageName": "merge2", - "hash": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - } - }, - "npm:micromark-core-commonmark": { - "type": "npm", - "name": "npm:micromark-core-commonmark", - "data": { - "version": "2.0.3", - "packageName": "micromark-core-commonmark", - "hash": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==" - } - }, - "npm:micromark-extension-gfm-autolink-literal": { - "type": "npm", - "name": "npm:micromark-extension-gfm-autolink-literal", - "data": { - "version": "2.1.0", - "packageName": "micromark-extension-gfm-autolink-literal", - "hash": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==" - } - }, - "npm:micromark-extension-gfm-footnote": { - "type": "npm", - "name": "npm:micromark-extension-gfm-footnote", - "data": { - "version": "2.1.0", - "packageName": "micromark-extension-gfm-footnote", - "hash": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==" - } - }, - "npm:micromark-extension-gfm-strikethrough": { - "type": "npm", - "name": "npm:micromark-extension-gfm-strikethrough", - "data": { - "version": "2.1.0", - "packageName": "micromark-extension-gfm-strikethrough", - "hash": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==" - } - }, - "npm:micromark-extension-gfm-table": { - "type": "npm", - "name": "npm:micromark-extension-gfm-table", - "data": { - "version": "2.1.1", - "packageName": "micromark-extension-gfm-table", - "hash": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==" - } - }, - "npm:micromark-extension-gfm-tagfilter": { - "type": "npm", - "name": "npm:micromark-extension-gfm-tagfilter", - "data": { - "version": "2.0.0", - "packageName": "micromark-extension-gfm-tagfilter", - "hash": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==" - } - }, - "npm:micromark-extension-gfm-task-list-item": { - "type": "npm", - "name": "npm:micromark-extension-gfm-task-list-item", - "data": { - "version": "2.1.0", - "packageName": "micromark-extension-gfm-task-list-item", - "hash": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==" - } - }, - "npm:micromark-extension-gfm": { - "type": "npm", - "name": "npm:micromark-extension-gfm", - "data": { - "version": "3.0.0", - "packageName": "micromark-extension-gfm", - "hash": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==" - } - }, - "npm:micromark-factory-destination": { - "type": "npm", - "name": "npm:micromark-factory-destination", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-destination", - "hash": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==" - } - }, - "npm:micromark-factory-label": { - "type": "npm", - "name": "npm:micromark-factory-label", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-label", - "hash": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==" - } - }, - "npm:micromark-factory-space": { - "type": "npm", - "name": "npm:micromark-factory-space", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-space", - "hash": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==" - } - }, - "npm:micromark-factory-title": { - "type": "npm", - "name": "npm:micromark-factory-title", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-title", - "hash": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==" - } - }, - "npm:micromark-factory-whitespace": { - "type": "npm", - "name": "npm:micromark-factory-whitespace", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-whitespace", - "hash": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==" - } - }, - "npm:micromark-util-character": { - "type": "npm", - "name": "npm:micromark-util-character", - "data": { - "version": "2.1.1", - "packageName": "micromark-util-character", - "hash": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==" - } - }, - "npm:micromark-util-chunked": { - "type": "npm", - "name": "npm:micromark-util-chunked", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-chunked", - "hash": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==" - } - }, - "npm:micromark-util-classify-character": { - "type": "npm", - "name": "npm:micromark-util-classify-character", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-classify-character", - "hash": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==" - } - }, - "npm:micromark-util-combine-extensions": { - "type": "npm", - "name": "npm:micromark-util-combine-extensions", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-combine-extensions", - "hash": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==" - } - }, - "npm:micromark-util-decode-numeric-character-reference": { - "type": "npm", - "name": "npm:micromark-util-decode-numeric-character-reference", - "data": { - "version": "2.0.2", - "packageName": "micromark-util-decode-numeric-character-reference", - "hash": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==" - } - }, - "npm:micromark-util-decode-string": { - "type": "npm", - "name": "npm:micromark-util-decode-string", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-decode-string", - "hash": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==" - } - }, - "npm:micromark-util-encode": { - "type": "npm", - "name": "npm:micromark-util-encode", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-encode", - "hash": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==" - } - }, - "npm:micromark-util-html-tag-name": { - "type": "npm", - "name": "npm:micromark-util-html-tag-name", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-html-tag-name", - "hash": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==" - } - }, - "npm:micromark-util-normalize-identifier": { - "type": "npm", - "name": "npm:micromark-util-normalize-identifier", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-normalize-identifier", - "hash": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==" - } - }, - "npm:micromark-util-resolve-all": { - "type": "npm", - "name": "npm:micromark-util-resolve-all", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-resolve-all", - "hash": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==" - } - }, - "npm:micromark-util-sanitize-uri": { - "type": "npm", - "name": "npm:micromark-util-sanitize-uri", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-sanitize-uri", - "hash": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==" - } - }, - "npm:micromark-util-subtokenize": { - "type": "npm", - "name": "npm:micromark-util-subtokenize", - "data": { - "version": "2.1.0", - "packageName": "micromark-util-subtokenize", - "hash": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==" - } - }, - "npm:micromark-util-symbol": { - "type": "npm", - "name": "npm:micromark-util-symbol", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-symbol", - "hash": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" - } - }, - "npm:micromark-util-types": { - "type": "npm", - "name": "npm:micromark-util-types", - "data": { - "version": "2.0.2", - "packageName": "micromark-util-types", - "hash": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" - } - }, - "npm:micromark": { - "type": "npm", - "name": "npm:micromark", - "data": { - "version": "4.0.2", - "packageName": "micromark", - "hash": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==" - } - }, - "npm:micromatch": { - "type": "npm", - "name": "npm:micromatch", - "data": { - "version": "4.0.8", - "packageName": "micromatch", - "hash": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==" - } - }, - "npm:mime-db@1.52.0": { - "type": "npm", - "name": "npm:mime-db@1.52.0", - "data": { - "version": "1.52.0", - "packageName": "mime-db", - "hash": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - } - }, - "npm:mime-db@1.54.0": { - "type": "npm", - "name": "npm:mime-db@1.54.0", - "data": { - "version": "1.54.0", - "packageName": "mime-db", - "hash": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" - } - }, - "npm:mime-types@2.1.35": { - "type": "npm", - "name": "npm:mime-types@2.1.35", - "data": { - "version": "2.1.35", - "packageName": "mime-types", - "hash": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" - } - }, - "npm:mime-types@3.0.1": { - "type": "npm", - "name": "npm:mime-types@3.0.1", - "data": { - "version": "3.0.1", - "packageName": "mime-types", - "hash": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==" - } - }, - "npm:mime@3.0.0": { - "type": "npm", - "name": "npm:mime@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "mime", - "hash": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" - } - }, - "npm:mime@4.1.0": { - "type": "npm", - "name": "npm:mime@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "mime", - "hash": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==" - } - }, - "npm:mimic-fn@2.1.0": { - "type": "npm", - "name": "npm:mimic-fn@2.1.0", - "data": { - "version": "2.1.0", - "packageName": "mimic-fn", - "hash": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } - }, - "npm:mimic-fn@4.0.0": { - "type": "npm", - "name": "npm:mimic-fn@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "mimic-fn", - "hash": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" - } - }, - "npm:min-indent": { - "type": "npm", - "name": "npm:min-indent", - "data": { - "version": "1.0.1", - "packageName": "min-indent", - "hash": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - } - }, - "npm:minimatch@3.0.8": { - "type": "npm", - "name": "npm:minimatch@3.0.8", - "data": { - "version": "3.0.8", - "packageName": "minimatch", - "hash": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==" - } - }, - "npm:minimatch@3.1.2": { - "type": "npm", - "name": "npm:minimatch@3.1.2", - "data": { - "version": "3.1.2", - "packageName": "minimatch", - "hash": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - } - }, - "npm:minimatch@5.1.6": { - "type": "npm", - "name": "npm:minimatch@5.1.6", - "data": { - "version": "5.1.6", - "packageName": "minimatch", - "hash": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==" - } - }, - "npm:minimatch@9.0.3": { - "type": "npm", - "name": "npm:minimatch@9.0.3", - "data": { - "version": "9.0.3", - "packageName": "minimatch", - "hash": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==" - } - }, - "npm:minimatch@9.0.5": { - "type": "npm", - "name": "npm:minimatch@9.0.5", - "data": { - "version": "9.0.5", - "packageName": "minimatch", - "hash": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==" - } - }, - "npm:minimist": { - "type": "npm", - "name": "npm:minimist", - "data": { - "version": "1.2.8", - "packageName": "minimist", - "hash": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - } - }, - "npm:minipass": { - "type": "npm", - "name": "npm:minipass", - "data": { - "version": "7.1.2", - "packageName": "minipass", - "hash": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" - } - }, - "npm:minizlib": { - "type": "npm", - "name": "npm:minizlib", - "data": { - "version": "3.1.0", - "packageName": "minizlib", - "hash": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==" - } - }, - "npm:mlly": { - "type": "npm", - "name": "npm:mlly", - "data": { - "version": "1.8.0", - "packageName": "mlly", - "hash": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==" - } - }, - "npm:mri": { - "type": "npm", - "name": "npm:mri", - "data": { - "version": "1.2.0", - "packageName": "mri", - "hash": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" - } - }, - "npm:ms": { - "type": "npm", - "name": "npm:ms", - "data": { - "version": "2.1.3", - "packageName": "ms", - "hash": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - }, - "npm:muggle-string": { - "type": "npm", - "name": "npm:muggle-string", - "data": { - "version": "0.4.1", - "packageName": "muggle-string", - "hash": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" - } - }, - "npm:nanoid@3.3.11": { - "type": "npm", - "name": "npm:nanoid@3.3.11", - "data": { - "version": "3.3.11", - "packageName": "nanoid", - "hash": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" - } - }, - "npm:nanoid@5.1.6": { - "type": "npm", - "name": "npm:nanoid@5.1.6", - "data": { - "version": "5.1.6", - "packageName": "nanoid", - "hash": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==" - } - }, - "npm:nanospinner": { - "type": "npm", - "name": "npm:nanospinner", - "data": { - "version": "1.2.2", - "packageName": "nanospinner", - "hash": "sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==" - } - }, - "npm:napi-postinstall": { - "type": "npm", - "name": "npm:napi-postinstall", - "data": { - "version": "0.3.4", - "packageName": "napi-postinstall", - "hash": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==" - } - }, - "npm:natural-compare": { - "type": "npm", - "name": "npm:natural-compare", - "data": { - "version": "1.4.0", - "packageName": "natural-compare", - "hash": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - } - }, - "npm:nitropack": { - "type": "npm", - "name": "npm:nitropack", - "data": { - "version": "2.12.9", - "packageName": "nitropack", - "hash": "sha512-t6qqNBn2UDGMWogQuORjbL2UPevB8PvIPsPHmqvWpeGOlPr4P8Oc5oA8t3wFwGmaolM2M/s2SwT23nx9yARmOg==" - } - }, - "npm:node-addon-api": { - "type": "npm", - "name": "npm:node-addon-api", - "data": { - "version": "7.1.1", - "packageName": "node-addon-api", - "hash": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" - } - }, - "npm:node-domexception": { - "type": "npm", - "name": "npm:node-domexception", - "data": { - "version": "1.0.0", - "packageName": "node-domexception", - "hash": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" - } - }, - "npm:node-fetch-native": { - "type": "npm", - "name": "npm:node-fetch-native", - "data": { - "version": "1.6.7", - "packageName": "node-fetch-native", - "hash": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==" - } - }, - "npm:node-fetch@2.7.0": { - "type": "npm", - "name": "npm:node-fetch@2.7.0", - "data": { - "version": "2.7.0", - "packageName": "node-fetch", - "hash": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==" - } - }, - "npm:node-fetch@3.3.2": { - "type": "npm", - "name": "npm:node-fetch@3.3.2", - "data": { - "version": "3.3.2", - "packageName": "node-fetch", - "hash": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==" - } - }, - "npm:node-forge": { - "type": "npm", - "name": "npm:node-forge", - "data": { - "version": "1.3.1", - "packageName": "node-forge", - "hash": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - } - }, - "npm:node-gyp-build": { - "type": "npm", - "name": "npm:node-gyp-build", - "data": { - "version": "4.8.4", - "packageName": "node-gyp-build", - "hash": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" - } - }, - "npm:node-machine-id": { - "type": "npm", - "name": "npm:node-machine-id", - "data": { - "version": "1.1.12", - "packageName": "node-machine-id", - "hash": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" - } - }, - "npm:node-mock-http": { - "type": "npm", - "name": "npm:node-mock-http", - "data": { - "version": "1.0.3", - "packageName": "node-mock-http", - "hash": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==" - } - }, - "npm:node-releases": { - "type": "npm", - "name": "npm:node-releases", - "data": { - "version": "2.0.27", - "packageName": "node-releases", - "hash": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" - } - }, - "npm:nopt": { - "type": "npm", - "name": "npm:nopt", - "data": { - "version": "8.1.0", - "packageName": "nopt", - "hash": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==" - } - }, - "npm:normalize-path": { - "type": "npm", - "name": "npm:normalize-path", - "data": { - "version": "3.0.0", - "packageName": "normalize-path", - "hash": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - } - }, - "npm:npm-run-path@4.0.1": { - "type": "npm", - "name": "npm:npm-run-path@4.0.1", - "data": { - "version": "4.0.1", - "packageName": "npm-run-path", - "hash": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" - } - }, - "npm:npm-run-path@5.3.0": { - "type": "npm", - "name": "npm:npm-run-path@5.3.0", - "data": { - "version": "5.3.0", - "packageName": "npm-run-path", - "hash": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==" - } - }, - "npm:nth-check": { - "type": "npm", - "name": "npm:nth-check", - "data": { - "version": "2.1.1", - "packageName": "nth-check", - "hash": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" - } - }, - "npm:nx": { - "type": "npm", - "name": "npm:nx", - "data": { - "version": "22.1.2", - "packageName": "nx", - "hash": "sha512-sD1CoYFPMsoiRG095qUhEhzL6ZbSY1a68dw9gJNRg60gM06O7l6X2Kyu+dEEwIZ5PutD82Pt4/S2nzK6mdhfew==" - } - }, - "npm:nypm": { - "type": "npm", - "name": "npm:nypm", - "data": { - "version": "0.6.2", - "packageName": "nypm", - "hash": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==" - } - }, - "npm:obug": { - "type": "npm", - "name": "npm:obug", - "data": { - "version": "2.1.1", - "packageName": "obug", - "hash": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==" - } - }, - "npm:ofetch": { - "type": "npm", - "name": "npm:ofetch", - "data": { - "version": "1.5.0", - "packageName": "ofetch", - "hash": "sha512-A7llJ7eZyziA5xq9//3ZurA8OhFqtS99K5/V1sLBJ5j137CM/OAjlbA/TEJXBuOWwOfLqih+oH5U3ran4za1FQ==" - } - }, - "npm:ohash": { - "type": "npm", - "name": "npm:ohash", - "data": { - "version": "2.0.11", - "packageName": "ohash", - "hash": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" - } - }, - "npm:ollama": { - "type": "npm", - "name": "npm:ollama", - "data": { - "version": "0.6.3", - "packageName": "ollama", - "hash": "sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==" - } - }, - "npm:on-finished": { - "type": "npm", - "name": "npm:on-finished", - "data": { - "version": "2.4.1", - "packageName": "on-finished", - "hash": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==" - } - }, - "npm:once": { - "type": "npm", - "name": "npm:once", - "data": { - "version": "1.4.0", - "packageName": "once", - "hash": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" - } - }, - "npm:onetime@5.1.2": { - "type": "npm", - "name": "npm:onetime@5.1.2", - "data": { - "version": "5.1.2", - "packageName": "onetime", - "hash": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" - } - }, - "npm:onetime@6.0.0": { - "type": "npm", - "name": "npm:onetime@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "onetime", - "hash": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==" - } - }, - "npm:open": { - "type": "npm", - "name": "npm:open", - "data": { - "version": "8.4.2", - "packageName": "open", - "hash": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==" - } - }, - "npm:openai": { - "type": "npm", - "name": "npm:openai", - "data": { - "version": "6.9.1", - "packageName": "openai", - "hash": "sha512-vQ5Rlt0ZgB3/BNmTa7bIijYFhz3YBceAA3Z4JuoMSBftBF9YqFHIEhZakSs+O/Ad7EaoEimZvHxD5ylRjN11Lg==" - } - }, - "npm:optionator": { - "type": "npm", - "name": "npm:optionator", - "data": { - "version": "0.9.4", - "packageName": "optionator", - "hash": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==" - } - }, - "npm:ora": { - "type": "npm", - "name": "npm:ora", - "data": { - "version": "5.3.0", - "packageName": "ora", - "hash": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==" - } - }, - "npm:outdent": { - "type": "npm", - "name": "npm:outdent", - "data": { - "version": "0.5.0", - "packageName": "outdent", - "hash": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==" - } - }, - "npm:oxc-resolver": { - "type": "npm", - "name": "npm:oxc-resolver", - "data": { - "version": "11.14.0", - "packageName": "oxc-resolver", - "hash": "sha512-i4wNrqhOd+4YdHJfHglHtFiqqSxXuzFA+RUqmmWN1aMD3r1HqUSrIhw17tSO4jwKfhLs9uw1wzFPmvMsWacStg==" - } - }, - "npm:p-filter": { - "type": "npm", - "name": "npm:p-filter", - "data": { - "version": "2.1.0", - "packageName": "p-filter", - "hash": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==" - } - }, - "npm:p-limit@2.3.0": { - "type": "npm", - "name": "npm:p-limit@2.3.0", - "data": { - "version": "2.3.0", - "packageName": "p-limit", - "hash": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" - } - }, - "npm:p-limit@3.1.0": { - "type": "npm", - "name": "npm:p-limit@3.1.0", - "data": { - "version": "3.1.0", - "packageName": "p-limit", - "hash": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" - } - }, - "npm:p-locate@4.1.0": { - "type": "npm", - "name": "npm:p-locate@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "p-locate", - "hash": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" - } - }, - "npm:p-locate@5.0.0": { - "type": "npm", - "name": "npm:p-locate@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "p-locate", - "hash": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" - } - }, - "npm:p-map": { - "type": "npm", - "name": "npm:p-map", - "data": { - "version": "2.1.0", - "packageName": "p-map", - "hash": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - } - }, - "npm:p-try": { - "type": "npm", - "name": "npm:p-try", - "data": { - "version": "2.2.0", - "packageName": "p-try", - "hash": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - } - }, - "npm:package-json-from-dist": { - "type": "npm", - "name": "npm:package-json-from-dist", - "data": { - "version": "1.0.1", - "packageName": "package-json-from-dist", - "hash": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - } - }, - "npm:package-manager-detector@0.2.11": { - "type": "npm", - "name": "npm:package-manager-detector@0.2.11", - "data": { - "version": "0.2.11", - "packageName": "package-manager-detector", - "hash": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==" - } - }, - "npm:package-manager-detector@1.5.0": { - "type": "npm", - "name": "npm:package-manager-detector@1.5.0", - "data": { - "version": "1.5.0", - "packageName": "package-manager-detector", - "hash": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==" - } - }, - "npm:parent-module": { - "type": "npm", - "name": "npm:parent-module", - "data": { - "version": "1.0.1", - "packageName": "parent-module", - "hash": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - } - }, - "npm:parse-entities": { - "type": "npm", - "name": "npm:parse-entities", - "data": { - "version": "4.0.2", - "packageName": "parse-entities", - "hash": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==" - } - }, - "npm:parse5-htmlparser2-tree-adapter": { - "type": "npm", - "name": "npm:parse5-htmlparser2-tree-adapter", - "data": { - "version": "7.1.0", - "packageName": "parse5-htmlparser2-tree-adapter", - "hash": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==" - } - }, - "npm:parse5-parser-stream": { - "type": "npm", - "name": "npm:parse5-parser-stream", - "data": { - "version": "7.1.2", - "packageName": "parse5-parser-stream", - "hash": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==" - } - }, - "npm:parse5@7.3.0": { - "type": "npm", - "name": "npm:parse5@7.3.0", - "data": { - "version": "7.3.0", - "packageName": "parse5", - "hash": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==" - } - }, - "npm:parse5@8.0.0": { - "type": "npm", - "name": "npm:parse5@8.0.0", - "data": { - "version": "8.0.0", - "packageName": "parse5", - "hash": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==" - } - }, - "npm:parseurl": { - "type": "npm", - "name": "npm:parseurl", - "data": { - "version": "1.3.3", - "packageName": "parseurl", - "hash": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - } - }, - "npm:partial-json": { - "type": "npm", - "name": "npm:partial-json", - "data": { - "version": "0.1.7", - "packageName": "partial-json", - "hash": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==" - } - }, - "npm:path-browserify": { - "type": "npm", - "name": "npm:path-browserify", - "data": { - "version": "1.0.1", - "packageName": "path-browserify", - "hash": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - } - }, - "npm:path-exists": { - "type": "npm", - "name": "npm:path-exists", - "data": { - "version": "4.0.0", - "packageName": "path-exists", - "hash": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - } - }, - "npm:path-key@3.1.1": { - "type": "npm", - "name": "npm:path-key@3.1.1", - "data": { - "version": "3.1.1", - "packageName": "path-key", - "hash": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - } - }, - "npm:path-key@4.0.0": { - "type": "npm", - "name": "npm:path-key@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "path-key", - "hash": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" - } - }, - "npm:path-parse": { - "type": "npm", - "name": "npm:path-parse", - "data": { - "version": "1.0.7", - "packageName": "path-parse", - "hash": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - } - }, - "npm:path-scurry": { - "type": "npm", - "name": "npm:path-scurry", - "data": { - "version": "1.11.1", - "packageName": "path-scurry", - "hash": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==" - } - }, - "npm:path-type@4.0.0": { - "type": "npm", - "name": "npm:path-type@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "path-type", - "hash": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - } - }, - "npm:path-type@6.0.0": { - "type": "npm", - "name": "npm:path-type@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "path-type", - "hash": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==" - } - }, - "npm:pathe@1.1.2": { - "type": "npm", - "name": "npm:pathe@1.1.2", - "data": { - "version": "1.1.2", - "packageName": "pathe", - "hash": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - } - }, - "npm:pathe@2.0.3": { - "type": "npm", - "name": "npm:pathe@2.0.3", - "data": { - "version": "2.0.3", - "packageName": "pathe", - "hash": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - } - }, - "npm:perfect-debounce": { - "type": "npm", - "name": "npm:perfect-debounce", - "data": { - "version": "2.0.0", - "packageName": "perfect-debounce", - "hash": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==" - } - }, - "npm:picocolors": { - "type": "npm", - "name": "npm:picocolors", - "data": { - "version": "1.1.1", - "packageName": "picocolors", - "hash": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - } - }, - "npm:picomatch@2.3.1": { - "type": "npm", - "name": "npm:picomatch@2.3.1", - "data": { - "version": "2.3.1", - "packageName": "picomatch", - "hash": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - } - }, - "npm:picomatch@4.0.3": { - "type": "npm", - "name": "npm:picomatch@4.0.3", - "data": { - "version": "4.0.3", - "packageName": "picomatch", - "hash": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" - } - }, - "npm:pify": { - "type": "npm", - "name": "npm:pify", - "data": { - "version": "4.0.1", - "packageName": "pify", - "hash": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - }, - "npm:pkg-types@1.3.1": { - "type": "npm", - "name": "npm:pkg-types@1.3.1", - "data": { - "version": "1.3.1", - "packageName": "pkg-types", - "hash": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==" - } - }, - "npm:pkg-types@2.3.0": { - "type": "npm", - "name": "npm:pkg-types@2.3.0", - "data": { - "version": "2.3.0", - "packageName": "pkg-types", - "hash": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==" - } - }, - "npm:postcss": { - "type": "npm", - "name": "npm:postcss", - "data": { - "version": "8.5.6", - "packageName": "postcss", - "hash": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==" - } - }, - "npm:prelude-ls": { - "type": "npm", - "name": "npm:prelude-ls", - "data": { - "version": "1.2.1", - "packageName": "prelude-ls", - "hash": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - } - }, - "npm:premove": { - "type": "npm", - "name": "npm:premove", - "data": { - "version": "4.0.0", - "packageName": "premove", - "hash": "sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==" - } - }, - "npm:prettier-plugin-svelte": { - "type": "npm", - "name": "npm:prettier-plugin-svelte", - "data": { - "version": "3.4.0", - "packageName": "prettier-plugin-svelte", - "hash": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==" - } - }, - "npm:prettier@2.8.8": { - "type": "npm", - "name": "npm:prettier@2.8.8", - "data": { - "version": "2.8.8", - "packageName": "prettier", - "hash": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" - } - }, - "npm:prettier": { - "type": "npm", - "name": "npm:prettier", - "data": { - "version": "3.6.2", - "packageName": "prettier", - "hash": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==" - } - }, - "npm:pretty-bytes": { - "type": "npm", - "name": "npm:pretty-bytes", - "data": { - "version": "7.1.0", - "packageName": "pretty-bytes", - "hash": "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==" - } - }, - "npm:pretty-format@27.5.1": { - "type": "npm", - "name": "npm:pretty-format@27.5.1", - "data": { - "version": "27.5.1", - "packageName": "pretty-format", - "hash": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==" - } - }, - "npm:pretty-format@30.2.0": { - "type": "npm", - "name": "npm:pretty-format@30.2.0", - "data": { - "version": "30.2.0", - "packageName": "pretty-format", - "hash": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==" - } - }, - "npm:process-nextick-args": { - "type": "npm", - "name": "npm:process-nextick-args", - "data": { - "version": "2.0.1", - "packageName": "process-nextick-args", - "hash": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - } - }, - "npm:process": { - "type": "npm", - "name": "npm:process", - "data": { - "version": "0.11.10", - "packageName": "process", - "hash": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - } - }, - "npm:property-information@6.5.0": { - "type": "npm", - "name": "npm:property-information@6.5.0", - "data": { - "version": "6.5.0", - "packageName": "property-information", - "hash": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" - } - }, - "npm:property-information@7.1.0": { - "type": "npm", - "name": "npm:property-information@7.1.0", - "data": { - "version": "7.1.0", - "packageName": "property-information", - "hash": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==" - } - }, - "npm:proxy-from-env": { - "type": "npm", - "name": "npm:proxy-from-env", - "data": { - "version": "1.1.0", - "packageName": "proxy-from-env", - "hash": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - } - }, - "npm:publint": { - "type": "npm", - "name": "npm:publint", - "data": { - "version": "0.3.15", - "packageName": "publint", - "hash": "sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A==" - } - }, - "npm:punycode.js": { - "type": "npm", - "name": "npm:punycode.js", - "data": { - "version": "2.3.1", - "packageName": "punycode.js", - "hash": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" - } - }, - "npm:punycode": { - "type": "npm", - "name": "npm:punycode", - "data": { - "version": "2.3.1", - "packageName": "punycode", - "hash": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" - } - }, - "npm:quansync": { - "type": "npm", - "name": "npm:quansync", - "data": { - "version": "0.2.11", - "packageName": "quansync", - "hash": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==" - } - }, - "npm:queue-microtask": { - "type": "npm", - "name": "npm:queue-microtask", - "data": { - "version": "1.2.3", - "packageName": "queue-microtask", - "hash": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - } - }, - "npm:radix3": { - "type": "npm", - "name": "npm:radix3", - "data": { - "version": "1.1.2", - "packageName": "radix3", - "hash": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" - } - }, - "npm:randombytes": { - "type": "npm", - "name": "npm:randombytes", - "data": { - "version": "2.1.0", - "packageName": "randombytes", - "hash": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" - } - }, - "npm:range-parser": { - "type": "npm", - "name": "npm:range-parser", - "data": { - "version": "1.2.1", - "packageName": "range-parser", - "hash": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - } - }, - "npm:rc9": { - "type": "npm", - "name": "npm:rc9", - "data": { - "version": "2.1.2", - "packageName": "rc9", - "hash": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==" - } - }, - "npm:react-dom": { - "type": "npm", - "name": "npm:react-dom", - "data": { - "version": "19.2.0", - "packageName": "react-dom", - "hash": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==" - } - }, - "npm:react-is@17.0.2": { - "type": "npm", - "name": "npm:react-is@17.0.2", - "data": { - "version": "17.0.2", - "packageName": "react-is", - "hash": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - } - }, - "npm:react-is@18.3.1": { - "type": "npm", - "name": "npm:react-is@18.3.1", - "data": { - "version": "18.3.1", - "packageName": "react-is", - "hash": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - } - }, - "npm:react-markdown": { - "type": "npm", - "name": "npm:react-markdown", - "data": { - "version": "10.1.0", - "packageName": "react-markdown", - "hash": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==" - } - }, - "npm:react-refresh": { - "type": "npm", - "name": "npm:react-refresh", - "data": { - "version": "0.18.0", - "packageName": "react-refresh", - "hash": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==" - } - }, - "npm:react": { - "type": "npm", - "name": "npm:react", - "data": { - "version": "19.2.0", - "packageName": "react", - "hash": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==" - } - }, - "npm:read-yaml-file": { - "type": "npm", - "name": "npm:read-yaml-file", - "data": { - "version": "1.1.0", - "packageName": "read-yaml-file", - "hash": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==" - } - }, - "npm:readable-stream@2.3.8": { - "type": "npm", - "name": "npm:readable-stream@2.3.8", - "data": { - "version": "2.3.8", - "packageName": "readable-stream", - "hash": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" - } - }, - "npm:readable-stream@3.6.2": { - "type": "npm", - "name": "npm:readable-stream@3.6.2", - "data": { - "version": "3.6.2", - "packageName": "readable-stream", - "hash": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" - } - }, - "npm:readable-stream@4.7.0": { - "type": "npm", - "name": "npm:readable-stream@4.7.0", - "data": { - "version": "4.7.0", - "packageName": "readable-stream", - "hash": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==" - } - }, - "npm:readdir-glob": { - "type": "npm", - "name": "npm:readdir-glob", - "data": { - "version": "1.1.3", - "packageName": "readdir-glob", - "hash": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==" - } - }, - "npm:readdirp@3.6.0": { - "type": "npm", - "name": "npm:readdirp@3.6.0", - "data": { - "version": "3.6.0", - "packageName": "readdirp", - "hash": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" - } - }, - "npm:readdirp@4.1.2": { - "type": "npm", - "name": "npm:readdirp@4.1.2", - "data": { - "version": "4.1.2", - "packageName": "readdirp", - "hash": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" - } - }, - "npm:recast": { - "type": "npm", - "name": "npm:recast", - "data": { - "version": "0.23.11", - "packageName": "recast", - "hash": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==" - } - }, - "npm:redent": { - "type": "npm", - "name": "npm:redent", - "data": { - "version": "3.0.0", - "packageName": "redent", - "hash": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==" - } - }, - "npm:redis-errors": { - "type": "npm", - "name": "npm:redis-errors", - "data": { - "version": "1.2.0", - "packageName": "redis-errors", - "hash": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" - } - }, - "npm:redis-parser": { - "type": "npm", - "name": "npm:redis-parser", - "data": { - "version": "3.0.0", - "packageName": "redis-parser", - "hash": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==" - } - }, - "npm:rehype-highlight": { - "type": "npm", - "name": "npm:rehype-highlight", - "data": { - "version": "7.0.2", - "packageName": "rehype-highlight", - "hash": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==" - } - }, - "npm:rehype-raw": { - "type": "npm", - "name": "npm:rehype-raw", - "data": { - "version": "7.0.0", - "packageName": "rehype-raw", - "hash": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==" - } - }, - "npm:rehype-sanitize": { - "type": "npm", - "name": "npm:rehype-sanitize", - "data": { - "version": "6.0.0", - "packageName": "rehype-sanitize", - "hash": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==" - } - }, - "npm:remark-gfm": { - "type": "npm", - "name": "npm:remark-gfm", - "data": { - "version": "4.0.1", - "packageName": "remark-gfm", - "hash": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==" - } - }, - "npm:remark-parse": { - "type": "npm", - "name": "npm:remark-parse", - "data": { - "version": "11.0.0", - "packageName": "remark-parse", - "hash": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==" - } - }, - "npm:remark-rehype": { - "type": "npm", - "name": "npm:remark-rehype", - "data": { - "version": "11.1.2", - "packageName": "remark-rehype", - "hash": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==" - } - }, - "npm:remark-stringify": { - "type": "npm", - "name": "npm:remark-stringify", - "data": { - "version": "11.0.0", - "packageName": "remark-stringify", - "hash": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==" - } - }, - "npm:require-directory": { - "type": "npm", - "name": "npm:require-directory", - "data": { - "version": "2.1.1", - "packageName": "require-directory", - "hash": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - } - }, - "npm:require-from-string": { - "type": "npm", - "name": "npm:require-from-string", - "data": { - "version": "2.0.2", - "packageName": "require-from-string", - "hash": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - } - }, - "npm:resolve-from@4.0.0": { - "type": "npm", - "name": "npm:resolve-from@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "resolve-from", - "hash": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - }, - "npm:resolve-from@5.0.0": { - "type": "npm", - "name": "npm:resolve-from@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "resolve-from", - "hash": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - }, - "npm:resolve-pkg-maps": { - "type": "npm", - "name": "npm:resolve-pkg-maps", - "data": { - "version": "1.0.0", - "packageName": "resolve-pkg-maps", - "hash": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" - } - }, - "npm:resolve.exports": { - "type": "npm", - "name": "npm:resolve.exports", - "data": { - "version": "2.0.3", - "packageName": "resolve.exports", - "hash": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==" - } - }, - "npm:resolve": { - "type": "npm", - "name": "npm:resolve", - "data": { - "version": "1.22.11", - "packageName": "resolve", - "hash": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==" - } - }, - "npm:restore-cursor": { - "type": "npm", - "name": "npm:restore-cursor", - "data": { - "version": "3.1.0", - "packageName": "restore-cursor", - "hash": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==" - } - }, - "npm:reusify": { - "type": "npm", - "name": "npm:reusify", - "data": { - "version": "1.1.0", - "packageName": "reusify", - "hash": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" - } - }, - "npm:rimraf": { - "type": "npm", - "name": "npm:rimraf", - "data": { - "version": "5.0.10", - "packageName": "rimraf", - "hash": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==" - } - }, - "npm:rolldown": { - "type": "npm", - "name": "npm:rolldown", - "data": { - "version": "1.0.0-beta.51", - "packageName": "rolldown", - "hash": "sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==" - } - }, - "npm:rollup-plugin-preserve-directives": { - "type": "npm", - "name": "npm:rollup-plugin-preserve-directives", - "data": { - "version": "0.4.0", - "packageName": "rollup-plugin-preserve-directives", - "hash": "sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==" - } - }, - "npm:rollup-plugin-visualizer": { - "type": "npm", - "name": "npm:rollup-plugin-visualizer", - "data": { - "version": "6.0.5", - "packageName": "rollup-plugin-visualizer", - "hash": "sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==" - } - }, - "npm:rollup": { - "type": "npm", - "name": "npm:rollup", - "data": { - "version": "4.53.3", - "packageName": "rollup", - "hash": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==" - } - }, - "npm:rou3": { - "type": "npm", - "name": "npm:rou3", - "data": { - "version": "0.7.10", - "packageName": "rou3", - "hash": "sha512-aoFj6f7MJZ5muJ+Of79nrhs9N3oLGqi2VEMe94Zbkjb6Wupha46EuoYgpWSOZlXww3bbd8ojgXTAA2mzimX5Ww==" - } - }, - "npm:run-parallel": { - "type": "npm", - "name": "npm:run-parallel", - "data": { - "version": "1.2.0", - "packageName": "run-parallel", - "hash": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - } - }, - "npm:sade": { - "type": "npm", - "name": "npm:sade", - "data": { - "version": "1.8.1", - "packageName": "sade", - "hash": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==" - } - }, - "npm:safe-buffer@5.1.2": { - "type": "npm", - "name": "npm:safe-buffer@5.1.2", - "data": { - "version": "5.1.2", - "packageName": "safe-buffer", - "hash": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - }, - "npm:safe-buffer@5.2.1": { - "type": "npm", - "name": "npm:safe-buffer@5.2.1", - "data": { - "version": "5.2.1", - "packageName": "safe-buffer", - "hash": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - }, - "npm:safer-buffer": { - "type": "npm", - "name": "npm:safer-buffer", - "data": { - "version": "2.1.2", - "packageName": "safer-buffer", - "hash": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - } - }, - "npm:saxes": { - "type": "npm", - "name": "npm:saxes", - "data": { - "version": "6.0.0", - "packageName": "saxes", - "hash": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==" - } - }, - "npm:scheduler": { - "type": "npm", - "name": "npm:scheduler", - "data": { - "version": "0.27.0", - "packageName": "scheduler", - "hash": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" - } - }, - "npm:scule": { - "type": "npm", - "name": "npm:scule", - "data": { - "version": "1.3.0", - "packageName": "scule", - "hash": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" - } - }, - "npm:semver@6.3.1": { - "type": "npm", - "name": "npm:semver@6.3.1", - "data": { - "version": "6.3.1", - "packageName": "semver", - "hash": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - }, - "npm:semver@7.5.4": { - "type": "npm", - "name": "npm:semver@7.5.4", - "data": { - "version": "7.5.4", - "packageName": "semver", - "hash": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" - } - }, - "npm:semver@7.7.3": { - "type": "npm", - "name": "npm:semver@7.7.3", - "data": { - "version": "7.7.3", - "packageName": "semver", - "hash": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" - } - }, - "npm:send": { - "type": "npm", - "name": "npm:send", - "data": { - "version": "1.2.0", - "packageName": "send", - "hash": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==" - } - }, - "npm:serialize-javascript": { - "type": "npm", - "name": "npm:serialize-javascript", - "data": { - "version": "6.0.2", - "packageName": "serialize-javascript", - "hash": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==" - } - }, - "npm:seroval-plugins@1.3.3": { - "type": "npm", - "name": "npm:seroval-plugins@1.3.3", - "data": { - "version": "1.3.3", - "packageName": "seroval-plugins", - "hash": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==" - } - }, - "npm:seroval-plugins@1.4.0": { - "type": "npm", - "name": "npm:seroval-plugins@1.4.0", - "data": { - "version": "1.4.0", - "packageName": "seroval-plugins", - "hash": "sha512-zir1aWzoiax6pbBVjoYVd0O1QQXgIL3eVGBMsBsNmM8Ukq90yGaWlfx0AB9dTS8GPqrOrbXn79vmItCUP9U3BQ==" - } - }, - "npm:seroval@1.3.2": { - "type": "npm", - "name": "npm:seroval@1.3.2", - "data": { - "version": "1.3.2", - "packageName": "seroval", - "hash": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==" - } - }, - "npm:seroval@1.4.0": { - "type": "npm", - "name": "npm:seroval@1.4.0", - "data": { - "version": "1.4.0", - "packageName": "seroval", - "hash": "sha512-BdrNXdzlofomLTiRnwJTSEAaGKyHHZkbMXIywOh7zlzp4uZnXErEwl9XZ+N1hJSNpeTtNxWvVwN0wUzAIQ4Hpg==" - } - }, - "npm:serve-placeholder": { - "type": "npm", - "name": "npm:serve-placeholder", - "data": { - "version": "2.0.2", - "packageName": "serve-placeholder", - "hash": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==" - } - }, - "npm:serve-static": { - "type": "npm", - "name": "npm:serve-static", - "data": { - "version": "2.2.0", - "packageName": "serve-static", - "hash": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==" - } - }, - "npm:setprototypeof": { - "type": "npm", - "name": "npm:setprototypeof", - "data": { - "version": "1.2.0", - "packageName": "setprototypeof", - "hash": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - } - }, - "npm:shebang-command": { - "type": "npm", - "name": "npm:shebang-command", - "data": { - "version": "2.0.0", - "packageName": "shebang-command", - "hash": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" - } - }, - "npm:shebang-regex": { - "type": "npm", - "name": "npm:shebang-regex", - "data": { - "version": "3.0.0", - "packageName": "shebang-regex", - "hash": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - } - }, - "npm:sherif-darwin-arm64": { - "type": "npm", - "name": "npm:sherif-darwin-arm64", - "data": { - "version": "1.9.0", - "packageName": "sherif-darwin-arm64", - "hash": "sha512-R+RpKSzlqZgBHean04CqHrdlmBBKu6Dhd/9BcdCpjx/KpqsalZsh9LzBVxTWLTtT9IBb/ccr23PNqFzWQTuh6A==" - } - }, - "npm:sherif-darwin-x64": { - "type": "npm", - "name": "npm:sherif-darwin-x64", - "data": { - "version": "1.9.0", - "packageName": "sherif-darwin-x64", - "hash": "sha512-b/KX9MczzkzmyEjngGxYuBq/rOdM6CbGcDLFdQ0H990Dmn9foj4C/UpLlyqSxXcsJhy586ATMEVN68aM2hFQdQ==" - } - }, - "npm:sherif-linux-arm64-musl": { - "type": "npm", - "name": "npm:sherif-linux-arm64-musl", - "data": { - "version": "1.9.0", - "packageName": "sherif-linux-arm64-musl", - "hash": "sha512-OZ4cKcCXTJTl8zaTxKnP8z0wu05nDeGtttxRQjaXHSKK+fjBwGkH/1qqFEVDcRANUxtLRLLdwmDyxvqQrCzhPQ==" - } - }, - "npm:sherif-linux-arm64": { - "type": "npm", - "name": "npm:sherif-linux-arm64", - "data": { - "version": "1.9.0", - "packageName": "sherif-linux-arm64", - "hash": "sha512-TyuGhaD/efCxGIk4scx09n6NsTr3qfKvH5qHYdyxtelv1mHRgbzVHwJ+Jj98jVktuzOZoexHpxr/hz7RUjd/nw==" - } - }, - "npm:sherif-linux-x64-musl": { - "type": "npm", - "name": "npm:sherif-linux-x64-musl", - "data": { - "version": "1.9.0", - "packageName": "sherif-linux-x64-musl", - "hash": "sha512-JSbA6DN0HkWSabYU858BUkS4cMmkTsAamDZEYuUVDW+XvW9IjaI6o0HNatUr7oCjrITIfcjzqlqy7uizmNlr/A==" - } - }, - "npm:sherif-linux-x64": { - "type": "npm", - "name": "npm:sherif-linux-x64", - "data": { - "version": "1.9.0", - "packageName": "sherif-linux-x64", - "hash": "sha512-iO+hTxndO36r0hgmipBRjntWFqFHKrrYFRODz0WnmDquVek88LInSzAY1xpS18/Thbff8IVc6ssefYNVFQQPWw==" - } - }, - "npm:sherif-windows-arm64": { - "type": "npm", - "name": "npm:sherif-windows-arm64", - "data": { - "version": "1.9.0", - "packageName": "sherif-windows-arm64", - "hash": "sha512-lPqQXDB/95SJodtIbGAJc90O/KyxcunvKTycZqo+6RGjkOSYZB/XnRzm/tJ7If/6kz0/wcDP4uvkJmJxrxcj3A==" - } - }, - "npm:sherif-windows-x64": { - "type": "npm", - "name": "npm:sherif-windows-x64", - "data": { - "version": "1.9.0", - "packageName": "sherif-windows-x64", - "hash": "sha512-3cL+XVGLpmyLC3UOZYiPr4vY2OFBQqPZnCoCwoRKN+ONm8VfGMirO9iqI0OckgFBUtJoG4AQY/MWxoPhNmzD8A==" - } - }, - "npm:sherif": { - "type": "npm", - "name": "npm:sherif", - "data": { - "version": "1.9.0", - "packageName": "sherif", - "hash": "sha512-5n7zqPAjL+RzR7n09NPKpWBXmDCtuRpQzIL+ycj8pe6MayV7cDuFmceoyPQJ0c95oFj6feY7SZvhX/+S0i1ukg==" - } - }, - "npm:siginfo": { - "type": "npm", - "name": "npm:siginfo", - "data": { - "version": "2.0.0", - "packageName": "siginfo", - "hash": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - } - }, - "npm:signal-exit@3.0.7": { - "type": "npm", - "name": "npm:signal-exit@3.0.7", - "data": { - "version": "3.0.7", - "packageName": "signal-exit", - "hash": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - } - }, - "npm:signal-exit@4.1.0": { - "type": "npm", - "name": "npm:signal-exit@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "signal-exit", - "hash": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" - } - }, - "npm:simple-git": { - "type": "npm", - "name": "npm:simple-git", - "data": { - "version": "3.30.0", - "packageName": "simple-git", - "hash": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==" - } - }, - "npm:size-limit": { - "type": "npm", - "name": "npm:size-limit", - "data": { - "version": "11.2.0", - "packageName": "size-limit", - "hash": "sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==" - } - }, - "npm:slash@3.0.0": { - "type": "npm", - "name": "npm:slash@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "slash", - "hash": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - } - }, - "npm:slash@5.1.0": { - "type": "npm", - "name": "npm:slash@5.1.0", - "data": { - "version": "5.1.0", - "packageName": "slash", - "hash": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==" - } - }, - "npm:smob": { - "type": "npm", - "name": "npm:smob", - "data": { - "version": "1.5.0", - "packageName": "smob", - "hash": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" - } - }, - "npm:smol-toml": { - "type": "npm", - "name": "npm:smol-toml", - "data": { - "version": "1.5.2", - "packageName": "smol-toml", - "hash": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==" - } - }, - "npm:solid-js": { - "type": "npm", - "name": "npm:solid-js", - "data": { - "version": "1.9.10", - "packageName": "solid-js", - "hash": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==" - } - }, - "npm:solid-refresh": { - "type": "npm", - "name": "npm:solid-refresh", - "data": { - "version": "0.6.3", - "packageName": "solid-refresh", - "hash": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==" - } - }, - "npm:source-map-js": { - "type": "npm", - "name": "npm:source-map-js", - "data": { - "version": "1.2.1", - "packageName": "source-map-js", - "hash": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - } - }, - "npm:source-map-support": { - "type": "npm", - "name": "npm:source-map-support", - "data": { - "version": "0.5.21", - "packageName": "source-map-support", - "hash": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" - } - }, - "npm:source-map@0.6.1": { - "type": "npm", - "name": "npm:source-map@0.6.1", - "data": { - "version": "0.6.1", - "packageName": "source-map", - "hash": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - }, - "npm:source-map@0.7.6": { - "type": "npm", - "name": "npm:source-map@0.7.6", - "data": { - "version": "0.7.6", - "packageName": "source-map", - "hash": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==" - } - }, - "npm:space-separated-tokens": { - "type": "npm", - "name": "npm:space-separated-tokens", - "data": { - "version": "2.0.2", - "packageName": "space-separated-tokens", - "hash": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" - } - }, - "npm:spawndamnit": { - "type": "npm", - "name": "npm:spawndamnit", - "data": { - "version": "3.0.1", - "packageName": "spawndamnit", - "hash": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==" - } - }, - "npm:split2": { - "type": "npm", - "name": "npm:split2", - "data": { - "version": "4.2.0", - "packageName": "split2", - "hash": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" - } - }, - "npm:sprintf-js": { - "type": "npm", - "name": "npm:sprintf-js", - "data": { - "version": "1.0.3", - "packageName": "sprintf-js", - "hash": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - } - }, - "npm:srvx": { - "type": "npm", - "name": "npm:srvx", - "data": { - "version": "0.8.16", - "packageName": "srvx", - "hash": "sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==" - } - }, - "npm:stable-hash-x": { - "type": "npm", - "name": "npm:stable-hash-x", - "data": { - "version": "0.2.0", - "packageName": "stable-hash-x", - "hash": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==" - } - }, - "npm:stackback": { - "type": "npm", - "name": "npm:stackback", - "data": { - "version": "0.0.2", - "packageName": "stackback", - "hash": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - } - }, - "npm:standard-as-callback": { - "type": "npm", - "name": "npm:standard-as-callback", - "data": { - "version": "2.1.0", - "packageName": "standard-as-callback", - "hash": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - } - }, - "npm:statuses@2.0.1": { - "type": "npm", - "name": "npm:statuses@2.0.1", - "data": { - "version": "2.0.1", - "packageName": "statuses", - "hash": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - } - }, - "npm:statuses@2.0.2": { - "type": "npm", - "name": "npm:statuses@2.0.2", - "data": { - "version": "2.0.2", - "packageName": "statuses", - "hash": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" - } - }, - "npm:std-env": { - "type": "npm", - "name": "npm:std-env", - "data": { - "version": "3.10.0", - "packageName": "std-env", - "hash": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==" - } - }, - "npm:streamx": { - "type": "npm", - "name": "npm:streamx", - "data": { - "version": "2.23.0", - "packageName": "streamx", - "hash": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==" - } - }, - "npm:string-argv": { - "type": "npm", - "name": "npm:string-argv", - "data": { - "version": "0.3.2", - "packageName": "string-argv", - "hash": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" - } - }, - "npm:string-ts": { - "type": "npm", - "name": "npm:string-ts", - "data": { - "version": "2.2.1", - "packageName": "string-ts", - "hash": "sha512-Q2u0gko67PLLhbte5HmPfdOjNvUKbKQM+mCNQae6jE91DmoFHY6HH9GcdqCeNx87DZ2KKjiFxmA0R/42OneGWw==" - } - }, - "npm:string-width@4.2.3": { - "type": "npm", - "name": "npm:string-width@4.2.3", - "data": { - "version": "4.2.3", - "packageName": "string-width", - "hash": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - } - }, - "npm:string-width@5.1.2": { - "type": "npm", - "name": "npm:string-width@5.1.2", - "data": { - "version": "5.1.2", - "packageName": "string-width", - "hash": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==" - } - }, - "npm:string-width-cjs": { - "type": "npm", - "name": "npm:string-width-cjs", - "data": { - "version": "npm:string-width@4.2.3", - "packageName": "string-width-cjs", - "hash": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - } - }, - "npm:string_decoder@1.1.1": { - "type": "npm", - "name": "npm:string_decoder@1.1.1", - "data": { - "version": "1.1.1", - "packageName": "string_decoder", - "hash": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" - } - }, - "npm:string_decoder@1.3.0": { - "type": "npm", - "name": "npm:string_decoder@1.3.0", - "data": { - "version": "1.3.0", - "packageName": "string_decoder", - "hash": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" - } - }, - "npm:stringify-entities": { - "type": "npm", - "name": "npm:stringify-entities", - "data": { - "version": "4.0.4", - "packageName": "stringify-entities", - "hash": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==" - } - }, - "npm:strip-ansi@6.0.1": { - "type": "npm", - "name": "npm:strip-ansi@6.0.1", - "data": { - "version": "6.0.1", - "packageName": "strip-ansi", - "hash": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - } - }, - "npm:strip-ansi@7.1.2": { - "type": "npm", - "name": "npm:strip-ansi@7.1.2", - "data": { - "version": "7.1.2", - "packageName": "strip-ansi", - "hash": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==" - } - }, - "npm:strip-ansi-cjs": { - "type": "npm", - "name": "npm:strip-ansi-cjs", - "data": { - "version": "npm:strip-ansi@6.0.1", - "packageName": "strip-ansi-cjs", - "hash": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - } - }, - "npm:strip-bom": { - "type": "npm", - "name": "npm:strip-bom", - "data": { - "version": "3.0.0", - "packageName": "strip-bom", - "hash": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" - } - }, - "npm:strip-final-newline": { - "type": "npm", - "name": "npm:strip-final-newline", - "data": { - "version": "3.0.0", - "packageName": "strip-final-newline", - "hash": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" - } - }, - "npm:strip-indent": { - "type": "npm", - "name": "npm:strip-indent", - "data": { - "version": "3.0.0", - "packageName": "strip-indent", - "hash": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==" - } - }, - "npm:strip-json-comments@3.1.1": { - "type": "npm", - "name": "npm:strip-json-comments@3.1.1", - "data": { - "version": "3.1.1", - "packageName": "strip-json-comments", - "hash": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - } - }, - "npm:strip-json-comments@5.0.3": { - "type": "npm", - "name": "npm:strip-json-comments@5.0.3", - "data": { - "version": "5.0.3", - "packageName": "strip-json-comments", - "hash": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==" - } - }, - "npm:strip-literal": { - "type": "npm", - "name": "npm:strip-literal", - "data": { - "version": "3.1.0", - "packageName": "strip-literal", - "hash": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==" - } - }, - "npm:style-to-js": { - "type": "npm", - "name": "npm:style-to-js", - "data": { - "version": "1.1.18", - "packageName": "style-to-js", - "hash": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==" - } - }, - "npm:style-to-object": { - "type": "npm", - "name": "npm:style-to-object", - "data": { - "version": "1.0.11", - "packageName": "style-to-object", - "hash": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==" - } - }, - "npm:supports-color@10.2.2": { - "type": "npm", - "name": "npm:supports-color@10.2.2", - "data": { - "version": "10.2.2", - "packageName": "supports-color", - "hash": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==" - } - }, - "npm:supports-color@7.2.0": { - "type": "npm", - "name": "npm:supports-color@7.2.0", - "data": { - "version": "7.2.0", - "packageName": "supports-color", - "hash": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - } - }, - "npm:supports-color@8.1.1": { - "type": "npm", - "name": "npm:supports-color@8.1.1", - "data": { - "version": "8.1.1", - "packageName": "supports-color", - "hash": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" - } - }, - "npm:supports-preserve-symlinks-flag": { - "type": "npm", - "name": "npm:supports-preserve-symlinks-flag", - "data": { - "version": "1.0.0", - "packageName": "supports-preserve-symlinks-flag", - "hash": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - } - }, - "npm:svelte": { - "type": "npm", - "name": "npm:svelte", - "data": { - "version": "5.44.1", - "packageName": "svelte", - "hash": "sha512-8VnkRXpa6tJ9IqiwKvzZBNnBy9tZg0N63duDz0EJqiozsmBEAZfHiZzWWWAneIN+cAWkK1JkafW1xIbC4YrdBA==" - } - }, - "npm:symbol-tree": { - "type": "npm", - "name": "npm:symbol-tree", - "data": { - "version": "3.2.4", - "packageName": "symbol-tree", - "hash": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - } - }, - "npm:system-architecture": { - "type": "npm", - "name": "npm:system-architecture", - "data": { - "version": "0.1.0", - "packageName": "system-architecture", - "hash": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==" - } - }, - "npm:tagged-tag": { - "type": "npm", - "name": "npm:tagged-tag", - "data": { - "version": "1.0.0", - "packageName": "tagged-tag", - "hash": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==" - } - }, - "npm:tailwindcss": { - "type": "npm", - "name": "npm:tailwindcss", - "data": { - "version": "4.1.17", - "packageName": "tailwindcss", - "hash": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==" - } - }, - "npm:tapable": { - "type": "npm", - "name": "npm:tapable", - "data": { - "version": "2.3.0", - "packageName": "tapable", - "hash": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==" - } - }, - "npm:tar-stream@2.2.0": { - "type": "npm", - "name": "npm:tar-stream@2.2.0", - "data": { - "version": "2.2.0", - "packageName": "tar-stream", - "hash": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==" - } - }, - "npm:tar-stream@3.1.7": { - "type": "npm", - "name": "npm:tar-stream@3.1.7", - "data": { - "version": "3.1.7", - "packageName": "tar-stream", - "hash": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==" - } - }, - "npm:tar": { - "type": "npm", - "name": "npm:tar", - "data": { - "version": "7.5.2", - "packageName": "tar", - "hash": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==" - } - }, - "npm:term-size": { - "type": "npm", - "name": "npm:term-size", - "data": { - "version": "2.2.1", - "packageName": "term-size", - "hash": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" - } - }, - "npm:terser": { - "type": "npm", - "name": "npm:terser", - "data": { - "version": "5.44.0", - "packageName": "terser", - "hash": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==" - } - }, - "npm:text-decoder": { - "type": "npm", - "name": "npm:text-decoder", - "data": { - "version": "1.2.3", - "packageName": "text-decoder", - "hash": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==" - } - }, - "npm:text-extensions": { - "type": "npm", - "name": "npm:text-extensions", - "data": { - "version": "2.4.0", - "packageName": "text-extensions", - "hash": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==" - } - }, - "npm:through": { - "type": "npm", - "name": "npm:through", - "data": { - "version": "2.3.8", - "packageName": "through", - "hash": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - } - }, - "npm:tiny-invariant": { - "type": "npm", - "name": "npm:tiny-invariant", - "data": { - "version": "1.3.3", - "packageName": "tiny-invariant", - "hash": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - } - }, - "npm:tiny-warning": { - "type": "npm", - "name": "npm:tiny-warning", - "data": { - "version": "1.0.3", - "packageName": "tiny-warning", - "hash": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - } - }, - "npm:tinybench": { - "type": "npm", - "name": "npm:tinybench", - "data": { - "version": "2.9.0", - "packageName": "tinybench", - "hash": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" - } - }, - "npm:tinyexec@0.3.2": { - "type": "npm", - "name": "npm:tinyexec@0.3.2", - "data": { - "version": "0.3.2", - "packageName": "tinyexec", - "hash": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" - } - }, - "npm:tinyexec@1.0.1": { - "type": "npm", - "name": "npm:tinyexec@1.0.1", - "data": { - "version": "1.0.1", - "packageName": "tinyexec", - "hash": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==" - } - }, - "npm:tinyglobby": { - "type": "npm", - "name": "npm:tinyglobby", - "data": { - "version": "0.2.15", - "packageName": "tinyglobby", - "hash": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==" - } - }, - "npm:tinyrainbow": { - "type": "npm", - "name": "npm:tinyrainbow", - "data": { - "version": "3.0.3", - "packageName": "tinyrainbow", - "hash": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==" - } - }, - "npm:tldts-core": { - "type": "npm", - "name": "npm:tldts-core", - "data": { - "version": "7.0.16", - "packageName": "tldts-core", - "hash": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==" - } - }, - "npm:tldts": { - "type": "npm", - "name": "npm:tldts", - "data": { - "version": "7.0.16", - "packageName": "tldts", - "hash": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==" - } - }, - "npm:tmp": { - "type": "npm", - "name": "npm:tmp", - "data": { - "version": "0.2.5", - "packageName": "tmp", - "hash": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==" - } - }, - "npm:to-regex-range": { - "type": "npm", - "name": "npm:to-regex-range", - "data": { - "version": "5.0.1", - "packageName": "to-regex-range", - "hash": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - } - }, - "npm:toidentifier": { - "type": "npm", - "name": "npm:toidentifier", - "data": { - "version": "1.0.1", - "packageName": "toidentifier", - "hash": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - } - }, - "npm:tough-cookie": { - "type": "npm", - "name": "npm:tough-cookie", - "data": { - "version": "6.0.0", - "packageName": "tough-cookie", - "hash": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==" - } - }, - "npm:tr46@0.0.3": { - "type": "npm", - "name": "npm:tr46@0.0.3", - "data": { - "version": "0.0.3", - "packageName": "tr46", - "hash": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - } - }, - "npm:tr46@6.0.0": { - "type": "npm", - "name": "npm:tr46@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "tr46", - "hash": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==" - } - }, - "npm:tree-kill": { - "type": "npm", - "name": "npm:tree-kill", - "data": { - "version": "1.2.2", - "packageName": "tree-kill", - "hash": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - } - }, - "npm:trim-lines": { - "type": "npm", - "name": "npm:trim-lines", - "data": { - "version": "3.0.1", - "packageName": "trim-lines", - "hash": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" - } - }, - "npm:trough": { - "type": "npm", - "name": "npm:trough", - "data": { - "version": "2.2.0", - "packageName": "trough", - "hash": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" - } - }, - "npm:ts-algebra": { - "type": "npm", - "name": "npm:ts-algebra", - "data": { - "version": "2.0.0", - "packageName": "ts-algebra", - "hash": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==" - } - }, - "npm:ts-api-utils": { - "type": "npm", - "name": "npm:ts-api-utils", - "data": { - "version": "2.1.0", - "packageName": "ts-api-utils", - "hash": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==" - } - }, - "npm:ts-declaration-location": { - "type": "npm", - "name": "npm:ts-declaration-location", - "data": { - "version": "1.0.7", - "packageName": "ts-declaration-location", - "hash": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==" - } - }, - "npm:ts-pattern": { - "type": "npm", - "name": "npm:ts-pattern", - "data": { - "version": "5.9.0", - "packageName": "ts-pattern", - "hash": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==" - } - }, - "npm:tsconfck": { - "type": "npm", - "name": "npm:tsconfck", - "data": { - "version": "3.1.6", - "packageName": "tsconfck", - "hash": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==" - } - }, - "npm:tsconfig-paths": { - "type": "npm", - "name": "npm:tsconfig-paths", - "data": { - "version": "4.2.0", - "packageName": "tsconfig-paths", - "hash": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==" - } - }, - "npm:tslib": { - "type": "npm", - "name": "npm:tslib", - "data": { - "version": "2.8.1", - "packageName": "tslib", - "hash": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - } - }, - "npm:tsx": { - "type": "npm", - "name": "npm:tsx", - "data": { - "version": "4.20.6", - "packageName": "tsx", - "hash": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==" - } - }, - "npm:type-check": { - "type": "npm", - "name": "npm:type-check", - "data": { - "version": "0.4.0", - "packageName": "type-check", - "hash": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" - } - }, - "npm:type-fest": { - "type": "npm", - "name": "npm:type-fest", - "data": { - "version": "5.1.0", - "packageName": "type-fest", - "hash": "sha512-wQ531tuWvB6oK+pchHIu5lHe5f5wpSCqB8Kf4dWQRbOYc9HTge7JL0G4Qd44bh6QuJCccIzL3bugb8GI0MwHrg==" - } - }, - "npm:typedoc-plugin-frontmatter": { - "type": "npm", - "name": "npm:typedoc-plugin-frontmatter", - "data": { - "version": "1.3.0", - "packageName": "typedoc-plugin-frontmatter", - "hash": "sha512-xYQFMAecMlsRUjmf9oM/Sq2FVz4zlgcbIeVFNLdO118CHTN06gIKJNSlyExh9+Xl8sK0YhIvoQwViUURxritWA==" - } - }, - "npm:typedoc-plugin-markdown": { - "type": "npm", - "name": "npm:typedoc-plugin-markdown", - "data": { - "version": "4.9.0", - "packageName": "typedoc-plugin-markdown", - "hash": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==" - } - }, - "npm:typedoc": { - "type": "npm", - "name": "npm:typedoc", - "data": { - "version": "0.28.14", - "packageName": "typedoc", - "hash": "sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==" - } - }, - "npm:typescript-eslint": { - "type": "npm", - "name": "npm:typescript-eslint", - "data": { - "version": "8.46.3", - "packageName": "typescript-eslint", - "hash": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==" - } - }, - "npm:typescript@5.4.2": { - "type": "npm", - "name": "npm:typescript@5.4.2", - "data": { - "version": "5.4.2", - "packageName": "typescript", - "hash": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==" - } - }, - "npm:typescript": { - "type": "npm", - "name": "npm:typescript", - "data": { - "version": "5.9.3", - "packageName": "typescript", - "hash": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==" - } - }, - "npm:uc.micro": { - "type": "npm", - "name": "npm:uc.micro", - "data": { - "version": "2.1.0", - "packageName": "uc.micro", - "hash": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" - } - }, - "npm:ufo": { - "type": "npm", - "name": "npm:ufo", - "data": { - "version": "1.6.1", - "packageName": "ufo", - "hash": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==" - } - }, - "npm:ultrahtml": { - "type": "npm", - "name": "npm:ultrahtml", - "data": { - "version": "1.6.0", - "packageName": "ultrahtml", - "hash": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==" - } - }, - "npm:uncrypto": { - "type": "npm", - "name": "npm:uncrypto", - "data": { - "version": "0.1.3", - "packageName": "uncrypto", - "hash": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" - } - }, - "npm:unctx": { - "type": "npm", - "name": "npm:unctx", - "data": { - "version": "2.4.1", - "packageName": "unctx", - "hash": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==" - } - }, - "npm:undici-types@6.21.0": { - "type": "npm", - "name": "npm:undici-types@6.21.0", - "data": { - "version": "6.21.0", - "packageName": "undici-types", - "hash": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" - } - }, - "npm:undici-types@7.16.0": { - "type": "npm", - "name": "npm:undici-types@7.16.0", - "data": { - "version": "7.16.0", - "packageName": "undici-types", - "hash": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" - } - }, - "npm:undici": { - "type": "npm", - "name": "npm:undici", - "data": { - "version": "7.16.0", - "packageName": "undici", - "hash": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==" - } - }, - "npm:unenv": { - "type": "npm", - "name": "npm:unenv", - "data": { - "version": "2.0.0-rc.24", - "packageName": "unenv", - "hash": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==" - } - }, - "npm:unicorn-magic": { - "type": "npm", - "name": "npm:unicorn-magic", - "data": { - "version": "0.3.0", - "packageName": "unicorn-magic", - "hash": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==" - } - }, - "npm:unified": { - "type": "npm", - "name": "npm:unified", - "data": { - "version": "11.0.5", - "packageName": "unified", - "hash": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==" - } - }, - "npm:unimport": { - "type": "npm", - "name": "npm:unimport", - "data": { - "version": "5.5.0", - "packageName": "unimport", - "hash": "sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==" - } - }, - "npm:unist-util-find-after": { - "type": "npm", - "name": "npm:unist-util-find-after", - "data": { - "version": "5.0.0", - "packageName": "unist-util-find-after", - "hash": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==" - } - }, - "npm:unist-util-is": { - "type": "npm", - "name": "npm:unist-util-is", - "data": { - "version": "6.0.1", - "packageName": "unist-util-is", - "hash": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==" - } - }, - "npm:unist-util-position": { - "type": "npm", - "name": "npm:unist-util-position", - "data": { - "version": "5.0.0", - "packageName": "unist-util-position", - "hash": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==" - } - }, - "npm:unist-util-stringify-position": { - "type": "npm", - "name": "npm:unist-util-stringify-position", - "data": { - "version": "4.0.0", - "packageName": "unist-util-stringify-position", - "hash": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==" - } - }, - "npm:unist-util-visit-parents": { - "type": "npm", - "name": "npm:unist-util-visit-parents", - "data": { - "version": "6.0.2", - "packageName": "unist-util-visit-parents", - "hash": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==" - } - }, - "npm:unist-util-visit": { - "type": "npm", - "name": "npm:unist-util-visit", - "data": { - "version": "5.0.0", - "packageName": "unist-util-visit", - "hash": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==" - } - }, - "npm:universalify@0.1.2": { - "type": "npm", - "name": "npm:universalify@0.1.2", - "data": { - "version": "0.1.2", - "packageName": "universalify", - "hash": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } - }, - "npm:universalify@2.0.1": { - "type": "npm", - "name": "npm:universalify@2.0.1", - "data": { - "version": "2.0.1", - "packageName": "universalify", - "hash": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" - } - }, - "npm:unplugin-utils": { - "type": "npm", - "name": "npm:unplugin-utils", - "data": { - "version": "0.3.1", - "packageName": "unplugin-utils", - "hash": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==" - } - }, - "npm:unplugin": { - "type": "npm", - "name": "npm:unplugin", - "data": { - "version": "2.3.10", - "packageName": "unplugin", - "hash": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==" - } - }, - "npm:unrs-resolver": { - "type": "npm", - "name": "npm:unrs-resolver", - "data": { - "version": "1.11.1", - "packageName": "unrs-resolver", - "hash": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==" - } - }, - "npm:unstorage": { - "type": "npm", - "name": "npm:unstorage", - "data": { - "version": "1.17.2", - "packageName": "unstorage", - "hash": "sha512-cKEsD6iBWJgOMJ6vW1ID/SYuqNf8oN4yqRk8OYqaVQ3nnkJXOT1PSpaMh2QfzLs78UN5kSNRD2c/mgjT8tX7+w==" - } - }, - "npm:untun": { - "type": "npm", - "name": "npm:untun", - "data": { - "version": "0.1.3", - "packageName": "untun", - "hash": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==" - } - }, - "npm:untyped": { - "type": "npm", - "name": "npm:untyped", - "data": { - "version": "2.0.0", - "packageName": "untyped", - "hash": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==" - } - }, - "npm:unwasm": { - "type": "npm", - "name": "npm:unwasm", - "data": { - "version": "0.3.11", - "packageName": "unwasm", - "hash": "sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ==" - } - }, - "npm:update-browserslist-db": { - "type": "npm", - "name": "npm:update-browserslist-db", - "data": { - "version": "1.1.4", - "packageName": "update-browserslist-db", - "hash": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==" - } - }, - "npm:uqr": { - "type": "npm", - "name": "npm:uqr", - "data": { - "version": "0.1.2", - "packageName": "uqr", - "hash": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" - } - }, - "npm:uri-js": { - "type": "npm", - "name": "npm:uri-js", - "data": { - "version": "4.4.1", - "packageName": "uri-js", - "hash": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - } - }, - "npm:use-sync-external-store": { - "type": "npm", - "name": "npm:use-sync-external-store", - "data": { - "version": "1.6.0", - "packageName": "use-sync-external-store", - "hash": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==" - } - }, - "npm:util-deprecate": { - "type": "npm", - "name": "npm:util-deprecate", - "data": { - "version": "1.0.2", - "packageName": "util-deprecate", - "hash": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - } - }, - "npm:vfile-location": { - "type": "npm", - "name": "npm:vfile-location", - "data": { - "version": "5.0.3", - "packageName": "vfile-location", - "hash": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==" - } - }, - "npm:vfile-message": { - "type": "npm", - "name": "npm:vfile-message", - "data": { - "version": "4.0.3", - "packageName": "vfile-message", - "hash": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==" - } - }, - "npm:vfile": { - "type": "npm", - "name": "npm:vfile", - "data": { - "version": "6.0.3", - "packageName": "vfile", - "hash": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==" - } - }, - "npm:vite-plugin-dts": { - "type": "npm", - "name": "npm:vite-plugin-dts", - "data": { - "version": "4.2.3", - "packageName": "vite-plugin-dts", - "hash": "sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==" - } - }, - "npm:vite-plugin-externalize-deps": { - "type": "npm", - "name": "npm:vite-plugin-externalize-deps", - "data": { - "version": "0.10.0", - "packageName": "vite-plugin-externalize-deps", - "hash": "sha512-eQrtpT/Do7AvDn76l1yL6ZHyXJ+UWH2LaHVqhAes9go54qaAnPZuMbgxcroQ/7WY3ZyetZzYW2quQnDF0DV5qg==" - } - }, - "npm:vite-plugin-solid": { - "type": "npm", - "name": "npm:vite-plugin-solid", - "data": { - "version": "2.11.10", - "packageName": "vite-plugin-solid", - "hash": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==" - } - }, - "npm:vite-tsconfig-paths": { - "type": "npm", - "name": "npm:vite-tsconfig-paths", - "data": { - "version": "5.1.4", - "packageName": "vite-tsconfig-paths", - "hash": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==" - } - }, - "npm:vite": { - "type": "npm", - "name": "npm:vite", - "data": { - "version": "7.2.4", - "packageName": "vite", - "hash": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==" - } - }, - "npm:vitefu": { - "type": "npm", - "name": "npm:vitefu", - "data": { - "version": "1.1.1", - "packageName": "vitefu", - "hash": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==" - } - }, - "npm:vitest": { - "type": "npm", - "name": "npm:vitest", - "data": { - "version": "4.0.14", - "packageName": "vitest", - "hash": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==" - } - }, - "npm:vscode-uri": { - "type": "npm", - "name": "npm:vscode-uri", - "data": { - "version": "3.1.0", - "packageName": "vscode-uri", - "hash": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" - } - }, - "npm:vue-eslint-parser": { - "type": "npm", - "name": "npm:vue-eslint-parser", - "data": { - "version": "10.2.0", - "packageName": "vue-eslint-parser", - "hash": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==" - } - }, - "npm:w3c-xmlserializer": { - "type": "npm", - "name": "npm:w3c-xmlserializer", - "data": { - "version": "5.0.0", - "packageName": "w3c-xmlserializer", - "hash": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==" - } - }, - "npm:walk-up-path": { - "type": "npm", - "name": "npm:walk-up-path", - "data": { - "version": "4.0.0", - "packageName": "walk-up-path", - "hash": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==" - } - }, - "npm:wcwidth": { - "type": "npm", - "name": "npm:wcwidth", - "data": { - "version": "1.0.1", - "packageName": "wcwidth", - "hash": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==" - } - }, - "npm:web-namespaces": { - "type": "npm", - "name": "npm:web-namespaces", - "data": { - "version": "2.0.1", - "packageName": "web-namespaces", - "hash": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" - } - }, - "npm:web-streams-polyfill": { - "type": "npm", - "name": "npm:web-streams-polyfill", - "data": { - "version": "3.3.3", - "packageName": "web-streams-polyfill", - "hash": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" - } - }, - "npm:web-vitals": { - "type": "npm", - "name": "npm:web-vitals", - "data": { - "version": "5.1.0", - "packageName": "web-vitals", - "hash": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==" - } - }, - "npm:webidl-conversions@3.0.1": { - "type": "npm", - "name": "npm:webidl-conversions@3.0.1", - "data": { - "version": "3.0.1", - "packageName": "webidl-conversions", - "hash": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - } - }, - "npm:webidl-conversions@8.0.0": { - "type": "npm", - "name": "npm:webidl-conversions@8.0.0", - "data": { - "version": "8.0.0", - "packageName": "webidl-conversions", - "hash": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==" - } - }, - "npm:webpack-virtual-modules": { - "type": "npm", - "name": "npm:webpack-virtual-modules", - "data": { - "version": "0.6.2", - "packageName": "webpack-virtual-modules", - "hash": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" - } - }, - "npm:whatwg-encoding": { - "type": "npm", - "name": "npm:whatwg-encoding", - "data": { - "version": "3.1.1", - "packageName": "whatwg-encoding", - "hash": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==" - } - }, - "npm:whatwg-fetch": { - "type": "npm", - "name": "npm:whatwg-fetch", - "data": { - "version": "3.6.20", - "packageName": "whatwg-fetch", - "hash": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - } - }, - "npm:whatwg-mimetype@3.0.0": { - "type": "npm", - "name": "npm:whatwg-mimetype@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "whatwg-mimetype", - "hash": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" - } - }, - "npm:whatwg-mimetype@4.0.0": { - "type": "npm", - "name": "npm:whatwg-mimetype@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "whatwg-mimetype", - "hash": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==" - } - }, - "npm:whatwg-url@15.1.0": { - "type": "npm", - "name": "npm:whatwg-url@15.1.0", - "data": { - "version": "15.1.0", - "packageName": "whatwg-url", - "hash": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==" - } - }, - "npm:whatwg-url@5.0.0": { - "type": "npm", - "name": "npm:whatwg-url@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "whatwg-url", - "hash": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" - } - }, - "npm:which": { - "type": "npm", - "name": "npm:which", - "data": { - "version": "2.0.2", - "packageName": "which", - "hash": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" - } - }, - "npm:why-is-node-running": { - "type": "npm", - "name": "npm:why-is-node-running", - "data": { - "version": "2.3.0", - "packageName": "why-is-node-running", - "hash": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==" - } - }, - "npm:word-wrap": { - "type": "npm", - "name": "npm:word-wrap", - "data": { - "version": "1.2.5", - "packageName": "word-wrap", - "hash": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" - } - }, - "npm:wrap-ansi@7.0.0": { - "type": "npm", - "name": "npm:wrap-ansi@7.0.0", - "data": { - "version": "7.0.0", - "packageName": "wrap-ansi", - "hash": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - } - }, - "npm:wrap-ansi@8.1.0": { - "type": "npm", - "name": "npm:wrap-ansi@8.1.0", - "data": { - "version": "8.1.0", - "packageName": "wrap-ansi", - "hash": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==" - } - }, - "npm:wrap-ansi-cjs": { - "type": "npm", - "name": "npm:wrap-ansi-cjs", - "data": { - "version": "npm:wrap-ansi@7.0.0", - "packageName": "wrap-ansi-cjs", - "hash": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - } - }, - "npm:wrappy": { - "type": "npm", - "name": "npm:wrappy", - "data": { - "version": "1.0.2", - "packageName": "wrappy", - "hash": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - } - }, - "npm:ws": { - "type": "npm", - "name": "npm:ws", - "data": { - "version": "8.18.3", - "packageName": "ws", - "hash": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==" - } - }, - "npm:xml-name-validator": { - "type": "npm", - "name": "npm:xml-name-validator", - "data": { - "version": "5.0.0", - "packageName": "xml-name-validator", - "hash": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==" - } - }, - "npm:xmlbuilder2": { - "type": "npm", - "name": "npm:xmlbuilder2", - "data": { - "version": "4.0.1", - "packageName": "xmlbuilder2", - "hash": "sha512-vXeky0YRVjhx5pseJDQLk0F6u7gyA8++ceVOS88r4dWu4lWdY/ZjbL45QrN+g0GzZLg1D5AkzThpikZa98SC/g==" - } - }, - "npm:xmlchars": { - "type": "npm", - "name": "npm:xmlchars", - "data": { - "version": "2.2.0", - "packageName": "xmlchars", - "hash": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - } - }, - "npm:y18n": { - "type": "npm", - "name": "npm:y18n", - "data": { - "version": "5.0.8", - "packageName": "y18n", - "hash": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - } - }, - "npm:yallist@3.1.1": { - "type": "npm", - "name": "npm:yallist@3.1.1", - "data": { - "version": "3.1.1", - "packageName": "yallist", - "hash": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - }, - "npm:yallist@4.0.0": { - "type": "npm", - "name": "npm:yallist@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "yallist", - "hash": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - }, - "npm:yallist@5.0.0": { - "type": "npm", - "name": "npm:yallist@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "yallist", - "hash": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" - } - }, - "npm:yaml": { - "type": "npm", - "name": "npm:yaml", - "data": { - "version": "2.8.1", - "packageName": "yaml", - "hash": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==" - } - }, - "npm:yargs-parser": { - "type": "npm", - "name": "npm:yargs-parser", - "data": { - "version": "21.1.1", - "packageName": "yargs-parser", - "hash": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - } - }, - "npm:yargs": { - "type": "npm", - "name": "npm:yargs", - "data": { - "version": "17.7.2", - "packageName": "yargs", - "hash": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==" - } - }, - "npm:yocto-queue": { - "type": "npm", - "name": "npm:yocto-queue", - "data": { - "version": "0.1.0", - "packageName": "yocto-queue", - "hash": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - } - }, - "npm:youch-core": { - "type": "npm", - "name": "npm:youch-core", - "data": { - "version": "0.3.3", - "packageName": "youch-core", - "hash": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==" - } - }, - "npm:youch": { - "type": "npm", - "name": "npm:youch", - "data": { - "version": "4.1.0-beta.11", - "packageName": "youch", - "hash": "sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==" - } - }, - "npm:zimmerframe": { - "type": "npm", - "name": "npm:zimmerframe", - "data": { - "version": "1.1.4", - "packageName": "zimmerframe", - "hash": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==" - } - }, - "npm:zip-stream": { - "type": "npm", - "name": "npm:zip-stream", - "data": { - "version": "6.0.1", - "packageName": "zip-stream", - "hash": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==" - } - }, - "npm:zod-validation-error@3.5.4": { - "type": "npm", - "name": "npm:zod-validation-error@3.5.4", - "data": { - "version": "3.5.4", - "packageName": "zod-validation-error", - "hash": "sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==" - } - }, - "npm:zod-validation-error@4.0.2": { - "type": "npm", - "name": "npm:zod-validation-error@4.0.2", - "data": { - "version": "4.0.2", - "packageName": "zod-validation-error", - "hash": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==" - } - }, - "npm:zod@3.25.76": { - "type": "npm", - "name": "npm:zod@3.25.76", - "data": { - "version": "3.25.76", - "packageName": "zod", - "hash": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" - } - }, - "npm:zod@4.1.13": { - "type": "npm", - "name": "npm:zod@4.1.13", - "data": { - "version": "4.1.13", - "packageName": "zod", - "hash": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==" - } - }, - "npm:zwitch": { - "type": "npm", - "name": "npm:zwitch", - "data": { - "version": "2.0.4", - "packageName": "zwitch", - "hash": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" - } - } - }, - "keyMap": { - "@acemir/cssom@0.9.24": [ - "npm:@acemir/cssom" - ], - "@adobe/css-tools@4.4.4": [ - "npm:@adobe/css-tools" - ], - "@ai-sdk/openai@2.0.73(zod@4.1.13)": [ - "npm:@ai-sdk/openai" - ], - "@ai-sdk/provider-utils@3.0.17(zod@4.1.13)": [ - "npm:@ai-sdk/provider-utils" - ], - "@ai-sdk/provider@2.0.0": [ - "npm:@ai-sdk/provider" - ], - "@anthropic-ai/sdk@0.71.0(zod@4.1.13)": [ - "npm:@anthropic-ai/sdk" - ], - "@asamuzakjp/css-color@4.0.5": [ - "npm:@asamuzakjp/css-color" - ], - "@asamuzakjp/dom-selector@6.7.4": [ - "npm:@asamuzakjp/dom-selector" - ], - "@asamuzakjp/nwsapi@2.3.9": [ - "npm:@asamuzakjp/nwsapi" - ], - "@babel/code-frame@7.26.2": [ - "npm:@babel/code-frame@7.26.2" - ], - "@babel/code-frame@7.27.1": [ - "npm:@babel/code-frame@7.27.1" - ], - "@babel/compat-data@7.28.5": [ - "npm:@babel/compat-data" - ], - "@babel/core@7.28.5": [ - "npm:@babel/core" - ], - "@babel/generator@7.28.5": [ - "npm:@babel/generator" - ], - "@babel/helper-annotate-as-pure@7.27.3": [ - "npm:@babel/helper-annotate-as-pure" - ], - "@babel/helper-compilation-targets@7.27.2": [ - "npm:@babel/helper-compilation-targets" - ], - "@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)": [ - "npm:@babel/helper-create-class-features-plugin" - ], - "@babel/helper-globals@7.28.0": [ - "npm:@babel/helper-globals" - ], - "@babel/helper-member-expression-to-functions@7.28.5": [ - "npm:@babel/helper-member-expression-to-functions" - ], - "@babel/helper-module-imports@7.18.6": [ - "npm:@babel/helper-module-imports@7.18.6" - ], - "@babel/helper-module-imports@7.27.1": [ - "npm:@babel/helper-module-imports@7.27.1" - ], - "@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)": [ - "npm:@babel/helper-module-transforms" - ], - "@babel/helper-optimise-call-expression@7.27.1": [ - "npm:@babel/helper-optimise-call-expression" - ], - "@babel/helper-plugin-utils@7.27.1": [ - "npm:@babel/helper-plugin-utils" - ], - "@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)": [ - "npm:@babel/helper-replace-supers" - ], - "@babel/helper-skip-transparent-expression-wrappers@7.27.1": [ - "npm:@babel/helper-skip-transparent-expression-wrappers" - ], - "@babel/helper-string-parser@7.27.1": [ - "npm:@babel/helper-string-parser" - ], - "@babel/helper-validator-identifier@7.27.1": [ - "npm:@babel/helper-validator-identifier@7.27.1" - ], - "@babel/helper-validator-identifier@7.28.5": [ - "npm:@babel/helper-validator-identifier@7.28.5" - ], - "@babel/helper-validator-option@7.27.1": [ - "npm:@babel/helper-validator-option" - ], - "@babel/helpers@7.28.4": [ - "npm:@babel/helpers" - ], - "@babel/parser@7.28.4": [ - "npm:@babel/parser@7.28.4" - ], - "@babel/parser@7.28.5": [ - "npm:@babel/parser@7.28.5" - ], - "@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.5)": [ - "npm:@babel/plugin-proposal-private-methods" - ], - "@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)": [ - "npm:@babel/plugin-syntax-jsx" - ], - "@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)": [ - "npm:@babel/plugin-syntax-typescript" - ], - "@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)": [ - "npm:@babel/plugin-transform-modules-commonjs" - ], - "@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)": [ - "npm:@babel/plugin-transform-react-jsx-self" - ], - "@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)": [ - "npm:@babel/plugin-transform-react-jsx-source" - ], - "@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)": [ - "npm:@babel/plugin-transform-typescript" - ], - "@babel/preset-typescript@7.28.5(@babel/core@7.28.5)": [ - "npm:@babel/preset-typescript" - ], - "@babel/runtime@7.28.4": [ - "npm:@babel/runtime" - ], - "@babel/template@7.27.2": [ - "npm:@babel/template" - ], - "@babel/traverse@7.28.5": [ - "npm:@babel/traverse" - ], - "@babel/types@7.28.4": [ - "npm:@babel/types@7.28.4" - ], - "@babel/types@7.28.5": [ - "npm:@babel/types@7.28.5" - ], - "@changesets/apply-release-plan@7.0.13": [ - "npm:@changesets/apply-release-plan" - ], - "@changesets/assemble-release-plan@6.0.9": [ - "npm:@changesets/assemble-release-plan" - ], - "@changesets/changelog-git@0.2.1": [ - "npm:@changesets/changelog-git" - ], - "@changesets/cli@2.29.7(@types/node@24.10.1)": [ - "npm:@changesets/cli" - ], - "@changesets/config@3.1.1": [ - "npm:@changesets/config" - ], - "@changesets/errors@0.2.0": [ - "npm:@changesets/errors" - ], - "@changesets/get-dependents-graph@2.1.3": [ - "npm:@changesets/get-dependents-graph" - ], - "@changesets/get-github-info@0.6.0": [ - "npm:@changesets/get-github-info" - ], - "@changesets/get-release-plan@4.0.13": [ - "npm:@changesets/get-release-plan" - ], - "@changesets/get-version-range-type@0.4.0": [ - "npm:@changesets/get-version-range-type" - ], - "@changesets/git@3.0.4": [ - "npm:@changesets/git" - ], - "@changesets/logger@0.1.1": [ - "npm:@changesets/logger" - ], - "@changesets/parse@0.4.1": [ - "npm:@changesets/parse" - ], - "@changesets/pre@2.0.2": [ - "npm:@changesets/pre" - ], - "@changesets/read@0.6.5": [ - "npm:@changesets/read" - ], - "@changesets/should-skip-package@0.1.2": [ - "npm:@changesets/should-skip-package" - ], - "@changesets/types@4.1.0": [ - "npm:@changesets/types@4.1.0" - ], - "@changesets/types@6.1.0": [ - "npm:@changesets/types@6.1.0" - ], - "@changesets/write@0.4.0": [ - "npm:@changesets/write" - ], - "@cloudflare/kv-asset-handler@0.4.0": [ - "npm:@cloudflare/kv-asset-handler" - ], - "@commitlint/parse@20.0.0": [ - "npm:@commitlint/parse" - ], - "@commitlint/types@20.0.0": [ - "npm:@commitlint/types" - ], - "@csstools/color-helpers@5.1.0": [ - "npm:@csstools/color-helpers" - ], - "@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": [ - "npm:@csstools/css-calc" - ], - "@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": [ - "npm:@csstools/css-color-parser" - ], - "@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)": [ - "npm:@csstools/css-parser-algorithms" - ], - "@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)": [ - "npm:@csstools/css-syntax-patches-for-csstree" - ], - "@csstools/css-tokenizer@3.0.4": [ - "npm:@csstools/css-tokenizer" - ], - "@emnapi/core@1.6.0": [ - "npm:@emnapi/core" - ], - "@emnapi/runtime@1.6.0": [ - "npm:@emnapi/runtime" - ], - "@emnapi/wasi-threads@1.1.0": [ - "npm:@emnapi/wasi-threads" - ], - "@esbuild/aix-ppc64@0.25.12": [ - "npm:@esbuild/aix-ppc64" - ], - "@esbuild/android-arm64@0.25.12": [ - "npm:@esbuild/android-arm64" - ], - "@esbuild/android-arm@0.25.12": [ - "npm:@esbuild/android-arm" - ], - "@esbuild/android-x64@0.25.12": [ - "npm:@esbuild/android-x64" - ], - "@esbuild/darwin-arm64@0.25.12": [ - "npm:@esbuild/darwin-arm64" - ], - "@esbuild/darwin-x64@0.25.12": [ - "npm:@esbuild/darwin-x64" - ], - "@esbuild/freebsd-arm64@0.25.12": [ - "npm:@esbuild/freebsd-arm64" - ], - "@esbuild/freebsd-x64@0.25.12": [ - "npm:@esbuild/freebsd-x64" - ], - "@esbuild/linux-arm64@0.25.12": [ - "npm:@esbuild/linux-arm64" - ], - "@esbuild/linux-arm@0.25.12": [ - "npm:@esbuild/linux-arm" - ], - "@esbuild/linux-ia32@0.25.12": [ - "npm:@esbuild/linux-ia32" - ], - "@esbuild/linux-loong64@0.25.12": [ - "npm:@esbuild/linux-loong64" - ], - "@esbuild/linux-mips64el@0.25.12": [ - "npm:@esbuild/linux-mips64el" - ], - "@esbuild/linux-ppc64@0.25.12": [ - "npm:@esbuild/linux-ppc64" - ], - "@esbuild/linux-riscv64@0.25.12": [ - "npm:@esbuild/linux-riscv64" - ], - "@esbuild/linux-s390x@0.25.12": [ - "npm:@esbuild/linux-s390x" - ], - "@esbuild/linux-x64@0.25.12": [ - "npm:@esbuild/linux-x64" - ], - "@esbuild/netbsd-arm64@0.25.12": [ - "npm:@esbuild/netbsd-arm64" - ], - "@esbuild/netbsd-x64@0.25.12": [ - "npm:@esbuild/netbsd-x64" - ], - "@esbuild/openbsd-arm64@0.25.12": [ - "npm:@esbuild/openbsd-arm64" - ], - "@esbuild/openbsd-x64@0.25.12": [ - "npm:@esbuild/openbsd-x64" - ], - "@esbuild/openharmony-arm64@0.25.12": [ - "npm:@esbuild/openharmony-arm64" - ], - "@esbuild/sunos-x64@0.25.12": [ - "npm:@esbuild/sunos-x64" - ], - "@esbuild/win32-arm64@0.25.12": [ - "npm:@esbuild/win32-arm64" - ], - "@esbuild/win32-ia32@0.25.12": [ - "npm:@esbuild/win32-ia32" - ], - "@esbuild/win32-x64@0.25.12": [ - "npm:@esbuild/win32-x64" - ], - "@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))": [ - "npm:@eslint-community/eslint-utils" - ], - "@eslint-community/regexpp@4.12.2": [ - "npm:@eslint-community/regexpp" - ], - "@eslint-react/ast@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@eslint-react/ast" - ], - "@eslint-react/core@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@eslint-react/core" - ], - "@eslint-react/eff@2.3.9": [ - "npm:@eslint-react/eff" - ], - "@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@eslint-react/eslint-plugin" - ], - "@eslint-react/shared@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@eslint-react/shared" - ], - "@eslint-react/var@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@eslint-react/var" - ], - "@eslint/config-array@0.21.1": [ - "npm:@eslint/config-array" - ], - "@eslint/config-helpers@0.4.2": [ - "npm:@eslint/config-helpers" - ], - "@eslint/core@0.17.0": [ - "npm:@eslint/core" - ], - "@eslint/eslintrc@3.3.1": [ - "npm:@eslint/eslintrc" - ], - "@eslint/js@9.39.1": [ - "npm:@eslint/js" - ], - "@eslint/object-schema@2.1.7": [ - "npm:@eslint/object-schema" - ], - "@eslint/plugin-kit@0.4.1": [ - "npm:@eslint/plugin-kit" - ], - "@faker-js/faker@10.1.0": [ - "npm:@faker-js/faker" - ], - "@gerrit0/mini-shiki@3.15.0": [ - "npm:@gerrit0/mini-shiki" - ], - "@google/genai@1.30.0": [ - "npm:@google/genai" - ], - "@humanfs/core@0.19.1": [ - "npm:@humanfs/core" - ], - "@humanfs/node@0.16.7": [ - "npm:@humanfs/node" - ], - "@humanwhocodes/module-importer@1.0.1": [ - "npm:@humanwhocodes/module-importer" - ], - "@humanwhocodes/retry@0.4.3": [ - "npm:@humanwhocodes/retry" - ], - "@inquirer/external-editor@1.0.3(@types/node@24.10.1)": [ - "npm:@inquirer/external-editor" - ], - "@ioredis/commands@1.4.0": [ - "npm:@ioredis/commands" - ], - "@isaacs/cliui@8.0.2": [ - "npm:@isaacs/cliui" - ], - "@isaacs/fs-minipass@4.0.1": [ - "npm:@isaacs/fs-minipass" - ], - "@jest/diff-sequences@30.0.1": [ - "npm:@jest/diff-sequences" - ], - "@jest/get-type@30.1.0": [ - "npm:@jest/get-type" - ], - "@jest/schemas@30.0.5": [ - "npm:@jest/schemas" - ], - "@jridgewell/gen-mapping@0.3.13": [ - "npm:@jridgewell/gen-mapping" - ], - "@jridgewell/remapping@2.3.5": [ - "npm:@jridgewell/remapping" - ], - "@jridgewell/resolve-uri@3.1.2": [ - "npm:@jridgewell/resolve-uri" - ], - "@jridgewell/source-map@0.3.11": [ - "npm:@jridgewell/source-map" - ], - "@jridgewell/sourcemap-codec@1.5.5": [ - "npm:@jridgewell/sourcemap-codec" - ], - "@jridgewell/trace-mapping@0.3.31": [ - "npm:@jridgewell/trace-mapping" - ], - "@kwsites/file-exists@1.1.1": [ - "npm:@kwsites/file-exists" - ], - "@kwsites/promise-deferred@1.1.1": [ - "npm:@kwsites/promise-deferred" - ], - "@manypkg/find-root@1.1.0": [ - "npm:@manypkg/find-root" - ], - "@manypkg/get-packages@1.1.3": [ - "npm:@manypkg/get-packages" - ], - "@mapbox/node-pre-gyp@2.0.0": [ - "npm:@mapbox/node-pre-gyp" - ], - "@microsoft/api-extractor-model@7.29.6(@types/node@24.10.1)": [ - "npm:@microsoft/api-extractor-model" - ], - "@microsoft/api-extractor@7.47.7(@types/node@24.10.1)": [ - "npm:@microsoft/api-extractor" - ], - "@microsoft/tsdoc-config@0.17.1": [ - "npm:@microsoft/tsdoc-config" - ], - "@microsoft/tsdoc@0.15.1": [ - "npm:@microsoft/tsdoc" - ], - "@napi-rs/wasm-runtime@0.2.12": [ - "npm:@napi-rs/wasm-runtime@0.2.12" - ], - "@napi-rs/wasm-runtime@0.2.4": [ - "npm:@napi-rs/wasm-runtime@0.2.4" - ], - "@napi-rs/wasm-runtime@1.0.7": [ - "npm:@napi-rs/wasm-runtime@1.0.7" - ], - "@nodelib/fs.scandir@2.1.5": [ - "npm:@nodelib/fs.scandir" - ], - "@nodelib/fs.stat@2.0.5": [ - "npm:@nodelib/fs.stat" - ], - "@nodelib/fs.walk@1.2.8": [ - "npm:@nodelib/fs.walk" - ], - "@nx/nx-darwin-arm64@22.1.2": [ - "npm:@nx/nx-darwin-arm64" - ], - "@nx/nx-darwin-x64@22.1.2": [ - "npm:@nx/nx-darwin-x64" - ], - "@nx/nx-freebsd-x64@22.1.2": [ - "npm:@nx/nx-freebsd-x64" - ], - "@nx/nx-linux-arm-gnueabihf@22.1.2": [ - "npm:@nx/nx-linux-arm-gnueabihf" - ], - "@nx/nx-linux-arm64-gnu@22.1.2": [ - "npm:@nx/nx-linux-arm64-gnu" - ], - "@nx/nx-linux-arm64-musl@22.1.2": [ - "npm:@nx/nx-linux-arm64-musl" - ], - "@nx/nx-linux-x64-gnu@22.1.2": [ - "npm:@nx/nx-linux-x64-gnu" - ], - "@nx/nx-linux-x64-musl@22.1.2": [ - "npm:@nx/nx-linux-x64-musl" - ], - "@nx/nx-win32-arm64-msvc@22.1.2": [ - "npm:@nx/nx-win32-arm64-msvc" - ], - "@nx/nx-win32-x64-msvc@22.1.2": [ - "npm:@nx/nx-win32-x64-msvc" - ], - "@oozcitak/dom@2.0.2": [ - "npm:@oozcitak/dom" - ], - "@oozcitak/infra@2.0.2": [ - "npm:@oozcitak/infra" - ], - "@oozcitak/url@3.0.0": [ - "npm:@oozcitak/url" - ], - "@oozcitak/util@10.0.0": [ - "npm:@oozcitak/util" - ], - "@oxc-project/types@0.98.0": [ - "npm:@oxc-project/types" - ], - "@oxc-resolver/binding-android-arm-eabi@11.14.0": [ - "npm:@oxc-resolver/binding-android-arm-eabi" - ], - "@oxc-resolver/binding-android-arm64@11.14.0": [ - "npm:@oxc-resolver/binding-android-arm64" - ], - "@oxc-resolver/binding-darwin-arm64@11.14.0": [ - "npm:@oxc-resolver/binding-darwin-arm64" - ], - "@oxc-resolver/binding-darwin-x64@11.14.0": [ - "npm:@oxc-resolver/binding-darwin-x64" - ], - "@oxc-resolver/binding-freebsd-x64@11.14.0": [ - "npm:@oxc-resolver/binding-freebsd-x64" - ], - "@oxc-resolver/binding-linux-arm-gnueabihf@11.14.0": [ - "npm:@oxc-resolver/binding-linux-arm-gnueabihf" - ], - "@oxc-resolver/binding-linux-arm-musleabihf@11.14.0": [ - "npm:@oxc-resolver/binding-linux-arm-musleabihf" - ], - "@oxc-resolver/binding-linux-arm64-gnu@11.14.0": [ - "npm:@oxc-resolver/binding-linux-arm64-gnu" - ], - "@oxc-resolver/binding-linux-arm64-musl@11.14.0": [ - "npm:@oxc-resolver/binding-linux-arm64-musl" - ], - "@oxc-resolver/binding-linux-ppc64-gnu@11.14.0": [ - "npm:@oxc-resolver/binding-linux-ppc64-gnu" - ], - "@oxc-resolver/binding-linux-riscv64-gnu@11.14.0": [ - "npm:@oxc-resolver/binding-linux-riscv64-gnu" - ], - "@oxc-resolver/binding-linux-riscv64-musl@11.14.0": [ - "npm:@oxc-resolver/binding-linux-riscv64-musl" - ], - "@oxc-resolver/binding-linux-s390x-gnu@11.14.0": [ - "npm:@oxc-resolver/binding-linux-s390x-gnu" - ], - "@oxc-resolver/binding-linux-x64-gnu@11.14.0": [ - "npm:@oxc-resolver/binding-linux-x64-gnu" - ], - "@oxc-resolver/binding-linux-x64-musl@11.14.0": [ - "npm:@oxc-resolver/binding-linux-x64-musl" - ], - "@oxc-resolver/binding-wasm32-wasi@11.14.0": [ - "npm:@oxc-resolver/binding-wasm32-wasi" - ], - "@oxc-resolver/binding-win32-arm64-msvc@11.14.0": [ - "npm:@oxc-resolver/binding-win32-arm64-msvc" - ], - "@oxc-resolver/binding-win32-ia32-msvc@11.14.0": [ - "npm:@oxc-resolver/binding-win32-ia32-msvc" - ], - "@oxc-resolver/binding-win32-x64-msvc@11.14.0": [ - "npm:@oxc-resolver/binding-win32-x64-msvc" - ], - "@parcel/watcher-android-arm64@2.5.1": [ - "npm:@parcel/watcher-android-arm64" - ], - "@parcel/watcher-darwin-arm64@2.5.1": [ - "npm:@parcel/watcher-darwin-arm64" - ], - "@parcel/watcher-darwin-x64@2.5.1": [ - "npm:@parcel/watcher-darwin-x64" - ], - "@parcel/watcher-freebsd-x64@2.5.1": [ - "npm:@parcel/watcher-freebsd-x64" - ], - "@parcel/watcher-linux-arm-glibc@2.5.1": [ - "npm:@parcel/watcher-linux-arm-glibc" - ], - "@parcel/watcher-linux-arm-musl@2.5.1": [ - "npm:@parcel/watcher-linux-arm-musl" - ], - "@parcel/watcher-linux-arm64-glibc@2.5.1": [ - "npm:@parcel/watcher-linux-arm64-glibc" - ], - "@parcel/watcher-linux-arm64-musl@2.5.1": [ - "npm:@parcel/watcher-linux-arm64-musl" - ], - "@parcel/watcher-linux-x64-glibc@2.5.1": [ - "npm:@parcel/watcher-linux-x64-glibc" - ], - "@parcel/watcher-linux-x64-musl@2.5.1": [ - "npm:@parcel/watcher-linux-x64-musl" - ], - "@parcel/watcher-wasm@2.5.1": [ - "npm:@parcel/watcher-wasm" - ], - "@parcel/watcher-win32-arm64@2.5.1": [ - "npm:@parcel/watcher-win32-arm64" - ], - "@parcel/watcher-win32-ia32@2.5.1": [ - "npm:@parcel/watcher-win32-ia32" - ], - "@parcel/watcher-win32-x64@2.5.1": [ - "npm:@parcel/watcher-win32-x64" - ], - "@parcel/watcher@2.5.1": [ - "npm:@parcel/watcher" - ], - "@pkgjs/parseargs@0.11.0": [ - "npm:@pkgjs/parseargs" - ], - "@poppinss/colors@4.1.5": [ - "npm:@poppinss/colors" - ], - "@poppinss/dumper@0.6.4": [ - "npm:@poppinss/dumper" - ], - "@poppinss/exception@1.2.2": [ - "npm:@poppinss/exception" - ], - "@publint/pack@0.1.2": [ - "npm:@publint/pack" - ], - "@rolldown/binding-android-arm64@1.0.0-beta.51": [ - "npm:@rolldown/binding-android-arm64" - ], - "@rolldown/binding-darwin-arm64@1.0.0-beta.51": [ - "npm:@rolldown/binding-darwin-arm64" - ], - "@rolldown/binding-darwin-x64@1.0.0-beta.51": [ - "npm:@rolldown/binding-darwin-x64" - ], - "@rolldown/binding-freebsd-x64@1.0.0-beta.51": [ - "npm:@rolldown/binding-freebsd-x64" - ], - "@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51": [ - "npm:@rolldown/binding-linux-arm-gnueabihf" - ], - "@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51": [ - "npm:@rolldown/binding-linux-arm64-gnu" - ], - "@rolldown/binding-linux-arm64-musl@1.0.0-beta.51": [ - "npm:@rolldown/binding-linux-arm64-musl" - ], - "@rolldown/binding-linux-x64-gnu@1.0.0-beta.51": [ - "npm:@rolldown/binding-linux-x64-gnu" - ], - "@rolldown/binding-linux-x64-musl@1.0.0-beta.51": [ - "npm:@rolldown/binding-linux-x64-musl" - ], - "@rolldown/binding-openharmony-arm64@1.0.0-beta.51": [ - "npm:@rolldown/binding-openharmony-arm64" - ], - "@rolldown/binding-wasm32-wasi@1.0.0-beta.51": [ - "npm:@rolldown/binding-wasm32-wasi" - ], - "@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51": [ - "npm:@rolldown/binding-win32-arm64-msvc" - ], - "@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51": [ - "npm:@rolldown/binding-win32-ia32-msvc" - ], - "@rolldown/binding-win32-x64-msvc@1.0.0-beta.51": [ - "npm:@rolldown/binding-win32-x64-msvc" - ], - "@rolldown/pluginutils@1.0.0-beta.40": [ - "npm:@rolldown/pluginutils@1.0.0-beta.40" - ], - "@rolldown/pluginutils@1.0.0-beta.47": [ - "npm:@rolldown/pluginutils@1.0.0-beta.47" - ], - "@rolldown/pluginutils@1.0.0-beta.51": [ - "npm:@rolldown/pluginutils@1.0.0-beta.51" - ], - "@rollup/plugin-alias@5.1.1(rollup@4.53.3)": [ - "npm:@rollup/plugin-alias" - ], - "@rollup/plugin-commonjs@28.0.9(rollup@4.53.3)": [ - "npm:@rollup/plugin-commonjs" - ], - "@rollup/plugin-inject@5.0.5(rollup@4.53.3)": [ - "npm:@rollup/plugin-inject" - ], - "@rollup/plugin-json@6.1.0(rollup@4.53.3)": [ - "npm:@rollup/plugin-json" - ], - "@rollup/plugin-node-resolve@16.0.3(rollup@4.53.3)": [ - "npm:@rollup/plugin-node-resolve" - ], - "@rollup/plugin-replace@6.0.3(rollup@4.53.3)": [ - "npm:@rollup/plugin-replace" - ], - "@rollup/plugin-terser@0.4.4(rollup@4.53.3)": [ - "npm:@rollup/plugin-terser" - ], - "@rollup/pluginutils@5.3.0(rollup@4.53.3)": [ - "npm:@rollup/pluginutils" - ], - "@rollup/rollup-android-arm-eabi@4.53.3": [ - "npm:@rollup/rollup-android-arm-eabi" - ], - "@rollup/rollup-android-arm64@4.53.3": [ - "npm:@rollup/rollup-android-arm64" - ], - "@rollup/rollup-darwin-arm64@4.53.3": [ - "npm:@rollup/rollup-darwin-arm64" - ], - "@rollup/rollup-darwin-x64@4.53.3": [ - "npm:@rollup/rollup-darwin-x64" - ], - "@rollup/rollup-freebsd-arm64@4.53.3": [ - "npm:@rollup/rollup-freebsd-arm64" - ], - "@rollup/rollup-freebsd-x64@4.53.3": [ - "npm:@rollup/rollup-freebsd-x64" - ], - "@rollup/rollup-linux-arm-gnueabihf@4.53.3": [ - "npm:@rollup/rollup-linux-arm-gnueabihf" - ], - "@rollup/rollup-linux-arm-musleabihf@4.53.3": [ - "npm:@rollup/rollup-linux-arm-musleabihf" - ], - "@rollup/rollup-linux-arm64-gnu@4.53.3": [ - "npm:@rollup/rollup-linux-arm64-gnu" - ], - "@rollup/rollup-linux-arm64-musl@4.53.3": [ - "npm:@rollup/rollup-linux-arm64-musl" - ], - "@rollup/rollup-linux-loong64-gnu@4.53.3": [ - "npm:@rollup/rollup-linux-loong64-gnu" - ], - "@rollup/rollup-linux-ppc64-gnu@4.53.3": [ - "npm:@rollup/rollup-linux-ppc64-gnu" - ], - "@rollup/rollup-linux-riscv64-gnu@4.53.3": [ - "npm:@rollup/rollup-linux-riscv64-gnu" - ], - "@rollup/rollup-linux-riscv64-musl@4.53.3": [ - "npm:@rollup/rollup-linux-riscv64-musl" - ], - "@rollup/rollup-linux-s390x-gnu@4.53.3": [ - "npm:@rollup/rollup-linux-s390x-gnu" - ], - "@rollup/rollup-linux-x64-gnu@4.53.3": [ - "npm:@rollup/rollup-linux-x64-gnu" - ], - "@rollup/rollup-linux-x64-musl@4.53.3": [ - "npm:@rollup/rollup-linux-x64-musl" - ], - "@rollup/rollup-openharmony-arm64@4.53.3": [ - "npm:@rollup/rollup-openharmony-arm64" - ], - "@rollup/rollup-win32-arm64-msvc@4.53.3": [ - "npm:@rollup/rollup-win32-arm64-msvc" - ], - "@rollup/rollup-win32-ia32-msvc@4.53.3": [ - "npm:@rollup/rollup-win32-ia32-msvc" - ], - "@rollup/rollup-win32-x64-gnu@4.53.3": [ - "npm:@rollup/rollup-win32-x64-gnu" - ], - "@rollup/rollup-win32-x64-msvc@4.53.3": [ - "npm:@rollup/rollup-win32-x64-msvc" - ], - "@rushstack/node-core-library@5.7.0(@types/node@24.10.1)": [ - "npm:@rushstack/node-core-library" - ], - "@rushstack/rig-package@0.5.3": [ - "npm:@rushstack/rig-package" - ], - "@rushstack/terminal@0.14.0(@types/node@24.10.1)": [ - "npm:@rushstack/terminal" - ], - "@rushstack/ts-command-line@4.22.6(@types/node@24.10.1)": [ - "npm:@rushstack/ts-command-line" - ], - "@shikijs/engine-oniguruma@3.15.0": [ - "npm:@shikijs/engine-oniguruma" - ], - "@shikijs/langs@3.15.0": [ - "npm:@shikijs/langs" - ], - "@shikijs/themes@3.15.0": [ - "npm:@shikijs/themes" - ], - "@shikijs/types@3.15.0": [ - "npm:@shikijs/types" - ], - "@shikijs/vscode-textmate@10.0.2": [ - "npm:@shikijs/vscode-textmate" - ], - "@sinclair/typebox@0.34.41": [ - "npm:@sinclair/typebox" - ], - "@sindresorhus/is@7.1.1": [ - "npm:@sindresorhus/is" - ], - "@sindresorhus/merge-streams@4.0.0": [ - "npm:@sindresorhus/merge-streams" - ], - "@size-limit/esbuild@11.2.0(size-limit@11.2.0)": [ - "npm:@size-limit/esbuild" - ], - "@size-limit/file@11.2.0(size-limit@11.2.0)": [ - "npm:@size-limit/file" - ], - "@size-limit/preset-small-lib@11.2.0(size-limit@11.2.0)": [ - "npm:@size-limit/preset-small-lib" - ], - "@solid-primitives/event-listener@2.4.3(solid-js@1.9.10)": [ - "npm:@solid-primitives/event-listener" - ], - "@solid-primitives/keyboard@1.3.3(solid-js@1.9.10)": [ - "npm:@solid-primitives/keyboard" - ], - "@solid-primitives/resize-observer@2.1.3(solid-js@1.9.10)": [ - "npm:@solid-primitives/resize-observer" - ], - "@solid-primitives/rootless@1.5.2(solid-js@1.9.10)": [ - "npm:@solid-primitives/rootless" - ], - "@solid-primitives/static-store@0.1.2(solid-js@1.9.10)": [ - "npm:@solid-primitives/static-store" - ], - "@solid-primitives/utils@6.3.2(solid-js@1.9.10)": [ - "npm:@solid-primitives/utils" - ], - "@speed-highlight/core@1.2.8": [ - "npm:@speed-highlight/core" - ], - "@standard-schema/spec@1.0.0": [ - "npm:@standard-schema/spec" - ], - "@stylistic/eslint-plugin@5.5.0(eslint@9.39.1(jiti@2.6.1))": [ - "npm:@stylistic/eslint-plugin" - ], - "@sveltejs/acorn-typescript@1.0.7(acorn@8.15.0)": [ - "npm:@sveltejs/acorn-typescript" - ], - "@svitejs/changesets-changelog-github-compact@1.2.0": [ - "npm:@svitejs/changesets-changelog-github-compact" - ], - "@tailwindcss/node@4.1.17": [ - "npm:@tailwindcss/node" - ], - "@tailwindcss/oxide-android-arm64@4.1.17": [ - "npm:@tailwindcss/oxide-android-arm64" - ], - "@tailwindcss/oxide-darwin-arm64@4.1.17": [ - "npm:@tailwindcss/oxide-darwin-arm64" - ], - "@tailwindcss/oxide-darwin-x64@4.1.17": [ - "npm:@tailwindcss/oxide-darwin-x64" - ], - "@tailwindcss/oxide-freebsd-x64@4.1.17": [ - "npm:@tailwindcss/oxide-freebsd-x64" - ], - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17": [ - "npm:@tailwindcss/oxide-linux-arm-gnueabihf" - ], - "@tailwindcss/oxide-linux-arm64-gnu@4.1.17": [ - "npm:@tailwindcss/oxide-linux-arm64-gnu" - ], - "@tailwindcss/oxide-linux-arm64-musl@4.1.17": [ - "npm:@tailwindcss/oxide-linux-arm64-musl" - ], - "@tailwindcss/oxide-linux-x64-gnu@4.1.17": [ - "npm:@tailwindcss/oxide-linux-x64-gnu" - ], - "@tailwindcss/oxide-linux-x64-musl@4.1.17": [ - "npm:@tailwindcss/oxide-linux-x64-musl" - ], - "@tailwindcss/oxide-wasm32-wasi@4.1.17": [ - "npm:@tailwindcss/oxide-wasm32-wasi" - ], - "@tailwindcss/oxide-win32-arm64-msvc@4.1.17": [ - "npm:@tailwindcss/oxide-win32-arm64-msvc" - ], - "@tailwindcss/oxide-win32-x64-msvc@4.1.17": [ - "npm:@tailwindcss/oxide-win32-x64-msvc" - ], - "@tailwindcss/oxide@4.1.17": [ - "npm:@tailwindcss/oxide" - ], - "@tailwindcss/vite@4.1.17(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tailwindcss/vite" - ], - "@tanstack/config@0.22.1(@types/node@24.10.1)(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tanstack/config" - ], - "@tanstack/devtools-client@0.0.4": [ - "npm:@tanstack/devtools-client" - ], - "@tanstack/devtools-event-bus@0.3.3": [ - "npm:@tanstack/devtools-event-bus" - ], - "@tanstack/devtools-event-client@0.3.5": [ - "npm:@tanstack/devtools-event-client" - ], - "@tanstack/devtools-ui@0.4.4(csstype@3.2.3)(solid-js@1.9.10)": [ - "npm:@tanstack/devtools-ui" - ], - "@tanstack/devtools-utils@0.0.8(@types/react@19.2.7)(csstype@3.2.3)(react@19.2.0)(solid-js@1.9.10)": [ - "npm:@tanstack/devtools-utils" - ], - "@tanstack/devtools@0.8.2(csstype@3.2.3)(solid-js@1.9.10)": [ - "npm:@tanstack/devtools" - ], - "@tanstack/directive-functions-plugin@1.139.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tanstack/directive-functions-plugin" - ], - "@tanstack/eslint-config@0.3.3(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@tanstack/eslint-config" - ], - "@tanstack/history@1.139.0": [ - "npm:@tanstack/history" - ], - "@tanstack/nitro-v2-vite-plugin@1.139.0(rolldown@1.0.0-beta.51)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tanstack/nitro-v2-vite-plugin" - ], - "@tanstack/publish-config@0.2.2": [ - "npm:@tanstack/publish-config" - ], - "@tanstack/query-core@5.90.5": [ - "npm:@tanstack/query-core" - ], - "@tanstack/react-devtools@0.8.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(csstype@3.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)": [ - "npm:@tanstack/react-devtools" - ], - "@tanstack/react-query@5.90.5(react@19.2.0)": [ - "npm:@tanstack/react-query" - ], - "@tanstack/react-router-devtools@1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.139.7)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)": [ - "npm:@tanstack/react-router-devtools" - ], - "@tanstack/react-router-ssr-query@1.139.7(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.139.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ - "npm:@tanstack/react-router-ssr-query" - ], - "@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ - "npm:@tanstack/react-router" - ], - "@tanstack/react-start-client@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ - "npm:@tanstack/react-start-client" - ], - "@tanstack/react-start-server@1.139.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ - "npm:@tanstack/react-start-server" - ], - "@tanstack/react-start@1.139.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tanstack/react-start" - ], - "@tanstack/react-store@0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ - "npm:@tanstack/react-store" - ], - "@tanstack/router-core@1.139.7": [ - "npm:@tanstack/router-core" - ], - "@tanstack/router-devtools-core@1.139.7(@tanstack/router-core@1.139.7)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)": [ - "npm:@tanstack/router-devtools-core" - ], - "@tanstack/router-generator@1.139.7": [ - "npm:@tanstack/router-generator" - ], - "@tanstack/router-plugin@1.139.7(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tanstack/router-plugin" - ], - "@tanstack/router-ssr-query-core@1.139.7(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.139.7)": [ - "npm:@tanstack/router-ssr-query-core" - ], - "@tanstack/router-utils@1.139.0": [ - "npm:@tanstack/router-utils" - ], - "@tanstack/server-functions-plugin@1.139.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tanstack/server-functions-plugin" - ], - "@tanstack/start-client-core@1.139.7": [ - "npm:@tanstack/start-client-core" - ], - "@tanstack/start-plugin-core@1.139.8(@tanstack/react-router@1.139.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tanstack/start-plugin-core" - ], - "@tanstack/start-server-core@1.139.8": [ - "npm:@tanstack/start-server-core" - ], - "@tanstack/start-storage-context@1.139.7": [ - "npm:@tanstack/start-storage-context" - ], - "@tanstack/store@0.8.0": [ - "npm:@tanstack/store" - ], - "@tanstack/typedoc-config@0.3.1(typescript@5.9.3)": [ - "npm:@tanstack/typedoc-config" - ], - "@tanstack/virtual-file-routes@1.139.0": [ - "npm:@tanstack/virtual-file-routes" - ], - "@tanstack/vite-config@0.4.1(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@tanstack/vite-config" - ], - "@testing-library/dom@10.4.1": [ - "npm:@testing-library/dom" - ], - "@testing-library/jest-dom@6.9.1": [ - "npm:@testing-library/jest-dom" - ], - "@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)": [ - "npm:@testing-library/react" - ], - "@tybys/wasm-util@0.10.1": [ - "npm:@tybys/wasm-util@0.10.1" - ], - "@tybys/wasm-util@0.9.0": [ - "npm:@tybys/wasm-util@0.9.0" - ], - "@types/argparse@1.0.38": [ - "npm:@types/argparse" - ], - "@types/aria-query@5.0.4": [ - "npm:@types/aria-query" - ], - "@types/babel__core@7.20.5": [ - "npm:@types/babel__core" - ], - "@types/babel__generator@7.27.0": [ - "npm:@types/babel__generator" - ], - "@types/babel__template@7.4.4": [ - "npm:@types/babel__template" - ], - "@types/babel__traverse@7.28.0": [ - "npm:@types/babel__traverse" - ], - "@types/chai@5.2.3": [ - "npm:@types/chai" - ], - "@types/conventional-commits-parser@5.0.2": [ - "npm:@types/conventional-commits-parser" - ], - "@types/debug@4.1.12": [ - "npm:@types/debug" - ], - "@types/deep-eql@4.0.2": [ - "npm:@types/deep-eql" - ], - "@types/estree-jsx@1.0.5": [ - "npm:@types/estree-jsx" - ], - "@types/estree@1.0.8": [ - "npm:@types/estree" - ], - "@types/hast@3.0.4": [ - "npm:@types/hast" - ], - "@types/json-schema@7.0.15": [ - "npm:@types/json-schema" - ], - "@types/mdast@4.0.4": [ - "npm:@types/mdast" - ], - "@types/ms@2.1.0": [ - "npm:@types/ms" - ], - "@types/node@12.20.55": [ - "npm:@types/node@12.20.55" - ], - "@types/node@20.19.25": [ - "npm:@types/node@20.19.25" - ], - "@types/node@24.10.1": [ - "npm:@types/node" - ], - "@types/react-dom@19.2.3(@types/react@19.2.7)": [ - "npm:@types/react-dom" - ], - "@types/react@19.2.7": [ - "npm:@types/react" - ], - "@types/resolve@1.20.2": [ - "npm:@types/resolve" - ], - "@types/unist@2.0.11": [ - "npm:@types/unist@2.0.11" - ], - "@types/unist@3.0.3": [ - "npm:@types/unist@3.0.3" - ], - "@types/whatwg-mimetype@3.0.2": [ - "npm:@types/whatwg-mimetype" - ], - "@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@typescript-eslint/eslint-plugin" - ], - "@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@typescript-eslint/parser" - ], - "@typescript-eslint/project-service@8.46.3(typescript@5.9.3)": [ - "npm:@typescript-eslint/project-service@8.46.3" - ], - "@typescript-eslint/project-service@8.48.0(typescript@5.9.3)": [ - "npm:@typescript-eslint/project-service@8.48.0" - ], - "@typescript-eslint/scope-manager@8.46.3": [ - "npm:@typescript-eslint/scope-manager@8.46.3" - ], - "@typescript-eslint/scope-manager@8.48.0": [ - "npm:@typescript-eslint/scope-manager@8.48.0" - ], - "@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)": [ - "npm:@typescript-eslint/tsconfig-utils@8.46.3" - ], - "@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)": [ - "npm:@typescript-eslint/tsconfig-utils@8.48.0" - ], - "@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@typescript-eslint/type-utils@8.46.3" - ], - "@typescript-eslint/type-utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@typescript-eslint/type-utils@8.48.0" - ], - "@typescript-eslint/types@8.46.3": [ - "npm:@typescript-eslint/types@8.46.3" - ], - "@typescript-eslint/types@8.48.0": [ - "npm:@typescript-eslint/types@8.48.0" - ], - "@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)": [ - "npm:@typescript-eslint/typescript-estree@8.46.3" - ], - "@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)": [ - "npm:@typescript-eslint/typescript-estree@8.48.0" - ], - "@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@typescript-eslint/utils@8.46.3" - ], - "@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:@typescript-eslint/utils@8.48.0" - ], - "@typescript-eslint/visitor-keys@8.46.3": [ - "npm:@typescript-eslint/visitor-keys@8.46.3" - ], - "@typescript-eslint/visitor-keys@8.48.0": [ - "npm:@typescript-eslint/visitor-keys@8.48.0" - ], - "@ungap/structured-clone@1.3.0": [ - "npm:@ungap/structured-clone" - ], - "@unrs/resolver-binding-android-arm-eabi@1.11.1": [ - "npm:@unrs/resolver-binding-android-arm-eabi" - ], - "@unrs/resolver-binding-android-arm64@1.11.1": [ - "npm:@unrs/resolver-binding-android-arm64" - ], - "@unrs/resolver-binding-darwin-arm64@1.11.1": [ - "npm:@unrs/resolver-binding-darwin-arm64" - ], - "@unrs/resolver-binding-darwin-x64@1.11.1": [ - "npm:@unrs/resolver-binding-darwin-x64" - ], - "@unrs/resolver-binding-freebsd-x64@1.11.1": [ - "npm:@unrs/resolver-binding-freebsd-x64" - ], - "@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": [ - "npm:@unrs/resolver-binding-linux-arm-gnueabihf" - ], - "@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": [ - "npm:@unrs/resolver-binding-linux-arm-musleabihf" - ], - "@unrs/resolver-binding-linux-arm64-gnu@1.11.1": [ - "npm:@unrs/resolver-binding-linux-arm64-gnu" - ], - "@unrs/resolver-binding-linux-arm64-musl@1.11.1": [ - "npm:@unrs/resolver-binding-linux-arm64-musl" - ], - "@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": [ - "npm:@unrs/resolver-binding-linux-ppc64-gnu" - ], - "@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": [ - "npm:@unrs/resolver-binding-linux-riscv64-gnu" - ], - "@unrs/resolver-binding-linux-riscv64-musl@1.11.1": [ - "npm:@unrs/resolver-binding-linux-riscv64-musl" - ], - "@unrs/resolver-binding-linux-s390x-gnu@1.11.1": [ - "npm:@unrs/resolver-binding-linux-s390x-gnu" - ], - "@unrs/resolver-binding-linux-x64-gnu@1.11.1": [ - "npm:@unrs/resolver-binding-linux-x64-gnu" - ], - "@unrs/resolver-binding-linux-x64-musl@1.11.1": [ - "npm:@unrs/resolver-binding-linux-x64-musl" - ], - "@unrs/resolver-binding-wasm32-wasi@1.11.1": [ - "npm:@unrs/resolver-binding-wasm32-wasi" - ], - "@unrs/resolver-binding-win32-arm64-msvc@1.11.1": [ - "npm:@unrs/resolver-binding-win32-arm64-msvc" - ], - "@unrs/resolver-binding-win32-ia32-msvc@1.11.1": [ - "npm:@unrs/resolver-binding-win32-ia32-msvc" - ], - "@unrs/resolver-binding-win32-x64-msvc@1.11.1": [ - "npm:@unrs/resolver-binding-win32-x64-msvc" - ], - "@vercel/nft@0.30.3(rollup@4.53.3)": [ - "npm:@vercel/nft" - ], - "@vitejs/plugin-react@5.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@vitejs/plugin-react" - ], - "@vitest/expect@4.0.14": [ - "npm:@vitest/expect" - ], - "@vitest/mocker@4.0.14(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:@vitest/mocker" - ], - "@vitest/pretty-format@4.0.14": [ - "npm:@vitest/pretty-format" - ], - "@vitest/runner@4.0.14": [ - "npm:@vitest/runner" - ], - "@vitest/snapshot@4.0.14": [ - "npm:@vitest/snapshot" - ], - "@vitest/spy@4.0.14": [ - "npm:@vitest/spy" - ], - "@vitest/utils@4.0.14": [ - "npm:@vitest/utils" - ], - "@volar/language-core@2.4.23": [ - "npm:@volar/language-core" - ], - "@volar/source-map@2.4.23": [ - "npm:@volar/source-map" - ], - "@volar/typescript@2.4.23": [ - "npm:@volar/typescript" - ], - "@vue/compiler-core@3.5.24": [ - "npm:@vue/compiler-core" - ], - "@vue/compiler-dom@3.5.24": [ - "npm:@vue/compiler-dom" - ], - "@vue/compiler-vue2@2.7.16": [ - "npm:@vue/compiler-vue2" - ], - "@vue/language-core@2.1.6(typescript@5.9.3)": [ - "npm:@vue/language-core" - ], - "@vue/shared@3.5.24": [ - "npm:@vue/shared" - ], - "@yarnpkg/lockfile@1.1.0": [ - "npm:@yarnpkg/lockfile" - ], - "@yarnpkg/parsers@3.0.2": [ - "npm:@yarnpkg/parsers" - ], - "@zkochan/js-yaml@0.0.7": [ - "npm:@zkochan/js-yaml" - ], - "JSONStream@1.3.5": [ - "npm:JSONStream" - ], - "abbrev@3.0.1": [ - "npm:abbrev" - ], - "abort-controller@3.0.0": [ - "npm:abort-controller" - ], - "acorn-import-attributes@1.9.5(acorn@8.15.0)": [ - "npm:acorn-import-attributes" - ], - "acorn-jsx@5.3.2(acorn@8.15.0)": [ - "npm:acorn-jsx" - ], - "acorn@8.15.0": [ - "npm:acorn" - ], - "agent-base@7.1.4": [ - "npm:agent-base" - ], - "ajv-draft-04@1.0.0(ajv@8.13.0)": [ - "npm:ajv-draft-04" - ], - "ajv-formats@3.0.1(ajv@8.13.0)": [ - "npm:ajv-formats" - ], - "ajv@6.12.6": [ - "npm:ajv@6.12.6" - ], - "ajv@8.12.0": [ - "npm:ajv@8.12.0" - ], - "ajv@8.13.0": [ - "npm:ajv@8.13.0" - ], - "ansi-colors@4.1.3": [ - "npm:ansi-colors" - ], - "ansi-regex@5.0.1": [ - "npm:ansi-regex@5.0.1" - ], - "ansi-regex@6.2.2": [ - "npm:ansi-regex@6.2.2" - ], - "ansi-styles@4.3.0": [ - "npm:ansi-styles@4.3.0" - ], - "ansi-styles@5.2.0": [ - "npm:ansi-styles@5.2.0" - ], - "ansi-styles@6.2.3": [ - "npm:ansi-styles@6.2.3" - ], - "ansis@4.2.0": [ - "npm:ansis" - ], - "anymatch@3.1.3": [ - "npm:anymatch" - ], - "archiver-utils@5.0.2": [ - "npm:archiver-utils" - ], - "archiver@7.0.1": [ - "npm:archiver" - ], - "argparse@1.0.10": [ - "npm:argparse@1.0.10" - ], - "argparse@2.0.1": [ - "npm:argparse@2.0.1" - ], - "aria-query@5.3.0": [ - "npm:aria-query@5.3.0" - ], - "aria-query@5.3.2": [ - "npm:aria-query@5.3.2" - ], - "array-ify@1.0.0": [ - "npm:array-ify" - ], - "array-union@2.1.0": [ - "npm:array-union" - ], - "assertion-error@2.0.1": [ - "npm:assertion-error" - ], - "ast-types@0.16.1": [ - "npm:ast-types" - ], - "async-sema@3.1.1": [ - "npm:async-sema" - ], - "async@3.2.6": [ - "npm:async" - ], - "asynckit@0.4.0": [ - "npm:asynckit" - ], - "axios@1.13.2": [ - "npm:axios" - ], - "axobject-query@4.1.0": [ - "npm:axobject-query" - ], - "b4a@1.7.3": [ - "npm:b4a" - ], - "babel-dead-code-elimination@1.0.10": [ - "npm:babel-dead-code-elimination" - ], - "babel-plugin-jsx-dom-expressions@0.40.3(@babel/core@7.28.5)": [ - "npm:babel-plugin-jsx-dom-expressions" - ], - "babel-preset-solid@1.9.10(@babel/core@7.28.5)(solid-js@1.9.10)": [ - "npm:babel-preset-solid" - ], - "bail@2.0.2": [ - "npm:bail" - ], - "balanced-match@1.0.2": [ - "npm:balanced-match" - ], - "bare-events@2.8.1": [ - "npm:bare-events" - ], - "base64-js@1.5.1": [ - "npm:base64-js" - ], - "baseline-browser-mapping@2.8.22": [ - "npm:baseline-browser-mapping" - ], - "better-path-resolve@1.0.0": [ - "npm:better-path-resolve" - ], - "bidi-js@1.0.3": [ - "npm:bidi-js" - ], - "bignumber.js@9.3.1": [ - "npm:bignumber.js" - ], - "binary-extensions@2.3.0": [ - "npm:binary-extensions" - ], - "bindings@1.5.0": [ - "npm:bindings" - ], - "birecord@0.1.1": [ - "npm:birecord" - ], - "bl@4.1.0": [ - "npm:bl" - ], - "boolbase@1.0.0": [ - "npm:boolbase" - ], - "brace-expansion@1.1.12": [ - "npm:brace-expansion@1.1.12" - ], - "brace-expansion@2.0.2": [ - "npm:brace-expansion@2.0.2" - ], - "braces@3.0.3": [ - "npm:braces" - ], - "browserslist@4.27.0": [ - "npm:browserslist" - ], - "buffer-crc32@1.0.0": [ - "npm:buffer-crc32" - ], - "buffer-equal-constant-time@1.0.1": [ - "npm:buffer-equal-constant-time" - ], - "buffer-from@1.1.2": [ - "npm:buffer-from" - ], - "buffer@5.7.1": [ - "npm:buffer@5.7.1" - ], - "buffer@6.0.3": [ - "npm:buffer@6.0.3" - ], - "bytes-iec@3.1.1": [ - "npm:bytes-iec" - ], - "c12@3.3.1(magicast@0.5.1)": [ - "npm:c12" - ], - "call-bind-apply-helpers@1.0.2": [ - "npm:call-bind-apply-helpers" - ], - "callsites@3.1.0": [ - "npm:callsites" - ], - "caniuse-lite@1.0.30001752": [ - "npm:caniuse-lite" - ], - "ccount@2.0.1": [ - "npm:ccount" - ], - "chai@6.2.1": [ - "npm:chai" - ], - "chalk@4.1.2": [ - "npm:chalk@4.1.2" - ], - "chalk@5.6.2": [ - "npm:chalk@5.6.2" - ], - "character-entities-html4@2.1.0": [ - "npm:character-entities-html4" - ], - "character-entities-legacy@3.0.0": [ - "npm:character-entities-legacy" - ], - "character-entities@2.0.2": [ - "npm:character-entities" - ], - "character-reference-invalid@2.0.1": [ - "npm:character-reference-invalid" - ], - "chardet@2.1.1": [ - "npm:chardet" - ], - "cheerio-select@2.1.0": [ - "npm:cheerio-select" - ], - "cheerio@1.1.2": [ - "npm:cheerio" - ], - "chokidar@3.6.0": [ - "npm:chokidar@3.6.0" - ], - "chokidar@4.0.3": [ - "npm:chokidar@4.0.3" - ], - "chownr@3.0.0": [ - "npm:chownr" - ], - "ci-info@3.9.0": [ - "npm:ci-info" - ], - "citty@0.1.6": [ - "npm:citty" - ], - "cli-cursor@3.1.0": [ - "npm:cli-cursor" - ], - "cli-spinners@2.6.1": [ - "npm:cli-spinners" - ], - "clipboardy@4.0.0": [ - "npm:clipboardy" - ], - "cliui@8.0.1": [ - "npm:cliui" - ], - "clone@1.0.4": [ - "npm:clone" - ], - "clsx@2.1.1": [ - "npm:clsx" - ], - "cluster-key-slot@1.1.2": [ - "npm:cluster-key-slot" - ], - "color-convert@2.0.1": [ - "npm:color-convert" - ], - "color-name@1.1.4": [ - "npm:color-name" - ], - "combined-stream@1.0.8": [ - "npm:combined-stream" - ], - "comma-separated-tokens@2.0.3": [ - "npm:comma-separated-tokens" - ], - "commander@2.20.3": [ - "npm:commander" - ], - "comment-parser@1.4.1": [ - "npm:comment-parser" - ], - "commondir@1.0.1": [ - "npm:commondir" - ], - "compare-func@2.0.0": [ - "npm:compare-func" - ], - "compare-versions@6.1.1": [ - "npm:compare-versions" - ], - "compatx@0.2.0": [ - "npm:compatx" - ], - "compress-commons@6.0.2": [ - "npm:compress-commons" - ], - "computeds@0.0.1": [ - "npm:computeds" - ], - "concat-map@0.0.1": [ - "npm:concat-map" - ], - "confbox@0.1.8": [ - "npm:confbox@0.1.8" - ], - "confbox@0.2.2": [ - "npm:confbox@0.2.2" - ], - "consola@3.4.2": [ - "npm:consola" - ], - "conventional-changelog-angular@7.0.0": [ - "npm:conventional-changelog-angular" - ], - "conventional-commits-parser@5.0.0": [ - "npm:conventional-commits-parser" - ], - "convert-source-map@2.0.0": [ - "npm:convert-source-map" - ], - "cookie-es@1.2.2": [ - "npm:cookie-es@1.2.2" - ], - "cookie-es@2.0.0": [ - "npm:cookie-es@2.0.0" - ], - "cookie@1.0.2": [ - "npm:cookie" - ], - "core-util-is@1.0.3": [ - "npm:core-util-is" - ], - "crc-32@1.2.2": [ - "npm:crc-32" - ], - "crc32-stream@6.0.0": [ - "npm:crc32-stream" - ], - "croner@9.1.0": [ - "npm:croner" - ], - "cross-spawn@7.0.6": [ - "npm:cross-spawn" - ], - "crossws@0.3.5": [ - "npm:crossws" - ], - "css-select@5.2.2": [ - "npm:css-select" - ], - "css-tree@3.1.0": [ - "npm:css-tree" - ], - "css-what@6.2.2": [ - "npm:css-what" - ], - "css.escape@1.5.1": [ - "npm:css.escape" - ], - "cssstyle@5.3.3(postcss@8.5.6)": [ - "npm:cssstyle" - ], - "csstype@3.1.3": [ - "npm:csstype@3.1.3" - ], - "csstype@3.2.3": [ - "npm:csstype@3.2.3" - ], - "data-uri-to-buffer@4.0.1": [ - "npm:data-uri-to-buffer" - ], - "data-urls@6.0.0": [ - "npm:data-urls" - ], - "dataloader@1.4.0": [ - "npm:dataloader" - ], - "db0@0.3.4": [ - "npm:db0" - ], - "de-indent@1.0.2": [ - "npm:de-indent" - ], - "debug@4.4.3": [ - "npm:debug" - ], - "decimal.js@10.6.0": [ - "npm:decimal.js" - ], - "decode-named-character-reference@1.2.0": [ - "npm:decode-named-character-reference" - ], - "deep-is@0.1.4": [ - "npm:deep-is" - ], - "deepmerge@4.3.1": [ - "npm:deepmerge" - ], - "defaults@1.0.4": [ - "npm:defaults" - ], - "define-lazy-prop@2.0.0": [ - "npm:define-lazy-prop" - ], - "defu@6.1.4": [ - "npm:defu" - ], - "delayed-stream@1.0.0": [ - "npm:delayed-stream" - ], - "denque@2.1.0": [ - "npm:denque" - ], - "depd@2.0.0": [ - "npm:depd" - ], - "dequal@2.0.3": [ - "npm:dequal" - ], - "destr@2.0.5": [ - "npm:destr" - ], - "detect-indent@6.1.0": [ - "npm:detect-indent" - ], - "detect-libc@1.0.3": [ - "npm:detect-libc@1.0.3" - ], - "detect-libc@2.1.2": [ - "npm:detect-libc@2.1.2" - ], - "devalue@5.5.0": [ - "npm:devalue" - ], - "devlop@1.1.0": [ - "npm:devlop" - ], - "diff@8.0.2": [ - "npm:diff" - ], - "dir-glob@3.0.1": [ - "npm:dir-glob" - ], - "dom-accessibility-api@0.5.16": [ - "npm:dom-accessibility-api@0.5.16" - ], - "dom-accessibility-api@0.6.3": [ - "npm:dom-accessibility-api@0.6.3" - ], - "dom-serializer@2.0.0": [ - "npm:dom-serializer" - ], - "domelementtype@2.3.0": [ - "npm:domelementtype" - ], - "domhandler@5.0.3": [ - "npm:domhandler" - ], - "domutils@3.2.2": [ - "npm:domutils" - ], - "dot-prop@10.1.0": [ - "npm:dot-prop@10.1.0" - ], - "dot-prop@5.3.0": [ - "npm:dot-prop@5.3.0" - ], - "dotenv-expand@11.0.7": [ - "npm:dotenv-expand" - ], - "dotenv@16.4.7": [ - "npm:dotenv@16.4.7" - ], - "dotenv@16.6.1": [ - "npm:dotenv@16.6.1" - ], - "dotenv@17.2.3": [ - "npm:dotenv@17.2.3" - ], - "dunder-proto@1.0.1": [ - "npm:dunder-proto" - ], - "duplexer@0.1.2": [ - "npm:duplexer" - ], - "eastasianwidth@0.2.0": [ - "npm:eastasianwidth" - ], - "ecdsa-sig-formatter@1.0.11": [ - "npm:ecdsa-sig-formatter" - ], - "ee-first@1.1.1": [ - "npm:ee-first" - ], - "electron-to-chromium@1.5.244": [ - "npm:electron-to-chromium" - ], - "emoji-regex@8.0.0": [ - "npm:emoji-regex@8.0.0" - ], - "emoji-regex@9.2.2": [ - "npm:emoji-regex@9.2.2" - ], - "encodeurl@2.0.0": [ - "npm:encodeurl" - ], - "encoding-sniffer@0.2.1": [ - "npm:encoding-sniffer" - ], - "end-of-stream@1.4.5": [ - "npm:end-of-stream" - ], - "enhanced-resolve@5.18.3": [ - "npm:enhanced-resolve" - ], - "enquirer@2.3.6": [ - "npm:enquirer@2.3.6" - ], - "enquirer@2.4.1": [ - "npm:enquirer@2.4.1" - ], - "entities@4.5.0": [ - "npm:entities@4.5.0" - ], - "entities@6.0.1": [ - "npm:entities@6.0.1" - ], - "error-stack-parser-es@1.0.5": [ - "npm:error-stack-parser-es" - ], - "es-define-property@1.0.1": [ - "npm:es-define-property" - ], - "es-errors@1.3.0": [ - "npm:es-errors" - ], - "es-module-lexer@1.7.0": [ - "npm:es-module-lexer" - ], - "es-object-atoms@1.1.1": [ - "npm:es-object-atoms" - ], - "es-set-tostringtag@2.1.0": [ - "npm:es-set-tostringtag" - ], - "esbuild@0.25.12": [ - "npm:esbuild" - ], - "escalade@3.2.0": [ - "npm:escalade" - ], - "escape-html@1.0.3": [ - "npm:escape-html" - ], - "escape-string-regexp@1.0.5": [ - "npm:escape-string-regexp@1.0.5" - ], - "escape-string-regexp@4.0.0": [ - "npm:escape-string-regexp@4.0.0" - ], - "escape-string-regexp@5.0.0": [ - "npm:escape-string-regexp@5.0.0" - ], - "eslint-compat-utils@0.5.1(eslint@9.39.1(jiti@2.6.1))": [ - "npm:eslint-compat-utils" - ], - "eslint-import-context@0.1.9(unrs-resolver@1.11.1)": [ - "npm:eslint-import-context" - ], - "eslint-plugin-es-x@7.8.0(eslint@9.39.1(jiti@2.6.1))": [ - "npm:eslint-plugin-es-x" - ], - "eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))": [ - "npm:eslint-plugin-import-x" - ], - "eslint-plugin-n@17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:eslint-plugin-n" - ], - "eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.39.1(jiti@2.6.1))": [ - "npm:eslint-plugin-react-compiler" - ], - "eslint-plugin-react-dom@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:eslint-plugin-react-dom" - ], - "eslint-plugin-react-hooks-extra@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:eslint-plugin-react-hooks-extra" - ], - "eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1))": [ - "npm:eslint-plugin-react-hooks" - ], - "eslint-plugin-react-naming-convention@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:eslint-plugin-react-naming-convention" - ], - "eslint-plugin-react-web-api@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:eslint-plugin-react-web-api" - ], - "eslint-plugin-react-x@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:eslint-plugin-react-x" - ], - "eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))": [ - "npm:eslint-plugin-unused-imports" - ], - "eslint-scope@8.4.0": [ - "npm:eslint-scope" - ], - "eslint-visitor-keys@3.4.3": [ - "npm:eslint-visitor-keys@3.4.3" - ], - "eslint-visitor-keys@4.2.1": [ - "npm:eslint-visitor-keys@4.2.1" - ], - "eslint@9.39.1(jiti@2.6.1)": [ - "npm:eslint" - ], - "esm-env@1.2.2": [ - "npm:esm-env" - ], - "espree@10.4.0": [ - "npm:espree" - ], - "esprima@4.0.1": [ - "npm:esprima" - ], - "esquery@1.6.0": [ - "npm:esquery" - ], - "esrap@2.2.0": [ - "npm:esrap" - ], - "esrecurse@4.3.0": [ - "npm:esrecurse" - ], - "estraverse@5.3.0": [ - "npm:estraverse" - ], - "estree-util-is-identifier-name@3.0.0": [ - "npm:estree-util-is-identifier-name" - ], - "estree-walker@2.0.2": [ - "npm:estree-walker@2.0.2" - ], - "estree-walker@3.0.3": [ - "npm:estree-walker@3.0.3" - ], - "esutils@2.0.3": [ - "npm:esutils" - ], - "etag@1.8.1": [ - "npm:etag" - ], - "event-target-shim@5.0.1": [ - "npm:event-target-shim" - ], - "events-universal@1.0.1": [ - "npm:events-universal" - ], - "events@3.3.0": [ - "npm:events" - ], - "eventsource-parser@3.0.6": [ - "npm:eventsource-parser" - ], - "execa@8.0.1": [ - "npm:execa" - ], - "expect-type@1.2.2": [ - "npm:expect-type" - ], - "exsolve@1.0.7": [ - "npm:exsolve" - ], - "extend@3.0.2": [ - "npm:extend" - ], - "extendable-error@0.1.7": [ - "npm:extendable-error" - ], - "fast-deep-equal@3.1.3": [ - "npm:fast-deep-equal" - ], - "fast-fifo@1.3.2": [ - "npm:fast-fifo" - ], - "fast-glob@3.3.3": [ - "npm:fast-glob" - ], - "fast-json-stable-stringify@2.1.0": [ - "npm:fast-json-stable-stringify" - ], - "fast-levenshtein@2.0.6": [ - "npm:fast-levenshtein" - ], - "fastq@1.19.1": [ - "npm:fastq" - ], - "fd-package-json@2.0.0": [ - "npm:fd-package-json" - ], - "fdir@6.5.0(picomatch@4.0.3)": [ - "npm:fdir" - ], - "fetch-blob@3.2.0": [ - "npm:fetch-blob" - ], - "fetchdts@0.1.7": [ - "npm:fetchdts" - ], - "figures@3.2.0": [ - "npm:figures" - ], - "file-entry-cache@8.0.0": [ - "npm:file-entry-cache" - ], - "file-uri-to-path@1.0.0": [ - "npm:file-uri-to-path" - ], - "fill-range@7.1.1": [ - "npm:fill-range" - ], - "find-up@4.1.0": [ - "npm:find-up@4.1.0" - ], - "find-up@5.0.0": [ - "npm:find-up@5.0.0" - ], - "flat-cache@4.0.1": [ - "npm:flat-cache" - ], - "flat@5.0.2": [ - "npm:flat" - ], - "flatted@3.3.3": [ - "npm:flatted" - ], - "follow-redirects@1.15.11": [ - "npm:follow-redirects" - ], - "foreground-child@3.3.1": [ - "npm:foreground-child" - ], - "form-data@4.0.4": [ - "npm:form-data" - ], - "formatly@0.3.0": [ - "npm:formatly" - ], - "formdata-polyfill@4.0.10": [ - "npm:formdata-polyfill" - ], - "fresh@2.0.0": [ - "npm:fresh" - ], - "front-matter@4.0.2": [ - "npm:front-matter" - ], - "fs-constants@1.0.0": [ - "npm:fs-constants" - ], - "fs-extra@7.0.1": [ - "npm:fs-extra@7.0.1" - ], - "fs-extra@8.1.0": [ - "npm:fs-extra@8.1.0" - ], - "fsevents@2.3.3": [ - "npm:fsevents" - ], - "function-bind@1.1.2": [ - "npm:function-bind" - ], - "gaxios@7.1.3": [ - "npm:gaxios" - ], - "gcp-metadata@8.1.2": [ - "npm:gcp-metadata" - ], - "gensync@1.0.0-beta.2": [ - "npm:gensync" - ], - "get-caller-file@2.0.5": [ - "npm:get-caller-file" - ], - "get-intrinsic@1.3.0": [ - "npm:get-intrinsic" - ], - "get-port-please@3.2.0": [ - "npm:get-port-please" - ], - "get-proto@1.0.1": [ - "npm:get-proto" - ], - "get-stream@8.0.1": [ - "npm:get-stream" - ], - "get-tsconfig@4.13.0": [ - "npm:get-tsconfig" - ], - "giget@2.0.0": [ - "npm:giget" - ], - "glob-parent@5.1.2": [ - "npm:glob-parent@5.1.2" - ], - "glob-parent@6.0.2": [ - "npm:glob-parent@6.0.2" - ], - "glob@10.4.5": [ - "npm:glob" - ], - "globals@14.0.0": [ - "npm:globals@14.0.0" - ], - "globals@15.15.0": [ - "npm:globals@15.15.0" - ], - "globals@16.5.0": [ - "npm:globals@16.5.0" - ], - "globby@11.1.0": [ - "npm:globby@11.1.0" - ], - "globby@15.0.0": [ - "npm:globby@15.0.0" - ], - "globrex@0.1.2": [ - "npm:globrex" - ], - "goober@2.1.18(csstype@3.2.3)": [ - "npm:goober" - ], - "google-auth-library@10.5.0": [ - "npm:google-auth-library" - ], - "google-logging-utils@1.1.3": [ - "npm:google-logging-utils" - ], - "gopd@1.2.0": [ - "npm:gopd" - ], - "graceful-fs@4.2.11": [ - "npm:graceful-fs" - ], - "graphemer@1.4.0": [ - "npm:graphemer" - ], - "gtoken@8.0.0": [ - "npm:gtoken" - ], - "gzip-size@7.0.0": [ - "npm:gzip-size" - ], - "h3@1.15.4": [ - "npm:h3@1.15.4" - ], - "h3@2.0.0-beta.5": [ - "npm:h3@2.0.0-beta.5", - "npm:h3-v2" - ], - "happy-dom@20.0.10": [ - "npm:happy-dom" - ], - "has-flag@4.0.0": [ - "npm:has-flag" - ], - "has-symbols@1.1.0": [ - "npm:has-symbols" - ], - "has-tostringtag@1.0.2": [ - "npm:has-tostringtag" - ], - "hasown@2.0.2": [ - "npm:hasown" - ], - "hast-util-from-parse5@8.0.3": [ - "npm:hast-util-from-parse5" - ], - "hast-util-is-element@3.0.0": [ - "npm:hast-util-is-element" - ], - "hast-util-parse-selector@4.0.0": [ - "npm:hast-util-parse-selector" - ], - "hast-util-raw@9.1.0": [ - "npm:hast-util-raw" - ], - "hast-util-sanitize@5.0.2": [ - "npm:hast-util-sanitize" - ], - "hast-util-to-jsx-runtime@2.3.6": [ - "npm:hast-util-to-jsx-runtime" - ], - "hast-util-to-parse5@8.0.0": [ - "npm:hast-util-to-parse5" - ], - "hast-util-to-text@4.0.2": [ - "npm:hast-util-to-text" - ], - "hast-util-whitespace@3.0.0": [ - "npm:hast-util-whitespace" - ], - "hastscript@9.0.1": [ - "npm:hastscript" - ], - "he@1.2.0": [ - "npm:he" - ], - "hermes-estree@0.25.1": [ - "npm:hermes-estree" - ], - "hermes-parser@0.25.1": [ - "npm:hermes-parser" - ], - "highlight.js@11.11.1": [ - "npm:highlight.js" - ], - "hookable@5.5.3": [ - "npm:hookable" - ], - "html-encoding-sniffer@4.0.0": [ - "npm:html-encoding-sniffer" - ], - "html-entities@2.3.3": [ - "npm:html-entities" - ], - "html-link-extractor@1.0.5": [ - "npm:html-link-extractor" - ], - "html-url-attributes@3.0.1": [ - "npm:html-url-attributes" - ], - "html-void-elements@3.0.0": [ - "npm:html-void-elements" - ], - "htmlparser2@10.0.0": [ - "npm:htmlparser2" - ], - "http-errors@2.0.0": [ - "npm:http-errors" - ], - "http-proxy-agent@7.0.2": [ - "npm:http-proxy-agent" - ], - "http-shutdown@1.2.2": [ - "npm:http-shutdown" - ], - "https-proxy-agent@7.0.6": [ - "npm:https-proxy-agent" - ], - "httpxy@0.1.7": [ - "npm:httpxy" - ], - "human-id@4.1.2": [ - "npm:human-id" - ], - "human-signals@5.0.0": [ - "npm:human-signals" - ], - "iconv-lite@0.6.3": [ - "npm:iconv-lite@0.6.3" - ], - "iconv-lite@0.7.0": [ - "npm:iconv-lite@0.7.0" - ], - "ieee754@1.2.1": [ - "npm:ieee754" - ], - "ignore@5.3.2": [ - "npm:ignore@5.3.2" - ], - "ignore@7.0.5": [ - "npm:ignore@7.0.5" - ], - "import-fresh@3.3.1": [ - "npm:import-fresh" - ], - "import-lazy@4.0.0": [ - "npm:import-lazy" - ], - "imurmurhash@0.1.4": [ - "npm:imurmurhash" - ], - "indent-string@4.0.0": [ - "npm:indent-string" - ], - "inherits@2.0.4": [ - "npm:inherits" - ], - "inline-style-parser@0.2.4": [ - "npm:inline-style-parser" - ], - "ioredis@5.8.2": [ - "npm:ioredis" - ], - "iron-webcrypto@1.2.1": [ - "npm:iron-webcrypto" - ], - "is-alphabetical@2.0.1": [ - "npm:is-alphabetical" - ], - "is-alphanumerical@2.0.1": [ - "npm:is-alphanumerical" - ], - "is-binary-path@2.1.0": [ - "npm:is-binary-path" - ], - "is-core-module@2.16.1": [ - "npm:is-core-module" - ], - "is-decimal@2.0.1": [ - "npm:is-decimal" - ], - "is-docker@2.2.1": [ - "npm:is-docker@2.2.1" - ], - "is-docker@3.0.0": [ - "npm:is-docker@3.0.0" - ], - "is-extglob@2.1.1": [ - "npm:is-extglob" - ], - "is-fullwidth-code-point@3.0.0": [ - "npm:is-fullwidth-code-point" - ], - "is-glob@4.0.3": [ - "npm:is-glob" - ], - "is-hexadecimal@2.0.1": [ - "npm:is-hexadecimal" - ], - "is-immutable-type@5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:is-immutable-type" - ], - "is-inside-container@1.0.0": [ - "npm:is-inside-container" - ], - "is-interactive@1.0.0": [ - "npm:is-interactive" - ], - "is-module@1.0.0": [ - "npm:is-module" - ], - "is-number@7.0.0": [ - "npm:is-number" - ], - "is-obj@2.0.0": [ - "npm:is-obj" - ], - "is-plain-obj@4.1.0": [ - "npm:is-plain-obj" - ], - "is-potential-custom-element-name@1.0.1": [ - "npm:is-potential-custom-element-name" - ], - "is-reference@1.2.1": [ - "npm:is-reference@1.2.1" - ], - "is-reference@3.0.3": [ - "npm:is-reference@3.0.3" - ], - "is-stream@2.0.1": [ - "npm:is-stream@2.0.1" - ], - "is-stream@3.0.0": [ - "npm:is-stream@3.0.0" - ], - "is-subdir@1.2.0": [ - "npm:is-subdir" - ], - "is-text-path@2.0.0": [ - "npm:is-text-path" - ], - "is-unicode-supported@0.1.0": [ - "npm:is-unicode-supported" - ], - "is-what@4.1.16": [ - "npm:is-what" - ], - "is-windows@1.0.2": [ - "npm:is-windows" - ], - "is-wsl@2.2.0": [ - "npm:is-wsl@2.2.0" - ], - "is-wsl@3.1.0": [ - "npm:is-wsl@3.1.0" - ], - "is64bit@2.0.0": [ - "npm:is64bit" - ], - "isarray@1.0.0": [ - "npm:isarray" - ], - "isbot@5.1.31": [ - "npm:isbot" - ], - "isexe@2.0.0": [ - "npm:isexe" - ], - "jackspeak@3.4.3": [ - "npm:jackspeak" - ], - "jest-diff@30.2.0": [ - "npm:jest-diff" - ], - "jiti@2.6.1": [ - "npm:jiti" - ], - "jju@1.4.0": [ - "npm:jju" - ], - "js-tokens@4.0.0": [ - "npm:js-tokens@4.0.0" - ], - "js-tokens@9.0.1": [ - "npm:js-tokens@9.0.1" - ], - "js-yaml@3.14.1": [ - "npm:js-yaml@3.14.1" - ], - "js-yaml@4.1.1": [ - "npm:js-yaml@4.1.1" - ], - "jsdom@27.2.0(postcss@8.5.6)": [ - "npm:jsdom" - ], - "jsesc@3.1.0": [ - "npm:jsesc" - ], - "json-bigint@1.0.0": [ - "npm:json-bigint" - ], - "json-buffer@3.0.1": [ - "npm:json-buffer" - ], - "json-schema-to-ts@3.1.1": [ - "npm:json-schema-to-ts" - ], - "json-schema-traverse@0.4.1": [ - "npm:json-schema-traverse@0.4.1" - ], - "json-schema-traverse@1.0.0": [ - "npm:json-schema-traverse@1.0.0" - ], - "json-schema@0.4.0": [ - "npm:json-schema" - ], - "json-stable-stringify-without-jsonify@1.0.1": [ - "npm:json-stable-stringify-without-jsonify" - ], - "json5@2.2.3": [ - "npm:json5" - ], - "jsonc-parser@3.2.0": [ - "npm:jsonc-parser" - ], - "jsonfile@4.0.0": [ - "npm:jsonfile@4.0.0" - ], - "jsonfile@6.2.0": [ - "npm:jsonfile@6.2.0" - ], - "jsonparse@1.3.1": [ - "npm:jsonparse" - ], - "jwa@2.0.1": [ - "npm:jwa" - ], - "jws@4.0.0": [ - "npm:jws" - ], - "keyv@4.5.4": [ - "npm:keyv" - ], - "kleur@4.1.5": [ - "npm:kleur" - ], - "klona@2.0.6": [ - "npm:klona" - ], - "knip@5.70.2(@types/node@24.10.1)(typescript@5.9.3)": [ - "npm:knip" - ], - "knitwork@1.2.0": [ - "npm:knitwork" - ], - "kolorist@1.8.0": [ - "npm:kolorist" - ], - "lazystream@1.0.1": [ - "npm:lazystream" - ], - "levn@0.4.1": [ - "npm:levn" - ], - "lightningcss-android-arm64@1.30.2": [ - "npm:lightningcss-android-arm64" - ], - "lightningcss-darwin-arm64@1.30.2": [ - "npm:lightningcss-darwin-arm64" - ], - "lightningcss-darwin-x64@1.30.2": [ - "npm:lightningcss-darwin-x64" - ], - "lightningcss-freebsd-x64@1.30.2": [ - "npm:lightningcss-freebsd-x64" - ], - "lightningcss-linux-arm-gnueabihf@1.30.2": [ - "npm:lightningcss-linux-arm-gnueabihf" - ], - "lightningcss-linux-arm64-gnu@1.30.2": [ - "npm:lightningcss-linux-arm64-gnu" - ], - "lightningcss-linux-arm64-musl@1.30.2": [ - "npm:lightningcss-linux-arm64-musl" - ], - "lightningcss-linux-x64-gnu@1.30.2": [ - "npm:lightningcss-linux-x64-gnu" - ], - "lightningcss-linux-x64-musl@1.30.2": [ - "npm:lightningcss-linux-x64-musl" - ], - "lightningcss-win32-arm64-msvc@1.30.2": [ - "npm:lightningcss-win32-arm64-msvc" - ], - "lightningcss-win32-x64-msvc@1.30.2": [ - "npm:lightningcss-win32-x64-msvc" - ], - "lightningcss@1.30.2": [ - "npm:lightningcss" - ], - "lilconfig@3.1.3": [ - "npm:lilconfig" - ], - "lines-and-columns@2.0.3": [ - "npm:lines-and-columns" - ], - "linkify-it@5.0.0": [ - "npm:linkify-it" - ], - "listhen@1.9.0": [ - "npm:listhen" - ], - "local-pkg@0.5.1": [ - "npm:local-pkg@0.5.1" - ], - "local-pkg@1.1.2": [ - "npm:local-pkg@1.1.2" - ], - "locate-character@3.0.0": [ - "npm:locate-character" - ], - "locate-path@5.0.0": [ - "npm:locate-path@5.0.0" - ], - "locate-path@6.0.0": [ - "npm:locate-path@6.0.0" - ], - "lodash.defaults@4.2.0": [ - "npm:lodash.defaults" - ], - "lodash.isarguments@3.1.0": [ - "npm:lodash.isarguments" - ], - "lodash.merge@4.6.2": [ - "npm:lodash.merge" - ], - "lodash.startcase@4.4.0": [ - "npm:lodash.startcase" - ], - "lodash@4.17.21": [ - "npm:lodash" - ], - "log-symbols@4.1.0": [ - "npm:log-symbols" - ], - "longest-streak@3.1.0": [ - "npm:longest-streak" - ], - "lowlight@3.3.0": [ - "npm:lowlight" - ], - "lru-cache@10.4.3": [ - "npm:lru-cache@10.4.3" - ], - "lru-cache@11.2.2": [ - "npm:lru-cache@11.2.2" - ], - "lru-cache@5.1.1": [ - "npm:lru-cache@5.1.1" - ], - "lru-cache@6.0.0": [ - "npm:lru-cache@6.0.0" - ], - "lucide-react@0.555.0(react@19.2.0)": [ - "npm:lucide-react" - ], - "lunr@2.3.9": [ - "npm:lunr" - ], - "lz-string@1.5.0": [ - "npm:lz-string" - ], - "magic-string@0.30.21": [ - "npm:magic-string" - ], - "magicast@0.5.1": [ - "npm:magicast" - ], - "markdown-it@14.1.0": [ - "npm:markdown-it" - ], - "markdown-link-extractor@4.0.3": [ - "npm:markdown-link-extractor" - ], - "markdown-table@3.0.4": [ - "npm:markdown-table" - ], - "marked@17.0.1": [ - "npm:marked" - ], - "math-intrinsics@1.1.0": [ - "npm:math-intrinsics" - ], - "mdast-util-find-and-replace@3.0.2": [ - "npm:mdast-util-find-and-replace" - ], - "mdast-util-from-markdown@2.0.2": [ - "npm:mdast-util-from-markdown" - ], - "mdast-util-gfm-autolink-literal@2.0.1": [ - "npm:mdast-util-gfm-autolink-literal" - ], - "mdast-util-gfm-footnote@2.1.0": [ - "npm:mdast-util-gfm-footnote" - ], - "mdast-util-gfm-strikethrough@2.0.0": [ - "npm:mdast-util-gfm-strikethrough" - ], - "mdast-util-gfm-table@2.0.0": [ - "npm:mdast-util-gfm-table" - ], - "mdast-util-gfm-task-list-item@2.0.0": [ - "npm:mdast-util-gfm-task-list-item" - ], - "mdast-util-gfm@3.1.0": [ - "npm:mdast-util-gfm" - ], - "mdast-util-mdx-expression@2.0.1": [ - "npm:mdast-util-mdx-expression" - ], - "mdast-util-mdx-jsx@3.2.0": [ - "npm:mdast-util-mdx-jsx" - ], - "mdast-util-mdxjs-esm@2.0.1": [ - "npm:mdast-util-mdxjs-esm" - ], - "mdast-util-phrasing@4.1.0": [ - "npm:mdast-util-phrasing" - ], - "mdast-util-to-hast@13.2.0": [ - "npm:mdast-util-to-hast" - ], - "mdast-util-to-markdown@2.1.2": [ - "npm:mdast-util-to-markdown" - ], - "mdast-util-to-string@4.0.0": [ - "npm:mdast-util-to-string" - ], - "mdn-data@2.12.2": [ - "npm:mdn-data" - ], - "mdurl@2.0.0": [ - "npm:mdurl" - ], - "meow@12.1.1": [ - "npm:meow" - ], - "merge-anything@5.1.7": [ - "npm:merge-anything" - ], - "merge-stream@2.0.0": [ - "npm:merge-stream" - ], - "merge2@1.4.1": [ - "npm:merge2" - ], - "micromark-core-commonmark@2.0.3": [ - "npm:micromark-core-commonmark" - ], - "micromark-extension-gfm-autolink-literal@2.1.0": [ - "npm:micromark-extension-gfm-autolink-literal" - ], - "micromark-extension-gfm-footnote@2.1.0": [ - "npm:micromark-extension-gfm-footnote" - ], - "micromark-extension-gfm-strikethrough@2.1.0": [ - "npm:micromark-extension-gfm-strikethrough" - ], - "micromark-extension-gfm-table@2.1.1": [ - "npm:micromark-extension-gfm-table" - ], - "micromark-extension-gfm-tagfilter@2.0.0": [ - "npm:micromark-extension-gfm-tagfilter" - ], - "micromark-extension-gfm-task-list-item@2.1.0": [ - "npm:micromark-extension-gfm-task-list-item" - ], - "micromark-extension-gfm@3.0.0": [ - "npm:micromark-extension-gfm" - ], - "micromark-factory-destination@2.0.1": [ - "npm:micromark-factory-destination" - ], - "micromark-factory-label@2.0.1": [ - "npm:micromark-factory-label" - ], - "micromark-factory-space@2.0.1": [ - "npm:micromark-factory-space" - ], - "micromark-factory-title@2.0.1": [ - "npm:micromark-factory-title" - ], - "micromark-factory-whitespace@2.0.1": [ - "npm:micromark-factory-whitespace" - ], - "micromark-util-character@2.1.1": [ - "npm:micromark-util-character" - ], - "micromark-util-chunked@2.0.1": [ - "npm:micromark-util-chunked" - ], - "micromark-util-classify-character@2.0.1": [ - "npm:micromark-util-classify-character" - ], - "micromark-util-combine-extensions@2.0.1": [ - "npm:micromark-util-combine-extensions" - ], - "micromark-util-decode-numeric-character-reference@2.0.2": [ - "npm:micromark-util-decode-numeric-character-reference" - ], - "micromark-util-decode-string@2.0.1": [ - "npm:micromark-util-decode-string" - ], - "micromark-util-encode@2.0.1": [ - "npm:micromark-util-encode" - ], - "micromark-util-html-tag-name@2.0.1": [ - "npm:micromark-util-html-tag-name" - ], - "micromark-util-normalize-identifier@2.0.1": [ - "npm:micromark-util-normalize-identifier" - ], - "micromark-util-resolve-all@2.0.1": [ - "npm:micromark-util-resolve-all" - ], - "micromark-util-sanitize-uri@2.0.1": [ - "npm:micromark-util-sanitize-uri" - ], - "micromark-util-subtokenize@2.1.0": [ - "npm:micromark-util-subtokenize" - ], - "micromark-util-symbol@2.0.1": [ - "npm:micromark-util-symbol" - ], - "micromark-util-types@2.0.2": [ - "npm:micromark-util-types" - ], - "micromark@4.0.2": [ - "npm:micromark" - ], - "micromatch@4.0.8": [ - "npm:micromatch" - ], - "mime-db@1.52.0": [ - "npm:mime-db@1.52.0" - ], - "mime-db@1.54.0": [ - "npm:mime-db@1.54.0" - ], - "mime-types@2.1.35": [ - "npm:mime-types@2.1.35" - ], - "mime-types@3.0.1": [ - "npm:mime-types@3.0.1" - ], - "mime@3.0.0": [ - "npm:mime@3.0.0" - ], - "mime@4.1.0": [ - "npm:mime@4.1.0" - ], - "mimic-fn@2.1.0": [ - "npm:mimic-fn@2.1.0" - ], - "mimic-fn@4.0.0": [ - "npm:mimic-fn@4.0.0" - ], - "min-indent@1.0.1": [ - "npm:min-indent" - ], - "minimatch@3.0.8": [ - "npm:minimatch@3.0.8" - ], - "minimatch@3.1.2": [ - "npm:minimatch@3.1.2" - ], - "minimatch@5.1.6": [ - "npm:minimatch@5.1.6" - ], - "minimatch@9.0.3": [ - "npm:minimatch@9.0.3" - ], - "minimatch@9.0.5": [ - "npm:minimatch@9.0.5" - ], - "minimist@1.2.8": [ - "npm:minimist" - ], - "minipass@7.1.2": [ - "npm:minipass" - ], - "minizlib@3.1.0": [ - "npm:minizlib" - ], - "mlly@1.8.0": [ - "npm:mlly" - ], - "mri@1.2.0": [ - "npm:mri" - ], - "ms@2.1.3": [ - "npm:ms" - ], - "muggle-string@0.4.1": [ - "npm:muggle-string" - ], - "nanoid@3.3.11": [ - "npm:nanoid@3.3.11" - ], - "nanoid@5.1.6": [ - "npm:nanoid@5.1.6" - ], - "nanospinner@1.2.2": [ - "npm:nanospinner" - ], - "napi-postinstall@0.3.4": [ - "npm:napi-postinstall" - ], - "natural-compare@1.4.0": [ - "npm:natural-compare" - ], - "nitropack@2.12.9(rolldown@1.0.0-beta.51)": [ - "npm:nitropack" - ], - "node-addon-api@7.1.1": [ - "npm:node-addon-api" - ], - "node-domexception@1.0.0": [ - "npm:node-domexception" - ], - "node-fetch-native@1.6.7": [ - "npm:node-fetch-native" - ], - "node-fetch@2.7.0": [ - "npm:node-fetch@2.7.0" - ], - "node-fetch@3.3.2": [ - "npm:node-fetch@3.3.2" - ], - "node-forge@1.3.1": [ - "npm:node-forge" - ], - "node-gyp-build@4.8.4": [ - "npm:node-gyp-build" - ], - "node-machine-id@1.1.12": [ - "npm:node-machine-id" - ], - "node-mock-http@1.0.3": [ - "npm:node-mock-http" - ], - "node-releases@2.0.27": [ - "npm:node-releases" - ], - "nopt@8.1.0": [ - "npm:nopt" - ], - "normalize-path@3.0.0": [ - "npm:normalize-path" - ], - "npm-run-path@4.0.1": [ - "npm:npm-run-path@4.0.1" - ], - "npm-run-path@5.3.0": [ - "npm:npm-run-path@5.3.0" - ], - "nth-check@2.1.1": [ - "npm:nth-check" - ], - "nx@22.1.2": [ - "npm:nx" - ], - "nypm@0.6.2": [ - "npm:nypm" - ], - "obug@2.1.1": [ - "npm:obug" - ], - "ofetch@1.5.0": [ - "npm:ofetch" - ], - "ohash@2.0.11": [ - "npm:ohash" - ], - "ollama@0.6.3": [ - "npm:ollama" - ], - "on-finished@2.4.1": [ - "npm:on-finished" - ], - "once@1.4.0": [ - "npm:once" - ], - "onetime@5.1.2": [ - "npm:onetime@5.1.2" - ], - "onetime@6.0.0": [ - "npm:onetime@6.0.0" - ], - "open@8.4.2": [ - "npm:open" - ], - "openai@6.9.1(ws@8.18.3)(zod@4.1.13)": [ - "npm:openai" - ], - "optionator@0.9.4": [ - "npm:optionator" - ], - "ora@5.3.0": [ - "npm:ora" - ], - "outdent@0.5.0": [ - "npm:outdent" - ], - "oxc-resolver@11.14.0": [ - "npm:oxc-resolver" - ], - "p-filter@2.1.0": [ - "npm:p-filter" - ], - "p-limit@2.3.0": [ - "npm:p-limit@2.3.0" - ], - "p-limit@3.1.0": [ - "npm:p-limit@3.1.0" - ], - "p-locate@4.1.0": [ - "npm:p-locate@4.1.0" - ], - "p-locate@5.0.0": [ - "npm:p-locate@5.0.0" - ], - "p-map@2.1.0": [ - "npm:p-map" - ], - "p-try@2.2.0": [ - "npm:p-try" - ], - "package-json-from-dist@1.0.1": [ - "npm:package-json-from-dist" - ], - "package-manager-detector@0.2.11": [ - "npm:package-manager-detector@0.2.11" - ], - "package-manager-detector@1.5.0": [ - "npm:package-manager-detector@1.5.0" - ], - "parent-module@1.0.1": [ - "npm:parent-module" - ], - "parse-entities@4.0.2": [ - "npm:parse-entities" - ], - "parse5-htmlparser2-tree-adapter@7.1.0": [ - "npm:parse5-htmlparser2-tree-adapter" - ], - "parse5-parser-stream@7.1.2": [ - "npm:parse5-parser-stream" - ], - "parse5@7.3.0": [ - "npm:parse5@7.3.0" - ], - "parse5@8.0.0": [ - "npm:parse5@8.0.0" - ], - "parseurl@1.3.3": [ - "npm:parseurl" - ], - "partial-json@0.1.7": [ - "npm:partial-json" - ], - "path-browserify@1.0.1": [ - "npm:path-browserify" - ], - "path-exists@4.0.0": [ - "npm:path-exists" - ], - "path-key@3.1.1": [ - "npm:path-key@3.1.1" - ], - "path-key@4.0.0": [ - "npm:path-key@4.0.0" - ], - "path-parse@1.0.7": [ - "npm:path-parse" - ], - "path-scurry@1.11.1": [ - "npm:path-scurry" - ], - "path-type@4.0.0": [ - "npm:path-type@4.0.0" - ], - "path-type@6.0.0": [ - "npm:path-type@6.0.0" - ], - "pathe@1.1.2": [ - "npm:pathe@1.1.2" - ], - "pathe@2.0.3": [ - "npm:pathe@2.0.3" - ], - "perfect-debounce@2.0.0": [ - "npm:perfect-debounce" - ], - "picocolors@1.1.1": [ - "npm:picocolors" - ], - "picomatch@2.3.1": [ - "npm:picomatch@2.3.1" - ], - "picomatch@4.0.3": [ - "npm:picomatch@4.0.3" - ], - "pify@4.0.1": [ - "npm:pify" - ], - "pkg-types@1.3.1": [ - "npm:pkg-types@1.3.1" - ], - "pkg-types@2.3.0": [ - "npm:pkg-types@2.3.0" - ], - "postcss@8.5.6": [ - "npm:postcss" - ], - "prelude-ls@1.2.1": [ - "npm:prelude-ls" - ], - "premove@4.0.0": [ - "npm:premove" - ], - "prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.44.1)": [ - "npm:prettier-plugin-svelte" - ], - "prettier@2.8.8": [ - "npm:prettier@2.8.8" - ], - "prettier@3.6.2": [ - "npm:prettier" - ], - "pretty-bytes@7.1.0": [ - "npm:pretty-bytes" - ], - "pretty-format@27.5.1": [ - "npm:pretty-format@27.5.1" - ], - "pretty-format@30.2.0": [ - "npm:pretty-format@30.2.0" - ], - "process-nextick-args@2.0.1": [ - "npm:process-nextick-args" - ], - "process@0.11.10": [ - "npm:process" - ], - "property-information@6.5.0": [ - "npm:property-information@6.5.0" - ], - "property-information@7.1.0": [ - "npm:property-information@7.1.0" - ], - "proxy-from-env@1.1.0": [ - "npm:proxy-from-env" - ], - "publint@0.3.15": [ - "npm:publint" - ], - "punycode.js@2.3.1": [ - "npm:punycode.js" - ], - "punycode@2.3.1": [ - "npm:punycode" - ], - "quansync@0.2.11": [ - "npm:quansync" - ], - "queue-microtask@1.2.3": [ - "npm:queue-microtask" - ], - "radix3@1.1.2": [ - "npm:radix3" - ], - "randombytes@2.1.0": [ - "npm:randombytes" - ], - "range-parser@1.2.1": [ - "npm:range-parser" - ], - "rc9@2.1.2": [ - "npm:rc9" - ], - "react-dom@19.2.0(react@19.2.0)": [ - "npm:react-dom" - ], - "react-is@17.0.2": [ - "npm:react-is@17.0.2" - ], - "react-is@18.3.1": [ - "npm:react-is@18.3.1" - ], - "react-markdown@10.1.0(@types/react@19.2.7)(react@19.2.0)": [ - "npm:react-markdown" - ], - "react-refresh@0.18.0": [ - "npm:react-refresh" - ], - "react@19.2.0": [ - "npm:react" - ], - "read-yaml-file@1.1.0": [ - "npm:read-yaml-file" - ], - "readable-stream@2.3.8": [ - "npm:readable-stream@2.3.8" - ], - "readable-stream@3.6.2": [ - "npm:readable-stream@3.6.2" - ], - "readable-stream@4.7.0": [ - "npm:readable-stream@4.7.0" - ], - "readdir-glob@1.1.3": [ - "npm:readdir-glob" - ], - "readdirp@3.6.0": [ - "npm:readdirp@3.6.0" - ], - "readdirp@4.1.2": [ - "npm:readdirp@4.1.2" - ], - "recast@0.23.11": [ - "npm:recast" - ], - "redent@3.0.0": [ - "npm:redent" - ], - "redis-errors@1.2.0": [ - "npm:redis-errors" - ], - "redis-parser@3.0.0": [ - "npm:redis-parser" - ], - "rehype-highlight@7.0.2": [ - "npm:rehype-highlight" - ], - "rehype-raw@7.0.0": [ - "npm:rehype-raw" - ], - "rehype-sanitize@6.0.0": [ - "npm:rehype-sanitize" - ], - "remark-gfm@4.0.1": [ - "npm:remark-gfm" - ], - "remark-parse@11.0.0": [ - "npm:remark-parse" - ], - "remark-rehype@11.1.2": [ - "npm:remark-rehype" - ], - "remark-stringify@11.0.0": [ - "npm:remark-stringify" - ], - "require-directory@2.1.1": [ - "npm:require-directory" - ], - "require-from-string@2.0.2": [ - "npm:require-from-string" - ], - "resolve-from@4.0.0": [ - "npm:resolve-from@4.0.0" - ], - "resolve-from@5.0.0": [ - "npm:resolve-from@5.0.0" - ], - "resolve-pkg-maps@1.0.0": [ - "npm:resolve-pkg-maps" - ], - "resolve.exports@2.0.3": [ - "npm:resolve.exports" - ], - "resolve@1.22.11": [ - "npm:resolve" - ], - "restore-cursor@3.1.0": [ - "npm:restore-cursor" - ], - "reusify@1.1.0": [ - "npm:reusify" - ], - "rimraf@5.0.10": [ - "npm:rimraf" - ], - "rolldown@1.0.0-beta.51": [ - "npm:rolldown" - ], - "rollup-plugin-preserve-directives@0.4.0(rollup@4.53.3)": [ - "npm:rollup-plugin-preserve-directives" - ], - "rollup-plugin-visualizer@6.0.5(rolldown@1.0.0-beta.51)(rollup@4.53.3)": [ - "npm:rollup-plugin-visualizer" - ], - "rollup@4.53.3": [ - "npm:rollup" - ], - "rou3@0.7.10": [ - "npm:rou3" - ], - "run-parallel@1.2.0": [ - "npm:run-parallel" - ], - "sade@1.8.1": [ - "npm:sade" - ], - "safe-buffer@5.1.2": [ - "npm:safe-buffer@5.1.2" - ], - "safe-buffer@5.2.1": [ - "npm:safe-buffer@5.2.1" - ], - "safer-buffer@2.1.2": [ - "npm:safer-buffer" - ], - "saxes@6.0.0": [ - "npm:saxes" - ], - "scheduler@0.27.0": [ - "npm:scheduler" - ], - "scule@1.3.0": [ - "npm:scule" - ], - "semver@6.3.1": [ - "npm:semver@6.3.1" - ], - "semver@7.5.4": [ - "npm:semver@7.5.4" - ], - "semver@7.7.3": [ - "npm:semver@7.7.3" - ], - "send@1.2.0": [ - "npm:send" - ], - "serialize-javascript@6.0.2": [ - "npm:serialize-javascript" - ], - "seroval-plugins@1.3.3(seroval@1.3.2)": [ - "npm:seroval-plugins@1.3.3" - ], - "seroval-plugins@1.4.0(seroval@1.4.0)": [ - "npm:seroval-plugins@1.4.0" - ], - "seroval@1.3.2": [ - "npm:seroval@1.3.2" - ], - "seroval@1.4.0": [ - "npm:seroval@1.4.0" - ], - "serve-placeholder@2.0.2": [ - "npm:serve-placeholder" - ], - "serve-static@2.2.0": [ - "npm:serve-static" - ], - "setprototypeof@1.2.0": [ - "npm:setprototypeof" - ], - "shebang-command@2.0.0": [ - "npm:shebang-command" - ], - "shebang-regex@3.0.0": [ - "npm:shebang-regex" - ], - "sherif-darwin-arm64@1.9.0": [ - "npm:sherif-darwin-arm64" - ], - "sherif-darwin-x64@1.9.0": [ - "npm:sherif-darwin-x64" - ], - "sherif-linux-arm64-musl@1.9.0": [ - "npm:sherif-linux-arm64-musl" - ], - "sherif-linux-arm64@1.9.0": [ - "npm:sherif-linux-arm64" - ], - "sherif-linux-x64-musl@1.9.0": [ - "npm:sherif-linux-x64-musl" - ], - "sherif-linux-x64@1.9.0": [ - "npm:sherif-linux-x64" - ], - "sherif-windows-arm64@1.9.0": [ - "npm:sherif-windows-arm64" - ], - "sherif-windows-x64@1.9.0": [ - "npm:sherif-windows-x64" - ], - "sherif@1.9.0": [ - "npm:sherif" - ], - "siginfo@2.0.0": [ - "npm:siginfo" - ], - "signal-exit@3.0.7": [ - "npm:signal-exit@3.0.7" - ], - "signal-exit@4.1.0": [ - "npm:signal-exit@4.1.0" - ], - "simple-git@3.30.0": [ - "npm:simple-git" - ], - "size-limit@11.2.0": [ - "npm:size-limit" - ], - "slash@3.0.0": [ - "npm:slash@3.0.0" - ], - "slash@5.1.0": [ - "npm:slash@5.1.0" - ], - "smob@1.5.0": [ - "npm:smob" - ], - "smol-toml@1.5.2": [ - "npm:smol-toml" - ], - "solid-js@1.9.10": [ - "npm:solid-js" - ], - "solid-refresh@0.6.3(solid-js@1.9.10)": [ - "npm:solid-refresh" - ], - "source-map-js@1.2.1": [ - "npm:source-map-js" - ], - "source-map-support@0.5.21": [ - "npm:source-map-support" - ], - "source-map@0.6.1": [ - "npm:source-map@0.6.1" - ], - "source-map@0.7.6": [ - "npm:source-map@0.7.6" - ], - "space-separated-tokens@2.0.2": [ - "npm:space-separated-tokens" - ], - "spawndamnit@3.0.1": [ - "npm:spawndamnit" - ], - "split2@4.2.0": [ - "npm:split2" - ], - "sprintf-js@1.0.3": [ - "npm:sprintf-js" - ], - "srvx@0.8.16": [ - "npm:srvx" - ], - "stable-hash-x@0.2.0": [ - "npm:stable-hash-x" - ], - "stackback@0.0.2": [ - "npm:stackback" - ], - "standard-as-callback@2.1.0": [ - "npm:standard-as-callback" - ], - "statuses@2.0.1": [ - "npm:statuses@2.0.1" - ], - "statuses@2.0.2": [ - "npm:statuses@2.0.2" - ], - "std-env@3.10.0": [ - "npm:std-env" - ], - "streamx@2.23.0": [ - "npm:streamx" - ], - "string-argv@0.3.2": [ - "npm:string-argv" - ], - "string-ts@2.2.1": [ - "npm:string-ts" - ], - "string-width@4.2.3": [ - "npm:string-width@4.2.3", - "npm:string-width-cjs" - ], - "string-width@5.1.2": [ - "npm:string-width@5.1.2" - ], - "string_decoder@1.1.1": [ - "npm:string_decoder@1.1.1" - ], - "string_decoder@1.3.0": [ - "npm:string_decoder@1.3.0" - ], - "stringify-entities@4.0.4": [ - "npm:stringify-entities" - ], - "strip-ansi@6.0.1": [ - "npm:strip-ansi@6.0.1", - "npm:strip-ansi-cjs" - ], - "strip-ansi@7.1.2": [ - "npm:strip-ansi@7.1.2" - ], - "strip-bom@3.0.0": [ - "npm:strip-bom" - ], - "strip-final-newline@3.0.0": [ - "npm:strip-final-newline" - ], - "strip-indent@3.0.0": [ - "npm:strip-indent" - ], - "strip-json-comments@3.1.1": [ - "npm:strip-json-comments@3.1.1" - ], - "strip-json-comments@5.0.3": [ - "npm:strip-json-comments@5.0.3" - ], - "strip-literal@3.1.0": [ - "npm:strip-literal" - ], - "style-to-js@1.1.18": [ - "npm:style-to-js" - ], - "style-to-object@1.0.11": [ - "npm:style-to-object" - ], - "supports-color@10.2.2": [ - "npm:supports-color@10.2.2" - ], - "supports-color@7.2.0": [ - "npm:supports-color@7.2.0" - ], - "supports-color@8.1.1": [ - "npm:supports-color@8.1.1" - ], - "supports-preserve-symlinks-flag@1.0.0": [ - "npm:supports-preserve-symlinks-flag" - ], - "svelte@5.44.1": [ - "npm:svelte" - ], - "symbol-tree@3.2.4": [ - "npm:symbol-tree" - ], - "system-architecture@0.1.0": [ - "npm:system-architecture" - ], - "tagged-tag@1.0.0": [ - "npm:tagged-tag" - ], - "tailwindcss@4.1.17": [ - "npm:tailwindcss" - ], - "tapable@2.3.0": [ - "npm:tapable" - ], - "tar-stream@2.2.0": [ - "npm:tar-stream@2.2.0" - ], - "tar-stream@3.1.7": [ - "npm:tar-stream@3.1.7" - ], - "tar@7.5.2": [ - "npm:tar" - ], - "term-size@2.2.1": [ - "npm:term-size" - ], - "terser@5.44.0": [ - "npm:terser" - ], - "text-decoder@1.2.3": [ - "npm:text-decoder" - ], - "text-extensions@2.4.0": [ - "npm:text-extensions" - ], - "through@2.3.8": [ - "npm:through" - ], - "tiny-invariant@1.3.3": [ - "npm:tiny-invariant" - ], - "tiny-warning@1.0.3": [ - "npm:tiny-warning" - ], - "tinybench@2.9.0": [ - "npm:tinybench" - ], - "tinyexec@0.3.2": [ - "npm:tinyexec@0.3.2" - ], - "tinyexec@1.0.1": [ - "npm:tinyexec@1.0.1" - ], - "tinyglobby@0.2.15": [ - "npm:tinyglobby" - ], - "tinyrainbow@3.0.3": [ - "npm:tinyrainbow" - ], - "tldts-core@7.0.16": [ - "npm:tldts-core" - ], - "tldts@7.0.16": [ - "npm:tldts" - ], - "tmp@0.2.5": [ - "npm:tmp" - ], - "to-regex-range@5.0.1": [ - "npm:to-regex-range" - ], - "toidentifier@1.0.1": [ - "npm:toidentifier" - ], - "tough-cookie@6.0.0": [ - "npm:tough-cookie" - ], - "tr46@0.0.3": [ - "npm:tr46@0.0.3" - ], - "tr46@6.0.0": [ - "npm:tr46@6.0.0" - ], - "tree-kill@1.2.2": [ - "npm:tree-kill" - ], - "trim-lines@3.0.1": [ - "npm:trim-lines" - ], - "trough@2.2.0": [ - "npm:trough" - ], - "ts-algebra@2.0.0": [ - "npm:ts-algebra" - ], - "ts-api-utils@2.1.0(typescript@5.9.3)": [ - "npm:ts-api-utils" - ], - "ts-declaration-location@1.0.7(typescript@5.9.3)": [ - "npm:ts-declaration-location" - ], - "ts-pattern@5.9.0": [ - "npm:ts-pattern" - ], - "tsconfck@3.1.6(typescript@5.9.3)": [ - "npm:tsconfck" - ], - "tsconfig-paths@4.2.0": [ - "npm:tsconfig-paths" - ], - "tslib@2.8.1": [ - "npm:tslib" - ], - "tsx@4.20.6": [ - "npm:tsx" - ], - "type-check@0.4.0": [ - "npm:type-check" - ], - "type-fest@5.1.0": [ - "npm:type-fest" - ], - "typedoc-plugin-frontmatter@1.3.0(typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3)))": [ - "npm:typedoc-plugin-frontmatter" - ], - "typedoc-plugin-markdown@4.9.0(typedoc@0.28.14(typescript@5.9.3))": [ - "npm:typedoc-plugin-markdown" - ], - "typedoc@0.28.14(typescript@5.9.3)": [ - "npm:typedoc" - ], - "typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)": [ - "npm:typescript-eslint" - ], - "typescript@5.4.2": [ - "npm:typescript@5.4.2" - ], - "typescript@5.9.3": [ - "npm:typescript" - ], - "uc.micro@2.1.0": [ - "npm:uc.micro" - ], - "ufo@1.6.1": [ - "npm:ufo" - ], - "ultrahtml@1.6.0": [ - "npm:ultrahtml" - ], - "uncrypto@0.1.3": [ - "npm:uncrypto" - ], - "unctx@2.4.1": [ - "npm:unctx" - ], - "undici-types@6.21.0": [ - "npm:undici-types@6.21.0" - ], - "undici-types@7.16.0": [ - "npm:undici-types@7.16.0" - ], - "undici@7.16.0": [ - "npm:undici" - ], - "unenv@2.0.0-rc.24": [ - "npm:unenv" - ], - "unicorn-magic@0.3.0": [ - "npm:unicorn-magic" - ], - "unified@11.0.5": [ - "npm:unified" - ], - "unimport@5.5.0": [ - "npm:unimport" - ], - "unist-util-find-after@5.0.0": [ - "npm:unist-util-find-after" - ], - "unist-util-is@6.0.1": [ - "npm:unist-util-is" - ], - "unist-util-position@5.0.0": [ - "npm:unist-util-position" - ], - "unist-util-stringify-position@4.0.0": [ - "npm:unist-util-stringify-position" - ], - "unist-util-visit-parents@6.0.2": [ - "npm:unist-util-visit-parents" - ], - "unist-util-visit@5.0.0": [ - "npm:unist-util-visit" - ], - "universalify@0.1.2": [ - "npm:universalify@0.1.2" - ], - "universalify@2.0.1": [ - "npm:universalify@2.0.1" - ], - "unplugin-utils@0.3.1": [ - "npm:unplugin-utils" - ], - "unplugin@2.3.10": [ - "npm:unplugin" - ], - "unrs-resolver@1.11.1": [ - "npm:unrs-resolver" - ], - "unstorage@1.17.2(db0@0.3.4)(ioredis@5.8.2)": [ - "npm:unstorage" - ], - "untun@0.1.3": [ - "npm:untun" - ], - "untyped@2.0.0": [ - "npm:untyped" - ], - "unwasm@0.3.11": [ - "npm:unwasm" - ], - "update-browserslist-db@1.1.4(browserslist@4.27.0)": [ - "npm:update-browserslist-db" - ], - "uqr@0.1.2": [ - "npm:uqr" - ], - "uri-js@4.4.1": [ - "npm:uri-js" - ], - "use-sync-external-store@1.6.0(react@19.2.0)": [ - "npm:use-sync-external-store" - ], - "util-deprecate@1.0.2": [ - "npm:util-deprecate" - ], - "vfile-location@5.0.3": [ - "npm:vfile-location" - ], - "vfile-message@4.0.3": [ - "npm:vfile-message" - ], - "vfile@6.0.3": [ - "npm:vfile" - ], - "vite-plugin-dts@4.2.3(@types/node@24.10.1)(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:vite-plugin-dts" - ], - "vite-plugin-externalize-deps@0.10.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:vite-plugin-externalize-deps" - ], - "vite-plugin-solid@2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:vite-plugin-solid" - ], - "vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:vite-tsconfig-paths" - ], - "vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)": [ - "npm:vite" - ], - "vitefu@1.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))": [ - "npm:vitefu" - ], - "vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)": [ - "npm:vitest" - ], - "vscode-uri@3.1.0": [ - "npm:vscode-uri" - ], - "vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))": [ - "npm:vue-eslint-parser" - ], - "w3c-xmlserializer@5.0.0": [ - "npm:w3c-xmlserializer" - ], - "walk-up-path@4.0.0": [ - "npm:walk-up-path" - ], - "wcwidth@1.0.1": [ - "npm:wcwidth" - ], - "web-namespaces@2.0.1": [ - "npm:web-namespaces" - ], - "web-streams-polyfill@3.3.3": [ - "npm:web-streams-polyfill" - ], - "web-vitals@5.1.0": [ - "npm:web-vitals" - ], - "webidl-conversions@3.0.1": [ - "npm:webidl-conversions@3.0.1" - ], - "webidl-conversions@8.0.0": [ - "npm:webidl-conversions@8.0.0" - ], - "webpack-virtual-modules@0.6.2": [ - "npm:webpack-virtual-modules" - ], - "whatwg-encoding@3.1.1": [ - "npm:whatwg-encoding" - ], - "whatwg-fetch@3.6.20": [ - "npm:whatwg-fetch" - ], - "whatwg-mimetype@3.0.0": [ - "npm:whatwg-mimetype@3.0.0" - ], - "whatwg-mimetype@4.0.0": [ - "npm:whatwg-mimetype@4.0.0" - ], - "whatwg-url@15.1.0": [ - "npm:whatwg-url@15.1.0" - ], - "whatwg-url@5.0.0": [ - "npm:whatwg-url@5.0.0" - ], - "which@2.0.2": [ - "npm:which" - ], - "why-is-node-running@2.3.0": [ - "npm:why-is-node-running" - ], - "word-wrap@1.2.5": [ - "npm:word-wrap" - ], - "wrap-ansi@7.0.0": [ - "npm:wrap-ansi@7.0.0", - "npm:wrap-ansi-cjs" - ], - "wrap-ansi@8.1.0": [ - "npm:wrap-ansi@8.1.0" - ], - "wrappy@1.0.2": [ - "npm:wrappy" - ], - "ws@8.18.3": [ - "npm:ws" - ], - "xml-name-validator@5.0.0": [ - "npm:xml-name-validator" - ], - "xmlbuilder2@4.0.1": [ - "npm:xmlbuilder2" - ], - "xmlchars@2.2.0": [ - "npm:xmlchars" - ], - "y18n@5.0.8": [ - "npm:y18n" - ], - "yallist@3.1.1": [ - "npm:yallist@3.1.1" - ], - "yallist@4.0.0": [ - "npm:yallist@4.0.0" - ], - "yallist@5.0.0": [ - "npm:yallist@5.0.0" - ], - "yaml@2.8.1": [ - "npm:yaml" - ], - "yargs-parser@21.1.1": [ - "npm:yargs-parser" - ], - "yargs@17.7.2": [ - "npm:yargs" - ], - "yocto-queue@0.1.0": [ - "npm:yocto-queue" - ], - "youch-core@0.3.3": [ - "npm:youch-core" - ], - "youch@4.1.0-beta.11": [ - "npm:youch" - ], - "zimmerframe@1.1.4": [ - "npm:zimmerframe" - ], - "zip-stream@6.0.1": [ - "npm:zip-stream" - ], - "zod-validation-error@3.5.4(zod@3.25.76)": [ - "npm:zod-validation-error@3.5.4" - ], - "zod-validation-error@4.0.2(zod@4.1.13)": [ - "npm:zod-validation-error@4.0.2" - ], - "zod@3.25.76": [ - "npm:zod@3.25.76" - ], - "zod@4.1.13": [ - "npm:zod@4.1.13" - ], - "zwitch@2.0.4": [ - "npm:zwitch" - ] - } -} \ No newline at end of file diff --git a/.nx/workspace-data/project-graph.json b/.nx/workspace-data/project-graph.json deleted file mode 100644 index f792ef287..000000000 --- a/.nx/workspace-data/project-graph.json +++ /dev/null @@ -1,28748 +0,0 @@ -{ - "nodes": { - "@tanstack/react-ai-devtools": { - "name": "@tanstack/react-ai-devtools", - "type": "lib", - "data": { - "root": "packages/typescript/react-ai-devtools", - "name": "@tanstack/react-ai-devtools", - "tags": [ - "npm:public" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "clean", - "lint:fix", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types", - "test:build", - "build" - ] - }, - "description": "React Devtools for TanStack AI.", - "js": { - "packageName": "@tanstack/react-ai-devtools", - "packageVersion": "0.1.8", - "packageExports": { - ".": { - "import": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - } - }, - "./production": { - "import": { - "types": "./dist/production.d.ts", - "default": "./dist/production.js" - } - }, - "./package.json": "./package.json" - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/solid-ai-devtools": { - "name": "@tanstack/solid-ai-devtools", - "type": "lib", - "data": { - "root": "packages/typescript/solid-ai-devtools", - "name": "@tanstack/solid-ai-devtools", - "tags": [ - "npm:public", - "npm:ai", - "npm:tanstack", - "npm:sdk", - "npm:llm", - "npm:chat", - "npm:embeddings" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Solid TanStack AI Devtools", - "js": { - "packageName": "@tanstack/solid-ai-devtools", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - }, - "./production": { - "import": { - "types": "./dist/production.d.ts", - "default": "./dist/production.js" - } - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/tests-adapters": { - "name": "@tanstack/tests-adapters", - "type": "app", - "data": { - "root": "packages/typescript/tests-adapters", - "name": "@tanstack/tests-adapters", - "tags": [ - "npm:public" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "start", - "typecheck" - ] - }, - "description": "Tests for TanStack AI adapters", - "js": { - "packageName": "@tanstack/tests-adapters", - "packageVersion": "0.1.0", - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "start": { - "executor": "nx:run-script", - "options": { - "script": "start" - }, - "metadata": { - "scriptContent": "tsx src/index.ts", - "runCommand": "pnpm run start" - }, - "configurations": {}, - "parallelism": true - }, - "typecheck": { - "executor": "nx:run-script", - "options": { - "script": "typecheck" - }, - "metadata": { - "scriptContent": "tsc --noEmit", - "runCommand": "pnpm run typecheck" - }, - "configurations": {}, - "parallelism": true - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-anthropic": { - "name": "@tanstack/ai-anthropic", - "type": "lib", - "data": { - "root": "packages/typescript/ai-anthropic", - "name": "@tanstack/ai-anthropic", - "tags": [ - "npm:public", - "npm:ai", - "npm:anthropic", - "npm:claude", - "npm:tanstack", - "npm:adapter" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Anthropic Claude adapter for TanStack AI", - "js": { - "packageName": "@tanstack/ai-anthropic", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-devtools-core": { - "name": "@tanstack/ai-devtools-core", - "type": "lib", - "data": { - "root": "packages/typescript/ai-devtools", - "name": "@tanstack/ai-devtools-core", - "tags": [ - "npm:public", - "npm:ai", - "npm:tanstack", - "npm:sdk", - "npm:llm", - "npm:chat", - "npm:embeddings" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Core TanStack AI Devtools", - "js": { - "packageName": "@tanstack/ai-devtools-core", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "import": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts" - }, - "./production": { - "import": "./dist/esm/production.js", - "types": "./dist/esm/production.d.ts" - }, - "./package.json": "./package.json" - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-fallback": { - "name": "@tanstack/ai-fallback", - "type": "lib", - "data": { - "root": "packages/typescript/ai-fallback", - "name": "@tanstack/ai-fallback", - "tags": [ - "npm:public", - "npm:ai", - "npm:fallback", - "npm:tanstack", - "npm:adapter", - "npm:retry" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Fallback wrapper for TanStack AI - automatically try multiple adapters in sequence", - "js": { - "packageName": "@tanstack/ai-fallback", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-react-ui": { - "name": "@tanstack/ai-react-ui", - "type": "lib", - "data": { - "root": "packages/typescript/ai-react-ui", - "name": "@tanstack/ai-react-ui", - "tags": [ - "npm:public", - "npm:tanstack", - "npm:ai", - "npm:react", - "npm:chat", - "npm:ui", - "npm:headless", - "npm:components" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Headless React components for building AI chat interfaces", - "js": { - "packageName": "@tanstack/ai-react-ui", - "packageVersion": "0.0.1", - "packageExports": { - ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" - } - }, - "packageMain": "./dist/index.js", - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest --passWithNoTests", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-client": { - "name": "@tanstack/ai-client", - "type": "lib", - "data": { - "root": "packages/typescript/ai-client", - "name": "@tanstack/ai-client", - "tags": [ - "npm:public", - "npm:ai", - "npm:client", - "npm:headless", - "npm:tanstack", - "npm:chat", - "npm:streaming" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Framework-agnostic headless client for TanStack AI", - "js": { - "packageName": "@tanstack/ai-client", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-gemini": { - "name": "@tanstack/ai-gemini", - "type": "lib", - "data": { - "root": "packages/typescript/ai-gemini", - "name": "@tanstack/ai-gemini", - "tags": [ - "npm:public", - "npm:ai", - "npm:gemini", - "npm:google", - "npm:tanstack", - "npm:adapter" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Google Gemini adapter for TanStack AI", - "js": { - "packageName": "@tanstack/ai-gemini", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-ollama": { - "name": "@tanstack/ai-ollama", - "type": "lib", - "data": { - "root": "packages/typescript/ai-ollama", - "name": "@tanstack/ai-ollama", - "tags": [ - "npm:public", - "npm:ai", - "npm:ollama", - "npm:llama", - "npm:mistral", - "npm:tanstack", - "npm:adapter" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Ollama adapter for TanStack AI", - "js": { - "packageName": "@tanstack/ai-ollama", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-openai": { - "name": "@tanstack/ai-openai", - "type": "lib", - "data": { - "root": "packages/typescript/ai-openai", - "name": "@tanstack/ai-openai", - "tags": [ - "npm:public", - "npm:ai", - "npm:openai", - "npm:gpt", - "npm:tanstack", - "npm:adapter" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "OpenAI adapter for TanStack AI", - "js": { - "packageName": "@tanstack/ai-openai", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai-react": { - "name": "@tanstack/ai-react", - "type": "lib", - "data": { - "root": "packages/typescript/ai-react", - "name": "@tanstack/ai-react", - "tags": [ - "npm:public", - "npm:ai", - "npm:react", - "npm:hooks", - "npm:tanstack", - "npm:chat", - "npm:streaming" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "clean", - "lint:fix", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types", - "test:build", - "build" - ] - }, - "description": "React hooks for TanStack AI", - "js": { - "packageName": "@tanstack/ai-react", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - } - }, - "implicitDependencies": [] - } - }, - "@tanstack/ai": { - "name": "@tanstack/ai", - "type": "lib", - "data": { - "root": "packages/typescript/ai", - "name": "@tanstack/ai", - "tags": [ - "npm:public", - "npm:ai", - "npm:tanstack", - "npm:sdk", - "npm:llm", - "npm:chat", - "npm:embeddings" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "build", - "clean", - "lint:fix", - "test:build", - "test:eslint", - "test:lib", - "test:lib:dev", - "test:types" - ] - }, - "description": "Core TanStack AI library - Open source AI SDK", - "js": { - "packageName": "@tanstack/ai", - "packageVersion": "0.1.0", - "packageExports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - }, - "./event-client": { - "types": "./dist/event-client.d.ts", - "import": "./dist/event-client.js" - } - }, - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "clean": { - "executor": "nx:run-script", - "options": { - "script": "clean" - }, - "metadata": { - "scriptContent": "premove ./build ./dist", - "runCommand": "pnpm run clean" - }, - "configurations": {}, - "parallelism": true - }, - "lint:fix": { - "executor": "nx:run-script", - "options": { - "script": "lint:fix" - }, - "metadata": { - "scriptContent": "eslint ./src --fix", - "runCommand": "pnpm run lint:fix" - }, - "configurations": {}, - "parallelism": true - }, - "test:build": { - "executor": "nx:run-script", - "options": { - "script": "test:build" - }, - "metadata": { - "scriptContent": "publint --strict", - "runCommand": "pnpm run test:build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "build" - ], - "inputs": [ - "production" - ] - }, - "test:eslint": { - "executor": "nx:run-script", - "options": { - "script": "test:eslint" - }, - "metadata": { - "scriptContent": "eslint ./src", - "runCommand": "pnpm run test:eslint" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production", - "{workspaceRoot}/eslint.config.js" - ] - }, - "test:lib": { - "executor": "nx:run-script", - "options": { - "script": "test:lib" - }, - "metadata": { - "scriptContent": "vitest", - "runCommand": "pnpm run test:lib" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ], - "outputs": [ - "{projectRoot}/coverage" - ] - }, - "test:lib:dev": { - "executor": "nx:run-script", - "options": { - "script": "test:lib:dev" - }, - "metadata": { - "scriptContent": "pnpm test:lib --watch", - "runCommand": "pnpm run test:lib:dev" - }, - "configurations": {}, - "parallelism": true - }, - "test:types": { - "executor": "nx:run-script", - "options": { - "script": "test:types" - }, - "metadata": { - "scriptContent": "tsc", - "runCommand": "pnpm run test:types" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "default", - "^production" - ] - } - }, - "implicitDependencies": [] - } - }, - "vanilla-chat": { - "name": "vanilla-chat", - "type": "app", - "data": { - "root": "examples/vanilla-chat", - "name": "vanilla-chat", - "tags": [ - "npm:private" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "dev", - "build", - "preview" - ] - }, - "js": { - "packageName": "vanilla-chat", - "packageVersion": "0.1.0", - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "dev": { - "executor": "nx:run-script", - "options": { - "script": "dev" - }, - "metadata": { - "scriptContent": "vite --port 3001", - "runCommand": "pnpm run dev" - }, - "configurations": {}, - "parallelism": true - }, - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "preview": { - "executor": "nx:run-script", - "options": { - "script": "preview" - }, - "metadata": { - "scriptContent": "vite preview", - "runCommand": "pnpm run preview" - }, - "configurations": {}, - "parallelism": true - } - }, - "implicitDependencies": [] - } - }, - "ts-chat": { - "name": "ts-chat", - "type": "app", - "data": { - "root": "examples/ts-chat", - "name": "ts-chat", - "tags": [ - "npm:private" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "dev", - "build", - "serve", - "test" - ] - }, - "js": { - "packageName": "ts-chat", - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "dev": { - "executor": "nx:run-script", - "options": { - "script": "dev" - }, - "metadata": { - "scriptContent": "vite dev --port 3000", - "runCommand": "pnpm run dev" - }, - "configurations": {}, - "parallelism": true - }, - "build": { - "executor": "nx:run-script", - "options": { - "script": "build" - }, - "metadata": { - "scriptContent": "vite build", - "runCommand": "pnpm run build" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ], - "outputs": [ - "{projectRoot}/build", - "{projectRoot}/dist" - ] - }, - "serve": { - "executor": "nx:run-script", - "options": { - "script": "serve" - }, - "metadata": { - "scriptContent": "vite preview", - "runCommand": "pnpm run serve" - }, - "configurations": {}, - "parallelism": true - }, - "test": { - "executor": "nx:run-script", - "options": { - "script": "test" - }, - "metadata": { - "scriptContent": "exit 0", - "runCommand": "pnpm run test" - }, - "configurations": {}, - "parallelism": true - } - }, - "implicitDependencies": [] - } - }, - "root": { - "name": "root", - "type": "app", - "data": { - "root": ".", - "name": "root", - "includedScripts": [ - "test:knip", - "test:sherif" - ], - "tags": [ - "npm:private" - ], - "metadata": { - "targetGroups": { - "NPM Scripts": [ - "test:knip", - "test:sherif" - ] - }, - "js": { - "packageName": "root", - "isInPackageManagerWorkspaces": true - } - }, - "targets": { - "test:knip": { - "executor": "nx:run-script", - "options": { - "script": "test:knip" - }, - "metadata": { - "scriptContent": "knip", - "runCommand": "pnpm run test:knip" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "inputs": [ - "{workspaceRoot}/**/*" - ] - }, - "test:sherif": { - "executor": "nx:run-script", - "options": { - "script": "test:sherif" - }, - "metadata": { - "scriptContent": "sherif", - "runCommand": "pnpm run test:sherif" - }, - "configurations": {}, - "parallelism": true, - "cache": true, - "inputs": [ - "{workspaceRoot}/**/package.json" - ] - } - }, - "implicitDependencies": [] - } - } - }, - "externalNodes": { - "npm:@acemir/cssom": { - "type": "npm", - "name": "npm:@acemir/cssom", - "data": { - "version": "0.9.24", - "packageName": "@acemir/cssom", - "hash": "sha512-5YjgMmAiT2rjJZU7XK1SNI7iqTy92DpaYVgG6x63FxkJ11UpYfLndHJATtinWJClAXiOlW9XWaUyAQf8pMrQPg==" - } - }, - "npm:@adobe/css-tools": { - "type": "npm", - "name": "npm:@adobe/css-tools", - "data": { - "version": "4.4.4", - "packageName": "@adobe/css-tools", - "hash": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==" - } - }, - "npm:@ai-sdk/openai": { - "type": "npm", - "name": "npm:@ai-sdk/openai", - "data": { - "version": "2.0.73", - "packageName": "@ai-sdk/openai", - "hash": "sha512-TOGoxkeJMgcxq80ZfyCAqKcfvGPgFsEQEK8SgI/w3He0fqi16KlnZVMexOlg8HOLumF6szweg/YrOmQixsPVGw==" - } - }, - "npm:@ai-sdk/provider-utils": { - "type": "npm", - "name": "npm:@ai-sdk/provider-utils", - "data": { - "version": "3.0.17", - "packageName": "@ai-sdk/provider-utils", - "hash": "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==" - } - }, - "npm:@ai-sdk/provider": { - "type": "npm", - "name": "npm:@ai-sdk/provider", - "data": { - "version": "2.0.0", - "packageName": "@ai-sdk/provider", - "hash": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==" - } - }, - "npm:@anthropic-ai/sdk": { - "type": "npm", - "name": "npm:@anthropic-ai/sdk", - "data": { - "version": "0.71.0", - "packageName": "@anthropic-ai/sdk", - "hash": "sha512-go1XeWXmpxuiTkosSXpb8tokLk2ZLkIRcXpbWVwJM6gH5OBtHOVsfPfGuqI1oW7RRt4qc59EmYbrXRZ0Ng06Jw==" - } - }, - "npm:@asamuzakjp/css-color": { - "type": "npm", - "name": "npm:@asamuzakjp/css-color", - "data": { - "version": "4.0.5", - "packageName": "@asamuzakjp/css-color", - "hash": "sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==" - } - }, - "npm:@asamuzakjp/dom-selector": { - "type": "npm", - "name": "npm:@asamuzakjp/dom-selector", - "data": { - "version": "6.7.4", - "packageName": "@asamuzakjp/dom-selector", - "hash": "sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==" - } - }, - "npm:@asamuzakjp/nwsapi": { - "type": "npm", - "name": "npm:@asamuzakjp/nwsapi", - "data": { - "version": "2.3.9", - "packageName": "@asamuzakjp/nwsapi", - "hash": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==" - } - }, - "npm:@babel/code-frame@7.26.2": { - "type": "npm", - "name": "npm:@babel/code-frame@7.26.2", - "data": { - "version": "7.26.2", - "packageName": "@babel/code-frame", - "hash": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==" - } - }, - "npm:@babel/code-frame@7.27.1": { - "type": "npm", - "name": "npm:@babel/code-frame@7.27.1", - "data": { - "version": "7.27.1", - "packageName": "@babel/code-frame", - "hash": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==" - } - }, - "npm:@babel/compat-data": { - "type": "npm", - "name": "npm:@babel/compat-data", - "data": { - "version": "7.28.5", - "packageName": "@babel/compat-data", - "hash": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==" - } - }, - "npm:@babel/core": { - "type": "npm", - "name": "npm:@babel/core", - "data": { - "version": "7.28.5", - "packageName": "@babel/core", - "hash": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==" - } - }, - "npm:@babel/generator": { - "type": "npm", - "name": "npm:@babel/generator", - "data": { - "version": "7.28.5", - "packageName": "@babel/generator", - "hash": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==" - } - }, - "npm:@babel/helper-annotate-as-pure": { - "type": "npm", - "name": "npm:@babel/helper-annotate-as-pure", - "data": { - "version": "7.27.3", - "packageName": "@babel/helper-annotate-as-pure", - "hash": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==" - } - }, - "npm:@babel/helper-compilation-targets": { - "type": "npm", - "name": "npm:@babel/helper-compilation-targets", - "data": { - "version": "7.27.2", - "packageName": "@babel/helper-compilation-targets", - "hash": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==" - } - }, - "npm:@babel/helper-create-class-features-plugin": { - "type": "npm", - "name": "npm:@babel/helper-create-class-features-plugin", - "data": { - "version": "7.28.5", - "packageName": "@babel/helper-create-class-features-plugin", - "hash": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==" - } - }, - "npm:@babel/helper-globals": { - "type": "npm", - "name": "npm:@babel/helper-globals", - "data": { - "version": "7.28.0", - "packageName": "@babel/helper-globals", - "hash": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==" - } - }, - "npm:@babel/helper-member-expression-to-functions": { - "type": "npm", - "name": "npm:@babel/helper-member-expression-to-functions", - "data": { - "version": "7.28.5", - "packageName": "@babel/helper-member-expression-to-functions", - "hash": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==" - } - }, - "npm:@babel/helper-module-imports@7.18.6": { - "type": "npm", - "name": "npm:@babel/helper-module-imports@7.18.6", - "data": { - "version": "7.18.6", - "packageName": "@babel/helper-module-imports", - "hash": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==" - } - }, - "npm:@babel/helper-module-imports@7.27.1": { - "type": "npm", - "name": "npm:@babel/helper-module-imports@7.27.1", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-module-imports", - "hash": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==" - } - }, - "npm:@babel/helper-module-transforms": { - "type": "npm", - "name": "npm:@babel/helper-module-transforms", - "data": { - "version": "7.28.3", - "packageName": "@babel/helper-module-transforms", - "hash": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==" - } - }, - "npm:@babel/helper-optimise-call-expression": { - "type": "npm", - "name": "npm:@babel/helper-optimise-call-expression", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-optimise-call-expression", - "hash": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==" - } - }, - "npm:@babel/helper-plugin-utils": { - "type": "npm", - "name": "npm:@babel/helper-plugin-utils", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-plugin-utils", - "hash": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" - } - }, - "npm:@babel/helper-replace-supers": { - "type": "npm", - "name": "npm:@babel/helper-replace-supers", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-replace-supers", - "hash": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==" - } - }, - "npm:@babel/helper-skip-transparent-expression-wrappers": { - "type": "npm", - "name": "npm:@babel/helper-skip-transparent-expression-wrappers", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-skip-transparent-expression-wrappers", - "hash": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==" - } - }, - "npm:@babel/helper-string-parser": { - "type": "npm", - "name": "npm:@babel/helper-string-parser", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-string-parser", - "hash": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" - } - }, - "npm:@babel/helper-validator-identifier@7.27.1": { - "type": "npm", - "name": "npm:@babel/helper-validator-identifier@7.27.1", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-validator-identifier", - "hash": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" - } - }, - "npm:@babel/helper-validator-identifier@7.28.5": { - "type": "npm", - "name": "npm:@babel/helper-validator-identifier@7.28.5", - "data": { - "version": "7.28.5", - "packageName": "@babel/helper-validator-identifier", - "hash": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" - } - }, - "npm:@babel/helper-validator-option": { - "type": "npm", - "name": "npm:@babel/helper-validator-option", - "data": { - "version": "7.27.1", - "packageName": "@babel/helper-validator-option", - "hash": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" - } - }, - "npm:@babel/helpers": { - "type": "npm", - "name": "npm:@babel/helpers", - "data": { - "version": "7.28.4", - "packageName": "@babel/helpers", - "hash": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==" - } - }, - "npm:@babel/parser@7.28.4": { - "type": "npm", - "name": "npm:@babel/parser@7.28.4", - "data": { - "version": "7.28.4", - "packageName": "@babel/parser", - "hash": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==" - } - }, - "npm:@babel/parser@7.28.5": { - "type": "npm", - "name": "npm:@babel/parser@7.28.5", - "data": { - "version": "7.28.5", - "packageName": "@babel/parser", - "hash": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==" - } - }, - "npm:@babel/plugin-proposal-private-methods": { - "type": "npm", - "name": "npm:@babel/plugin-proposal-private-methods", - "data": { - "version": "7.18.6", - "packageName": "@babel/plugin-proposal-private-methods", - "hash": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==" - } - }, - "npm:@babel/plugin-syntax-jsx": { - "type": "npm", - "name": "npm:@babel/plugin-syntax-jsx", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-syntax-jsx", - "hash": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==" - } - }, - "npm:@babel/plugin-syntax-typescript": { - "type": "npm", - "name": "npm:@babel/plugin-syntax-typescript", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-syntax-typescript", - "hash": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==" - } - }, - "npm:@babel/plugin-transform-modules-commonjs": { - "type": "npm", - "name": "npm:@babel/plugin-transform-modules-commonjs", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-transform-modules-commonjs", - "hash": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==" - } - }, - "npm:@babel/plugin-transform-react-jsx-self": { - "type": "npm", - "name": "npm:@babel/plugin-transform-react-jsx-self", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-transform-react-jsx-self", - "hash": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==" - } - }, - "npm:@babel/plugin-transform-react-jsx-source": { - "type": "npm", - "name": "npm:@babel/plugin-transform-react-jsx-source", - "data": { - "version": "7.27.1", - "packageName": "@babel/plugin-transform-react-jsx-source", - "hash": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==" - } - }, - "npm:@babel/plugin-transform-typescript": { - "type": "npm", - "name": "npm:@babel/plugin-transform-typescript", - "data": { - "version": "7.28.5", - "packageName": "@babel/plugin-transform-typescript", - "hash": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==" - } - }, - "npm:@babel/preset-typescript": { - "type": "npm", - "name": "npm:@babel/preset-typescript", - "data": { - "version": "7.28.5", - "packageName": "@babel/preset-typescript", - "hash": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==" - } - }, - "npm:@babel/runtime": { - "type": "npm", - "name": "npm:@babel/runtime", - "data": { - "version": "7.28.4", - "packageName": "@babel/runtime", - "hash": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==" - } - }, - "npm:@babel/template": { - "type": "npm", - "name": "npm:@babel/template", - "data": { - "version": "7.27.2", - "packageName": "@babel/template", - "hash": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==" - } - }, - "npm:@babel/traverse": { - "type": "npm", - "name": "npm:@babel/traverse", - "data": { - "version": "7.28.5", - "packageName": "@babel/traverse", - "hash": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==" - } - }, - "npm:@babel/types@7.28.4": { - "type": "npm", - "name": "npm:@babel/types@7.28.4", - "data": { - "version": "7.28.4", - "packageName": "@babel/types", - "hash": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==" - } - }, - "npm:@babel/types@7.28.5": { - "type": "npm", - "name": "npm:@babel/types@7.28.5", - "data": { - "version": "7.28.5", - "packageName": "@babel/types", - "hash": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==" - } - }, - "npm:@changesets/apply-release-plan": { - "type": "npm", - "name": "npm:@changesets/apply-release-plan", - "data": { - "version": "7.0.13", - "packageName": "@changesets/apply-release-plan", - "hash": "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==" - } - }, - "npm:@changesets/assemble-release-plan": { - "type": "npm", - "name": "npm:@changesets/assemble-release-plan", - "data": { - "version": "6.0.9", - "packageName": "@changesets/assemble-release-plan", - "hash": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==" - } - }, - "npm:@changesets/changelog-git": { - "type": "npm", - "name": "npm:@changesets/changelog-git", - "data": { - "version": "0.2.1", - "packageName": "@changesets/changelog-git", - "hash": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==" - } - }, - "npm:@changesets/cli": { - "type": "npm", - "name": "npm:@changesets/cli", - "data": { - "version": "2.29.7", - "packageName": "@changesets/cli", - "hash": "sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==" - } - }, - "npm:@changesets/config": { - "type": "npm", - "name": "npm:@changesets/config", - "data": { - "version": "3.1.1", - "packageName": "@changesets/config", - "hash": "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==" - } - }, - "npm:@changesets/errors": { - "type": "npm", - "name": "npm:@changesets/errors", - "data": { - "version": "0.2.0", - "packageName": "@changesets/errors", - "hash": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==" - } - }, - "npm:@changesets/get-dependents-graph": { - "type": "npm", - "name": "npm:@changesets/get-dependents-graph", - "data": { - "version": "2.1.3", - "packageName": "@changesets/get-dependents-graph", - "hash": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==" - } - }, - "npm:@changesets/get-github-info": { - "type": "npm", - "name": "npm:@changesets/get-github-info", - "data": { - "version": "0.6.0", - "packageName": "@changesets/get-github-info", - "hash": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==" - } - }, - "npm:@changesets/get-release-plan": { - "type": "npm", - "name": "npm:@changesets/get-release-plan", - "data": { - "version": "4.0.13", - "packageName": "@changesets/get-release-plan", - "hash": "sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==" - } - }, - "npm:@changesets/get-version-range-type": { - "type": "npm", - "name": "npm:@changesets/get-version-range-type", - "data": { - "version": "0.4.0", - "packageName": "@changesets/get-version-range-type", - "hash": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==" - } - }, - "npm:@changesets/git": { - "type": "npm", - "name": "npm:@changesets/git", - "data": { - "version": "3.0.4", - "packageName": "@changesets/git", - "hash": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==" - } - }, - "npm:@changesets/logger": { - "type": "npm", - "name": "npm:@changesets/logger", - "data": { - "version": "0.1.1", - "packageName": "@changesets/logger", - "hash": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==" - } - }, - "npm:@changesets/parse": { - "type": "npm", - "name": "npm:@changesets/parse", - "data": { - "version": "0.4.1", - "packageName": "@changesets/parse", - "hash": "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==" - } - }, - "npm:@changesets/pre": { - "type": "npm", - "name": "npm:@changesets/pre", - "data": { - "version": "2.0.2", - "packageName": "@changesets/pre", - "hash": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==" - } - }, - "npm:@changesets/read": { - "type": "npm", - "name": "npm:@changesets/read", - "data": { - "version": "0.6.5", - "packageName": "@changesets/read", - "hash": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==" - } - }, - "npm:@changesets/should-skip-package": { - "type": "npm", - "name": "npm:@changesets/should-skip-package", - "data": { - "version": "0.1.2", - "packageName": "@changesets/should-skip-package", - "hash": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==" - } - }, - "npm:@changesets/types@4.1.0": { - "type": "npm", - "name": "npm:@changesets/types@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "@changesets/types", - "hash": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==" - } - }, - "npm:@changesets/types@6.1.0": { - "type": "npm", - "name": "npm:@changesets/types@6.1.0", - "data": { - "version": "6.1.0", - "packageName": "@changesets/types", - "hash": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==" - } - }, - "npm:@changesets/write": { - "type": "npm", - "name": "npm:@changesets/write", - "data": { - "version": "0.4.0", - "packageName": "@changesets/write", - "hash": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==" - } - }, - "npm:@cloudflare/kv-asset-handler": { - "type": "npm", - "name": "npm:@cloudflare/kv-asset-handler", - "data": { - "version": "0.4.0", - "packageName": "@cloudflare/kv-asset-handler", - "hash": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==" - } - }, - "npm:@commitlint/parse": { - "type": "npm", - "name": "npm:@commitlint/parse", - "data": { - "version": "20.0.0", - "packageName": "@commitlint/parse", - "hash": "sha512-j/PHCDX2bGM5xGcWObOvpOc54cXjn9g6xScXzAeOLwTsScaL4Y+qd0pFC6HBwTtrH92NvJQc+2Lx9HFkVi48cg==" - } - }, - "npm:@commitlint/types": { - "type": "npm", - "name": "npm:@commitlint/types", - "data": { - "version": "20.0.0", - "packageName": "@commitlint/types", - "hash": "sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==" - } - }, - "npm:@csstools/color-helpers": { - "type": "npm", - "name": "npm:@csstools/color-helpers", - "data": { - "version": "5.1.0", - "packageName": "@csstools/color-helpers", - "hash": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==" - } - }, - "npm:@csstools/css-calc": { - "type": "npm", - "name": "npm:@csstools/css-calc", - "data": { - "version": "2.1.4", - "packageName": "@csstools/css-calc", - "hash": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==" - } - }, - "npm:@csstools/css-color-parser": { - "type": "npm", - "name": "npm:@csstools/css-color-parser", - "data": { - "version": "3.1.0", - "packageName": "@csstools/css-color-parser", - "hash": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==" - } - }, - "npm:@csstools/css-parser-algorithms": { - "type": "npm", - "name": "npm:@csstools/css-parser-algorithms", - "data": { - "version": "3.0.5", - "packageName": "@csstools/css-parser-algorithms", - "hash": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==" - } - }, - "npm:@csstools/css-syntax-patches-for-csstree": { - "type": "npm", - "name": "npm:@csstools/css-syntax-patches-for-csstree", - "data": { - "version": "1.0.14", - "packageName": "@csstools/css-syntax-patches-for-csstree", - "hash": "sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==" - } - }, - "npm:@csstools/css-tokenizer": { - "type": "npm", - "name": "npm:@csstools/css-tokenizer", - "data": { - "version": "3.0.4", - "packageName": "@csstools/css-tokenizer", - "hash": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==" - } - }, - "npm:@emnapi/core": { - "type": "npm", - "name": "npm:@emnapi/core", - "data": { - "version": "1.6.0", - "packageName": "@emnapi/core", - "hash": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==" - } - }, - "npm:@emnapi/runtime": { - "type": "npm", - "name": "npm:@emnapi/runtime", - "data": { - "version": "1.6.0", - "packageName": "@emnapi/runtime", - "hash": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==" - } - }, - "npm:@emnapi/wasi-threads": { - "type": "npm", - "name": "npm:@emnapi/wasi-threads", - "data": { - "version": "1.1.0", - "packageName": "@emnapi/wasi-threads", - "hash": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==" - } - }, - "npm:@esbuild/aix-ppc64": { - "type": "npm", - "name": "npm:@esbuild/aix-ppc64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/aix-ppc64", - "hash": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==" - } - }, - "npm:@esbuild/android-arm64": { - "type": "npm", - "name": "npm:@esbuild/android-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/android-arm64", - "hash": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==" - } - }, - "npm:@esbuild/android-arm": { - "type": "npm", - "name": "npm:@esbuild/android-arm", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/android-arm", - "hash": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==" - } - }, - "npm:@esbuild/android-x64": { - "type": "npm", - "name": "npm:@esbuild/android-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/android-x64", - "hash": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==" - } - }, - "npm:@esbuild/darwin-arm64": { - "type": "npm", - "name": "npm:@esbuild/darwin-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/darwin-arm64", - "hash": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==" - } - }, - "npm:@esbuild/darwin-x64": { - "type": "npm", - "name": "npm:@esbuild/darwin-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/darwin-x64", - "hash": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==" - } - }, - "npm:@esbuild/freebsd-arm64": { - "type": "npm", - "name": "npm:@esbuild/freebsd-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/freebsd-arm64", - "hash": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==" - } - }, - "npm:@esbuild/freebsd-x64": { - "type": "npm", - "name": "npm:@esbuild/freebsd-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/freebsd-x64", - "hash": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==" - } - }, - "npm:@esbuild/linux-arm64": { - "type": "npm", - "name": "npm:@esbuild/linux-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-arm64", - "hash": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==" - } - }, - "npm:@esbuild/linux-arm": { - "type": "npm", - "name": "npm:@esbuild/linux-arm", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-arm", - "hash": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==" - } - }, - "npm:@esbuild/linux-ia32": { - "type": "npm", - "name": "npm:@esbuild/linux-ia32", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-ia32", - "hash": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==" - } - }, - "npm:@esbuild/linux-loong64": { - "type": "npm", - "name": "npm:@esbuild/linux-loong64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-loong64", - "hash": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==" - } - }, - "npm:@esbuild/linux-mips64el": { - "type": "npm", - "name": "npm:@esbuild/linux-mips64el", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-mips64el", - "hash": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==" - } - }, - "npm:@esbuild/linux-ppc64": { - "type": "npm", - "name": "npm:@esbuild/linux-ppc64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-ppc64", - "hash": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==" - } - }, - "npm:@esbuild/linux-riscv64": { - "type": "npm", - "name": "npm:@esbuild/linux-riscv64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-riscv64", - "hash": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==" - } - }, - "npm:@esbuild/linux-s390x": { - "type": "npm", - "name": "npm:@esbuild/linux-s390x", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-s390x", - "hash": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==" - } - }, - "npm:@esbuild/linux-x64": { - "type": "npm", - "name": "npm:@esbuild/linux-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/linux-x64", - "hash": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==" - } - }, - "npm:@esbuild/netbsd-arm64": { - "type": "npm", - "name": "npm:@esbuild/netbsd-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/netbsd-arm64", - "hash": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==" - } - }, - "npm:@esbuild/netbsd-x64": { - "type": "npm", - "name": "npm:@esbuild/netbsd-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/netbsd-x64", - "hash": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==" - } - }, - "npm:@esbuild/openbsd-arm64": { - "type": "npm", - "name": "npm:@esbuild/openbsd-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/openbsd-arm64", - "hash": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==" - } - }, - "npm:@esbuild/openbsd-x64": { - "type": "npm", - "name": "npm:@esbuild/openbsd-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/openbsd-x64", - "hash": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==" - } - }, - "npm:@esbuild/openharmony-arm64": { - "type": "npm", - "name": "npm:@esbuild/openharmony-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/openharmony-arm64", - "hash": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==" - } - }, - "npm:@esbuild/sunos-x64": { - "type": "npm", - "name": "npm:@esbuild/sunos-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/sunos-x64", - "hash": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==" - } - }, - "npm:@esbuild/win32-arm64": { - "type": "npm", - "name": "npm:@esbuild/win32-arm64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/win32-arm64", - "hash": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==" - } - }, - "npm:@esbuild/win32-ia32": { - "type": "npm", - "name": "npm:@esbuild/win32-ia32", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/win32-ia32", - "hash": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==" - } - }, - "npm:@esbuild/win32-x64": { - "type": "npm", - "name": "npm:@esbuild/win32-x64", - "data": { - "version": "0.25.12", - "packageName": "@esbuild/win32-x64", - "hash": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==" - } - }, - "npm:@eslint-community/eslint-utils": { - "type": "npm", - "name": "npm:@eslint-community/eslint-utils", - "data": { - "version": "4.9.0", - "packageName": "@eslint-community/eslint-utils", - "hash": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==" - } - }, - "npm:@eslint-community/regexpp": { - "type": "npm", - "name": "npm:@eslint-community/regexpp", - "data": { - "version": "4.12.2", - "packageName": "@eslint-community/regexpp", - "hash": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==" - } - }, - "npm:@eslint-react/ast": { - "type": "npm", - "name": "npm:@eslint-react/ast", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/ast", - "hash": "sha512-/RiruPxlQs6CMLJ8tiNT1jV8Zq4u80MTWYkNFz2PP9pht23bdcpngDKFoz8RQYDPt71dwiRURHiQAF75v8bIIw==" - } - }, - "npm:@eslint-react/core": { - "type": "npm", - "name": "npm:@eslint-react/core", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/core", - "hash": "sha512-pIkrGuQWyW/GgrAp0kC7nv/Jn53Xjs1/rbBqUcUYvEZnVKuUifnlXQtnmioOEj9PYsuWuOxAPijExrnNavm73w==" - } - }, - "npm:@eslint-react/eff": { - "type": "npm", - "name": "npm:@eslint-react/eff", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/eff", - "hash": "sha512-pkRWIPnH/jedRn5ZMEA0nDPn5BFuUHKOORbR+hfrAMFp4c3o+1/P1G/eB0vSQvAHAZdPwLZXdgxydz+2rbb8nQ==" - } - }, - "npm:@eslint-react/eslint-plugin": { - "type": "npm", - "name": "npm:@eslint-react/eslint-plugin", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/eslint-plugin", - "hash": "sha512-wKeXNa0vc8ACmvBoZPnRZ+s/z0KEmMKRxpOfRthcBvd0TPMIprohT/uwBXd8k15/j3CmaYe74pJFVVagJY3U3g==" - } - }, - "npm:@eslint-react/shared": { - "type": "npm", - "name": "npm:@eslint-react/shared", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/shared", - "hash": "sha512-LVtD76ycDC7D4OFKDQ8jyATTVxz986J+e9nzydyEUtEf1l+WYiOivPBeJUAs6JEySBl24nO76oEHDABw6l4hig==" - } - }, - "npm:@eslint-react/var": { - "type": "npm", - "name": "npm:@eslint-react/var", - "data": { - "version": "2.3.9", - "packageName": "@eslint-react/var", - "hash": "sha512-Bc36K8Lw6KV/5NMaEaFS7as4kgSgZ1wElFejgUEBPZnhUVmq2mITV1BsnMoMYM4jojnkMN80WNALyhONjOx9Jw==" - } - }, - "npm:@eslint/config-array": { - "type": "npm", - "name": "npm:@eslint/config-array", - "data": { - "version": "0.21.1", - "packageName": "@eslint/config-array", - "hash": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==" - } - }, - "npm:@eslint/config-helpers": { - "type": "npm", - "name": "npm:@eslint/config-helpers", - "data": { - "version": "0.4.2", - "packageName": "@eslint/config-helpers", - "hash": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==" - } - }, - "npm:@eslint/core": { - "type": "npm", - "name": "npm:@eslint/core", - "data": { - "version": "0.17.0", - "packageName": "@eslint/core", - "hash": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==" - } - }, - "npm:@eslint/eslintrc": { - "type": "npm", - "name": "npm:@eslint/eslintrc", - "data": { - "version": "3.3.1", - "packageName": "@eslint/eslintrc", - "hash": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==" - } - }, - "npm:@eslint/js": { - "type": "npm", - "name": "npm:@eslint/js", - "data": { - "version": "9.39.1", - "packageName": "@eslint/js", - "hash": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==" - } - }, - "npm:@eslint/object-schema": { - "type": "npm", - "name": "npm:@eslint/object-schema", - "data": { - "version": "2.1.7", - "packageName": "@eslint/object-schema", - "hash": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==" - } - }, - "npm:@eslint/plugin-kit": { - "type": "npm", - "name": "npm:@eslint/plugin-kit", - "data": { - "version": "0.4.1", - "packageName": "@eslint/plugin-kit", - "hash": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==" - } - }, - "npm:@faker-js/faker": { - "type": "npm", - "name": "npm:@faker-js/faker", - "data": { - "version": "10.1.0", - "packageName": "@faker-js/faker", - "hash": "sha512-C3mrr3b5dRVlKPJdfrAXS8+dq+rq8Qm5SNRazca0JKgw1HQERFmrVb0towvMmw5uu8hHKNiQasMaR/tydf3Zsg==" - } - }, - "npm:@gerrit0/mini-shiki": { - "type": "npm", - "name": "npm:@gerrit0/mini-shiki", - "data": { - "version": "3.15.0", - "packageName": "@gerrit0/mini-shiki", - "hash": "sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ==" - } - }, - "npm:@google/genai": { - "type": "npm", - "name": "npm:@google/genai", - "data": { - "version": "1.30.0", - "packageName": "@google/genai", - "hash": "sha512-3MRcgczBFbUat1wIlZoLJ0vCCfXgm7Qxjh59cZi2X08RgWLtm9hKOspzp7TOg1TV2e26/MLxR2GR5yD5GmBV2w==" - } - }, - "npm:@humanfs/core": { - "type": "npm", - "name": "npm:@humanfs/core", - "data": { - "version": "0.19.1", - "packageName": "@humanfs/core", - "hash": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==" - } - }, - "npm:@humanfs/node": { - "type": "npm", - "name": "npm:@humanfs/node", - "data": { - "version": "0.16.7", - "packageName": "@humanfs/node", - "hash": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==" - } - }, - "npm:@humanwhocodes/module-importer": { - "type": "npm", - "name": "npm:@humanwhocodes/module-importer", - "data": { - "version": "1.0.1", - "packageName": "@humanwhocodes/module-importer", - "hash": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" - } - }, - "npm:@humanwhocodes/retry": { - "type": "npm", - "name": "npm:@humanwhocodes/retry", - "data": { - "version": "0.4.3", - "packageName": "@humanwhocodes/retry", - "hash": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==" - } - }, - "npm:@inquirer/external-editor": { - "type": "npm", - "name": "npm:@inquirer/external-editor", - "data": { - "version": "1.0.3", - "packageName": "@inquirer/external-editor", - "hash": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==" - } - }, - "npm:@ioredis/commands": { - "type": "npm", - "name": "npm:@ioredis/commands", - "data": { - "version": "1.4.0", - "packageName": "@ioredis/commands", - "hash": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==" - } - }, - "npm:@isaacs/cliui": { - "type": "npm", - "name": "npm:@isaacs/cliui", - "data": { - "version": "8.0.2", - "packageName": "@isaacs/cliui", - "hash": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==" - } - }, - "npm:@isaacs/fs-minipass": { - "type": "npm", - "name": "npm:@isaacs/fs-minipass", - "data": { - "version": "4.0.1", - "packageName": "@isaacs/fs-minipass", - "hash": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==" - } - }, - "npm:@jest/diff-sequences": { - "type": "npm", - "name": "npm:@jest/diff-sequences", - "data": { - "version": "30.0.1", - "packageName": "@jest/diff-sequences", - "hash": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==" - } - }, - "npm:@jest/get-type": { - "type": "npm", - "name": "npm:@jest/get-type", - "data": { - "version": "30.1.0", - "packageName": "@jest/get-type", - "hash": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==" - } - }, - "npm:@jest/schemas": { - "type": "npm", - "name": "npm:@jest/schemas", - "data": { - "version": "30.0.5", - "packageName": "@jest/schemas", - "hash": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==" - } - }, - "npm:@jridgewell/gen-mapping": { - "type": "npm", - "name": "npm:@jridgewell/gen-mapping", - "data": { - "version": "0.3.13", - "packageName": "@jridgewell/gen-mapping", - "hash": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==" - } - }, - "npm:@jridgewell/remapping": { - "type": "npm", - "name": "npm:@jridgewell/remapping", - "data": { - "version": "2.3.5", - "packageName": "@jridgewell/remapping", - "hash": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==" - } - }, - "npm:@jridgewell/resolve-uri": { - "type": "npm", - "name": "npm:@jridgewell/resolve-uri", - "data": { - "version": "3.1.2", - "packageName": "@jridgewell/resolve-uri", - "hash": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" - } - }, - "npm:@jridgewell/source-map": { - "type": "npm", - "name": "npm:@jridgewell/source-map", - "data": { - "version": "0.3.11", - "packageName": "@jridgewell/source-map", - "hash": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==" - } - }, - "npm:@jridgewell/sourcemap-codec": { - "type": "npm", - "name": "npm:@jridgewell/sourcemap-codec", - "data": { - "version": "1.5.5", - "packageName": "@jridgewell/sourcemap-codec", - "hash": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - } - }, - "npm:@jridgewell/trace-mapping": { - "type": "npm", - "name": "npm:@jridgewell/trace-mapping", - "data": { - "version": "0.3.31", - "packageName": "@jridgewell/trace-mapping", - "hash": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==" - } - }, - "npm:@kwsites/file-exists": { - "type": "npm", - "name": "npm:@kwsites/file-exists", - "data": { - "version": "1.1.1", - "packageName": "@kwsites/file-exists", - "hash": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==" - } - }, - "npm:@kwsites/promise-deferred": { - "type": "npm", - "name": "npm:@kwsites/promise-deferred", - "data": { - "version": "1.1.1", - "packageName": "@kwsites/promise-deferred", - "hash": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" - } - }, - "npm:@manypkg/find-root": { - "type": "npm", - "name": "npm:@manypkg/find-root", - "data": { - "version": "1.1.0", - "packageName": "@manypkg/find-root", - "hash": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==" - } - }, - "npm:@manypkg/get-packages": { - "type": "npm", - "name": "npm:@manypkg/get-packages", - "data": { - "version": "1.1.3", - "packageName": "@manypkg/get-packages", - "hash": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==" - } - }, - "npm:@mapbox/node-pre-gyp": { - "type": "npm", - "name": "npm:@mapbox/node-pre-gyp", - "data": { - "version": "2.0.0", - "packageName": "@mapbox/node-pre-gyp", - "hash": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==" - } - }, - "npm:@microsoft/api-extractor-model": { - "type": "npm", - "name": "npm:@microsoft/api-extractor-model", - "data": { - "version": "7.29.6", - "packageName": "@microsoft/api-extractor-model", - "hash": "sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==" - } - }, - "npm:@microsoft/api-extractor": { - "type": "npm", - "name": "npm:@microsoft/api-extractor", - "data": { - "version": "7.47.7", - "packageName": "@microsoft/api-extractor", - "hash": "sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==" - } - }, - "npm:@microsoft/tsdoc-config": { - "type": "npm", - "name": "npm:@microsoft/tsdoc-config", - "data": { - "version": "0.17.1", - "packageName": "@microsoft/tsdoc-config", - "hash": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==" - } - }, - "npm:@microsoft/tsdoc": { - "type": "npm", - "name": "npm:@microsoft/tsdoc", - "data": { - "version": "0.15.1", - "packageName": "@microsoft/tsdoc", - "hash": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==" - } - }, - "npm:@napi-rs/wasm-runtime@0.2.12": { - "type": "npm", - "name": "npm:@napi-rs/wasm-runtime@0.2.12", - "data": { - "version": "0.2.12", - "packageName": "@napi-rs/wasm-runtime", - "hash": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==" - } - }, - "npm:@napi-rs/wasm-runtime@0.2.4": { - "type": "npm", - "name": "npm:@napi-rs/wasm-runtime@0.2.4", - "data": { - "version": "0.2.4", - "packageName": "@napi-rs/wasm-runtime", - "hash": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==" - } - }, - "npm:@napi-rs/wasm-runtime@1.0.7": { - "type": "npm", - "name": "npm:@napi-rs/wasm-runtime@1.0.7", - "data": { - "version": "1.0.7", - "packageName": "@napi-rs/wasm-runtime", - "hash": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==" - } - }, - "npm:@nodelib/fs.scandir": { - "type": "npm", - "name": "npm:@nodelib/fs.scandir", - "data": { - "version": "2.1.5", - "packageName": "@nodelib/fs.scandir", - "hash": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - } - }, - "npm:@nodelib/fs.stat": { - "type": "npm", - "name": "npm:@nodelib/fs.stat", - "data": { - "version": "2.0.5", - "packageName": "@nodelib/fs.stat", - "hash": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - } - }, - "npm:@nodelib/fs.walk": { - "type": "npm", - "name": "npm:@nodelib/fs.walk", - "data": { - "version": "1.2.8", - "packageName": "@nodelib/fs.walk", - "hash": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - } - }, - "npm:@nx/nx-darwin-arm64": { - "type": "npm", - "name": "npm:@nx/nx-darwin-arm64", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-darwin-arm64", - "hash": "sha512-xT6U9oRjze9QTLp8ieoNOno6GHA5S2R36tzergMfTevCTnpJBE0GX8vtI6fmcK3NkVmbdPI9Vb/FmBPcvD9eEQ==" - } - }, - "npm:@nx/nx-darwin-x64": { - "type": "npm", - "name": "npm:@nx/nx-darwin-x64", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-darwin-x64", - "hash": "sha512-20n1KPgPNV4gym3rzs/vgDJb0ybNIHuVYU+5m6/+ee5jZNApa5Ivi5Kqpm1RKLiKYgcm97ZbWbGi/K0CXqt1dw==" - } - }, - "npm:@nx/nx-freebsd-x64": { - "type": "npm", - "name": "npm:@nx/nx-freebsd-x64", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-freebsd-x64", - "hash": "sha512-Z1AMFUuT1MAay09s0MWSRBdb9fY0DVwOm2TnvLRc1zJ2eMVnbK+Z2NMMOMM10udyogLbxGUHefbl+HtAAcJdxQ==" - } - }, - "npm:@nx/nx-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@nx/nx-linux-arm-gnueabihf", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-arm-gnueabihf", - "hash": "sha512-bR82Id9frpz4GbxXXMsiXAQZ6tI7d3Veifyqj6th/9A3/UyZR4YKYpGm2QEsm0hp4n3BO8K5JxCxhGDgp5YwVg==" - } - }, - "npm:@nx/nx-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@nx/nx-linux-arm64-gnu", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-arm64-gnu", - "hash": "sha512-K6l/qa1rUM1saFlcT/KnJfhRtLyPkpYCxWGNYaMQ3gEFozPCHYdAJUQ+sKS8kVyWt2anAWx2XkmXUaz04OB8BQ==" - } - }, - "npm:@nx/nx-linux-arm64-musl": { - "type": "npm", - "name": "npm:@nx/nx-linux-arm64-musl", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-arm64-musl", - "hash": "sha512-vZUAUsaop5fdcyWpYzED+hWTKOuDtwG9DNNYUlII0dZhSA8kZwmXoYmrCGeMe5nQX9tF4pNzF+oddC/E169Z6g==" - } - }, - "npm:@nx/nx-linux-x64-gnu": { - "type": "npm", - "name": "npm:@nx/nx-linux-x64-gnu", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-x64-gnu", - "hash": "sha512-+NiA5uNh1cdpk2k984NlfIxRXaO0Bu0S4qCvWWKmL/150f31qJ/eHN6rd78/Re2qKO1NDoyDZLW6jqRXIm/GgA==" - } - }, - "npm:@nx/nx-linux-x64-musl": { - "type": "npm", - "name": "npm:@nx/nx-linux-x64-musl", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-linux-x64-musl", - "hash": "sha512-8O7dXems/Of/biCKeuGMh3nmbS2PNvaL8R4xQzaBl94XitzFMxVFjjoTST7y3Ksmsa5Wrbzwyh+kHOMoIMlVpA==" - } - }, - "npm:@nx/nx-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@nx/nx-win32-arm64-msvc", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-win32-arm64-msvc", - "hash": "sha512-/Wt3kdj5BksswSWL4N8tef6B+d5r0LbdEPqZimx3AqDMC9H1YkVuwwdBWFGOh+ldj/N8adRuZKjEMQfa/oqPGg==" - } - }, - "npm:@nx/nx-win32-x64-msvc": { - "type": "npm", - "name": "npm:@nx/nx-win32-x64-msvc", - "data": { - "version": "22.1.2", - "packageName": "@nx/nx-win32-x64-msvc", - "hash": "sha512-vihs1hIVMyQYoKul5rfwvU+4WKhbajJ8lSUTVvxjV2j+8F0BYMvRQtB2jDZfBpjEpSBmgP4ApIsLkQzQQBzLug==" - } - }, - "npm:@oozcitak/dom": { - "type": "npm", - "name": "npm:@oozcitak/dom", - "data": { - "version": "2.0.2", - "packageName": "@oozcitak/dom", - "hash": "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==" - } - }, - "npm:@oozcitak/infra": { - "type": "npm", - "name": "npm:@oozcitak/infra", - "data": { - "version": "2.0.2", - "packageName": "@oozcitak/infra", - "hash": "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==" - } - }, - "npm:@oozcitak/url": { - "type": "npm", - "name": "npm:@oozcitak/url", - "data": { - "version": "3.0.0", - "packageName": "@oozcitak/url", - "hash": "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==" - } - }, - "npm:@oozcitak/util": { - "type": "npm", - "name": "npm:@oozcitak/util", - "data": { - "version": "10.0.0", - "packageName": "@oozcitak/util", - "hash": "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==" - } - }, - "npm:@oxc-project/types": { - "type": "npm", - "name": "npm:@oxc-project/types", - "data": { - "version": "0.98.0", - "packageName": "@oxc-project/types", - "hash": "sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==" - } - }, - "npm:@oxc-resolver/binding-android-arm-eabi": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-android-arm-eabi", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-android-arm-eabi", - "hash": "sha512-jB47iZ/thvhE+USCLv+XY3IknBbkKr/p7OBsQDTHode/GPw+OHRlit3NQ1bjt1Mj8V2CS7iHdSDYobZ1/0gagQ==" - } - }, - "npm:@oxc-resolver/binding-android-arm64": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-android-arm64", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-android-arm64", - "hash": "sha512-XFJ9t7d/Cz+dWLyqtTy3Xrekz+qqN4hmOU2iOUgr7u71OQsPUHIIeS9/wKanEK0l413gPwapIkyc5x9ltlOtyw==" - } - }, - "npm:@oxc-resolver/binding-darwin-arm64": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-darwin-arm64", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-darwin-arm64", - "hash": "sha512-gwehBS9smA1mzK8frDsmUCHz+6baJVwkKF6qViHhoqA3kRKvIZ3k6WNP4JmF19JhOiGxRcoPa8gZRfzNgXwP2A==" - } - }, - "npm:@oxc-resolver/binding-darwin-x64": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-darwin-x64", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-darwin-x64", - "hash": "sha512-5wwJvfuoahKiAqqAsMLOI28rqdh3P2K7HkjIWUXNMWAZq6ErX0L5rwJzu6T32+Zxw3k18C7R9IS4wDq/3Ar+6w==" - } - }, - "npm:@oxc-resolver/binding-freebsd-x64": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-freebsd-x64", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-freebsd-x64", - "hash": "sha512-MWTt+LOQNcQ6fa+Uu5VikkihLi1PSIrQqqp0QD44k2AORasNWl0jRGBTcMSBIgNe82qEQWYvlGzvOEEOBp01Og==" - } - }, - "npm:@oxc-resolver/binding-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-arm-gnueabihf", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-arm-gnueabihf", - "hash": "sha512-b6/IBqYrS3o0XiLVBsnex/wK8pTTK+hbGfAMOHVU6p7DBpwPPLgC/tav4IXoOIUCssTFz7aWh/xtUok0swn8VQ==" - } - }, - "npm:@oxc-resolver/binding-linux-arm-musleabihf": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-arm-musleabihf", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-arm-musleabihf", - "hash": "sha512-o2Qh5+y5YoqVK6YfzkalHdpmQ5bkbGGxuLg1pZLQ1Ift0x+Vix7DaFEpdCl5Z9xvYXogd/TwOlL0TPl4+MTFLA==" - } - }, - "npm:@oxc-resolver/binding-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-arm64-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-arm64-gnu", - "hash": "sha512-lk8mCSg0Tg4sEG73RiPjb7keGcEPwqQnBHX3Z+BR2SWe+qNHpoHcyFMNafzSvEC18vlxC04AUSoa6kJl/C5zig==" - } - }, - "npm:@oxc-resolver/binding-linux-arm64-musl": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-arm64-musl", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-arm64-musl", - "hash": "sha512-KykeIVhCM7pn93ABa0fNe8vk4XvnbfZMELne2s6P9tdJH9KMBsCFBi7a2BmSdUtTqWCAJokAcm46lpczU52Xaw==" - } - }, - "npm:@oxc-resolver/binding-linux-ppc64-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-ppc64-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-ppc64-gnu", - "hash": "sha512-QqPPWAcZU/jHAuam4f3zV8OdEkYRPD2XR0peVet3hoMMgsihR3Lhe7J/bLclmod297FG0+OgBYQVMh2nTN6oWA==" - } - }, - "npm:@oxc-resolver/binding-linux-riscv64-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-riscv64-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-riscv64-gnu", - "hash": "sha512-DunWA+wafeG3hj1NADUD3c+DRvmyVNqF5LSHVUWA2bzswqmuEZXl3VYBSzxfD0j+UnRTFYLxf27AMptoMsepYg==" - } - }, - "npm:@oxc-resolver/binding-linux-riscv64-musl": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-riscv64-musl", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-riscv64-musl", - "hash": "sha512-4SRvwKTTk2k67EQr9Ny4NGf/BhlwggCI1CXwBbA9IV4oP38DH8b+NAPxDY0ySGRsWbPkG92FYOqM4AWzG4GSgA==" - } - }, - "npm:@oxc-resolver/binding-linux-s390x-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-s390x-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-s390x-gnu", - "hash": "sha512-hZKvkbsurj4JOom//R1Ab2MlC4cGeVm5zzMt4IsS3XySQeYjyMJ5TDZ3J5rQ8bVj3xi4FpJU2yFZ72GApsHQ6A==" - } - }, - "npm:@oxc-resolver/binding-linux-x64-gnu": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-x64-gnu", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-x64-gnu", - "hash": "sha512-hABxQXFXJurivw+0amFdeEcK67cF1BGBIN1+sSHzq3TRv4RoG8n5q2JE04Le2n2Kpt6xg4Y5+lcv+rb2mCJLgQ==" - } - }, - "npm:@oxc-resolver/binding-linux-x64-musl": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-linux-x64-musl", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-linux-x64-musl", - "hash": "sha512-Ln73wUB5migZRvC7obAAdqVwvFvk7AUs2JLt4g9QHr8FnqivlsjpUC9Nf2ssrybdjyQzEMjttUxPZz6aKPSAHw==" - } - }, - "npm:@oxc-resolver/binding-wasm32-wasi": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-wasm32-wasi", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-wasm32-wasi", - "hash": "sha512-z+NbELmCOKNtWOqEB5qDfHXOSWB3kGQIIehq6nHtZwHLzdVO2oBq6De/ayhY3ygriC1XhgaIzzniY7jgrNl4Kw==" - } - }, - "npm:@oxc-resolver/binding-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-win32-arm64-msvc", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-win32-arm64-msvc", - "hash": "sha512-Ft0+qd7HSO61qCTLJ4LCdBGZkpKyDj1rG0OVSZL1DxWQoh97m7vEHd7zAvUtw8EcWjOMBQuX4mfRap/x2MOCpQ==" - } - }, - "npm:@oxc-resolver/binding-win32-ia32-msvc": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-win32-ia32-msvc", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-win32-ia32-msvc", - "hash": "sha512-o54jYNSfGdPxHSvXEhZg8FOV3K99mJ1f7hb1alRFb+Yec1GQXNrJXxZPIxNMYeFT13kwAWB7zuQ0HZLnDHFxfw==" - } - }, - "npm:@oxc-resolver/binding-win32-x64-msvc": { - "type": "npm", - "name": "npm:@oxc-resolver/binding-win32-x64-msvc", - "data": { - "version": "11.14.0", - "packageName": "@oxc-resolver/binding-win32-x64-msvc", - "hash": "sha512-j97icaORyM6A7GjgmUzfn7V+KGzVvctRA+eAlJb0c2OQNaETFxl6BXZdnGBDb+6oA0Y4Sr/wnekd1kQ0aVyKGg==" - } - }, - "npm:@parcel/watcher-android-arm64": { - "type": "npm", - "name": "npm:@parcel/watcher-android-arm64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-android-arm64", - "hash": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==" - } - }, - "npm:@parcel/watcher-darwin-arm64": { - "type": "npm", - "name": "npm:@parcel/watcher-darwin-arm64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-darwin-arm64", - "hash": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==" - } - }, - "npm:@parcel/watcher-darwin-x64": { - "type": "npm", - "name": "npm:@parcel/watcher-darwin-x64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-darwin-x64", - "hash": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==" - } - }, - "npm:@parcel/watcher-freebsd-x64": { - "type": "npm", - "name": "npm:@parcel/watcher-freebsd-x64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-freebsd-x64", - "hash": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==" - } - }, - "npm:@parcel/watcher-linux-arm-glibc": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-arm-glibc", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-arm-glibc", - "hash": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==" - } - }, - "npm:@parcel/watcher-linux-arm-musl": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-arm-musl", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-arm-musl", - "hash": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==" - } - }, - "npm:@parcel/watcher-linux-arm64-glibc": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-arm64-glibc", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-arm64-glibc", - "hash": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==" - } - }, - "npm:@parcel/watcher-linux-arm64-musl": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-arm64-musl", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-arm64-musl", - "hash": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==" - } - }, - "npm:@parcel/watcher-linux-x64-glibc": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-x64-glibc", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-x64-glibc", - "hash": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==" - } - }, - "npm:@parcel/watcher-linux-x64-musl": { - "type": "npm", - "name": "npm:@parcel/watcher-linux-x64-musl", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-linux-x64-musl", - "hash": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==" - } - }, - "npm:@parcel/watcher-wasm": { - "type": "npm", - "name": "npm:@parcel/watcher-wasm", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-wasm", - "hash": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==" - } - }, - "npm:@parcel/watcher-win32-arm64": { - "type": "npm", - "name": "npm:@parcel/watcher-win32-arm64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-win32-arm64", - "hash": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==" - } - }, - "npm:@parcel/watcher-win32-ia32": { - "type": "npm", - "name": "npm:@parcel/watcher-win32-ia32", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-win32-ia32", - "hash": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==" - } - }, - "npm:@parcel/watcher-win32-x64": { - "type": "npm", - "name": "npm:@parcel/watcher-win32-x64", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher-win32-x64", - "hash": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==" - } - }, - "npm:@parcel/watcher": { - "type": "npm", - "name": "npm:@parcel/watcher", - "data": { - "version": "2.5.1", - "packageName": "@parcel/watcher", - "hash": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==" - } - }, - "npm:@pkgjs/parseargs": { - "type": "npm", - "name": "npm:@pkgjs/parseargs", - "data": { - "version": "0.11.0", - "packageName": "@pkgjs/parseargs", - "hash": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==" - } - }, - "npm:@poppinss/colors": { - "type": "npm", - "name": "npm:@poppinss/colors", - "data": { - "version": "4.1.5", - "packageName": "@poppinss/colors", - "hash": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==" - } - }, - "npm:@poppinss/dumper": { - "type": "npm", - "name": "npm:@poppinss/dumper", - "data": { - "version": "0.6.4", - "packageName": "@poppinss/dumper", - "hash": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==" - } - }, - "npm:@poppinss/exception": { - "type": "npm", - "name": "npm:@poppinss/exception", - "data": { - "version": "1.2.2", - "packageName": "@poppinss/exception", - "hash": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==" - } - }, - "npm:@publint/pack": { - "type": "npm", - "name": "npm:@publint/pack", - "data": { - "version": "0.1.2", - "packageName": "@publint/pack", - "hash": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==" - } - }, - "npm:@rolldown/binding-android-arm64": { - "type": "npm", - "name": "npm:@rolldown/binding-android-arm64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-android-arm64", - "hash": "sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==" - } - }, - "npm:@rolldown/binding-darwin-arm64": { - "type": "npm", - "name": "npm:@rolldown/binding-darwin-arm64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-darwin-arm64", - "hash": "sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==" - } - }, - "npm:@rolldown/binding-darwin-x64": { - "type": "npm", - "name": "npm:@rolldown/binding-darwin-x64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-darwin-x64", - "hash": "sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==" - } - }, - "npm:@rolldown/binding-freebsd-x64": { - "type": "npm", - "name": "npm:@rolldown/binding-freebsd-x64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-freebsd-x64", - "hash": "sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==" - } - }, - "npm:@rolldown/binding-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-arm-gnueabihf", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-arm-gnueabihf", - "hash": "sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==" - } - }, - "npm:@rolldown/binding-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-arm64-gnu", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-arm64-gnu", - "hash": "sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==" - } - }, - "npm:@rolldown/binding-linux-arm64-musl": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-arm64-musl", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-arm64-musl", - "hash": "sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==" - } - }, - "npm:@rolldown/binding-linux-x64-gnu": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-x64-gnu", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-x64-gnu", - "hash": "sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==" - } - }, - "npm:@rolldown/binding-linux-x64-musl": { - "type": "npm", - "name": "npm:@rolldown/binding-linux-x64-musl", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-linux-x64-musl", - "hash": "sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==" - } - }, - "npm:@rolldown/binding-openharmony-arm64": { - "type": "npm", - "name": "npm:@rolldown/binding-openharmony-arm64", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-openharmony-arm64", - "hash": "sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==" - } - }, - "npm:@rolldown/binding-wasm32-wasi": { - "type": "npm", - "name": "npm:@rolldown/binding-wasm32-wasi", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-wasm32-wasi", - "hash": "sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==" - } - }, - "npm:@rolldown/binding-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@rolldown/binding-win32-arm64-msvc", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-win32-arm64-msvc", - "hash": "sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==" - } - }, - "npm:@rolldown/binding-win32-ia32-msvc": { - "type": "npm", - "name": "npm:@rolldown/binding-win32-ia32-msvc", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-win32-ia32-msvc", - "hash": "sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==" - } - }, - "npm:@rolldown/binding-win32-x64-msvc": { - "type": "npm", - "name": "npm:@rolldown/binding-win32-x64-msvc", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/binding-win32-x64-msvc", - "hash": "sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==" - } - }, - "npm:@rolldown/pluginutils@1.0.0-beta.40": { - "type": "npm", - "name": "npm:@rolldown/pluginutils@1.0.0-beta.40", - "data": { - "version": "1.0.0-beta.40", - "packageName": "@rolldown/pluginutils", - "hash": "sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==" - } - }, - "npm:@rolldown/pluginutils@1.0.0-beta.47": { - "type": "npm", - "name": "npm:@rolldown/pluginutils@1.0.0-beta.47", - "data": { - "version": "1.0.0-beta.47", - "packageName": "@rolldown/pluginutils", - "hash": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==" - } - }, - "npm:@rolldown/pluginutils@1.0.0-beta.51": { - "type": "npm", - "name": "npm:@rolldown/pluginutils@1.0.0-beta.51", - "data": { - "version": "1.0.0-beta.51", - "packageName": "@rolldown/pluginutils", - "hash": "sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==" - } - }, - "npm:@rollup/plugin-alias": { - "type": "npm", - "name": "npm:@rollup/plugin-alias", - "data": { - "version": "5.1.1", - "packageName": "@rollup/plugin-alias", - "hash": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==" - } - }, - "npm:@rollup/plugin-commonjs": { - "type": "npm", - "name": "npm:@rollup/plugin-commonjs", - "data": { - "version": "28.0.9", - "packageName": "@rollup/plugin-commonjs", - "hash": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==" - } - }, - "npm:@rollup/plugin-inject": { - "type": "npm", - "name": "npm:@rollup/plugin-inject", - "data": { - "version": "5.0.5", - "packageName": "@rollup/plugin-inject", - "hash": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==" - } - }, - "npm:@rollup/plugin-json": { - "type": "npm", - "name": "npm:@rollup/plugin-json", - "data": { - "version": "6.1.0", - "packageName": "@rollup/plugin-json", - "hash": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==" - } - }, - "npm:@rollup/plugin-node-resolve": { - "type": "npm", - "name": "npm:@rollup/plugin-node-resolve", - "data": { - "version": "16.0.3", - "packageName": "@rollup/plugin-node-resolve", - "hash": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==" - } - }, - "npm:@rollup/plugin-replace": { - "type": "npm", - "name": "npm:@rollup/plugin-replace", - "data": { - "version": "6.0.3", - "packageName": "@rollup/plugin-replace", - "hash": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==" - } - }, - "npm:@rollup/plugin-terser": { - "type": "npm", - "name": "npm:@rollup/plugin-terser", - "data": { - "version": "0.4.4", - "packageName": "@rollup/plugin-terser", - "hash": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==" - } - }, - "npm:@rollup/pluginutils": { - "type": "npm", - "name": "npm:@rollup/pluginutils", - "data": { - "version": "5.3.0", - "packageName": "@rollup/pluginutils", - "hash": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==" - } - }, - "npm:@rollup/rollup-android-arm-eabi": { - "type": "npm", - "name": "npm:@rollup/rollup-android-arm-eabi", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-android-arm-eabi", - "hash": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==" - } - }, - "npm:@rollup/rollup-android-arm64": { - "type": "npm", - "name": "npm:@rollup/rollup-android-arm64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-android-arm64", - "hash": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==" - } - }, - "npm:@rollup/rollup-darwin-arm64": { - "type": "npm", - "name": "npm:@rollup/rollup-darwin-arm64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-darwin-arm64", - "hash": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==" - } - }, - "npm:@rollup/rollup-darwin-x64": { - "type": "npm", - "name": "npm:@rollup/rollup-darwin-x64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-darwin-x64", - "hash": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==" - } - }, - "npm:@rollup/rollup-freebsd-arm64": { - "type": "npm", - "name": "npm:@rollup/rollup-freebsd-arm64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-freebsd-arm64", - "hash": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==" - } - }, - "npm:@rollup/rollup-freebsd-x64": { - "type": "npm", - "name": "npm:@rollup/rollup-freebsd-x64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-freebsd-x64", - "hash": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==" - } - }, - "npm:@rollup/rollup-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-arm-gnueabihf", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-arm-gnueabihf", - "hash": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==" - } - }, - "npm:@rollup/rollup-linux-arm-musleabihf": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-arm-musleabihf", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-arm-musleabihf", - "hash": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==" - } - }, - "npm:@rollup/rollup-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-arm64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-arm64-gnu", - "hash": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==" - } - }, - "npm:@rollup/rollup-linux-arm64-musl": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-arm64-musl", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-arm64-musl", - "hash": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==" - } - }, - "npm:@rollup/rollup-linux-loong64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-loong64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-loong64-gnu", - "hash": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==" - } - }, - "npm:@rollup/rollup-linux-ppc64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-ppc64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-ppc64-gnu", - "hash": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==" - } - }, - "npm:@rollup/rollup-linux-riscv64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-riscv64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-riscv64-gnu", - "hash": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==" - } - }, - "npm:@rollup/rollup-linux-riscv64-musl": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-riscv64-musl", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-riscv64-musl", - "hash": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==" - } - }, - "npm:@rollup/rollup-linux-s390x-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-s390x-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-s390x-gnu", - "hash": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==" - } - }, - "npm:@rollup/rollup-linux-x64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-x64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-x64-gnu", - "hash": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==" - } - }, - "npm:@rollup/rollup-linux-x64-musl": { - "type": "npm", - "name": "npm:@rollup/rollup-linux-x64-musl", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-linux-x64-musl", - "hash": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==" - } - }, - "npm:@rollup/rollup-openharmony-arm64": { - "type": "npm", - "name": "npm:@rollup/rollup-openharmony-arm64", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-openharmony-arm64", - "hash": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==" - } - }, - "npm:@rollup/rollup-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@rollup/rollup-win32-arm64-msvc", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-win32-arm64-msvc", - "hash": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==" - } - }, - "npm:@rollup/rollup-win32-ia32-msvc": { - "type": "npm", - "name": "npm:@rollup/rollup-win32-ia32-msvc", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-win32-ia32-msvc", - "hash": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==" - } - }, - "npm:@rollup/rollup-win32-x64-gnu": { - "type": "npm", - "name": "npm:@rollup/rollup-win32-x64-gnu", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-win32-x64-gnu", - "hash": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==" - } - }, - "npm:@rollup/rollup-win32-x64-msvc": { - "type": "npm", - "name": "npm:@rollup/rollup-win32-x64-msvc", - "data": { - "version": "4.53.3", - "packageName": "@rollup/rollup-win32-x64-msvc", - "hash": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==" - } - }, - "npm:@rushstack/node-core-library": { - "type": "npm", - "name": "npm:@rushstack/node-core-library", - "data": { - "version": "5.7.0", - "packageName": "@rushstack/node-core-library", - "hash": "sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==" - } - }, - "npm:@rushstack/rig-package": { - "type": "npm", - "name": "npm:@rushstack/rig-package", - "data": { - "version": "0.5.3", - "packageName": "@rushstack/rig-package", - "hash": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==" - } - }, - "npm:@rushstack/terminal": { - "type": "npm", - "name": "npm:@rushstack/terminal", - "data": { - "version": "0.14.0", - "packageName": "@rushstack/terminal", - "hash": "sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==" - } - }, - "npm:@rushstack/ts-command-line": { - "type": "npm", - "name": "npm:@rushstack/ts-command-line", - "data": { - "version": "4.22.6", - "packageName": "@rushstack/ts-command-line", - "hash": "sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==" - } - }, - "npm:@shikijs/engine-oniguruma": { - "type": "npm", - "name": "npm:@shikijs/engine-oniguruma", - "data": { - "version": "3.15.0", - "packageName": "@shikijs/engine-oniguruma", - "hash": "sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==" - } - }, - "npm:@shikijs/langs": { - "type": "npm", - "name": "npm:@shikijs/langs", - "data": { - "version": "3.15.0", - "packageName": "@shikijs/langs", - "hash": "sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==" - } - }, - "npm:@shikijs/themes": { - "type": "npm", - "name": "npm:@shikijs/themes", - "data": { - "version": "3.15.0", - "packageName": "@shikijs/themes", - "hash": "sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==" - } - }, - "npm:@shikijs/types": { - "type": "npm", - "name": "npm:@shikijs/types", - "data": { - "version": "3.15.0", - "packageName": "@shikijs/types", - "hash": "sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==" - } - }, - "npm:@shikijs/vscode-textmate": { - "type": "npm", - "name": "npm:@shikijs/vscode-textmate", - "data": { - "version": "10.0.2", - "packageName": "@shikijs/vscode-textmate", - "hash": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" - } - }, - "npm:@sinclair/typebox": { - "type": "npm", - "name": "npm:@sinclair/typebox", - "data": { - "version": "0.34.41", - "packageName": "@sinclair/typebox", - "hash": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==" - } - }, - "npm:@sindresorhus/is": { - "type": "npm", - "name": "npm:@sindresorhus/is", - "data": { - "version": "7.1.1", - "packageName": "@sindresorhus/is", - "hash": "sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==" - } - }, - "npm:@sindresorhus/merge-streams": { - "type": "npm", - "name": "npm:@sindresorhus/merge-streams", - "data": { - "version": "4.0.0", - "packageName": "@sindresorhus/merge-streams", - "hash": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==" - } - }, - "npm:@size-limit/esbuild": { - "type": "npm", - "name": "npm:@size-limit/esbuild", - "data": { - "version": "11.2.0", - "packageName": "@size-limit/esbuild", - "hash": "sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==" - } - }, - "npm:@size-limit/file": { - "type": "npm", - "name": "npm:@size-limit/file", - "data": { - "version": "11.2.0", - "packageName": "@size-limit/file", - "hash": "sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==" - } - }, - "npm:@size-limit/preset-small-lib": { - "type": "npm", - "name": "npm:@size-limit/preset-small-lib", - "data": { - "version": "11.2.0", - "packageName": "@size-limit/preset-small-lib", - "hash": "sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==" - } - }, - "npm:@solid-primitives/event-listener": { - "type": "npm", - "name": "npm:@solid-primitives/event-listener", - "data": { - "version": "2.4.3", - "packageName": "@solid-primitives/event-listener", - "hash": "sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==" - } - }, - "npm:@solid-primitives/keyboard": { - "type": "npm", - "name": "npm:@solid-primitives/keyboard", - "data": { - "version": "1.3.3", - "packageName": "@solid-primitives/keyboard", - "hash": "sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==" - } - }, - "npm:@solid-primitives/resize-observer": { - "type": "npm", - "name": "npm:@solid-primitives/resize-observer", - "data": { - "version": "2.1.3", - "packageName": "@solid-primitives/resize-observer", - "hash": "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==" - } - }, - "npm:@solid-primitives/rootless": { - "type": "npm", - "name": "npm:@solid-primitives/rootless", - "data": { - "version": "1.5.2", - "packageName": "@solid-primitives/rootless", - "hash": "sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==" - } - }, - "npm:@solid-primitives/static-store": { - "type": "npm", - "name": "npm:@solid-primitives/static-store", - "data": { - "version": "0.1.2", - "packageName": "@solid-primitives/static-store", - "hash": "sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==" - } - }, - "npm:@solid-primitives/utils": { - "type": "npm", - "name": "npm:@solid-primitives/utils", - "data": { - "version": "6.3.2", - "packageName": "@solid-primitives/utils", - "hash": "sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==" - } - }, - "npm:@speed-highlight/core": { - "type": "npm", - "name": "npm:@speed-highlight/core", - "data": { - "version": "1.2.8", - "packageName": "@speed-highlight/core", - "hash": "sha512-IGytNtnUnPIobIbOq5Y6LIlqiHNX+vnToQIS7lj6L5819C+rA8TXRDkkG8vePsiBOGcoW9R6i+dp2YBUKdB09Q==" - } - }, - "npm:@standard-schema/spec": { - "type": "npm", - "name": "npm:@standard-schema/spec", - "data": { - "version": "1.0.0", - "packageName": "@standard-schema/spec", - "hash": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==" - } - }, - "npm:@stylistic/eslint-plugin": { - "type": "npm", - "name": "npm:@stylistic/eslint-plugin", - "data": { - "version": "5.5.0", - "packageName": "@stylistic/eslint-plugin", - "hash": "sha512-IeZF+8H0ns6prg4VrkhgL+yrvDXWDH2cKchrbh80ejG9dQgZWp10epHMbgRuQvgchLII/lfh6Xn3lu6+6L86Hw==" - } - }, - "npm:@sveltejs/acorn-typescript": { - "type": "npm", - "name": "npm:@sveltejs/acorn-typescript", - "data": { - "version": "1.0.7", - "packageName": "@sveltejs/acorn-typescript", - "hash": "sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==" - } - }, - "npm:@svitejs/changesets-changelog-github-compact": { - "type": "npm", - "name": "npm:@svitejs/changesets-changelog-github-compact", - "data": { - "version": "1.2.0", - "packageName": "@svitejs/changesets-changelog-github-compact", - "hash": "sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==" - } - }, - "npm:@tailwindcss/node": { - "type": "npm", - "name": "npm:@tailwindcss/node", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/node", - "hash": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==" - } - }, - "npm:@tailwindcss/oxide-android-arm64": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-android-arm64", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-android-arm64", - "hash": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==" - } - }, - "npm:@tailwindcss/oxide-darwin-arm64": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-darwin-arm64", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-darwin-arm64", - "hash": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==" - } - }, - "npm:@tailwindcss/oxide-darwin-x64": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-darwin-x64", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-darwin-x64", - "hash": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==" - } - }, - "npm:@tailwindcss/oxide-freebsd-x64": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-freebsd-x64", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-freebsd-x64", - "hash": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==" - } - }, - "npm:@tailwindcss/oxide-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-arm-gnueabihf", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-arm-gnueabihf", - "hash": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==" - } - }, - "npm:@tailwindcss/oxide-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-arm64-gnu", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-arm64-gnu", - "hash": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==" - } - }, - "npm:@tailwindcss/oxide-linux-arm64-musl": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-arm64-musl", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-arm64-musl", - "hash": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==" - } - }, - "npm:@tailwindcss/oxide-linux-x64-gnu": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-x64-gnu", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-x64-gnu", - "hash": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==" - } - }, - "npm:@tailwindcss/oxide-linux-x64-musl": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-linux-x64-musl", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-linux-x64-musl", - "hash": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==" - } - }, - "npm:@tailwindcss/oxide-wasm32-wasi": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-wasm32-wasi", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-wasm32-wasi", - "hash": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==" - } - }, - "npm:@tailwindcss/oxide-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-win32-arm64-msvc", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-win32-arm64-msvc", - "hash": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==" - } - }, - "npm:@tailwindcss/oxide-win32-x64-msvc": { - "type": "npm", - "name": "npm:@tailwindcss/oxide-win32-x64-msvc", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide-win32-x64-msvc", - "hash": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==" - } - }, - "npm:@tailwindcss/oxide": { - "type": "npm", - "name": "npm:@tailwindcss/oxide", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/oxide", - "hash": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==" - } - }, - "npm:@tailwindcss/vite": { - "type": "npm", - "name": "npm:@tailwindcss/vite", - "data": { - "version": "4.1.17", - "packageName": "@tailwindcss/vite", - "hash": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==" - } - }, - "npm:@tanstack/config": { - "type": "npm", - "name": "npm:@tanstack/config", - "data": { - "version": "0.22.1", - "packageName": "@tanstack/config", - "hash": "sha512-0m+gqjrIE6el20VpGIzT54SIjvu27lDRHr+9NiK2nYya5fm0e/19+NfKRoDekZhSBfjaGytUaSpbofzvbSw8zw==" - } - }, - "npm:@tanstack/devtools-client": { - "type": "npm", - "name": "npm:@tanstack/devtools-client", - "data": { - "version": "0.0.4", - "packageName": "@tanstack/devtools-client", - "hash": "sha512-LefnH9KE9uRDEWifc3QDcooskA8ikfs41bybDTgpYQpyTUspZnaEdUdya9Hry0KYxZ8nos0S3nNbsP79KHqr6Q==" - } - }, - "npm:@tanstack/devtools-event-bus": { - "type": "npm", - "name": "npm:@tanstack/devtools-event-bus", - "data": { - "version": "0.3.3", - "packageName": "@tanstack/devtools-event-bus", - "hash": "sha512-lWl88uLAz7ZhwNdLH6A3tBOSEuBCrvnY9Fzr5JPdzJRFdM5ZFdyNWz1Bf5l/F3GU57VodrN0KCFi9OA26H5Kpg==" - } - }, - "npm:@tanstack/devtools-event-client": { - "type": "npm", - "name": "npm:@tanstack/devtools-event-client", - "data": { - "version": "0.3.5", - "packageName": "@tanstack/devtools-event-client", - "hash": "sha512-RL1f5ZlfZMpghrCIdzl6mLOFLTuhqmPNblZgBaeKfdtk5rfbjykurv+VfYydOFXj0vxVIoA2d/zT7xfD7Ph8fw==" - } - }, - "npm:@tanstack/devtools-ui": { - "type": "npm", - "name": "npm:@tanstack/devtools-ui", - "data": { - "version": "0.4.4", - "packageName": "@tanstack/devtools-ui", - "hash": "sha512-5xHXFyX3nom0UaNfiOM92o6ziaHjGo3mcSGe2HD5Xs8dWRZNpdZ0Smd0B9ddEhy0oB+gXyMzZgUJb9DmrZV0Mg==" - } - }, - "npm:@tanstack/devtools-utils": { - "type": "npm", - "name": "npm:@tanstack/devtools-utils", - "data": { - "version": "0.0.8", - "packageName": "@tanstack/devtools-utils", - "hash": "sha512-cWoohW9OswidFclwopYRsW0FR3jOoC5iMy0pUHm/31uAnlTb3ViFoZ1VqMf7vZESYdDeee8OjaICS1YbKksDxg==" - } - }, - "npm:@tanstack/devtools": { - "type": "npm", - "name": "npm:@tanstack/devtools", - "data": { - "version": "0.8.2", - "packageName": "@tanstack/devtools", - "hash": "sha512-ltVS+MpOrA37CiVunSOCcXctaDnQOJV6FPE5Y2uLq3m8b0spmHwp0edp1PRd2CMG4LnGIlRf7lYdhHa2p9CHNA==" - } - }, - "npm:@tanstack/directive-functions-plugin": { - "type": "npm", - "name": "npm:@tanstack/directive-functions-plugin", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/directive-functions-plugin", - "hash": "sha512-qLGxldnWa0pp/siZEFEYDU+eB/j40bd1V3IuTzP0sFnrYi11Ldx1yVkOruDKUbO1WM0o+OlPhp22Q1h+LMdDMA==" - } - }, - "npm:@tanstack/eslint-config": { - "type": "npm", - "name": "npm:@tanstack/eslint-config", - "data": { - "version": "0.3.3", - "packageName": "@tanstack/eslint-config", - "hash": "sha512-8VFyAaIFV9onJcfc5yVj5WWl6DmN3W4m+t0Mb+nZrQmqHy+kDndw5O5Xv2BHVWRRPTqnhlJYh6wHWGh0R81ZzQ==" - } - }, - "npm:@tanstack/history": { - "type": "npm", - "name": "npm:@tanstack/history", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/history", - "hash": "sha512-l6wcxwDBeh/7Dhles23U1O8lp9kNJmAb2yNjekR6olZwCRNAVA8TCXlVCrueELyFlYZqvQkh0ofxnzG62A1Kkg==" - } - }, - "npm:@tanstack/nitro-v2-vite-plugin": { - "type": "npm", - "name": "npm:@tanstack/nitro-v2-vite-plugin", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/nitro-v2-vite-plugin", - "hash": "sha512-TedrzuMjtHA08x47wCaU6KTrrat8gyzn8a4HUswTwjAa0sMpz4vbOOUDDZyYaJpmjKKbTjgTs6iRr4MONneKTQ==" - } - }, - "npm:@tanstack/publish-config": { - "type": "npm", - "name": "npm:@tanstack/publish-config", - "data": { - "version": "0.2.2", - "packageName": "@tanstack/publish-config", - "hash": "sha512-hTW2rLeZLBMmpwVzWmUJ5L50hPlf4Ea74rZtecbT6qQYCT16JEAbryfHm1u07KIICI2vEArsm2YguckjODqx0w==" - } - }, - "npm:@tanstack/query-core": { - "type": "npm", - "name": "npm:@tanstack/query-core", - "data": { - "version": "5.90.5", - "packageName": "@tanstack/query-core", - "hash": "sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==" - } - }, - "npm:@tanstack/react-devtools": { - "type": "npm", - "name": "npm:@tanstack/react-devtools", - "data": { - "version": "0.8.2", - "packageName": "@tanstack/react-devtools", - "hash": "sha512-D1oG2QivpAmiT4iq7PxbsajmoYmtnhwg9gEK7q9mDiVcnyPjwnhg1ujDvKIzP+ZaRTkQzpJYwtTmS9DzYp8Akg==" - } - }, - "npm:@tanstack/react-query": { - "type": "npm", - "name": "npm:@tanstack/react-query", - "data": { - "version": "5.90.5", - "packageName": "@tanstack/react-query", - "hash": "sha512-pN+8UWpxZkEJ/Rnnj2v2Sxpx1WFlaa9L6a4UO89p6tTQbeo+m0MS8oYDjbggrR8QcTyjKoYWKS3xJQGr3ExT8Q==" - } - }, - "npm:@tanstack/react-router-devtools": { - "type": "npm", - "name": "npm:@tanstack/react-router-devtools", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/react-router-devtools", - "hash": "sha512-ySuFWfR5mHtbs/le5SUb56OxCWTZskwynPp6E9qnyDgB4vX6P7OJDqdgv7rqiorYNjFmAaywraaVZGQ8WuB4+g==" - } - }, - "npm:@tanstack/react-router-ssr-query": { - "type": "npm", - "name": "npm:@tanstack/react-router-ssr-query", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/react-router-ssr-query", - "hash": "sha512-S38TJsBrA7NRxFzdCTb7uDIls1JEtRJAuSLWQrlVigmFEHY2yk2/r45aSKu0cc/ucxRRZ+0JxUo4lFInoFYt1w==" - } - }, - "npm:@tanstack/react-router": { - "type": "npm", - "name": "npm:@tanstack/react-router", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/react-router", - "hash": "sha512-5vhwIAwoxWl7oeIZRNgk5wh9TCkaAinK9qbfdKuKzwGtMHqnv1bRrfKwam3/MaMwHCmvnNfnFj0RYfnBA/ilEg==" - } - }, - "npm:@tanstack/react-start-client": { - "type": "npm", - "name": "npm:@tanstack/react-start-client", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/react-start-client", - "hash": "sha512-082eg9SvYdg4+kZFO6fhiwazoWOa8TUWLIi2Um3OLcnlBJzAf3cwsYE+Ub4siPucRX4DxzSDrY5TgH+uMYKtBQ==" - } - }, - "npm:@tanstack/react-start-server": { - "type": "npm", - "name": "npm:@tanstack/react-start-server", - "data": { - "version": "1.139.8", - "packageName": "@tanstack/react-start-server", - "hash": "sha512-7lmu6a2PDpxd1J438FmV/lxc5vRRvy34dV9NYRNvOj6fxcGfagxix1qi6NKtgmiSQQ83DNfrckHno0wlOJJLOg==" - } - }, - "npm:@tanstack/react-start": { - "type": "npm", - "name": "npm:@tanstack/react-start", - "data": { - "version": "1.139.8", - "packageName": "@tanstack/react-start", - "hash": "sha512-vNSd1w+NCDAmTzkiPC6klnwVZBH8EjXg+c5sf7+PPUYXMZMb7kYCRiH8xKjCBRQkubgQeA8bnVsbRWqC21hQHw==" - } - }, - "npm:@tanstack/react-store": { - "type": "npm", - "name": "npm:@tanstack/react-store", - "data": { - "version": "0.8.0", - "packageName": "@tanstack/react-store", - "hash": "sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==" - } - }, - "npm:@tanstack/router-core": { - "type": "npm", - "name": "npm:@tanstack/router-core", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-core", - "hash": "sha512-mqgsJi4/B2Jo6PXRUs1AsWA+06nqiqVZe1aXioA3vR6PesNeKUSXWfmIoYF6wOx3osiV0BnwB1JCBrInCOQSWA==" - } - }, - "npm:@tanstack/router-devtools-core": { - "type": "npm", - "name": "npm:@tanstack/router-devtools-core", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-devtools-core", - "hash": "sha512-Tx6+rCyjthlH7KS9Jz6YdT2KQ6rZQ66F+XJOj7Rel8zGAvyqx8USzcqTRvC+QjaU1jIJq+mNPWpMdKkkxPSOVA==" - } - }, - "npm:@tanstack/router-generator": { - "type": "npm", - "name": "npm:@tanstack/router-generator", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-generator", - "hash": "sha512-xnmF1poNH/dHtwFxecCcRsaLRIXVnXRZiWYUpvtyaPv4pQYayCrFQCg2ygDbCV0/8H7ctMBJh5MIL7GgPR7+xw==" - } - }, - "npm:@tanstack/router-plugin": { - "type": "npm", - "name": "npm:@tanstack/router-plugin", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-plugin", - "hash": "sha512-sgB8nOoVKr0A2lw5p7kQ3MtEA03d1t+Qvqyy+f/QkHy5pGk8Yohg64TEX+2e98plfM3j5vAOu/JhAyoLLrp1Jw==" - } - }, - "npm:@tanstack/router-ssr-query-core": { - "type": "npm", - "name": "npm:@tanstack/router-ssr-query-core", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/router-ssr-query-core", - "hash": "sha512-Ei4P2g/7xNO99OgvBOAAeVLI6VnqXYcSTI1Q6b1NYBzsb4aIo8Ne38cgVnanDlnIRrUJjIDQdZTAtu0AdANiyg==" - } - }, - "npm:@tanstack/router-utils": { - "type": "npm", - "name": "npm:@tanstack/router-utils", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/router-utils", - "hash": "sha512-jT7D6NimWqoFSkid4vCno8gvTyfL1+NHpgm3es0B2UNhKKRV3LngOGilm1m6v8Qvk/gy6Fh/tvB+s+hBl6GhOg==" - } - }, - "npm:@tanstack/server-functions-plugin": { - "type": "npm", - "name": "npm:@tanstack/server-functions-plugin", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/server-functions-plugin", - "hash": "sha512-IpNFiCoy2YU6gY/4lCKIVlFyU67ltlcUMGcdnrevqOgq20AbMyeLbbBVo9tAA3TkHK9F+9Hd7DqGXsup2pmBLg==" - } - }, - "npm:@tanstack/start-client-core": { - "type": "npm", - "name": "npm:@tanstack/start-client-core", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/start-client-core", - "hash": "sha512-omG032CeYUWlwQt6s7VFqhc9dGHKWNJ0C5PoIckL+G/HcV+0/RxYkiKzx/HTTzWt+K+LpsBDFFNnrTUUyTE5sw==" - } - }, - "npm:@tanstack/start-plugin-core": { - "type": "npm", - "name": "npm:@tanstack/start-plugin-core", - "data": { - "version": "1.139.8", - "packageName": "@tanstack/start-plugin-core", - "hash": "sha512-u1+rof/1vNHzFVR0yPWWSVwzbCtvndQsfjBR104xSTLCLB0oGvFvkCU0xLLyKtxhqsrYZFrqudg5B8aVH2plOg==" - } - }, - "npm:@tanstack/start-server-core": { - "type": "npm", - "name": "npm:@tanstack/start-server-core", - "data": { - "version": "1.139.8", - "packageName": "@tanstack/start-server-core", - "hash": "sha512-jKC83uMS2kgCHoqlHmxh9hAK1pN9Wd8l+Lhkibwp9PKKMW4Z1bxy5xCx6sr3TD2yJEOP25SRhYMrtAKmrLmYGA==" - } - }, - "npm:@tanstack/start-storage-context": { - "type": "npm", - "name": "npm:@tanstack/start-storage-context", - "data": { - "version": "1.139.7", - "packageName": "@tanstack/start-storage-context", - "hash": "sha512-l2utb0CXLE+wfj1wlAUPHohiq7n5nOBMl3pflhl3JzCXt+6D9AAogkfrysyxOAvx3KnLh3oG+qwf1KHWIDB9HA==" - } - }, - "npm:@tanstack/store": { - "type": "npm", - "name": "npm:@tanstack/store", - "data": { - "version": "0.8.0", - "packageName": "@tanstack/store", - "hash": "sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==" - } - }, - "npm:@tanstack/typedoc-config": { - "type": "npm", - "name": "npm:@tanstack/typedoc-config", - "data": { - "version": "0.3.1", - "packageName": "@tanstack/typedoc-config", - "hash": "sha512-frgA1vjzxbdU5/xn/Z/UqyOd1yuegEfAnx9QNbcX+1XQ3TCzD+x89cMZH9iyxdTC1Tasx2gq7DCNCvX962X9WA==" - } - }, - "npm:@tanstack/virtual-file-routes": { - "type": "npm", - "name": "npm:@tanstack/virtual-file-routes", - "data": { - "version": "1.139.0", - "packageName": "@tanstack/virtual-file-routes", - "hash": "sha512-9PImF1d1tovTUIpjFVa0W7Fwj/MHif7BaaczgJJfbv3sDt1Gh+oW9W9uCw9M3ndEJynnp5ZD/TTs0RGubH5ssg==" - } - }, - "npm:@tanstack/vite-config": { - "type": "npm", - "name": "npm:@tanstack/vite-config", - "data": { - "version": "0.4.1", - "packageName": "@tanstack/vite-config", - "hash": "sha512-FOl8EF6SAcljanKSm5aBeJaflFcxQAytTbxtNW8HC6D4x+UBW68IC4tBcrlrsI0wXHBmC/Gz4Ovvv8qCtiXSgQ==" - } - }, - "npm:@testing-library/dom": { - "type": "npm", - "name": "npm:@testing-library/dom", - "data": { - "version": "10.4.1", - "packageName": "@testing-library/dom", - "hash": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==" - } - }, - "npm:@testing-library/jest-dom": { - "type": "npm", - "name": "npm:@testing-library/jest-dom", - "data": { - "version": "6.9.1", - "packageName": "@testing-library/jest-dom", - "hash": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==" - } - }, - "npm:@testing-library/react": { - "type": "npm", - "name": "npm:@testing-library/react", - "data": { - "version": "16.3.0", - "packageName": "@testing-library/react", - "hash": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==" - } - }, - "npm:@tybys/wasm-util@0.10.1": { - "type": "npm", - "name": "npm:@tybys/wasm-util@0.10.1", - "data": { - "version": "0.10.1", - "packageName": "@tybys/wasm-util", - "hash": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==" - } - }, - "npm:@tybys/wasm-util@0.9.0": { - "type": "npm", - "name": "npm:@tybys/wasm-util@0.9.0", - "data": { - "version": "0.9.0", - "packageName": "@tybys/wasm-util", - "hash": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==" - } - }, - "npm:@types/argparse": { - "type": "npm", - "name": "npm:@types/argparse", - "data": { - "version": "1.0.38", - "packageName": "@types/argparse", - "hash": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==" - } - }, - "npm:@types/aria-query": { - "type": "npm", - "name": "npm:@types/aria-query", - "data": { - "version": "5.0.4", - "packageName": "@types/aria-query", - "hash": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" - } - }, - "npm:@types/babel__core": { - "type": "npm", - "name": "npm:@types/babel__core", - "data": { - "version": "7.20.5", - "packageName": "@types/babel__core", - "hash": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==" - } - }, - "npm:@types/babel__generator": { - "type": "npm", - "name": "npm:@types/babel__generator", - "data": { - "version": "7.27.0", - "packageName": "@types/babel__generator", - "hash": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==" - } - }, - "npm:@types/babel__template": { - "type": "npm", - "name": "npm:@types/babel__template", - "data": { - "version": "7.4.4", - "packageName": "@types/babel__template", - "hash": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==" - } - }, - "npm:@types/babel__traverse": { - "type": "npm", - "name": "npm:@types/babel__traverse", - "data": { - "version": "7.28.0", - "packageName": "@types/babel__traverse", - "hash": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==" - } - }, - "npm:@types/chai": { - "type": "npm", - "name": "npm:@types/chai", - "data": { - "version": "5.2.3", - "packageName": "@types/chai", - "hash": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==" - } - }, - "npm:@types/conventional-commits-parser": { - "type": "npm", - "name": "npm:@types/conventional-commits-parser", - "data": { - "version": "5.0.2", - "packageName": "@types/conventional-commits-parser", - "hash": "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==" - } - }, - "npm:@types/debug": { - "type": "npm", - "name": "npm:@types/debug", - "data": { - "version": "4.1.12", - "packageName": "@types/debug", - "hash": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==" - } - }, - "npm:@types/deep-eql": { - "type": "npm", - "name": "npm:@types/deep-eql", - "data": { - "version": "4.0.2", - "packageName": "@types/deep-eql", - "hash": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" - } - }, - "npm:@types/estree-jsx": { - "type": "npm", - "name": "npm:@types/estree-jsx", - "data": { - "version": "1.0.5", - "packageName": "@types/estree-jsx", - "hash": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==" - } - }, - "npm:@types/estree": { - "type": "npm", - "name": "npm:@types/estree", - "data": { - "version": "1.0.8", - "packageName": "@types/estree", - "hash": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" - } - }, - "npm:@types/hast": { - "type": "npm", - "name": "npm:@types/hast", - "data": { - "version": "3.0.4", - "packageName": "@types/hast", - "hash": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==" - } - }, - "npm:@types/json-schema": { - "type": "npm", - "name": "npm:@types/json-schema", - "data": { - "version": "7.0.15", - "packageName": "@types/json-schema", - "hash": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - } - }, - "npm:@types/mdast": { - "type": "npm", - "name": "npm:@types/mdast", - "data": { - "version": "4.0.4", - "packageName": "@types/mdast", - "hash": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==" - } - }, - "npm:@types/ms": { - "type": "npm", - "name": "npm:@types/ms", - "data": { - "version": "2.1.0", - "packageName": "@types/ms", - "hash": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" - } - }, - "npm:@types/node@12.20.55": { - "type": "npm", - "name": "npm:@types/node@12.20.55", - "data": { - "version": "12.20.55", - "packageName": "@types/node", - "hash": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - } - }, - "npm:@types/node@20.19.25": { - "type": "npm", - "name": "npm:@types/node@20.19.25", - "data": { - "version": "20.19.25", - "packageName": "@types/node", - "hash": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==" - } - }, - "npm:@types/node": { - "type": "npm", - "name": "npm:@types/node", - "data": { - "version": "24.10.1", - "packageName": "@types/node", - "hash": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==" - } - }, - "npm:@types/react-dom": { - "type": "npm", - "name": "npm:@types/react-dom", - "data": { - "version": "19.2.3", - "packageName": "@types/react-dom", - "hash": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==" - } - }, - "npm:@types/react": { - "type": "npm", - "name": "npm:@types/react", - "data": { - "version": "19.2.7", - "packageName": "@types/react", - "hash": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==" - } - }, - "npm:@types/resolve": { - "type": "npm", - "name": "npm:@types/resolve", - "data": { - "version": "1.20.2", - "packageName": "@types/resolve", - "hash": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" - } - }, - "npm:@types/unist@2.0.11": { - "type": "npm", - "name": "npm:@types/unist@2.0.11", - "data": { - "version": "2.0.11", - "packageName": "@types/unist", - "hash": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" - } - }, - "npm:@types/unist@3.0.3": { - "type": "npm", - "name": "npm:@types/unist@3.0.3", - "data": { - "version": "3.0.3", - "packageName": "@types/unist", - "hash": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - } - }, - "npm:@types/whatwg-mimetype": { - "type": "npm", - "name": "npm:@types/whatwg-mimetype", - "data": { - "version": "3.0.2", - "packageName": "@types/whatwg-mimetype", - "hash": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==" - } - }, - "npm:@typescript-eslint/eslint-plugin": { - "type": "npm", - "name": "npm:@typescript-eslint/eslint-plugin", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/eslint-plugin", - "hash": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==" - } - }, - "npm:@typescript-eslint/parser": { - "type": "npm", - "name": "npm:@typescript-eslint/parser", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/parser", - "hash": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==" - } - }, - "npm:@typescript-eslint/project-service@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/project-service@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/project-service", - "hash": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==" - } - }, - "npm:@typescript-eslint/project-service@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/project-service@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/project-service", - "hash": "sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==" - } - }, - "npm:@typescript-eslint/scope-manager@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/scope-manager@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/scope-manager", - "hash": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==" - } - }, - "npm:@typescript-eslint/scope-manager@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/scope-manager@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/scope-manager", - "hash": "sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==" - } - }, - "npm:@typescript-eslint/tsconfig-utils@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/tsconfig-utils@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/tsconfig-utils", - "hash": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==" - } - }, - "npm:@typescript-eslint/tsconfig-utils@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/tsconfig-utils@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/tsconfig-utils", - "hash": "sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==" - } - }, - "npm:@typescript-eslint/type-utils@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/type-utils@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/type-utils", - "hash": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==" - } - }, - "npm:@typescript-eslint/type-utils@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/type-utils@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/type-utils", - "hash": "sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==" - } - }, - "npm:@typescript-eslint/types@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/types@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/types", - "hash": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==" - } - }, - "npm:@typescript-eslint/types@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/types@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/types", - "hash": "sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==" - } - }, - "npm:@typescript-eslint/typescript-estree@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/typescript-estree@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/typescript-estree", - "hash": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==" - } - }, - "npm:@typescript-eslint/typescript-estree@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/typescript-estree@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/typescript-estree", - "hash": "sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==" - } - }, - "npm:@typescript-eslint/utils@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/utils@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/utils", - "hash": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==" - } - }, - "npm:@typescript-eslint/utils@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/utils@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/utils", - "hash": "sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==" - } - }, - "npm:@typescript-eslint/visitor-keys@8.46.3": { - "type": "npm", - "name": "npm:@typescript-eslint/visitor-keys@8.46.3", - "data": { - "version": "8.46.3", - "packageName": "@typescript-eslint/visitor-keys", - "hash": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==" - } - }, - "npm:@typescript-eslint/visitor-keys@8.48.0": { - "type": "npm", - "name": "npm:@typescript-eslint/visitor-keys@8.48.0", - "data": { - "version": "8.48.0", - "packageName": "@typescript-eslint/visitor-keys", - "hash": "sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==" - } - }, - "npm:@ungap/structured-clone": { - "type": "npm", - "name": "npm:@ungap/structured-clone", - "data": { - "version": "1.3.0", - "packageName": "@ungap/structured-clone", - "hash": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" - } - }, - "npm:@unrs/resolver-binding-android-arm-eabi": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-android-arm-eabi", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-android-arm-eabi", - "hash": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==" - } - }, - "npm:@unrs/resolver-binding-android-arm64": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-android-arm64", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-android-arm64", - "hash": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==" - } - }, - "npm:@unrs/resolver-binding-darwin-arm64": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-darwin-arm64", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-darwin-arm64", - "hash": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==" - } - }, - "npm:@unrs/resolver-binding-darwin-x64": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-darwin-x64", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-darwin-x64", - "hash": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==" - } - }, - "npm:@unrs/resolver-binding-freebsd-x64": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-freebsd-x64", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-freebsd-x64", - "hash": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==" - } - }, - "npm:@unrs/resolver-binding-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-arm-gnueabihf", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-arm-gnueabihf", - "hash": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==" - } - }, - "npm:@unrs/resolver-binding-linux-arm-musleabihf": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-arm-musleabihf", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-arm-musleabihf", - "hash": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==" - } - }, - "npm:@unrs/resolver-binding-linux-arm64-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-arm64-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-arm64-gnu", - "hash": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==" - } - }, - "npm:@unrs/resolver-binding-linux-arm64-musl": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-arm64-musl", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-arm64-musl", - "hash": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==" - } - }, - "npm:@unrs/resolver-binding-linux-ppc64-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-ppc64-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-ppc64-gnu", - "hash": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==" - } - }, - "npm:@unrs/resolver-binding-linux-riscv64-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-riscv64-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-riscv64-gnu", - "hash": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==" - } - }, - "npm:@unrs/resolver-binding-linux-riscv64-musl": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-riscv64-musl", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-riscv64-musl", - "hash": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==" - } - }, - "npm:@unrs/resolver-binding-linux-s390x-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-s390x-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-s390x-gnu", - "hash": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==" - } - }, - "npm:@unrs/resolver-binding-linux-x64-gnu": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-x64-gnu", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-x64-gnu", - "hash": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==" - } - }, - "npm:@unrs/resolver-binding-linux-x64-musl": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-linux-x64-musl", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-linux-x64-musl", - "hash": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==" - } - }, - "npm:@unrs/resolver-binding-wasm32-wasi": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-wasm32-wasi", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-wasm32-wasi", - "hash": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==" - } - }, - "npm:@unrs/resolver-binding-win32-arm64-msvc": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-win32-arm64-msvc", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-win32-arm64-msvc", - "hash": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==" - } - }, - "npm:@unrs/resolver-binding-win32-ia32-msvc": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-win32-ia32-msvc", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-win32-ia32-msvc", - "hash": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==" - } - }, - "npm:@unrs/resolver-binding-win32-x64-msvc": { - "type": "npm", - "name": "npm:@unrs/resolver-binding-win32-x64-msvc", - "data": { - "version": "1.11.1", - "packageName": "@unrs/resolver-binding-win32-x64-msvc", - "hash": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==" - } - }, - "npm:@vercel/nft": { - "type": "npm", - "name": "npm:@vercel/nft", - "data": { - "version": "0.30.3", - "packageName": "@vercel/nft", - "hash": "sha512-UEq+eF0ocEf9WQCV1gktxKhha36KDs7jln5qii6UpPf5clMqDc0p3E7d9l2Smx0i9Pm1qpq4S4lLfNl97bbv6w==" - } - }, - "npm:@vitejs/plugin-react": { - "type": "npm", - "name": "npm:@vitejs/plugin-react", - "data": { - "version": "5.1.1", - "packageName": "@vitejs/plugin-react", - "hash": "sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==" - } - }, - "npm:@vitest/expect": { - "type": "npm", - "name": "npm:@vitest/expect", - "data": { - "version": "4.0.14", - "packageName": "@vitest/expect", - "hash": "sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==" - } - }, - "npm:@vitest/mocker": { - "type": "npm", - "name": "npm:@vitest/mocker", - "data": { - "version": "4.0.14", - "packageName": "@vitest/mocker", - "hash": "sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==" - } - }, - "npm:@vitest/pretty-format": { - "type": "npm", - "name": "npm:@vitest/pretty-format", - "data": { - "version": "4.0.14", - "packageName": "@vitest/pretty-format", - "hash": "sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==" - } - }, - "npm:@vitest/runner": { - "type": "npm", - "name": "npm:@vitest/runner", - "data": { - "version": "4.0.14", - "packageName": "@vitest/runner", - "hash": "sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==" - } - }, - "npm:@vitest/snapshot": { - "type": "npm", - "name": "npm:@vitest/snapshot", - "data": { - "version": "4.0.14", - "packageName": "@vitest/snapshot", - "hash": "sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==" - } - }, - "npm:@vitest/spy": { - "type": "npm", - "name": "npm:@vitest/spy", - "data": { - "version": "4.0.14", - "packageName": "@vitest/spy", - "hash": "sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==" - } - }, - "npm:@vitest/utils": { - "type": "npm", - "name": "npm:@vitest/utils", - "data": { - "version": "4.0.14", - "packageName": "@vitest/utils", - "hash": "sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==" - } - }, - "npm:@volar/language-core": { - "type": "npm", - "name": "npm:@volar/language-core", - "data": { - "version": "2.4.23", - "packageName": "@volar/language-core", - "hash": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==" - } - }, - "npm:@volar/source-map": { - "type": "npm", - "name": "npm:@volar/source-map", - "data": { - "version": "2.4.23", - "packageName": "@volar/source-map", - "hash": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==" - } - }, - "npm:@volar/typescript": { - "type": "npm", - "name": "npm:@volar/typescript", - "data": { - "version": "2.4.23", - "packageName": "@volar/typescript", - "hash": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==" - } - }, - "npm:@vue/compiler-core": { - "type": "npm", - "name": "npm:@vue/compiler-core", - "data": { - "version": "3.5.24", - "packageName": "@vue/compiler-core", - "hash": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==" - } - }, - "npm:@vue/compiler-dom": { - "type": "npm", - "name": "npm:@vue/compiler-dom", - "data": { - "version": "3.5.24", - "packageName": "@vue/compiler-dom", - "hash": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==" - } - }, - "npm:@vue/compiler-vue2": { - "type": "npm", - "name": "npm:@vue/compiler-vue2", - "data": { - "version": "2.7.16", - "packageName": "@vue/compiler-vue2", - "hash": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==" - } - }, - "npm:@vue/language-core": { - "type": "npm", - "name": "npm:@vue/language-core", - "data": { - "version": "2.1.6", - "packageName": "@vue/language-core", - "hash": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==" - } - }, - "npm:@vue/shared": { - "type": "npm", - "name": "npm:@vue/shared", - "data": { - "version": "3.5.24", - "packageName": "@vue/shared", - "hash": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==" - } - }, - "npm:@yarnpkg/lockfile": { - "type": "npm", - "name": "npm:@yarnpkg/lockfile", - "data": { - "version": "1.1.0", - "packageName": "@yarnpkg/lockfile", - "hash": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" - } - }, - "npm:@yarnpkg/parsers": { - "type": "npm", - "name": "npm:@yarnpkg/parsers", - "data": { - "version": "3.0.2", - "packageName": "@yarnpkg/parsers", - "hash": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==" - } - }, - "npm:@zkochan/js-yaml": { - "type": "npm", - "name": "npm:@zkochan/js-yaml", - "data": { - "version": "0.0.7", - "packageName": "@zkochan/js-yaml", - "hash": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==" - } - }, - "npm:JSONStream": { - "type": "npm", - "name": "npm:JSONStream", - "data": { - "version": "1.3.5", - "packageName": "JSONStream", - "hash": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==" - } - }, - "npm:abbrev": { - "type": "npm", - "name": "npm:abbrev", - "data": { - "version": "3.0.1", - "packageName": "abbrev", - "hash": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==" - } - }, - "npm:abort-controller": { - "type": "npm", - "name": "npm:abort-controller", - "data": { - "version": "3.0.0", - "packageName": "abort-controller", - "hash": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==" - } - }, - "npm:acorn-import-attributes": { - "type": "npm", - "name": "npm:acorn-import-attributes", - "data": { - "version": "1.9.5", - "packageName": "acorn-import-attributes", - "hash": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==" - } - }, - "npm:acorn-jsx": { - "type": "npm", - "name": "npm:acorn-jsx", - "data": { - "version": "5.3.2", - "packageName": "acorn-jsx", - "hash": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" - } - }, - "npm:acorn": { - "type": "npm", - "name": "npm:acorn", - "data": { - "version": "8.15.0", - "packageName": "acorn", - "hash": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" - } - }, - "npm:agent-base": { - "type": "npm", - "name": "npm:agent-base", - "data": { - "version": "7.1.4", - "packageName": "agent-base", - "hash": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==" - } - }, - "npm:ajv-draft-04": { - "type": "npm", - "name": "npm:ajv-draft-04", - "data": { - "version": "1.0.0", - "packageName": "ajv-draft-04", - "hash": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==" - } - }, - "npm:ajv-formats": { - "type": "npm", - "name": "npm:ajv-formats", - "data": { - "version": "3.0.1", - "packageName": "ajv-formats", - "hash": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==" - } - }, - "npm:ajv@6.12.6": { - "type": "npm", - "name": "npm:ajv@6.12.6", - "data": { - "version": "6.12.6", - "packageName": "ajv", - "hash": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - } - }, - "npm:ajv@8.12.0": { - "type": "npm", - "name": "npm:ajv@8.12.0", - "data": { - "version": "8.12.0", - "packageName": "ajv", - "hash": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==" - } - }, - "npm:ajv@8.13.0": { - "type": "npm", - "name": "npm:ajv@8.13.0", - "data": { - "version": "8.13.0", - "packageName": "ajv", - "hash": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==" - } - }, - "npm:ansi-colors": { - "type": "npm", - "name": "npm:ansi-colors", - "data": { - "version": "4.1.3", - "packageName": "ansi-colors", - "hash": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" - } - }, - "npm:ansi-regex@5.0.1": { - "type": "npm", - "name": "npm:ansi-regex@5.0.1", - "data": { - "version": "5.0.1", - "packageName": "ansi-regex", - "hash": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - } - }, - "npm:ansi-regex@6.2.2": { - "type": "npm", - "name": "npm:ansi-regex@6.2.2", - "data": { - "version": "6.2.2", - "packageName": "ansi-regex", - "hash": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==" - } - }, - "npm:ansi-styles@4.3.0": { - "type": "npm", - "name": "npm:ansi-styles@4.3.0", - "data": { - "version": "4.3.0", - "packageName": "ansi-styles", - "hash": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - } - }, - "npm:ansi-styles@5.2.0": { - "type": "npm", - "name": "npm:ansi-styles@5.2.0", - "data": { - "version": "5.2.0", - "packageName": "ansi-styles", - "hash": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - }, - "npm:ansi-styles@6.2.3": { - "type": "npm", - "name": "npm:ansi-styles@6.2.3", - "data": { - "version": "6.2.3", - "packageName": "ansi-styles", - "hash": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==" - } - }, - "npm:ansis": { - "type": "npm", - "name": "npm:ansis", - "data": { - "version": "4.2.0", - "packageName": "ansis", - "hash": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==" - } - }, - "npm:anymatch": { - "type": "npm", - "name": "npm:anymatch", - "data": { - "version": "3.1.3", - "packageName": "anymatch", - "hash": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" - } - }, - "npm:archiver-utils": { - "type": "npm", - "name": "npm:archiver-utils", - "data": { - "version": "5.0.2", - "packageName": "archiver-utils", - "hash": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==" - } - }, - "npm:archiver": { - "type": "npm", - "name": "npm:archiver", - "data": { - "version": "7.0.1", - "packageName": "archiver", - "hash": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==" - } - }, - "npm:argparse@1.0.10": { - "type": "npm", - "name": "npm:argparse@1.0.10", - "data": { - "version": "1.0.10", - "packageName": "argparse", - "hash": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" - } - }, - "npm:argparse@2.0.1": { - "type": "npm", - "name": "npm:argparse@2.0.1", - "data": { - "version": "2.0.1", - "packageName": "argparse", - "hash": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - } - }, - "npm:aria-query@5.3.0": { - "type": "npm", - "name": "npm:aria-query@5.3.0", - "data": { - "version": "5.3.0", - "packageName": "aria-query", - "hash": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==" - } - }, - "npm:aria-query@5.3.2": { - "type": "npm", - "name": "npm:aria-query@5.3.2", - "data": { - "version": "5.3.2", - "packageName": "aria-query", - "hash": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" - } - }, - "npm:array-ify": { - "type": "npm", - "name": "npm:array-ify", - "data": { - "version": "1.0.0", - "packageName": "array-ify", - "hash": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" - } - }, - "npm:array-union": { - "type": "npm", - "name": "npm:array-union", - "data": { - "version": "2.1.0", - "packageName": "array-union", - "hash": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - } - }, - "npm:assertion-error": { - "type": "npm", - "name": "npm:assertion-error", - "data": { - "version": "2.0.1", - "packageName": "assertion-error", - "hash": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==" - } - }, - "npm:ast-types": { - "type": "npm", - "name": "npm:ast-types", - "data": { - "version": "0.16.1", - "packageName": "ast-types", - "hash": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==" - } - }, - "npm:async-sema": { - "type": "npm", - "name": "npm:async-sema", - "data": { - "version": "3.1.1", - "packageName": "async-sema", - "hash": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" - } - }, - "npm:async": { - "type": "npm", - "name": "npm:async", - "data": { - "version": "3.2.6", - "packageName": "async", - "hash": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - } - }, - "npm:asynckit": { - "type": "npm", - "name": "npm:asynckit", - "data": { - "version": "0.4.0", - "packageName": "asynckit", - "hash": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - } - }, - "npm:axios": { - "type": "npm", - "name": "npm:axios", - "data": { - "version": "1.13.2", - "packageName": "axios", - "hash": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==" - } - }, - "npm:axobject-query": { - "type": "npm", - "name": "npm:axobject-query", - "data": { - "version": "4.1.0", - "packageName": "axobject-query", - "hash": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==" - } - }, - "npm:b4a": { - "type": "npm", - "name": "npm:b4a", - "data": { - "version": "1.7.3", - "packageName": "b4a", - "hash": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==" - } - }, - "npm:babel-dead-code-elimination": { - "type": "npm", - "name": "npm:babel-dead-code-elimination", - "data": { - "version": "1.0.10", - "packageName": "babel-dead-code-elimination", - "hash": "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==" - } - }, - "npm:babel-plugin-jsx-dom-expressions": { - "type": "npm", - "name": "npm:babel-plugin-jsx-dom-expressions", - "data": { - "version": "0.40.3", - "packageName": "babel-plugin-jsx-dom-expressions", - "hash": "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w==" - } - }, - "npm:babel-preset-solid": { - "type": "npm", - "name": "npm:babel-preset-solid", - "data": { - "version": "1.9.10", - "packageName": "babel-preset-solid", - "hash": "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ==" - } - }, - "npm:bail": { - "type": "npm", - "name": "npm:bail", - "data": { - "version": "2.0.2", - "packageName": "bail", - "hash": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - } - }, - "npm:balanced-match": { - "type": "npm", - "name": "npm:balanced-match", - "data": { - "version": "1.0.2", - "packageName": "balanced-match", - "hash": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - } - }, - "npm:bare-events": { - "type": "npm", - "name": "npm:bare-events", - "data": { - "version": "2.8.1", - "packageName": "bare-events", - "hash": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==" - } - }, - "npm:base64-js": { - "type": "npm", - "name": "npm:base64-js", - "data": { - "version": "1.5.1", - "packageName": "base64-js", - "hash": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - } - }, - "npm:baseline-browser-mapping": { - "type": "npm", - "name": "npm:baseline-browser-mapping", - "data": { - "version": "2.8.22", - "packageName": "baseline-browser-mapping", - "hash": "sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==" - } - }, - "npm:better-path-resolve": { - "type": "npm", - "name": "npm:better-path-resolve", - "data": { - "version": "1.0.0", - "packageName": "better-path-resolve", - "hash": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==" - } - }, - "npm:bidi-js": { - "type": "npm", - "name": "npm:bidi-js", - "data": { - "version": "1.0.3", - "packageName": "bidi-js", - "hash": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==" - } - }, - "npm:bignumber.js": { - "type": "npm", - "name": "npm:bignumber.js", - "data": { - "version": "9.3.1", - "packageName": "bignumber.js", - "hash": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==" - } - }, - "npm:binary-extensions": { - "type": "npm", - "name": "npm:binary-extensions", - "data": { - "version": "2.3.0", - "packageName": "binary-extensions", - "hash": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" - } - }, - "npm:bindings": { - "type": "npm", - "name": "npm:bindings", - "data": { - "version": "1.5.0", - "packageName": "bindings", - "hash": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==" - } - }, - "npm:birecord": { - "type": "npm", - "name": "npm:birecord", - "data": { - "version": "0.1.1", - "packageName": "birecord", - "hash": "sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==" - } - }, - "npm:bl": { - "type": "npm", - "name": "npm:bl", - "data": { - "version": "4.1.0", - "packageName": "bl", - "hash": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==" - } - }, - "npm:boolbase": { - "type": "npm", - "name": "npm:boolbase", - "data": { - "version": "1.0.0", - "packageName": "boolbase", - "hash": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - } - }, - "npm:brace-expansion@1.1.12": { - "type": "npm", - "name": "npm:brace-expansion@1.1.12", - "data": { - "version": "1.1.12", - "packageName": "brace-expansion", - "hash": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==" - } - }, - "npm:brace-expansion@2.0.2": { - "type": "npm", - "name": "npm:brace-expansion@2.0.2", - "data": { - "version": "2.0.2", - "packageName": "brace-expansion", - "hash": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==" - } - }, - "npm:braces": { - "type": "npm", - "name": "npm:braces", - "data": { - "version": "3.0.3", - "packageName": "braces", - "hash": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==" - } - }, - "npm:browserslist": { - "type": "npm", - "name": "npm:browserslist", - "data": { - "version": "4.27.0", - "packageName": "browserslist", - "hash": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==" - } - }, - "npm:buffer-crc32": { - "type": "npm", - "name": "npm:buffer-crc32", - "data": { - "version": "1.0.0", - "packageName": "buffer-crc32", - "hash": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==" - } - }, - "npm:buffer-equal-constant-time": { - "type": "npm", - "name": "npm:buffer-equal-constant-time", - "data": { - "version": "1.0.1", - "packageName": "buffer-equal-constant-time", - "hash": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - } - }, - "npm:buffer-from": { - "type": "npm", - "name": "npm:buffer-from", - "data": { - "version": "1.1.2", - "packageName": "buffer-from", - "hash": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - } - }, - "npm:buffer@5.7.1": { - "type": "npm", - "name": "npm:buffer@5.7.1", - "data": { - "version": "5.7.1", - "packageName": "buffer", - "hash": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" - } - }, - "npm:buffer@6.0.3": { - "type": "npm", - "name": "npm:buffer@6.0.3", - "data": { - "version": "6.0.3", - "packageName": "buffer", - "hash": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==" - } - }, - "npm:bytes-iec": { - "type": "npm", - "name": "npm:bytes-iec", - "data": { - "version": "3.1.1", - "packageName": "bytes-iec", - "hash": "sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==" - } - }, - "npm:c12": { - "type": "npm", - "name": "npm:c12", - "data": { - "version": "3.3.1", - "packageName": "c12", - "hash": "sha512-LcWQ01LT9tkoUINHgpIOv3mMs+Abv7oVCrtpMRi1PaapVEpWoMga5WuT7/DqFTu7URP9ftbOmimNw1KNIGh9DQ==" - } - }, - "npm:call-bind-apply-helpers": { - "type": "npm", - "name": "npm:call-bind-apply-helpers", - "data": { - "version": "1.0.2", - "packageName": "call-bind-apply-helpers", - "hash": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==" - } - }, - "npm:callsites": { - "type": "npm", - "name": "npm:callsites", - "data": { - "version": "3.1.0", - "packageName": "callsites", - "hash": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } - }, - "npm:caniuse-lite": { - "type": "npm", - "name": "npm:caniuse-lite", - "data": { - "version": "1.0.30001752", - "packageName": "caniuse-lite", - "hash": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==" - } - }, - "npm:ccount": { - "type": "npm", - "name": "npm:ccount", - "data": { - "version": "2.0.1", - "packageName": "ccount", - "hash": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" - } - }, - "npm:chai": { - "type": "npm", - "name": "npm:chai", - "data": { - "version": "6.2.1", - "packageName": "chai", - "hash": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==" - } - }, - "npm:chalk@4.1.2": { - "type": "npm", - "name": "npm:chalk@4.1.2", - "data": { - "version": "4.1.2", - "packageName": "chalk", - "hash": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - } - }, - "npm:chalk@5.6.2": { - "type": "npm", - "name": "npm:chalk@5.6.2", - "data": { - "version": "5.6.2", - "packageName": "chalk", - "hash": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==" - } - }, - "npm:character-entities-html4": { - "type": "npm", - "name": "npm:character-entities-html4", - "data": { - "version": "2.1.0", - "packageName": "character-entities-html4", - "hash": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==" - } - }, - "npm:character-entities-legacy": { - "type": "npm", - "name": "npm:character-entities-legacy", - "data": { - "version": "3.0.0", - "packageName": "character-entities-legacy", - "hash": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==" - } - }, - "npm:character-entities": { - "type": "npm", - "name": "npm:character-entities", - "data": { - "version": "2.0.2", - "packageName": "character-entities", - "hash": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" - } - }, - "npm:character-reference-invalid": { - "type": "npm", - "name": "npm:character-reference-invalid", - "data": { - "version": "2.0.1", - "packageName": "character-reference-invalid", - "hash": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" - } - }, - "npm:chardet": { - "type": "npm", - "name": "npm:chardet", - "data": { - "version": "2.1.1", - "packageName": "chardet", - "hash": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==" - } - }, - "npm:cheerio-select": { - "type": "npm", - "name": "npm:cheerio-select", - "data": { - "version": "2.1.0", - "packageName": "cheerio-select", - "hash": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==" - } - }, - "npm:cheerio": { - "type": "npm", - "name": "npm:cheerio", - "data": { - "version": "1.1.2", - "packageName": "cheerio", - "hash": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==" - } - }, - "npm:chokidar@3.6.0": { - "type": "npm", - "name": "npm:chokidar@3.6.0", - "data": { - "version": "3.6.0", - "packageName": "chokidar", - "hash": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==" - } - }, - "npm:chokidar@4.0.3": { - "type": "npm", - "name": "npm:chokidar@4.0.3", - "data": { - "version": "4.0.3", - "packageName": "chokidar", - "hash": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==" - } - }, - "npm:chownr": { - "type": "npm", - "name": "npm:chownr", - "data": { - "version": "3.0.0", - "packageName": "chownr", - "hash": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==" - } - }, - "npm:ci-info": { - "type": "npm", - "name": "npm:ci-info", - "data": { - "version": "3.9.0", - "packageName": "ci-info", - "hash": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" - } - }, - "npm:citty": { - "type": "npm", - "name": "npm:citty", - "data": { - "version": "0.1.6", - "packageName": "citty", - "hash": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==" - } - }, - "npm:cli-cursor": { - "type": "npm", - "name": "npm:cli-cursor", - "data": { - "version": "3.1.0", - "packageName": "cli-cursor", - "hash": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==" - } - }, - "npm:cli-spinners": { - "type": "npm", - "name": "npm:cli-spinners", - "data": { - "version": "2.6.1", - "packageName": "cli-spinners", - "hash": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" - } - }, - "npm:clipboardy": { - "type": "npm", - "name": "npm:clipboardy", - "data": { - "version": "4.0.0", - "packageName": "clipboardy", - "hash": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==" - } - }, - "npm:cliui": { - "type": "npm", - "name": "npm:cliui", - "data": { - "version": "8.0.1", - "packageName": "cliui", - "hash": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==" - } - }, - "npm:clone": { - "type": "npm", - "name": "npm:clone", - "data": { - "version": "1.0.4", - "packageName": "clone", - "hash": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" - } - }, - "npm:clsx": { - "type": "npm", - "name": "npm:clsx", - "data": { - "version": "2.1.1", - "packageName": "clsx", - "hash": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" - } - }, - "npm:cluster-key-slot": { - "type": "npm", - "name": "npm:cluster-key-slot", - "data": { - "version": "1.1.2", - "packageName": "cluster-key-slot", - "hash": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" - } - }, - "npm:color-convert": { - "type": "npm", - "name": "npm:color-convert", - "data": { - "version": "2.0.1", - "packageName": "color-convert", - "hash": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - } - }, - "npm:color-name": { - "type": "npm", - "name": "npm:color-name", - "data": { - "version": "1.1.4", - "packageName": "color-name", - "hash": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - }, - "npm:combined-stream": { - "type": "npm", - "name": "npm:combined-stream", - "data": { - "version": "1.0.8", - "packageName": "combined-stream", - "hash": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - } - }, - "npm:comma-separated-tokens": { - "type": "npm", - "name": "npm:comma-separated-tokens", - "data": { - "version": "2.0.3", - "packageName": "comma-separated-tokens", - "hash": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" - } - }, - "npm:commander": { - "type": "npm", - "name": "npm:commander", - "data": { - "version": "2.20.3", - "packageName": "commander", - "hash": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - }, - "npm:comment-parser": { - "type": "npm", - "name": "npm:comment-parser", - "data": { - "version": "1.4.1", - "packageName": "comment-parser", - "hash": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==" - } - }, - "npm:commondir": { - "type": "npm", - "name": "npm:commondir", - "data": { - "version": "1.0.1", - "packageName": "commondir", - "hash": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - } - }, - "npm:compare-func": { - "type": "npm", - "name": "npm:compare-func", - "data": { - "version": "2.0.0", - "packageName": "compare-func", - "hash": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==" - } - }, - "npm:compare-versions": { - "type": "npm", - "name": "npm:compare-versions", - "data": { - "version": "6.1.1", - "packageName": "compare-versions", - "hash": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==" - } - }, - "npm:compatx": { - "type": "npm", - "name": "npm:compatx", - "data": { - "version": "0.2.0", - "packageName": "compatx", - "hash": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==" - } - }, - "npm:compress-commons": { - "type": "npm", - "name": "npm:compress-commons", - "data": { - "version": "6.0.2", - "packageName": "compress-commons", - "hash": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==" - } - }, - "npm:computeds": { - "type": "npm", - "name": "npm:computeds", - "data": { - "version": "0.0.1", - "packageName": "computeds", - "hash": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==" - } - }, - "npm:concat-map": { - "type": "npm", - "name": "npm:concat-map", - "data": { - "version": "0.0.1", - "packageName": "concat-map", - "hash": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - } - }, - "npm:confbox@0.1.8": { - "type": "npm", - "name": "npm:confbox@0.1.8", - "data": { - "version": "0.1.8", - "packageName": "confbox", - "hash": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" - } - }, - "npm:confbox@0.2.2": { - "type": "npm", - "name": "npm:confbox@0.2.2", - "data": { - "version": "0.2.2", - "packageName": "confbox", - "hash": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==" - } - }, - "npm:consola": { - "type": "npm", - "name": "npm:consola", - "data": { - "version": "3.4.2", - "packageName": "consola", - "hash": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==" - } - }, - "npm:conventional-changelog-angular": { - "type": "npm", - "name": "npm:conventional-changelog-angular", - "data": { - "version": "7.0.0", - "packageName": "conventional-changelog-angular", - "hash": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==" - } - }, - "npm:conventional-commits-parser": { - "type": "npm", - "name": "npm:conventional-commits-parser", - "data": { - "version": "5.0.0", - "packageName": "conventional-commits-parser", - "hash": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==" - } - }, - "npm:convert-source-map": { - "type": "npm", - "name": "npm:convert-source-map", - "data": { - "version": "2.0.0", - "packageName": "convert-source-map", - "hash": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - } - }, - "npm:cookie-es@1.2.2": { - "type": "npm", - "name": "npm:cookie-es@1.2.2", - "data": { - "version": "1.2.2", - "packageName": "cookie-es", - "hash": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" - } - }, - "npm:cookie-es@2.0.0": { - "type": "npm", - "name": "npm:cookie-es@2.0.0", - "data": { - "version": "2.0.0", - "packageName": "cookie-es", - "hash": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==" - } - }, - "npm:cookie": { - "type": "npm", - "name": "npm:cookie", - "data": { - "version": "1.0.2", - "packageName": "cookie", - "hash": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==" - } - }, - "npm:core-util-is": { - "type": "npm", - "name": "npm:core-util-is", - "data": { - "version": "1.0.3", - "packageName": "core-util-is", - "hash": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - } - }, - "npm:crc-32": { - "type": "npm", - "name": "npm:crc-32", - "data": { - "version": "1.2.2", - "packageName": "crc-32", - "hash": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" - } - }, - "npm:crc32-stream": { - "type": "npm", - "name": "npm:crc32-stream", - "data": { - "version": "6.0.0", - "packageName": "crc32-stream", - "hash": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==" - } - }, - "npm:croner": { - "type": "npm", - "name": "npm:croner", - "data": { - "version": "9.1.0", - "packageName": "croner", - "hash": "sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==" - } - }, - "npm:cross-spawn": { - "type": "npm", - "name": "npm:cross-spawn", - "data": { - "version": "7.0.6", - "packageName": "cross-spawn", - "hash": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==" - } - }, - "npm:crossws": { - "type": "npm", - "name": "npm:crossws", - "data": { - "version": "0.3.5", - "packageName": "crossws", - "hash": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==" - } - }, - "npm:css-select": { - "type": "npm", - "name": "npm:css-select", - "data": { - "version": "5.2.2", - "packageName": "css-select", - "hash": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==" - } - }, - "npm:css-tree": { - "type": "npm", - "name": "npm:css-tree", - "data": { - "version": "3.1.0", - "packageName": "css-tree", - "hash": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==" - } - }, - "npm:css-what": { - "type": "npm", - "name": "npm:css-what", - "data": { - "version": "6.2.2", - "packageName": "css-what", - "hash": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" - } - }, - "npm:css.escape": { - "type": "npm", - "name": "npm:css.escape", - "data": { - "version": "1.5.1", - "packageName": "css.escape", - "hash": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - } - }, - "npm:cssstyle": { - "type": "npm", - "name": "npm:cssstyle", - "data": { - "version": "5.3.3", - "packageName": "cssstyle", - "hash": "sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==" - } - }, - "npm:csstype@3.1.3": { - "type": "npm", - "name": "npm:csstype@3.1.3", - "data": { - "version": "3.1.3", - "packageName": "csstype", - "hash": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - } - }, - "npm:csstype@3.2.3": { - "type": "npm", - "name": "npm:csstype@3.2.3", - "data": { - "version": "3.2.3", - "packageName": "csstype", - "hash": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" - } - }, - "npm:data-uri-to-buffer": { - "type": "npm", - "name": "npm:data-uri-to-buffer", - "data": { - "version": "4.0.1", - "packageName": "data-uri-to-buffer", - "hash": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" - } - }, - "npm:data-urls": { - "type": "npm", - "name": "npm:data-urls", - "data": { - "version": "6.0.0", - "packageName": "data-urls", - "hash": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==" - } - }, - "npm:dataloader": { - "type": "npm", - "name": "npm:dataloader", - "data": { - "version": "1.4.0", - "packageName": "dataloader", - "hash": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" - } - }, - "npm:db0": { - "type": "npm", - "name": "npm:db0", - "data": { - "version": "0.3.4", - "packageName": "db0", - "hash": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==" - } - }, - "npm:de-indent": { - "type": "npm", - "name": "npm:de-indent", - "data": { - "version": "1.0.2", - "packageName": "de-indent", - "hash": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" - } - }, - "npm:debug": { - "type": "npm", - "name": "npm:debug", - "data": { - "version": "4.4.3", - "packageName": "debug", - "hash": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==" - } - }, - "npm:decimal.js": { - "type": "npm", - "name": "npm:decimal.js", - "data": { - "version": "10.6.0", - "packageName": "decimal.js", - "hash": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==" - } - }, - "npm:decode-named-character-reference": { - "type": "npm", - "name": "npm:decode-named-character-reference", - "data": { - "version": "1.2.0", - "packageName": "decode-named-character-reference", - "hash": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==" - } - }, - "npm:deep-is": { - "type": "npm", - "name": "npm:deep-is", - "data": { - "version": "0.1.4", - "packageName": "deep-is", - "hash": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - } - }, - "npm:deepmerge": { - "type": "npm", - "name": "npm:deepmerge", - "data": { - "version": "4.3.1", - "packageName": "deepmerge", - "hash": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - } - }, - "npm:defaults": { - "type": "npm", - "name": "npm:defaults", - "data": { - "version": "1.0.4", - "packageName": "defaults", - "hash": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==" - } - }, - "npm:define-lazy-prop": { - "type": "npm", - "name": "npm:define-lazy-prop", - "data": { - "version": "2.0.0", - "packageName": "define-lazy-prop", - "hash": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" - } - }, - "npm:defu": { - "type": "npm", - "name": "npm:defu", - "data": { - "version": "6.1.4", - "packageName": "defu", - "hash": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" - } - }, - "npm:delayed-stream": { - "type": "npm", - "name": "npm:delayed-stream", - "data": { - "version": "1.0.0", - "packageName": "delayed-stream", - "hash": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - } - }, - "npm:denque": { - "type": "npm", - "name": "npm:denque", - "data": { - "version": "2.1.0", - "packageName": "denque", - "hash": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" - } - }, - "npm:depd": { - "type": "npm", - "name": "npm:depd", - "data": { - "version": "2.0.0", - "packageName": "depd", - "hash": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } - }, - "npm:dequal": { - "type": "npm", - "name": "npm:dequal", - "data": { - "version": "2.0.3", - "packageName": "dequal", - "hash": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - } - }, - "npm:destr": { - "type": "npm", - "name": "npm:destr", - "data": { - "version": "2.0.5", - "packageName": "destr", - "hash": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==" - } - }, - "npm:detect-indent": { - "type": "npm", - "name": "npm:detect-indent", - "data": { - "version": "6.1.0", - "packageName": "detect-indent", - "hash": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" - } - }, - "npm:detect-libc@1.0.3": { - "type": "npm", - "name": "npm:detect-libc@1.0.3", - "data": { - "version": "1.0.3", - "packageName": "detect-libc", - "hash": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" - } - }, - "npm:detect-libc@2.1.2": { - "type": "npm", - "name": "npm:detect-libc@2.1.2", - "data": { - "version": "2.1.2", - "packageName": "detect-libc", - "hash": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" - } - }, - "npm:devalue": { - "type": "npm", - "name": "npm:devalue", - "data": { - "version": "5.5.0", - "packageName": "devalue", - "hash": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==" - } - }, - "npm:devlop": { - "type": "npm", - "name": "npm:devlop", - "data": { - "version": "1.1.0", - "packageName": "devlop", - "hash": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==" - } - }, - "npm:diff": { - "type": "npm", - "name": "npm:diff", - "data": { - "version": "8.0.2", - "packageName": "diff", - "hash": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==" - } - }, - "npm:dir-glob": { - "type": "npm", - "name": "npm:dir-glob", - "data": { - "version": "3.0.1", - "packageName": "dir-glob", - "hash": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" - } - }, - "npm:dom-accessibility-api@0.5.16": { - "type": "npm", - "name": "npm:dom-accessibility-api@0.5.16", - "data": { - "version": "0.5.16", - "packageName": "dom-accessibility-api", - "hash": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - } - }, - "npm:dom-accessibility-api@0.6.3": { - "type": "npm", - "name": "npm:dom-accessibility-api@0.6.3", - "data": { - "version": "0.6.3", - "packageName": "dom-accessibility-api", - "hash": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" - } - }, - "npm:dom-serializer": { - "type": "npm", - "name": "npm:dom-serializer", - "data": { - "version": "2.0.0", - "packageName": "dom-serializer", - "hash": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==" - } - }, - "npm:domelementtype": { - "type": "npm", - "name": "npm:domelementtype", - "data": { - "version": "2.3.0", - "packageName": "domelementtype", - "hash": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - } - }, - "npm:domhandler": { - "type": "npm", - "name": "npm:domhandler", - "data": { - "version": "5.0.3", - "packageName": "domhandler", - "hash": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==" - } - }, - "npm:domutils": { - "type": "npm", - "name": "npm:domutils", - "data": { - "version": "3.2.2", - "packageName": "domutils", - "hash": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==" - } - }, - "npm:dot-prop@10.1.0": { - "type": "npm", - "name": "npm:dot-prop@10.1.0", - "data": { - "version": "10.1.0", - "packageName": "dot-prop", - "hash": "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==" - } - }, - "npm:dot-prop@5.3.0": { - "type": "npm", - "name": "npm:dot-prop@5.3.0", - "data": { - "version": "5.3.0", - "packageName": "dot-prop", - "hash": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" - } - }, - "npm:dotenv-expand": { - "type": "npm", - "name": "npm:dotenv-expand", - "data": { - "version": "11.0.7", - "packageName": "dotenv-expand", - "hash": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==" - } - }, - "npm:dotenv@16.4.7": { - "type": "npm", - "name": "npm:dotenv@16.4.7", - "data": { - "version": "16.4.7", - "packageName": "dotenv", - "hash": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==" - } - }, - "npm:dotenv@16.6.1": { - "type": "npm", - "name": "npm:dotenv@16.6.1", - "data": { - "version": "16.6.1", - "packageName": "dotenv", - "hash": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==" - } - }, - "npm:dotenv@17.2.3": { - "type": "npm", - "name": "npm:dotenv@17.2.3", - "data": { - "version": "17.2.3", - "packageName": "dotenv", - "hash": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==" - } - }, - "npm:dunder-proto": { - "type": "npm", - "name": "npm:dunder-proto", - "data": { - "version": "1.0.1", - "packageName": "dunder-proto", - "hash": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==" - } - }, - "npm:duplexer": { - "type": "npm", - "name": "npm:duplexer", - "data": { - "version": "0.1.2", - "packageName": "duplexer", - "hash": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - } - }, - "npm:eastasianwidth": { - "type": "npm", - "name": "npm:eastasianwidth", - "data": { - "version": "0.2.0", - "packageName": "eastasianwidth", - "hash": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - } - }, - "npm:ecdsa-sig-formatter": { - "type": "npm", - "name": "npm:ecdsa-sig-formatter", - "data": { - "version": "1.0.11", - "packageName": "ecdsa-sig-formatter", - "hash": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==" - } - }, - "npm:ee-first": { - "type": "npm", - "name": "npm:ee-first", - "data": { - "version": "1.1.1", - "packageName": "ee-first", - "hash": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - } - }, - "npm:electron-to-chromium": { - "type": "npm", - "name": "npm:electron-to-chromium", - "data": { - "version": "1.5.244", - "packageName": "electron-to-chromium", - "hash": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==" - } - }, - "npm:emoji-regex@8.0.0": { - "type": "npm", - "name": "npm:emoji-regex@8.0.0", - "data": { - "version": "8.0.0", - "packageName": "emoji-regex", - "hash": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } - }, - "npm:emoji-regex@9.2.2": { - "type": "npm", - "name": "npm:emoji-regex@9.2.2", - "data": { - "version": "9.2.2", - "packageName": "emoji-regex", - "hash": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - } - }, - "npm:encodeurl": { - "type": "npm", - "name": "npm:encodeurl", - "data": { - "version": "2.0.0", - "packageName": "encodeurl", - "hash": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" - } - }, - "npm:encoding-sniffer": { - "type": "npm", - "name": "npm:encoding-sniffer", - "data": { - "version": "0.2.1", - "packageName": "encoding-sniffer", - "hash": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==" - } - }, - "npm:end-of-stream": { - "type": "npm", - "name": "npm:end-of-stream", - "data": { - "version": "1.4.5", - "packageName": "end-of-stream", - "hash": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==" - } - }, - "npm:enhanced-resolve": { - "type": "npm", - "name": "npm:enhanced-resolve", - "data": { - "version": "5.18.3", - "packageName": "enhanced-resolve", - "hash": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==" - } - }, - "npm:enquirer@2.3.6": { - "type": "npm", - "name": "npm:enquirer@2.3.6", - "data": { - "version": "2.3.6", - "packageName": "enquirer", - "hash": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" - } - }, - "npm:enquirer@2.4.1": { - "type": "npm", - "name": "npm:enquirer@2.4.1", - "data": { - "version": "2.4.1", - "packageName": "enquirer", - "hash": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==" - } - }, - "npm:entities@4.5.0": { - "type": "npm", - "name": "npm:entities@4.5.0", - "data": { - "version": "4.5.0", - "packageName": "entities", - "hash": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - } - }, - "npm:entities@6.0.1": { - "type": "npm", - "name": "npm:entities@6.0.1", - "data": { - "version": "6.0.1", - "packageName": "entities", - "hash": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==" - } - }, - "npm:error-stack-parser-es": { - "type": "npm", - "name": "npm:error-stack-parser-es", - "data": { - "version": "1.0.5", - "packageName": "error-stack-parser-es", - "hash": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==" - } - }, - "npm:es-define-property": { - "type": "npm", - "name": "npm:es-define-property", - "data": { - "version": "1.0.1", - "packageName": "es-define-property", - "hash": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" - } - }, - "npm:es-errors": { - "type": "npm", - "name": "npm:es-errors", - "data": { - "version": "1.3.0", - "packageName": "es-errors", - "hash": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - } - }, - "npm:es-module-lexer": { - "type": "npm", - "name": "npm:es-module-lexer", - "data": { - "version": "1.7.0", - "packageName": "es-module-lexer", - "hash": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==" - } - }, - "npm:es-object-atoms": { - "type": "npm", - "name": "npm:es-object-atoms", - "data": { - "version": "1.1.1", - "packageName": "es-object-atoms", - "hash": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==" - } - }, - "npm:es-set-tostringtag": { - "type": "npm", - "name": "npm:es-set-tostringtag", - "data": { - "version": "2.1.0", - "packageName": "es-set-tostringtag", - "hash": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==" - } - }, - "npm:esbuild": { - "type": "npm", - "name": "npm:esbuild", - "data": { - "version": "0.25.12", - "packageName": "esbuild", - "hash": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==" - } - }, - "npm:escalade": { - "type": "npm", - "name": "npm:escalade", - "data": { - "version": "3.2.0", - "packageName": "escalade", - "hash": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" - } - }, - "npm:escape-html": { - "type": "npm", - "name": "npm:escape-html", - "data": { - "version": "1.0.3", - "packageName": "escape-html", - "hash": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - } - }, - "npm:escape-string-regexp@1.0.5": { - "type": "npm", - "name": "npm:escape-string-regexp@1.0.5", - "data": { - "version": "1.0.5", - "packageName": "escape-string-regexp", - "hash": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - } - }, - "npm:escape-string-regexp@4.0.0": { - "type": "npm", - "name": "npm:escape-string-regexp@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "escape-string-regexp", - "hash": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - } - }, - "npm:escape-string-regexp@5.0.0": { - "type": "npm", - "name": "npm:escape-string-regexp@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "escape-string-regexp", - "hash": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" - } - }, - "npm:eslint-compat-utils": { - "type": "npm", - "name": "npm:eslint-compat-utils", - "data": { - "version": "0.5.1", - "packageName": "eslint-compat-utils", - "hash": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==" - } - }, - "npm:eslint-import-context": { - "type": "npm", - "name": "npm:eslint-import-context", - "data": { - "version": "0.1.9", - "packageName": "eslint-import-context", - "hash": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==" - } - }, - "npm:eslint-plugin-es-x": { - "type": "npm", - "name": "npm:eslint-plugin-es-x", - "data": { - "version": "7.8.0", - "packageName": "eslint-plugin-es-x", - "hash": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==" - } - }, - "npm:eslint-plugin-import-x": { - "type": "npm", - "name": "npm:eslint-plugin-import-x", - "data": { - "version": "4.16.1", - "packageName": "eslint-plugin-import-x", - "hash": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==" - } - }, - "npm:eslint-plugin-n": { - "type": "npm", - "name": "npm:eslint-plugin-n", - "data": { - "version": "17.23.1", - "packageName": "eslint-plugin-n", - "hash": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==" - } - }, - "npm:eslint-plugin-react-compiler": { - "type": "npm", - "name": "npm:eslint-plugin-react-compiler", - "data": { - "version": "19.1.0-rc.2", - "packageName": "eslint-plugin-react-compiler", - "hash": "sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==" - } - }, - "npm:eslint-plugin-react-dom": { - "type": "npm", - "name": "npm:eslint-plugin-react-dom", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-dom", - "hash": "sha512-xflcmWONib2KN54bJ25AvrYSPrp0qDWwWoG+tZJWD7xe0OcvC42zpERKyMuqTMuXfKPJNUOs2ZB1z6e3HNRviw==" - } - }, - "npm:eslint-plugin-react-hooks-extra": { - "type": "npm", - "name": "npm:eslint-plugin-react-hooks-extra", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-hooks-extra", - "hash": "sha512-ImANssr1gfBNMahqCufe2nhb1CZpqMBjKYgwtYF6u0pV11UXnGj181MW+YBEPEB+qIN4NK3hKxSsQngQJPBfQQ==" - } - }, - "npm:eslint-plugin-react-hooks": { - "type": "npm", - "name": "npm:eslint-plugin-react-hooks", - "data": { - "version": "7.0.1", - "packageName": "eslint-plugin-react-hooks", - "hash": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==" - } - }, - "npm:eslint-plugin-react-naming-convention": { - "type": "npm", - "name": "npm:eslint-plugin-react-naming-convention", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-naming-convention", - "hash": "sha512-3cxHcn6oA29awTQr20LCw9XBhms65giuHHclU3KyLtFVoHSX/LUJtXUpv/KezkhRiaavT8PmxGTGMZiGGY9vHw==" - } - }, - "npm:eslint-plugin-react-web-api": { - "type": "npm", - "name": "npm:eslint-plugin-react-web-api", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-web-api", - "hash": "sha512-AlSBt0ITf1nT1I6U4Kyj9GoFEpfLh8sR62sl+6uYSladmhPAKXMOSB7Ban7VX6jZcA7LHp+acKAJCv18fKxaUg==" - } - }, - "npm:eslint-plugin-react-x": { - "type": "npm", - "name": "npm:eslint-plugin-react-x", - "data": { - "version": "2.3.9", - "packageName": "eslint-plugin-react-x", - "hash": "sha512-G0Aqk7oHMVmMNnulpQ2nb/Iq2o9JNkk3WQT70zBVQJYIz6NUrXp/1ujL2+cXb5A8ZapEN53F0pP9ZoQRIzNhsA==" - } - }, - "npm:eslint-plugin-unused-imports": { - "type": "npm", - "name": "npm:eslint-plugin-unused-imports", - "data": { - "version": "4.3.0", - "packageName": "eslint-plugin-unused-imports", - "hash": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==" - } - }, - "npm:eslint-scope": { - "type": "npm", - "name": "npm:eslint-scope", - "data": { - "version": "8.4.0", - "packageName": "eslint-scope", - "hash": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==" - } - }, - "npm:eslint-visitor-keys@3.4.3": { - "type": "npm", - "name": "npm:eslint-visitor-keys@3.4.3", - "data": { - "version": "3.4.3", - "packageName": "eslint-visitor-keys", - "hash": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" - } - }, - "npm:eslint-visitor-keys@4.2.1": { - "type": "npm", - "name": "npm:eslint-visitor-keys@4.2.1", - "data": { - "version": "4.2.1", - "packageName": "eslint-visitor-keys", - "hash": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==" - } - }, - "npm:eslint": { - "type": "npm", - "name": "npm:eslint", - "data": { - "version": "9.39.1", - "packageName": "eslint", - "hash": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==" - } - }, - "npm:esm-env": { - "type": "npm", - "name": "npm:esm-env", - "data": { - "version": "1.2.2", - "packageName": "esm-env", - "hash": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" - } - }, - "npm:espree": { - "type": "npm", - "name": "npm:espree", - "data": { - "version": "10.4.0", - "packageName": "espree", - "hash": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==" - } - }, - "npm:esprima": { - "type": "npm", - "name": "npm:esprima", - "data": { - "version": "4.0.1", - "packageName": "esprima", - "hash": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - } - }, - "npm:esquery": { - "type": "npm", - "name": "npm:esquery", - "data": { - "version": "1.6.0", - "packageName": "esquery", - "hash": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==" - } - }, - "npm:esrap": { - "type": "npm", - "name": "npm:esrap", - "data": { - "version": "2.2.0", - "packageName": "esrap", - "hash": "sha512-WBmtxe7R9C5mvL4n2le8nMUe4mD5V9oiK2vJpQ9I3y20ENPUomPcphBXE8D1x/Bm84oN1V+lOfgXxtqmxTp3Xg==" - } - }, - "npm:esrecurse": { - "type": "npm", - "name": "npm:esrecurse", - "data": { - "version": "4.3.0", - "packageName": "esrecurse", - "hash": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" - } - }, - "npm:estraverse": { - "type": "npm", - "name": "npm:estraverse", - "data": { - "version": "5.3.0", - "packageName": "estraverse", - "hash": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - } - }, - "npm:estree-util-is-identifier-name": { - "type": "npm", - "name": "npm:estree-util-is-identifier-name", - "data": { - "version": "3.0.0", - "packageName": "estree-util-is-identifier-name", - "hash": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==" - } - }, - "npm:estree-walker@2.0.2": { - "type": "npm", - "name": "npm:estree-walker@2.0.2", - "data": { - "version": "2.0.2", - "packageName": "estree-walker", - "hash": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - } - }, - "npm:estree-walker@3.0.3": { - "type": "npm", - "name": "npm:estree-walker@3.0.3", - "data": { - "version": "3.0.3", - "packageName": "estree-walker", - "hash": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==" - } - }, - "npm:esutils": { - "type": "npm", - "name": "npm:esutils", - "data": { - "version": "2.0.3", - "packageName": "esutils", - "hash": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - } - }, - "npm:etag": { - "type": "npm", - "name": "npm:etag", - "data": { - "version": "1.8.1", - "packageName": "etag", - "hash": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - } - }, - "npm:event-target-shim": { - "type": "npm", - "name": "npm:event-target-shim", - "data": { - "version": "5.0.1", - "packageName": "event-target-shim", - "hash": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - } - }, - "npm:events-universal": { - "type": "npm", - "name": "npm:events-universal", - "data": { - "version": "1.0.1", - "packageName": "events-universal", - "hash": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==" - } - }, - "npm:events": { - "type": "npm", - "name": "npm:events", - "data": { - "version": "3.3.0", - "packageName": "events", - "hash": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - } - }, - "npm:eventsource-parser": { - "type": "npm", - "name": "npm:eventsource-parser", - "data": { - "version": "3.0.6", - "packageName": "eventsource-parser", - "hash": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==" - } - }, - "npm:execa": { - "type": "npm", - "name": "npm:execa", - "data": { - "version": "8.0.1", - "packageName": "execa", - "hash": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==" - } - }, - "npm:expect-type": { - "type": "npm", - "name": "npm:expect-type", - "data": { - "version": "1.2.2", - "packageName": "expect-type", - "hash": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==" - } - }, - "npm:exsolve": { - "type": "npm", - "name": "npm:exsolve", - "data": { - "version": "1.0.7", - "packageName": "exsolve", - "hash": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==" - } - }, - "npm:extend": { - "type": "npm", - "name": "npm:extend", - "data": { - "version": "3.0.2", - "packageName": "extend", - "hash": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - } - }, - "npm:extendable-error": { - "type": "npm", - "name": "npm:extendable-error", - "data": { - "version": "0.1.7", - "packageName": "extendable-error", - "hash": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==" - } - }, - "npm:fast-deep-equal": { - "type": "npm", - "name": "npm:fast-deep-equal", - "data": { - "version": "3.1.3", - "packageName": "fast-deep-equal", - "hash": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - } - }, - "npm:fast-fifo": { - "type": "npm", - "name": "npm:fast-fifo", - "data": { - "version": "1.3.2", - "packageName": "fast-fifo", - "hash": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - } - }, - "npm:fast-glob": { - "type": "npm", - "name": "npm:fast-glob", - "data": { - "version": "3.3.3", - "packageName": "fast-glob", - "hash": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==" - } - }, - "npm:fast-json-stable-stringify": { - "type": "npm", - "name": "npm:fast-json-stable-stringify", - "data": { - "version": "2.1.0", - "packageName": "fast-json-stable-stringify", - "hash": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - } - }, - "npm:fast-levenshtein": { - "type": "npm", - "name": "npm:fast-levenshtein", - "data": { - "version": "2.0.6", - "packageName": "fast-levenshtein", - "hash": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - } - }, - "npm:fastq": { - "type": "npm", - "name": "npm:fastq", - "data": { - "version": "1.19.1", - "packageName": "fastq", - "hash": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==" - } - }, - "npm:fd-package-json": { - "type": "npm", - "name": "npm:fd-package-json", - "data": { - "version": "2.0.0", - "packageName": "fd-package-json", - "hash": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==" - } - }, - "npm:fdir": { - "type": "npm", - "name": "npm:fdir", - "data": { - "version": "6.5.0", - "packageName": "fdir", - "hash": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==" - } - }, - "npm:fetch-blob": { - "type": "npm", - "name": "npm:fetch-blob", - "data": { - "version": "3.2.0", - "packageName": "fetch-blob", - "hash": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==" - } - }, - "npm:fetchdts": { - "type": "npm", - "name": "npm:fetchdts", - "data": { - "version": "0.1.7", - "packageName": "fetchdts", - "hash": "sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==" - } - }, - "npm:figures": { - "type": "npm", - "name": "npm:figures", - "data": { - "version": "3.2.0", - "packageName": "figures", - "hash": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" - } - }, - "npm:file-entry-cache": { - "type": "npm", - "name": "npm:file-entry-cache", - "data": { - "version": "8.0.0", - "packageName": "file-entry-cache", - "hash": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==" - } - }, - "npm:file-uri-to-path": { - "type": "npm", - "name": "npm:file-uri-to-path", - "data": { - "version": "1.0.0", - "packageName": "file-uri-to-path", - "hash": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - } - }, - "npm:fill-range": { - "type": "npm", - "name": "npm:fill-range", - "data": { - "version": "7.1.1", - "packageName": "fill-range", - "hash": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==" - } - }, - "npm:find-up@4.1.0": { - "type": "npm", - "name": "npm:find-up@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "find-up", - "hash": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" - } - }, - "npm:find-up@5.0.0": { - "type": "npm", - "name": "npm:find-up@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "find-up", - "hash": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" - } - }, - "npm:flat-cache": { - "type": "npm", - "name": "npm:flat-cache", - "data": { - "version": "4.0.1", - "packageName": "flat-cache", - "hash": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==" - } - }, - "npm:flat": { - "type": "npm", - "name": "npm:flat", - "data": { - "version": "5.0.2", - "packageName": "flat", - "hash": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - } - }, - "npm:flatted": { - "type": "npm", - "name": "npm:flatted", - "data": { - "version": "3.3.3", - "packageName": "flatted", - "hash": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" - } - }, - "npm:follow-redirects": { - "type": "npm", - "name": "npm:follow-redirects", - "data": { - "version": "1.15.11", - "packageName": "follow-redirects", - "hash": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" - } - }, - "npm:foreground-child": { - "type": "npm", - "name": "npm:foreground-child", - "data": { - "version": "3.3.1", - "packageName": "foreground-child", - "hash": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==" - } - }, - "npm:form-data": { - "type": "npm", - "name": "npm:form-data", - "data": { - "version": "4.0.4", - "packageName": "form-data", - "hash": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==" - } - }, - "npm:formatly": { - "type": "npm", - "name": "npm:formatly", - "data": { - "version": "0.3.0", - "packageName": "formatly", - "hash": "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==" - } - }, - "npm:formdata-polyfill": { - "type": "npm", - "name": "npm:formdata-polyfill", - "data": { - "version": "4.0.10", - "packageName": "formdata-polyfill", - "hash": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==" - } - }, - "npm:fresh": { - "type": "npm", - "name": "npm:fresh", - "data": { - "version": "2.0.0", - "packageName": "fresh", - "hash": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==" - } - }, - "npm:front-matter": { - "type": "npm", - "name": "npm:front-matter", - "data": { - "version": "4.0.2", - "packageName": "front-matter", - "hash": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==" - } - }, - "npm:fs-constants": { - "type": "npm", - "name": "npm:fs-constants", - "data": { - "version": "1.0.0", - "packageName": "fs-constants", - "hash": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - } - }, - "npm:fs-extra@7.0.1": { - "type": "npm", - "name": "npm:fs-extra@7.0.1", - "data": { - "version": "7.0.1", - "packageName": "fs-extra", - "hash": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==" - } - }, - "npm:fs-extra@8.1.0": { - "type": "npm", - "name": "npm:fs-extra@8.1.0", - "data": { - "version": "8.1.0", - "packageName": "fs-extra", - "hash": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==" - } - }, - "npm:fsevents": { - "type": "npm", - "name": "npm:fsevents", - "data": { - "version": "2.3.3", - "packageName": "fsevents", - "hash": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" - } - }, - "npm:function-bind": { - "type": "npm", - "name": "npm:function-bind", - "data": { - "version": "1.1.2", - "packageName": "function-bind", - "hash": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - } - }, - "npm:gaxios": { - "type": "npm", - "name": "npm:gaxios", - "data": { - "version": "7.1.3", - "packageName": "gaxios", - "hash": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==" - } - }, - "npm:gcp-metadata": { - "type": "npm", - "name": "npm:gcp-metadata", - "data": { - "version": "8.1.2", - "packageName": "gcp-metadata", - "hash": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==" - } - }, - "npm:gensync": { - "type": "npm", - "name": "npm:gensync", - "data": { - "version": "1.0.0-beta.2", - "packageName": "gensync", - "hash": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - } - }, - "npm:get-caller-file": { - "type": "npm", - "name": "npm:get-caller-file", - "data": { - "version": "2.0.5", - "packageName": "get-caller-file", - "hash": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - } - }, - "npm:get-intrinsic": { - "type": "npm", - "name": "npm:get-intrinsic", - "data": { - "version": "1.3.0", - "packageName": "get-intrinsic", - "hash": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==" - } - }, - "npm:get-port-please": { - "type": "npm", - "name": "npm:get-port-please", - "data": { - "version": "3.2.0", - "packageName": "get-port-please", - "hash": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==" - } - }, - "npm:get-proto": { - "type": "npm", - "name": "npm:get-proto", - "data": { - "version": "1.0.1", - "packageName": "get-proto", - "hash": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==" - } - }, - "npm:get-stream": { - "type": "npm", - "name": "npm:get-stream", - "data": { - "version": "8.0.1", - "packageName": "get-stream", - "hash": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" - } - }, - "npm:get-tsconfig": { - "type": "npm", - "name": "npm:get-tsconfig", - "data": { - "version": "4.13.0", - "packageName": "get-tsconfig", - "hash": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==" - } - }, - "npm:giget": { - "type": "npm", - "name": "npm:giget", - "data": { - "version": "2.0.0", - "packageName": "giget", - "hash": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==" - } - }, - "npm:glob-parent@5.1.2": { - "type": "npm", - "name": "npm:glob-parent@5.1.2", - "data": { - "version": "5.1.2", - "packageName": "glob-parent", - "hash": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - } - }, - "npm:glob-parent@6.0.2": { - "type": "npm", - "name": "npm:glob-parent@6.0.2", - "data": { - "version": "6.0.2", - "packageName": "glob-parent", - "hash": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" - } - }, - "npm:glob": { - "type": "npm", - "name": "npm:glob", - "data": { - "version": "10.4.5", - "packageName": "glob", - "hash": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==" - } - }, - "npm:globals@14.0.0": { - "type": "npm", - "name": "npm:globals@14.0.0", - "data": { - "version": "14.0.0", - "packageName": "globals", - "hash": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==" - } - }, - "npm:globals@15.15.0": { - "type": "npm", - "name": "npm:globals@15.15.0", - "data": { - "version": "15.15.0", - "packageName": "globals", - "hash": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==" - } - }, - "npm:globals@16.5.0": { - "type": "npm", - "name": "npm:globals@16.5.0", - "data": { - "version": "16.5.0", - "packageName": "globals", - "hash": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==" - } - }, - "npm:globby@11.1.0": { - "type": "npm", - "name": "npm:globby@11.1.0", - "data": { - "version": "11.1.0", - "packageName": "globby", - "hash": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==" - } - }, - "npm:globby@15.0.0": { - "type": "npm", - "name": "npm:globby@15.0.0", - "data": { - "version": "15.0.0", - "packageName": "globby", - "hash": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==" - } - }, - "npm:globrex": { - "type": "npm", - "name": "npm:globrex", - "data": { - "version": "0.1.2", - "packageName": "globrex", - "hash": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" - } - }, - "npm:goober": { - "type": "npm", - "name": "npm:goober", - "data": { - "version": "2.1.18", - "packageName": "goober", - "hash": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==" - } - }, - "npm:google-auth-library": { - "type": "npm", - "name": "npm:google-auth-library", - "data": { - "version": "10.5.0", - "packageName": "google-auth-library", - "hash": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==" - } - }, - "npm:google-logging-utils": { - "type": "npm", - "name": "npm:google-logging-utils", - "data": { - "version": "1.1.3", - "packageName": "google-logging-utils", - "hash": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==" - } - }, - "npm:gopd": { - "type": "npm", - "name": "npm:gopd", - "data": { - "version": "1.2.0", - "packageName": "gopd", - "hash": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - } - }, - "npm:graceful-fs": { - "type": "npm", - "name": "npm:graceful-fs", - "data": { - "version": "4.2.11", - "packageName": "graceful-fs", - "hash": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - } - }, - "npm:graphemer": { - "type": "npm", - "name": "npm:graphemer", - "data": { - "version": "1.4.0", - "packageName": "graphemer", - "hash": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - } - }, - "npm:gtoken": { - "type": "npm", - "name": "npm:gtoken", - "data": { - "version": "8.0.0", - "packageName": "gtoken", - "hash": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==" - } - }, - "npm:gzip-size": { - "type": "npm", - "name": "npm:gzip-size", - "data": { - "version": "7.0.0", - "packageName": "gzip-size", - "hash": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==" - } - }, - "npm:h3@1.15.4": { - "type": "npm", - "name": "npm:h3@1.15.4", - "data": { - "version": "1.15.4", - "packageName": "h3", - "hash": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==" - } - }, - "npm:h3@2.0.0-beta.5": { - "type": "npm", - "name": "npm:h3@2.0.0-beta.5", - "data": { - "version": "2.0.0-beta.5", - "packageName": "h3", - "hash": "sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==" - } - }, - "npm:h3-v2": { - "type": "npm", - "name": "npm:h3-v2", - "data": { - "version": "npm:h3@2.0.0-beta.5", - "packageName": "h3-v2", - "hash": "sha512-ApIkLH+nTxzCC0Nq/GN1v6jkvu2eOLfdTnTs6ghiuG1EYHWJBDLzhk5tn7SZMEUNsLUjG4qfmqzBx2LG9I7Q/w==" - } - }, - "npm:happy-dom": { - "type": "npm", - "name": "npm:happy-dom", - "data": { - "version": "20.0.10", - "packageName": "happy-dom", - "hash": "sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==" - } - }, - "npm:has-flag": { - "type": "npm", - "name": "npm:has-flag", - "data": { - "version": "4.0.0", - "packageName": "has-flag", - "hash": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - } - }, - "npm:has-symbols": { - "type": "npm", - "name": "npm:has-symbols", - "data": { - "version": "1.1.0", - "packageName": "has-symbols", - "hash": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - } - }, - "npm:has-tostringtag": { - "type": "npm", - "name": "npm:has-tostringtag", - "data": { - "version": "1.0.2", - "packageName": "has-tostringtag", - "hash": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==" - } - }, - "npm:hasown": { - "type": "npm", - "name": "npm:hasown", - "data": { - "version": "2.0.2", - "packageName": "hasown", - "hash": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==" - } - }, - "npm:hast-util-from-parse5": { - "type": "npm", - "name": "npm:hast-util-from-parse5", - "data": { - "version": "8.0.3", - "packageName": "hast-util-from-parse5", - "hash": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==" - } - }, - "npm:hast-util-is-element": { - "type": "npm", - "name": "npm:hast-util-is-element", - "data": { - "version": "3.0.0", - "packageName": "hast-util-is-element", - "hash": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==" - } - }, - "npm:hast-util-parse-selector": { - "type": "npm", - "name": "npm:hast-util-parse-selector", - "data": { - "version": "4.0.0", - "packageName": "hast-util-parse-selector", - "hash": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==" - } - }, - "npm:hast-util-raw": { - "type": "npm", - "name": "npm:hast-util-raw", - "data": { - "version": "9.1.0", - "packageName": "hast-util-raw", - "hash": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==" - } - }, - "npm:hast-util-sanitize": { - "type": "npm", - "name": "npm:hast-util-sanitize", - "data": { - "version": "5.0.2", - "packageName": "hast-util-sanitize", - "hash": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==" - } - }, - "npm:hast-util-to-jsx-runtime": { - "type": "npm", - "name": "npm:hast-util-to-jsx-runtime", - "data": { - "version": "2.3.6", - "packageName": "hast-util-to-jsx-runtime", - "hash": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==" - } - }, - "npm:hast-util-to-parse5": { - "type": "npm", - "name": "npm:hast-util-to-parse5", - "data": { - "version": "8.0.0", - "packageName": "hast-util-to-parse5", - "hash": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==" - } - }, - "npm:hast-util-to-text": { - "type": "npm", - "name": "npm:hast-util-to-text", - "data": { - "version": "4.0.2", - "packageName": "hast-util-to-text", - "hash": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==" - } - }, - "npm:hast-util-whitespace": { - "type": "npm", - "name": "npm:hast-util-whitespace", - "data": { - "version": "3.0.0", - "packageName": "hast-util-whitespace", - "hash": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==" - } - }, - "npm:hastscript": { - "type": "npm", - "name": "npm:hastscript", - "data": { - "version": "9.0.1", - "packageName": "hastscript", - "hash": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==" - } - }, - "npm:he": { - "type": "npm", - "name": "npm:he", - "data": { - "version": "1.2.0", - "packageName": "he", - "hash": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - } - }, - "npm:hermes-estree": { - "type": "npm", - "name": "npm:hermes-estree", - "data": { - "version": "0.25.1", - "packageName": "hermes-estree", - "hash": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==" - } - }, - "npm:hermes-parser": { - "type": "npm", - "name": "npm:hermes-parser", - "data": { - "version": "0.25.1", - "packageName": "hermes-parser", - "hash": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==" - } - }, - "npm:highlight.js": { - "type": "npm", - "name": "npm:highlight.js", - "data": { - "version": "11.11.1", - "packageName": "highlight.js", - "hash": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==" - } - }, - "npm:hookable": { - "type": "npm", - "name": "npm:hookable", - "data": { - "version": "5.5.3", - "packageName": "hookable", - "hash": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" - } - }, - "npm:html-encoding-sniffer": { - "type": "npm", - "name": "npm:html-encoding-sniffer", - "data": { - "version": "4.0.0", - "packageName": "html-encoding-sniffer", - "hash": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==" - } - }, - "npm:html-entities": { - "type": "npm", - "name": "npm:html-entities", - "data": { - "version": "2.3.3", - "packageName": "html-entities", - "hash": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" - } - }, - "npm:html-link-extractor": { - "type": "npm", - "name": "npm:html-link-extractor", - "data": { - "version": "1.0.5", - "packageName": "html-link-extractor", - "hash": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==" - } - }, - "npm:html-url-attributes": { - "type": "npm", - "name": "npm:html-url-attributes", - "data": { - "version": "3.0.1", - "packageName": "html-url-attributes", - "hash": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==" - } - }, - "npm:html-void-elements": { - "type": "npm", - "name": "npm:html-void-elements", - "data": { - "version": "3.0.0", - "packageName": "html-void-elements", - "hash": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" - } - }, - "npm:htmlparser2": { - "type": "npm", - "name": "npm:htmlparser2", - "data": { - "version": "10.0.0", - "packageName": "htmlparser2", - "hash": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==" - } - }, - "npm:http-errors": { - "type": "npm", - "name": "npm:http-errors", - "data": { - "version": "2.0.0", - "packageName": "http-errors", - "hash": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" - } - }, - "npm:http-proxy-agent": { - "type": "npm", - "name": "npm:http-proxy-agent", - "data": { - "version": "7.0.2", - "packageName": "http-proxy-agent", - "hash": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==" - } - }, - "npm:http-shutdown": { - "type": "npm", - "name": "npm:http-shutdown", - "data": { - "version": "1.2.2", - "packageName": "http-shutdown", - "hash": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==" - } - }, - "npm:https-proxy-agent": { - "type": "npm", - "name": "npm:https-proxy-agent", - "data": { - "version": "7.0.6", - "packageName": "https-proxy-agent", - "hash": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==" - } - }, - "npm:httpxy": { - "type": "npm", - "name": "npm:httpxy", - "data": { - "version": "0.1.7", - "packageName": "httpxy", - "hash": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==" - } - }, - "npm:human-id": { - "type": "npm", - "name": "npm:human-id", - "data": { - "version": "4.1.2", - "packageName": "human-id", - "hash": "sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==" - } - }, - "npm:human-signals": { - "type": "npm", - "name": "npm:human-signals", - "data": { - "version": "5.0.0", - "packageName": "human-signals", - "hash": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" - } - }, - "npm:iconv-lite@0.6.3": { - "type": "npm", - "name": "npm:iconv-lite@0.6.3", - "data": { - "version": "0.6.3", - "packageName": "iconv-lite", - "hash": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" - } - }, - "npm:iconv-lite@0.7.0": { - "type": "npm", - "name": "npm:iconv-lite@0.7.0", - "data": { - "version": "0.7.0", - "packageName": "iconv-lite", - "hash": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==" - } - }, - "npm:ieee754": { - "type": "npm", - "name": "npm:ieee754", - "data": { - "version": "1.2.1", - "packageName": "ieee754", - "hash": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - } - }, - "npm:ignore@5.3.2": { - "type": "npm", - "name": "npm:ignore@5.3.2", - "data": { - "version": "5.3.2", - "packageName": "ignore", - "hash": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" - } - }, - "npm:ignore@7.0.5": { - "type": "npm", - "name": "npm:ignore@7.0.5", - "data": { - "version": "7.0.5", - "packageName": "ignore", - "hash": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==" - } - }, - "npm:import-fresh": { - "type": "npm", - "name": "npm:import-fresh", - "data": { - "version": "3.3.1", - "packageName": "import-fresh", - "hash": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==" - } - }, - "npm:import-lazy": { - "type": "npm", - "name": "npm:import-lazy", - "data": { - "version": "4.0.0", - "packageName": "import-lazy", - "hash": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==" - } - }, - "npm:imurmurhash": { - "type": "npm", - "name": "npm:imurmurhash", - "data": { - "version": "0.1.4", - "packageName": "imurmurhash", - "hash": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - } - }, - "npm:indent-string": { - "type": "npm", - "name": "npm:indent-string", - "data": { - "version": "4.0.0", - "packageName": "indent-string", - "hash": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - } - }, - "npm:inherits": { - "type": "npm", - "name": "npm:inherits", - "data": { - "version": "2.0.4", - "packageName": "inherits", - "hash": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - }, - "npm:inline-style-parser": { - "type": "npm", - "name": "npm:inline-style-parser", - "data": { - "version": "0.2.4", - "packageName": "inline-style-parser", - "hash": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" - } - }, - "npm:ioredis": { - "type": "npm", - "name": "npm:ioredis", - "data": { - "version": "5.8.2", - "packageName": "ioredis", - "hash": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==" - } - }, - "npm:iron-webcrypto": { - "type": "npm", - "name": "npm:iron-webcrypto", - "data": { - "version": "1.2.1", - "packageName": "iron-webcrypto", - "hash": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==" - } - }, - "npm:is-alphabetical": { - "type": "npm", - "name": "npm:is-alphabetical", - "data": { - "version": "2.0.1", - "packageName": "is-alphabetical", - "hash": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==" - } - }, - "npm:is-alphanumerical": { - "type": "npm", - "name": "npm:is-alphanumerical", - "data": { - "version": "2.0.1", - "packageName": "is-alphanumerical", - "hash": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==" - } - }, - "npm:is-binary-path": { - "type": "npm", - "name": "npm:is-binary-path", - "data": { - "version": "2.1.0", - "packageName": "is-binary-path", - "hash": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - } - }, - "npm:is-core-module": { - "type": "npm", - "name": "npm:is-core-module", - "data": { - "version": "2.16.1", - "packageName": "is-core-module", - "hash": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==" - } - }, - "npm:is-decimal": { - "type": "npm", - "name": "npm:is-decimal", - "data": { - "version": "2.0.1", - "packageName": "is-decimal", - "hash": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==" - } - }, - "npm:is-docker@2.2.1": { - "type": "npm", - "name": "npm:is-docker@2.2.1", - "data": { - "version": "2.2.1", - "packageName": "is-docker", - "hash": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - } - }, - "npm:is-docker@3.0.0": { - "type": "npm", - "name": "npm:is-docker@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "is-docker", - "hash": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" - } - }, - "npm:is-extglob": { - "type": "npm", - "name": "npm:is-extglob", - "data": { - "version": "2.1.1", - "packageName": "is-extglob", - "hash": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - } - }, - "npm:is-fullwidth-code-point": { - "type": "npm", - "name": "npm:is-fullwidth-code-point", - "data": { - "version": "3.0.0", - "packageName": "is-fullwidth-code-point", - "hash": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - } - }, - "npm:is-glob": { - "type": "npm", - "name": "npm:is-glob", - "data": { - "version": "4.0.3", - "packageName": "is-glob", - "hash": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - } - }, - "npm:is-hexadecimal": { - "type": "npm", - "name": "npm:is-hexadecimal", - "data": { - "version": "2.0.1", - "packageName": "is-hexadecimal", - "hash": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==" - } - }, - "npm:is-immutable-type": { - "type": "npm", - "name": "npm:is-immutable-type", - "data": { - "version": "5.0.1", - "packageName": "is-immutable-type", - "hash": "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==" - } - }, - "npm:is-inside-container": { - "type": "npm", - "name": "npm:is-inside-container", - "data": { - "version": "1.0.0", - "packageName": "is-inside-container", - "hash": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==" - } - }, - "npm:is-interactive": { - "type": "npm", - "name": "npm:is-interactive", - "data": { - "version": "1.0.0", - "packageName": "is-interactive", - "hash": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" - } - }, - "npm:is-module": { - "type": "npm", - "name": "npm:is-module", - "data": { - "version": "1.0.0", - "packageName": "is-module", - "hash": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - } - }, - "npm:is-number": { - "type": "npm", - "name": "npm:is-number", - "data": { - "version": "7.0.0", - "packageName": "is-number", - "hash": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - } - }, - "npm:is-obj": { - "type": "npm", - "name": "npm:is-obj", - "data": { - "version": "2.0.0", - "packageName": "is-obj", - "hash": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - } - }, - "npm:is-plain-obj": { - "type": "npm", - "name": "npm:is-plain-obj", - "data": { - "version": "4.1.0", - "packageName": "is-plain-obj", - "hash": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" - } - }, - "npm:is-potential-custom-element-name": { - "type": "npm", - "name": "npm:is-potential-custom-element-name", - "data": { - "version": "1.0.1", - "packageName": "is-potential-custom-element-name", - "hash": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - } - }, - "npm:is-reference@1.2.1": { - "type": "npm", - "name": "npm:is-reference@1.2.1", - "data": { - "version": "1.2.1", - "packageName": "is-reference", - "hash": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==" - } - }, - "npm:is-reference@3.0.3": { - "type": "npm", - "name": "npm:is-reference@3.0.3", - "data": { - "version": "3.0.3", - "packageName": "is-reference", - "hash": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==" - } - }, - "npm:is-stream@2.0.1": { - "type": "npm", - "name": "npm:is-stream@2.0.1", - "data": { - "version": "2.0.1", - "packageName": "is-stream", - "hash": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - } - }, - "npm:is-stream@3.0.0": { - "type": "npm", - "name": "npm:is-stream@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "is-stream", - "hash": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - } - }, - "npm:is-subdir": { - "type": "npm", - "name": "npm:is-subdir", - "data": { - "version": "1.2.0", - "packageName": "is-subdir", - "hash": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==" - } - }, - "npm:is-text-path": { - "type": "npm", - "name": "npm:is-text-path", - "data": { - "version": "2.0.0", - "packageName": "is-text-path", - "hash": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==" - } - }, - "npm:is-unicode-supported": { - "type": "npm", - "name": "npm:is-unicode-supported", - "data": { - "version": "0.1.0", - "packageName": "is-unicode-supported", - "hash": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" - } - }, - "npm:is-what": { - "type": "npm", - "name": "npm:is-what", - "data": { - "version": "4.1.16", - "packageName": "is-what", - "hash": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==" - } - }, - "npm:is-windows": { - "type": "npm", - "name": "npm:is-windows", - "data": { - "version": "1.0.2", - "packageName": "is-windows", - "hash": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - } - }, - "npm:is-wsl@2.2.0": { - "type": "npm", - "name": "npm:is-wsl@2.2.0", - "data": { - "version": "2.2.0", - "packageName": "is-wsl", - "hash": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==" - } - }, - "npm:is-wsl@3.1.0": { - "type": "npm", - "name": "npm:is-wsl@3.1.0", - "data": { - "version": "3.1.0", - "packageName": "is-wsl", - "hash": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==" - } - }, - "npm:is64bit": { - "type": "npm", - "name": "npm:is64bit", - "data": { - "version": "2.0.0", - "packageName": "is64bit", - "hash": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==" - } - }, - "npm:isarray": { - "type": "npm", - "name": "npm:isarray", - "data": { - "version": "1.0.0", - "packageName": "isarray", - "hash": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - } - }, - "npm:isbot": { - "type": "npm", - "name": "npm:isbot", - "data": { - "version": "5.1.31", - "packageName": "isbot", - "hash": "sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==" - } - }, - "npm:isexe": { - "type": "npm", - "name": "npm:isexe", - "data": { - "version": "2.0.0", - "packageName": "isexe", - "hash": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - } - }, - "npm:jackspeak": { - "type": "npm", - "name": "npm:jackspeak", - "data": { - "version": "3.4.3", - "packageName": "jackspeak", - "hash": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==" - } - }, - "npm:jest-diff": { - "type": "npm", - "name": "npm:jest-diff", - "data": { - "version": "30.2.0", - "packageName": "jest-diff", - "hash": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==" - } - }, - "npm:jiti": { - "type": "npm", - "name": "npm:jiti", - "data": { - "version": "2.6.1", - "packageName": "jiti", - "hash": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==" - } - }, - "npm:jju": { - "type": "npm", - "name": "npm:jju", - "data": { - "version": "1.4.0", - "packageName": "jju", - "hash": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" - } - }, - "npm:js-tokens@4.0.0": { - "type": "npm", - "name": "npm:js-tokens@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "js-tokens", - "hash": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } - }, - "npm:js-tokens@9.0.1": { - "type": "npm", - "name": "npm:js-tokens@9.0.1", - "data": { - "version": "9.0.1", - "packageName": "js-tokens", - "hash": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - } - }, - "npm:js-yaml@3.14.1": { - "type": "npm", - "name": "npm:js-yaml@3.14.1", - "data": { - "version": "3.14.1", - "packageName": "js-yaml", - "hash": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" - } - }, - "npm:js-yaml@4.1.1": { - "type": "npm", - "name": "npm:js-yaml@4.1.1", - "data": { - "version": "4.1.1", - "packageName": "js-yaml", - "hash": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==" - } - }, - "npm:jsdom": { - "type": "npm", - "name": "npm:jsdom", - "data": { - "version": "27.2.0", - "packageName": "jsdom", - "hash": "sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==" - } - }, - "npm:jsesc": { - "type": "npm", - "name": "npm:jsesc", - "data": { - "version": "3.1.0", - "packageName": "jsesc", - "hash": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" - } - }, - "npm:json-bigint": { - "type": "npm", - "name": "npm:json-bigint", - "data": { - "version": "1.0.0", - "packageName": "json-bigint", - "hash": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==" - } - }, - "npm:json-buffer": { - "type": "npm", - "name": "npm:json-buffer", - "data": { - "version": "3.0.1", - "packageName": "json-buffer", - "hash": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - } - }, - "npm:json-schema-to-ts": { - "type": "npm", - "name": "npm:json-schema-to-ts", - "data": { - "version": "3.1.1", - "packageName": "json-schema-to-ts", - "hash": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==" - } - }, - "npm:json-schema-traverse@0.4.1": { - "type": "npm", - "name": "npm:json-schema-traverse@0.4.1", - "data": { - "version": "0.4.1", - "packageName": "json-schema-traverse", - "hash": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - }, - "npm:json-schema-traverse@1.0.0": { - "type": "npm", - "name": "npm:json-schema-traverse@1.0.0", - "data": { - "version": "1.0.0", - "packageName": "json-schema-traverse", - "hash": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - }, - "npm:json-schema": { - "type": "npm", - "name": "npm:json-schema", - "data": { - "version": "0.4.0", - "packageName": "json-schema", - "hash": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - } - }, - "npm:json-stable-stringify-without-jsonify": { - "type": "npm", - "name": "npm:json-stable-stringify-without-jsonify", - "data": { - "version": "1.0.1", - "packageName": "json-stable-stringify-without-jsonify", - "hash": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - } - }, - "npm:json5": { - "type": "npm", - "name": "npm:json5", - "data": { - "version": "2.2.3", - "packageName": "json5", - "hash": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - } - }, - "npm:jsonc-parser": { - "type": "npm", - "name": "npm:jsonc-parser", - "data": { - "version": "3.2.0", - "packageName": "jsonc-parser", - "hash": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" - } - }, - "npm:jsonfile@4.0.0": { - "type": "npm", - "name": "npm:jsonfile@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "jsonfile", - "hash": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" - } - }, - "npm:jsonfile@6.2.0": { - "type": "npm", - "name": "npm:jsonfile@6.2.0", - "data": { - "version": "6.2.0", - "packageName": "jsonfile", - "hash": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==" - } - }, - "npm:jsonparse": { - "type": "npm", - "name": "npm:jsonparse", - "data": { - "version": "1.3.1", - "packageName": "jsonparse", - "hash": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" - } - }, - "npm:jwa": { - "type": "npm", - "name": "npm:jwa", - "data": { - "version": "2.0.1", - "packageName": "jwa", - "hash": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==" - } - }, - "npm:jws": { - "type": "npm", - "name": "npm:jws", - "data": { - "version": "4.0.0", - "packageName": "jws", - "hash": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==" - } - }, - "npm:keyv": { - "type": "npm", - "name": "npm:keyv", - "data": { - "version": "4.5.4", - "packageName": "keyv", - "hash": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==" - } - }, - "npm:kleur": { - "type": "npm", - "name": "npm:kleur", - "data": { - "version": "4.1.5", - "packageName": "kleur", - "hash": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" - } - }, - "npm:klona": { - "type": "npm", - "name": "npm:klona", - "data": { - "version": "2.0.6", - "packageName": "klona", - "hash": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" - } - }, - "npm:knip": { - "type": "npm", - "name": "npm:knip", - "data": { - "version": "5.70.2", - "packageName": "knip", - "hash": "sha512-LI7DbeVnk7h9+FAet5KzzHNdDwJyqDa2+cn4uQfZYTfpuVjEqtGmYD9r5b9JEuOs4eVkf/7sskNhWXxELm3C/Q==" - } - }, - "npm:knitwork": { - "type": "npm", - "name": "npm:knitwork", - "data": { - "version": "1.2.0", - "packageName": "knitwork", - "hash": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==" - } - }, - "npm:kolorist": { - "type": "npm", - "name": "npm:kolorist", - "data": { - "version": "1.8.0", - "packageName": "kolorist", - "hash": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" - } - }, - "npm:lazystream": { - "type": "npm", - "name": "npm:lazystream", - "data": { - "version": "1.0.1", - "packageName": "lazystream", - "hash": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==" - } - }, - "npm:levn": { - "type": "npm", - "name": "npm:levn", - "data": { - "version": "0.4.1", - "packageName": "levn", - "hash": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" - } - }, - "npm:lightningcss-android-arm64": { - "type": "npm", - "name": "npm:lightningcss-android-arm64", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-android-arm64", - "hash": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==" - } - }, - "npm:lightningcss-darwin-arm64": { - "type": "npm", - "name": "npm:lightningcss-darwin-arm64", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-darwin-arm64", - "hash": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==" - } - }, - "npm:lightningcss-darwin-x64": { - "type": "npm", - "name": "npm:lightningcss-darwin-x64", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-darwin-x64", - "hash": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==" - } - }, - "npm:lightningcss-freebsd-x64": { - "type": "npm", - "name": "npm:lightningcss-freebsd-x64", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-freebsd-x64", - "hash": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==" - } - }, - "npm:lightningcss-linux-arm-gnueabihf": { - "type": "npm", - "name": "npm:lightningcss-linux-arm-gnueabihf", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-arm-gnueabihf", - "hash": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==" - } - }, - "npm:lightningcss-linux-arm64-gnu": { - "type": "npm", - "name": "npm:lightningcss-linux-arm64-gnu", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-arm64-gnu", - "hash": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==" - } - }, - "npm:lightningcss-linux-arm64-musl": { - "type": "npm", - "name": "npm:lightningcss-linux-arm64-musl", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-arm64-musl", - "hash": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==" - } - }, - "npm:lightningcss-linux-x64-gnu": { - "type": "npm", - "name": "npm:lightningcss-linux-x64-gnu", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-x64-gnu", - "hash": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==" - } - }, - "npm:lightningcss-linux-x64-musl": { - "type": "npm", - "name": "npm:lightningcss-linux-x64-musl", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-linux-x64-musl", - "hash": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==" - } - }, - "npm:lightningcss-win32-arm64-msvc": { - "type": "npm", - "name": "npm:lightningcss-win32-arm64-msvc", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-win32-arm64-msvc", - "hash": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==" - } - }, - "npm:lightningcss-win32-x64-msvc": { - "type": "npm", - "name": "npm:lightningcss-win32-x64-msvc", - "data": { - "version": "1.30.2", - "packageName": "lightningcss-win32-x64-msvc", - "hash": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==" - } - }, - "npm:lightningcss": { - "type": "npm", - "name": "npm:lightningcss", - "data": { - "version": "1.30.2", - "packageName": "lightningcss", - "hash": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==" - } - }, - "npm:lilconfig": { - "type": "npm", - "name": "npm:lilconfig", - "data": { - "version": "3.1.3", - "packageName": "lilconfig", - "hash": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==" - } - }, - "npm:lines-and-columns": { - "type": "npm", - "name": "npm:lines-and-columns", - "data": { - "version": "2.0.3", - "packageName": "lines-and-columns", - "hash": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==" - } - }, - "npm:linkify-it": { - "type": "npm", - "name": "npm:linkify-it", - "data": { - "version": "5.0.0", - "packageName": "linkify-it", - "hash": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==" - } - }, - "npm:listhen": { - "type": "npm", - "name": "npm:listhen", - "data": { - "version": "1.9.0", - "packageName": "listhen", - "hash": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==" - } - }, - "npm:local-pkg@0.5.1": { - "type": "npm", - "name": "npm:local-pkg@0.5.1", - "data": { - "version": "0.5.1", - "packageName": "local-pkg", - "hash": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==" - } - }, - "npm:local-pkg@1.1.2": { - "type": "npm", - "name": "npm:local-pkg@1.1.2", - "data": { - "version": "1.1.2", - "packageName": "local-pkg", - "hash": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==" - } - }, - "npm:locate-character": { - "type": "npm", - "name": "npm:locate-character", - "data": { - "version": "3.0.0", - "packageName": "locate-character", - "hash": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" - } - }, - "npm:locate-path@5.0.0": { - "type": "npm", - "name": "npm:locate-path@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "locate-path", - "hash": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" - } - }, - "npm:locate-path@6.0.0": { - "type": "npm", - "name": "npm:locate-path@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "locate-path", - "hash": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" - } - }, - "npm:lodash.defaults": { - "type": "npm", - "name": "npm:lodash.defaults", - "data": { - "version": "4.2.0", - "packageName": "lodash.defaults", - "hash": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - } - }, - "npm:lodash.isarguments": { - "type": "npm", - "name": "npm:lodash.isarguments", - "data": { - "version": "3.1.0", - "packageName": "lodash.isarguments", - "hash": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - } - }, - "npm:lodash.merge": { - "type": "npm", - "name": "npm:lodash.merge", - "data": { - "version": "4.6.2", - "packageName": "lodash.merge", - "hash": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - } - }, - "npm:lodash.startcase": { - "type": "npm", - "name": "npm:lodash.startcase", - "data": { - "version": "4.4.0", - "packageName": "lodash.startcase", - "hash": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==" - } - }, - "npm:lodash": { - "type": "npm", - "name": "npm:lodash", - "data": { - "version": "4.17.21", - "packageName": "lodash", - "hash": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - } - }, - "npm:log-symbols": { - "type": "npm", - "name": "npm:log-symbols", - "data": { - "version": "4.1.0", - "packageName": "log-symbols", - "hash": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==" - } - }, - "npm:longest-streak": { - "type": "npm", - "name": "npm:longest-streak", - "data": { - "version": "3.1.0", - "packageName": "longest-streak", - "hash": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" - } - }, - "npm:lowlight": { - "type": "npm", - "name": "npm:lowlight", - "data": { - "version": "3.3.0", - "packageName": "lowlight", - "hash": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==" - } - }, - "npm:lru-cache@10.4.3": { - "type": "npm", - "name": "npm:lru-cache@10.4.3", - "data": { - "version": "10.4.3", - "packageName": "lru-cache", - "hash": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - } - }, - "npm:lru-cache@11.2.2": { - "type": "npm", - "name": "npm:lru-cache@11.2.2", - "data": { - "version": "11.2.2", - "packageName": "lru-cache", - "hash": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==" - } - }, - "npm:lru-cache@5.1.1": { - "type": "npm", - "name": "npm:lru-cache@5.1.1", - "data": { - "version": "5.1.1", - "packageName": "lru-cache", - "hash": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" - } - }, - "npm:lru-cache@6.0.0": { - "type": "npm", - "name": "npm:lru-cache@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "lru-cache", - "hash": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - } - }, - "npm:lucide-react": { - "type": "npm", - "name": "npm:lucide-react", - "data": { - "version": "0.555.0", - "packageName": "lucide-react", - "hash": "sha512-D8FvHUGbxWBRQM90NZeIyhAvkFfsh3u9ekrMvJ30Z6gnpBHS6HC6ldLg7tL45hwiIz/u66eKDtdA23gwwGsAHA==" - } - }, - "npm:lunr": { - "type": "npm", - "name": "npm:lunr", - "data": { - "version": "2.3.9", - "packageName": "lunr", - "hash": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" - } - }, - "npm:lz-string": { - "type": "npm", - "name": "npm:lz-string", - "data": { - "version": "1.5.0", - "packageName": "lz-string", - "hash": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" - } - }, - "npm:magic-string": { - "type": "npm", - "name": "npm:magic-string", - "data": { - "version": "0.30.21", - "packageName": "magic-string", - "hash": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==" - } - }, - "npm:magicast": { - "type": "npm", - "name": "npm:magicast", - "data": { - "version": "0.5.1", - "packageName": "magicast", - "hash": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==" - } - }, - "npm:markdown-it": { - "type": "npm", - "name": "npm:markdown-it", - "data": { - "version": "14.1.0", - "packageName": "markdown-it", - "hash": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==" - } - }, - "npm:markdown-link-extractor": { - "type": "npm", - "name": "npm:markdown-link-extractor", - "data": { - "version": "4.0.3", - "packageName": "markdown-link-extractor", - "hash": "sha512-aEltJiQ4/oC0h6Jbw/uuATGSHZPkcH8DIunNH1A0e+GSFkvZ6BbBkdvBTVfIV8r6HapCU3yTd0eFdi3ZeM1eAQ==" - } - }, - "npm:markdown-table": { - "type": "npm", - "name": "npm:markdown-table", - "data": { - "version": "3.0.4", - "packageName": "markdown-table", - "hash": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" - } - }, - "npm:marked": { - "type": "npm", - "name": "npm:marked", - "data": { - "version": "17.0.1", - "packageName": "marked", - "hash": "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==" - } - }, - "npm:math-intrinsics": { - "type": "npm", - "name": "npm:math-intrinsics", - "data": { - "version": "1.1.0", - "packageName": "math-intrinsics", - "hash": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - } - }, - "npm:mdast-util-find-and-replace": { - "type": "npm", - "name": "npm:mdast-util-find-and-replace", - "data": { - "version": "3.0.2", - "packageName": "mdast-util-find-and-replace", - "hash": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==" - } - }, - "npm:mdast-util-from-markdown": { - "type": "npm", - "name": "npm:mdast-util-from-markdown", - "data": { - "version": "2.0.2", - "packageName": "mdast-util-from-markdown", - "hash": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==" - } - }, - "npm:mdast-util-gfm-autolink-literal": { - "type": "npm", - "name": "npm:mdast-util-gfm-autolink-literal", - "data": { - "version": "2.0.1", - "packageName": "mdast-util-gfm-autolink-literal", - "hash": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==" - } - }, - "npm:mdast-util-gfm-footnote": { - "type": "npm", - "name": "npm:mdast-util-gfm-footnote", - "data": { - "version": "2.1.0", - "packageName": "mdast-util-gfm-footnote", - "hash": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==" - } - }, - "npm:mdast-util-gfm-strikethrough": { - "type": "npm", - "name": "npm:mdast-util-gfm-strikethrough", - "data": { - "version": "2.0.0", - "packageName": "mdast-util-gfm-strikethrough", - "hash": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==" - } - }, - "npm:mdast-util-gfm-table": { - "type": "npm", - "name": "npm:mdast-util-gfm-table", - "data": { - "version": "2.0.0", - "packageName": "mdast-util-gfm-table", - "hash": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==" - } - }, - "npm:mdast-util-gfm-task-list-item": { - "type": "npm", - "name": "npm:mdast-util-gfm-task-list-item", - "data": { - "version": "2.0.0", - "packageName": "mdast-util-gfm-task-list-item", - "hash": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==" - } - }, - "npm:mdast-util-gfm": { - "type": "npm", - "name": "npm:mdast-util-gfm", - "data": { - "version": "3.1.0", - "packageName": "mdast-util-gfm", - "hash": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==" - } - }, - "npm:mdast-util-mdx-expression": { - "type": "npm", - "name": "npm:mdast-util-mdx-expression", - "data": { - "version": "2.0.1", - "packageName": "mdast-util-mdx-expression", - "hash": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==" - } - }, - "npm:mdast-util-mdx-jsx": { - "type": "npm", - "name": "npm:mdast-util-mdx-jsx", - "data": { - "version": "3.2.0", - "packageName": "mdast-util-mdx-jsx", - "hash": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==" - } - }, - "npm:mdast-util-mdxjs-esm": { - "type": "npm", - "name": "npm:mdast-util-mdxjs-esm", - "data": { - "version": "2.0.1", - "packageName": "mdast-util-mdxjs-esm", - "hash": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==" - } - }, - "npm:mdast-util-phrasing": { - "type": "npm", - "name": "npm:mdast-util-phrasing", - "data": { - "version": "4.1.0", - "packageName": "mdast-util-phrasing", - "hash": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==" - } - }, - "npm:mdast-util-to-hast": { - "type": "npm", - "name": "npm:mdast-util-to-hast", - "data": { - "version": "13.2.0", - "packageName": "mdast-util-to-hast", - "hash": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==" - } - }, - "npm:mdast-util-to-markdown": { - "type": "npm", - "name": "npm:mdast-util-to-markdown", - "data": { - "version": "2.1.2", - "packageName": "mdast-util-to-markdown", - "hash": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==" - } - }, - "npm:mdast-util-to-string": { - "type": "npm", - "name": "npm:mdast-util-to-string", - "data": { - "version": "4.0.0", - "packageName": "mdast-util-to-string", - "hash": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==" - } - }, - "npm:mdn-data": { - "type": "npm", - "name": "npm:mdn-data", - "data": { - "version": "2.12.2", - "packageName": "mdn-data", - "hash": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" - } - }, - "npm:mdurl": { - "type": "npm", - "name": "npm:mdurl", - "data": { - "version": "2.0.0", - "packageName": "mdurl", - "hash": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" - } - }, - "npm:meow": { - "type": "npm", - "name": "npm:meow", - "data": { - "version": "12.1.1", - "packageName": "meow", - "hash": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==" - } - }, - "npm:merge-anything": { - "type": "npm", - "name": "npm:merge-anything", - "data": { - "version": "5.1.7", - "packageName": "merge-anything", - "hash": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==" - } - }, - "npm:merge-stream": { - "type": "npm", - "name": "npm:merge-stream", - "data": { - "version": "2.0.0", - "packageName": "merge-stream", - "hash": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - } - }, - "npm:merge2": { - "type": "npm", - "name": "npm:merge2", - "data": { - "version": "1.4.1", - "packageName": "merge2", - "hash": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - } - }, - "npm:micromark-core-commonmark": { - "type": "npm", - "name": "npm:micromark-core-commonmark", - "data": { - "version": "2.0.3", - "packageName": "micromark-core-commonmark", - "hash": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==" - } - }, - "npm:micromark-extension-gfm-autolink-literal": { - "type": "npm", - "name": "npm:micromark-extension-gfm-autolink-literal", - "data": { - "version": "2.1.0", - "packageName": "micromark-extension-gfm-autolink-literal", - "hash": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==" - } - }, - "npm:micromark-extension-gfm-footnote": { - "type": "npm", - "name": "npm:micromark-extension-gfm-footnote", - "data": { - "version": "2.1.0", - "packageName": "micromark-extension-gfm-footnote", - "hash": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==" - } - }, - "npm:micromark-extension-gfm-strikethrough": { - "type": "npm", - "name": "npm:micromark-extension-gfm-strikethrough", - "data": { - "version": "2.1.0", - "packageName": "micromark-extension-gfm-strikethrough", - "hash": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==" - } - }, - "npm:micromark-extension-gfm-table": { - "type": "npm", - "name": "npm:micromark-extension-gfm-table", - "data": { - "version": "2.1.1", - "packageName": "micromark-extension-gfm-table", - "hash": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==" - } - }, - "npm:micromark-extension-gfm-tagfilter": { - "type": "npm", - "name": "npm:micromark-extension-gfm-tagfilter", - "data": { - "version": "2.0.0", - "packageName": "micromark-extension-gfm-tagfilter", - "hash": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==" - } - }, - "npm:micromark-extension-gfm-task-list-item": { - "type": "npm", - "name": "npm:micromark-extension-gfm-task-list-item", - "data": { - "version": "2.1.0", - "packageName": "micromark-extension-gfm-task-list-item", - "hash": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==" - } - }, - "npm:micromark-extension-gfm": { - "type": "npm", - "name": "npm:micromark-extension-gfm", - "data": { - "version": "3.0.0", - "packageName": "micromark-extension-gfm", - "hash": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==" - } - }, - "npm:micromark-factory-destination": { - "type": "npm", - "name": "npm:micromark-factory-destination", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-destination", - "hash": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==" - } - }, - "npm:micromark-factory-label": { - "type": "npm", - "name": "npm:micromark-factory-label", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-label", - "hash": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==" - } - }, - "npm:micromark-factory-space": { - "type": "npm", - "name": "npm:micromark-factory-space", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-space", - "hash": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==" - } - }, - "npm:micromark-factory-title": { - "type": "npm", - "name": "npm:micromark-factory-title", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-title", - "hash": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==" - } - }, - "npm:micromark-factory-whitespace": { - "type": "npm", - "name": "npm:micromark-factory-whitespace", - "data": { - "version": "2.0.1", - "packageName": "micromark-factory-whitespace", - "hash": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==" - } - }, - "npm:micromark-util-character": { - "type": "npm", - "name": "npm:micromark-util-character", - "data": { - "version": "2.1.1", - "packageName": "micromark-util-character", - "hash": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==" - } - }, - "npm:micromark-util-chunked": { - "type": "npm", - "name": "npm:micromark-util-chunked", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-chunked", - "hash": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==" - } - }, - "npm:micromark-util-classify-character": { - "type": "npm", - "name": "npm:micromark-util-classify-character", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-classify-character", - "hash": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==" - } - }, - "npm:micromark-util-combine-extensions": { - "type": "npm", - "name": "npm:micromark-util-combine-extensions", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-combine-extensions", - "hash": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==" - } - }, - "npm:micromark-util-decode-numeric-character-reference": { - "type": "npm", - "name": "npm:micromark-util-decode-numeric-character-reference", - "data": { - "version": "2.0.2", - "packageName": "micromark-util-decode-numeric-character-reference", - "hash": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==" - } - }, - "npm:micromark-util-decode-string": { - "type": "npm", - "name": "npm:micromark-util-decode-string", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-decode-string", - "hash": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==" - } - }, - "npm:micromark-util-encode": { - "type": "npm", - "name": "npm:micromark-util-encode", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-encode", - "hash": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==" - } - }, - "npm:micromark-util-html-tag-name": { - "type": "npm", - "name": "npm:micromark-util-html-tag-name", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-html-tag-name", - "hash": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==" - } - }, - "npm:micromark-util-normalize-identifier": { - "type": "npm", - "name": "npm:micromark-util-normalize-identifier", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-normalize-identifier", - "hash": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==" - } - }, - "npm:micromark-util-resolve-all": { - "type": "npm", - "name": "npm:micromark-util-resolve-all", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-resolve-all", - "hash": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==" - } - }, - "npm:micromark-util-sanitize-uri": { - "type": "npm", - "name": "npm:micromark-util-sanitize-uri", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-sanitize-uri", - "hash": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==" - } - }, - "npm:micromark-util-subtokenize": { - "type": "npm", - "name": "npm:micromark-util-subtokenize", - "data": { - "version": "2.1.0", - "packageName": "micromark-util-subtokenize", - "hash": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==" - } - }, - "npm:micromark-util-symbol": { - "type": "npm", - "name": "npm:micromark-util-symbol", - "data": { - "version": "2.0.1", - "packageName": "micromark-util-symbol", - "hash": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" - } - }, - "npm:micromark-util-types": { - "type": "npm", - "name": "npm:micromark-util-types", - "data": { - "version": "2.0.2", - "packageName": "micromark-util-types", - "hash": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==" - } - }, - "npm:micromark": { - "type": "npm", - "name": "npm:micromark", - "data": { - "version": "4.0.2", - "packageName": "micromark", - "hash": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==" - } - }, - "npm:micromatch": { - "type": "npm", - "name": "npm:micromatch", - "data": { - "version": "4.0.8", - "packageName": "micromatch", - "hash": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==" - } - }, - "npm:mime-db@1.52.0": { - "type": "npm", - "name": "npm:mime-db@1.52.0", - "data": { - "version": "1.52.0", - "packageName": "mime-db", - "hash": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - } - }, - "npm:mime-db@1.54.0": { - "type": "npm", - "name": "npm:mime-db@1.54.0", - "data": { - "version": "1.54.0", - "packageName": "mime-db", - "hash": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==" - } - }, - "npm:mime-types@2.1.35": { - "type": "npm", - "name": "npm:mime-types@2.1.35", - "data": { - "version": "2.1.35", - "packageName": "mime-types", - "hash": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" - } - }, - "npm:mime-types@3.0.1": { - "type": "npm", - "name": "npm:mime-types@3.0.1", - "data": { - "version": "3.0.1", - "packageName": "mime-types", - "hash": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==" - } - }, - "npm:mime@3.0.0": { - "type": "npm", - "name": "npm:mime@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "mime", - "hash": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" - } - }, - "npm:mime@4.1.0": { - "type": "npm", - "name": "npm:mime@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "mime", - "hash": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==" - } - }, - "npm:mimic-fn@2.1.0": { - "type": "npm", - "name": "npm:mimic-fn@2.1.0", - "data": { - "version": "2.1.0", - "packageName": "mimic-fn", - "hash": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } - }, - "npm:mimic-fn@4.0.0": { - "type": "npm", - "name": "npm:mimic-fn@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "mimic-fn", - "hash": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" - } - }, - "npm:min-indent": { - "type": "npm", - "name": "npm:min-indent", - "data": { - "version": "1.0.1", - "packageName": "min-indent", - "hash": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - } - }, - "npm:minimatch@3.0.8": { - "type": "npm", - "name": "npm:minimatch@3.0.8", - "data": { - "version": "3.0.8", - "packageName": "minimatch", - "hash": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==" - } - }, - "npm:minimatch@3.1.2": { - "type": "npm", - "name": "npm:minimatch@3.1.2", - "data": { - "version": "3.1.2", - "packageName": "minimatch", - "hash": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - } - }, - "npm:minimatch@5.1.6": { - "type": "npm", - "name": "npm:minimatch@5.1.6", - "data": { - "version": "5.1.6", - "packageName": "minimatch", - "hash": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==" - } - }, - "npm:minimatch@9.0.3": { - "type": "npm", - "name": "npm:minimatch@9.0.3", - "data": { - "version": "9.0.3", - "packageName": "minimatch", - "hash": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==" - } - }, - "npm:minimatch@9.0.5": { - "type": "npm", - "name": "npm:minimatch@9.0.5", - "data": { - "version": "9.0.5", - "packageName": "minimatch", - "hash": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==" - } - }, - "npm:minimist": { - "type": "npm", - "name": "npm:minimist", - "data": { - "version": "1.2.8", - "packageName": "minimist", - "hash": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - } - }, - "npm:minipass": { - "type": "npm", - "name": "npm:minipass", - "data": { - "version": "7.1.2", - "packageName": "minipass", - "hash": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" - } - }, - "npm:minizlib": { - "type": "npm", - "name": "npm:minizlib", - "data": { - "version": "3.1.0", - "packageName": "minizlib", - "hash": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==" - } - }, - "npm:mlly": { - "type": "npm", - "name": "npm:mlly", - "data": { - "version": "1.8.0", - "packageName": "mlly", - "hash": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==" - } - }, - "npm:mri": { - "type": "npm", - "name": "npm:mri", - "data": { - "version": "1.2.0", - "packageName": "mri", - "hash": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" - } - }, - "npm:ms": { - "type": "npm", - "name": "npm:ms", - "data": { - "version": "2.1.3", - "packageName": "ms", - "hash": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - }, - "npm:muggle-string": { - "type": "npm", - "name": "npm:muggle-string", - "data": { - "version": "0.4.1", - "packageName": "muggle-string", - "hash": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" - } - }, - "npm:nanoid@3.3.11": { - "type": "npm", - "name": "npm:nanoid@3.3.11", - "data": { - "version": "3.3.11", - "packageName": "nanoid", - "hash": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" - } - }, - "npm:nanoid@5.1.6": { - "type": "npm", - "name": "npm:nanoid@5.1.6", - "data": { - "version": "5.1.6", - "packageName": "nanoid", - "hash": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==" - } - }, - "npm:nanospinner": { - "type": "npm", - "name": "npm:nanospinner", - "data": { - "version": "1.2.2", - "packageName": "nanospinner", - "hash": "sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==" - } - }, - "npm:napi-postinstall": { - "type": "npm", - "name": "npm:napi-postinstall", - "data": { - "version": "0.3.4", - "packageName": "napi-postinstall", - "hash": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==" - } - }, - "npm:natural-compare": { - "type": "npm", - "name": "npm:natural-compare", - "data": { - "version": "1.4.0", - "packageName": "natural-compare", - "hash": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - } - }, - "npm:nitropack": { - "type": "npm", - "name": "npm:nitropack", - "data": { - "version": "2.12.9", - "packageName": "nitropack", - "hash": "sha512-t6qqNBn2UDGMWogQuORjbL2UPevB8PvIPsPHmqvWpeGOlPr4P8Oc5oA8t3wFwGmaolM2M/s2SwT23nx9yARmOg==" - } - }, - "npm:node-addon-api": { - "type": "npm", - "name": "npm:node-addon-api", - "data": { - "version": "7.1.1", - "packageName": "node-addon-api", - "hash": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" - } - }, - "npm:node-domexception": { - "type": "npm", - "name": "npm:node-domexception", - "data": { - "version": "1.0.0", - "packageName": "node-domexception", - "hash": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" - } - }, - "npm:node-fetch-native": { - "type": "npm", - "name": "npm:node-fetch-native", - "data": { - "version": "1.6.7", - "packageName": "node-fetch-native", - "hash": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==" - } - }, - "npm:node-fetch@2.7.0": { - "type": "npm", - "name": "npm:node-fetch@2.7.0", - "data": { - "version": "2.7.0", - "packageName": "node-fetch", - "hash": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==" - } - }, - "npm:node-fetch@3.3.2": { - "type": "npm", - "name": "npm:node-fetch@3.3.2", - "data": { - "version": "3.3.2", - "packageName": "node-fetch", - "hash": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==" - } - }, - "npm:node-forge": { - "type": "npm", - "name": "npm:node-forge", - "data": { - "version": "1.3.1", - "packageName": "node-forge", - "hash": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" - } - }, - "npm:node-gyp-build": { - "type": "npm", - "name": "npm:node-gyp-build", - "data": { - "version": "4.8.4", - "packageName": "node-gyp-build", - "hash": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" - } - }, - "npm:node-machine-id": { - "type": "npm", - "name": "npm:node-machine-id", - "data": { - "version": "1.1.12", - "packageName": "node-machine-id", - "hash": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" - } - }, - "npm:node-mock-http": { - "type": "npm", - "name": "npm:node-mock-http", - "data": { - "version": "1.0.3", - "packageName": "node-mock-http", - "hash": "sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==" - } - }, - "npm:node-releases": { - "type": "npm", - "name": "npm:node-releases", - "data": { - "version": "2.0.27", - "packageName": "node-releases", - "hash": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" - } - }, - "npm:nopt": { - "type": "npm", - "name": "npm:nopt", - "data": { - "version": "8.1.0", - "packageName": "nopt", - "hash": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==" - } - }, - "npm:normalize-path": { - "type": "npm", - "name": "npm:normalize-path", - "data": { - "version": "3.0.0", - "packageName": "normalize-path", - "hash": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - } - }, - "npm:npm-run-path@4.0.1": { - "type": "npm", - "name": "npm:npm-run-path@4.0.1", - "data": { - "version": "4.0.1", - "packageName": "npm-run-path", - "hash": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" - } - }, - "npm:npm-run-path@5.3.0": { - "type": "npm", - "name": "npm:npm-run-path@5.3.0", - "data": { - "version": "5.3.0", - "packageName": "npm-run-path", - "hash": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==" - } - }, - "npm:nth-check": { - "type": "npm", - "name": "npm:nth-check", - "data": { - "version": "2.1.1", - "packageName": "nth-check", - "hash": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==" - } - }, - "npm:nx": { - "type": "npm", - "name": "npm:nx", - "data": { - "version": "22.1.2", - "packageName": "nx", - "hash": "sha512-sD1CoYFPMsoiRG095qUhEhzL6ZbSY1a68dw9gJNRg60gM06O7l6X2Kyu+dEEwIZ5PutD82Pt4/S2nzK6mdhfew==" - } - }, - "npm:nypm": { - "type": "npm", - "name": "npm:nypm", - "data": { - "version": "0.6.2", - "packageName": "nypm", - "hash": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==" - } - }, - "npm:obug": { - "type": "npm", - "name": "npm:obug", - "data": { - "version": "2.1.1", - "packageName": "obug", - "hash": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==" - } - }, - "npm:ofetch": { - "type": "npm", - "name": "npm:ofetch", - "data": { - "version": "1.5.0", - "packageName": "ofetch", - "hash": "sha512-A7llJ7eZyziA5xq9//3ZurA8OhFqtS99K5/V1sLBJ5j137CM/OAjlbA/TEJXBuOWwOfLqih+oH5U3ran4za1FQ==" - } - }, - "npm:ohash": { - "type": "npm", - "name": "npm:ohash", - "data": { - "version": "2.0.11", - "packageName": "ohash", - "hash": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==" - } - }, - "npm:ollama": { - "type": "npm", - "name": "npm:ollama", - "data": { - "version": "0.6.3", - "packageName": "ollama", - "hash": "sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==" - } - }, - "npm:on-finished": { - "type": "npm", - "name": "npm:on-finished", - "data": { - "version": "2.4.1", - "packageName": "on-finished", - "hash": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==" - } - }, - "npm:once": { - "type": "npm", - "name": "npm:once", - "data": { - "version": "1.4.0", - "packageName": "once", - "hash": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" - } - }, - "npm:onetime@5.1.2": { - "type": "npm", - "name": "npm:onetime@5.1.2", - "data": { - "version": "5.1.2", - "packageName": "onetime", - "hash": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" - } - }, - "npm:onetime@6.0.0": { - "type": "npm", - "name": "npm:onetime@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "onetime", - "hash": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==" - } - }, - "npm:open": { - "type": "npm", - "name": "npm:open", - "data": { - "version": "8.4.2", - "packageName": "open", - "hash": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==" - } - }, - "npm:openai": { - "type": "npm", - "name": "npm:openai", - "data": { - "version": "6.9.1", - "packageName": "openai", - "hash": "sha512-vQ5Rlt0ZgB3/BNmTa7bIijYFhz3YBceAA3Z4JuoMSBftBF9YqFHIEhZakSs+O/Ad7EaoEimZvHxD5ylRjN11Lg==" - } - }, - "npm:optionator": { - "type": "npm", - "name": "npm:optionator", - "data": { - "version": "0.9.4", - "packageName": "optionator", - "hash": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==" - } - }, - "npm:ora": { - "type": "npm", - "name": "npm:ora", - "data": { - "version": "5.3.0", - "packageName": "ora", - "hash": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==" - } - }, - "npm:outdent": { - "type": "npm", - "name": "npm:outdent", - "data": { - "version": "0.5.0", - "packageName": "outdent", - "hash": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==" - } - }, - "npm:oxc-resolver": { - "type": "npm", - "name": "npm:oxc-resolver", - "data": { - "version": "11.14.0", - "packageName": "oxc-resolver", - "hash": "sha512-i4wNrqhOd+4YdHJfHglHtFiqqSxXuzFA+RUqmmWN1aMD3r1HqUSrIhw17tSO4jwKfhLs9uw1wzFPmvMsWacStg==" - } - }, - "npm:p-filter": { - "type": "npm", - "name": "npm:p-filter", - "data": { - "version": "2.1.0", - "packageName": "p-filter", - "hash": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==" - } - }, - "npm:p-limit@2.3.0": { - "type": "npm", - "name": "npm:p-limit@2.3.0", - "data": { - "version": "2.3.0", - "packageName": "p-limit", - "hash": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" - } - }, - "npm:p-limit@3.1.0": { - "type": "npm", - "name": "npm:p-limit@3.1.0", - "data": { - "version": "3.1.0", - "packageName": "p-limit", - "hash": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" - } - }, - "npm:p-locate@4.1.0": { - "type": "npm", - "name": "npm:p-locate@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "p-locate", - "hash": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" - } - }, - "npm:p-locate@5.0.0": { - "type": "npm", - "name": "npm:p-locate@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "p-locate", - "hash": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" - } - }, - "npm:p-map": { - "type": "npm", - "name": "npm:p-map", - "data": { - "version": "2.1.0", - "packageName": "p-map", - "hash": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - } - }, - "npm:p-try": { - "type": "npm", - "name": "npm:p-try", - "data": { - "version": "2.2.0", - "packageName": "p-try", - "hash": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - } - }, - "npm:package-json-from-dist": { - "type": "npm", - "name": "npm:package-json-from-dist", - "data": { - "version": "1.0.1", - "packageName": "package-json-from-dist", - "hash": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - } - }, - "npm:package-manager-detector@0.2.11": { - "type": "npm", - "name": "npm:package-manager-detector@0.2.11", - "data": { - "version": "0.2.11", - "packageName": "package-manager-detector", - "hash": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==" - } - }, - "npm:package-manager-detector@1.5.0": { - "type": "npm", - "name": "npm:package-manager-detector@1.5.0", - "data": { - "version": "1.5.0", - "packageName": "package-manager-detector", - "hash": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==" - } - }, - "npm:parent-module": { - "type": "npm", - "name": "npm:parent-module", - "data": { - "version": "1.0.1", - "packageName": "parent-module", - "hash": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - } - }, - "npm:parse-entities": { - "type": "npm", - "name": "npm:parse-entities", - "data": { - "version": "4.0.2", - "packageName": "parse-entities", - "hash": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==" - } - }, - "npm:parse5-htmlparser2-tree-adapter": { - "type": "npm", - "name": "npm:parse5-htmlparser2-tree-adapter", - "data": { - "version": "7.1.0", - "packageName": "parse5-htmlparser2-tree-adapter", - "hash": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==" - } - }, - "npm:parse5-parser-stream": { - "type": "npm", - "name": "npm:parse5-parser-stream", - "data": { - "version": "7.1.2", - "packageName": "parse5-parser-stream", - "hash": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==" - } - }, - "npm:parse5@7.3.0": { - "type": "npm", - "name": "npm:parse5@7.3.0", - "data": { - "version": "7.3.0", - "packageName": "parse5", - "hash": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==" - } - }, - "npm:parse5@8.0.0": { - "type": "npm", - "name": "npm:parse5@8.0.0", - "data": { - "version": "8.0.0", - "packageName": "parse5", - "hash": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==" - } - }, - "npm:parseurl": { - "type": "npm", - "name": "npm:parseurl", - "data": { - "version": "1.3.3", - "packageName": "parseurl", - "hash": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - } - }, - "npm:partial-json": { - "type": "npm", - "name": "npm:partial-json", - "data": { - "version": "0.1.7", - "packageName": "partial-json", - "hash": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==" - } - }, - "npm:path-browserify": { - "type": "npm", - "name": "npm:path-browserify", - "data": { - "version": "1.0.1", - "packageName": "path-browserify", - "hash": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - } - }, - "npm:path-exists": { - "type": "npm", - "name": "npm:path-exists", - "data": { - "version": "4.0.0", - "packageName": "path-exists", - "hash": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - } - }, - "npm:path-key@3.1.1": { - "type": "npm", - "name": "npm:path-key@3.1.1", - "data": { - "version": "3.1.1", - "packageName": "path-key", - "hash": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - } - }, - "npm:path-key@4.0.0": { - "type": "npm", - "name": "npm:path-key@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "path-key", - "hash": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" - } - }, - "npm:path-parse": { - "type": "npm", - "name": "npm:path-parse", - "data": { - "version": "1.0.7", - "packageName": "path-parse", - "hash": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - } - }, - "npm:path-scurry": { - "type": "npm", - "name": "npm:path-scurry", - "data": { - "version": "1.11.1", - "packageName": "path-scurry", - "hash": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==" - } - }, - "npm:path-type@4.0.0": { - "type": "npm", - "name": "npm:path-type@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "path-type", - "hash": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - } - }, - "npm:path-type@6.0.0": { - "type": "npm", - "name": "npm:path-type@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "path-type", - "hash": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==" - } - }, - "npm:pathe@1.1.2": { - "type": "npm", - "name": "npm:pathe@1.1.2", - "data": { - "version": "1.1.2", - "packageName": "pathe", - "hash": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - } - }, - "npm:pathe@2.0.3": { - "type": "npm", - "name": "npm:pathe@2.0.3", - "data": { - "version": "2.0.3", - "packageName": "pathe", - "hash": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - } - }, - "npm:perfect-debounce": { - "type": "npm", - "name": "npm:perfect-debounce", - "data": { - "version": "2.0.0", - "packageName": "perfect-debounce", - "hash": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==" - } - }, - "npm:picocolors": { - "type": "npm", - "name": "npm:picocolors", - "data": { - "version": "1.1.1", - "packageName": "picocolors", - "hash": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - } - }, - "npm:picomatch@2.3.1": { - "type": "npm", - "name": "npm:picomatch@2.3.1", - "data": { - "version": "2.3.1", - "packageName": "picomatch", - "hash": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - } - }, - "npm:picomatch@4.0.3": { - "type": "npm", - "name": "npm:picomatch@4.0.3", - "data": { - "version": "4.0.3", - "packageName": "picomatch", - "hash": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" - } - }, - "npm:pify": { - "type": "npm", - "name": "npm:pify", - "data": { - "version": "4.0.1", - "packageName": "pify", - "hash": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - }, - "npm:pkg-types@1.3.1": { - "type": "npm", - "name": "npm:pkg-types@1.3.1", - "data": { - "version": "1.3.1", - "packageName": "pkg-types", - "hash": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==" - } - }, - "npm:pkg-types@2.3.0": { - "type": "npm", - "name": "npm:pkg-types@2.3.0", - "data": { - "version": "2.3.0", - "packageName": "pkg-types", - "hash": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==" - } - }, - "npm:postcss": { - "type": "npm", - "name": "npm:postcss", - "data": { - "version": "8.5.6", - "packageName": "postcss", - "hash": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==" - } - }, - "npm:prelude-ls": { - "type": "npm", - "name": "npm:prelude-ls", - "data": { - "version": "1.2.1", - "packageName": "prelude-ls", - "hash": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - } - }, - "npm:premove": { - "type": "npm", - "name": "npm:premove", - "data": { - "version": "4.0.0", - "packageName": "premove", - "hash": "sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==" - } - }, - "npm:prettier-plugin-svelte": { - "type": "npm", - "name": "npm:prettier-plugin-svelte", - "data": { - "version": "3.4.0", - "packageName": "prettier-plugin-svelte", - "hash": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==" - } - }, - "npm:prettier@2.8.8": { - "type": "npm", - "name": "npm:prettier@2.8.8", - "data": { - "version": "2.8.8", - "packageName": "prettier", - "hash": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" - } - }, - "npm:prettier": { - "type": "npm", - "name": "npm:prettier", - "data": { - "version": "3.6.2", - "packageName": "prettier", - "hash": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==" - } - }, - "npm:pretty-bytes": { - "type": "npm", - "name": "npm:pretty-bytes", - "data": { - "version": "7.1.0", - "packageName": "pretty-bytes", - "hash": "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==" - } - }, - "npm:pretty-format@27.5.1": { - "type": "npm", - "name": "npm:pretty-format@27.5.1", - "data": { - "version": "27.5.1", - "packageName": "pretty-format", - "hash": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==" - } - }, - "npm:pretty-format@30.2.0": { - "type": "npm", - "name": "npm:pretty-format@30.2.0", - "data": { - "version": "30.2.0", - "packageName": "pretty-format", - "hash": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==" - } - }, - "npm:process-nextick-args": { - "type": "npm", - "name": "npm:process-nextick-args", - "data": { - "version": "2.0.1", - "packageName": "process-nextick-args", - "hash": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - } - }, - "npm:process": { - "type": "npm", - "name": "npm:process", - "data": { - "version": "0.11.10", - "packageName": "process", - "hash": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" - } - }, - "npm:property-information@6.5.0": { - "type": "npm", - "name": "npm:property-information@6.5.0", - "data": { - "version": "6.5.0", - "packageName": "property-information", - "hash": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" - } - }, - "npm:property-information@7.1.0": { - "type": "npm", - "name": "npm:property-information@7.1.0", - "data": { - "version": "7.1.0", - "packageName": "property-information", - "hash": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==" - } - }, - "npm:proxy-from-env": { - "type": "npm", - "name": "npm:proxy-from-env", - "data": { - "version": "1.1.0", - "packageName": "proxy-from-env", - "hash": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - } - }, - "npm:publint": { - "type": "npm", - "name": "npm:publint", - "data": { - "version": "0.3.15", - "packageName": "publint", - "hash": "sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A==" - } - }, - "npm:punycode.js": { - "type": "npm", - "name": "npm:punycode.js", - "data": { - "version": "2.3.1", - "packageName": "punycode.js", - "hash": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" - } - }, - "npm:punycode": { - "type": "npm", - "name": "npm:punycode", - "data": { - "version": "2.3.1", - "packageName": "punycode", - "hash": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" - } - }, - "npm:quansync": { - "type": "npm", - "name": "npm:quansync", - "data": { - "version": "0.2.11", - "packageName": "quansync", - "hash": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==" - } - }, - "npm:queue-microtask": { - "type": "npm", - "name": "npm:queue-microtask", - "data": { - "version": "1.2.3", - "packageName": "queue-microtask", - "hash": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - } - }, - "npm:radix3": { - "type": "npm", - "name": "npm:radix3", - "data": { - "version": "1.1.2", - "packageName": "radix3", - "hash": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" - } - }, - "npm:randombytes": { - "type": "npm", - "name": "npm:randombytes", - "data": { - "version": "2.1.0", - "packageName": "randombytes", - "hash": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" - } - }, - "npm:range-parser": { - "type": "npm", - "name": "npm:range-parser", - "data": { - "version": "1.2.1", - "packageName": "range-parser", - "hash": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - } - }, - "npm:rc9": { - "type": "npm", - "name": "npm:rc9", - "data": { - "version": "2.1.2", - "packageName": "rc9", - "hash": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==" - } - }, - "npm:react-dom": { - "type": "npm", - "name": "npm:react-dom", - "data": { - "version": "19.2.0", - "packageName": "react-dom", - "hash": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==" - } - }, - "npm:react-is@17.0.2": { - "type": "npm", - "name": "npm:react-is@17.0.2", - "data": { - "version": "17.0.2", - "packageName": "react-is", - "hash": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - } - }, - "npm:react-is@18.3.1": { - "type": "npm", - "name": "npm:react-is@18.3.1", - "data": { - "version": "18.3.1", - "packageName": "react-is", - "hash": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - } - }, - "npm:react-markdown": { - "type": "npm", - "name": "npm:react-markdown", - "data": { - "version": "10.1.0", - "packageName": "react-markdown", - "hash": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==" - } - }, - "npm:react-refresh": { - "type": "npm", - "name": "npm:react-refresh", - "data": { - "version": "0.18.0", - "packageName": "react-refresh", - "hash": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==" - } - }, - "npm:react": { - "type": "npm", - "name": "npm:react", - "data": { - "version": "19.2.0", - "packageName": "react", - "hash": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==" - } - }, - "npm:read-yaml-file": { - "type": "npm", - "name": "npm:read-yaml-file", - "data": { - "version": "1.1.0", - "packageName": "read-yaml-file", - "hash": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==" - } - }, - "npm:readable-stream@2.3.8": { - "type": "npm", - "name": "npm:readable-stream@2.3.8", - "data": { - "version": "2.3.8", - "packageName": "readable-stream", - "hash": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" - } - }, - "npm:readable-stream@3.6.2": { - "type": "npm", - "name": "npm:readable-stream@3.6.2", - "data": { - "version": "3.6.2", - "packageName": "readable-stream", - "hash": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" - } - }, - "npm:readable-stream@4.7.0": { - "type": "npm", - "name": "npm:readable-stream@4.7.0", - "data": { - "version": "4.7.0", - "packageName": "readable-stream", - "hash": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==" - } - }, - "npm:readdir-glob": { - "type": "npm", - "name": "npm:readdir-glob", - "data": { - "version": "1.1.3", - "packageName": "readdir-glob", - "hash": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==" - } - }, - "npm:readdirp@3.6.0": { - "type": "npm", - "name": "npm:readdirp@3.6.0", - "data": { - "version": "3.6.0", - "packageName": "readdirp", - "hash": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" - } - }, - "npm:readdirp@4.1.2": { - "type": "npm", - "name": "npm:readdirp@4.1.2", - "data": { - "version": "4.1.2", - "packageName": "readdirp", - "hash": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==" - } - }, - "npm:recast": { - "type": "npm", - "name": "npm:recast", - "data": { - "version": "0.23.11", - "packageName": "recast", - "hash": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==" - } - }, - "npm:redent": { - "type": "npm", - "name": "npm:redent", - "data": { - "version": "3.0.0", - "packageName": "redent", - "hash": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==" - } - }, - "npm:redis-errors": { - "type": "npm", - "name": "npm:redis-errors", - "data": { - "version": "1.2.0", - "packageName": "redis-errors", - "hash": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" - } - }, - "npm:redis-parser": { - "type": "npm", - "name": "npm:redis-parser", - "data": { - "version": "3.0.0", - "packageName": "redis-parser", - "hash": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==" - } - }, - "npm:rehype-highlight": { - "type": "npm", - "name": "npm:rehype-highlight", - "data": { - "version": "7.0.2", - "packageName": "rehype-highlight", - "hash": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==" - } - }, - "npm:rehype-raw": { - "type": "npm", - "name": "npm:rehype-raw", - "data": { - "version": "7.0.0", - "packageName": "rehype-raw", - "hash": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==" - } - }, - "npm:rehype-sanitize": { - "type": "npm", - "name": "npm:rehype-sanitize", - "data": { - "version": "6.0.0", - "packageName": "rehype-sanitize", - "hash": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==" - } - }, - "npm:remark-gfm": { - "type": "npm", - "name": "npm:remark-gfm", - "data": { - "version": "4.0.1", - "packageName": "remark-gfm", - "hash": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==" - } - }, - "npm:remark-parse": { - "type": "npm", - "name": "npm:remark-parse", - "data": { - "version": "11.0.0", - "packageName": "remark-parse", - "hash": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==" - } - }, - "npm:remark-rehype": { - "type": "npm", - "name": "npm:remark-rehype", - "data": { - "version": "11.1.2", - "packageName": "remark-rehype", - "hash": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==" - } - }, - "npm:remark-stringify": { - "type": "npm", - "name": "npm:remark-stringify", - "data": { - "version": "11.0.0", - "packageName": "remark-stringify", - "hash": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==" - } - }, - "npm:require-directory": { - "type": "npm", - "name": "npm:require-directory", - "data": { - "version": "2.1.1", - "packageName": "require-directory", - "hash": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - } - }, - "npm:require-from-string": { - "type": "npm", - "name": "npm:require-from-string", - "data": { - "version": "2.0.2", - "packageName": "require-from-string", - "hash": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - } - }, - "npm:resolve-from@4.0.0": { - "type": "npm", - "name": "npm:resolve-from@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "resolve-from", - "hash": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - }, - "npm:resolve-from@5.0.0": { - "type": "npm", - "name": "npm:resolve-from@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "resolve-from", - "hash": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } - }, - "npm:resolve-pkg-maps": { - "type": "npm", - "name": "npm:resolve-pkg-maps", - "data": { - "version": "1.0.0", - "packageName": "resolve-pkg-maps", - "hash": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" - } - }, - "npm:resolve.exports": { - "type": "npm", - "name": "npm:resolve.exports", - "data": { - "version": "2.0.3", - "packageName": "resolve.exports", - "hash": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==" - } - }, - "npm:resolve": { - "type": "npm", - "name": "npm:resolve", - "data": { - "version": "1.22.11", - "packageName": "resolve", - "hash": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==" - } - }, - "npm:restore-cursor": { - "type": "npm", - "name": "npm:restore-cursor", - "data": { - "version": "3.1.0", - "packageName": "restore-cursor", - "hash": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==" - } - }, - "npm:reusify": { - "type": "npm", - "name": "npm:reusify", - "data": { - "version": "1.1.0", - "packageName": "reusify", - "hash": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" - } - }, - "npm:rimraf": { - "type": "npm", - "name": "npm:rimraf", - "data": { - "version": "5.0.10", - "packageName": "rimraf", - "hash": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==" - } - }, - "npm:rolldown": { - "type": "npm", - "name": "npm:rolldown", - "data": { - "version": "1.0.0-beta.51", - "packageName": "rolldown", - "hash": "sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==" - } - }, - "npm:rollup-plugin-preserve-directives": { - "type": "npm", - "name": "npm:rollup-plugin-preserve-directives", - "data": { - "version": "0.4.0", - "packageName": "rollup-plugin-preserve-directives", - "hash": "sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==" - } - }, - "npm:rollup-plugin-visualizer": { - "type": "npm", - "name": "npm:rollup-plugin-visualizer", - "data": { - "version": "6.0.5", - "packageName": "rollup-plugin-visualizer", - "hash": "sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==" - } - }, - "npm:rollup": { - "type": "npm", - "name": "npm:rollup", - "data": { - "version": "4.53.3", - "packageName": "rollup", - "hash": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==" - } - }, - "npm:rou3": { - "type": "npm", - "name": "npm:rou3", - "data": { - "version": "0.7.10", - "packageName": "rou3", - "hash": "sha512-aoFj6f7MJZ5muJ+Of79nrhs9N3oLGqi2VEMe94Zbkjb6Wupha46EuoYgpWSOZlXww3bbd8ojgXTAA2mzimX5Ww==" - } - }, - "npm:run-parallel": { - "type": "npm", - "name": "npm:run-parallel", - "data": { - "version": "1.2.0", - "packageName": "run-parallel", - "hash": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - } - }, - "npm:sade": { - "type": "npm", - "name": "npm:sade", - "data": { - "version": "1.8.1", - "packageName": "sade", - "hash": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==" - } - }, - "npm:safe-buffer@5.1.2": { - "type": "npm", - "name": "npm:safe-buffer@5.1.2", - "data": { - "version": "5.1.2", - "packageName": "safe-buffer", - "hash": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - }, - "npm:safe-buffer@5.2.1": { - "type": "npm", - "name": "npm:safe-buffer@5.2.1", - "data": { - "version": "5.2.1", - "packageName": "safe-buffer", - "hash": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - }, - "npm:safer-buffer": { - "type": "npm", - "name": "npm:safer-buffer", - "data": { - "version": "2.1.2", - "packageName": "safer-buffer", - "hash": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - } - }, - "npm:saxes": { - "type": "npm", - "name": "npm:saxes", - "data": { - "version": "6.0.0", - "packageName": "saxes", - "hash": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==" - } - }, - "npm:scheduler": { - "type": "npm", - "name": "npm:scheduler", - "data": { - "version": "0.27.0", - "packageName": "scheduler", - "hash": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" - } - }, - "npm:scule": { - "type": "npm", - "name": "npm:scule", - "data": { - "version": "1.3.0", - "packageName": "scule", - "hash": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" - } - }, - "npm:semver@6.3.1": { - "type": "npm", - "name": "npm:semver@6.3.1", - "data": { - "version": "6.3.1", - "packageName": "semver", - "hash": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - } - }, - "npm:semver@7.5.4": { - "type": "npm", - "name": "npm:semver@7.5.4", - "data": { - "version": "7.5.4", - "packageName": "semver", - "hash": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" - } - }, - "npm:semver@7.7.3": { - "type": "npm", - "name": "npm:semver@7.7.3", - "data": { - "version": "7.7.3", - "packageName": "semver", - "hash": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" - } - }, - "npm:send": { - "type": "npm", - "name": "npm:send", - "data": { - "version": "1.2.0", - "packageName": "send", - "hash": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==" - } - }, - "npm:serialize-javascript": { - "type": "npm", - "name": "npm:serialize-javascript", - "data": { - "version": "6.0.2", - "packageName": "serialize-javascript", - "hash": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==" - } - }, - "npm:seroval-plugins@1.3.3": { - "type": "npm", - "name": "npm:seroval-plugins@1.3.3", - "data": { - "version": "1.3.3", - "packageName": "seroval-plugins", - "hash": "sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==" - } - }, - "npm:seroval-plugins@1.4.0": { - "type": "npm", - "name": "npm:seroval-plugins@1.4.0", - "data": { - "version": "1.4.0", - "packageName": "seroval-plugins", - "hash": "sha512-zir1aWzoiax6pbBVjoYVd0O1QQXgIL3eVGBMsBsNmM8Ukq90yGaWlfx0AB9dTS8GPqrOrbXn79vmItCUP9U3BQ==" - } - }, - "npm:seroval@1.3.2": { - "type": "npm", - "name": "npm:seroval@1.3.2", - "data": { - "version": "1.3.2", - "packageName": "seroval", - "hash": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==" - } - }, - "npm:seroval@1.4.0": { - "type": "npm", - "name": "npm:seroval@1.4.0", - "data": { - "version": "1.4.0", - "packageName": "seroval", - "hash": "sha512-BdrNXdzlofomLTiRnwJTSEAaGKyHHZkbMXIywOh7zlzp4uZnXErEwl9XZ+N1hJSNpeTtNxWvVwN0wUzAIQ4Hpg==" - } - }, - "npm:serve-placeholder": { - "type": "npm", - "name": "npm:serve-placeholder", - "data": { - "version": "2.0.2", - "packageName": "serve-placeholder", - "hash": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==" - } - }, - "npm:serve-static": { - "type": "npm", - "name": "npm:serve-static", - "data": { - "version": "2.2.0", - "packageName": "serve-static", - "hash": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==" - } - }, - "npm:setprototypeof": { - "type": "npm", - "name": "npm:setprototypeof", - "data": { - "version": "1.2.0", - "packageName": "setprototypeof", - "hash": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - } - }, - "npm:shebang-command": { - "type": "npm", - "name": "npm:shebang-command", - "data": { - "version": "2.0.0", - "packageName": "shebang-command", - "hash": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" - } - }, - "npm:shebang-regex": { - "type": "npm", - "name": "npm:shebang-regex", - "data": { - "version": "3.0.0", - "packageName": "shebang-regex", - "hash": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - } - }, - "npm:sherif-darwin-arm64": { - "type": "npm", - "name": "npm:sherif-darwin-arm64", - "data": { - "version": "1.9.0", - "packageName": "sherif-darwin-arm64", - "hash": "sha512-R+RpKSzlqZgBHean04CqHrdlmBBKu6Dhd/9BcdCpjx/KpqsalZsh9LzBVxTWLTtT9IBb/ccr23PNqFzWQTuh6A==" - } - }, - "npm:sherif-darwin-x64": { - "type": "npm", - "name": "npm:sherif-darwin-x64", - "data": { - "version": "1.9.0", - "packageName": "sherif-darwin-x64", - "hash": "sha512-b/KX9MczzkzmyEjngGxYuBq/rOdM6CbGcDLFdQ0H990Dmn9foj4C/UpLlyqSxXcsJhy586ATMEVN68aM2hFQdQ==" - } - }, - "npm:sherif-linux-arm64-musl": { - "type": "npm", - "name": "npm:sherif-linux-arm64-musl", - "data": { - "version": "1.9.0", - "packageName": "sherif-linux-arm64-musl", - "hash": "sha512-OZ4cKcCXTJTl8zaTxKnP8z0wu05nDeGtttxRQjaXHSKK+fjBwGkH/1qqFEVDcRANUxtLRLLdwmDyxvqQrCzhPQ==" - } - }, - "npm:sherif-linux-arm64": { - "type": "npm", - "name": "npm:sherif-linux-arm64", - "data": { - "version": "1.9.0", - "packageName": "sherif-linux-arm64", - "hash": "sha512-TyuGhaD/efCxGIk4scx09n6NsTr3qfKvH5qHYdyxtelv1mHRgbzVHwJ+Jj98jVktuzOZoexHpxr/hz7RUjd/nw==" - } - }, - "npm:sherif-linux-x64-musl": { - "type": "npm", - "name": "npm:sherif-linux-x64-musl", - "data": { - "version": "1.9.0", - "packageName": "sherif-linux-x64-musl", - "hash": "sha512-JSbA6DN0HkWSabYU858BUkS4cMmkTsAamDZEYuUVDW+XvW9IjaI6o0HNatUr7oCjrITIfcjzqlqy7uizmNlr/A==" - } - }, - "npm:sherif-linux-x64": { - "type": "npm", - "name": "npm:sherif-linux-x64", - "data": { - "version": "1.9.0", - "packageName": "sherif-linux-x64", - "hash": "sha512-iO+hTxndO36r0hgmipBRjntWFqFHKrrYFRODz0WnmDquVek88LInSzAY1xpS18/Thbff8IVc6ssefYNVFQQPWw==" - } - }, - "npm:sherif-windows-arm64": { - "type": "npm", - "name": "npm:sherif-windows-arm64", - "data": { - "version": "1.9.0", - "packageName": "sherif-windows-arm64", - "hash": "sha512-lPqQXDB/95SJodtIbGAJc90O/KyxcunvKTycZqo+6RGjkOSYZB/XnRzm/tJ7If/6kz0/wcDP4uvkJmJxrxcj3A==" - } - }, - "npm:sherif-windows-x64": { - "type": "npm", - "name": "npm:sherif-windows-x64", - "data": { - "version": "1.9.0", - "packageName": "sherif-windows-x64", - "hash": "sha512-3cL+XVGLpmyLC3UOZYiPr4vY2OFBQqPZnCoCwoRKN+ONm8VfGMirO9iqI0OckgFBUtJoG4AQY/MWxoPhNmzD8A==" - } - }, - "npm:sherif": { - "type": "npm", - "name": "npm:sherif", - "data": { - "version": "1.9.0", - "packageName": "sherif", - "hash": "sha512-5n7zqPAjL+RzR7n09NPKpWBXmDCtuRpQzIL+ycj8pe6MayV7cDuFmceoyPQJ0c95oFj6feY7SZvhX/+S0i1ukg==" - } - }, - "npm:siginfo": { - "type": "npm", - "name": "npm:siginfo", - "data": { - "version": "2.0.0", - "packageName": "siginfo", - "hash": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==" - } - }, - "npm:signal-exit@3.0.7": { - "type": "npm", - "name": "npm:signal-exit@3.0.7", - "data": { - "version": "3.0.7", - "packageName": "signal-exit", - "hash": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - } - }, - "npm:signal-exit@4.1.0": { - "type": "npm", - "name": "npm:signal-exit@4.1.0", - "data": { - "version": "4.1.0", - "packageName": "signal-exit", - "hash": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" - } - }, - "npm:simple-git": { - "type": "npm", - "name": "npm:simple-git", - "data": { - "version": "3.30.0", - "packageName": "simple-git", - "hash": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==" - } - }, - "npm:size-limit": { - "type": "npm", - "name": "npm:size-limit", - "data": { - "version": "11.2.0", - "packageName": "size-limit", - "hash": "sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==" - } - }, - "npm:slash@3.0.0": { - "type": "npm", - "name": "npm:slash@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "slash", - "hash": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - } - }, - "npm:slash@5.1.0": { - "type": "npm", - "name": "npm:slash@5.1.0", - "data": { - "version": "5.1.0", - "packageName": "slash", - "hash": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==" - } - }, - "npm:smob": { - "type": "npm", - "name": "npm:smob", - "data": { - "version": "1.5.0", - "packageName": "smob", - "hash": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" - } - }, - "npm:smol-toml": { - "type": "npm", - "name": "npm:smol-toml", - "data": { - "version": "1.5.2", - "packageName": "smol-toml", - "hash": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==" - } - }, - "npm:solid-js": { - "type": "npm", - "name": "npm:solid-js", - "data": { - "version": "1.9.10", - "packageName": "solid-js", - "hash": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==" - } - }, - "npm:solid-refresh": { - "type": "npm", - "name": "npm:solid-refresh", - "data": { - "version": "0.6.3", - "packageName": "solid-refresh", - "hash": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==" - } - }, - "npm:source-map-js": { - "type": "npm", - "name": "npm:source-map-js", - "data": { - "version": "1.2.1", - "packageName": "source-map-js", - "hash": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" - } - }, - "npm:source-map-support": { - "type": "npm", - "name": "npm:source-map-support", - "data": { - "version": "0.5.21", - "packageName": "source-map-support", - "hash": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" - } - }, - "npm:source-map@0.6.1": { - "type": "npm", - "name": "npm:source-map@0.6.1", - "data": { - "version": "0.6.1", - "packageName": "source-map", - "hash": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - }, - "npm:source-map@0.7.6": { - "type": "npm", - "name": "npm:source-map@0.7.6", - "data": { - "version": "0.7.6", - "packageName": "source-map", - "hash": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==" - } - }, - "npm:space-separated-tokens": { - "type": "npm", - "name": "npm:space-separated-tokens", - "data": { - "version": "2.0.2", - "packageName": "space-separated-tokens", - "hash": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" - } - }, - "npm:spawndamnit": { - "type": "npm", - "name": "npm:spawndamnit", - "data": { - "version": "3.0.1", - "packageName": "spawndamnit", - "hash": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==" - } - }, - "npm:split2": { - "type": "npm", - "name": "npm:split2", - "data": { - "version": "4.2.0", - "packageName": "split2", - "hash": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" - } - }, - "npm:sprintf-js": { - "type": "npm", - "name": "npm:sprintf-js", - "data": { - "version": "1.0.3", - "packageName": "sprintf-js", - "hash": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - } - }, - "npm:srvx": { - "type": "npm", - "name": "npm:srvx", - "data": { - "version": "0.8.16", - "packageName": "srvx", - "hash": "sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==" - } - }, - "npm:stable-hash-x": { - "type": "npm", - "name": "npm:stable-hash-x", - "data": { - "version": "0.2.0", - "packageName": "stable-hash-x", - "hash": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==" - } - }, - "npm:stackback": { - "type": "npm", - "name": "npm:stackback", - "data": { - "version": "0.0.2", - "packageName": "stackback", - "hash": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" - } - }, - "npm:standard-as-callback": { - "type": "npm", - "name": "npm:standard-as-callback", - "data": { - "version": "2.1.0", - "packageName": "standard-as-callback", - "hash": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - } - }, - "npm:statuses@2.0.1": { - "type": "npm", - "name": "npm:statuses@2.0.1", - "data": { - "version": "2.0.1", - "packageName": "statuses", - "hash": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - } - }, - "npm:statuses@2.0.2": { - "type": "npm", - "name": "npm:statuses@2.0.2", - "data": { - "version": "2.0.2", - "packageName": "statuses", - "hash": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==" - } - }, - "npm:std-env": { - "type": "npm", - "name": "npm:std-env", - "data": { - "version": "3.10.0", - "packageName": "std-env", - "hash": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==" - } - }, - "npm:streamx": { - "type": "npm", - "name": "npm:streamx", - "data": { - "version": "2.23.0", - "packageName": "streamx", - "hash": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==" - } - }, - "npm:string-argv": { - "type": "npm", - "name": "npm:string-argv", - "data": { - "version": "0.3.2", - "packageName": "string-argv", - "hash": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" - } - }, - "npm:string-ts": { - "type": "npm", - "name": "npm:string-ts", - "data": { - "version": "2.2.1", - "packageName": "string-ts", - "hash": "sha512-Q2u0gko67PLLhbte5HmPfdOjNvUKbKQM+mCNQae6jE91DmoFHY6HH9GcdqCeNx87DZ2KKjiFxmA0R/42OneGWw==" - } - }, - "npm:string-width@4.2.3": { - "type": "npm", - "name": "npm:string-width@4.2.3", - "data": { - "version": "4.2.3", - "packageName": "string-width", - "hash": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - } - }, - "npm:string-width@5.1.2": { - "type": "npm", - "name": "npm:string-width@5.1.2", - "data": { - "version": "5.1.2", - "packageName": "string-width", - "hash": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==" - } - }, - "npm:string-width-cjs": { - "type": "npm", - "name": "npm:string-width-cjs", - "data": { - "version": "npm:string-width@4.2.3", - "packageName": "string-width-cjs", - "hash": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - } - }, - "npm:string_decoder@1.1.1": { - "type": "npm", - "name": "npm:string_decoder@1.1.1", - "data": { - "version": "1.1.1", - "packageName": "string_decoder", - "hash": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" - } - }, - "npm:string_decoder@1.3.0": { - "type": "npm", - "name": "npm:string_decoder@1.3.0", - "data": { - "version": "1.3.0", - "packageName": "string_decoder", - "hash": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" - } - }, - "npm:stringify-entities": { - "type": "npm", - "name": "npm:stringify-entities", - "data": { - "version": "4.0.4", - "packageName": "stringify-entities", - "hash": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==" - } - }, - "npm:strip-ansi@6.0.1": { - "type": "npm", - "name": "npm:strip-ansi@6.0.1", - "data": { - "version": "6.0.1", - "packageName": "strip-ansi", - "hash": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - } - }, - "npm:strip-ansi@7.1.2": { - "type": "npm", - "name": "npm:strip-ansi@7.1.2", - "data": { - "version": "7.1.2", - "packageName": "strip-ansi", - "hash": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==" - } - }, - "npm:strip-ansi-cjs": { - "type": "npm", - "name": "npm:strip-ansi-cjs", - "data": { - "version": "npm:strip-ansi@6.0.1", - "packageName": "strip-ansi-cjs", - "hash": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - } - }, - "npm:strip-bom": { - "type": "npm", - "name": "npm:strip-bom", - "data": { - "version": "3.0.0", - "packageName": "strip-bom", - "hash": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" - } - }, - "npm:strip-final-newline": { - "type": "npm", - "name": "npm:strip-final-newline", - "data": { - "version": "3.0.0", - "packageName": "strip-final-newline", - "hash": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" - } - }, - "npm:strip-indent": { - "type": "npm", - "name": "npm:strip-indent", - "data": { - "version": "3.0.0", - "packageName": "strip-indent", - "hash": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==" - } - }, - "npm:strip-json-comments@3.1.1": { - "type": "npm", - "name": "npm:strip-json-comments@3.1.1", - "data": { - "version": "3.1.1", - "packageName": "strip-json-comments", - "hash": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - } - }, - "npm:strip-json-comments@5.0.3": { - "type": "npm", - "name": "npm:strip-json-comments@5.0.3", - "data": { - "version": "5.0.3", - "packageName": "strip-json-comments", - "hash": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==" - } - }, - "npm:strip-literal": { - "type": "npm", - "name": "npm:strip-literal", - "data": { - "version": "3.1.0", - "packageName": "strip-literal", - "hash": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==" - } - }, - "npm:style-to-js": { - "type": "npm", - "name": "npm:style-to-js", - "data": { - "version": "1.1.18", - "packageName": "style-to-js", - "hash": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==" - } - }, - "npm:style-to-object": { - "type": "npm", - "name": "npm:style-to-object", - "data": { - "version": "1.0.11", - "packageName": "style-to-object", - "hash": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==" - } - }, - "npm:supports-color@10.2.2": { - "type": "npm", - "name": "npm:supports-color@10.2.2", - "data": { - "version": "10.2.2", - "packageName": "supports-color", - "hash": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==" - } - }, - "npm:supports-color@7.2.0": { - "type": "npm", - "name": "npm:supports-color@7.2.0", - "data": { - "version": "7.2.0", - "packageName": "supports-color", - "hash": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - } - }, - "npm:supports-color@8.1.1": { - "type": "npm", - "name": "npm:supports-color@8.1.1", - "data": { - "version": "8.1.1", - "packageName": "supports-color", - "hash": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" - } - }, - "npm:supports-preserve-symlinks-flag": { - "type": "npm", - "name": "npm:supports-preserve-symlinks-flag", - "data": { - "version": "1.0.0", - "packageName": "supports-preserve-symlinks-flag", - "hash": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - } - }, - "npm:svelte": { - "type": "npm", - "name": "npm:svelte", - "data": { - "version": "5.44.1", - "packageName": "svelte", - "hash": "sha512-8VnkRXpa6tJ9IqiwKvzZBNnBy9tZg0N63duDz0EJqiozsmBEAZfHiZzWWWAneIN+cAWkK1JkafW1xIbC4YrdBA==" - } - }, - "npm:symbol-tree": { - "type": "npm", - "name": "npm:symbol-tree", - "data": { - "version": "3.2.4", - "packageName": "symbol-tree", - "hash": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - } - }, - "npm:system-architecture": { - "type": "npm", - "name": "npm:system-architecture", - "data": { - "version": "0.1.0", - "packageName": "system-architecture", - "hash": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==" - } - }, - "npm:tagged-tag": { - "type": "npm", - "name": "npm:tagged-tag", - "data": { - "version": "1.0.0", - "packageName": "tagged-tag", - "hash": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==" - } - }, - "npm:tailwindcss": { - "type": "npm", - "name": "npm:tailwindcss", - "data": { - "version": "4.1.17", - "packageName": "tailwindcss", - "hash": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==" - } - }, - "npm:tapable": { - "type": "npm", - "name": "npm:tapable", - "data": { - "version": "2.3.0", - "packageName": "tapable", - "hash": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==" - } - }, - "npm:tar-stream@2.2.0": { - "type": "npm", - "name": "npm:tar-stream@2.2.0", - "data": { - "version": "2.2.0", - "packageName": "tar-stream", - "hash": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==" - } - }, - "npm:tar-stream@3.1.7": { - "type": "npm", - "name": "npm:tar-stream@3.1.7", - "data": { - "version": "3.1.7", - "packageName": "tar-stream", - "hash": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==" - } - }, - "npm:tar": { - "type": "npm", - "name": "npm:tar", - "data": { - "version": "7.5.2", - "packageName": "tar", - "hash": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==" - } - }, - "npm:term-size": { - "type": "npm", - "name": "npm:term-size", - "data": { - "version": "2.2.1", - "packageName": "term-size", - "hash": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" - } - }, - "npm:terser": { - "type": "npm", - "name": "npm:terser", - "data": { - "version": "5.44.0", - "packageName": "terser", - "hash": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==" - } - }, - "npm:text-decoder": { - "type": "npm", - "name": "npm:text-decoder", - "data": { - "version": "1.2.3", - "packageName": "text-decoder", - "hash": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==" - } - }, - "npm:text-extensions": { - "type": "npm", - "name": "npm:text-extensions", - "data": { - "version": "2.4.0", - "packageName": "text-extensions", - "hash": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==" - } - }, - "npm:through": { - "type": "npm", - "name": "npm:through", - "data": { - "version": "2.3.8", - "packageName": "through", - "hash": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - } - }, - "npm:tiny-invariant": { - "type": "npm", - "name": "npm:tiny-invariant", - "data": { - "version": "1.3.3", - "packageName": "tiny-invariant", - "hash": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - } - }, - "npm:tiny-warning": { - "type": "npm", - "name": "npm:tiny-warning", - "data": { - "version": "1.0.3", - "packageName": "tiny-warning", - "hash": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - } - }, - "npm:tinybench": { - "type": "npm", - "name": "npm:tinybench", - "data": { - "version": "2.9.0", - "packageName": "tinybench", - "hash": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" - } - }, - "npm:tinyexec@0.3.2": { - "type": "npm", - "name": "npm:tinyexec@0.3.2", - "data": { - "version": "0.3.2", - "packageName": "tinyexec", - "hash": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" - } - }, - "npm:tinyexec@1.0.1": { - "type": "npm", - "name": "npm:tinyexec@1.0.1", - "data": { - "version": "1.0.1", - "packageName": "tinyexec", - "hash": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==" - } - }, - "npm:tinyglobby": { - "type": "npm", - "name": "npm:tinyglobby", - "data": { - "version": "0.2.15", - "packageName": "tinyglobby", - "hash": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==" - } - }, - "npm:tinyrainbow": { - "type": "npm", - "name": "npm:tinyrainbow", - "data": { - "version": "3.0.3", - "packageName": "tinyrainbow", - "hash": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==" - } - }, - "npm:tldts-core": { - "type": "npm", - "name": "npm:tldts-core", - "data": { - "version": "7.0.16", - "packageName": "tldts-core", - "hash": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==" - } - }, - "npm:tldts": { - "type": "npm", - "name": "npm:tldts", - "data": { - "version": "7.0.16", - "packageName": "tldts", - "hash": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==" - } - }, - "npm:tmp": { - "type": "npm", - "name": "npm:tmp", - "data": { - "version": "0.2.5", - "packageName": "tmp", - "hash": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==" - } - }, - "npm:to-regex-range": { - "type": "npm", - "name": "npm:to-regex-range", - "data": { - "version": "5.0.1", - "packageName": "to-regex-range", - "hash": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - } - }, - "npm:toidentifier": { - "type": "npm", - "name": "npm:toidentifier", - "data": { - "version": "1.0.1", - "packageName": "toidentifier", - "hash": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - } - }, - "npm:tough-cookie": { - "type": "npm", - "name": "npm:tough-cookie", - "data": { - "version": "6.0.0", - "packageName": "tough-cookie", - "hash": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==" - } - }, - "npm:tr46@0.0.3": { - "type": "npm", - "name": "npm:tr46@0.0.3", - "data": { - "version": "0.0.3", - "packageName": "tr46", - "hash": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - } - }, - "npm:tr46@6.0.0": { - "type": "npm", - "name": "npm:tr46@6.0.0", - "data": { - "version": "6.0.0", - "packageName": "tr46", - "hash": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==" - } - }, - "npm:tree-kill": { - "type": "npm", - "name": "npm:tree-kill", - "data": { - "version": "1.2.2", - "packageName": "tree-kill", - "hash": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - } - }, - "npm:trim-lines": { - "type": "npm", - "name": "npm:trim-lines", - "data": { - "version": "3.0.1", - "packageName": "trim-lines", - "hash": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" - } - }, - "npm:trough": { - "type": "npm", - "name": "npm:trough", - "data": { - "version": "2.2.0", - "packageName": "trough", - "hash": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" - } - }, - "npm:ts-algebra": { - "type": "npm", - "name": "npm:ts-algebra", - "data": { - "version": "2.0.0", - "packageName": "ts-algebra", - "hash": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==" - } - }, - "npm:ts-api-utils": { - "type": "npm", - "name": "npm:ts-api-utils", - "data": { - "version": "2.1.0", - "packageName": "ts-api-utils", - "hash": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==" - } - }, - "npm:ts-declaration-location": { - "type": "npm", - "name": "npm:ts-declaration-location", - "data": { - "version": "1.0.7", - "packageName": "ts-declaration-location", - "hash": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==" - } - }, - "npm:ts-pattern": { - "type": "npm", - "name": "npm:ts-pattern", - "data": { - "version": "5.9.0", - "packageName": "ts-pattern", - "hash": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==" - } - }, - "npm:tsconfck": { - "type": "npm", - "name": "npm:tsconfck", - "data": { - "version": "3.1.6", - "packageName": "tsconfck", - "hash": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==" - } - }, - "npm:tsconfig-paths": { - "type": "npm", - "name": "npm:tsconfig-paths", - "data": { - "version": "4.2.0", - "packageName": "tsconfig-paths", - "hash": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==" - } - }, - "npm:tslib": { - "type": "npm", - "name": "npm:tslib", - "data": { - "version": "2.8.1", - "packageName": "tslib", - "hash": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - } - }, - "npm:tsx": { - "type": "npm", - "name": "npm:tsx", - "data": { - "version": "4.20.6", - "packageName": "tsx", - "hash": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==" - } - }, - "npm:type-check": { - "type": "npm", - "name": "npm:type-check", - "data": { - "version": "0.4.0", - "packageName": "type-check", - "hash": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" - } - }, - "npm:type-fest": { - "type": "npm", - "name": "npm:type-fest", - "data": { - "version": "5.1.0", - "packageName": "type-fest", - "hash": "sha512-wQ531tuWvB6oK+pchHIu5lHe5f5wpSCqB8Kf4dWQRbOYc9HTge7JL0G4Qd44bh6QuJCccIzL3bugb8GI0MwHrg==" - } - }, - "npm:typedoc-plugin-frontmatter": { - "type": "npm", - "name": "npm:typedoc-plugin-frontmatter", - "data": { - "version": "1.3.0", - "packageName": "typedoc-plugin-frontmatter", - "hash": "sha512-xYQFMAecMlsRUjmf9oM/Sq2FVz4zlgcbIeVFNLdO118CHTN06gIKJNSlyExh9+Xl8sK0YhIvoQwViUURxritWA==" - } - }, - "npm:typedoc-plugin-markdown": { - "type": "npm", - "name": "npm:typedoc-plugin-markdown", - "data": { - "version": "4.9.0", - "packageName": "typedoc-plugin-markdown", - "hash": "sha512-9Uu4WR9L7ZBgAl60N/h+jqmPxxvnC9nQAlnnO/OujtG2ubjnKTVUFY1XDhcMY+pCqlX3N2HsQM2QTYZIU9tJuw==" - } - }, - "npm:typedoc": { - "type": "npm", - "name": "npm:typedoc", - "data": { - "version": "0.28.14", - "packageName": "typedoc", - "hash": "sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==" - } - }, - "npm:typescript-eslint": { - "type": "npm", - "name": "npm:typescript-eslint", - "data": { - "version": "8.46.3", - "packageName": "typescript-eslint", - "hash": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==" - } - }, - "npm:typescript@5.4.2": { - "type": "npm", - "name": "npm:typescript@5.4.2", - "data": { - "version": "5.4.2", - "packageName": "typescript", - "hash": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==" - } - }, - "npm:typescript": { - "type": "npm", - "name": "npm:typescript", - "data": { - "version": "5.9.3", - "packageName": "typescript", - "hash": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==" - } - }, - "npm:uc.micro": { - "type": "npm", - "name": "npm:uc.micro", - "data": { - "version": "2.1.0", - "packageName": "uc.micro", - "hash": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" - } - }, - "npm:ufo": { - "type": "npm", - "name": "npm:ufo", - "data": { - "version": "1.6.1", - "packageName": "ufo", - "hash": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==" - } - }, - "npm:ultrahtml": { - "type": "npm", - "name": "npm:ultrahtml", - "data": { - "version": "1.6.0", - "packageName": "ultrahtml", - "hash": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==" - } - }, - "npm:uncrypto": { - "type": "npm", - "name": "npm:uncrypto", - "data": { - "version": "0.1.3", - "packageName": "uncrypto", - "hash": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" - } - }, - "npm:unctx": { - "type": "npm", - "name": "npm:unctx", - "data": { - "version": "2.4.1", - "packageName": "unctx", - "hash": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==" - } - }, - "npm:undici-types@6.21.0": { - "type": "npm", - "name": "npm:undici-types@6.21.0", - "data": { - "version": "6.21.0", - "packageName": "undici-types", - "hash": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" - } - }, - "npm:undici-types@7.16.0": { - "type": "npm", - "name": "npm:undici-types@7.16.0", - "data": { - "version": "7.16.0", - "packageName": "undici-types", - "hash": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" - } - }, - "npm:undici": { - "type": "npm", - "name": "npm:undici", - "data": { - "version": "7.16.0", - "packageName": "undici", - "hash": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==" - } - }, - "npm:unenv": { - "type": "npm", - "name": "npm:unenv", - "data": { - "version": "2.0.0-rc.24", - "packageName": "unenv", - "hash": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==" - } - }, - "npm:unicorn-magic": { - "type": "npm", - "name": "npm:unicorn-magic", - "data": { - "version": "0.3.0", - "packageName": "unicorn-magic", - "hash": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==" - } - }, - "npm:unified": { - "type": "npm", - "name": "npm:unified", - "data": { - "version": "11.0.5", - "packageName": "unified", - "hash": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==" - } - }, - "npm:unimport": { - "type": "npm", - "name": "npm:unimport", - "data": { - "version": "5.5.0", - "packageName": "unimport", - "hash": "sha512-/JpWMG9s1nBSlXJAQ8EREFTFy3oy6USFd8T6AoBaw1q2GGcF4R9yp3ofg32UODZlYEO5VD0EWE1RpI9XDWyPYg==" - } - }, - "npm:unist-util-find-after": { - "type": "npm", - "name": "npm:unist-util-find-after", - "data": { - "version": "5.0.0", - "packageName": "unist-util-find-after", - "hash": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==" - } - }, - "npm:unist-util-is": { - "type": "npm", - "name": "npm:unist-util-is", - "data": { - "version": "6.0.1", - "packageName": "unist-util-is", - "hash": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==" - } - }, - "npm:unist-util-position": { - "type": "npm", - "name": "npm:unist-util-position", - "data": { - "version": "5.0.0", - "packageName": "unist-util-position", - "hash": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==" - } - }, - "npm:unist-util-stringify-position": { - "type": "npm", - "name": "npm:unist-util-stringify-position", - "data": { - "version": "4.0.0", - "packageName": "unist-util-stringify-position", - "hash": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==" - } - }, - "npm:unist-util-visit-parents": { - "type": "npm", - "name": "npm:unist-util-visit-parents", - "data": { - "version": "6.0.2", - "packageName": "unist-util-visit-parents", - "hash": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==" - } - }, - "npm:unist-util-visit": { - "type": "npm", - "name": "npm:unist-util-visit", - "data": { - "version": "5.0.0", - "packageName": "unist-util-visit", - "hash": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==" - } - }, - "npm:universalify@0.1.2": { - "type": "npm", - "name": "npm:universalify@0.1.2", - "data": { - "version": "0.1.2", - "packageName": "universalify", - "hash": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } - }, - "npm:universalify@2.0.1": { - "type": "npm", - "name": "npm:universalify@2.0.1", - "data": { - "version": "2.0.1", - "packageName": "universalify", - "hash": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" - } - }, - "npm:unplugin-utils": { - "type": "npm", - "name": "npm:unplugin-utils", - "data": { - "version": "0.3.1", - "packageName": "unplugin-utils", - "hash": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==" - } - }, - "npm:unplugin": { - "type": "npm", - "name": "npm:unplugin", - "data": { - "version": "2.3.10", - "packageName": "unplugin", - "hash": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==" - } - }, - "npm:unrs-resolver": { - "type": "npm", - "name": "npm:unrs-resolver", - "data": { - "version": "1.11.1", - "packageName": "unrs-resolver", - "hash": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==" - } - }, - "npm:unstorage": { - "type": "npm", - "name": "npm:unstorage", - "data": { - "version": "1.17.2", - "packageName": "unstorage", - "hash": "sha512-cKEsD6iBWJgOMJ6vW1ID/SYuqNf8oN4yqRk8OYqaVQ3nnkJXOT1PSpaMh2QfzLs78UN5kSNRD2c/mgjT8tX7+w==" - } - }, - "npm:untun": { - "type": "npm", - "name": "npm:untun", - "data": { - "version": "0.1.3", - "packageName": "untun", - "hash": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==" - } - }, - "npm:untyped": { - "type": "npm", - "name": "npm:untyped", - "data": { - "version": "2.0.0", - "packageName": "untyped", - "hash": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==" - } - }, - "npm:unwasm": { - "type": "npm", - "name": "npm:unwasm", - "data": { - "version": "0.3.11", - "packageName": "unwasm", - "hash": "sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ==" - } - }, - "npm:update-browserslist-db": { - "type": "npm", - "name": "npm:update-browserslist-db", - "data": { - "version": "1.1.4", - "packageName": "update-browserslist-db", - "hash": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==" - } - }, - "npm:uqr": { - "type": "npm", - "name": "npm:uqr", - "data": { - "version": "0.1.2", - "packageName": "uqr", - "hash": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" - } - }, - "npm:uri-js": { - "type": "npm", - "name": "npm:uri-js", - "data": { - "version": "4.4.1", - "packageName": "uri-js", - "hash": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - } - }, - "npm:use-sync-external-store": { - "type": "npm", - "name": "npm:use-sync-external-store", - "data": { - "version": "1.6.0", - "packageName": "use-sync-external-store", - "hash": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==" - } - }, - "npm:util-deprecate": { - "type": "npm", - "name": "npm:util-deprecate", - "data": { - "version": "1.0.2", - "packageName": "util-deprecate", - "hash": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - } - }, - "npm:vfile-location": { - "type": "npm", - "name": "npm:vfile-location", - "data": { - "version": "5.0.3", - "packageName": "vfile-location", - "hash": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==" - } - }, - "npm:vfile-message": { - "type": "npm", - "name": "npm:vfile-message", - "data": { - "version": "4.0.3", - "packageName": "vfile-message", - "hash": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==" - } - }, - "npm:vfile": { - "type": "npm", - "name": "npm:vfile", - "data": { - "version": "6.0.3", - "packageName": "vfile", - "hash": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==" - } - }, - "npm:vite-plugin-dts": { - "type": "npm", - "name": "npm:vite-plugin-dts", - "data": { - "version": "4.2.3", - "packageName": "vite-plugin-dts", - "hash": "sha512-O5NalzHANQRwVw1xj8KQun3Bv8OSDAlNJXrnqoAz10BOuW8FVvY5g4ygj+DlJZL5mtSPuMu9vd3OfrdW5d4k6w==" - } - }, - "npm:vite-plugin-externalize-deps": { - "type": "npm", - "name": "npm:vite-plugin-externalize-deps", - "data": { - "version": "0.10.0", - "packageName": "vite-plugin-externalize-deps", - "hash": "sha512-eQrtpT/Do7AvDn76l1yL6ZHyXJ+UWH2LaHVqhAes9go54qaAnPZuMbgxcroQ/7WY3ZyetZzYW2quQnDF0DV5qg==" - } - }, - "npm:vite-plugin-solid": { - "type": "npm", - "name": "npm:vite-plugin-solid", - "data": { - "version": "2.11.10", - "packageName": "vite-plugin-solid", - "hash": "sha512-Yr1dQybmtDtDAHkii6hXuc1oVH9CPcS/Zb2jN/P36qqcrkNnVPsMTzQ06jyzFPFjj3U1IYKMVt/9ZqcwGCEbjw==" - } - }, - "npm:vite-tsconfig-paths": { - "type": "npm", - "name": "npm:vite-tsconfig-paths", - "data": { - "version": "5.1.4", - "packageName": "vite-tsconfig-paths", - "hash": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==" - } - }, - "npm:vite": { - "type": "npm", - "name": "npm:vite", - "data": { - "version": "7.2.4", - "packageName": "vite", - "hash": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==" - } - }, - "npm:vitefu": { - "type": "npm", - "name": "npm:vitefu", - "data": { - "version": "1.1.1", - "packageName": "vitefu", - "hash": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==" - } - }, - "npm:vitest": { - "type": "npm", - "name": "npm:vitest", - "data": { - "version": "4.0.14", - "packageName": "vitest", - "hash": "sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==" - } - }, - "npm:vscode-uri": { - "type": "npm", - "name": "npm:vscode-uri", - "data": { - "version": "3.1.0", - "packageName": "vscode-uri", - "hash": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" - } - }, - "npm:vue-eslint-parser": { - "type": "npm", - "name": "npm:vue-eslint-parser", - "data": { - "version": "10.2.0", - "packageName": "vue-eslint-parser", - "hash": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==" - } - }, - "npm:w3c-xmlserializer": { - "type": "npm", - "name": "npm:w3c-xmlserializer", - "data": { - "version": "5.0.0", - "packageName": "w3c-xmlserializer", - "hash": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==" - } - }, - "npm:walk-up-path": { - "type": "npm", - "name": "npm:walk-up-path", - "data": { - "version": "4.0.0", - "packageName": "walk-up-path", - "hash": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==" - } - }, - "npm:wcwidth": { - "type": "npm", - "name": "npm:wcwidth", - "data": { - "version": "1.0.1", - "packageName": "wcwidth", - "hash": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==" - } - }, - "npm:web-namespaces": { - "type": "npm", - "name": "npm:web-namespaces", - "data": { - "version": "2.0.1", - "packageName": "web-namespaces", - "hash": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" - } - }, - "npm:web-streams-polyfill": { - "type": "npm", - "name": "npm:web-streams-polyfill", - "data": { - "version": "3.3.3", - "packageName": "web-streams-polyfill", - "hash": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" - } - }, - "npm:web-vitals": { - "type": "npm", - "name": "npm:web-vitals", - "data": { - "version": "5.1.0", - "packageName": "web-vitals", - "hash": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==" - } - }, - "npm:webidl-conversions@3.0.1": { - "type": "npm", - "name": "npm:webidl-conversions@3.0.1", - "data": { - "version": "3.0.1", - "packageName": "webidl-conversions", - "hash": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - } - }, - "npm:webidl-conversions@8.0.0": { - "type": "npm", - "name": "npm:webidl-conversions@8.0.0", - "data": { - "version": "8.0.0", - "packageName": "webidl-conversions", - "hash": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==" - } - }, - "npm:webpack-virtual-modules": { - "type": "npm", - "name": "npm:webpack-virtual-modules", - "data": { - "version": "0.6.2", - "packageName": "webpack-virtual-modules", - "hash": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" - } - }, - "npm:whatwg-encoding": { - "type": "npm", - "name": "npm:whatwg-encoding", - "data": { - "version": "3.1.1", - "packageName": "whatwg-encoding", - "hash": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==" - } - }, - "npm:whatwg-fetch": { - "type": "npm", - "name": "npm:whatwg-fetch", - "data": { - "version": "3.6.20", - "packageName": "whatwg-fetch", - "hash": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" - } - }, - "npm:whatwg-mimetype@3.0.0": { - "type": "npm", - "name": "npm:whatwg-mimetype@3.0.0", - "data": { - "version": "3.0.0", - "packageName": "whatwg-mimetype", - "hash": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" - } - }, - "npm:whatwg-mimetype@4.0.0": { - "type": "npm", - "name": "npm:whatwg-mimetype@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "whatwg-mimetype", - "hash": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==" - } - }, - "npm:whatwg-url@15.1.0": { - "type": "npm", - "name": "npm:whatwg-url@15.1.0", - "data": { - "version": "15.1.0", - "packageName": "whatwg-url", - "hash": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==" - } - }, - "npm:whatwg-url@5.0.0": { - "type": "npm", - "name": "npm:whatwg-url@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "whatwg-url", - "hash": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" - } - }, - "npm:which": { - "type": "npm", - "name": "npm:which", - "data": { - "version": "2.0.2", - "packageName": "which", - "hash": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" - } - }, - "npm:why-is-node-running": { - "type": "npm", - "name": "npm:why-is-node-running", - "data": { - "version": "2.3.0", - "packageName": "why-is-node-running", - "hash": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==" - } - }, - "npm:word-wrap": { - "type": "npm", - "name": "npm:word-wrap", - "data": { - "version": "1.2.5", - "packageName": "word-wrap", - "hash": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" - } - }, - "npm:wrap-ansi@7.0.0": { - "type": "npm", - "name": "npm:wrap-ansi@7.0.0", - "data": { - "version": "7.0.0", - "packageName": "wrap-ansi", - "hash": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - } - }, - "npm:wrap-ansi@8.1.0": { - "type": "npm", - "name": "npm:wrap-ansi@8.1.0", - "data": { - "version": "8.1.0", - "packageName": "wrap-ansi", - "hash": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==" - } - }, - "npm:wrap-ansi-cjs": { - "type": "npm", - "name": "npm:wrap-ansi-cjs", - "data": { - "version": "npm:wrap-ansi@7.0.0", - "packageName": "wrap-ansi-cjs", - "hash": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - } - }, - "npm:wrappy": { - "type": "npm", - "name": "npm:wrappy", - "data": { - "version": "1.0.2", - "packageName": "wrappy", - "hash": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - } - }, - "npm:ws": { - "type": "npm", - "name": "npm:ws", - "data": { - "version": "8.18.3", - "packageName": "ws", - "hash": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==" - } - }, - "npm:xml-name-validator": { - "type": "npm", - "name": "npm:xml-name-validator", - "data": { - "version": "5.0.0", - "packageName": "xml-name-validator", - "hash": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==" - } - }, - "npm:xmlbuilder2": { - "type": "npm", - "name": "npm:xmlbuilder2", - "data": { - "version": "4.0.1", - "packageName": "xmlbuilder2", - "hash": "sha512-vXeky0YRVjhx5pseJDQLk0F6u7gyA8++ceVOS88r4dWu4lWdY/ZjbL45QrN+g0GzZLg1D5AkzThpikZa98SC/g==" - } - }, - "npm:xmlchars": { - "type": "npm", - "name": "npm:xmlchars", - "data": { - "version": "2.2.0", - "packageName": "xmlchars", - "hash": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - } - }, - "npm:y18n": { - "type": "npm", - "name": "npm:y18n", - "data": { - "version": "5.0.8", - "packageName": "y18n", - "hash": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - } - }, - "npm:yallist@3.1.1": { - "type": "npm", - "name": "npm:yallist@3.1.1", - "data": { - "version": "3.1.1", - "packageName": "yallist", - "hash": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - }, - "npm:yallist@4.0.0": { - "type": "npm", - "name": "npm:yallist@4.0.0", - "data": { - "version": "4.0.0", - "packageName": "yallist", - "hash": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - }, - "npm:yallist@5.0.0": { - "type": "npm", - "name": "npm:yallist@5.0.0", - "data": { - "version": "5.0.0", - "packageName": "yallist", - "hash": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==" - } - }, - "npm:yaml": { - "type": "npm", - "name": "npm:yaml", - "data": { - "version": "2.8.1", - "packageName": "yaml", - "hash": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==" - } - }, - "npm:yargs-parser": { - "type": "npm", - "name": "npm:yargs-parser", - "data": { - "version": "21.1.1", - "packageName": "yargs-parser", - "hash": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - } - }, - "npm:yargs": { - "type": "npm", - "name": "npm:yargs", - "data": { - "version": "17.7.2", - "packageName": "yargs", - "hash": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==" - } - }, - "npm:yocto-queue": { - "type": "npm", - "name": "npm:yocto-queue", - "data": { - "version": "0.1.0", - "packageName": "yocto-queue", - "hash": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - } - }, - "npm:youch-core": { - "type": "npm", - "name": "npm:youch-core", - "data": { - "version": "0.3.3", - "packageName": "youch-core", - "hash": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==" - } - }, - "npm:youch": { - "type": "npm", - "name": "npm:youch", - "data": { - "version": "4.1.0-beta.11", - "packageName": "youch", - "hash": "sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==" - } - }, - "npm:zimmerframe": { - "type": "npm", - "name": "npm:zimmerframe", - "data": { - "version": "1.1.4", - "packageName": "zimmerframe", - "hash": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==" - } - }, - "npm:zip-stream": { - "type": "npm", - "name": "npm:zip-stream", - "data": { - "version": "6.0.1", - "packageName": "zip-stream", - "hash": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==" - } - }, - "npm:zod-validation-error@3.5.4": { - "type": "npm", - "name": "npm:zod-validation-error@3.5.4", - "data": { - "version": "3.5.4", - "packageName": "zod-validation-error", - "hash": "sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==" - } - }, - "npm:zod-validation-error@4.0.2": { - "type": "npm", - "name": "npm:zod-validation-error@4.0.2", - "data": { - "version": "4.0.2", - "packageName": "zod-validation-error", - "hash": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==" - } - }, - "npm:zod@3.25.76": { - "type": "npm", - "name": "npm:zod@3.25.76", - "data": { - "version": "3.25.76", - "packageName": "zod", - "hash": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" - } - }, - "npm:zod@4.1.13": { - "type": "npm", - "name": "npm:zod@4.1.13", - "data": { - "version": "4.1.13", - "packageName": "zod", - "hash": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==" - } - }, - "npm:zwitch": { - "type": "npm", - "name": "npm:zwitch", - "data": { - "version": "2.0.4", - "packageName": "zwitch", - "hash": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" - } - } - }, - "dependencies": { - "@tanstack/react-ai-devtools": [ - { - "source": "@tanstack/react-ai-devtools", - "target": "npm:react", - "type": "static" - }, - { - "source": "@tanstack/react-ai-devtools", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "@tanstack/react-ai-devtools", - "target": "npm:@tanstack/devtools-utils", - "type": "static" - }, - { - "source": "@tanstack/react-ai-devtools", - "target": "@tanstack/ai-devtools-core", - "type": "static" - } - ], - "@tanstack/solid-ai-devtools": [ - { - "source": "@tanstack/solid-ai-devtools", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "@tanstack/solid-ai-devtools", - "target": "npm:vite-plugin-solid", - "type": "static" - }, - { - "source": "@tanstack/solid-ai-devtools", - "target": "@tanstack/ai-devtools-core", - "type": "static" - }, - { - "source": "@tanstack/solid-ai-devtools", - "target": "npm:@tanstack/devtools-utils", - "type": "static" - } - ], - "@tanstack/tests-adapters": [ - { - "source": "@tanstack/tests-adapters", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "@tanstack/tests-adapters", - "target": "npm:dotenv@17.2.3", - "type": "static" - }, - { - "source": "@tanstack/tests-adapters", - "target": "npm:tsx", - "type": "static" - }, - { - "source": "@tanstack/tests-adapters", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "@tanstack/tests-adapters", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "@tanstack/tests-adapters", - "target": "@tanstack/ai-anthropic", - "type": "static" - }, - { - "source": "@tanstack/tests-adapters", - "target": "@tanstack/ai-gemini", - "type": "static" - }, - { - "source": "@tanstack/tests-adapters", - "target": "@tanstack/ai-ollama", - "type": "static" - }, - { - "source": "@tanstack/tests-adapters", - "target": "@tanstack/ai-openai", - "type": "static" - } - ], - "@tanstack/ai-anthropic": [ - { - "source": "@tanstack/ai-anthropic", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "@tanstack/ai-anthropic", - "target": "npm:@anthropic-ai/sdk", - "type": "static" - } - ], - "@tanstack/ai-devtools-core": [ - { - "source": "@tanstack/ai-devtools-core", - "target": "npm:vite-plugin-solid", - "type": "static" - }, - { - "source": "@tanstack/ai-devtools-core", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "@tanstack/ai-devtools-core", - "target": "npm:@tanstack/devtools-ui", - "type": "static" - }, - { - "source": "@tanstack/ai-devtools-core", - "target": "npm:@tanstack/devtools-utils", - "type": "static" - }, - { - "source": "@tanstack/ai-devtools-core", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "@tanstack/ai-devtools-core", - "target": "npm:goober", - "type": "static" - }, - { - "source": "@tanstack/ai-devtools-core", - "target": "npm:solid-js", - "type": "static" - } - ], - "@tanstack/ai-fallback": [ - { - "source": "@tanstack/ai-fallback", - "target": "@tanstack/ai", - "type": "static" - } - ], - "@tanstack/ai-react-ui": [ - { - "source": "@tanstack/ai-react-ui", - "target": "@tanstack/ai-client", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "@tanstack/ai-react", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:react", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:highlight.js", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:react-markdown", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:rehype-highlight", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:rehype-raw", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:rehype-sanitize", - "type": "static" - }, - { - "source": "@tanstack/ai-react-ui", - "target": "npm:remark-gfm", - "type": "static" - } - ], - "@tanstack/ai-client": [ - { - "source": "@tanstack/ai-client", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "@tanstack/ai-client", - "target": "npm:partial-json", - "type": "static" - } - ], - "@tanstack/ai-gemini": [ - { - "source": "@tanstack/ai-gemini", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "@tanstack/ai-gemini", - "target": "npm:@google/genai", - "type": "static" - } - ], - "@tanstack/ai-ollama": [ - { - "source": "@tanstack/ai-ollama", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "@tanstack/ai-ollama", - "target": "npm:ollama", - "type": "static" - } - ], - "@tanstack/ai-openai": [ - { - "source": "@tanstack/ai-openai", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "@tanstack/ai-openai", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "@tanstack/ai-openai", - "target": "npm:openai", - "type": "static" - } - ], - "@tanstack/ai-react": [ - { - "source": "@tanstack/ai-react", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "@tanstack/ai-react", - "target": "@tanstack/ai-client", - "type": "static" - }, - { - "source": "@tanstack/ai-react", - "target": "npm:react", - "type": "static" - }, - { - "source": "@tanstack/ai-react", - "target": "npm:@eslint-react/eslint-plugin", - "type": "static" - }, - { - "source": "@tanstack/ai-react", - "target": "npm:@testing-library/react", - "type": "static" - }, - { - "source": "@tanstack/ai-react", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "@tanstack/ai-react", - "target": "npm:@vitejs/plugin-react", - "type": "static" - }, - { - "source": "@tanstack/ai-react", - "target": "npm:eslint-plugin-react-compiler", - "type": "static" - }, - { - "source": "@tanstack/ai-react", - "target": "npm:eslint-plugin-react-hooks", - "type": "static" - } - ], - "@tanstack/ai": [ - { - "source": "@tanstack/ai", - "target": "npm:@tanstack/devtools-event-client", - "type": "static" - } - ], - "vanilla-chat": [ - { - "source": "vanilla-chat", - "target": "npm:vite", - "type": "static" - }, - { - "source": "vanilla-chat", - "target": "@tanstack/ai-client", - "type": "static" - } - ], - "ts-chat": [ - { - "source": "ts-chat", - "target": "npm:@testing-library/dom", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@testing-library/react", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@types/react-dom", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@vitejs/plugin-react", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:jsdom", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:vite", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:vitest", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:web-vitals", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@ai-sdk/openai", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@ai-sdk/provider", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@ai-sdk/provider-utils", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tailwindcss/vite", - "type": "static" - }, - { - "source": "ts-chat", - "target": "@tanstack/ai", - "type": "static" - }, - { - "source": "ts-chat", - "target": "@tanstack/ai-anthropic", - "type": "static" - }, - { - "source": "ts-chat", - "target": "@tanstack/ai-client", - "type": "static" - }, - { - "source": "ts-chat", - "target": "@tanstack/ai-gemini", - "type": "static" - }, - { - "source": "ts-chat", - "target": "@tanstack/ai-ollama", - "type": "static" - }, - { - "source": "ts-chat", - "target": "@tanstack/ai-openai", - "type": "static" - }, - { - "source": "ts-chat", - "target": "@tanstack/ai-react", - "type": "static" - }, - { - "source": "ts-chat", - "target": "@tanstack/ai-react-ui", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/nitro-v2-vite-plugin", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/react-devtools", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/react-router-devtools", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/react-router-ssr-query", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/react-start", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/react-store", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/router-plugin", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:@tanstack/store", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:highlight.js", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:lucide-react", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:react", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:react-markdown", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:rehype-highlight", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:rehype-raw", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:rehype-sanitize", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:remark-gfm", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:tailwindcss", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:vite-tsconfig-paths", - "type": "static" - }, - { - "source": "ts-chat", - "target": "npm:zod@4.1.13", - "type": "static" - } - ], - "root": [ - { - "source": "root", - "target": "npm:@changesets/cli", - "type": "static" - }, - { - "source": "root", - "target": "npm:@faker-js/faker", - "type": "static" - }, - { - "source": "root", - "target": "npm:@size-limit/preset-small-lib", - "type": "static" - }, - { - "source": "root", - "target": "npm:@svitejs/changesets-changelog-github-compact", - "type": "static" - }, - { - "source": "root", - "target": "npm:@tanstack/config", - "type": "static" - }, - { - "source": "root", - "target": "npm:@testing-library/jest-dom", - "type": "static" - }, - { - "source": "root", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "root", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "root", - "target": "npm:eslint-plugin-unused-imports", - "type": "static" - }, - { - "source": "root", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "root", - "target": "npm:happy-dom", - "type": "static" - }, - { - "source": "root", - "target": "npm:knip", - "type": "static" - }, - { - "source": "root", - "target": "npm:markdown-link-extractor", - "type": "static" - }, - { - "source": "root", - "target": "npm:nx", - "type": "static" - }, - { - "source": "root", - "target": "npm:premove", - "type": "static" - }, - { - "source": "root", - "target": "npm:prettier", - "type": "static" - }, - { - "source": "root", - "target": "npm:prettier-plugin-svelte", - "type": "static" - }, - { - "source": "root", - "target": "npm:publint", - "type": "static" - }, - { - "source": "root", - "target": "npm:sherif", - "type": "static" - }, - { - "source": "root", - "target": "npm:size-limit", - "type": "static" - }, - { - "source": "root", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "root", - "target": "npm:vite", - "type": "static" - }, - { - "source": "root", - "target": "npm:vitest", - "type": "static" - } - ], - "npm:@ai-sdk/openai": [ - { - "source": "npm:@ai-sdk/openai", - "target": "npm:@ai-sdk/provider", - "type": "static" - }, - { - "source": "npm:@ai-sdk/openai", - "target": "npm:@ai-sdk/provider-utils", - "type": "static" - }, - { - "source": "npm:@ai-sdk/openai", - "target": "npm:zod@4.1.13", - "type": "static" - } - ], - "npm:@ai-sdk/provider-utils": [ - { - "source": "npm:@ai-sdk/provider-utils", - "target": "npm:@ai-sdk/provider", - "type": "static" - }, - { - "source": "npm:@ai-sdk/provider-utils", - "target": "npm:@standard-schema/spec", - "type": "static" - }, - { - "source": "npm:@ai-sdk/provider-utils", - "target": "npm:eventsource-parser", - "type": "static" - }, - { - "source": "npm:@ai-sdk/provider-utils", - "target": "npm:zod@4.1.13", - "type": "static" - } - ], - "npm:@ai-sdk/provider": [ - { - "source": "npm:@ai-sdk/provider", - "target": "npm:json-schema", - "type": "static" - } - ], - "npm:@anthropic-ai/sdk": [ - { - "source": "npm:@anthropic-ai/sdk", - "target": "npm:json-schema-to-ts", - "type": "static" - }, - { - "source": "npm:@anthropic-ai/sdk", - "target": "npm:zod@4.1.13", - "type": "static" - } - ], - "npm:@asamuzakjp/css-color": [ - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:@csstools/css-calc", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:@csstools/css-color-parser", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:@csstools/css-parser-algorithms", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:@csstools/css-tokenizer", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/css-color", - "target": "npm:lru-cache@11.2.2", - "type": "static" - } - ], - "npm:@asamuzakjp/dom-selector": [ - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:@asamuzakjp/nwsapi", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:bidi-js", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:css-tree", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:is-potential-custom-element-name", - "type": "static" - }, - { - "source": "npm:@asamuzakjp/dom-selector", - "target": "npm:lru-cache@11.2.2", - "type": "static" - } - ], - "npm:@babel/code-frame@7.26.2": [ - { - "source": "npm:@babel/code-frame@7.26.2", - "target": "npm:@babel/helper-validator-identifier@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.26.2", - "target": "npm:js-tokens@4.0.0", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.26.2", - "target": "npm:picocolors", - "type": "static" - } - ], - "npm:@babel/code-frame@7.27.1": [ - { - "source": "npm:@babel/code-frame@7.27.1", - "target": "npm:@babel/helper-validator-identifier@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.27.1", - "target": "npm:js-tokens@4.0.0", - "type": "static" - }, - { - "source": "npm:@babel/code-frame@7.27.1", - "target": "npm:picocolors", - "type": "static" - } - ], - "npm:@babel/core": [ - { - "source": "npm:@babel/core", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/generator", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/helper-compilation-targets", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/helper-module-transforms", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/helpers", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:@jridgewell/remapping", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:convert-source-map", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:gensync", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:json5", - "type": "static" - }, - { - "source": "npm:@babel/core", - "target": "npm:semver@6.3.1", - "type": "static" - } - ], - "npm:@babel/generator": [ - { - "source": "npm:@babel/generator", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:@jridgewell/gen-mapping", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:@jridgewell/trace-mapping", - "type": "static" - }, - { - "source": "npm:@babel/generator", - "target": "npm:jsesc", - "type": "static" - } - ], - "npm:@babel/helper-annotate-as-pure": [ - { - "source": "npm:@babel/helper-annotate-as-pure", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/helper-compilation-targets": [ - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:@babel/compat-data", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:@babel/helper-validator-option", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:browserslist", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:lru-cache@5.1.1", - "type": "static" - }, - { - "source": "npm:@babel/helper-compilation-targets", - "target": "npm:semver@6.3.1", - "type": "static" - } - ], - "npm:@babel/helper-create-class-features-plugin": [ - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-annotate-as-pure", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-member-expression-to-functions", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-optimise-call-expression", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-replace-supers", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/helper-skip-transparent-expression-wrappers", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-create-class-features-plugin", - "target": "npm:semver@6.3.1", - "type": "static" - } - ], - "npm:@babel/helper-member-expression-to-functions": [ - { - "source": "npm:@babel/helper-member-expression-to-functions", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-member-expression-to-functions", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/helper-module-imports@7.18.6": [ - { - "source": "npm:@babel/helper-module-imports@7.18.6", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/helper-module-imports@7.27.1": [ - { - "source": "npm:@babel/helper-module-imports@7.27.1", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-imports@7.27.1", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/helper-module-transforms": [ - { - "source": "npm:@babel/helper-module-transforms", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-transforms", - "target": "npm:@babel/helper-module-imports@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-transforms", - "target": "npm:@babel/helper-validator-identifier@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/helper-module-transforms", - "target": "npm:@babel/traverse", - "type": "static" - } - ], - "npm:@babel/helper-optimise-call-expression": [ - { - "source": "npm:@babel/helper-optimise-call-expression", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/helper-replace-supers": [ - { - "source": "npm:@babel/helper-replace-supers", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/helper-replace-supers", - "target": "npm:@babel/helper-member-expression-to-functions", - "type": "static" - }, - { - "source": "npm:@babel/helper-replace-supers", - "target": "npm:@babel/helper-optimise-call-expression", - "type": "static" - }, - { - "source": "npm:@babel/helper-replace-supers", - "target": "npm:@babel/traverse", - "type": "static" - } - ], - "npm:@babel/helper-skip-transparent-expression-wrappers": [ - { - "source": "npm:@babel/helper-skip-transparent-expression-wrappers", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@babel/helper-skip-transparent-expression-wrappers", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/helpers": [ - { - "source": "npm:@babel/helpers", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@babel/helpers", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/parser@7.28.4": [ - { - "source": "npm:@babel/parser@7.28.4", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/parser@7.28.5": [ - { - "source": "npm:@babel/parser@7.28.5", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@babel/plugin-proposal-private-methods": [ - { - "source": "npm:@babel/plugin-proposal-private-methods", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-proposal-private-methods", - "target": "npm:@babel/helper-create-class-features-plugin", - "type": "static" - }, - { - "source": "npm:@babel/plugin-proposal-private-methods", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - } - ], - "npm:@babel/plugin-syntax-jsx": [ - { - "source": "npm:@babel/plugin-syntax-jsx", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-syntax-jsx", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - } - ], - "npm:@babel/plugin-syntax-typescript": [ - { - "source": "npm:@babel/plugin-syntax-typescript", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-syntax-typescript", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - } - ], - "npm:@babel/plugin-transform-modules-commonjs": [ - { - "source": "npm:@babel/plugin-transform-modules-commonjs", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-modules-commonjs", - "target": "npm:@babel/helper-module-transforms", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-modules-commonjs", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - } - ], - "npm:@babel/plugin-transform-react-jsx-self": [ - { - "source": "npm:@babel/plugin-transform-react-jsx-self", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-react-jsx-self", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - } - ], - "npm:@babel/plugin-transform-react-jsx-source": [ - { - "source": "npm:@babel/plugin-transform-react-jsx-source", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-react-jsx-source", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - } - ], - "npm:@babel/plugin-transform-typescript": [ - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/helper-annotate-as-pure", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/helper-create-class-features-plugin", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/helper-skip-transparent-expression-wrappers", - "type": "static" - }, - { - "source": "npm:@babel/plugin-transform-typescript", - "target": "npm:@babel/plugin-syntax-typescript", - "type": "static" - } - ], - "npm:@babel/preset-typescript": [ - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/helper-plugin-utils", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/helper-validator-option", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/plugin-syntax-jsx", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/plugin-transform-modules-commonjs", - "type": "static" - }, - { - "source": "npm:@babel/preset-typescript", - "target": "npm:@babel/plugin-transform-typescript", - "type": "static" - } - ], - "npm:@babel/template": [ - { - "source": "npm:@babel/template", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/template", - "target": "npm:@babel/parser@7.28.4", - "type": "static" - }, - { - "source": "npm:@babel/template", - "target": "npm:@babel/types@7.28.4", - "type": "static" - } - ], - "npm:@babel/traverse": [ - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/generator", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/helper-globals", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@babel/traverse", - "target": "npm:debug", - "type": "static" - } - ], - "npm:@babel/types@7.28.4": [ - { - "source": "npm:@babel/types@7.28.4", - "target": "npm:@babel/helper-string-parser", - "type": "static" - }, - { - "source": "npm:@babel/types@7.28.4", - "target": "npm:@babel/helper-validator-identifier@7.27.1", - "type": "static" - } - ], - "npm:@babel/types@7.28.5": [ - { - "source": "npm:@babel/types@7.28.5", - "target": "npm:@babel/helper-string-parser", - "type": "static" - }, - { - "source": "npm:@babel/types@7.28.5", - "target": "npm:@babel/helper-validator-identifier@7.28.5", - "type": "static" - } - ], - "npm:@changesets/apply-release-plan": [ - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/config", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/get-version-range-type", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/git", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/should-skip-package", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:detect-indent", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:lodash.startcase", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:outdent", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:prettier@2.8.8", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:resolve-from@5.0.0", - "type": "static" - }, - { - "source": "npm:@changesets/apply-release-plan", - "target": "npm:semver@7.7.3", - "type": "static" - } - ], - "npm:@changesets/assemble-release-plan": [ - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@changesets/get-dependents-graph", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@changesets/should-skip-package", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/assemble-release-plan", - "target": "npm:semver@7.7.3", - "type": "static" - } - ], - "npm:@changesets/changelog-git": [ - { - "source": "npm:@changesets/changelog-git", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - } - ], - "npm:@changesets/cli": [ - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/apply-release-plan", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/assemble-release-plan", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/changelog-git", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/config", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/get-dependents-graph", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/get-release-plan", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/git", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/logger", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/pre", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/read", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/should-skip-package", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@changesets/write", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@inquirer/external-editor", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:ansi-colors", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:ci-info", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:enquirer@2.4.1", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:mri", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:p-limit@2.3.0", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:package-manager-detector@0.2.11", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:resolve-from@5.0.0", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:spawndamnit", - "type": "static" - }, - { - "source": "npm:@changesets/cli", - "target": "npm:term-size", - "type": "static" - } - ], - "npm:@changesets/config": [ - { - "source": "npm:@changesets/config", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@changesets/get-dependents-graph", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@changesets/logger", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/config", - "target": "npm:micromatch", - "type": "static" - } - ], - "npm:@changesets/errors": [ - { - "source": "npm:@changesets/errors", - "target": "npm:extendable-error", - "type": "static" - } - ], - "npm:@changesets/get-dependents-graph": [ - { - "source": "npm:@changesets/get-dependents-graph", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/get-dependents-graph", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/get-dependents-graph", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@changesets/get-dependents-graph", - "target": "npm:semver@7.7.3", - "type": "static" - } - ], - "npm:@changesets/get-github-info": [ - { - "source": "npm:@changesets/get-github-info", - "target": "npm:dataloader", - "type": "static" - }, - { - "source": "npm:@changesets/get-github-info", - "target": "npm:node-fetch@2.7.0", - "type": "static" - } - ], - "npm:@changesets/get-release-plan": [ - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/assemble-release-plan", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/config", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/pre", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/read", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/get-release-plan", - "target": "npm:@manypkg/get-packages", - "type": "static" - } - ], - "npm:@changesets/git": [ - { - "source": "npm:@changesets/git", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:is-subdir", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:micromatch", - "type": "static" - }, - { - "source": "npm:@changesets/git", - "target": "npm:spawndamnit", - "type": "static" - } - ], - "npm:@changesets/logger": [ - { - "source": "npm:@changesets/logger", - "target": "npm:picocolors", - "type": "static" - } - ], - "npm:@changesets/parse": [ - { - "source": "npm:@changesets/parse", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/parse", - "target": "npm:js-yaml@3.14.1", - "type": "static" - } - ], - "npm:@changesets/pre": [ - { - "source": "npm:@changesets/pre", - "target": "npm:@changesets/errors", - "type": "static" - }, - { - "source": "npm:@changesets/pre", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/pre", - "target": "npm:@manypkg/get-packages", - "type": "static" - }, - { - "source": "npm:@changesets/pre", - "target": "npm:fs-extra@7.0.1", - "type": "static" - } - ], - "npm:@changesets/read": [ - { - "source": "npm:@changesets/read", - "target": "npm:@changesets/git", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:@changesets/logger", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:@changesets/parse", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:p-filter", - "type": "static" - }, - { - "source": "npm:@changesets/read", - "target": "npm:picocolors", - "type": "static" - } - ], - "npm:@changesets/should-skip-package": [ - { - "source": "npm:@changesets/should-skip-package", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/should-skip-package", - "target": "npm:@manypkg/get-packages", - "type": "static" - } - ], - "npm:@changesets/write": [ - { - "source": "npm:@changesets/write", - "target": "npm:@changesets/types@6.1.0", - "type": "static" - }, - { - "source": "npm:@changesets/write", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@changesets/write", - "target": "npm:human-id", - "type": "static" - }, - { - "source": "npm:@changesets/write", - "target": "npm:prettier@2.8.8", - "type": "static" - } - ], - "npm:@cloudflare/kv-asset-handler": [ - { - "source": "npm:@cloudflare/kv-asset-handler", - "target": "npm:mime@3.0.0", - "type": "static" - } - ], - "npm:@commitlint/parse": [ - { - "source": "npm:@commitlint/parse", - "target": "npm:@commitlint/types", - "type": "static" - }, - { - "source": "npm:@commitlint/parse", - "target": "npm:conventional-changelog-angular", - "type": "static" - }, - { - "source": "npm:@commitlint/parse", - "target": "npm:conventional-commits-parser", - "type": "static" - } - ], - "npm:@commitlint/types": [ - { - "source": "npm:@commitlint/types", - "target": "npm:@types/conventional-commits-parser", - "type": "static" - }, - { - "source": "npm:@commitlint/types", - "target": "npm:chalk@5.6.2", - "type": "static" - } - ], - "npm:@csstools/css-calc": [ - { - "source": "npm:@csstools/css-calc", - "target": "npm:@csstools/css-parser-algorithms", - "type": "static" - }, - { - "source": "npm:@csstools/css-calc", - "target": "npm:@csstools/css-tokenizer", - "type": "static" - } - ], - "npm:@csstools/css-color-parser": [ - { - "source": "npm:@csstools/css-color-parser", - "target": "npm:@csstools/color-helpers", - "type": "static" - }, - { - "source": "npm:@csstools/css-color-parser", - "target": "npm:@csstools/css-calc", - "type": "static" - }, - { - "source": "npm:@csstools/css-color-parser", - "target": "npm:@csstools/css-parser-algorithms", - "type": "static" - }, - { - "source": "npm:@csstools/css-color-parser", - "target": "npm:@csstools/css-tokenizer", - "type": "static" - } - ], - "npm:@csstools/css-parser-algorithms": [ - { - "source": "npm:@csstools/css-parser-algorithms", - "target": "npm:@csstools/css-tokenizer", - "type": "static" - } - ], - "npm:@csstools/css-syntax-patches-for-csstree": [ - { - "source": "npm:@csstools/css-syntax-patches-for-csstree", - "target": "npm:postcss", - "type": "static" - } - ], - "npm:@emnapi/core": [ - { - "source": "npm:@emnapi/core", - "target": "npm:@emnapi/wasi-threads", - "type": "static" - }, - { - "source": "npm:@emnapi/core", - "target": "npm:tslib", - "type": "static" - } - ], - "npm:@emnapi/runtime": [ - { - "source": "npm:@emnapi/runtime", - "target": "npm:tslib", - "type": "static" - } - ], - "npm:@emnapi/wasi-threads": [ - { - "source": "npm:@emnapi/wasi-threads", - "target": "npm:tslib", - "type": "static" - } - ], - "npm:@eslint-community/eslint-utils": [ - { - "source": "npm:@eslint-community/eslint-utils", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-community/eslint-utils", - "target": "npm:eslint-visitor-keys@3.4.3", - "type": "static" - } - ], - "npm:@eslint-react/ast": [ - { - "source": "npm:@eslint-react/ast", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:@typescript-eslint/typescript-estree@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:@eslint-react/ast", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@eslint-react/core": [ - { - "source": "npm:@eslint-react/core", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:birecord", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:@eslint-react/core", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@eslint-react/eslint-plugin": [ - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-dom", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-hooks-extra", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-naming-convention", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-web-api", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:eslint-plugin-react-x", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@eslint-react/eslint-plugin", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@eslint-react/shared": [ - { - "source": "npm:@eslint-react/shared", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:@eslint-react/shared", - "target": "npm:zod@4.1.13", - "type": "static" - } - ], - "npm:@eslint-react/var": [ - { - "source": "npm:@eslint-react/var", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:@eslint-react/var", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@eslint/config-array": [ - { - "source": "npm:@eslint/config-array", - "target": "npm:@eslint/object-schema", - "type": "static" - }, - { - "source": "npm:@eslint/config-array", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@eslint/config-array", - "target": "npm:minimatch@3.1.2", - "type": "static" - } - ], - "npm:@eslint/config-helpers": [ - { - "source": "npm:@eslint/config-helpers", - "target": "npm:@eslint/core", - "type": "static" - } - ], - "npm:@eslint/core": [ - { - "source": "npm:@eslint/core", - "target": "npm:@types/json-schema", - "type": "static" - } - ], - "npm:@eslint/eslintrc": [ - { - "source": "npm:@eslint/eslintrc", - "target": "npm:ajv@6.12.6", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:espree", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:globals@14.0.0", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:ignore@5.3.2", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:import-fresh", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:js-yaml@4.1.1", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:minimatch@3.1.2", - "type": "static" - }, - { - "source": "npm:@eslint/eslintrc", - "target": "npm:strip-json-comments@3.1.1", - "type": "static" - } - ], - "npm:@eslint/plugin-kit": [ - { - "source": "npm:@eslint/plugin-kit", - "target": "npm:@eslint/core", - "type": "static" - }, - { - "source": "npm:@eslint/plugin-kit", - "target": "npm:levn", - "type": "static" - } - ], - "npm:@gerrit0/mini-shiki": [ - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/engine-oniguruma", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/langs", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/themes", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/types", - "type": "static" - }, - { - "source": "npm:@gerrit0/mini-shiki", - "target": "npm:@shikijs/vscode-textmate", - "type": "static" - } - ], - "npm:@google/genai": [ - { - "source": "npm:@google/genai", - "target": "npm:google-auth-library", - "type": "static" - }, - { - "source": "npm:@google/genai", - "target": "npm:ws", - "type": "static" - } - ], - "npm:@humanfs/node": [ - { - "source": "npm:@humanfs/node", - "target": "npm:@humanfs/core", - "type": "static" - }, - { - "source": "npm:@humanfs/node", - "target": "npm:@humanwhocodes/retry", - "type": "static" - } - ], - "npm:@inquirer/external-editor": [ - { - "source": "npm:@inquirer/external-editor", - "target": "npm:chardet", - "type": "static" - }, - { - "source": "npm:@inquirer/external-editor", - "target": "npm:iconv-lite@0.7.0", - "type": "static" - }, - { - "source": "npm:@inquirer/external-editor", - "target": "npm:@types/node", - "type": "static" - } - ], - "npm:@isaacs/cliui": [ - { - "source": "npm:@isaacs/cliui", - "target": "npm:string-width@5.1.2", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:string-width-cjs", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:strip-ansi@7.1.2", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:strip-ansi-cjs", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:wrap-ansi@8.1.0", - "type": "static" - }, - { - "source": "npm:@isaacs/cliui", - "target": "npm:wrap-ansi-cjs", - "type": "static" - } - ], - "npm:@isaacs/fs-minipass": [ - { - "source": "npm:@isaacs/fs-minipass", - "target": "npm:minipass", - "type": "static" - } - ], - "npm:@jest/schemas": [ - { - "source": "npm:@jest/schemas", - "target": "npm:@sinclair/typebox", - "type": "static" - } - ], - "npm:@jridgewell/gen-mapping": [ - { - "source": "npm:@jridgewell/gen-mapping", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - }, - { - "source": "npm:@jridgewell/gen-mapping", - "target": "npm:@jridgewell/trace-mapping", - "type": "static" - } - ], - "npm:@jridgewell/remapping": [ - { - "source": "npm:@jridgewell/remapping", - "target": "npm:@jridgewell/gen-mapping", - "type": "static" - }, - { - "source": "npm:@jridgewell/remapping", - "target": "npm:@jridgewell/trace-mapping", - "type": "static" - } - ], - "npm:@jridgewell/source-map": [ - { - "source": "npm:@jridgewell/source-map", - "target": "npm:@jridgewell/gen-mapping", - "type": "static" - }, - { - "source": "npm:@jridgewell/source-map", - "target": "npm:@jridgewell/trace-mapping", - "type": "static" - } - ], - "npm:@jridgewell/trace-mapping": [ - { - "source": "npm:@jridgewell/trace-mapping", - "target": "npm:@jridgewell/resolve-uri", - "type": "static" - }, - { - "source": "npm:@jridgewell/trace-mapping", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - } - ], - "npm:@kwsites/file-exists": [ - { - "source": "npm:@kwsites/file-exists", - "target": "npm:debug", - "type": "static" - } - ], - "npm:@manypkg/find-root": [ - { - "source": "npm:@manypkg/find-root", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:@manypkg/find-root", - "target": "npm:@types/node@12.20.55", - "type": "static" - }, - { - "source": "npm:@manypkg/find-root", - "target": "npm:find-up@4.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/find-root", - "target": "npm:fs-extra@8.1.0", - "type": "static" - } - ], - "npm:@manypkg/get-packages": [ - { - "source": "npm:@manypkg/get-packages", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:@changesets/types@4.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:@manypkg/find-root", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:fs-extra@8.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:globby@11.1.0", - "type": "static" - }, - { - "source": "npm:@manypkg/get-packages", - "target": "npm:read-yaml-file", - "type": "static" - } - ], - "npm:@mapbox/node-pre-gyp": [ - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:detect-libc@2.1.2", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:https-proxy-agent", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:node-fetch@2.7.0", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:nopt", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@mapbox/node-pre-gyp", - "target": "npm:tar", - "type": "static" - } - ], - "npm:@microsoft/api-extractor-model": [ - { - "source": "npm:@microsoft/api-extractor-model", - "target": "npm:@microsoft/tsdoc", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor-model", - "target": "npm:@microsoft/tsdoc-config", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor-model", - "target": "npm:@rushstack/node-core-library", - "type": "static" - } - ], - "npm:@microsoft/api-extractor": [ - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@microsoft/api-extractor-model", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@microsoft/tsdoc", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@microsoft/tsdoc-config", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@rushstack/node-core-library", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@rushstack/rig-package", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@rushstack/terminal", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:@rushstack/ts-command-line", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:lodash", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:minimatch@3.0.8", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:semver@7.5.4", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:source-map@0.6.1", - "type": "static" - }, - { - "source": "npm:@microsoft/api-extractor", - "target": "npm:typescript@5.4.2", - "type": "static" - } - ], - "npm:@microsoft/tsdoc-config": [ - { - "source": "npm:@microsoft/tsdoc-config", - "target": "npm:@microsoft/tsdoc", - "type": "static" - }, - { - "source": "npm:@microsoft/tsdoc-config", - "target": "npm:ajv@8.12.0", - "type": "static" - }, - { - "source": "npm:@microsoft/tsdoc-config", - "target": "npm:jju", - "type": "static" - }, - { - "source": "npm:@microsoft/tsdoc-config", - "target": "npm:resolve", - "type": "static" - } - ], - "npm:@napi-rs/wasm-runtime@0.2.12": [ - { - "source": "npm:@napi-rs/wasm-runtime@0.2.12", - "target": "npm:@emnapi/core", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.12", - "target": "npm:@emnapi/runtime", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.12", - "target": "npm:@tybys/wasm-util@0.10.1", - "type": "static" - } - ], - "npm:@napi-rs/wasm-runtime@0.2.4": [ - { - "source": "npm:@napi-rs/wasm-runtime@0.2.4", - "target": "npm:@emnapi/core", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.4", - "target": "npm:@emnapi/runtime", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@0.2.4", - "target": "npm:@tybys/wasm-util@0.9.0", - "type": "static" - } - ], - "npm:@napi-rs/wasm-runtime@1.0.7": [ - { - "source": "npm:@napi-rs/wasm-runtime@1.0.7", - "target": "npm:@emnapi/core", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@1.0.7", - "target": "npm:@emnapi/runtime", - "type": "static" - }, - { - "source": "npm:@napi-rs/wasm-runtime@1.0.7", - "target": "npm:@tybys/wasm-util@0.10.1", - "type": "static" - } - ], - "npm:@nodelib/fs.scandir": [ - { - "source": "npm:@nodelib/fs.scandir", - "target": "npm:@nodelib/fs.stat", - "type": "static" - }, - { - "source": "npm:@nodelib/fs.scandir", - "target": "npm:run-parallel", - "type": "static" - } - ], - "npm:@nodelib/fs.walk": [ - { - "source": "npm:@nodelib/fs.walk", - "target": "npm:@nodelib/fs.scandir", - "type": "static" - }, - { - "source": "npm:@nodelib/fs.walk", - "target": "npm:fastq", - "type": "static" - } - ], - "npm:@oozcitak/dom": [ - { - "source": "npm:@oozcitak/dom", - "target": "npm:@oozcitak/infra", - "type": "static" - }, - { - "source": "npm:@oozcitak/dom", - "target": "npm:@oozcitak/url", - "type": "static" - }, - { - "source": "npm:@oozcitak/dom", - "target": "npm:@oozcitak/util", - "type": "static" - } - ], - "npm:@oozcitak/infra": [ - { - "source": "npm:@oozcitak/infra", - "target": "npm:@oozcitak/util", - "type": "static" - } - ], - "npm:@oozcitak/url": [ - { - "source": "npm:@oozcitak/url", - "target": "npm:@oozcitak/infra", - "type": "static" - }, - { - "source": "npm:@oozcitak/url", - "target": "npm:@oozcitak/util", - "type": "static" - } - ], - "npm:@oxc-resolver/binding-wasm32-wasi": [ - { - "source": "npm:@oxc-resolver/binding-wasm32-wasi", - "target": "npm:@napi-rs/wasm-runtime@1.0.7", - "type": "static" - } - ], - "npm:@parcel/watcher-wasm": [ - { - "source": "npm:@parcel/watcher-wasm", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:@parcel/watcher-wasm", - "target": "npm:micromatch", - "type": "static" - } - ], - "npm:@parcel/watcher": [ - { - "source": "npm:@parcel/watcher", - "target": "npm:detect-libc@1.0.3", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:micromatch", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:node-addon-api", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-android-arm64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-darwin-arm64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-darwin-x64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-freebsd-x64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-arm-glibc", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-arm-musl", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-arm64-glibc", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-x64-glibc", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-win32-arm64", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-win32-ia32", - "type": "static" - }, - { - "source": "npm:@parcel/watcher", - "target": "npm:@parcel/watcher-win32-x64", - "type": "static" - } - ], - "npm:@poppinss/colors": [ - { - "source": "npm:@poppinss/colors", - "target": "npm:kleur", - "type": "static" - } - ], - "npm:@poppinss/dumper": [ - { - "source": "npm:@poppinss/dumper", - "target": "npm:@poppinss/colors", - "type": "static" - }, - { - "source": "npm:@poppinss/dumper", - "target": "npm:@sindresorhus/is", - "type": "static" - }, - { - "source": "npm:@poppinss/dumper", - "target": "npm:supports-color@10.2.2", - "type": "static" - } - ], - "npm:@rolldown/binding-wasm32-wasi": [ - { - "source": "npm:@rolldown/binding-wasm32-wasi", - "target": "npm:@napi-rs/wasm-runtime@1.0.7", - "type": "static" - } - ], - "npm:@rollup/plugin-alias": [ - { - "source": "npm:@rollup/plugin-alias", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:@rollup/plugin-commonjs": [ - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:commondir", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:fdir", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:is-reference@1.2.1", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-commonjs", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:@rollup/plugin-inject": [ - { - "source": "npm:@rollup/plugin-inject", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-inject", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-inject", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-inject", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:@rollup/plugin-json": [ - { - "source": "npm:@rollup/plugin-json", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-json", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:@rollup/plugin-node-resolve": [ - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:@types/resolve", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:deepmerge", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:is-module", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-node-resolve", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:@rollup/plugin-replace": [ - { - "source": "npm:@rollup/plugin-replace", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-replace", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-replace", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:@rollup/plugin-terser": [ - { - "source": "npm:@rollup/plugin-terser", - "target": "npm:serialize-javascript", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-terser", - "target": "npm:smob", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-terser", - "target": "npm:terser", - "type": "static" - }, - { - "source": "npm:@rollup/plugin-terser", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:@rollup/pluginutils": [ - { - "source": "npm:@rollup/pluginutils", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:@rollup/pluginutils", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@rollup/pluginutils", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:@rollup/pluginutils", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:@rushstack/node-core-library": [ - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:ajv@8.13.0", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:ajv-draft-04", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:ajv-formats", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:fs-extra@7.0.1", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:import-lazy", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:jju", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:semver@7.5.4", - "type": "static" - }, - { - "source": "npm:@rushstack/node-core-library", - "target": "npm:@types/node", - "type": "static" - } - ], - "npm:@rushstack/rig-package": [ - { - "source": "npm:@rushstack/rig-package", - "target": "npm:resolve", - "type": "static" - }, - { - "source": "npm:@rushstack/rig-package", - "target": "npm:strip-json-comments@3.1.1", - "type": "static" - } - ], - "npm:@rushstack/terminal": [ - { - "source": "npm:@rushstack/terminal", - "target": "npm:@rushstack/node-core-library", - "type": "static" - }, - { - "source": "npm:@rushstack/terminal", - "target": "npm:supports-color@8.1.1", - "type": "static" - }, - { - "source": "npm:@rushstack/terminal", - "target": "npm:@types/node", - "type": "static" - } - ], - "npm:@rushstack/ts-command-line": [ - { - "source": "npm:@rushstack/ts-command-line", - "target": "npm:@rushstack/terminal", - "type": "static" - }, - { - "source": "npm:@rushstack/ts-command-line", - "target": "npm:@types/argparse", - "type": "static" - }, - { - "source": "npm:@rushstack/ts-command-line", - "target": "npm:argparse@1.0.10", - "type": "static" - }, - { - "source": "npm:@rushstack/ts-command-line", - "target": "npm:string-argv", - "type": "static" - } - ], - "npm:@shikijs/engine-oniguruma": [ - { - "source": "npm:@shikijs/engine-oniguruma", - "target": "npm:@shikijs/types", - "type": "static" - }, - { - "source": "npm:@shikijs/engine-oniguruma", - "target": "npm:@shikijs/vscode-textmate", - "type": "static" - } - ], - "npm:@shikijs/langs": [ - { - "source": "npm:@shikijs/langs", - "target": "npm:@shikijs/types", - "type": "static" - } - ], - "npm:@shikijs/themes": [ - { - "source": "npm:@shikijs/themes", - "target": "npm:@shikijs/types", - "type": "static" - } - ], - "npm:@shikijs/types": [ - { - "source": "npm:@shikijs/types", - "target": "npm:@shikijs/vscode-textmate", - "type": "static" - }, - { - "source": "npm:@shikijs/types", - "target": "npm:@types/hast", - "type": "static" - } - ], - "npm:@size-limit/esbuild": [ - { - "source": "npm:@size-limit/esbuild", - "target": "npm:esbuild", - "type": "static" - }, - { - "source": "npm:@size-limit/esbuild", - "target": "npm:nanoid@5.1.6", - "type": "static" - }, - { - "source": "npm:@size-limit/esbuild", - "target": "npm:size-limit", - "type": "static" - } - ], - "npm:@size-limit/file": [ - { - "source": "npm:@size-limit/file", - "target": "npm:size-limit", - "type": "static" - } - ], - "npm:@size-limit/preset-small-lib": [ - { - "source": "npm:@size-limit/preset-small-lib", - "target": "npm:@size-limit/esbuild", - "type": "static" - }, - { - "source": "npm:@size-limit/preset-small-lib", - "target": "npm:@size-limit/file", - "type": "static" - }, - { - "source": "npm:@size-limit/preset-small-lib", - "target": "npm:size-limit", - "type": "static" - } - ], - "npm:@solid-primitives/event-listener": [ - { - "source": "npm:@solid-primitives/event-listener", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/event-listener", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@solid-primitives/keyboard": [ - { - "source": "npm:@solid-primitives/keyboard", - "target": "npm:@solid-primitives/event-listener", - "type": "static" - }, - { - "source": "npm:@solid-primitives/keyboard", - "target": "npm:@solid-primitives/rootless", - "type": "static" - }, - { - "source": "npm:@solid-primitives/keyboard", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/keyboard", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@solid-primitives/resize-observer": [ - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:@solid-primitives/event-listener", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:@solid-primitives/rootless", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:@solid-primitives/static-store", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/resize-observer", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@solid-primitives/rootless": [ - { - "source": "npm:@solid-primitives/rootless", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/rootless", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@solid-primitives/static-store": [ - { - "source": "npm:@solid-primitives/static-store", - "target": "npm:@solid-primitives/utils", - "type": "static" - }, - { - "source": "npm:@solid-primitives/static-store", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@solid-primitives/utils": [ - { - "source": "npm:@solid-primitives/utils", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@stylistic/eslint-plugin": [ - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:espree", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:estraverse", - "type": "static" - }, - { - "source": "npm:@stylistic/eslint-plugin", - "target": "npm:picomatch@4.0.3", - "type": "static" - } - ], - "npm:@sveltejs/acorn-typescript": [ - { - "source": "npm:@sveltejs/acorn-typescript", - "target": "npm:acorn", - "type": "static" - } - ], - "npm:@svitejs/changesets-changelog-github-compact": [ - { - "source": "npm:@svitejs/changesets-changelog-github-compact", - "target": "npm:@changesets/get-github-info", - "type": "static" - }, - { - "source": "npm:@svitejs/changesets-changelog-github-compact", - "target": "npm:dotenv@16.6.1", - "type": "static" - } - ], - "npm:@tailwindcss/node": [ - { - "source": "npm:@tailwindcss/node", - "target": "npm:@jridgewell/remapping", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:enhanced-resolve", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:lightningcss", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:source-map-js", - "type": "static" - }, - { - "source": "npm:@tailwindcss/node", - "target": "npm:tailwindcss", - "type": "static" - } - ], - "npm:@tailwindcss/oxide": [ - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-android-arm64", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-darwin-arm64", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-darwin-x64", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-freebsd-x64", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-wasm32-wasi", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:@tailwindcss/oxide", - "target": "npm:@tailwindcss/oxide-win32-x64-msvc", - "type": "static" - } - ], - "npm:@tailwindcss/vite": [ - { - "source": "npm:@tailwindcss/vite", - "target": "npm:@tailwindcss/node", - "type": "static" - }, - { - "source": "npm:@tailwindcss/vite", - "target": "npm:@tailwindcss/oxide", - "type": "static" - }, - { - "source": "npm:@tailwindcss/vite", - "target": "npm:tailwindcss", - "type": "static" - }, - { - "source": "npm:@tailwindcss/vite", - "target": "npm:vite", - "type": "static" - } - ], - "npm:@tanstack/config": [ - { - "source": "npm:@tanstack/config", - "target": "npm:@tanstack/eslint-config", - "type": "static" - }, - { - "source": "npm:@tanstack/config", - "target": "npm:@tanstack/publish-config", - "type": "static" - }, - { - "source": "npm:@tanstack/config", - "target": "npm:@tanstack/typedoc-config", - "type": "static" - }, - { - "source": "npm:@tanstack/config", - "target": "npm:@tanstack/vite-config", - "type": "static" - } - ], - "npm:@tanstack/devtools-client": [ - { - "source": "npm:@tanstack/devtools-client", - "target": "npm:@tanstack/devtools-event-client", - "type": "static" - } - ], - "npm:@tanstack/devtools-event-bus": [ - { - "source": "npm:@tanstack/devtools-event-bus", - "target": "npm:ws", - "type": "static" - } - ], - "npm:@tanstack/devtools-ui": [ - { - "source": "npm:@tanstack/devtools-ui", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-ui", - "target": "npm:goober", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-ui", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@tanstack/devtools-utils": [ - { - "source": "npm:@tanstack/devtools-utils", - "target": "npm:@tanstack/devtools-ui", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-utils", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-utils", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools-utils", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@tanstack/devtools": [ - { - "source": "npm:@tanstack/devtools", - "target": "npm:@solid-primitives/event-listener", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@solid-primitives/keyboard", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@solid-primitives/resize-observer", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@tanstack/devtools-client", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@tanstack/devtools-event-bus", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:@tanstack/devtools-ui", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:goober", - "type": "static" - }, - { - "source": "npm:@tanstack/devtools", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:@tanstack/directive-functions-plugin": [ - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:babel-dead-code-elimination", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/directive-functions-plugin", - "target": "npm:vite", - "type": "static" - } - ], - "npm:@tanstack/eslint-config": [ - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:@eslint/js", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:@stylistic/eslint-plugin", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:eslint-plugin-import-x", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:eslint-plugin-n", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:globals@16.5.0", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:typescript-eslint", - "type": "static" - }, - { - "source": "npm:@tanstack/eslint-config", - "target": "npm:vue-eslint-parser", - "type": "static" - } - ], - "npm:@tanstack/nitro-v2-vite-plugin": [ - { - "source": "npm:@tanstack/nitro-v2-vite-plugin", - "target": "npm:nitropack", - "type": "static" - }, - { - "source": "npm:@tanstack/nitro-v2-vite-plugin", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/nitro-v2-vite-plugin", - "target": "npm:vite", - "type": "static" - } - ], - "npm:@tanstack/publish-config": [ - { - "source": "npm:@tanstack/publish-config", - "target": "npm:@commitlint/parse", - "type": "static" - }, - { - "source": "npm:@tanstack/publish-config", - "target": "npm:jsonfile@6.2.0", - "type": "static" - }, - { - "source": "npm:@tanstack/publish-config", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@tanstack/publish-config", - "target": "npm:simple-git", - "type": "static" - } - ], - "npm:@tanstack/react-devtools": [ - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:@tanstack/devtools", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:@types/react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-devtools", - "target": "npm:react-dom", - "type": "static" - } - ], - "npm:@tanstack/react-query": [ - { - "source": "npm:@tanstack/react-query", - "target": "npm:@tanstack/query-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-query", - "target": "npm:react", - "type": "static" - } - ], - "npm:@tanstack/react-router-devtools": [ - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:@tanstack/router-devtools-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-devtools", - "target": "npm:@tanstack/router-core", - "type": "static" - } - ], - "npm:@tanstack/react-router-ssr-query": [ - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:@tanstack/query-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:@tanstack/react-query", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:@tanstack/router-ssr-query-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router-ssr-query", - "target": "npm:react-dom", - "type": "static" - } - ], - "npm:@tanstack/react-router": [ - { - "source": "npm:@tanstack/react-router", - "target": "npm:@tanstack/history", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:@tanstack/react-store", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:isbot", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/react-router", - "target": "npm:tiny-warning", - "type": "static" - } - ], - "npm:@tanstack/react-start-client": [ - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-client", - "target": "npm:tiny-warning", - "type": "static" - } - ], - "npm:@tanstack/react-start-server": [ - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/history", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:@tanstack/start-server-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start-server", - "target": "npm:react-dom", - "type": "static" - } - ], - "npm:@tanstack/react-start": [ - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/react-start-client", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/react-start-server", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/start-plugin-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:@tanstack/start-server-core", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-start", - "target": "npm:vite", - "type": "static" - } - ], - "npm:@tanstack/react-store": [ - { - "source": "npm:@tanstack/react-store", - "target": "npm:@tanstack/store", - "type": "static" - }, - { - "source": "npm:@tanstack/react-store", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@tanstack/react-store", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@tanstack/react-store", - "target": "npm:use-sync-external-store", - "type": "static" - } - ], - "npm:@tanstack/router-core": [ - { - "source": "npm:@tanstack/router-core", - "target": "npm:@tanstack/history", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:@tanstack/store", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:cookie-es@2.0.0", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:seroval@1.4.0", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:seroval-plugins@1.4.0", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/router-core", - "target": "npm:tiny-warning", - "type": "static" - } - ], - "npm:@tanstack/router-devtools-core": [ - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:goober", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/router-devtools-core", - "target": "npm:csstype@3.2.3", - "type": "static" - } - ], - "npm:@tanstack/router-generator": [ - { - "source": "npm:@tanstack/router-generator", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:@tanstack/virtual-file-routes", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:prettier", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:recast", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:source-map@0.7.6", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:tsx", - "type": "static" - }, - { - "source": "npm:@tanstack/router-generator", - "target": "npm:zod@3.25.76", - "type": "static" - } - ], - "npm:@tanstack/router-plugin": [ - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/plugin-syntax-jsx", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/plugin-syntax-typescript", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/router-generator", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/virtual-file-routes", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:babel-dead-code-elimination", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:chokidar@3.6.0", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:unplugin", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:zod@3.25.76", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:@tanstack/react-router", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/router-plugin", - "target": "npm:vite-plugin-solid", - "type": "static" - } - ], - "npm:@tanstack/router-ssr-query-core": [ - { - "source": "npm:@tanstack/router-ssr-query-core", - "target": "npm:@tanstack/query-core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-ssr-query-core", - "target": "npm:@tanstack/router-core", - "type": "static" - } - ], - "npm:@tanstack/router-utils": [ - { - "source": "npm:@tanstack/router-utils", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:@babel/generator", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:@babel/preset-typescript", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:ansis", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:diff", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/router-utils", - "target": "npm:tinyglobby", - "type": "static" - } - ], - "npm:@tanstack/server-functions-plugin": [ - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/plugin-syntax-jsx", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/plugin-syntax-typescript", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/template", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:@tanstack/directive-functions-plugin", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:babel-dead-code-elimination", - "type": "static" - }, - { - "source": "npm:@tanstack/server-functions-plugin", - "target": "npm:tiny-invariant", - "type": "static" - } - ], - "npm:@tanstack/start-client-core": [ - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:@tanstack/start-storage-context", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:seroval@1.4.0", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:@tanstack/start-client-core", - "target": "npm:tiny-warning", - "type": "static" - } - ], - "npm:@tanstack/start-plugin-core": [ - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@babel/code-frame@7.26.2", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@rolldown/pluginutils@1.0.0-beta.40", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/router-generator", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/router-plugin", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/router-utils", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/server-functions-plugin", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:@tanstack/start-server-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:babel-dead-code-elimination", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:cheerio", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:exsolve", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:srvx", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:vitefu", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:xmlbuilder2", - "type": "static" - }, - { - "source": "npm:@tanstack/start-plugin-core", - "target": "npm:zod@3.25.76", - "type": "static" - } - ], - "npm:@tanstack/start-server-core": [ - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:@tanstack/history", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:@tanstack/router-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:@tanstack/start-client-core", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:@tanstack/start-storage-context", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:h3-v2", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:seroval@1.4.0", - "type": "static" - }, - { - "source": "npm:@tanstack/start-server-core", - "target": "npm:tiny-invariant", - "type": "static" - } - ], - "npm:@tanstack/start-storage-context": [ - { - "source": "npm:@tanstack/start-storage-context", - "target": "npm:@tanstack/router-core", - "type": "static" - } - ], - "npm:@tanstack/typedoc-config": [ - { - "source": "npm:@tanstack/typedoc-config", - "target": "npm:typedoc", - "type": "static" - }, - { - "source": "npm:@tanstack/typedoc-config", - "target": "npm:typedoc-plugin-frontmatter", - "type": "static" - }, - { - "source": "npm:@tanstack/typedoc-config", - "target": "npm:typedoc-plugin-markdown", - "type": "static" - } - ], - "npm:@tanstack/vite-config": [ - { - "source": "npm:@tanstack/vite-config", - "target": "npm:rollup-plugin-preserve-directives", - "type": "static" - }, - { - "source": "npm:@tanstack/vite-config", - "target": "npm:vite-plugin-dts", - "type": "static" - }, - { - "source": "npm:@tanstack/vite-config", - "target": "npm:vite-plugin-externalize-deps", - "type": "static" - }, - { - "source": "npm:@tanstack/vite-config", - "target": "npm:vite-tsconfig-paths", - "type": "static" - } - ], - "npm:@testing-library/dom": [ - { - "source": "npm:@testing-library/dom", - "target": "npm:@babel/code-frame@7.27.1", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:@types/aria-query", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:aria-query@5.3.0", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:dom-accessibility-api@0.5.16", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:lz-string", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@testing-library/dom", - "target": "npm:pretty-format@27.5.1", - "type": "static" - } - ], - "npm:@testing-library/jest-dom": [ - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:@adobe/css-tools", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:aria-query@5.3.0", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:css.escape", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:dom-accessibility-api@0.6.3", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:@testing-library/jest-dom", - "target": "npm:redent", - "type": "static" - } - ], - "npm:@testing-library/react": [ - { - "source": "npm:@testing-library/react", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:@testing-library/dom", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:react-dom", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:@testing-library/react", - "target": "npm:@types/react-dom", - "type": "static" - } - ], - "npm:@tybys/wasm-util@0.10.1": [ - { - "source": "npm:@tybys/wasm-util@0.10.1", - "target": "npm:tslib", - "type": "static" - } - ], - "npm:@tybys/wasm-util@0.9.0": [ - { - "source": "npm:@tybys/wasm-util@0.9.0", - "target": "npm:tslib", - "type": "static" - } - ], - "npm:@types/babel__core": [ - { - "source": "npm:@types/babel__core", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@types/babel__generator", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@types/babel__template", - "type": "static" - }, - { - "source": "npm:@types/babel__core", - "target": "npm:@types/babel__traverse", - "type": "static" - } - ], - "npm:@types/babel__generator": [ - { - "source": "npm:@types/babel__generator", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@types/babel__template": [ - { - "source": "npm:@types/babel__template", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@types/babel__template", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@types/babel__traverse": [ - { - "source": "npm:@types/babel__traverse", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:@types/chai": [ - { - "source": "npm:@types/chai", - "target": "npm:@types/deep-eql", - "type": "static" - }, - { - "source": "npm:@types/chai", - "target": "npm:assertion-error", - "type": "static" - } - ], - "npm:@types/conventional-commits-parser": [ - { - "source": "npm:@types/conventional-commits-parser", - "target": "npm:@types/node", - "type": "static" - } - ], - "npm:@types/debug": [ - { - "source": "npm:@types/debug", - "target": "npm:@types/ms", - "type": "static" - } - ], - "npm:@types/estree-jsx": [ - { - "source": "npm:@types/estree-jsx", - "target": "npm:@types/estree", - "type": "static" - } - ], - "npm:@types/hast": [ - { - "source": "npm:@types/hast", - "target": "npm:@types/unist@3.0.3", - "type": "static" - } - ], - "npm:@types/mdast": [ - { - "source": "npm:@types/mdast", - "target": "npm:@types/unist@3.0.3", - "type": "static" - } - ], - "npm:@types/node@20.19.25": [ - { - "source": "npm:@types/node@20.19.25", - "target": "npm:undici-types@6.21.0", - "type": "static" - } - ], - "npm:@types/node": [ - { - "source": "npm:@types/node", - "target": "npm:undici-types@7.16.0", - "type": "static" - } - ], - "npm:@types/react-dom": [ - { - "source": "npm:@types/react-dom", - "target": "npm:@types/react", - "type": "static" - } - ], - "npm:@types/react": [ - { - "source": "npm:@types/react", - "target": "npm:csstype@3.2.3", - "type": "static" - } - ], - "npm:@typescript-eslint/eslint-plugin": [ - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@eslint-community/regexpp", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/parser", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/scope-manager@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/type-utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:@typescript-eslint/visitor-keys@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:graphemer", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:ignore@7.0.5", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:natural-compare", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/eslint-plugin", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/parser": [ - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:@typescript-eslint/scope-manager@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:@typescript-eslint/typescript-estree@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:@typescript-eslint/visitor-keys@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/parser", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/project-service@8.46.3": [ - { - "source": "npm:@typescript-eslint/project-service@8.46.3", - "target": "npm:@typescript-eslint/tsconfig-utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.46.3", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.46.3", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/project-service@8.48.0": [ - { - "source": "npm:@typescript-eslint/project-service@8.48.0", - "target": "npm:@typescript-eslint/tsconfig-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.48.0", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/project-service@8.48.0", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/scope-manager@8.46.3": [ - { - "source": "npm:@typescript-eslint/scope-manager@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/scope-manager@8.46.3", - "target": "npm:@typescript-eslint/visitor-keys@8.46.3", - "type": "static" - } - ], - "npm:@typescript-eslint/scope-manager@8.48.0": [ - { - "source": "npm:@typescript-eslint/scope-manager@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/scope-manager@8.48.0", - "target": "npm:@typescript-eslint/visitor-keys@8.48.0", - "type": "static" - } - ], - "npm:@typescript-eslint/tsconfig-utils@8.46.3": [ - { - "source": "npm:@typescript-eslint/tsconfig-utils@8.46.3", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/tsconfig-utils@8.48.0": [ - { - "source": "npm:@typescript-eslint/tsconfig-utils@8.48.0", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/type-utils@8.46.3": [ - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:@typescript-eslint/typescript-estree@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:@typescript-eslint/utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.46.3", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/type-utils@8.48.0": [ - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:@typescript-eslint/typescript-estree@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/type-utils@8.48.0", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/typescript-estree@8.46.3": [ - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:@typescript-eslint/project-service@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:@typescript-eslint/tsconfig-utils@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:@typescript-eslint/visitor-keys@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.46.3", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/typescript-estree@8.48.0": [ - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:@typescript-eslint/project-service@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:@typescript-eslint/tsconfig-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:@typescript-eslint/visitor-keys@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/typescript-estree@8.48.0", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/utils@8.46.3": [ - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:@typescript-eslint/scope-manager@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:@typescript-eslint/typescript-estree@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.46.3", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/utils@8.48.0": [ - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:@typescript-eslint/typescript-estree@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/utils@8.48.0", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@typescript-eslint/visitor-keys@8.46.3": [ - { - "source": "npm:@typescript-eslint/visitor-keys@8.46.3", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/visitor-keys@8.46.3", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - } - ], - "npm:@typescript-eslint/visitor-keys@8.48.0": [ - { - "source": "npm:@typescript-eslint/visitor-keys@8.48.0", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:@typescript-eslint/visitor-keys@8.48.0", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - } - ], - "npm:@unrs/resolver-binding-wasm32-wasi": [ - { - "source": "npm:@unrs/resolver-binding-wasm32-wasi", - "target": "npm:@napi-rs/wasm-runtime@0.2.12", - "type": "static" - } - ], - "npm:@vercel/nft": [ - { - "source": "npm:@vercel/nft", - "target": "npm:@mapbox/node-pre-gyp", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:acorn-import-attributes", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:async-sema", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:bindings", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:glob", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:node-gyp-build", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:@vercel/nft", - "target": "npm:resolve-from@5.0.0", - "type": "static" - } - ], - "npm:@vitejs/plugin-react": [ - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@babel/plugin-transform-react-jsx-self", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@babel/plugin-transform-react-jsx-source", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@rolldown/pluginutils@1.0.0-beta.47", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:@types/babel__core", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:react-refresh", - "type": "static" - }, - { - "source": "npm:@vitejs/plugin-react", - "target": "npm:vite", - "type": "static" - } - ], - "npm:@vitest/expect": [ - { - "source": "npm:@vitest/expect", - "target": "npm:@standard-schema/spec", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:@types/chai", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:@vitest/spy", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:@vitest/utils", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:chai", - "type": "static" - }, - { - "source": "npm:@vitest/expect", - "target": "npm:tinyrainbow", - "type": "static" - } - ], - "npm:@vitest/mocker": [ - { - "source": "npm:@vitest/mocker", - "target": "npm:@vitest/spy", - "type": "static" - }, - { - "source": "npm:@vitest/mocker", - "target": "npm:estree-walker@3.0.3", - "type": "static" - }, - { - "source": "npm:@vitest/mocker", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@vitest/mocker", - "target": "npm:vite", - "type": "static" - } - ], - "npm:@vitest/pretty-format": [ - { - "source": "npm:@vitest/pretty-format", - "target": "npm:tinyrainbow", - "type": "static" - } - ], - "npm:@vitest/runner": [ - { - "source": "npm:@vitest/runner", - "target": "npm:@vitest/utils", - "type": "static" - }, - { - "source": "npm:@vitest/runner", - "target": "npm:pathe@2.0.3", - "type": "static" - } - ], - "npm:@vitest/snapshot": [ - { - "source": "npm:@vitest/snapshot", - "target": "npm:@vitest/pretty-format", - "type": "static" - }, - { - "source": "npm:@vitest/snapshot", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:@vitest/snapshot", - "target": "npm:pathe@2.0.3", - "type": "static" - } - ], - "npm:@vitest/utils": [ - { - "source": "npm:@vitest/utils", - "target": "npm:@vitest/pretty-format", - "type": "static" - }, - { - "source": "npm:@vitest/utils", - "target": "npm:tinyrainbow", - "type": "static" - } - ], - "npm:@volar/language-core": [ - { - "source": "npm:@volar/language-core", - "target": "npm:@volar/source-map", - "type": "static" - } - ], - "npm:@volar/typescript": [ - { - "source": "npm:@volar/typescript", - "target": "npm:@volar/language-core", - "type": "static" - }, - { - "source": "npm:@volar/typescript", - "target": "npm:path-browserify", - "type": "static" - }, - { - "source": "npm:@volar/typescript", - "target": "npm:vscode-uri", - "type": "static" - } - ], - "npm:@vue/compiler-core": [ - { - "source": "npm:@vue/compiler-core", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:@vue/shared", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:entities@4.5.0", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:estree-walker@2.0.2", - "type": "static" - }, - { - "source": "npm:@vue/compiler-core", - "target": "npm:source-map-js", - "type": "static" - } - ], - "npm:@vue/compiler-dom": [ - { - "source": "npm:@vue/compiler-dom", - "target": "npm:@vue/compiler-core", - "type": "static" - }, - { - "source": "npm:@vue/compiler-dom", - "target": "npm:@vue/shared", - "type": "static" - } - ], - "npm:@vue/compiler-vue2": [ - { - "source": "npm:@vue/compiler-vue2", - "target": "npm:de-indent", - "type": "static" - }, - { - "source": "npm:@vue/compiler-vue2", - "target": "npm:he", - "type": "static" - } - ], - "npm:@vue/language-core": [ - { - "source": "npm:@vue/language-core", - "target": "npm:@volar/language-core", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:@vue/compiler-dom", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:@vue/compiler-vue2", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:@vue/shared", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:computeds", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:muggle-string", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:path-browserify", - "type": "static" - }, - { - "source": "npm:@vue/language-core", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:@yarnpkg/parsers": [ - { - "source": "npm:@yarnpkg/parsers", - "target": "npm:js-yaml@3.14.1", - "type": "static" - }, - { - "source": "npm:@yarnpkg/parsers", - "target": "npm:tslib", - "type": "static" - } - ], - "npm:@zkochan/js-yaml": [ - { - "source": "npm:@zkochan/js-yaml", - "target": "npm:argparse@2.0.1", - "type": "static" - } - ], - "npm:JSONStream": [ - { - "source": "npm:JSONStream", - "target": "npm:jsonparse", - "type": "static" - }, - { - "source": "npm:JSONStream", - "target": "npm:through", - "type": "static" - } - ], - "npm:abort-controller": [ - { - "source": "npm:abort-controller", - "target": "npm:event-target-shim", - "type": "static" - } - ], - "npm:acorn-import-attributes": [ - { - "source": "npm:acorn-import-attributes", - "target": "npm:acorn", - "type": "static" - } - ], - "npm:acorn-jsx": [ - { - "source": "npm:acorn-jsx", - "target": "npm:acorn", - "type": "static" - } - ], - "npm:ajv-draft-04": [ - { - "source": "npm:ajv-draft-04", - "target": "npm:ajv@8.13.0", - "type": "static" - } - ], - "npm:ajv-formats": [ - { - "source": "npm:ajv-formats", - "target": "npm:ajv@8.13.0", - "type": "static" - } - ], - "npm:ajv@6.12.6": [ - { - "source": "npm:ajv@6.12.6", - "target": "npm:fast-deep-equal", - "type": "static" - }, - { - "source": "npm:ajv@6.12.6", - "target": "npm:fast-json-stable-stringify", - "type": "static" - }, - { - "source": "npm:ajv@6.12.6", - "target": "npm:json-schema-traverse@0.4.1", - "type": "static" - }, - { - "source": "npm:ajv@6.12.6", - "target": "npm:uri-js", - "type": "static" - } - ], - "npm:ajv@8.12.0": [ - { - "source": "npm:ajv@8.12.0", - "target": "npm:fast-deep-equal", - "type": "static" - }, - { - "source": "npm:ajv@8.12.0", - "target": "npm:json-schema-traverse@1.0.0", - "type": "static" - }, - { - "source": "npm:ajv@8.12.0", - "target": "npm:require-from-string", - "type": "static" - }, - { - "source": "npm:ajv@8.12.0", - "target": "npm:uri-js", - "type": "static" - } - ], - "npm:ajv@8.13.0": [ - { - "source": "npm:ajv@8.13.0", - "target": "npm:fast-deep-equal", - "type": "static" - }, - { - "source": "npm:ajv@8.13.0", - "target": "npm:json-schema-traverse@1.0.0", - "type": "static" - }, - { - "source": "npm:ajv@8.13.0", - "target": "npm:require-from-string", - "type": "static" - }, - { - "source": "npm:ajv@8.13.0", - "target": "npm:uri-js", - "type": "static" - } - ], - "npm:ansi-styles@4.3.0": [ - { - "source": "npm:ansi-styles@4.3.0", - "target": "npm:color-convert", - "type": "static" - } - ], - "npm:anymatch": [ - { - "source": "npm:anymatch", - "target": "npm:normalize-path", - "type": "static" - }, - { - "source": "npm:anymatch", - "target": "npm:picomatch@2.3.1", - "type": "static" - } - ], - "npm:archiver-utils": [ - { - "source": "npm:archiver-utils", - "target": "npm:glob", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:is-stream@2.0.1", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:lazystream", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:lodash", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:normalize-path", - "type": "static" - }, - { - "source": "npm:archiver-utils", - "target": "npm:readable-stream@4.7.0", - "type": "static" - } - ], - "npm:archiver": [ - { - "source": "npm:archiver", - "target": "npm:archiver-utils", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:async", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:buffer-crc32", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:readable-stream@4.7.0", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:readdir-glob", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:tar-stream@3.1.7", - "type": "static" - }, - { - "source": "npm:archiver", - "target": "npm:zip-stream", - "type": "static" - } - ], - "npm:argparse@1.0.10": [ - { - "source": "npm:argparse@1.0.10", - "target": "npm:sprintf-js", - "type": "static" - } - ], - "npm:aria-query@5.3.0": [ - { - "source": "npm:aria-query@5.3.0", - "target": "npm:dequal", - "type": "static" - } - ], - "npm:ast-types": [ - { - "source": "npm:ast-types", - "target": "npm:tslib", - "type": "static" - } - ], - "npm:axios": [ - { - "source": "npm:axios", - "target": "npm:follow-redirects", - "type": "static" - }, - { - "source": "npm:axios", - "target": "npm:form-data", - "type": "static" - }, - { - "source": "npm:axios", - "target": "npm:proxy-from-env", - "type": "static" - } - ], - "npm:babel-dead-code-elimination": [ - { - "source": "npm:babel-dead-code-elimination", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:babel-dead-code-elimination", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:babel-dead-code-elimination", - "target": "npm:@babel/traverse", - "type": "static" - }, - { - "source": "npm:babel-dead-code-elimination", - "target": "npm:@babel/types@7.28.5", - "type": "static" - } - ], - "npm:babel-plugin-jsx-dom-expressions": [ - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:@babel/helper-module-imports@7.18.6", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:@babel/plugin-syntax-jsx", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:html-entities", - "type": "static" - }, - { - "source": "npm:babel-plugin-jsx-dom-expressions", - "target": "npm:parse5@7.3.0", - "type": "static" - } - ], - "npm:babel-preset-solid": [ - { - "source": "npm:babel-preset-solid", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:babel-preset-solid", - "target": "npm:babel-plugin-jsx-dom-expressions", - "type": "static" - }, - { - "source": "npm:babel-preset-solid", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:better-path-resolve": [ - { - "source": "npm:better-path-resolve", - "target": "npm:is-windows", - "type": "static" - } - ], - "npm:bidi-js": [ - { - "source": "npm:bidi-js", - "target": "npm:require-from-string", - "type": "static" - } - ], - "npm:bindings": [ - { - "source": "npm:bindings", - "target": "npm:file-uri-to-path", - "type": "static" - } - ], - "npm:bl": [ - { - "source": "npm:bl", - "target": "npm:buffer@5.7.1", - "type": "static" - }, - { - "source": "npm:bl", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:bl", - "target": "npm:readable-stream@3.6.2", - "type": "static" - } - ], - "npm:brace-expansion@1.1.12": [ - { - "source": "npm:brace-expansion@1.1.12", - "target": "npm:balanced-match", - "type": "static" - }, - { - "source": "npm:brace-expansion@1.1.12", - "target": "npm:concat-map", - "type": "static" - } - ], - "npm:brace-expansion@2.0.2": [ - { - "source": "npm:brace-expansion@2.0.2", - "target": "npm:balanced-match", - "type": "static" - } - ], - "npm:braces": [ - { - "source": "npm:braces", - "target": "npm:fill-range", - "type": "static" - } - ], - "npm:browserslist": [ - { - "source": "npm:browserslist", - "target": "npm:baseline-browser-mapping", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:caniuse-lite", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:electron-to-chromium", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:node-releases", - "type": "static" - }, - { - "source": "npm:browserslist", - "target": "npm:update-browserslist-db", - "type": "static" - } - ], - "npm:buffer@5.7.1": [ - { - "source": "npm:buffer@5.7.1", - "target": "npm:base64-js", - "type": "static" - }, - { - "source": "npm:buffer@5.7.1", - "target": "npm:ieee754", - "type": "static" - } - ], - "npm:buffer@6.0.3": [ - { - "source": "npm:buffer@6.0.3", - "target": "npm:base64-js", - "type": "static" - }, - { - "source": "npm:buffer@6.0.3", - "target": "npm:ieee754", - "type": "static" - } - ], - "npm:c12": [ - { - "source": "npm:c12", - "target": "npm:chokidar@4.0.3", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:confbox@0.2.2", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:dotenv@17.2.3", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:exsolve", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:giget", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:ohash", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:perfect-debounce", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:rc9", - "type": "static" - }, - { - "source": "npm:c12", - "target": "npm:magicast", - "type": "static" - } - ], - "npm:call-bind-apply-helpers": [ - { - "source": "npm:call-bind-apply-helpers", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:call-bind-apply-helpers", - "target": "npm:function-bind", - "type": "static" - } - ], - "npm:chalk@4.1.2": [ - { - "source": "npm:chalk@4.1.2", - "target": "npm:ansi-styles@4.3.0", - "type": "static" - }, - { - "source": "npm:chalk@4.1.2", - "target": "npm:supports-color@7.2.0", - "type": "static" - } - ], - "npm:cheerio-select": [ - { - "source": "npm:cheerio-select", - "target": "npm:boolbase", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:css-select", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:css-what", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:cheerio-select", - "target": "npm:domutils", - "type": "static" - } - ], - "npm:cheerio": [ - { - "source": "npm:cheerio", - "target": "npm:cheerio-select", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:dom-serializer", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:domutils", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:encoding-sniffer", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:htmlparser2", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:parse5@7.3.0", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:parse5-htmlparser2-tree-adapter", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:parse5-parser-stream", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:undici", - "type": "static" - }, - { - "source": "npm:cheerio", - "target": "npm:whatwg-mimetype@4.0.0", - "type": "static" - } - ], - "npm:chokidar@3.6.0": [ - { - "source": "npm:chokidar@3.6.0", - "target": "npm:anymatch", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:braces", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:glob-parent@5.1.2", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:is-binary-path", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:normalize-path", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:readdirp@3.6.0", - "type": "static" - }, - { - "source": "npm:chokidar@3.6.0", - "target": "npm:fsevents", - "type": "static" - } - ], - "npm:chokidar@4.0.3": [ - { - "source": "npm:chokidar@4.0.3", - "target": "npm:readdirp@4.1.2", - "type": "static" - } - ], - "npm:citty": [ - { - "source": "npm:citty", - "target": "npm:consola", - "type": "static" - } - ], - "npm:cli-cursor": [ - { - "source": "npm:cli-cursor", - "target": "npm:restore-cursor", - "type": "static" - } - ], - "npm:clipboardy": [ - { - "source": "npm:clipboardy", - "target": "npm:execa", - "type": "static" - }, - { - "source": "npm:clipboardy", - "target": "npm:is-wsl@3.1.0", - "type": "static" - }, - { - "source": "npm:clipboardy", - "target": "npm:is64bit", - "type": "static" - } - ], - "npm:cliui": [ - { - "source": "npm:cliui", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:cliui", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:cliui", - "target": "npm:wrap-ansi@7.0.0", - "type": "static" - } - ], - "npm:color-convert": [ - { - "source": "npm:color-convert", - "target": "npm:color-name", - "type": "static" - } - ], - "npm:combined-stream": [ - { - "source": "npm:combined-stream", - "target": "npm:delayed-stream", - "type": "static" - } - ], - "npm:compare-func": [ - { - "source": "npm:compare-func", - "target": "npm:array-ify", - "type": "static" - }, - { - "source": "npm:compare-func", - "target": "npm:dot-prop@5.3.0", - "type": "static" - } - ], - "npm:compress-commons": [ - { - "source": "npm:compress-commons", - "target": "npm:crc-32", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:crc32-stream", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:is-stream@2.0.1", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:normalize-path", - "type": "static" - }, - { - "source": "npm:compress-commons", - "target": "npm:readable-stream@4.7.0", - "type": "static" - } - ], - "npm:conventional-changelog-angular": [ - { - "source": "npm:conventional-changelog-angular", - "target": "npm:compare-func", - "type": "static" - } - ], - "npm:conventional-commits-parser": [ - { - "source": "npm:conventional-commits-parser", - "target": "npm:JSONStream", - "type": "static" - }, - { - "source": "npm:conventional-commits-parser", - "target": "npm:is-text-path", - "type": "static" - }, - { - "source": "npm:conventional-commits-parser", - "target": "npm:meow", - "type": "static" - }, - { - "source": "npm:conventional-commits-parser", - "target": "npm:split2", - "type": "static" - } - ], - "npm:crc32-stream": [ - { - "source": "npm:crc32-stream", - "target": "npm:crc-32", - "type": "static" - }, - { - "source": "npm:crc32-stream", - "target": "npm:readable-stream@4.7.0", - "type": "static" - } - ], - "npm:cross-spawn": [ - { - "source": "npm:cross-spawn", - "target": "npm:path-key@3.1.1", - "type": "static" - }, - { - "source": "npm:cross-spawn", - "target": "npm:shebang-command", - "type": "static" - }, - { - "source": "npm:cross-spawn", - "target": "npm:which", - "type": "static" - } - ], - "npm:crossws": [ - { - "source": "npm:crossws", - "target": "npm:uncrypto", - "type": "static" - } - ], - "npm:css-select": [ - { - "source": "npm:css-select", - "target": "npm:boolbase", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:css-what", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:domutils", - "type": "static" - }, - { - "source": "npm:css-select", - "target": "npm:nth-check", - "type": "static" - } - ], - "npm:css-tree": [ - { - "source": "npm:css-tree", - "target": "npm:mdn-data", - "type": "static" - }, - { - "source": "npm:css-tree", - "target": "npm:source-map-js", - "type": "static" - } - ], - "npm:cssstyle": [ - { - "source": "npm:cssstyle", - "target": "npm:@asamuzakjp/css-color", - "type": "static" - }, - { - "source": "npm:cssstyle", - "target": "npm:@csstools/css-syntax-patches-for-csstree", - "type": "static" - }, - { - "source": "npm:cssstyle", - "target": "npm:css-tree", - "type": "static" - } - ], - "npm:data-urls": [ - { - "source": "npm:data-urls", - "target": "npm:whatwg-mimetype@4.0.0", - "type": "static" - }, - { - "source": "npm:data-urls", - "target": "npm:whatwg-url@15.1.0", - "type": "static" - } - ], - "npm:debug": [ - { - "source": "npm:debug", - "target": "npm:ms", - "type": "static" - } - ], - "npm:decode-named-character-reference": [ - { - "source": "npm:decode-named-character-reference", - "target": "npm:character-entities", - "type": "static" - } - ], - "npm:defaults": [ - { - "source": "npm:defaults", - "target": "npm:clone", - "type": "static" - } - ], - "npm:devlop": [ - { - "source": "npm:devlop", - "target": "npm:dequal", - "type": "static" - } - ], - "npm:dir-glob": [ - { - "source": "npm:dir-glob", - "target": "npm:path-type@4.0.0", - "type": "static" - } - ], - "npm:dom-serializer": [ - { - "source": "npm:dom-serializer", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:dom-serializer", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:dom-serializer", - "target": "npm:entities@4.5.0", - "type": "static" - } - ], - "npm:domhandler": [ - { - "source": "npm:domhandler", - "target": "npm:domelementtype", - "type": "static" - } - ], - "npm:domutils": [ - { - "source": "npm:domutils", - "target": "npm:dom-serializer", - "type": "static" - }, - { - "source": "npm:domutils", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:domutils", - "target": "npm:domhandler", - "type": "static" - } - ], - "npm:dot-prop@10.1.0": [ - { - "source": "npm:dot-prop@10.1.0", - "target": "npm:type-fest", - "type": "static" - } - ], - "npm:dot-prop@5.3.0": [ - { - "source": "npm:dot-prop@5.3.0", - "target": "npm:is-obj", - "type": "static" - } - ], - "npm:dotenv-expand": [ - { - "source": "npm:dotenv-expand", - "target": "npm:dotenv@16.6.1", - "type": "static" - } - ], - "npm:dunder-proto": [ - { - "source": "npm:dunder-proto", - "target": "npm:call-bind-apply-helpers", - "type": "static" - }, - { - "source": "npm:dunder-proto", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:dunder-proto", - "target": "npm:gopd", - "type": "static" - } - ], - "npm:ecdsa-sig-formatter": [ - { - "source": "npm:ecdsa-sig-formatter", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - } - ], - "npm:encoding-sniffer": [ - { - "source": "npm:encoding-sniffer", - "target": "npm:iconv-lite@0.6.3", - "type": "static" - }, - { - "source": "npm:encoding-sniffer", - "target": "npm:whatwg-encoding", - "type": "static" - } - ], - "npm:end-of-stream": [ - { - "source": "npm:end-of-stream", - "target": "npm:once", - "type": "static" - } - ], - "npm:enhanced-resolve": [ - { - "source": "npm:enhanced-resolve", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:enhanced-resolve", - "target": "npm:tapable", - "type": "static" - } - ], - "npm:enquirer@2.3.6": [ - { - "source": "npm:enquirer@2.3.6", - "target": "npm:ansi-colors", - "type": "static" - } - ], - "npm:enquirer@2.4.1": [ - { - "source": "npm:enquirer@2.4.1", - "target": "npm:ansi-colors", - "type": "static" - }, - { - "source": "npm:enquirer@2.4.1", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - } - ], - "npm:es-object-atoms": [ - { - "source": "npm:es-object-atoms", - "target": "npm:es-errors", - "type": "static" - } - ], - "npm:es-set-tostringtag": [ - { - "source": "npm:es-set-tostringtag", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:es-set-tostringtag", - "target": "npm:get-intrinsic", - "type": "static" - }, - { - "source": "npm:es-set-tostringtag", - "target": "npm:has-tostringtag", - "type": "static" - }, - { - "source": "npm:es-set-tostringtag", - "target": "npm:hasown", - "type": "static" - } - ], - "npm:esbuild": [ - { - "source": "npm:esbuild", - "target": "npm:@esbuild/aix-ppc64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/android-arm", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/android-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/android-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/darwin-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/darwin-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/freebsd-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/freebsd-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-arm", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-ia32", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-loong64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-mips64el", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-ppc64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-riscv64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-s390x", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/linux-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/netbsd-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/netbsd-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/openbsd-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/openbsd-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/openharmony-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/sunos-x64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/win32-arm64", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/win32-ia32", - "type": "static" - }, - { - "source": "npm:esbuild", - "target": "npm:@esbuild/win32-x64", - "type": "static" - } - ], - "npm:eslint-compat-utils": [ - { - "source": "npm:eslint-compat-utils", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-compat-utils", - "target": "npm:semver@7.7.3", - "type": "static" - } - ], - "npm:eslint-import-context": [ - { - "source": "npm:eslint-import-context", - "target": "npm:get-tsconfig", - "type": "static" - }, - { - "source": "npm:eslint-import-context", - "target": "npm:stable-hash-x", - "type": "static" - }, - { - "source": "npm:eslint-import-context", - "target": "npm:unrs-resolver", - "type": "static" - } - ], - "npm:eslint-plugin-es-x": [ - { - "source": "npm:eslint-plugin-es-x", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:eslint-plugin-es-x", - "target": "npm:@eslint-community/regexpp", - "type": "static" - }, - { - "source": "npm:eslint-plugin-es-x", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-es-x", - "target": "npm:eslint-compat-utils", - "type": "static" - } - ], - "npm:eslint-plugin-import-x": [ - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:@typescript-eslint/types@8.46.3", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:comment-parser", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:eslint-import-context", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:stable-hash-x", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:unrs-resolver", - "type": "static" - }, - { - "source": "npm:eslint-plugin-import-x", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - } - ], - "npm:eslint-plugin-n": [ - { - "source": "npm:eslint-plugin-n", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:enhanced-resolve", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:eslint-plugin-es-x", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:get-tsconfig", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:globals@15.15.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:globrex", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:ignore@5.3.2", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:eslint-plugin-n", - "target": "npm:ts-declaration-location", - "type": "static" - } - ], - "npm:eslint-plugin-react-compiler": [ - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:@babel/plugin-proposal-private-methods", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:hermes-parser", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:zod@3.25.76", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-compiler", - "target": "npm:zod-validation-error@3.5.4", - "type": "static" - } - ], - "npm:eslint-plugin-react-dom": [ - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:compare-versions", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-dom", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:eslint-plugin-react-hooks-extra": [ - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks-extra", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:eslint-plugin-react-hooks": [ - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:hermes-parser", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:zod@4.1.13", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-hooks", - "target": "npm:zod-validation-error@4.0.2", - "type": "static" - } - ], - "npm:eslint-plugin-react-naming-convention": [ - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-naming-convention", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:eslint-plugin-react-web-api": [ - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-web-api", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:eslint-plugin-react-x": [ - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/ast", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/core", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/eff", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/shared", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@eslint-react/var", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@typescript-eslint/scope-manager@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@typescript-eslint/types@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:@typescript-eslint/utils@8.48.0", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:compare-versions", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:is-immutable-type", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:string-ts", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:ts-pattern", - "type": "static" - }, - { - "source": "npm:eslint-plugin-react-x", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:eslint-plugin-unused-imports": [ - { - "source": "npm:eslint-plugin-unused-imports", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:eslint-plugin-unused-imports", - "target": "npm:@typescript-eslint/eslint-plugin", - "type": "static" - } - ], - "npm:eslint-scope": [ - { - "source": "npm:eslint-scope", - "target": "npm:esrecurse", - "type": "static" - }, - { - "source": "npm:eslint-scope", - "target": "npm:estraverse", - "type": "static" - } - ], - "npm:eslint": [ - { - "source": "npm:eslint", - "target": "npm:@eslint-community/eslint-utils", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint-community/regexpp", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/config-array", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/config-helpers", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/core", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/eslintrc", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/js", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@eslint/plugin-kit", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@humanfs/node", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@humanwhocodes/module-importer", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@humanwhocodes/retry", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:ajv@6.12.6", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:cross-spawn", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:escape-string-regexp@4.0.0", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:eslint-scope", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:espree", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:esquery", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:esutils", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:fast-deep-equal", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:file-entry-cache", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:find-up@5.0.0", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:glob-parent@6.0.2", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:ignore@5.3.2", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:imurmurhash", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:is-glob", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:json-stable-stringify-without-jsonify", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:lodash.merge", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:minimatch@3.1.2", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:natural-compare", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:optionator", - "type": "static" - }, - { - "source": "npm:eslint", - "target": "npm:jiti", - "type": "static" - } - ], - "npm:espree": [ - { - "source": "npm:espree", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:espree", - "target": "npm:acorn-jsx", - "type": "static" - }, - { - "source": "npm:espree", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - } - ], - "npm:esquery": [ - { - "source": "npm:esquery", - "target": "npm:estraverse", - "type": "static" - } - ], - "npm:esrap": [ - { - "source": "npm:esrap", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - } - ], - "npm:esrecurse": [ - { - "source": "npm:esrecurse", - "target": "npm:estraverse", - "type": "static" - } - ], - "npm:estree-walker@3.0.3": [ - { - "source": "npm:estree-walker@3.0.3", - "target": "npm:@types/estree", - "type": "static" - } - ], - "npm:events-universal": [ - { - "source": "npm:events-universal", - "target": "npm:bare-events", - "type": "static" - } - ], - "npm:execa": [ - { - "source": "npm:execa", - "target": "npm:cross-spawn", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:get-stream", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:human-signals", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:is-stream@3.0.0", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:merge-stream", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:npm-run-path@5.3.0", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:onetime@6.0.0", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:signal-exit@4.1.0", - "type": "static" - }, - { - "source": "npm:execa", - "target": "npm:strip-final-newline", - "type": "static" - } - ], - "npm:fast-glob": [ - { - "source": "npm:fast-glob", - "target": "npm:@nodelib/fs.stat", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:@nodelib/fs.walk", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:glob-parent@5.1.2", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:merge2", - "type": "static" - }, - { - "source": "npm:fast-glob", - "target": "npm:micromatch", - "type": "static" - } - ], - "npm:fastq": [ - { - "source": "npm:fastq", - "target": "npm:reusify", - "type": "static" - } - ], - "npm:fd-package-json": [ - { - "source": "npm:fd-package-json", - "target": "npm:walk-up-path", - "type": "static" - } - ], - "npm:fdir": [ - { - "source": "npm:fdir", - "target": "npm:picomatch@4.0.3", - "type": "static" - } - ], - "npm:fetch-blob": [ - { - "source": "npm:fetch-blob", - "target": "npm:node-domexception", - "type": "static" - }, - { - "source": "npm:fetch-blob", - "target": "npm:web-streams-polyfill", - "type": "static" - } - ], - "npm:figures": [ - { - "source": "npm:figures", - "target": "npm:escape-string-regexp@1.0.5", - "type": "static" - } - ], - "npm:file-entry-cache": [ - { - "source": "npm:file-entry-cache", - "target": "npm:flat-cache", - "type": "static" - } - ], - "npm:fill-range": [ - { - "source": "npm:fill-range", - "target": "npm:to-regex-range", - "type": "static" - } - ], - "npm:find-up@4.1.0": [ - { - "source": "npm:find-up@4.1.0", - "target": "npm:locate-path@5.0.0", - "type": "static" - }, - { - "source": "npm:find-up@4.1.0", - "target": "npm:path-exists", - "type": "static" - } - ], - "npm:find-up@5.0.0": [ - { - "source": "npm:find-up@5.0.0", - "target": "npm:locate-path@6.0.0", - "type": "static" - }, - { - "source": "npm:find-up@5.0.0", - "target": "npm:path-exists", - "type": "static" - } - ], - "npm:flat-cache": [ - { - "source": "npm:flat-cache", - "target": "npm:flatted", - "type": "static" - }, - { - "source": "npm:flat-cache", - "target": "npm:keyv", - "type": "static" - } - ], - "npm:foreground-child": [ - { - "source": "npm:foreground-child", - "target": "npm:cross-spawn", - "type": "static" - }, - { - "source": "npm:foreground-child", - "target": "npm:signal-exit@4.1.0", - "type": "static" - } - ], - "npm:form-data": [ - { - "source": "npm:form-data", - "target": "npm:asynckit", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:combined-stream", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:es-set-tostringtag", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:hasown", - "type": "static" - }, - { - "source": "npm:form-data", - "target": "npm:mime-types@2.1.35", - "type": "static" - } - ], - "npm:formatly": [ - { - "source": "npm:formatly", - "target": "npm:fd-package-json", - "type": "static" - } - ], - "npm:formdata-polyfill": [ - { - "source": "npm:formdata-polyfill", - "target": "npm:fetch-blob", - "type": "static" - } - ], - "npm:front-matter": [ - { - "source": "npm:front-matter", - "target": "npm:js-yaml@3.14.1", - "type": "static" - } - ], - "npm:fs-extra@7.0.1": [ - { - "source": "npm:fs-extra@7.0.1", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:fs-extra@7.0.1", - "target": "npm:jsonfile@4.0.0", - "type": "static" - }, - { - "source": "npm:fs-extra@7.0.1", - "target": "npm:universalify@0.1.2", - "type": "static" - } - ], - "npm:fs-extra@8.1.0": [ - { - "source": "npm:fs-extra@8.1.0", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:fs-extra@8.1.0", - "target": "npm:jsonfile@4.0.0", - "type": "static" - }, - { - "source": "npm:fs-extra@8.1.0", - "target": "npm:universalify@0.1.2", - "type": "static" - } - ], - "npm:gaxios": [ - { - "source": "npm:gaxios", - "target": "npm:extend", - "type": "static" - }, - { - "source": "npm:gaxios", - "target": "npm:https-proxy-agent", - "type": "static" - }, - { - "source": "npm:gaxios", - "target": "npm:node-fetch@3.3.2", - "type": "static" - }, - { - "source": "npm:gaxios", - "target": "npm:rimraf", - "type": "static" - } - ], - "npm:gcp-metadata": [ - { - "source": "npm:gcp-metadata", - "target": "npm:gaxios", - "type": "static" - }, - { - "source": "npm:gcp-metadata", - "target": "npm:google-logging-utils", - "type": "static" - }, - { - "source": "npm:gcp-metadata", - "target": "npm:json-bigint", - "type": "static" - } - ], - "npm:get-intrinsic": [ - { - "source": "npm:get-intrinsic", - "target": "npm:call-bind-apply-helpers", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:es-define-property", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:es-errors", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:es-object-atoms", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:function-bind", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:get-proto", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:gopd", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:has-symbols", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:hasown", - "type": "static" - }, - { - "source": "npm:get-intrinsic", - "target": "npm:math-intrinsics", - "type": "static" - } - ], - "npm:get-proto": [ - { - "source": "npm:get-proto", - "target": "npm:dunder-proto", - "type": "static" - }, - { - "source": "npm:get-proto", - "target": "npm:es-object-atoms", - "type": "static" - } - ], - "npm:get-tsconfig": [ - { - "source": "npm:get-tsconfig", - "target": "npm:resolve-pkg-maps", - "type": "static" - } - ], - "npm:giget": [ - { - "source": "npm:giget", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:node-fetch-native", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:nypm", - "type": "static" - }, - { - "source": "npm:giget", - "target": "npm:pathe@2.0.3", - "type": "static" - } - ], - "npm:glob-parent@5.1.2": [ - { - "source": "npm:glob-parent@5.1.2", - "target": "npm:is-glob", - "type": "static" - } - ], - "npm:glob-parent@6.0.2": [ - { - "source": "npm:glob-parent@6.0.2", - "target": "npm:is-glob", - "type": "static" - } - ], - "npm:glob": [ - { - "source": "npm:glob", - "target": "npm:foreground-child", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:jackspeak", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:minipass", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:package-json-from-dist", - "type": "static" - }, - { - "source": "npm:glob", - "target": "npm:path-scurry", - "type": "static" - } - ], - "npm:globby@11.1.0": [ - { - "source": "npm:globby@11.1.0", - "target": "npm:array-union", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:dir-glob", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:ignore@5.3.2", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:merge2", - "type": "static" - }, - { - "source": "npm:globby@11.1.0", - "target": "npm:slash@3.0.0", - "type": "static" - } - ], - "npm:globby@15.0.0": [ - { - "source": "npm:globby@15.0.0", - "target": "npm:@sindresorhus/merge-streams", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:ignore@7.0.5", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:path-type@6.0.0", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:slash@5.1.0", - "type": "static" - }, - { - "source": "npm:globby@15.0.0", - "target": "npm:unicorn-magic", - "type": "static" - } - ], - "npm:goober": [ - { - "source": "npm:goober", - "target": "npm:csstype@3.2.3", - "type": "static" - } - ], - "npm:google-auth-library": [ - { - "source": "npm:google-auth-library", - "target": "npm:base64-js", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:ecdsa-sig-formatter", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:gaxios", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:gcp-metadata", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:google-logging-utils", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:gtoken", - "type": "static" - }, - { - "source": "npm:google-auth-library", - "target": "npm:jws", - "type": "static" - } - ], - "npm:gtoken": [ - { - "source": "npm:gtoken", - "target": "npm:gaxios", - "type": "static" - }, - { - "source": "npm:gtoken", - "target": "npm:jws", - "type": "static" - } - ], - "npm:gzip-size": [ - { - "source": "npm:gzip-size", - "target": "npm:duplexer", - "type": "static" - } - ], - "npm:h3@1.15.4": [ - { - "source": "npm:h3@1.15.4", - "target": "npm:cookie-es@1.2.2", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:crossws", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:iron-webcrypto", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:node-mock-http", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:radix3", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:h3@1.15.4", - "target": "npm:uncrypto", - "type": "static" - } - ], - "npm:h3@2.0.0-beta.5": [ - { - "source": "npm:h3@2.0.0-beta.5", - "target": "npm:cookie-es@2.0.0", - "type": "static" - }, - { - "source": "npm:h3@2.0.0-beta.5", - "target": "npm:fetchdts", - "type": "static" - }, - { - "source": "npm:h3@2.0.0-beta.5", - "target": "npm:rou3", - "type": "static" - }, - { - "source": "npm:h3@2.0.0-beta.5", - "target": "npm:srvx", - "type": "static" - } - ], - "npm:h3-v2": [ - { - "source": "npm:h3-v2", - "target": "npm:cookie-es@2.0.0", - "type": "static" - }, - { - "source": "npm:h3-v2", - "target": "npm:fetchdts", - "type": "static" - }, - { - "source": "npm:h3-v2", - "target": "npm:rou3", - "type": "static" - }, - { - "source": "npm:h3-v2", - "target": "npm:srvx", - "type": "static" - } - ], - "npm:happy-dom": [ - { - "source": "npm:happy-dom", - "target": "npm:@types/node@20.19.25", - "type": "static" - }, - { - "source": "npm:happy-dom", - "target": "npm:@types/whatwg-mimetype", - "type": "static" - }, - { - "source": "npm:happy-dom", - "target": "npm:whatwg-mimetype@3.0.0", - "type": "static" - } - ], - "npm:has-tostringtag": [ - { - "source": "npm:has-tostringtag", - "target": "npm:has-symbols", - "type": "static" - } - ], - "npm:hasown": [ - { - "source": "npm:hasown", - "target": "npm:function-bind", - "type": "static" - } - ], - "npm:hast-util-from-parse5": [ - { - "source": "npm:hast-util-from-parse5", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:hastscript", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:property-information@7.1.0", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:vfile-location", - "type": "static" - }, - { - "source": "npm:hast-util-from-parse5", - "target": "npm:web-namespaces", - "type": "static" - } - ], - "npm:hast-util-is-element": [ - { - "source": "npm:hast-util-is-element", - "target": "npm:@types/hast", - "type": "static" - } - ], - "npm:hast-util-parse-selector": [ - { - "source": "npm:hast-util-parse-selector", - "target": "npm:@types/hast", - "type": "static" - } - ], - "npm:hast-util-raw": [ - { - "source": "npm:hast-util-raw", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:@ungap/structured-clone", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:hast-util-from-parse5", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:hast-util-to-parse5", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:html-void-elements", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:mdast-util-to-hast", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:parse5@7.3.0", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:unist-util-position", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:vfile", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:web-namespaces", - "type": "static" - }, - { - "source": "npm:hast-util-raw", - "target": "npm:zwitch", - "type": "static" - } - ], - "npm:hast-util-sanitize": [ - { - "source": "npm:hast-util-sanitize", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-sanitize", - "target": "npm:@ungap/structured-clone", - "type": "static" - }, - { - "source": "npm:hast-util-sanitize", - "target": "npm:unist-util-position", - "type": "static" - } - ], - "npm:hast-util-to-jsx-runtime": [ - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:comma-separated-tokens", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:estree-util-is-identifier-name", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:hast-util-whitespace", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:mdast-util-mdx-expression", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:mdast-util-mdx-jsx", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:mdast-util-mdxjs-esm", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:property-information@7.1.0", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:space-separated-tokens", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:style-to-js", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:unist-util-position", - "type": "static" - }, - { - "source": "npm:hast-util-to-jsx-runtime", - "target": "npm:vfile-message", - "type": "static" - } - ], - "npm:hast-util-to-parse5": [ - { - "source": "npm:hast-util-to-parse5", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:comma-separated-tokens", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:property-information@6.5.0", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:space-separated-tokens", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:web-namespaces", - "type": "static" - }, - { - "source": "npm:hast-util-to-parse5", - "target": "npm:zwitch", - "type": "static" - } - ], - "npm:hast-util-to-text": [ - { - "source": "npm:hast-util-to-text", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hast-util-to-text", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:hast-util-to-text", - "target": "npm:hast-util-is-element", - "type": "static" - }, - { - "source": "npm:hast-util-to-text", - "target": "npm:unist-util-find-after", - "type": "static" - } - ], - "npm:hast-util-whitespace": [ - { - "source": "npm:hast-util-whitespace", - "target": "npm:@types/hast", - "type": "static" - } - ], - "npm:hastscript": [ - { - "source": "npm:hastscript", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:comma-separated-tokens", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:hast-util-parse-selector", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:property-information@7.1.0", - "type": "static" - }, - { - "source": "npm:hastscript", - "target": "npm:space-separated-tokens", - "type": "static" - } - ], - "npm:hermes-parser": [ - { - "source": "npm:hermes-parser", - "target": "npm:hermes-estree", - "type": "static" - } - ], - "npm:html-encoding-sniffer": [ - { - "source": "npm:html-encoding-sniffer", - "target": "npm:whatwg-encoding", - "type": "static" - } - ], - "npm:html-link-extractor": [ - { - "source": "npm:html-link-extractor", - "target": "npm:cheerio", - "type": "static" - } - ], - "npm:htmlparser2": [ - { - "source": "npm:htmlparser2", - "target": "npm:domelementtype", - "type": "static" - }, - { - "source": "npm:htmlparser2", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:htmlparser2", - "target": "npm:domutils", - "type": "static" - }, - { - "source": "npm:htmlparser2", - "target": "npm:entities@6.0.1", - "type": "static" - } - ], - "npm:http-errors": [ - { - "source": "npm:http-errors", - "target": "npm:depd", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:setprototypeof", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:statuses@2.0.1", - "type": "static" - }, - { - "source": "npm:http-errors", - "target": "npm:toidentifier", - "type": "static" - } - ], - "npm:http-proxy-agent": [ - { - "source": "npm:http-proxy-agent", - "target": "npm:agent-base", - "type": "static" - }, - { - "source": "npm:http-proxy-agent", - "target": "npm:debug", - "type": "static" - } - ], - "npm:https-proxy-agent": [ - { - "source": "npm:https-proxy-agent", - "target": "npm:agent-base", - "type": "static" - }, - { - "source": "npm:https-proxy-agent", - "target": "npm:debug", - "type": "static" - } - ], - "npm:iconv-lite@0.6.3": [ - { - "source": "npm:iconv-lite@0.6.3", - "target": "npm:safer-buffer", - "type": "static" - } - ], - "npm:iconv-lite@0.7.0": [ - { - "source": "npm:iconv-lite@0.7.0", - "target": "npm:safer-buffer", - "type": "static" - } - ], - "npm:import-fresh": [ - { - "source": "npm:import-fresh", - "target": "npm:parent-module", - "type": "static" - }, - { - "source": "npm:import-fresh", - "target": "npm:resolve-from@4.0.0", - "type": "static" - } - ], - "npm:ioredis": [ - { - "source": "npm:ioredis", - "target": "npm:@ioredis/commands", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:cluster-key-slot", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:denque", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:lodash.defaults", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:lodash.isarguments", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:redis-errors", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:redis-parser", - "type": "static" - }, - { - "source": "npm:ioredis", - "target": "npm:standard-as-callback", - "type": "static" - } - ], - "npm:is-alphanumerical": [ - { - "source": "npm:is-alphanumerical", - "target": "npm:is-alphabetical", - "type": "static" - }, - { - "source": "npm:is-alphanumerical", - "target": "npm:is-decimal", - "type": "static" - } - ], - "npm:is-binary-path": [ - { - "source": "npm:is-binary-path", - "target": "npm:binary-extensions", - "type": "static" - } - ], - "npm:is-core-module": [ - { - "source": "npm:is-core-module", - "target": "npm:hasown", - "type": "static" - } - ], - "npm:is-glob": [ - { - "source": "npm:is-glob", - "target": "npm:is-extglob", - "type": "static" - } - ], - "npm:is-immutable-type": [ - { - "source": "npm:is-immutable-type", - "target": "npm:@typescript-eslint/type-utils@8.48.0", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:ts-api-utils", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:ts-declaration-location", - "type": "static" - }, - { - "source": "npm:is-immutable-type", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:is-inside-container": [ - { - "source": "npm:is-inside-container", - "target": "npm:is-docker@3.0.0", - "type": "static" - } - ], - "npm:is-reference@1.2.1": [ - { - "source": "npm:is-reference@1.2.1", - "target": "npm:@types/estree", - "type": "static" - } - ], - "npm:is-reference@3.0.3": [ - { - "source": "npm:is-reference@3.0.3", - "target": "npm:@types/estree", - "type": "static" - } - ], - "npm:is-subdir": [ - { - "source": "npm:is-subdir", - "target": "npm:better-path-resolve", - "type": "static" - } - ], - "npm:is-text-path": [ - { - "source": "npm:is-text-path", - "target": "npm:text-extensions", - "type": "static" - } - ], - "npm:is-wsl@2.2.0": [ - { - "source": "npm:is-wsl@2.2.0", - "target": "npm:is-docker@2.2.1", - "type": "static" - } - ], - "npm:is-wsl@3.1.0": [ - { - "source": "npm:is-wsl@3.1.0", - "target": "npm:is-inside-container", - "type": "static" - } - ], - "npm:is64bit": [ - { - "source": "npm:is64bit", - "target": "npm:system-architecture", - "type": "static" - } - ], - "npm:jackspeak": [ - { - "source": "npm:jackspeak", - "target": "npm:@isaacs/cliui", - "type": "static" - }, - { - "source": "npm:jackspeak", - "target": "npm:@pkgjs/parseargs", - "type": "static" - } - ], - "npm:jest-diff": [ - { - "source": "npm:jest-diff", - "target": "npm:@jest/diff-sequences", - "type": "static" - }, - { - "source": "npm:jest-diff", - "target": "npm:@jest/get-type", - "type": "static" - }, - { - "source": "npm:jest-diff", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:jest-diff", - "target": "npm:pretty-format@30.2.0", - "type": "static" - } - ], - "npm:js-yaml@3.14.1": [ - { - "source": "npm:js-yaml@3.14.1", - "target": "npm:argparse@1.0.10", - "type": "static" - }, - { - "source": "npm:js-yaml@3.14.1", - "target": "npm:esprima", - "type": "static" - } - ], - "npm:js-yaml@4.1.1": [ - { - "source": "npm:js-yaml@4.1.1", - "target": "npm:argparse@2.0.1", - "type": "static" - } - ], - "npm:jsdom": [ - { - "source": "npm:jsdom", - "target": "npm:@acemir/cssom", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:@asamuzakjp/dom-selector", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:cssstyle", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:data-urls", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:decimal.js", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:html-encoding-sniffer", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:http-proxy-agent", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:https-proxy-agent", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:is-potential-custom-element-name", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:parse5@8.0.0", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:saxes", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:symbol-tree", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:tough-cookie", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:w3c-xmlserializer", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:webidl-conversions@8.0.0", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:whatwg-encoding", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:whatwg-mimetype@4.0.0", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:whatwg-url@15.1.0", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:ws", - "type": "static" - }, - { - "source": "npm:jsdom", - "target": "npm:xml-name-validator", - "type": "static" - } - ], - "npm:json-bigint": [ - { - "source": "npm:json-bigint", - "target": "npm:bignumber.js", - "type": "static" - } - ], - "npm:json-schema-to-ts": [ - { - "source": "npm:json-schema-to-ts", - "target": "npm:@babel/runtime", - "type": "static" - }, - { - "source": "npm:json-schema-to-ts", - "target": "npm:ts-algebra", - "type": "static" - } - ], - "npm:jsonfile@4.0.0": [ - { - "source": "npm:jsonfile@4.0.0", - "target": "npm:graceful-fs", - "type": "static" - } - ], - "npm:jsonfile@6.2.0": [ - { - "source": "npm:jsonfile@6.2.0", - "target": "npm:universalify@2.0.1", - "type": "static" - }, - { - "source": "npm:jsonfile@6.2.0", - "target": "npm:graceful-fs", - "type": "static" - } - ], - "npm:jwa": [ - { - "source": "npm:jwa", - "target": "npm:buffer-equal-constant-time", - "type": "static" - }, - { - "source": "npm:jwa", - "target": "npm:ecdsa-sig-formatter", - "type": "static" - }, - { - "source": "npm:jwa", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - } - ], - "npm:jws": [ - { - "source": "npm:jws", - "target": "npm:jwa", - "type": "static" - }, - { - "source": "npm:jws", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - } - ], - "npm:keyv": [ - { - "source": "npm:keyv", - "target": "npm:json-buffer", - "type": "static" - } - ], - "npm:knip": [ - { - "source": "npm:knip", - "target": "npm:@nodelib/fs.walk", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:fast-glob", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:formatly", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:js-yaml@4.1.1", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:minimist", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:oxc-resolver", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:smol-toml", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:strip-json-comments@5.0.3", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:knip", - "target": "npm:zod@4.1.13", - "type": "static" - } - ], - "npm:lazystream": [ - { - "source": "npm:lazystream", - "target": "npm:readable-stream@2.3.8", - "type": "static" - } - ], - "npm:levn": [ - { - "source": "npm:levn", - "target": "npm:prelude-ls", - "type": "static" - }, - { - "source": "npm:levn", - "target": "npm:type-check", - "type": "static" - } - ], - "npm:lightningcss": [ - { - "source": "npm:lightningcss", - "target": "npm:detect-libc@2.1.2", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-android-arm64", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-darwin-arm64", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-darwin-x64", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-freebsd-x64", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:lightningcss", - "target": "npm:lightningcss-win32-x64-msvc", - "type": "static" - } - ], - "npm:linkify-it": [ - { - "source": "npm:linkify-it", - "target": "npm:uc.micro", - "type": "static" - } - ], - "npm:listhen": [ - { - "source": "npm:listhen", - "target": "npm:@parcel/watcher", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:@parcel/watcher-wasm", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:clipboardy", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:crossws", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:get-port-please", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:h3@1.15.4", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:http-shutdown", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:node-forge", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:pathe@1.1.2", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:std-env", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:untun", - "type": "static" - }, - { - "source": "npm:listhen", - "target": "npm:uqr", - "type": "static" - } - ], - "npm:local-pkg@0.5.1": [ - { - "source": "npm:local-pkg@0.5.1", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:local-pkg@0.5.1", - "target": "npm:pkg-types@1.3.1", - "type": "static" - } - ], - "npm:local-pkg@1.1.2": [ - { - "source": "npm:local-pkg@1.1.2", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:local-pkg@1.1.2", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:local-pkg@1.1.2", - "target": "npm:quansync", - "type": "static" - } - ], - "npm:locate-path@5.0.0": [ - { - "source": "npm:locate-path@5.0.0", - "target": "npm:p-locate@4.1.0", - "type": "static" - } - ], - "npm:locate-path@6.0.0": [ - { - "source": "npm:locate-path@6.0.0", - "target": "npm:p-locate@5.0.0", - "type": "static" - } - ], - "npm:log-symbols": [ - { - "source": "npm:log-symbols", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:log-symbols", - "target": "npm:is-unicode-supported", - "type": "static" - } - ], - "npm:lowlight": [ - { - "source": "npm:lowlight", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:lowlight", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:lowlight", - "target": "npm:highlight.js", - "type": "static" - } - ], - "npm:lru-cache@5.1.1": [ - { - "source": "npm:lru-cache@5.1.1", - "target": "npm:yallist@3.1.1", - "type": "static" - } - ], - "npm:lru-cache@6.0.0": [ - { - "source": "npm:lru-cache@6.0.0", - "target": "npm:yallist@4.0.0", - "type": "static" - } - ], - "npm:lucide-react": [ - { - "source": "npm:lucide-react", - "target": "npm:react", - "type": "static" - } - ], - "npm:magic-string": [ - { - "source": "npm:magic-string", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - } - ], - "npm:magicast": [ - { - "source": "npm:magicast", - "target": "npm:@babel/parser@7.28.5", - "type": "static" - }, - { - "source": "npm:magicast", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:magicast", - "target": "npm:source-map-js", - "type": "static" - } - ], - "npm:markdown-it": [ - { - "source": "npm:markdown-it", - "target": "npm:argparse@2.0.1", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:entities@4.5.0", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:linkify-it", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:mdurl", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:punycode.js", - "type": "static" - }, - { - "source": "npm:markdown-it", - "target": "npm:uc.micro", - "type": "static" - } - ], - "npm:markdown-link-extractor": [ - { - "source": "npm:markdown-link-extractor", - "target": "npm:html-link-extractor", - "type": "static" - }, - { - "source": "npm:markdown-link-extractor", - "target": "npm:marked", - "type": "static" - } - ], - "npm:mdast-util-find-and-replace": [ - { - "source": "npm:mdast-util-find-and-replace", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-find-and-replace", - "target": "npm:escape-string-regexp@5.0.0", - "type": "static" - }, - { - "source": "npm:mdast-util-find-and-replace", - "target": "npm:unist-util-is", - "type": "static" - }, - { - "source": "npm:mdast-util-find-and-replace", - "target": "npm:unist-util-visit-parents", - "type": "static" - } - ], - "npm:mdast-util-from-markdown": [ - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:mdast-util-to-string", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-decode-numeric-character-reference", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-decode-string", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:mdast-util-from-markdown", - "target": "npm:unist-util-stringify-position", - "type": "static" - } - ], - "npm:mdast-util-gfm-autolink-literal": [ - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:ccount", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:mdast-util-find-and-replace", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-autolink-literal", - "target": "npm:micromark-util-character", - "type": "static" - } - ], - "npm:mdast-util-gfm-footnote": [ - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-footnote", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - } - ], - "npm:mdast-util-gfm-strikethrough": [ - { - "source": "npm:mdast-util-gfm-strikethrough", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-strikethrough", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-strikethrough", - "target": "npm:mdast-util-to-markdown", - "type": "static" - } - ], - "npm:mdast-util-gfm-table": [ - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:markdown-table", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-table", - "target": "npm:mdast-util-to-markdown", - "type": "static" - } - ], - "npm:mdast-util-gfm-task-list-item": [ - { - "source": "npm:mdast-util-gfm-task-list-item", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-task-list-item", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-task-list-item", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm-task-list-item", - "target": "npm:mdast-util-to-markdown", - "type": "static" - } - ], - "npm:mdast-util-gfm": [ - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-autolink-literal", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-footnote", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-strikethrough", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-table", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-gfm-task-list-item", - "type": "static" - }, - { - "source": "npm:mdast-util-gfm", - "target": "npm:mdast-util-to-markdown", - "type": "static" - } - ], - "npm:mdast-util-mdx-expression": [ - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:@types/estree-jsx", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-expression", - "target": "npm:mdast-util-to-markdown", - "type": "static" - } - ], - "npm:mdast-util-mdx-jsx": [ - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:@types/estree-jsx", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:ccount", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:parse-entities", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:stringify-entities", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:unist-util-stringify-position", - "type": "static" - }, - { - "source": "npm:mdast-util-mdx-jsx", - "target": "npm:vfile-message", - "type": "static" - } - ], - "npm:mdast-util-mdxjs-esm": [ - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:@types/estree-jsx", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:mdast-util-mdxjs-esm", - "target": "npm:mdast-util-to-markdown", - "type": "static" - } - ], - "npm:mdast-util-phrasing": [ - { - "source": "npm:mdast-util-phrasing", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-phrasing", - "target": "npm:unist-util-is", - "type": "static" - } - ], - "npm:mdast-util-to-hast": [ - { - "source": "npm:mdast-util-to-hast", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:@ungap/structured-clone", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:micromark-util-sanitize-uri", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:trim-lines", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:unist-util-position", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:mdast-util-to-hast", - "target": "npm:vfile", - "type": "static" - } - ], - "npm:mdast-util-to-markdown": [ - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:longest-streak", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:mdast-util-phrasing", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:mdast-util-to-string", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:micromark-util-classify-character", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:micromark-util-decode-string", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:mdast-util-to-markdown", - "target": "npm:zwitch", - "type": "static" - } - ], - "npm:mdast-util-to-string": [ - { - "source": "npm:mdast-util-to-string", - "target": "npm:@types/mdast", - "type": "static" - } - ], - "npm:merge-anything": [ - { - "source": "npm:merge-anything", - "target": "npm:is-what", - "type": "static" - } - ], - "npm:micromark-core-commonmark": [ - { - "source": "npm:micromark-core-commonmark", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-destination", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-label", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-title", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-factory-whitespace", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-classify-character", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-html-tag-name", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-resolve-all", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-subtokenize", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-core-commonmark", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-extension-gfm-autolink-literal": [ - { - "source": "npm:micromark-extension-gfm-autolink-literal", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-autolink-literal", - "target": "npm:micromark-util-sanitize-uri", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-autolink-literal", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-autolink-literal", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-extension-gfm-footnote": [ - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-core-commonmark", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-sanitize-uri", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-footnote", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-extension-gfm-strikethrough": [ - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-classify-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-resolve-all", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-strikethrough", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-extension-gfm-table": [ - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-table", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-extension-gfm-tagfilter": [ - { - "source": "npm:micromark-extension-gfm-tagfilter", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-extension-gfm-task-list-item": [ - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm-task-list-item", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-extension-gfm": [ - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-autolink-literal", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-footnote", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-strikethrough", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-table", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-tagfilter", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-extension-gfm-task-list-item", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-util-combine-extensions", - "type": "static" - }, - { - "source": "npm:micromark-extension-gfm", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-factory-destination": [ - { - "source": "npm:micromark-factory-destination", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-destination", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-factory-destination", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-factory-label": [ - { - "source": "npm:micromark-factory-label", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-factory-label", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-label", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-factory-label", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-factory-space": [ - { - "source": "npm:micromark-factory-space", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-space", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-factory-title": [ - { - "source": "npm:micromark-factory-title", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-factory-title", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-title", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-factory-title", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-factory-whitespace": [ - { - "source": "npm:micromark-factory-whitespace", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark-factory-whitespace", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-factory-whitespace", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-factory-whitespace", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-util-character": [ - { - "source": "npm:micromark-util-character", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-character", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-util-chunked": [ - { - "source": "npm:micromark-util-chunked", - "target": "npm:micromark-util-symbol", - "type": "static" - } - ], - "npm:micromark-util-classify-character": [ - { - "source": "npm:micromark-util-classify-character", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-util-classify-character", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-classify-character", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-util-combine-extensions": [ - { - "source": "npm:micromark-util-combine-extensions", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark-util-combine-extensions", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-util-decode-numeric-character-reference": [ - { - "source": "npm:micromark-util-decode-numeric-character-reference", - "target": "npm:micromark-util-symbol", - "type": "static" - } - ], - "npm:micromark-util-decode-string": [ - { - "source": "npm:micromark-util-decode-string", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:micromark-util-decode-string", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-util-decode-string", - "target": "npm:micromark-util-decode-numeric-character-reference", - "type": "static" - }, - { - "source": "npm:micromark-util-decode-string", - "target": "npm:micromark-util-symbol", - "type": "static" - } - ], - "npm:micromark-util-normalize-identifier": [ - { - "source": "npm:micromark-util-normalize-identifier", - "target": "npm:micromark-util-symbol", - "type": "static" - } - ], - "npm:micromark-util-resolve-all": [ - { - "source": "npm:micromark-util-resolve-all", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark-util-sanitize-uri": [ - { - "source": "npm:micromark-util-sanitize-uri", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark-util-sanitize-uri", - "target": "npm:micromark-util-encode", - "type": "static" - }, - { - "source": "npm:micromark-util-sanitize-uri", - "target": "npm:micromark-util-symbol", - "type": "static" - } - ], - "npm:micromark-util-subtokenize": [ - { - "source": "npm:micromark-util-subtokenize", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark-util-subtokenize", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark-util-subtokenize", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark-util-subtokenize", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromark": [ - { - "source": "npm:micromark", - "target": "npm:@types/debug", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-core-commonmark", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-factory-space", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-character", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-chunked", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-combine-extensions", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-decode-numeric-character-reference", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-encode", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-normalize-identifier", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-resolve-all", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-sanitize-uri", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-subtokenize", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-symbol", - "type": "static" - }, - { - "source": "npm:micromark", - "target": "npm:micromark-util-types", - "type": "static" - } - ], - "npm:micromatch": [ - { - "source": "npm:micromatch", - "target": "npm:braces", - "type": "static" - }, - { - "source": "npm:micromatch", - "target": "npm:picomatch@2.3.1", - "type": "static" - } - ], - "npm:mime-types@2.1.35": [ - { - "source": "npm:mime-types@2.1.35", - "target": "npm:mime-db@1.52.0", - "type": "static" - } - ], - "npm:mime-types@3.0.1": [ - { - "source": "npm:mime-types@3.0.1", - "target": "npm:mime-db@1.54.0", - "type": "static" - } - ], - "npm:minimatch@3.0.8": [ - { - "source": "npm:minimatch@3.0.8", - "target": "npm:brace-expansion@1.1.12", - "type": "static" - } - ], - "npm:minimatch@3.1.2": [ - { - "source": "npm:minimatch@3.1.2", - "target": "npm:brace-expansion@1.1.12", - "type": "static" - } - ], - "npm:minimatch@5.1.6": [ - { - "source": "npm:minimatch@5.1.6", - "target": "npm:brace-expansion@2.0.2", - "type": "static" - } - ], - "npm:minimatch@9.0.3": [ - { - "source": "npm:minimatch@9.0.3", - "target": "npm:brace-expansion@2.0.2", - "type": "static" - } - ], - "npm:minimatch@9.0.5": [ - { - "source": "npm:minimatch@9.0.5", - "target": "npm:brace-expansion@2.0.2", - "type": "static" - } - ], - "npm:minizlib": [ - { - "source": "npm:minizlib", - "target": "npm:minipass", - "type": "static" - } - ], - "npm:mlly": [ - { - "source": "npm:mlly", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:mlly", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:mlly", - "target": "npm:pkg-types@1.3.1", - "type": "static" - }, - { - "source": "npm:mlly", - "target": "npm:ufo", - "type": "static" - } - ], - "npm:nanospinner": [ - { - "source": "npm:nanospinner", - "target": "npm:picocolors", - "type": "static" - } - ], - "npm:nitropack": [ - { - "source": "npm:nitropack", - "target": "npm:@cloudflare/kv-asset-handler", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-alias", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-commonjs", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-inject", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-json", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-node-resolve", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-replace", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@rollup/plugin-terser", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:@vercel/nft", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:archiver", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:c12", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:chokidar@4.0.3", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:compatx", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:confbox@0.2.2", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:cookie-es@2.0.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:croner", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:crossws", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:db0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:dot-prop@10.1.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:esbuild", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:escape-string-regexp@5.0.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:etag", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:exsolve", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:globby@15.0.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:gzip-size", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:h3@1.15.4", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:hookable", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:httpxy", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ioredis", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:klona", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:knitwork", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:listhen", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:magicast", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:mime@4.1.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:node-fetch-native", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:node-mock-http", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ofetch", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ohash", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:perfect-debounce", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:pretty-bytes", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:radix3", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:rollup-plugin-visualizer", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:scule", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:serve-placeholder", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:serve-static", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:source-map@0.7.6", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:std-env", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:ultrahtml", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:uncrypto", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unctx", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unenv", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unimport", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unplugin-utils", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unstorage", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:untyped", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:unwasm", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:youch", - "type": "static" - }, - { - "source": "npm:nitropack", - "target": "npm:youch-core", - "type": "static" - } - ], - "npm:node-fetch@2.7.0": [ - { - "source": "npm:node-fetch@2.7.0", - "target": "npm:whatwg-url@5.0.0", - "type": "static" - } - ], - "npm:node-fetch@3.3.2": [ - { - "source": "npm:node-fetch@3.3.2", - "target": "npm:data-uri-to-buffer", - "type": "static" - }, - { - "source": "npm:node-fetch@3.3.2", - "target": "npm:fetch-blob", - "type": "static" - }, - { - "source": "npm:node-fetch@3.3.2", - "target": "npm:formdata-polyfill", - "type": "static" - } - ], - "npm:nopt": [ - { - "source": "npm:nopt", - "target": "npm:abbrev", - "type": "static" - } - ], - "npm:npm-run-path@4.0.1": [ - { - "source": "npm:npm-run-path@4.0.1", - "target": "npm:path-key@3.1.1", - "type": "static" - } - ], - "npm:npm-run-path@5.3.0": [ - { - "source": "npm:npm-run-path@5.3.0", - "target": "npm:path-key@4.0.0", - "type": "static" - } - ], - "npm:nth-check": [ - { - "source": "npm:nth-check", - "target": "npm:boolbase", - "type": "static" - } - ], - "npm:nx": [ - { - "source": "npm:nx", - "target": "npm:@napi-rs/wasm-runtime@0.2.4", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@yarnpkg/lockfile", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@yarnpkg/parsers", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@zkochan/js-yaml", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:axios", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:cli-cursor", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:cli-spinners", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:cliui", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:dotenv@16.4.7", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:dotenv-expand", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:enquirer@2.3.6", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:figures", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:flat", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:front-matter", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:ignore@7.0.5", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:jest-diff", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:jsonc-parser", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:lines-and-columns", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:minimatch@9.0.3", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:node-machine-id", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:npm-run-path@4.0.1", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:open", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:ora", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:resolve.exports", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:semver@7.7.3", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tar-stream@2.2.0", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tmp", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tree-kill", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tsconfig-paths", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:tslib", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:yaml", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:yargs", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:yargs-parser", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-darwin-arm64", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-darwin-x64", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-freebsd-x64", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:nx", - "target": "npm:@nx/nx-win32-x64-msvc", - "type": "static" - } - ], - "npm:nypm": [ - { - "source": "npm:nypm", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:nypm", - "target": "npm:tinyexec@1.0.1", - "type": "static" - } - ], - "npm:ofetch": [ - { - "source": "npm:ofetch", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:ofetch", - "target": "npm:node-fetch-native", - "type": "static" - }, - { - "source": "npm:ofetch", - "target": "npm:ufo", - "type": "static" - } - ], - "npm:ollama": [ - { - "source": "npm:ollama", - "target": "npm:whatwg-fetch", - "type": "static" - } - ], - "npm:on-finished": [ - { - "source": "npm:on-finished", - "target": "npm:ee-first", - "type": "static" - } - ], - "npm:once": [ - { - "source": "npm:once", - "target": "npm:wrappy", - "type": "static" - } - ], - "npm:onetime@5.1.2": [ - { - "source": "npm:onetime@5.1.2", - "target": "npm:mimic-fn@2.1.0", - "type": "static" - } - ], - "npm:onetime@6.0.0": [ - { - "source": "npm:onetime@6.0.0", - "target": "npm:mimic-fn@4.0.0", - "type": "static" - } - ], - "npm:open": [ - { - "source": "npm:open", - "target": "npm:define-lazy-prop", - "type": "static" - }, - { - "source": "npm:open", - "target": "npm:is-docker@2.2.1", - "type": "static" - }, - { - "source": "npm:open", - "target": "npm:is-wsl@2.2.0", - "type": "static" - } - ], - "npm:openai": [ - { - "source": "npm:openai", - "target": "npm:ws", - "type": "static" - }, - { - "source": "npm:openai", - "target": "npm:zod@4.1.13", - "type": "static" - } - ], - "npm:optionator": [ - { - "source": "npm:optionator", - "target": "npm:deep-is", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:fast-levenshtein", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:levn", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:prelude-ls", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:type-check", - "type": "static" - }, - { - "source": "npm:optionator", - "target": "npm:word-wrap", - "type": "static" - } - ], - "npm:ora": [ - { - "source": "npm:ora", - "target": "npm:bl", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:chalk@4.1.2", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:cli-cursor", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:cli-spinners", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:is-interactive", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:log-symbols", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - }, - { - "source": "npm:ora", - "target": "npm:wcwidth", - "type": "static" - } - ], - "npm:oxc-resolver": [ - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-android-arm-eabi", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-android-arm64", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-darwin-arm64", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-darwin-x64", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-freebsd-x64", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-arm-musleabihf", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-ppc64-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-riscv64-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-riscv64-musl", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-s390x-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-wasm32-wasi", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-win32-ia32-msvc", - "type": "static" - }, - { - "source": "npm:oxc-resolver", - "target": "npm:@oxc-resolver/binding-win32-x64-msvc", - "type": "static" - } - ], - "npm:p-filter": [ - { - "source": "npm:p-filter", - "target": "npm:p-map", - "type": "static" - } - ], - "npm:p-limit@2.3.0": [ - { - "source": "npm:p-limit@2.3.0", - "target": "npm:p-try", - "type": "static" - } - ], - "npm:p-limit@3.1.0": [ - { - "source": "npm:p-limit@3.1.0", - "target": "npm:yocto-queue", - "type": "static" - } - ], - "npm:p-locate@4.1.0": [ - { - "source": "npm:p-locate@4.1.0", - "target": "npm:p-limit@2.3.0", - "type": "static" - } - ], - "npm:p-locate@5.0.0": [ - { - "source": "npm:p-locate@5.0.0", - "target": "npm:p-limit@3.1.0", - "type": "static" - } - ], - "npm:package-manager-detector@0.2.11": [ - { - "source": "npm:package-manager-detector@0.2.11", - "target": "npm:quansync", - "type": "static" - } - ], - "npm:parent-module": [ - { - "source": "npm:parent-module", - "target": "npm:callsites", - "type": "static" - } - ], - "npm:parse-entities": [ - { - "source": "npm:parse-entities", - "target": "npm:@types/unist@2.0.11", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:character-entities-legacy", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:character-reference-invalid", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:decode-named-character-reference", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:is-alphanumerical", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:is-decimal", - "type": "static" - }, - { - "source": "npm:parse-entities", - "target": "npm:is-hexadecimal", - "type": "static" - } - ], - "npm:parse5-htmlparser2-tree-adapter": [ - { - "source": "npm:parse5-htmlparser2-tree-adapter", - "target": "npm:domhandler", - "type": "static" - }, - { - "source": "npm:parse5-htmlparser2-tree-adapter", - "target": "npm:parse5@7.3.0", - "type": "static" - } - ], - "npm:parse5-parser-stream": [ - { - "source": "npm:parse5-parser-stream", - "target": "npm:parse5@7.3.0", - "type": "static" - } - ], - "npm:parse5@7.3.0": [ - { - "source": "npm:parse5@7.3.0", - "target": "npm:entities@6.0.1", - "type": "static" - } - ], - "npm:parse5@8.0.0": [ - { - "source": "npm:parse5@8.0.0", - "target": "npm:entities@6.0.1", - "type": "static" - } - ], - "npm:path-scurry": [ - { - "source": "npm:path-scurry", - "target": "npm:lru-cache@10.4.3", - "type": "static" - }, - { - "source": "npm:path-scurry", - "target": "npm:minipass", - "type": "static" - } - ], - "npm:pkg-types@1.3.1": [ - { - "source": "npm:pkg-types@1.3.1", - "target": "npm:confbox@0.1.8", - "type": "static" - }, - { - "source": "npm:pkg-types@1.3.1", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:pkg-types@1.3.1", - "target": "npm:pathe@2.0.3", - "type": "static" - } - ], - "npm:pkg-types@2.3.0": [ - { - "source": "npm:pkg-types@2.3.0", - "target": "npm:confbox@0.2.2", - "type": "static" - }, - { - "source": "npm:pkg-types@2.3.0", - "target": "npm:exsolve", - "type": "static" - }, - { - "source": "npm:pkg-types@2.3.0", - "target": "npm:pathe@2.0.3", - "type": "static" - } - ], - "npm:postcss": [ - { - "source": "npm:postcss", - "target": "npm:nanoid@3.3.11", - "type": "static" - }, - { - "source": "npm:postcss", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:postcss", - "target": "npm:source-map-js", - "type": "static" - } - ], - "npm:prettier-plugin-svelte": [ - { - "source": "npm:prettier-plugin-svelte", - "target": "npm:prettier", - "type": "static" - }, - { - "source": "npm:prettier-plugin-svelte", - "target": "npm:svelte", - "type": "static" - } - ], - "npm:pretty-format@27.5.1": [ - { - "source": "npm:pretty-format@27.5.1", - "target": "npm:ansi-regex@5.0.1", - "type": "static" - }, - { - "source": "npm:pretty-format@27.5.1", - "target": "npm:ansi-styles@5.2.0", - "type": "static" - }, - { - "source": "npm:pretty-format@27.5.1", - "target": "npm:react-is@17.0.2", - "type": "static" - } - ], - "npm:pretty-format@30.2.0": [ - { - "source": "npm:pretty-format@30.2.0", - "target": "npm:@jest/schemas", - "type": "static" - }, - { - "source": "npm:pretty-format@30.2.0", - "target": "npm:ansi-styles@5.2.0", - "type": "static" - }, - { - "source": "npm:pretty-format@30.2.0", - "target": "npm:react-is@18.3.1", - "type": "static" - } - ], - "npm:publint": [ - { - "source": "npm:publint", - "target": "npm:@publint/pack", - "type": "static" - }, - { - "source": "npm:publint", - "target": "npm:package-manager-detector@1.5.0", - "type": "static" - }, - { - "source": "npm:publint", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:publint", - "target": "npm:sade", - "type": "static" - } - ], - "npm:randombytes": [ - { - "source": "npm:randombytes", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - } - ], - "npm:rc9": [ - { - "source": "npm:rc9", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:rc9", - "target": "npm:destr", - "type": "static" - } - ], - "npm:react-dom": [ - { - "source": "npm:react-dom", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:react-dom", - "target": "npm:scheduler", - "type": "static" - } - ], - "npm:react-markdown": [ - { - "source": "npm:react-markdown", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:@types/react", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:hast-util-to-jsx-runtime", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:html-url-attributes", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:mdast-util-to-hast", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:react", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:remark-parse", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:remark-rehype", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:unified", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:react-markdown", - "target": "npm:vfile", - "type": "static" - } - ], - "npm:read-yaml-file": [ - { - "source": "npm:read-yaml-file", - "target": "npm:graceful-fs", - "type": "static" - }, - { - "source": "npm:read-yaml-file", - "target": "npm:js-yaml@3.14.1", - "type": "static" - }, - { - "source": "npm:read-yaml-file", - "target": "npm:pify", - "type": "static" - }, - { - "source": "npm:read-yaml-file", - "target": "npm:strip-bom", - "type": "static" - } - ], - "npm:readable-stream@2.3.8": [ - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:core-util-is", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:isarray", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:process-nextick-args", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:safe-buffer@5.1.2", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:string_decoder@1.1.1", - "type": "static" - }, - { - "source": "npm:readable-stream@2.3.8", - "target": "npm:util-deprecate", - "type": "static" - } - ], - "npm:readable-stream@3.6.2": [ - { - "source": "npm:readable-stream@3.6.2", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:readable-stream@3.6.2", - "target": "npm:string_decoder@1.3.0", - "type": "static" - }, - { - "source": "npm:readable-stream@3.6.2", - "target": "npm:util-deprecate", - "type": "static" - } - ], - "npm:readable-stream@4.7.0": [ - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:abort-controller", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:buffer@6.0.3", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:events", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:process", - "type": "static" - }, - { - "source": "npm:readable-stream@4.7.0", - "target": "npm:string_decoder@1.3.0", - "type": "static" - } - ], - "npm:readdir-glob": [ - { - "source": "npm:readdir-glob", - "target": "npm:minimatch@5.1.6", - "type": "static" - } - ], - "npm:readdirp@3.6.0": [ - { - "source": "npm:readdirp@3.6.0", - "target": "npm:picomatch@2.3.1", - "type": "static" - } - ], - "npm:recast": [ - { - "source": "npm:recast", - "target": "npm:ast-types", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:esprima", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:source-map@0.6.1", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:tiny-invariant", - "type": "static" - }, - { - "source": "npm:recast", - "target": "npm:tslib", - "type": "static" - } - ], - "npm:redent": [ - { - "source": "npm:redent", - "target": "npm:indent-string", - "type": "static" - }, - { - "source": "npm:redent", - "target": "npm:strip-indent", - "type": "static" - } - ], - "npm:redis-parser": [ - { - "source": "npm:redis-parser", - "target": "npm:redis-errors", - "type": "static" - } - ], - "npm:rehype-highlight": [ - { - "source": "npm:rehype-highlight", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:hast-util-to-text", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:lowlight", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:unist-util-visit", - "type": "static" - }, - { - "source": "npm:rehype-highlight", - "target": "npm:vfile", - "type": "static" - } - ], - "npm:rehype-raw": [ - { - "source": "npm:rehype-raw", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:rehype-raw", - "target": "npm:hast-util-raw", - "type": "static" - }, - { - "source": "npm:rehype-raw", - "target": "npm:vfile", - "type": "static" - } - ], - "npm:rehype-sanitize": [ - { - "source": "npm:rehype-sanitize", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:rehype-sanitize", - "target": "npm:hast-util-sanitize", - "type": "static" - } - ], - "npm:remark-gfm": [ - { - "source": "npm:remark-gfm", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:mdast-util-gfm", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:micromark-extension-gfm", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:remark-parse", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:remark-stringify", - "type": "static" - }, - { - "source": "npm:remark-gfm", - "target": "npm:unified", - "type": "static" - } - ], - "npm:remark-parse": [ - { - "source": "npm:remark-parse", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:remark-parse", - "target": "npm:mdast-util-from-markdown", - "type": "static" - }, - { - "source": "npm:remark-parse", - "target": "npm:micromark-util-types", - "type": "static" - }, - { - "source": "npm:remark-parse", - "target": "npm:unified", - "type": "static" - } - ], - "npm:remark-rehype": [ - { - "source": "npm:remark-rehype", - "target": "npm:@types/hast", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:mdast-util-to-hast", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:unified", - "type": "static" - }, - { - "source": "npm:remark-rehype", - "target": "npm:vfile", - "type": "static" - } - ], - "npm:remark-stringify": [ - { - "source": "npm:remark-stringify", - "target": "npm:@types/mdast", - "type": "static" - }, - { - "source": "npm:remark-stringify", - "target": "npm:mdast-util-to-markdown", - "type": "static" - }, - { - "source": "npm:remark-stringify", - "target": "npm:unified", - "type": "static" - } - ], - "npm:resolve": [ - { - "source": "npm:resolve", - "target": "npm:is-core-module", - "type": "static" - }, - { - "source": "npm:resolve", - "target": "npm:path-parse", - "type": "static" - }, - { - "source": "npm:resolve", - "target": "npm:supports-preserve-symlinks-flag", - "type": "static" - } - ], - "npm:restore-cursor": [ - { - "source": "npm:restore-cursor", - "target": "npm:onetime@5.1.2", - "type": "static" - }, - { - "source": "npm:restore-cursor", - "target": "npm:signal-exit@3.0.7", - "type": "static" - } - ], - "npm:rimraf": [ - { - "source": "npm:rimraf", - "target": "npm:glob", - "type": "static" - } - ], - "npm:rolldown": [ - { - "source": "npm:rolldown", - "target": "npm:@oxc-project/types", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/pluginutils@1.0.0-beta.51", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-android-arm64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-darwin-arm64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-darwin-x64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-freebsd-x64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-openharmony-arm64", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-wasm32-wasi", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-win32-ia32-msvc", - "type": "static" - }, - { - "source": "npm:rolldown", - "target": "npm:@rolldown/binding-win32-x64-msvc", - "type": "static" - } - ], - "npm:rollup-plugin-preserve-directives": [ - { - "source": "npm:rollup-plugin-preserve-directives", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:rollup-plugin-preserve-directives", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:rollup-plugin-preserve-directives", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:rollup-plugin-visualizer": [ - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:open", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:source-map@0.7.6", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:yargs", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:rolldown", - "type": "static" - }, - { - "source": "npm:rollup-plugin-visualizer", - "target": "npm:rollup", - "type": "static" - } - ], - "npm:rollup": [ - { - "source": "npm:rollup", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-android-arm-eabi", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-android-arm64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-darwin-arm64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-darwin-x64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-freebsd-arm64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-freebsd-x64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-arm-musleabihf", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-loong64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-ppc64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-riscv64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-riscv64-musl", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-s390x-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-openharmony-arm64", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-win32-ia32-msvc", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-win32-x64-gnu", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:@rollup/rollup-win32-x64-msvc", - "type": "static" - }, - { - "source": "npm:rollup", - "target": "npm:fsevents", - "type": "static" - } - ], - "npm:run-parallel": [ - { - "source": "npm:run-parallel", - "target": "npm:queue-microtask", - "type": "static" - } - ], - "npm:sade": [ - { - "source": "npm:sade", - "target": "npm:mri", - "type": "static" - } - ], - "npm:saxes": [ - { - "source": "npm:saxes", - "target": "npm:xmlchars", - "type": "static" - } - ], - "npm:semver@7.5.4": [ - { - "source": "npm:semver@7.5.4", - "target": "npm:lru-cache@6.0.0", - "type": "static" - } - ], - "npm:send": [ - { - "source": "npm:send", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:encodeurl", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:escape-html", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:etag", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:fresh", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:http-errors", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:mime-types@3.0.1", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:ms", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:on-finished", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:range-parser", - "type": "static" - }, - { - "source": "npm:send", - "target": "npm:statuses@2.0.2", - "type": "static" - } - ], - "npm:serialize-javascript": [ - { - "source": "npm:serialize-javascript", - "target": "npm:randombytes", - "type": "static" - } - ], - "npm:seroval-plugins@1.3.3": [ - { - "source": "npm:seroval-plugins@1.3.3", - "target": "npm:seroval@1.3.2", - "type": "static" - } - ], - "npm:seroval-plugins@1.4.0": [ - { - "source": "npm:seroval-plugins@1.4.0", - "target": "npm:seroval@1.4.0", - "type": "static" - } - ], - "npm:serve-placeholder": [ - { - "source": "npm:serve-placeholder", - "target": "npm:defu", - "type": "static" - } - ], - "npm:serve-static": [ - { - "source": "npm:serve-static", - "target": "npm:encodeurl", - "type": "static" - }, - { - "source": "npm:serve-static", - "target": "npm:escape-html", - "type": "static" - }, - { - "source": "npm:serve-static", - "target": "npm:parseurl", - "type": "static" - }, - { - "source": "npm:serve-static", - "target": "npm:send", - "type": "static" - } - ], - "npm:shebang-command": [ - { - "source": "npm:shebang-command", - "target": "npm:shebang-regex", - "type": "static" - } - ], - "npm:sherif": [ - { - "source": "npm:sherif", - "target": "npm:sherif-darwin-arm64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-darwin-x64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-linux-arm64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-linux-x64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-windows-arm64", - "type": "static" - }, - { - "source": "npm:sherif", - "target": "npm:sherif-windows-x64", - "type": "static" - } - ], - "npm:simple-git": [ - { - "source": "npm:simple-git", - "target": "npm:@kwsites/file-exists", - "type": "static" - }, - { - "source": "npm:simple-git", - "target": "npm:@kwsites/promise-deferred", - "type": "static" - }, - { - "source": "npm:simple-git", - "target": "npm:debug", - "type": "static" - } - ], - "npm:size-limit": [ - { - "source": "npm:size-limit", - "target": "npm:bytes-iec", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:chokidar@4.0.3", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:lilconfig", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:nanospinner", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:picocolors", - "type": "static" - }, - { - "source": "npm:size-limit", - "target": "npm:tinyglobby", - "type": "static" - } - ], - "npm:solid-js": [ - { - "source": "npm:solid-js", - "target": "npm:csstype@3.1.3", - "type": "static" - }, - { - "source": "npm:solid-js", - "target": "npm:seroval@1.3.2", - "type": "static" - }, - { - "source": "npm:solid-js", - "target": "npm:seroval-plugins@1.3.3", - "type": "static" - } - ], - "npm:solid-refresh": [ - { - "source": "npm:solid-refresh", - "target": "npm:@babel/generator", - "type": "static" - }, - { - "source": "npm:solid-refresh", - "target": "npm:@babel/helper-module-imports@7.27.1", - "type": "static" - }, - { - "source": "npm:solid-refresh", - "target": "npm:@babel/types@7.28.5", - "type": "static" - }, - { - "source": "npm:solid-refresh", - "target": "npm:solid-js", - "type": "static" - } - ], - "npm:source-map-support": [ - { - "source": "npm:source-map-support", - "target": "npm:buffer-from", - "type": "static" - }, - { - "source": "npm:source-map-support", - "target": "npm:source-map@0.6.1", - "type": "static" - } - ], - "npm:spawndamnit": [ - { - "source": "npm:spawndamnit", - "target": "npm:cross-spawn", - "type": "static" - }, - { - "source": "npm:spawndamnit", - "target": "npm:signal-exit@4.1.0", - "type": "static" - } - ], - "npm:streamx": [ - { - "source": "npm:streamx", - "target": "npm:events-universal", - "type": "static" - }, - { - "source": "npm:streamx", - "target": "npm:fast-fifo", - "type": "static" - }, - { - "source": "npm:streamx", - "target": "npm:text-decoder", - "type": "static" - } - ], - "npm:string-width@4.2.3": [ - { - "source": "npm:string-width@4.2.3", - "target": "npm:emoji-regex@8.0.0", - "type": "static" - }, - { - "source": "npm:string-width@4.2.3", - "target": "npm:is-fullwidth-code-point", - "type": "static" - }, - { - "source": "npm:string-width@4.2.3", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - } - ], - "npm:string-width-cjs": [ - { - "source": "npm:string-width-cjs", - "target": "npm:emoji-regex@8.0.0", - "type": "static" - }, - { - "source": "npm:string-width-cjs", - "target": "npm:is-fullwidth-code-point", - "type": "static" - }, - { - "source": "npm:string-width-cjs", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - } - ], - "npm:string-width@5.1.2": [ - { - "source": "npm:string-width@5.1.2", - "target": "npm:eastasianwidth", - "type": "static" - }, - { - "source": "npm:string-width@5.1.2", - "target": "npm:emoji-regex@9.2.2", - "type": "static" - }, - { - "source": "npm:string-width@5.1.2", - "target": "npm:strip-ansi@7.1.2", - "type": "static" - } - ], - "npm:string_decoder@1.1.1": [ - { - "source": "npm:string_decoder@1.1.1", - "target": "npm:safe-buffer@5.1.2", - "type": "static" - } - ], - "npm:string_decoder@1.3.0": [ - { - "source": "npm:string_decoder@1.3.0", - "target": "npm:safe-buffer@5.2.1", - "type": "static" - } - ], - "npm:stringify-entities": [ - { - "source": "npm:stringify-entities", - "target": "npm:character-entities-html4", - "type": "static" - }, - { - "source": "npm:stringify-entities", - "target": "npm:character-entities-legacy", - "type": "static" - } - ], - "npm:strip-ansi@6.0.1": [ - { - "source": "npm:strip-ansi@6.0.1", - "target": "npm:ansi-regex@5.0.1", - "type": "static" - } - ], - "npm:strip-ansi-cjs": [ - { - "source": "npm:strip-ansi-cjs", - "target": "npm:ansi-regex@5.0.1", - "type": "static" - } - ], - "npm:strip-ansi@7.1.2": [ - { - "source": "npm:strip-ansi@7.1.2", - "target": "npm:ansi-regex@6.2.2", - "type": "static" - } - ], - "npm:strip-indent": [ - { - "source": "npm:strip-indent", - "target": "npm:min-indent", - "type": "static" - } - ], - "npm:strip-literal": [ - { - "source": "npm:strip-literal", - "target": "npm:js-tokens@9.0.1", - "type": "static" - } - ], - "npm:style-to-js": [ - { - "source": "npm:style-to-js", - "target": "npm:style-to-object", - "type": "static" - } - ], - "npm:style-to-object": [ - { - "source": "npm:style-to-object", - "target": "npm:inline-style-parser", - "type": "static" - } - ], - "npm:supports-color@7.2.0": [ - { - "source": "npm:supports-color@7.2.0", - "target": "npm:has-flag", - "type": "static" - } - ], - "npm:supports-color@8.1.1": [ - { - "source": "npm:supports-color@8.1.1", - "target": "npm:has-flag", - "type": "static" - } - ], - "npm:svelte": [ - { - "source": "npm:svelte", - "target": "npm:@jridgewell/remapping", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:@jridgewell/sourcemap-codec", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:@sveltejs/acorn-typescript", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:@types/estree", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:aria-query@5.3.2", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:axobject-query", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:clsx", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:devalue", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:esm-env", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:esrap", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:is-reference@3.0.3", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:locate-character", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:svelte", - "target": "npm:zimmerframe", - "type": "static" - } - ], - "npm:tar-stream@2.2.0": [ - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:bl", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:end-of-stream", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:fs-constants", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:inherits", - "type": "static" - }, - { - "source": "npm:tar-stream@2.2.0", - "target": "npm:readable-stream@3.6.2", - "type": "static" - } - ], - "npm:tar-stream@3.1.7": [ - { - "source": "npm:tar-stream@3.1.7", - "target": "npm:b4a", - "type": "static" - }, - { - "source": "npm:tar-stream@3.1.7", - "target": "npm:fast-fifo", - "type": "static" - }, - { - "source": "npm:tar-stream@3.1.7", - "target": "npm:streamx", - "type": "static" - } - ], - "npm:tar": [ - { - "source": "npm:tar", - "target": "npm:@isaacs/fs-minipass", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:chownr", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:minipass", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:minizlib", - "type": "static" - }, - { - "source": "npm:tar", - "target": "npm:yallist@5.0.0", - "type": "static" - } - ], - "npm:terser": [ - { - "source": "npm:terser", - "target": "npm:@jridgewell/source-map", - "type": "static" - }, - { - "source": "npm:terser", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:terser", - "target": "npm:commander", - "type": "static" - }, - { - "source": "npm:terser", - "target": "npm:source-map-support", - "type": "static" - } - ], - "npm:text-decoder": [ - { - "source": "npm:text-decoder", - "target": "npm:b4a", - "type": "static" - } - ], - "npm:tinyglobby": [ - { - "source": "npm:tinyglobby", - "target": "npm:fdir", - "type": "static" - }, - { - "source": "npm:tinyglobby", - "target": "npm:picomatch@4.0.3", - "type": "static" - } - ], - "npm:tldts": [ - { - "source": "npm:tldts", - "target": "npm:tldts-core", - "type": "static" - } - ], - "npm:to-regex-range": [ - { - "source": "npm:to-regex-range", - "target": "npm:is-number", - "type": "static" - } - ], - "npm:tough-cookie": [ - { - "source": "npm:tough-cookie", - "target": "npm:tldts", - "type": "static" - } - ], - "npm:tr46@6.0.0": [ - { - "source": "npm:tr46@6.0.0", - "target": "npm:punycode", - "type": "static" - } - ], - "npm:ts-api-utils": [ - { - "source": "npm:ts-api-utils", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:ts-declaration-location": [ - { - "source": "npm:ts-declaration-location", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:ts-declaration-location", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:tsconfck": [ - { - "source": "npm:tsconfck", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:tsconfig-paths": [ - { - "source": "npm:tsconfig-paths", - "target": "npm:json5", - "type": "static" - }, - { - "source": "npm:tsconfig-paths", - "target": "npm:minimist", - "type": "static" - }, - { - "source": "npm:tsconfig-paths", - "target": "npm:strip-bom", - "type": "static" - } - ], - "npm:tsx": [ - { - "source": "npm:tsx", - "target": "npm:esbuild", - "type": "static" - }, - { - "source": "npm:tsx", - "target": "npm:get-tsconfig", - "type": "static" - }, - { - "source": "npm:tsx", - "target": "npm:fsevents", - "type": "static" - } - ], - "npm:type-check": [ - { - "source": "npm:type-check", - "target": "npm:prelude-ls", - "type": "static" - } - ], - "npm:type-fest": [ - { - "source": "npm:type-fest", - "target": "npm:tagged-tag", - "type": "static" - } - ], - "npm:typedoc-plugin-frontmatter": [ - { - "source": "npm:typedoc-plugin-frontmatter", - "target": "npm:typedoc-plugin-markdown", - "type": "static" - }, - { - "source": "npm:typedoc-plugin-frontmatter", - "target": "npm:yaml", - "type": "static" - } - ], - "npm:typedoc-plugin-markdown": [ - { - "source": "npm:typedoc-plugin-markdown", - "target": "npm:typedoc", - "type": "static" - } - ], - "npm:typedoc": [ - { - "source": "npm:typedoc", - "target": "npm:@gerrit0/mini-shiki", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:lunr", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:markdown-it", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:minimatch@9.0.5", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:typedoc", - "target": "npm:yaml", - "type": "static" - } - ], - "npm:typescript-eslint": [ - { - "source": "npm:typescript-eslint", - "target": "npm:@typescript-eslint/eslint-plugin", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:@typescript-eslint/parser", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:@typescript-eslint/typescript-estree@8.46.3", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:@typescript-eslint/utils@8.46.3", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:typescript-eslint", - "target": "npm:typescript", - "type": "static" - } - ], - "npm:unctx": [ - { - "source": "npm:unctx", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:unctx", - "target": "npm:estree-walker@3.0.3", - "type": "static" - }, - { - "source": "npm:unctx", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:unctx", - "target": "npm:unplugin", - "type": "static" - } - ], - "npm:unenv": [ - { - "source": "npm:unenv", - "target": "npm:pathe@2.0.3", - "type": "static" - } - ], - "npm:unified": [ - { - "source": "npm:unified", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:bail", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:devlop", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:extend", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:is-plain-obj", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:trough", - "type": "static" - }, - { - "source": "npm:unified", - "target": "npm:vfile", - "type": "static" - } - ], - "npm:unimport": [ - { - "source": "npm:unimport", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:escape-string-regexp@5.0.0", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:estree-walker@3.0.3", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:local-pkg@1.1.2", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:scule", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:strip-literal", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:unplugin", - "type": "static" - }, - { - "source": "npm:unimport", - "target": "npm:unplugin-utils", - "type": "static" - } - ], - "npm:unist-util-find-after": [ - { - "source": "npm:unist-util-find-after", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-find-after", - "target": "npm:unist-util-is", - "type": "static" - } - ], - "npm:unist-util-is": [ - { - "source": "npm:unist-util-is", - "target": "npm:@types/unist@3.0.3", - "type": "static" - } - ], - "npm:unist-util-position": [ - { - "source": "npm:unist-util-position", - "target": "npm:@types/unist@3.0.3", - "type": "static" - } - ], - "npm:unist-util-stringify-position": [ - { - "source": "npm:unist-util-stringify-position", - "target": "npm:@types/unist@3.0.3", - "type": "static" - } - ], - "npm:unist-util-visit-parents": [ - { - "source": "npm:unist-util-visit-parents", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-visit-parents", - "target": "npm:unist-util-is", - "type": "static" - } - ], - "npm:unist-util-visit": [ - { - "source": "npm:unist-util-visit", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:unist-util-visit", - "target": "npm:unist-util-is", - "type": "static" - }, - { - "source": "npm:unist-util-visit", - "target": "npm:unist-util-visit-parents", - "type": "static" - } - ], - "npm:unplugin-utils": [ - { - "source": "npm:unplugin-utils", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:unplugin-utils", - "target": "npm:picomatch@4.0.3", - "type": "static" - } - ], - "npm:unplugin": [ - { - "source": "npm:unplugin", - "target": "npm:@jridgewell/remapping", - "type": "static" - }, - { - "source": "npm:unplugin", - "target": "npm:acorn", - "type": "static" - }, - { - "source": "npm:unplugin", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:unplugin", - "target": "npm:webpack-virtual-modules", - "type": "static" - } - ], - "npm:unrs-resolver": [ - { - "source": "npm:unrs-resolver", - "target": "npm:napi-postinstall", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-android-arm-eabi", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-android-arm64", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-darwin-arm64", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-darwin-x64", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-freebsd-x64", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-arm-gnueabihf", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-arm-musleabihf", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-arm64-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-arm64-musl", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-ppc64-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-riscv64-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-riscv64-musl", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-s390x-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-x64-gnu", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-linux-x64-musl", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-wasm32-wasi", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-win32-arm64-msvc", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-win32-ia32-msvc", - "type": "static" - }, - { - "source": "npm:unrs-resolver", - "target": "npm:@unrs/resolver-binding-win32-x64-msvc", - "type": "static" - } - ], - "npm:unstorage": [ - { - "source": "npm:unstorage", - "target": "npm:anymatch", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:chokidar@4.0.3", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:destr", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:h3@1.15.4", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:lru-cache@10.4.3", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:node-fetch-native", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:ofetch", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:ufo", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:db0", - "type": "static" - }, - { - "source": "npm:unstorage", - "target": "npm:ioredis", - "type": "static" - } - ], - "npm:untun": [ - { - "source": "npm:untun", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:untun", - "target": "npm:consola", - "type": "static" - }, - { - "source": "npm:untun", - "target": "npm:pathe@1.1.2", - "type": "static" - } - ], - "npm:untyped": [ - { - "source": "npm:untyped", - "target": "npm:citty", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:defu", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:knitwork", - "type": "static" - }, - { - "source": "npm:untyped", - "target": "npm:scule", - "type": "static" - } - ], - "npm:unwasm": [ - { - "source": "npm:unwasm", - "target": "npm:knitwork", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:mlly", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:pkg-types@2.3.0", - "type": "static" - }, - { - "source": "npm:unwasm", - "target": "npm:unplugin", - "type": "static" - } - ], - "npm:update-browserslist-db": [ - { - "source": "npm:update-browserslist-db", - "target": "npm:browserslist", - "type": "static" - }, - { - "source": "npm:update-browserslist-db", - "target": "npm:escalade", - "type": "static" - }, - { - "source": "npm:update-browserslist-db", - "target": "npm:picocolors", - "type": "static" - } - ], - "npm:uri-js": [ - { - "source": "npm:uri-js", - "target": "npm:punycode", - "type": "static" - } - ], - "npm:use-sync-external-store": [ - { - "source": "npm:use-sync-external-store", - "target": "npm:react", - "type": "static" - } - ], - "npm:vfile-location": [ - { - "source": "npm:vfile-location", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:vfile-location", - "target": "npm:vfile", - "type": "static" - } - ], - "npm:vfile-message": [ - { - "source": "npm:vfile-message", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:vfile-message", - "target": "npm:unist-util-stringify-position", - "type": "static" - } - ], - "npm:vfile": [ - { - "source": "npm:vfile", - "target": "npm:@types/unist@3.0.3", - "type": "static" - }, - { - "source": "npm:vfile", - "target": "npm:vfile-message", - "type": "static" - } - ], - "npm:vite-plugin-dts": [ - { - "source": "npm:vite-plugin-dts", - "target": "npm:@microsoft/api-extractor", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:@rollup/pluginutils", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:@volar/typescript", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:@vue/language-core", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:compare-versions", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:kolorist", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:local-pkg@0.5.1", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:typescript", - "type": "static" - }, - { - "source": "npm:vite-plugin-dts", - "target": "npm:vite", - "type": "static" - } - ], - "npm:vite-plugin-externalize-deps": [ - { - "source": "npm:vite-plugin-externalize-deps", - "target": "npm:vite", - "type": "static" - } - ], - "npm:vite-plugin-solid": [ - { - "source": "npm:vite-plugin-solid", - "target": "npm:@babel/core", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:@types/babel__core", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:babel-preset-solid", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:merge-anything", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:solid-js", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:solid-refresh", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:vitefu", - "type": "static" - }, - { - "source": "npm:vite-plugin-solid", - "target": "npm:@testing-library/jest-dom", - "type": "static" - } - ], - "npm:vite-tsconfig-paths": [ - { - "source": "npm:vite-tsconfig-paths", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:vite-tsconfig-paths", - "target": "npm:globrex", - "type": "static" - }, - { - "source": "npm:vite-tsconfig-paths", - "target": "npm:tsconfck", - "type": "static" - }, - { - "source": "npm:vite-tsconfig-paths", - "target": "npm:vite", - "type": "static" - } - ], - "npm:vite": [ - { - "source": "npm:vite", - "target": "npm:esbuild", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:fdir", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:postcss", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:rollup", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:fsevents", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:jiti", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:lightningcss", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:terser", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:tsx", - "type": "static" - }, - { - "source": "npm:vite", - "target": "npm:yaml", - "type": "static" - } - ], - "npm:vitefu": [ - { - "source": "npm:vitefu", - "target": "npm:vite", - "type": "static" - } - ], - "npm:vitest": [ - { - "source": "npm:vitest", - "target": "npm:@vitest/expect", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/mocker", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/pretty-format", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/runner", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/snapshot", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/spy", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@vitest/utils", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:es-module-lexer", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:expect-type", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:magic-string", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:obug", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:pathe@2.0.3", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:picomatch@4.0.3", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:std-env", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:tinybench", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:tinyexec@0.3.2", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:tinyglobby", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:tinyrainbow", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:vite", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:why-is-node-running", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:@types/node", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:happy-dom", - "type": "static" - }, - { - "source": "npm:vitest", - "target": "npm:jsdom", - "type": "static" - } - ], - "npm:vue-eslint-parser": [ - { - "source": "npm:vue-eslint-parser", - "target": "npm:debug", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:eslint", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:eslint-scope", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:eslint-visitor-keys@4.2.1", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:espree", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:esquery", - "type": "static" - }, - { - "source": "npm:vue-eslint-parser", - "target": "npm:semver@7.7.3", - "type": "static" - } - ], - "npm:w3c-xmlserializer": [ - { - "source": "npm:w3c-xmlserializer", - "target": "npm:xml-name-validator", - "type": "static" - } - ], - "npm:wcwidth": [ - { - "source": "npm:wcwidth", - "target": "npm:defaults", - "type": "static" - } - ], - "npm:whatwg-encoding": [ - { - "source": "npm:whatwg-encoding", - "target": "npm:iconv-lite@0.6.3", - "type": "static" - } - ], - "npm:whatwg-url@15.1.0": [ - { - "source": "npm:whatwg-url@15.1.0", - "target": "npm:tr46@6.0.0", - "type": "static" - }, - { - "source": "npm:whatwg-url@15.1.0", - "target": "npm:webidl-conversions@8.0.0", - "type": "static" - } - ], - "npm:whatwg-url@5.0.0": [ - { - "source": "npm:whatwg-url@5.0.0", - "target": "npm:tr46@0.0.3", - "type": "static" - }, - { - "source": "npm:whatwg-url@5.0.0", - "target": "npm:webidl-conversions@3.0.1", - "type": "static" - } - ], - "npm:which": [ - { - "source": "npm:which", - "target": "npm:isexe", - "type": "static" - } - ], - "npm:why-is-node-running": [ - { - "source": "npm:why-is-node-running", - "target": "npm:siginfo", - "type": "static" - }, - { - "source": "npm:why-is-node-running", - "target": "npm:stackback", - "type": "static" - } - ], - "npm:wrap-ansi@7.0.0": [ - { - "source": "npm:wrap-ansi@7.0.0", - "target": "npm:ansi-styles@4.3.0", - "type": "static" - }, - { - "source": "npm:wrap-ansi@7.0.0", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:wrap-ansi@7.0.0", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - } - ], - "npm:wrap-ansi-cjs": [ - { - "source": "npm:wrap-ansi-cjs", - "target": "npm:ansi-styles@4.3.0", - "type": "static" - }, - { - "source": "npm:wrap-ansi-cjs", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:wrap-ansi-cjs", - "target": "npm:strip-ansi@6.0.1", - "type": "static" - } - ], - "npm:wrap-ansi@8.1.0": [ - { - "source": "npm:wrap-ansi@8.1.0", - "target": "npm:ansi-styles@6.2.3", - "type": "static" - }, - { - "source": "npm:wrap-ansi@8.1.0", - "target": "npm:string-width@5.1.2", - "type": "static" - }, - { - "source": "npm:wrap-ansi@8.1.0", - "target": "npm:strip-ansi@7.1.2", - "type": "static" - } - ], - "npm:xmlbuilder2": [ - { - "source": "npm:xmlbuilder2", - "target": "npm:@oozcitak/dom", - "type": "static" - }, - { - "source": "npm:xmlbuilder2", - "target": "npm:@oozcitak/infra", - "type": "static" - }, - { - "source": "npm:xmlbuilder2", - "target": "npm:@oozcitak/util", - "type": "static" - }, - { - "source": "npm:xmlbuilder2", - "target": "npm:js-yaml@4.1.1", - "type": "static" - } - ], - "npm:yargs": [ - { - "source": "npm:yargs", - "target": "npm:cliui", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:escalade", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:get-caller-file", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:require-directory", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:string-width@4.2.3", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:y18n", - "type": "static" - }, - { - "source": "npm:yargs", - "target": "npm:yargs-parser", - "type": "static" - } - ], - "npm:youch-core": [ - { - "source": "npm:youch-core", - "target": "npm:@poppinss/exception", - "type": "static" - }, - { - "source": "npm:youch-core", - "target": "npm:error-stack-parser-es", - "type": "static" - } - ], - "npm:youch": [ - { - "source": "npm:youch", - "target": "npm:@poppinss/colors", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:@poppinss/dumper", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:@speed-highlight/core", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:cookie", - "type": "static" - }, - { - "source": "npm:youch", - "target": "npm:youch-core", - "type": "static" - } - ], - "npm:zip-stream": [ - { - "source": "npm:zip-stream", - "target": "npm:archiver-utils", - "type": "static" - }, - { - "source": "npm:zip-stream", - "target": "npm:compress-commons", - "type": "static" - }, - { - "source": "npm:zip-stream", - "target": "npm:readable-stream@4.7.0", - "type": "static" - } - ], - "npm:zod-validation-error@3.5.4": [ - { - "source": "npm:zod-validation-error@3.5.4", - "target": "npm:zod@3.25.76", - "type": "static" - } - ], - "npm:zod-validation-error@4.0.2": [ - { - "source": "npm:zod-validation-error@4.0.2", - "target": "npm:zod@4.1.13", - "type": "static" - } - ] - }, - "version": "6.0", - "errors": [], - "computedAt": 1764194322687 -} \ No newline at end of file diff --git a/.nx/workspace-data/source-maps.json b/.nx/workspace-data/source-maps.json deleted file mode 100644 index d146952f1..000000000 --- a/.nx/workspace-data/source-maps.json +++ /dev/null @@ -1,5602 +0,0 @@ -{ - "examples/ts-chat": { - "root": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "name": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "tags": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "tags.npm:private": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.dev": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.executor": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.options": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.metadata": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.options.script": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.metadata.scriptContent": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.metadata.runCommand": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.serve": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.serve.executor": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.serve.options": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.serve.metadata": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.serve.options.script": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.serve.metadata.scriptContent": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.serve.metadata.runCommand": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.test": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.test.executor": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.test.options": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.test.metadata": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.test.options.script": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.test.metadata.scriptContent": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.test.metadata.runCommand": [ - "examples/ts-chat/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "examples/vanilla-chat": { - "root": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "name": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "tags": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "tags.npm:private": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.dev": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.executor": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.options": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.metadata": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.options.script": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.metadata.scriptContent": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.dev.metadata.runCommand": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.preview": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.preview.executor": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.preview.options": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.preview.metadata": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.preview.options.script": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.preview.metadata.scriptContent": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.preview.metadata.runCommand": [ - "examples/vanilla-chat/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - ".": { - "root": [ - "package.json", - "nx/core/package-json" - ], - "name": [ - "package.json", - "nx/core/package-json" - ], - "includedScripts": [ - "package.json", - "nx/core/package-json" - ], - "tags": [ - "package.json", - "nx/core/package-json" - ], - "tags.npm:private": [ - "package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "package.json", - "nx/core/package-json" - ], - "targets": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:knip": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:knip.executor": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:knip.options": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:knip.metadata": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:knip.options.script": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:knip.metadata.scriptContent": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:knip.metadata.runCommand": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:sherif": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:sherif.executor": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:sherif.options": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:sherif.metadata": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:sherif.options.script": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:sherif.metadata.scriptContent": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:sherif.metadata.runCommand": [ - "package.json", - "nx/core/package-json" - ], - "targets.test:knip.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:knip.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:knip.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:sherif.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:sherif.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:sherif.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai": { - "root": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "tags.npm:sdk": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "tags.npm:llm": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "tags.npm:chat": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "tags.npm:embeddings": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-anthropic": { - "root": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "tags.npm:anthropic": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "tags.npm:claude": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "tags.npm:adapter": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-anthropic/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-client": { - "root": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "tags.npm:client": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "tags.npm:headless": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "tags.npm:chat": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "tags.npm:streaming": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-client/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-devtools": { - "root": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:sdk": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:llm": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:chat": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:embeddings": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-fallback": { - "root": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "tags.npm:fallback": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "tags.npm:adapter": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "tags.npm:retry": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-fallback/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-gemini": { - "root": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "tags.npm:gemini": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "tags.npm:google": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "tags.npm:adapter": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-gemini/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-ollama": { - "root": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "tags.npm:ollama": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "tags.npm:llama": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "tags.npm:mistral": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "tags.npm:adapter": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-ollama/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-openai": { - "root": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "tags.npm:openai": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "tags.npm:gpt": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "tags.npm:adapter": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-openai/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-react": { - "root": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "tags.npm:react": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "tags.npm:hooks": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "tags.npm:chat": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "tags.npm:streaming": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-react/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/ai-react-ui": { - "root": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags.npm:react": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags.npm:chat": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags.npm:ui": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags.npm:headless": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "tags.npm:components": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.js.packageMain": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/ai-react-ui/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/react-ai-devtools": { - "root": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/react-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/solid-ai-devtools": { - "root": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:ai": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:tanstack": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:sdk": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:llm": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:chat": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "tags.npm:embeddings": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.2": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.3": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.4": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.5": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.6": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.7": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.packageExports": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.executor": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.options": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.options.script": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.scriptContent": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.metadata.runCommand": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.executor": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.options": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.options.script": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.scriptContent": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.clean.metadata.runCommand": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.executor": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.options.script": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.scriptContent": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.lint:fix.metadata.runCommand": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.executor": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.options": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.options.script": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.scriptContent": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:build.metadata.runCommand": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.executor": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.options.script": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.scriptContent": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:eslint.metadata.runCommand": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.executor": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.options.script": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.scriptContent": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib.metadata.runCommand": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.executor": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.options.script": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.scriptContent": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:lib:dev.metadata.runCommand": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.executor": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.options": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.options.script": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.scriptContent": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.test:types.metadata.runCommand": [ - "packages/typescript/solid-ai-devtools/package.json", - "nx/core/package-json" - ], - "targets.build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:build.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:eslint.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.outputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:lib.parallelism": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.cache": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.dependsOn": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.inputs": [ - "nx.json", - "nx/target-defaults" - ], - "targets.test:types.parallelism": [ - "nx.json", - "nx/target-defaults" - ] - }, - "packages/typescript/tests-adapters": { - "root": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "name": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "tags": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "tags.npm:public": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.0": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.targetGroups.NPM Scripts.1": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.description": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.js": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.js.packageName": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.js.packageVersion": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "metadata.js.isInPackageManagerWorkspaces": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.start": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.start.executor": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.start.options": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.start.metadata": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.start.options.script": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.start.metadata.scriptContent": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.start.metadata.runCommand": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.typecheck": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.typecheck.executor": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.typecheck.options": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.typecheck.metadata": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.typecheck.options.script": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.typecheck.metadata.scriptContent": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ], - "targets.typecheck.metadata.runCommand": [ - "packages/typescript/tests-adapters/package.json", - "nx/core/package-json" - ] - } -} \ No newline at end of file From 4fa2f3945fc4726eb6163c6037cd46396025754d Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 11:12:30 +0100 Subject: [PATCH 03/24] fix sherif lint and format, fix some builds and bugs --- .github/instructions/copilot-instructions.md | 58 +- CHANGELOG.md | 96 +- ai-docs/AGENT_LOOP_STRATEGIES.md | 135 +- ai-docs/CONNECTION_ADAPTERS_GUIDE.md | 452 +-- ai-docs/EVENT_CLIENT.md | 827 ++-- ai-docs/EVENT_CLIENT_INTEGRATION.md | 206 +- ai-docs/IMPLEMENTATION_SUMMARY.md | 866 ++-- ai-docs/MIGRATION_UNIFIED_CHAT.md | 470 +-- ai-docs/TOOL_EXECUTION_LOOP.md | 120 +- ai-docs/TOOL_REGISTRY.md | 937 ++--- ai-docs/TOOL_REGISTRY_IMPLEMENTATION.md | 844 ++-- ai-docs/TOOL_REGISTRY_QUICK_START.md | 416 +- ai-docs/TOOL_STATES_MIGRATION.md | 114 +- ai-docs/TYPE_NARROWING_SOLUTION.md | 321 +- ai-docs/TYPE_NARROWING_UNIFIED_CHAT.md | 449 +-- ai-docs/TYPE_SAFETY.md | 608 +-- ai-docs/UNIFIED_CHAT_API.md | 778 ++-- ai-docs/UNIFIED_CHAT_IMPLEMENTATION.md | 503 +-- ai-docs/UNIFIED_CHAT_QUICK_REFERENCE.md | 658 ++-- examples/README.md | 902 ++--- examples/cli/package.json | 5 + examples/php-slim/README.md | 17 +- examples/php-slim/composer.json | 74 +- examples/php-slim/package.json | 5 + examples/python-fastapi/README.md | 10 +- examples/python-fastapi/package.json | 5 + examples/ts-chat/.cta.json | 9 +- examples/ts-chat/README.md | 88 +- examples/ts-chat/api-verification.ts | 2 +- examples/ts-chat/package.json | 2 +- examples/ts-chat/src/components/Approval.tsx | 11 +- examples/ts-chat/src/components/Header.tsx | 16 +- .../example-GuitarRecommendation.tsx | 16 +- examples/ts-chat/src/lib/guitar-tools.ts | 74 +- examples/ts-chat/src/lib/stub-adapter.ts | 19 +- examples/ts-chat/src/lib/stub-llm.ts | 336 +- examples/ts-chat/src/routes/__root.tsx | 28 +- examples/ts-chat/src/routes/api.tanchat.ts | 44 +- examples/ts-chat/src/routes/api.test-chat.ts | 28 +- examples/ts-chat/src/routes/demo.tsx | 48 +- .../src/routes/example.guitars/index.tsx | 10 +- examples/ts-chat/src/routes/index.tsx | 206 +- examples/ts-chat/src/routes/tanchat.css | 21 +- examples/ts-chat/src/styles.css | 12 +- examples/ts-chat/vite.config.ts | 18 +- examples/vanilla-chat/README.md | 6 +- examples/vanilla-chat/index.html | 66 +- examples/vanilla-chat/src/main.js | 138 +- examples/vanilla-chat/src/style.css | 13 +- examples/vanilla-chat/vite.config.ts | 6 +- packages/php/tanstack-ai/README.md | 1 - packages/python/tanstack-ai/README.md | 1 - packages/typescript/ai-anthropic/package.json | 9 +- .../ai-anthropic/src/anthropic-adapter.ts | 405 +- packages/typescript/ai-anthropic/src/index.ts | 15 +- .../typescript/ai-anthropic/src/model-meta.ts | 828 ++-- .../src/text/text-provider-options.ts | 586 +-- .../ai-anthropic/src/tools/bash-tool.ts | 53 +- .../src/tools/code-execution-tool.ts | 60 +- .../src/tools/computer-use-tool.ts | 62 +- .../ai-anthropic/src/tools/custom-tool.ts | 112 +- .../ai-anthropic/src/tools/index.ts | 31 +- .../ai-anthropic/src/tools/memory-tool.ts | 47 +- .../src/tools/text-editor-tool.ts | 80 +- .../ai-anthropic/src/tools/tool-converter.ts | 122 +- .../ai-anthropic/src/tools/web-fetch-tool.ts | 91 +- .../ai-anthropic/src/tools/web-search-tool.ts | 162 +- .../tests/anthropic-adapter.test.ts | 393 +- .../ai-anthropic/tests/model-meta.test.ts | 763 ++-- .../typescript/ai-anthropic/tsconfig.json | 7 +- packages/typescript/ai-client/ARCHITECTURE.md | 42 +- packages/typescript/ai-client/README.md | 374 +- packages/typescript/ai-client/package.json | 11 +- .../typescript/ai-client/src/chat-client.ts | 405 +- .../ai-client/src/connection-adapters.ts | 135 +- packages/typescript/ai-client/src/events.ts | 104 +- packages/typescript/ai-client/src/index.ts | 12 +- .../ai-client/src/loose-json-parser.ts | 17 +- .../ai-client/src/message-converters.ts | 154 +- .../ai-client/src/message-updaters.ts | 211 +- .../ai-client/src/stream/chunk-strategies.ts | 48 +- .../typescript/ai-client/src/stream/index.ts | 6 +- .../ai-client/src/stream/processor.ts | 328 +- .../typescript/ai-client/src/stream/types.ts | 132 +- packages/typescript/ai-client/src/types.ts | 110 +- .../ai-client/tests/chat-client-abort.test.ts | 327 +- .../ai-client/tests/chat-client.test.ts | 684 ++-- .../tests/connection-adapters-abort.test.ts | 246 +- .../tests/connection-adapters.test.ts | 415 +- .../typescript/ai-client/tests/events.test.ts | 452 +-- .../tests/message-converters.test.ts | 818 ++-- .../ai-client/tests/message-updaters.test.ts | 895 +++-- .../ai-client/tests/stream-processor.test.ts | 352 +- .../tests/stream/chunk-strategies.test.ts | 579 +-- .../ai-client/tests/stream/processor.test.ts | 600 +-- .../typescript/ai-client/tests/test-utils.ts | 133 +- .../src/components/ConversationDetails.tsx | 119 +- .../src/components/ConversationsList.tsx | 52 +- .../ai-devtools/src/components/Shell.tsx | 271 +- .../components/conversation/ChunkBadges.tsx | 92 +- .../src/components/conversation/ChunkItem.tsx | 356 +- .../conversation/ChunksCollapsible.tsx | 105 +- .../src/components/conversation/ChunksTab.tsx | 130 +- .../conversation/ConversationHeader.tsx | 237 +- .../conversation/ConversationTabs.tsx | 94 +- .../components/conversation/MessageCard.tsx | 173 +- .../components/conversation/MessageGroup.tsx | 148 +- .../components/conversation/MessagesTab.tsx | 57 +- .../conversation/ToolCallDisplay.tsx | 167 +- .../src/components/conversation/index.ts | 20 +- .../src/components/list/ConversationRow.tsx | 150 +- .../ai-devtools/src/components/list/index.ts | 2 +- .../src/components/utils/format.ts | 116 +- .../ai-devtools/src/components/utils/index.ts | 2 +- packages/typescript/ai-devtools/src/core.tsx | 10 +- .../ai-devtools/src/store/ai-context.tsx | 2633 +++++++------ .../ai-devtools/src/store/ai-store.ts | 27 +- .../ai-devtools/src/styles/use-styles.ts | 21 +- .../typescript/ai-devtools/vite.config.ts | 52 +- .../typescript/ai-devtools/vitest.config.ts | 9 +- packages/typescript/ai-fallback/README.md | 143 - packages/typescript/ai-fallback/package.json | 49 - .../typescript/ai-fallback/src/bound-ai.ts | 235 -- .../typescript/ai-fallback/src/fallback-ai.ts | 263 -- packages/typescript/ai-fallback/src/index.ts | 107 - packages/typescript/ai-fallback/src/types.ts | 76 - .../ai-fallback/tests/fallback.test.ts | 459 --- packages/typescript/ai-fallback/tsconfig.json | 10 - .../typescript/ai-fallback/tsdown.config.ts | 12 - .../typescript/ai-fallback/vitest.config.ts | 18 - packages/typescript/ai-gemini/package.json | 9 +- .../ai-gemini/src/gemini-adapter.ts | 397 +- packages/typescript/ai-gemini/src/index.ts | 11 +- .../typescript/ai-gemini/src/model-meta.ts | 1633 ++++---- .../src/text/text-provider-options.ts | 908 +++-- .../src/tools/code-execution-tool.ts | 44 +- .../ai-gemini/src/tools/computer-use-tool.ts | 58 +- .../ai-gemini/src/tools/file-search-tool.ts | 94 +- .../src/tools/function-declaration-tool.ts | 316 +- .../ai-gemini/src/tools/google-maps-tool.ts | 62 +- .../src/tools/google-search-retriveal-tool.ts | 55 +- .../ai-gemini/src/tools/google-search-tool.ts | 64 +- .../typescript/ai-gemini/src/tools/index.ts | 28 +- .../ai-gemini/src/tools/tool-converter.ts | 200 +- .../ai-gemini/src/tools/url-context-tool.ts | 44 +- .../ai-gemini/tests/gemini-adapter.test.ts | 774 ++-- .../ai-gemini/tests/model-meta.test.ts | 588 +-- packages/typescript/ai-gemini/tsconfig.json | 3 +- .../typescript/ai-gemini/tsdown.config.ts | 10 +- packages/typescript/ai-gemini/vite.config.ts | 36 + .../typescript/ai-gemini/vitest.config.ts | 44 +- packages/typescript/ai-ollama/package.json | 9 +- packages/typescript/ai-ollama/src/index.ts | 8 +- .../ai-ollama/src/ollama-adapter.ts | 338 +- packages/typescript/ai-ollama/tsconfig.json | 3 +- .../typescript/ai-ollama/tsdown.config.ts | 10 +- packages/typescript/ai-ollama/vite.config.ts | 36 + .../live-tests/test-tool-arguments.ts | 154 +- packages/typescript/ai-openai/package.json | 8 +- .../src/audio/audio-provider-options.ts | 143 +- .../src/audio/transcribe-provider-options.ts | 247 +- .../src/image/image-provider-options.ts | 93 +- packages/typescript/ai-openai/src/index.ts | 10 +- .../typescript/ai-openai/src/model-meta.ts | 3487 +++++++++-------- .../ai-openai/src/openai-adapter.ts | 1112 +++--- .../src/text/text-provider-options.ts | 778 ++-- .../ai-openai/src/tools/apply-patch-tool.ts | 60 +- .../src/tools/code-interpreter-tool.ts | 71 +- .../ai-openai/src/tools/computer-use-tool.ts | 70 +- .../ai-openai/src/tools/custom-tool.ts | 72 +- .../ai-openai/src/tools/file-search-tool.ts | 91 +- .../ai-openai/src/tools/function-tool.ts | 94 +- .../src/tools/image-generation-tool.ts | 85 +- .../typescript/ai-openai/src/tools/index.ts | 82 +- .../ai-openai/src/tools/local-shell-tool.ts | 59 +- .../ai-openai/src/tools/mcp-tool.ts | 92 +- .../ai-openai/src/tools/shell-tool.ts | 56 +- .../ai-openai/src/tools/tool-choice.ts | 51 +- .../ai-openai/src/tools/tool-converter.ts | 142 +- .../src/tools/web-search-preview-tool.ts | 67 +- .../ai-openai/src/tools/web-search-tool.ts | 56 +- .../ai-openai/tests/model-meta.test.ts | 1416 ++++--- .../ai-openai/tests/openai-adapter.test.ts | 138 +- packages/typescript/ai-openai/tsconfig.json | 3 +- .../typescript/ai-openai/tsdown.config.ts | 10 +- packages/typescript/ai-openai/vite.config.ts | 36 + .../typescript/ai-openai/vitest.config.ts | 44 +- packages/typescript/ai-react-ui/README.md | 32 +- .../typescript/ai-react-ui/src/chat-input.tsx | 124 +- .../ai-react-ui/src/chat-message.tsx | 122 +- .../ai-react-ui/src/chat-messages.tsx | 38 +- packages/typescript/ai-react-ui/src/chat.tsx | 50 +- packages/typescript/ai-react-ui/src/index.ts | 20 +- .../typescript/ai-react-ui/src/text-part.tsx | 38 +- .../ai-react-ui/src/thinking-part.tsx | 22 +- .../ai-react-ui/src/tool-approval.tsx | 59 +- packages/typescript/ai-react-ui/tsconfig.json | 1 - .../typescript/ai-react-ui/tsdown.config.ts | 11 +- packages/typescript/ai-react/README.md | 219 +- packages/typescript/ai-react/package.json | 12 +- packages/typescript/ai-react/src/index.ts | 6 +- packages/typescript/ai-react/src/types.ts | 54 +- packages/typescript/ai-react/src/use-chat.ts | 126 +- .../typescript/ai-react/tests/test-utils.ts | 17 +- .../ai-react/tests/use-chat.test.ts | 1332 +++---- packages/typescript/ai-react/tsconfig.json | 3 +- packages/typescript/ai-react/tsdown.config.ts | 10 +- packages/typescript/ai-react/vite.config.ts | 36 + packages/typescript/ai-react/vitest.config.ts | 40 +- packages/typescript/ai/package.json | 17 +- packages/typescript/ai/src/base-adapter.ts | 42 +- .../ai/src/core/chat-common-options.ts | 110 +- packages/typescript/ai/src/core/chat.ts | 567 ++- packages/typescript/ai/src/core/embedding.ts | 16 +- packages/typescript/ai/src/core/summarize.ts | 20 +- packages/typescript/ai/src/event-client.ts | 718 ++-- packages/typescript/ai/src/index.ts | 22 +- .../typescript/ai/src/tools/tool-calls.ts | 200 +- .../typescript/ai/src/tools/tool-utils.ts | 196 +- packages/typescript/ai/src/types.ts | 345 +- .../ai/src/utilities/agent-loop-strategies.ts | 22 +- .../ai/src/utilities/chat-options.ts | 62 +- .../ai/src/utilities/stream-to-response.ts | 44 +- .../ai/tests/agent-loop-strategies.test.ts | 321 +- packages/typescript/ai/tests/ai-abort.test.ts | 232 +- packages/typescript/ai/tests/ai-chat.test.ts | 3229 ++++++++------- .../ai/tests/tool-call-manager.test.ts | 280 +- .../typescript/react-ai-devtools/package.json | 8 +- .../react-ai-devtools/src/AiDevtools.tsx | 10 +- .../react-ai-devtools/src/plugin.tsx | 12 +- .../react-ai-devtools/tsconfig.json | 8 +- .../react-ai-devtools/tsdown.config.ts | 8 +- .../react-ai-devtools/vitest.config.ts | 9 +- .../typescript/solid-ai-devtools/package.json | 4 +- .../solid-ai-devtools/src/AiDevtools.tsx | 10 +- .../solid-ai-devtools/src/plugin.tsx | 12 +- .../solid-ai-devtools/tsconfig.json | 8 +- .../solid-ai-devtools/tsdown.config.ts | 8 +- .../solid-ai-devtools/vitest.config.ts | 9 +- packages/typescript/tests-adapters/README.md | 1 - .../typescript/tests-adapters/package.json | 3 +- .../typescript/tests-adapters/src/harness.ts | 314 +- .../typescript/tests-adapters/src/index.ts | 580 ++- .../typescript/tests-adapters/tsconfig.json | 1 - pnpm-lock.yaml | 16 +- pnpm-workspace.yaml | 4 +- tsconfig.json | 2 +- 247 files changed, 27044 insertions(+), 26333 deletions(-) create mode 100644 examples/cli/package.json create mode 100644 examples/php-slim/package.json create mode 100644 examples/python-fastapi/package.json delete mode 100644 packages/typescript/ai-fallback/README.md delete mode 100644 packages/typescript/ai-fallback/package.json delete mode 100644 packages/typescript/ai-fallback/src/bound-ai.ts delete mode 100644 packages/typescript/ai-fallback/src/fallback-ai.ts delete mode 100644 packages/typescript/ai-fallback/src/index.ts delete mode 100644 packages/typescript/ai-fallback/src/types.ts delete mode 100644 packages/typescript/ai-fallback/tests/fallback.test.ts delete mode 100644 packages/typescript/ai-fallback/tsconfig.json delete mode 100644 packages/typescript/ai-fallback/tsdown.config.ts delete mode 100644 packages/typescript/ai-fallback/vitest.config.ts create mode 100644 packages/typescript/ai-gemini/vite.config.ts create mode 100644 packages/typescript/ai-ollama/vite.config.ts create mode 100644 packages/typescript/ai-openai/vite.config.ts create mode 100644 packages/typescript/ai-react/vite.config.ts diff --git a/.github/instructions/copilot-instructions.md b/.github/instructions/copilot-instructions.md index 10df81bd1..65be40908 100644 --- a/.github/instructions/copilot-instructions.md +++ b/.github/instructions/copilot-instructions.md @@ -1,28 +1,30 @@ ---- -applyTo: '**' ---- -Provide project context and coding guidelines that AI should follow when generating code, answering questions, or reviewing changes. - -Whenever you want to build the packages to test if they work you should run `pnpm run build` from the root of the repository. - -If you want to check if the examples work you need to go to `examples/` and run `pnpm run dev`. - -When writing code, please follow these guidelines: -- Use TypeScript for all new code. -- Ensure all new code is covered by tests. -- Do not use `any` type; prefer specific types or generics. -- Follow existing code style and conventions. - -If you get an error "address already in use :::42069 you should kill the process using that port. - -If we add a new functionality add a section about it in the `docs/` folder explaining how to use it and update the `README.md` file to mention it. - -Write tests for any new functionality. - -When defining new types, first check if the types exist somewhere and re-use them, do not create new types that are similar to existing ones. - -When modifying existing functionality, ensure backward compatibility unless there's a strong reason to introduce breaking changes. If breaking changes are necessary, document them clearly in the relevant documentation files. - -When subscribing to an event using `aiEventClient.on` in the devtools packages, always add the option `{ withEventTarget: false }` as the second argument to prevent over-subscriptions in the devtools. - -Under no circumstances should casting `as any` be used in the codebase. Always strive to find or create the appropriate type definitions. Avoid casting unless absolutely neccessary, and even then, prefer using `satisfies` for type assertions to maintain type safety. \ No newline at end of file +--- +applyTo: '**' +--- + +Provide project context and coding guidelines that AI should follow when generating code, answering questions, or reviewing changes. + +Whenever you want to build the packages to test if they work you should run `pnpm run build` from the root of the repository. + +If you want to check if the examples work you need to go to `examples/` and run `pnpm run dev`. + +When writing code, please follow these guidelines: + +- Use TypeScript for all new code. +- Ensure all new code is covered by tests. +- Do not use `any` type; prefer specific types or generics. +- Follow existing code style and conventions. + +If you get an error "address already in use :::42069 you should kill the process using that port. + +If we add a new functionality add a section about it in the `docs/` folder explaining how to use it and update the `README.md` file to mention it. + +Write tests for any new functionality. + +When defining new types, first check if the types exist somewhere and re-use them, do not create new types that are similar to existing ones. + +When modifying existing functionality, ensure backward compatibility unless there's a strong reason to introduce breaking changes. If breaking changes are necessary, document them clearly in the relevant documentation files. + +When subscribing to an event using `aiEventClient.on` in the devtools packages, always add the option `{ withEventTarget: false }` as the second argument to prevent over-subscriptions in the devtools. + +Under no circumstances should casting `as any` be used in the codebase. Always strive to find or create the appropriate type definitions. Avoid casting unless absolutely neccessary, and even then, prefer using `satisfies` for type assertions to maintain type safety. diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c664d958..d59f104bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,15 +45,15 @@ npm install @tanstack/ai-fallback **Usage:** ```typescript -import { ai } from "@tanstack/ai"; -import { fallback, withModel } from "@tanstack/ai-fallback"; +import { ai } from '@tanstack/ai' +import { fallback, withModel } from '@tanstack/ai-fallback' -const openAI = withModel(ai(openai()), { model: "gpt-4" }); +const openAI = withModel(ai(openai()), { model: 'gpt-4' }) const anthropicAI = withModel(ai(anthropic()), { - model: "claude-3-5-sonnet-20241022", -}); + model: 'claude-3-5-sonnet-20241022', +}) -const aiWithFallback = fallback([openAI, anthropicAI]); +const aiWithFallback = fallback([openAI, anthropicAI]) ``` **See:** [Package Documentation](packages/typescript/ai-fallback/README.md) @@ -204,12 +204,12 @@ import { ChatClient, fetchServerSentEvents, PunctuationStrategy, -} from "@tanstack/ai-client"; +} from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), chunkingStrategy: new PunctuationStrategy(), -}); +}) ``` **See:** [Stream Processing Quick Start](packages/typescript/ai-client/docs/STREAM_QUICKSTART.md) @@ -221,13 +221,13 @@ const client = new ChatClient({ **API:** ```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat", { - headers: { Authorization: "Bearer token" }, + connection: fetchServerSentEvents('/api/chat', { + headers: { Authorization: 'Bearer token' }, }), -}); +}) ``` **Benefits:** @@ -245,29 +245,29 @@ const client = new ChatClient({ **With React:** ```typescript -import { useChat, fetchServerSentEvents } from "@tanstack/ai-react"; +import { useChat, fetchServerSentEvents } from '@tanstack/ai-react' const chat = useChat({ - connection: fetchServerSentEvents("/api/chat"), -}); + connection: fetchServerSentEvents('/api/chat'), +}) ``` **Create Custom Adapters:** ```typescript -import type { ConnectionAdapter } from "@tanstack/ai-client"; +import type { ConnectionAdapter } from '@tanstack/ai-client' const wsAdapter: ConnectionAdapter = { async *connect(messages, data) { - const ws = new WebSocket("wss://api.example.com"); + const ws = new WebSocket('wss://api.example.com') // ... WebSocket logic }, abort() { - ws.close(); + ws.close() }, -}; +} -const chat = useChat({ connection: wsAdapter }); +const chat = useChat({ connection: wsAdapter }) ``` **Documentation:** @@ -383,16 +383,16 @@ return toStreamResponse(stream); // Exported from @tanstack/ai The `chat()` method now includes an automatic tool execution loop: ```typescript -import { chat, tool, maxIterations } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; +import { chat, tool, maxIterations } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' const stream = chat({ adapter: openai(), - model: "gpt-4o", - messages: [{ role: "user", content: "What's the weather in Paris?" }], + model: 'gpt-4o', + messages: [{ role: 'user', content: "What's the weather in Paris?" }], tools: [weatherTool], agentLoopStrategy: maxIterations(5), // Optional: control loop -}); +}) // SDK automatically: // 1. Detects tool calls from model @@ -416,20 +416,20 @@ import { maxIterations, untilFinishReason, combineStrategies, -} from "@tanstack/ai"; +} from '@tanstack/ai' // Built-in strategies -agentLoopStrategy: maxIterations(10); -agentLoopStrategy: untilFinishReason(["stop", "length"]); +agentLoopStrategy: maxIterations(10) +agentLoopStrategy: untilFinishReason(['stop', 'length']) agentLoopStrategy: combineStrategies([ maxIterations(10), ({ messages }) => messages.length < 100, -]); +]) // Custom strategy agentLoopStrategy: ({ iterationCount, messages, finishReason }) => { - return iterationCount < 10 && messages.length < 50; -}; + return iterationCount < 10 && messages.length < 50 +} ``` #### 3. ToolCallManager Class @@ -437,46 +437,46 @@ agentLoopStrategy: ({ iterationCount, messages, finishReason }) => { Tool execution logic extracted into a testable class: ```typescript -import { ToolCallManager } from "@tanstack/ai"; +import { ToolCallManager } from '@tanstack/ai' -const manager = new ToolCallManager(tools); +const manager = new ToolCallManager(tools) // Accumulate tool calls from stream -manager.addToolCallChunk(chunk); +manager.addToolCallChunk(chunk) // Check if tools need execution if (manager.hasToolCalls()) { - const results = yield * manager.executeTools(doneChunk); + const results = yield * manager.executeTools(doneChunk) } // Clear for next iteration -manager.clear(); +manager.clear() ``` #### 4. Explicit Server-Sent Events Helpers ```typescript -import { toStreamResponse, toServerSentEventsStream } from "@tanstack/ai"; +import { toStreamResponse, toServerSentEventsStream } from '@tanstack/ai' // Full HTTP Response with SSE headers -return toStreamResponse(stream); +return toStreamResponse(stream) // Just the ReadableStream (for custom response) return new Response(toServerSentEventsStream(stream), { - headers: { "X-Custom": "value" }, -}); + headers: { 'X-Custom': 'value' }, +}) ``` ### New Exports ```typescript // From @tanstack/ai -export { chat, chatCompletion }; // Separate streaming and promise methods -export { toStreamResponse, toServerSentEventsStream }; // HTTP helpers -export { ToolCallManager }; // Tool execution manager -export { maxIterations, untilFinishReason, combineStrategies }; // Loop strategies -export type { AgentLoopStrategy, AgentLoopState }; // Strategy types -export type { ToolResultStreamChunk }; // New chunk type +export { chat, chatCompletion } // Separate streaming and promise methods +export { toStreamResponse, toServerSentEventsStream } // HTTP helpers +export { ToolCallManager } // Tool execution manager +export { maxIterations, untilFinishReason, combineStrategies } // Loop strategies +export type { AgentLoopStrategy, AgentLoopState } // Strategy types +export type { ToolResultStreamChunk } // New chunk type ``` ### Migration Guide @@ -531,13 +531,11 @@ cd packages/ai && pnpm test ### Breaking Changes Summary 1. **`chat()` method**: - - No longer accepts `as` option - Now streaming-only - Includes automatic tool execution loop 2. **New `chatCompletion()` method**: - - Promise-based - Supports structured output - No automatic tool execution diff --git a/ai-docs/AGENT_LOOP_STRATEGIES.md b/ai-docs/AGENT_LOOP_STRATEGIES.md index 318916fb9..f861faeca 100644 --- a/ai-docs/AGENT_LOOP_STRATEGIES.md +++ b/ai-docs/AGENT_LOOP_STRATEGIES.md @@ -85,22 +85,22 @@ const simple: AgentLoopStrategy = ({ iterationCount }) => { }; // Advanced: based on multiple conditions -const advanced: AgentLoopStrategy = ({ - iterationCount, - messages, - finishReason +const advanced: AgentLoopStrategy = ({ + iterationCount, + messages, + finishReason }) => { // Stop after 10 iterations if (iterationCount >= 10) return false; - + // Stop if conversation gets too long if (messages.length > 50) return false; - + // Stop on specific finish reasons if (finishReason === "length" || finishReason === "content_filter") { return false; } - + // Otherwise continue return true; }; @@ -122,17 +122,18 @@ The state object passed to your strategy function: ```typescript export interface AgentLoopState { /** Current iteration count (0-indexed) */ - iterationCount: number; - + iterationCount: number + /** Current messages in the conversation */ - messages: Message[]; - + messages: Message[] + /** Finish reason from the last model response */ - finishReason: string | null; + finishReason: string | null } ``` **Finish reasons:** + - `"stop"` - Model finished naturally - `"length"` - Hit token limit - `"tool_calls"` - Model called tools (triggers tool execution) @@ -146,8 +147,8 @@ export interface AgentLoopState { ```typescript // Stop after 3 iterations OR 20 messages const conservative: AgentLoopStrategy = ({ iterationCount, messages }) => { - return iterationCount < 3 && messages.length < 20; -}; + return iterationCount < 3 && messages.length < 20 +} ``` ### Budget Control @@ -155,12 +156,12 @@ const conservative: AgentLoopStrategy = ({ iterationCount, messages }) => { ```typescript // Stop based on estimated token usage const budgetAware: AgentLoopStrategy = ({ messages }) => { - const estimatedTokens = messages.reduce((sum, m) => - sum + (m.content?.length || 0) / 4, // Rough estimate - 0 - ); - return estimatedTokens < 10000; // Stop before 10k tokens -}; + const estimatedTokens = messages.reduce( + (sum, m) => sum + (m.content?.length || 0) / 4, // Rough estimate + 0, + ) + return estimatedTokens < 10000 // Stop before 10k tokens +} ``` ### Conditional Execution @@ -168,13 +169,15 @@ const budgetAware: AgentLoopStrategy = ({ messages }) => { ```typescript // Different limits for different scenarios const conditional: AgentLoopStrategy = ({ iterationCount, messages }) => { - const hasToolCalls = messages.some(m => m.toolCalls && m.toolCalls.length > 0); - + const hasToolCalls = messages.some( + (m) => m.toolCalls && m.toolCalls.length > 0, + ) + // Allow more iterations if tools are being used - const maxIters = hasToolCalls ? 10 : 3; - - return iterationCount < maxIters; -}; + const maxIters = hasToolCalls ? 10 : 3 + + return iterationCount < maxIters +} ``` ### Debug Mode @@ -182,9 +185,9 @@ const conditional: AgentLoopStrategy = ({ iterationCount, messages }) => { ```typescript // Stop early during development const debug: AgentLoopStrategy = ({ iterationCount }) => { - console.log(`Iteration ${iterationCount + 1}`); - return iterationCount < 2; // Only 2 iterations in debug mode -}; + console.log(`Iteration ${iterationCount + 1}`) + return iterationCount < 2 // Only 2 iterations in debug mode +} ``` ## Pattern: Strategy Factory @@ -251,30 +254,42 @@ Both are equivalent. The `maxIterations` number is automatically converted to `a ### Unit Test Example ```typescript -import { describe, it, expect } from "vitest"; -import type { AgentLoopStrategy, AgentLoopState } from "@tanstack/ai"; +import { describe, it, expect } from 'vitest' +import type { AgentLoopStrategy, AgentLoopState } from '@tanstack/ai' -describe("Custom Strategy", () => { - it("should stop after 3 iterations", () => { +describe('Custom Strategy', () => { + it('should stop after 3 iterations', () => { const strategy: AgentLoopStrategy = ({ iterationCount }) => { - return iterationCount < 3; - }; - - expect(strategy({ iterationCount: 0, messages: [], finishReason: null })).toBe(true); - expect(strategy({ iterationCount: 2, messages: [], finishReason: null })).toBe(true); - expect(strategy({ iterationCount: 3, messages: [], finishReason: null })).toBe(false); - }); - - it("should stop when finish reason is length", () => { + return iterationCount < 3 + } + + expect( + strategy({ iterationCount: 0, messages: [], finishReason: null }), + ).toBe(true) + expect( + strategy({ iterationCount: 2, messages: [], finishReason: null }), + ).toBe(true) + expect( + strategy({ iterationCount: 3, messages: [], finishReason: null }), + ).toBe(false) + }) + + it('should stop when finish reason is length', () => { const strategy: AgentLoopStrategy = ({ finishReason }) => { - return finishReason !== "length"; - }; - - expect(strategy({ iterationCount: 0, messages: [], finishReason: null })).toBe(true); - expect(strategy({ iterationCount: 0, messages: [], finishReason: "stop" })).toBe(true); - expect(strategy({ iterationCount: 0, messages: [], finishReason: "length" })).toBe(false); - }); -}); + return finishReason !== 'length' + } + + expect( + strategy({ iterationCount: 0, messages: [], finishReason: null }), + ).toBe(true) + expect( + strategy({ iterationCount: 0, messages: [], finishReason: 'stop' }), + ).toBe(true) + expect( + strategy({ iterationCount: 0, messages: [], finishReason: 'length' }), + ).toBe(false) + }) +}) ``` ## Best Practices @@ -323,34 +338,37 @@ const stream = chat({ // Aggressive limits during development const devStrategy: AgentLoopStrategy = ({ iterationCount, messages }) => { if (iterationCount >= 2) { - console.warn("DEV: Stopping at 2 iterations"); - return false; + console.warn('DEV: Stopping at 2 iterations') + return false } if (messages.length >= 10) { - console.warn("DEV: Stopping at 10 messages"); - return false; + console.warn('DEV: Stopping at 10 messages') + return false } - return true; -}; + return true +} ``` ## Migration from maxIterations Before: + ```typescript chat({ ..., maxIterations: 10 }) ``` After: + ```typescript import { maxIterations } from "@tanstack/ai"; chat({ ..., agentLoopStrategy: maxIterations(10) }) ``` Or create a custom strategy: + ```typescript -chat({ - ..., +chat({ + ..., agentLoopStrategy: ({ iterationCount, messages }) => { return iterationCount < 10 && messages.length < 50; } @@ -362,4 +380,3 @@ chat({ - [Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) - [Unified Chat API](UNIFIED_CHAT_API.md) - [Quick Reference](UNIFIED_CHAT_QUICK_REFERENCE.md) - diff --git a/ai-docs/CONNECTION_ADAPTERS_GUIDE.md b/ai-docs/CONNECTION_ADAPTERS_GUIDE.md index 5ec8d6664..4b788be68 100644 --- a/ai-docs/CONNECTION_ADAPTERS_GUIDE.md +++ b/ai-docs/CONNECTION_ADAPTERS_GUIDE.md @@ -7,6 +7,7 @@ Connection adapters provide a flexible, pluggable way to connect `ChatClient` an ## Why Connection Adapters? **Before (Hardcoded):** + - ❌ Locked to HTTP fetch - ❌ Locked to specific API format - ❌ Hard to test @@ -14,6 +15,7 @@ Connection adapters provide a flexible, pluggable way to connect `ChatClient` an - ❌ Can't customize streaming logic **After (Adapters):** + - ✅ Support any streaming source - ✅ Easy to test with mocks - ✅ Works with server functions @@ -27,11 +29,13 @@ Connection adapters provide a flexible, pluggable way to connect `ChatClient` an **For:** HTTP APIs using Server-Sent Events format **When to use:** + - Your backend uses `toStreamResponse()` from `@tanstack/ai` - Standard HTTP streaming API - Most common use case **Example:** + ```typescript import { useChat, fetchServerSentEvents } from "@tanstack/ai-react"; @@ -42,12 +46,13 @@ function Chat() { credentials: "include", }), }); - + return ; } ``` **Server format expected:** + ``` data: {"type":"content","delta":"Hello","content":"Hello",...} data: {"type":"content","delta":" world","content":"Hello world",...} @@ -60,11 +65,13 @@ data: [DONE] **For:** HTTP APIs using raw newline-delimited JSON **When to use:** + - Your backend streams newline-delimited JSON directly - Custom streaming format - Not using SSE **Example:** + ```typescript import { useChat, fetchHttpStream } from "@tanstack/ai-react"; @@ -74,12 +81,13 @@ function Chat() { headers: { "X-Custom-Header": "value" }, }), }); - + return ; } ``` **Server format expected:** + ``` {"type":"content","delta":"Hello","content":"Hello",...} {"type":"content","delta":" world","content":"Hello world",...} @@ -91,57 +99,61 @@ function Chat() { **For:** Direct async iterables (no HTTP) **When to use:** + - TanStack Start server functions - Server-side rendering - Testing with mock streams - Direct function calls **Example with Server Function:** + ```typescript import { useChat, stream } from "@tanstack/ai-react"; import { serverChatFunction } from "./server"; function Chat() { const chat = useChat({ - connection: stream((messages, data) => + connection: stream((messages, data) => serverChatFunction({ messages, data }) ), }); - + return ; } ``` **Server function:** + ```typescript // server.ts -import { chat } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; +import { chat } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' -export async function* serverChatFunction({ - messages -}: { - messages: Message[] +export async function* serverChatFunction({ + messages, +}: { + messages: Message[] }) { yield* chat({ adapter: openai(), - model: "gpt-4o", + model: 'gpt-4o', messages, - }); + }) } ``` **Example with Mock for Testing:** + ```typescript -import { ChatClient, stream } from "@tanstack/ai-client"; +import { ChatClient, stream } from '@tanstack/ai-client' const mockStream = stream(async function* (messages) { - yield { type: "content", delta: "Hello", content: "Hello" }; - yield { type: "content", delta: " world", content: "Hello world" }; - yield { type: "done", finishReason: "stop" }; -}); + yield { type: 'content', delta: 'Hello', content: 'Hello' } + yield { type: 'content', delta: ' world', content: 'Hello world' } + yield { type: 'done', finishReason: 'stop' } +}) -const client = new ChatClient({ connection: mockStream }); +const client = new ChatClient({ connection: mockStream }) ``` ## Custom Adapters @@ -151,69 +163,69 @@ You can create custom connection adapters for any streaming scenario: ### WebSocket Example ```typescript -import type { ConnectionAdapter } from "@tanstack/ai-client"; -import type { StreamChunk } from "@tanstack/ai"; +import type { ConnectionAdapter } from '@tanstack/ai-client' +import type { StreamChunk } from '@tanstack/ai' function createWebSocketAdapter(url: string): ConnectionAdapter { - let ws: WebSocket | null = null; - + let ws: WebSocket | null = null + return { async *connect(messages, data) { - ws = new WebSocket(url); - + ws = new WebSocket(url) + // Wait for connection await new Promise((resolve, reject) => { - ws!.onopen = resolve; - ws!.onerror = reject; - }); - + ws!.onopen = resolve + ws!.onerror = reject + }) + // Send messages - ws.send(JSON.stringify({ messages, data })); - + ws.send(JSON.stringify({ messages, data })) + // Yield chunks as they arrive - const queue: StreamChunk[] = []; - let resolveNext: ((chunk: StreamChunk) => void) | null = null; - let done = false; - + const queue: StreamChunk[] = [] + let resolveNext: ((chunk: StreamChunk) => void) | null = null + let done = false + ws.onmessage = (event) => { - const chunk = JSON.parse(event.data); + const chunk = JSON.parse(event.data) if (resolveNext) { - resolveNext(chunk); - resolveNext = null; + resolveNext(chunk) + resolveNext = null } else { - queue.push(chunk); + queue.push(chunk) } - - if (chunk.type === "done") { - done = true; - ws!.close(); + + if (chunk.type === 'done') { + done = true + ws!.close() } - }; - + } + while (!done || queue.length > 0) { if (queue.length > 0) { - yield queue.shift()!; + yield queue.shift()! } else { yield await new Promise((resolve) => { - resolveNext = resolve; - }); + resolveNext = resolve + }) } } }, - + abort() { if (ws) { - ws.close(); - ws = null; + ws.close() + ws = null } }, - }; + } } // Use it const chat = useChat({ - connection: createWebSocketAdapter("wss://api.example.com/chat"), -}); + connection: createWebSocketAdapter('wss://api.example.com/chat'), +}) ``` ### GraphQL Subscription Example @@ -221,58 +233,58 @@ const chat = useChat({ ```typescript function createGraphQLSubscriptionAdapter( client: GraphQLClient, - subscription: string + subscription: string, ): ConnectionAdapter { - let unsubscribe: (() => void) | null = null; - + let unsubscribe: (() => void) | null = null + return { async *connect(messages, data) { const observable = client.subscribe({ query: subscription, variables: { messages, data }, - }); - - const queue: StreamChunk[] = []; - let resolveNext: ((chunk: StreamChunk) => void) | null = null; - let done = false; - + }) + + const queue: StreamChunk[] = [] + let resolveNext: ((chunk: StreamChunk) => void) | null = null + let done = false + unsubscribe = observable.subscribe({ next: (result) => { - const chunk = result.data.chatStream; + const chunk = result.data.chatStream if (resolveNext) { - resolveNext(chunk); - resolveNext = null; + resolveNext(chunk) + resolveNext = null } else { - queue.push(chunk); + queue.push(chunk) } - - if (chunk.type === "done") { - done = true; + + if (chunk.type === 'done') { + done = true } }, error: (error) => { - throw error; + throw error }, - }).unsubscribe; - + }).unsubscribe + while (!done || queue.length > 0) { if (queue.length > 0) { - yield queue.shift()!; + yield queue.shift()! } else { yield await new Promise((resolve) => { - resolveNext = resolve; - }); + resolveNext = resolve + }) } } }, - + abort() { if (unsubscribe) { - unsubscribe(); - unsubscribe = null; + unsubscribe() + unsubscribe = null } }, - }; + } } ``` @@ -282,22 +294,22 @@ function createGraphQLSubscriptionAdapter( ```typescript const chat = useChat({ - connection: fetchServerSentEvents("/api/chat"), -}); + connection: fetchServerSentEvents('/api/chat'), +}) ``` ### 2. Authenticated API ```typescript const chat = useChat({ - connection: fetchServerSentEvents("/api/chat", { + connection: fetchServerSentEvents('/api/chat', { headers: { - "Authorization": `Bearer ${token}`, - "X-User-ID": userId, + Authorization: `Bearer ${token}`, + 'X-User-ID': userId, }, - credentials: "include", + credentials: 'include', }), -}); +}) ``` ### 3. TanStack Start Server Function @@ -306,26 +318,26 @@ const chat = useChat({ // No HTTP overhead, direct function call const chat = useChat({ connection: stream((messages) => serverChat({ messages })), -}); +}) ``` ### 4. WebSocket Real-time ```typescript const chat = useChat({ - connection: createWebSocketAdapter("wss://api.example.com/chat"), -}); + connection: createWebSocketAdapter('wss://api.example.com/chat'), +}) ``` ### 5. Testing with Mocks ```typescript const mockAdapter = stream(async function* (messages) { - yield { type: "content", delta: "Test", content: "Test" }; - yield { type: "done", finishReason: "stop" }; -}); + yield { type: 'content', delta: 'Test', content: 'Test' } + yield { type: 'done', finishReason: 'stop' } +}) -const client = new ChatClient({ connection: mockAdapter }); +const client = new ChatClient({ connection: mockAdapter }) // Easy to test without real API! ``` @@ -334,6 +346,7 @@ const client = new ChatClient({ connection: mockAdapter }); ### 1. Flexibility Support any streaming source: + - ✅ HTTP (SSE or raw) - ✅ WebSockets - ✅ GraphQL subscriptions @@ -347,11 +360,11 @@ Easy to test with mock adapters: ```typescript const mockConnection = stream(async function* () { - yield { type: "content", delta: "Hello", content: "Hello" }; - yield { type: "done", finishReason: "stop" }; -}); + yield { type: 'content', delta: 'Hello', content: 'Hello' } + yield { type: 'done', finishReason: 'stop' } +}) -const client = new ChatClient({ connection: mockConnection }); +const client = new ChatClient({ connection: mockConnection }) ``` ### 3. Type Safety @@ -362,9 +375,9 @@ Full TypeScript support with proper types: interface ConnectionAdapter { connect( messages: any[], - data?: Record - ): AsyncIterable; - abort?(): void; + data?: Record, + ): AsyncIterable + abort?(): void } ``` @@ -376,7 +389,7 @@ Direct streams bypass HTTP overhead: // No HTTP serialization/deserialization const chat = useChat({ connection: stream((messages) => directServerFunction(messages)), -}); +}) ``` ## Advanced Examples @@ -386,76 +399,75 @@ const chat = useChat({ ```typescript function createRetryAdapter( baseAdapter: ConnectionAdapter, - maxRetries: number = 3 + maxRetries: number = 3, ): ConnectionAdapter { return { async *connect(messages, data) { - let lastError: Error | null = null; - + let lastError: Error | null = null + for (let attempt = 0; attempt < maxRetries; attempt++) { try { - yield* baseAdapter.connect(messages, data); - return; // Success + yield* baseAdapter.connect(messages, data) + return // Success } catch (error) { - lastError = error as Error; + lastError = error as Error if (attempt < maxRetries - 1) { - await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1))); + await new Promise((resolve) => + setTimeout(resolve, 1000 * (attempt + 1)), + ) } } } - - throw lastError; + + throw lastError }, - + abort() { - baseAdapter.abort?.(); + baseAdapter.abort?.() }, - }; + } } // Use it const chat = useChat({ - connection: createRetryAdapter( - fetchServerSentEvents("/api/chat"), - 3 - ), -}); + connection: createRetryAdapter(fetchServerSentEvents('/api/chat'), 3), +}) ``` ### Caching Adapter ```typescript function createCachingAdapter( - baseAdapter: ConnectionAdapter + baseAdapter: ConnectionAdapter, ): ConnectionAdapter { - const cache = new Map(); - + const cache = new Map() + return { async *connect(messages, data) { - const cacheKey = JSON.stringify(messages); - + const cacheKey = JSON.stringify(messages) + if (cache.has(cacheKey)) { // Replay from cache for (const chunk of cache.get(cacheKey)!) { - yield chunk; + yield chunk } - return; + return } - + // Cache chunks as they arrive - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of baseAdapter.connect(messages, data)) { - chunks.push(chunk); - yield chunk; + chunks.push(chunk) + yield chunk } - - cache.set(cacheKey, chunks); + + cache.set(cacheKey, chunks) }, - + abort() { - baseAdapter.abort?.(); + baseAdapter.abort?.() }, - }; + } } ``` @@ -464,38 +476,38 @@ function createCachingAdapter( ```typescript function createLoggingAdapter( baseAdapter: ConnectionAdapter, - logger: (message: string, data: any) => void + logger: (message: string, data: any) => void, ): ConnectionAdapter { return { async *connect(messages, data) { - logger("Connection started", { messages, data }); - + logger('Connection started', { messages, data }) + try { for await (const chunk of baseAdapter.connect(messages, data)) { - logger("Chunk received", chunk); - yield chunk; + logger('Chunk received', chunk) + yield chunk } - logger("Connection complete", {}); + logger('Connection complete', {}) } catch (error) { - logger("Connection error", error); - throw error; + logger('Connection error', error) + throw error } }, - + abort() { - logger("Connection aborted", {}); - baseAdapter.abort?.(); + logger('Connection aborted', {}) + baseAdapter.abort?.() }, - }; + } } // Use it const chat = useChat({ connection: createLoggingAdapter( - fetchServerSentEvents("/api/chat"), - console.log + fetchServerSentEvents('/api/chat'), + console.log, ), -}); +}) ``` ## Best Practices @@ -505,15 +517,17 @@ const chat = useChat({ ```typescript // ✅ Good - use built-in adapter const chat = useChat({ - connection: fetchServerSentEvents("/api/chat"), -}); + connection: fetchServerSentEvents('/api/chat'), +}) // ❌ Avoid - custom adapter for standard SSE const chat = useChat({ - connection: { - connect: async function* () { /* reimplementing SSE */ } + connection: { + connect: async function* () { + /* reimplementing SSE */ + }, }, -}); +}) ``` ### 2. Compose Adapters @@ -521,13 +535,10 @@ const chat = useChat({ ```typescript const chat = useChat({ connection: createLoggingAdapter( - createRetryAdapter( - fetchServerSentEvents("/api/chat"), - 3 - ), - console.log + createRetryAdapter(fetchServerSentEvents('/api/chat'), 3), + console.log, ), -}); +}) ``` ### 3. Handle Errors Gracefully @@ -536,16 +547,16 @@ const chat = useChat({ const connection: ConnectionAdapter = { async *connect(messages, data) { try { - yield* fetchServerSentEvents("/api/chat").connect(messages, data); + yield* fetchServerSentEvents('/api/chat').connect(messages, data) } catch (error) { // Emit error chunk instead of throwing yield { - type: "error", - error: { message: error.message, code: "CONNECTION_ERROR" }, - }; + type: 'error', + error: { message: error.message, code: 'CONNECTION_ERROR' }, + } } }, -}; +} ``` ### 4. Implement Abort Support @@ -556,37 +567,37 @@ function createCustomAdapter(url: string): ConnectionAdapter { async *connect(messages, data, abortSignal) { // Use the provided abortSignal from ChatClient const response = await fetch(url, { - method: "POST", + method: 'POST', body: JSON.stringify({ messages, data }), signal: abortSignal, // Pass abort signal to fetch - }); - - const reader = response.body?.getReader(); + }) + + const reader = response.body?.getReader() if (!reader) { - throw new Error("Response body is not readable"); + throw new Error('Response body is not readable') } try { - const decoder = new TextDecoder(); - + const decoder = new TextDecoder() + while (true) { // Check if aborted before reading if (abortSignal?.aborted) { - break; + break } - const { done, value } = await reader.read(); - if (done) break; + const { done, value } = await reader.read() + if (done) break // Process chunks... - const chunk = decoder.decode(value, { stream: true }); + const chunk = decoder.decode(value, { stream: true }) // Yield parsed chunks... } } finally { - reader.releaseLock(); + reader.releaseLock() } }, - }; + } } ``` @@ -595,52 +606,50 @@ function createCustomAdapter(url: string): ConnectionAdapter { ### Unit Testing ChatClient ```typescript -import { ChatClient, stream } from "@tanstack/ai-client"; -import { describe, it, expect } from "vitest"; +import { ChatClient, stream } from '@tanstack/ai-client' +import { describe, it, expect } from 'vitest' -describe("ChatClient with mock adapter", () => { - it("should process messages", async () => { +describe('ChatClient with mock adapter', () => { + it('should process messages', async () => { const mockAdapter = stream(async function* (messages) { - expect(messages).toHaveLength(1); - expect(messages[0].content).toBe("Hello"); - - yield { type: "content", delta: "Hi", content: "Hi" }; - yield { type: "done", finishReason: "stop" }; - }); - - const client = new ChatClient({ connection: mockAdapter }); - - await client.sendMessage("Hello"); - - expect(client.getMessages()).toHaveLength(2); - expect(client.getMessages()[1].content).toBe("Hi"); - }); -}); + expect(messages).toHaveLength(1) + expect(messages[0].content).toBe('Hello') + + yield { type: 'content', delta: 'Hi', content: 'Hi' } + yield { type: 'done', finishReason: 'stop' } + }) + + const client = new ChatClient({ connection: mockAdapter }) + + await client.sendMessage('Hello') + + expect(client.getMessages()).toHaveLength(2) + expect(client.getMessages()[1].content).toBe('Hi') + }) +}) ``` ### Integration Testing with React ```typescript -import { renderHook, waitFor } from "@testing-library/react"; -import { useChat, stream } from "@tanstack/ai-react"; +import { renderHook, waitFor } from '@testing-library/react' +import { useChat, stream } from '@tanstack/ai-react' -test("useChat with mock adapter", async () => { +test('useChat with mock adapter', async () => { const mockAdapter = stream(async function* () { - yield { type: "content", delta: "Test", content: "Test" }; - yield { type: "done", finishReason: "stop" }; - }); - - const { result } = renderHook(() => - useChat({ connection: mockAdapter }) - ); - - await result.current.sendMessage("Hello"); - + yield { type: 'content', delta: 'Test', content: 'Test' } + yield { type: 'done', finishReason: 'stop' } + }) + + const { result } = renderHook(() => useChat({ connection: mockAdapter })) + + await result.current.sendMessage('Hello') + await waitFor(() => { - expect(result.current.messages).toHaveLength(2); - expect(result.current.messages[1].content).toBe("Test"); - }); -}); + expect(result.current.messages).toHaveLength(2) + expect(result.current.messages[1].content).toBe('Test') + }) +}) ``` ## Reference @@ -657,13 +666,13 @@ interface ConnectionAdapter { */ connect( messages: any[], - data?: Record - ): AsyncIterable; - + data?: Record, + ): AsyncIterable + /** * Optional: Abort the current connection */ - abort?(): void; + abort?(): void } ``` @@ -671,9 +680,9 @@ interface ConnectionAdapter { ```typescript interface FetchConnectionOptions { - headers?: Record | Headers; - credentials?: RequestCredentials; // "omit" | "same-origin" | "include" - signal?: AbortSignal; + headers?: Record | Headers + credentials?: RequestCredentials // "omit" | "same-origin" | "include" + signal?: AbortSignal } ``` @@ -683,4 +692,3 @@ interface FetchConnectionOptions { - 📖 [useChat Hook](../packages/ai-react/README.md) - 📖 [Tool Execution Loop](TOOL_EXECUTION_LOOP.md) - 📖 [Connection Adapters Examples](../packages/ai-client/CONNECTION_ADAPTERS.md) - diff --git a/ai-docs/EVENT_CLIENT.md b/ai-docs/EVENT_CLIENT.md index d5a7d58e7..be9065a0c 100644 --- a/ai-docs/EVENT_CLIENT.md +++ b/ai-docs/EVENT_CLIENT.md @@ -1,405 +1,422 @@ -# AI Event Client - Observability & Debugging - -The `@tanstack/ai/event-client` provides a type-safe EventEmitter for monitoring and debugging AI operations in your application. - -## Installation - -The event client is included with `@tanstack/ai`: - -```bash -npm install @tanstack/ai -``` - -## Usage - -```typescript -import { aiEventClient } from '@tanstack/ai/event-client'; - -// Subscribe to events -aiEventClient.on('stream:content', (data) => { - console.log('Content delta:', data.delta); -}); - -aiEventClient.on('usage:tokens', (data) => { - console.log('Tokens used:', data.usage.totalTokens); -}); -``` - -## Available Events - -### Chat Lifecycle Events - -#### `chat:started` -Emitted when a chat completion or stream starts. - -```typescript -{ - timestamp: number; - model: string; - messageCount: number; - hasTools: boolean; - streaming: boolean; -} -``` - -#### `chat:completed` -Emitted when a non-streaming chat completion finishes. - -```typescript -{ - timestamp: number; - model: string; - result: ChatCompletionResult; - duration: number; -} -``` - -#### `chat:iteration` -Emitted when the AI makes another iteration (e.g., for tool calling). - -```typescript -{ - timestamp: number; - iteration: number; - reason: string; -} -``` - -### Stream Events - -#### `stream:started` -Emitted when a streaming response begins. - -```typescript -{ - timestamp: number; - messageId: string; -} -``` - -#### `stream:ended` -Emitted when a streaming response completes. - -```typescript -{ - timestamp: number; - messageId: string; - duration: number; -} -``` - -#### `stream:chunk` -Emitted for every stream chunk (includes all chunk types). - -```typescript -{ - timestamp: number; - messageId: string; - chunk: StreamChunk; -} -``` - -#### `stream:content` -Emitted for content delta chunks. - -```typescript -{ - timestamp: number; - messageId: string; - delta: string; -} -``` - -#### `stream:tool-call` -Emitted when a tool call is received. - -```typescript -{ - timestamp: number; - messageId: string; - toolCallId: string; - toolName: string; - arguments: string; -} -``` - -#### `stream:tool-result` -Emitted when a tool result is received. - -```typescript -{ - timestamp: number; - messageId: string; - toolCallId: string; - content: string; -} -``` - -#### `stream:done` -Emitted when the stream completes with finish reason and usage. - -```typescript -{ - timestamp: number; - messageId: string; - finishReason: string | null; - usage?: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; -} -``` - -#### `stream:error` -Emitted when a stream encounters an error. - -```typescript -{ - timestamp: number; - messageId: string; - error: { - message: string; - code?: string; - }; -} -``` - -### Tool Events - -#### `tool:approval-requested` -Emitted when a tool requires user approval before execution. - -```typescript -{ - timestamp: number; - messageId: string; - toolCallId: string; - toolName: string; - input: any; - approvalId: string; -} -``` - -#### `tool:input-available` -Emitted when a client-side tool has its input ready. - -```typescript -{ - timestamp: number; - messageId: string; - toolCallId: string; - toolName: string; - input: any; -} -``` - -#### `tool:completed` -Emitted when a tool execution completes. - -```typescript -{ - timestamp: number; - toolCallId: string; - toolName: string; - result: any; - duration: number; -} -``` - -### Token Usage Events - -#### `usage:tokens` -Emitted when token usage information is available (both streaming and non-streaming). - -```typescript -{ - timestamp: number; - messageId?: string; - model: string; - usage: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; -} -``` - -## Example Use Cases - -### 1. Token Usage Tracking & Cost Monitoring - -```typescript -import { aiEventClient } from '@tanstack/ai/event-client'; - -let totalTokens = 0; -let totalCost = 0; - -const costPerToken = { - 'gpt-4o': 0.00003, // $30 per 1M tokens - 'gpt-4o-mini': 0.00000015, // $0.15 per 1M tokens -}; - -aiEventClient.on('usage:tokens', (data) => { - totalTokens += data.usage.totalTokens; - const cost = (data.usage.totalTokens * (costPerToken[data.model] || 0)); - totalCost += cost; - - console.log({ - model: data.model, - tokens: data.usage.totalTokens, - cost: `$${cost.toFixed(6)}`, - totalCost: `$${totalCost.toFixed(6)}`, - }); -}); -``` - -### 2. Real-time Content Streaming Display - -```typescript -import { aiEventClient } from '@tanstack/ai/event-client'; - -process.stdout.write('AI: '); -aiEventClient.on('stream:content', (data) => { - process.stdout.write(data.delta); -}); - -aiEventClient.on('stream:done', () => { - process.stdout.write('\n'); -}); -``` - -### 3. Logging & Debugging - -```typescript -import { aiEventClient } from '@tanstack/ai/event-client'; -import winston from 'winston'; - -const logger = winston.createLogger({ - level: 'info', - format: winston.format.json(), - transports: [ - new winston.transports.File({ filename: 'ai-events.log' }), - ], -}); - -// Log all events -aiEventClient.on('chat:started', (data) => { - logger.info('Chat started', data); -}); - -aiEventClient.on('stream:error', (data) => { - logger.error('Stream error', data); -}); - -aiEventClient.on('usage:tokens', (data) => { - logger.info('Token usage', data); -}); -``` - -### 4. Performance Monitoring - -```typescript -import { aiEventClient } from '@tanstack/ai/event-client'; - -const chatMetrics = new Map(); - -aiEventClient.on('chat:started', (data) => { - chatMetrics.set(data.timestamp, { - startTime: data.timestamp, - model: data.model, - }); -}); - -aiEventClient.on('chat:completed', (data) => { - const metrics = Array.from(chatMetrics.values()).find( - m => m.model === data.model - ); - - if (metrics) { - console.log('Performance:', { - model: data.model, - duration: data.duration, - tokensPerSecond: data.result.usage.totalTokens / (data.duration / 1000), - }); - } -}); -``` - -### 5. Tool Execution Monitoring - -```typescript -import { aiEventClient } from '@tanstack/ai/event-client'; - -aiEventClient.on('tool:input-available', (data) => { - console.log(`[${data.toolName}] Called with:`, data.input); -}); - -aiEventClient.on('tool:completed', (data) => { - console.log(`[${data.toolName}] Completed in ${data.duration}ms`); - console.log('Result:', data.result); -}); - -aiEventClient.on('tool:approval-requested', (data) => { - console.log(`[${data.toolName}] Needs approval:`, data.input); -}); -``` - -## API Reference - -### `aiEventClient.on(event, listener)` -Subscribe to an event. - -```typescript -aiEventClient.on('stream:content', (data) => { - // Handle event -}); -``` - -### `aiEventClient.once(event, listener)` -Subscribe to an event once (automatically unsubscribes after first emission). - -```typescript -aiEventClient.once('chat:completed', (data) => { - console.log('First chat completed:', data); -}); -``` - -### `aiEventClient.off(event, listener)` -Unsubscribe from an event. - -```typescript -const handler = (data) => console.log(data); -aiEventClient.on('stream:content', handler); -// Later... -aiEventClient.off('stream:content', handler); -``` - -### `aiEventClient.removeAllListeners(event?)` -Remove all listeners for a specific event or all events. - -```typescript -// Remove all listeners for a specific event -aiEventClient.removeAllListeners('stream:content'); - -// Remove all listeners for all events -aiEventClient.removeAllListeners(); -``` - -## Type Safety - -The event client is fully type-safe. TypeScript will autocomplete event names and infer the correct data types for each event: - -```typescript -aiEventClient.on('usage:tokens', (data) => { - // TypeScript knows data has: timestamp, model, usage - const totalTokens = data.usage.totalTokens; // ✓ Type-safe -}); -``` - -## Notes - -- The event client uses Node.js `EventEmitter` under the hood -- Maximum listeners is set to 100 by default to prevent warnings in observability scenarios -- Events are emitted for both streaming and non-streaming operations -- All events include a `timestamp` field for tracking and analysis +# AI Event Client - Observability & Debugging + +The `@tanstack/ai/event-client` provides a type-safe EventEmitter for monitoring and debugging AI operations in your application. + +## Installation + +The event client is included with `@tanstack/ai`: + +```bash +npm install @tanstack/ai +``` + +## Usage + +```typescript +import { aiEventClient } from '@tanstack/ai/event-client' + +// Subscribe to events +aiEventClient.on('stream:content', (data) => { + console.log('Content delta:', data.delta) +}) + +aiEventClient.on('usage:tokens', (data) => { + console.log('Tokens used:', data.usage.totalTokens) +}) +``` + +## Available Events + +### Chat Lifecycle Events + +#### `chat:started` + +Emitted when a chat completion or stream starts. + +```typescript +{ + timestamp: number + model: string + messageCount: number + hasTools: boolean + streaming: boolean +} +``` + +#### `chat:completed` + +Emitted when a non-streaming chat completion finishes. + +```typescript +{ + timestamp: number + model: string + result: ChatCompletionResult + duration: number +} +``` + +#### `chat:iteration` + +Emitted when the AI makes another iteration (e.g., for tool calling). + +```typescript +{ + timestamp: number + iteration: number + reason: string +} +``` + +### Stream Events + +#### `stream:started` + +Emitted when a streaming response begins. + +```typescript +{ + timestamp: number + messageId: string +} +``` + +#### `stream:ended` + +Emitted when a streaming response completes. + +```typescript +{ + timestamp: number + messageId: string + duration: number +} +``` + +#### `stream:chunk` + +Emitted for every stream chunk (includes all chunk types). + +```typescript +{ + timestamp: number + messageId: string + chunk: StreamChunk +} +``` + +#### `stream:content` + +Emitted for content delta chunks. + +```typescript +{ + timestamp: number + messageId: string + delta: string +} +``` + +#### `stream:tool-call` + +Emitted when a tool call is received. + +```typescript +{ + timestamp: number + messageId: string + toolCallId: string + toolName: string + arguments: string +} +``` + +#### `stream:tool-result` + +Emitted when a tool result is received. + +```typescript +{ + timestamp: number + messageId: string + toolCallId: string + content: string +} +``` + +#### `stream:done` + +Emitted when the stream completes with finish reason and usage. + +```typescript +{ + timestamp: number; + messageId: string; + finishReason: string | null; + usage?: { + promptTokens: number; + completionTokens: number; + totalTokens: number; + }; +} +``` + +#### `stream:error` + +Emitted when a stream encounters an error. + +```typescript +{ + timestamp: number; + messageId: string; + error: { + message: string; + code?: string; + }; +} +``` + +### Tool Events + +#### `tool:approval-requested` + +Emitted when a tool requires user approval before execution. + +```typescript +{ + timestamp: number + messageId: string + toolCallId: string + toolName: string + input: any + approvalId: string +} +``` + +#### `tool:input-available` + +Emitted when a client-side tool has its input ready. + +```typescript +{ + timestamp: number + messageId: string + toolCallId: string + toolName: string + input: any +} +``` + +#### `tool:completed` + +Emitted when a tool execution completes. + +```typescript +{ + timestamp: number + toolCallId: string + toolName: string + result: any + duration: number +} +``` + +### Token Usage Events + +#### `usage:tokens` + +Emitted when token usage information is available (both streaming and non-streaming). + +```typescript +{ + timestamp: number; + messageId?: string; + model: string; + usage: { + promptTokens: number; + completionTokens: number; + totalTokens: number; + }; +} +``` + +## Example Use Cases + +### 1. Token Usage Tracking & Cost Monitoring + +```typescript +import { aiEventClient } from '@tanstack/ai/event-client' + +let totalTokens = 0 +let totalCost = 0 + +const costPerToken = { + 'gpt-4o': 0.00003, // $30 per 1M tokens + 'gpt-4o-mini': 0.00000015, // $0.15 per 1M tokens +} + +aiEventClient.on('usage:tokens', (data) => { + totalTokens += data.usage.totalTokens + const cost = data.usage.totalTokens * (costPerToken[data.model] || 0) + totalCost += cost + + console.log({ + model: data.model, + tokens: data.usage.totalTokens, + cost: `$${cost.toFixed(6)}`, + totalCost: `$${totalCost.toFixed(6)}`, + }) +}) +``` + +### 2. Real-time Content Streaming Display + +```typescript +import { aiEventClient } from '@tanstack/ai/event-client' + +process.stdout.write('AI: ') +aiEventClient.on('stream:content', (data) => { + process.stdout.write(data.delta) +}) + +aiEventClient.on('stream:done', () => { + process.stdout.write('\n') +}) +``` + +### 3. Logging & Debugging + +```typescript +import { aiEventClient } from '@tanstack/ai/event-client' +import winston from 'winston' + +const logger = winston.createLogger({ + level: 'info', + format: winston.format.json(), + transports: [new winston.transports.File({ filename: 'ai-events.log' })], +}) + +// Log all events +aiEventClient.on('chat:started', (data) => { + logger.info('Chat started', data) +}) + +aiEventClient.on('stream:error', (data) => { + logger.error('Stream error', data) +}) + +aiEventClient.on('usage:tokens', (data) => { + logger.info('Token usage', data) +}) +``` + +### 4. Performance Monitoring + +```typescript +import { aiEventClient } from '@tanstack/ai/event-client' + +const chatMetrics = new Map() + +aiEventClient.on('chat:started', (data) => { + chatMetrics.set(data.timestamp, { + startTime: data.timestamp, + model: data.model, + }) +}) + +aiEventClient.on('chat:completed', (data) => { + const metrics = Array.from(chatMetrics.values()).find( + (m) => m.model === data.model, + ) + + if (metrics) { + console.log('Performance:', { + model: data.model, + duration: data.duration, + tokensPerSecond: data.result.usage.totalTokens / (data.duration / 1000), + }) + } +}) +``` + +### 5. Tool Execution Monitoring + +```typescript +import { aiEventClient } from '@tanstack/ai/event-client' + +aiEventClient.on('tool:input-available', (data) => { + console.log(`[${data.toolName}] Called with:`, data.input) +}) + +aiEventClient.on('tool:completed', (data) => { + console.log(`[${data.toolName}] Completed in ${data.duration}ms`) + console.log('Result:', data.result) +}) + +aiEventClient.on('tool:approval-requested', (data) => { + console.log(`[${data.toolName}] Needs approval:`, data.input) +}) +``` + +## API Reference + +### `aiEventClient.on(event, listener)` + +Subscribe to an event. + +```typescript +aiEventClient.on('stream:content', (data) => { + // Handle event +}) +``` + +### `aiEventClient.once(event, listener)` + +Subscribe to an event once (automatically unsubscribes after first emission). + +```typescript +aiEventClient.once('chat:completed', (data) => { + console.log('First chat completed:', data) +}) +``` + +### `aiEventClient.off(event, listener)` + +Unsubscribe from an event. + +```typescript +const handler = (data) => console.log(data) +aiEventClient.on('stream:content', handler) +// Later... +aiEventClient.off('stream:content', handler) +``` + +### `aiEventClient.removeAllListeners(event?)` + +Remove all listeners for a specific event or all events. + +```typescript +// Remove all listeners for a specific event +aiEventClient.removeAllListeners('stream:content') + +// Remove all listeners for all events +aiEventClient.removeAllListeners() +``` + +## Type Safety + +The event client is fully type-safe. TypeScript will autocomplete event names and infer the correct data types for each event: + +```typescript +aiEventClient.on('usage:tokens', (data) => { + // TypeScript knows data has: timestamp, model, usage + const totalTokens = data.usage.totalTokens // ✓ Type-safe +}) +``` + +## Notes + +- The event client uses Node.js `EventEmitter` under the hood +- Maximum listeners is set to 100 by default to prevent warnings in observability scenarios +- Events are emitted for both streaming and non-streaming operations +- All events include a `timestamp` field for tracking and analysis diff --git a/ai-docs/EVENT_CLIENT_INTEGRATION.md b/ai-docs/EVENT_CLIENT_INTEGRATION.md index aa4bc9218..48fac56d4 100644 --- a/ai-docs/EVENT_CLIENT_INTEGRATION.md +++ b/ai-docs/EVENT_CLIENT_INTEGRATION.md @@ -1,101 +1,105 @@ -# AI Event Client Integration Example - -This example demonstrates how the event client automatically captures events from AI operations. - -## Usage - -```typescript -import { aiEventClient } from '@tanstack/ai/event-client'; -import { chat } from '@tanstack/ai'; -import { openai } from '@tanstack/ai-openai'; - -// Set up event listeners BEFORE making AI calls -aiEventClient.on('usage:tokens', (data) => { - console.log(`Tokens used: ${data.usage.totalTokens}`); -}); - -aiEventClient.on('stream:content', (data) => { - process.stdout.write(data.delta); -}); - -// Now make AI calls - events will be automatically emitted -const adapter = openai({ apiKey: process.env.OPENAI_API_KEY! }); - -const stream = chat({ - adapter, - model: 'gpt-4o', - messages: [{ role: 'user', content: 'Hello!' }], -}); - -for await (const chunk of stream) { - // Events are automatically emitted during streaming - // No need to manually emit anything -} -``` - -## How It Works - -1. The `aiEventClient` is a singleton EventEmitter that's automatically used by the AI core -2. When you call `chat()` or `chatCompletion()`, the AI core emits events to the client -3. Your event listeners receive these events in real-time -4. No configuration needed - just import and listen! - -## Event Flow - -``` -chat() called - ↓ -chat:started event - ↓ -stream:started event - ↓ -stream:content events (multiple) -stream:tool-call events (if tools used) -stream:done event - ↓ -usage:tokens event - ↓ -stream:ended event -``` - -## Common Patterns - -### Pattern 1: Real-time Content Display -```typescript -aiEventClient.on('stream:content', (data) => { - document.getElementById('output').textContent += data.delta; -}); -``` - -### Pattern 2: Token Usage Tracking -```typescript -let totalCost = 0; -aiEventClient.on('usage:tokens', (data) => { - const cost = data.usage.totalTokens * 0.00003; // Example cost - totalCost += cost; - console.log(`Cost: $${cost.toFixed(6)}, Total: $${totalCost.toFixed(6)}`); -}); -``` - -### Pattern 3: Error Handling -```typescript -aiEventClient.on('stream:error', (data) => { - console.error('AI Error:', data.error.message); - // Show error to user -}); -``` - -### Pattern 4: Tool Monitoring -```typescript -aiEventClient.on('tool:completed', (data) => { - console.log(`Tool ${data.toolName} completed in ${data.duration}ms`); -}); -``` - -## Benefits - -- ✅ **Zero Configuration**: Works automatically with all AI operations -- ✅ **Type-Safe**: Full TypeScript support with event type inference -- ✅ **Decoupled**: Observability doesn't affect your core AI logic -- ✅ **Flexible**: Subscribe to only the events you need -- ✅ **Performance**: Minimal overhead, designed for production use +# AI Event Client Integration Example + +This example demonstrates how the event client automatically captures events from AI operations. + +## Usage + +```typescript +import { aiEventClient } from '@tanstack/ai/event-client' +import { chat } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' + +// Set up event listeners BEFORE making AI calls +aiEventClient.on('usage:tokens', (data) => { + console.log(`Tokens used: ${data.usage.totalTokens}`) +}) + +aiEventClient.on('stream:content', (data) => { + process.stdout.write(data.delta) +}) + +// Now make AI calls - events will be automatically emitted +const adapter = openai({ apiKey: process.env.OPENAI_API_KEY! }) + +const stream = chat({ + adapter, + model: 'gpt-4o', + messages: [{ role: 'user', content: 'Hello!' }], +}) + +for await (const chunk of stream) { + // Events are automatically emitted during streaming + // No need to manually emit anything +} +``` + +## How It Works + +1. The `aiEventClient` is a singleton EventEmitter that's automatically used by the AI core +2. When you call `chat()` or `chatCompletion()`, the AI core emits events to the client +3. Your event listeners receive these events in real-time +4. No configuration needed - just import and listen! + +## Event Flow + +``` +chat() called + ↓ +chat:started event + ↓ +stream:started event + ↓ +stream:content events (multiple) +stream:tool-call events (if tools used) +stream:done event + ↓ +usage:tokens event + ↓ +stream:ended event +``` + +## Common Patterns + +### Pattern 1: Real-time Content Display + +```typescript +aiEventClient.on('stream:content', (data) => { + document.getElementById('output').textContent += data.delta +}) +``` + +### Pattern 2: Token Usage Tracking + +```typescript +let totalCost = 0 +aiEventClient.on('usage:tokens', (data) => { + const cost = data.usage.totalTokens * 0.00003 // Example cost + totalCost += cost + console.log(`Cost: $${cost.toFixed(6)}, Total: $${totalCost.toFixed(6)}`) +}) +``` + +### Pattern 3: Error Handling + +```typescript +aiEventClient.on('stream:error', (data) => { + console.error('AI Error:', data.error.message) + // Show error to user +}) +``` + +### Pattern 4: Tool Monitoring + +```typescript +aiEventClient.on('tool:completed', (data) => { + console.log(`Tool ${data.toolName} completed in ${data.duration}ms`) +}) +``` + +## Benefits + +- ✅ **Zero Configuration**: Works automatically with all AI operations +- ✅ **Type-Safe**: Full TypeScript support with event type inference +- ✅ **Decoupled**: Observability doesn't affect your core AI logic +- ✅ **Flexible**: Subscribe to only the events you need +- ✅ **Performance**: Minimal overhead, designed for production use diff --git a/ai-docs/IMPLEMENTATION_SUMMARY.md b/ai-docs/IMPLEMENTATION_SUMMARY.md index feccf9030..92abc0ef1 100644 --- a/ai-docs/IMPLEMENTATION_SUMMARY.md +++ b/ai-docs/IMPLEMENTATION_SUMMARY.md @@ -1,431 +1,435 @@ -# Implementation Summary: Type-Safe Multi-Adapter with Fallback - -## Overview - -This implementation adds two major features to the AI SDK: - -1. **Type-Safe Model Validation** - Models are validated against the selected adapter at compile-time -2. **Automatic Adapter Fallback** - Automatically tries multiple adapters in order when one fails - -## Key Features - -### ✅ Type Safety - -- Model names are validated based on the selected adapter -- Adapter names are type-checked -- Full IDE autocomplete support -- Compile-time error detection - -### ✅ Fallback System - -- Global fallback order configuration in constructor -- Per-request fallback order override -- Automatic retry on errors, rate limits, or service outages -- Detailed error reporting from all failed adapters -- Works with all methods (chat, stream, generate, summarize, embed) - -## Tool Execution Architecture - -The `chat()` method includes an automatic tool execution loop implemented via the `ToolCallManager` class: - -```typescript -// In AI.chat() method -const toolCallManager = new ToolCallManager(tools || []); - -while (iterationCount < maxIterations) { - // Stream chunks and accumulate tool calls - for await (const chunk of adapter.chatStream()) { - if (chunk.type === "tool_call") { - toolCallManager.addToolCallChunk(chunk); - } - } - - // Execute tools if model requested them - if (shouldExecuteTools && toolCallManager.hasToolCalls()) { - const toolResults = yield* toolCallManager.executeTools(doneChunk); - messages = [...messages, ...toolResults]; - continue; // Next iteration - } - - break; // No tools to execute, done -} -``` - -**ToolCallManager handles:** -- ✅ Accumulating streaming tool call chunks -- ✅ Validating tool calls (ID and name present) -- ✅ Executing tool `execute` functions -- ✅ Yielding `tool_result` chunks -- ✅ Creating tool result messages - -## Architecture - -### Type System - -```typescript -// Adapter map with typed models -type AdapterMap = Record>; - -// Extract model types from adapter -type ExtractModels = T extends AIAdapter ? M[number] : string; - -// Single adapter mode: strict model validation -type ChatOptionsWithAdapter = { - adapter: K; - model: ExtractModels; // Models for this adapter only -}; - -// Fallback mode: union of all models -type ChatOptionsWithFallback = { - adapters: ReadonlyArray; - model: UnionOfModels; // Models from any adapter -}; -``` - -### Core Components - -1. **BaseAdapter** - Abstract class with generic model list -2. **AIAdapter Interface** - Includes `models` property with generic type -3. **AI Class** - Main class with fallback logic and tool execution loop -4. **ToolCallManager** - Handles tool call accumulation, validation, and execution -5. **Adapter Implementations** - OpenAI, Anthropic, Gemini, Ollama with model lists - -### Fallback Logic - -```typescript -private async tryWithFallback( - adapters: ReadonlyArray, - operation: (adapter: keyof T & string) => Promise, - operationName: string -): Promise { - const errors: Array<{ adapter: string; error: Error }> = []; - - for (const adapterName of adapters) { - try { - return await operation(adapterName); // Try operation - } catch (error: any) { - errors.push({ adapter: adapterName, error }); // Record error - console.warn(`[AI] Adapter "${adapterName}" failed for ${operationName}`); - } - } - - // All failed - throw comprehensive error - throw new Error(`All adapters failed for ${operationName}:\n${errorDetails}`); -} -``` - -## API Design - -### Constructor - -```typescript -const ai = new AI({ - adapters: { - primary: new OpenAIAdapter({ apiKey: "..." }), - secondary: new AnthropicAdapter({ apiKey: "..." }), - }, - fallbackOrder: ["primary", "secondary"], // Optional global order -}); -``` - -### Single Adapter Mode (Strict Type Safety) - -```typescript -await ai.chat({ - adapter: "primary", // Type-safe: must exist in adapters - model: "gpt-4", // Type-safe: must be valid for primary - messages: [...], -}); -``` - -### Fallback Mode (Automatic Retry) - -```typescript -await ai.chat({ - adapters: ["primary", "secondary"], // Type-safe: all must exist - model: "gpt-4", // Must work with at least one adapter - messages: [...], -}); -``` - -## Files Modified - -### Core Package (`packages/ai/src/`) - -- **`ai.ts`** - Main AI class with fallback logic -- **`base-adapter.ts`** - Added generic models property -- **`types.ts`** - Added models to AIAdapter interface - -### Adapter Packages - -- **`packages/ai-openai/src/openai-adapter.ts`** - Added OpenAI model list -- **`packages/ai-anthropic/src/anthropic-adapter.ts`** - Added Anthropic model list -- **`packages/ai-gemini/src/gemini-adapter.ts`** - Added Gemini model list -- **`packages/ai-ollama/src/ollama-adapter.ts`** - Added Ollama model list - -### Documentation - -- **`docs/TYPE_SAFETY.md`** - Complete type safety guide -- **`docs/ADAPTER_FALLBACK.md`** - Complete fallback guide -- **`docs/QUICK_START.md`** - Quick reference for both features - -### Examples - -- **`examples/type-safety-demo.ts`** - Type safety examples -- **`examples/visual-error-examples.ts`** - Shows exact TypeScript errors -- **`examples/model-safety-demo.ts`** - Comprehensive type safety examples -- **`examples/adapter-fallback-demo.ts`** - Comprehensive fallback examples -- **`examples/all-adapters-type-safety.ts`** - All adapters together - -## Usage Examples - -### Example 1: Type Safety Only - -```typescript -const ai = new AI({ - adapters: { - openai: new OpenAIAdapter({ apiKey: "..." }), - }, -}); - -// ✅ Valid -await ai.chat({ adapter: "openai", model: "gpt-4", messages: [] }); - -// ❌ TypeScript Error -await ai.chat({ adapter: "openai", model: "claude-3", messages: [] }); -``` - -### Example 2: Fallback Only - -```typescript -const ai = new AI({ - adapters: { - primary: new OpenAIAdapter({ apiKey: "..." }), - backup: new AnthropicAdapter({ apiKey: "..." }), - }, - fallbackOrder: ["primary", "backup"], -}); - -// Automatically tries backup if primary fails -await ai.chat({ adapters: [], model: "gpt-4", messages: [] }); -``` - -### Example 3: Combined Usage - -```typescript -const ai = new AI({ - adapters: { - fast: new OpenAIAdapter({ apiKey: "..." }), - reliable: new AnthropicAdapter({ apiKey: "..." }), - }, - fallbackOrder: ["fast", "reliable"], -}); - -// Single adapter: strict type safety -await ai.chat({ - adapter: "fast", - model: "gpt-4", // ✅ Validated against fast adapter - messages: [] -}); - -// Fallback mode: automatic retry -await ai.chat({ - adapters: ["fast", "reliable"], - model: "gpt-4", // ⚠️ Less strict, but has fallback - messages: [] -}); -``` - -## Benefits - -### For Developers - -1. **Catch Errors Early** - Model mismatches caught at compile-time, not runtime -2. **Better IDE Experience** - Autocomplete shows only valid models per adapter -3. **Refactoring Safety** - Changing adapters immediately shows model incompatibilities -4. **Self-Documenting** - Types show exactly what's available - -### For Applications - -1. **Higher Reliability** - Automatic failover on service outages -2. **Rate Limit Protection** - Seamlessly switch to backup on rate limits -3. **Cost Optimization** - Try cheaper options first, fall back to expensive ones -4. **Better Observability** - Detailed error logs from all failed attempts - -## Trade-offs - -### Type Safety vs Flexibility - -- **Single adapter mode**: Maximum type safety, no fallback -- **Fallback mode**: Less strict types, automatic retry - -**Recommendation**: Use single adapter mode when possible, fallback mode when reliability is critical. - -### Model Compatibility - -In fallback mode, TypeScript allows any model from any adapter. This is necessary for flexibility but means you must ensure the model works with at least one adapter in your list. - -**Solution**: Define model mappings per adapter for strict control. - -## Migration Path - -### Existing Code (Single Adapter) - -```typescript -// Before -const ai = new AI(new OpenAIAdapter({ apiKey: "..." })); -await ai.chat("gpt-4", messages); - -// After (backwards compatible) -const ai = new AI({ - adapters: { openai: new OpenAIAdapter({ apiKey: "..." }) } -}); -await ai.chat({ adapter: "openai", model: "gpt-4", messages }); -``` - -### Adding Fallback - -```typescript -// Step 1: Add more adapters -const ai = new AI({ - adapters: { - openai: new OpenAIAdapter({ apiKey: "..." }), - anthropic: new AnthropicAdapter({ apiKey: "..." }), // New! - }, -}); - -// Step 2: Use fallback mode -await ai.chat({ - adapters: ["openai", "anthropic"], // Fallback enabled - model: "gpt-4", - messages: [], -}); - -// Step 3: Configure global fallback (optional) -const ai = new AI({ - adapters: { /* ... */ }, - fallbackOrder: ["openai", "anthropic"], // Global default -}); - -await ai.chat({ adapters: [], model: "gpt-4", messages: [] }); -``` - -## Testing Recommendations - -### Test Type Safety - -```typescript -// These should NOT compile -ai.chat({ adapter: "openai", model: "claude-3", messages: [] }); // ❌ -ai.chat({ adapter: "invalid", model: "gpt-4", messages: [] }); // ❌ -ai.chat({ adapter: "openai", model: "gpt-5", messages: [] }); // ❌ -``` - -### Test Fallback Behavior - -```typescript -// Mock adapters to simulate failures -const mockAdapter1 = { - chatCompletion: jest.fn().mockRejectedValue(new Error("Rate limit")), -}; -const mockAdapter2 = { - chatCompletion: jest.fn().mockResolvedValue({ content: "Success" }), -}; - -const ai = new AI({ - adapters: { first: mockAdapter1, second: mockAdapter2 }, - fallbackOrder: ["first", "second"], -}); - -// Should try first, fail, then succeed with second -await ai.chat({ adapters: [], model: "gpt-4", messages: [] }); - -expect(mockAdapter1.chatCompletion).toHaveBeenCalled(); -expect(mockAdapter2.chatCompletion).toHaveBeenCalled(); -``` - -### Test ToolCallManager - -The `ToolCallManager` class has comprehensive unit tests: - -```bash -cd packages/ai -pnpm test -``` - -Test coverage includes: -- ✅ Accumulating streaming tool call chunks (name, arguments) -- ✅ Filtering incomplete tool calls (missing ID or name) -- ✅ Executing tools with parsed arguments -- ✅ Handling tool execution errors gracefully -- ✅ Handling tools without execute functions -- ✅ Multiple tool calls in one iteration -- ✅ Clearing state between iterations -- ✅ Emitting tool_result chunks -- ✅ Creating tool result messages - -See `packages/ai/src/tool-call-manager.test.ts` for implementation. - -## Performance Considerations - -### Single Adapter Mode - -- **No overhead** - Direct call to adapter -- **Fast failure** - Error thrown immediately - -### Fallback Mode - -- **Sequential retry** - Tries each adapter in order -- **Additional latency** - On failure, waits for timeout before trying next -- **More robust** - Higher chance of success - -**Recommendation**: Use single adapter mode for performance-critical paths, fallback mode for user-facing features where reliability matters. - -## Future Enhancements - -### Possible Additions - -1. **Parallel fallback** - Try multiple adapters simultaneously -2. **Smart routing** - Choose adapter based on request characteristics -3. **Caching** - Remember which adapter succeeded for similar requests -4. **Circuit breaker** - Skip known-failing adapters temporarily -5. **Metrics** - Track success rate, latency per adapter -6. **Weighted fallback** - Probabilistic adapter selection - -### Extensibility - -The system is designed to be extended: - -```typescript -// Custom adapter with type-safe models -const MY_MODELS = ["model-1", "model-2"] as const; - -class MyAdapter extends BaseAdapter { - name = "my-adapter"; - models = MY_MODELS; - // ... implement methods -} - -// Use with full type safety -const ai = new AI({ - adapters: { mine: new MyAdapter() }, -}); - -await ai.chat({ - adapter: "mine", - model: "model-1", // ✅ Type-safe - messages: [], -}); -``` - -## Conclusion - -This implementation provides: - -- ✅ **Compile-time safety** for model selection -- ✅ **Runtime reliability** with automatic fallback -- ✅ **Developer experience** improvements (autocomplete, error messages) -- ✅ **Production readiness** (error handling, logging) -- ✅ **Extensibility** for future enhancements - -The combination of type safety and fallback makes the SDK both safer and more reliable, suitable for production use cases where uptime and correctness are critical. +# Implementation Summary: Type-Safe Multi-Adapter with Fallback + +## Overview + +This implementation adds two major features to the AI SDK: + +1. **Type-Safe Model Validation** - Models are validated against the selected adapter at compile-time +2. **Automatic Adapter Fallback** - Automatically tries multiple adapters in order when one fails + +## Key Features + +### ✅ Type Safety + +- Model names are validated based on the selected adapter +- Adapter names are type-checked +- Full IDE autocomplete support +- Compile-time error detection + +### ✅ Fallback System + +- Global fallback order configuration in constructor +- Per-request fallback order override +- Automatic retry on errors, rate limits, or service outages +- Detailed error reporting from all failed adapters +- Works with all methods (chat, stream, generate, summarize, embed) + +## Tool Execution Architecture + +The `chat()` method includes an automatic tool execution loop implemented via the `ToolCallManager` class: + +```typescript +// In AI.chat() method +const toolCallManager = new ToolCallManager(tools || []) + +while (iterationCount < maxIterations) { + // Stream chunks and accumulate tool calls + for await (const chunk of adapter.chatStream()) { + if (chunk.type === 'tool_call') { + toolCallManager.addToolCallChunk(chunk) + } + } + + // Execute tools if model requested them + if (shouldExecuteTools && toolCallManager.hasToolCalls()) { + const toolResults = yield * toolCallManager.executeTools(doneChunk) + messages = [...messages, ...toolResults] + continue // Next iteration + } + + break // No tools to execute, done +} +``` + +**ToolCallManager handles:** + +- ✅ Accumulating streaming tool call chunks +- ✅ Validating tool calls (ID and name present) +- ✅ Executing tool `execute` functions +- ✅ Yielding `tool_result` chunks +- ✅ Creating tool result messages + +## Architecture + +### Type System + +```typescript +// Adapter map with typed models +type AdapterMap = Record> + +// Extract model types from adapter +type ExtractModels = T extends AIAdapter ? M[number] : string + +// Single adapter mode: strict model validation +type ChatOptionsWithAdapter = { + adapter: K + model: ExtractModels // Models for this adapter only +} + +// Fallback mode: union of all models +type ChatOptionsWithFallback = { + adapters: ReadonlyArray + model: UnionOfModels // Models from any adapter +} +``` + +### Core Components + +1. **BaseAdapter** - Abstract class with generic model list +2. **AIAdapter Interface** - Includes `models` property with generic type +3. **AI Class** - Main class with fallback logic and tool execution loop +4. **ToolCallManager** - Handles tool call accumulation, validation, and execution +5. **Adapter Implementations** - OpenAI, Anthropic, Gemini, Ollama with model lists + +### Fallback Logic + +```typescript +private async tryWithFallback( + adapters: ReadonlyArray, + operation: (adapter: keyof T & string) => Promise, + operationName: string +): Promise { + const errors: Array<{ adapter: string; error: Error }> = []; + + for (const adapterName of adapters) { + try { + return await operation(adapterName); // Try operation + } catch (error: any) { + errors.push({ adapter: adapterName, error }); // Record error + console.warn(`[AI] Adapter "${adapterName}" failed for ${operationName}`); + } + } + + // All failed - throw comprehensive error + throw new Error(`All adapters failed for ${operationName}:\n${errorDetails}`); +} +``` + +## API Design + +### Constructor + +```typescript +const ai = new AI({ + adapters: { + primary: new OpenAIAdapter({ apiKey: '...' }), + secondary: new AnthropicAdapter({ apiKey: '...' }), + }, + fallbackOrder: ['primary', 'secondary'], // Optional global order +}) +``` + +### Single Adapter Mode (Strict Type Safety) + +```typescript +await ai.chat({ + adapter: "primary", // Type-safe: must exist in adapters + model: "gpt-4", // Type-safe: must be valid for primary + messages: [...], +}); +``` + +### Fallback Mode (Automatic Retry) + +```typescript +await ai.chat({ + adapters: ["primary", "secondary"], // Type-safe: all must exist + model: "gpt-4", // Must work with at least one adapter + messages: [...], +}); +``` + +## Files Modified + +### Core Package (`packages/ai/src/`) + +- **`ai.ts`** - Main AI class with fallback logic +- **`base-adapter.ts`** - Added generic models property +- **`types.ts`** - Added models to AIAdapter interface + +### Adapter Packages + +- **`packages/ai-openai/src/openai-adapter.ts`** - Added OpenAI model list +- **`packages/ai-anthropic/src/anthropic-adapter.ts`** - Added Anthropic model list +- **`packages/ai-gemini/src/gemini-adapter.ts`** - Added Gemini model list +- **`packages/ai-ollama/src/ollama-adapter.ts`** - Added Ollama model list + +### Documentation + +- **`docs/TYPE_SAFETY.md`** - Complete type safety guide +- **`docs/ADAPTER_FALLBACK.md`** - Complete fallback guide +- **`docs/QUICK_START.md`** - Quick reference for both features + +### Examples + +- **`examples/type-safety-demo.ts`** - Type safety examples +- **`examples/visual-error-examples.ts`** - Shows exact TypeScript errors +- **`examples/model-safety-demo.ts`** - Comprehensive type safety examples +- **`examples/adapter-fallback-demo.ts`** - Comprehensive fallback examples +- **`examples/all-adapters-type-safety.ts`** - All adapters together + +## Usage Examples + +### Example 1: Type Safety Only + +```typescript +const ai = new AI({ + adapters: { + openai: new OpenAIAdapter({ apiKey: '...' }), + }, +}) + +// ✅ Valid +await ai.chat({ adapter: 'openai', model: 'gpt-4', messages: [] }) + +// ❌ TypeScript Error +await ai.chat({ adapter: 'openai', model: 'claude-3', messages: [] }) +``` + +### Example 2: Fallback Only + +```typescript +const ai = new AI({ + adapters: { + primary: new OpenAIAdapter({ apiKey: '...' }), + backup: new AnthropicAdapter({ apiKey: '...' }), + }, + fallbackOrder: ['primary', 'backup'], +}) + +// Automatically tries backup if primary fails +await ai.chat({ adapters: [], model: 'gpt-4', messages: [] }) +``` + +### Example 3: Combined Usage + +```typescript +const ai = new AI({ + adapters: { + fast: new OpenAIAdapter({ apiKey: '...' }), + reliable: new AnthropicAdapter({ apiKey: '...' }), + }, + fallbackOrder: ['fast', 'reliable'], +}) + +// Single adapter: strict type safety +await ai.chat({ + adapter: 'fast', + model: 'gpt-4', // ✅ Validated against fast adapter + messages: [], +}) + +// Fallback mode: automatic retry +await ai.chat({ + adapters: ['fast', 'reliable'], + model: 'gpt-4', // ⚠️ Less strict, but has fallback + messages: [], +}) +``` + +## Benefits + +### For Developers + +1. **Catch Errors Early** - Model mismatches caught at compile-time, not runtime +2. **Better IDE Experience** - Autocomplete shows only valid models per adapter +3. **Refactoring Safety** - Changing adapters immediately shows model incompatibilities +4. **Self-Documenting** - Types show exactly what's available + +### For Applications + +1. **Higher Reliability** - Automatic failover on service outages +2. **Rate Limit Protection** - Seamlessly switch to backup on rate limits +3. **Cost Optimization** - Try cheaper options first, fall back to expensive ones +4. **Better Observability** - Detailed error logs from all failed attempts + +## Trade-offs + +### Type Safety vs Flexibility + +- **Single adapter mode**: Maximum type safety, no fallback +- **Fallback mode**: Less strict types, automatic retry + +**Recommendation**: Use single adapter mode when possible, fallback mode when reliability is critical. + +### Model Compatibility + +In fallback mode, TypeScript allows any model from any adapter. This is necessary for flexibility but means you must ensure the model works with at least one adapter in your list. + +**Solution**: Define model mappings per adapter for strict control. + +## Migration Path + +### Existing Code (Single Adapter) + +```typescript +// Before +const ai = new AI(new OpenAIAdapter({ apiKey: '...' })) +await ai.chat('gpt-4', messages) + +// After (backwards compatible) +const ai = new AI({ + adapters: { openai: new OpenAIAdapter({ apiKey: '...' }) }, +}) +await ai.chat({ adapter: 'openai', model: 'gpt-4', messages }) +``` + +### Adding Fallback + +```typescript +// Step 1: Add more adapters +const ai = new AI({ + adapters: { + openai: new OpenAIAdapter({ apiKey: '...' }), + anthropic: new AnthropicAdapter({ apiKey: '...' }), // New! + }, +}) + +// Step 2: Use fallback mode +await ai.chat({ + adapters: ['openai', 'anthropic'], // Fallback enabled + model: 'gpt-4', + messages: [], +}) + +// Step 3: Configure global fallback (optional) +const ai = new AI({ + adapters: { + /* ... */ + }, + fallbackOrder: ['openai', 'anthropic'], // Global default +}) + +await ai.chat({ adapters: [], model: 'gpt-4', messages: [] }) +``` + +## Testing Recommendations + +### Test Type Safety + +```typescript +// These should NOT compile +ai.chat({ adapter: 'openai', model: 'claude-3', messages: [] }) // ❌ +ai.chat({ adapter: 'invalid', model: 'gpt-4', messages: [] }) // ❌ +ai.chat({ adapter: 'openai', model: 'gpt-5', messages: [] }) // ❌ +``` + +### Test Fallback Behavior + +```typescript +// Mock adapters to simulate failures +const mockAdapter1 = { + chatCompletion: jest.fn().mockRejectedValue(new Error('Rate limit')), +} +const mockAdapter2 = { + chatCompletion: jest.fn().mockResolvedValue({ content: 'Success' }), +} + +const ai = new AI({ + adapters: { first: mockAdapter1, second: mockAdapter2 }, + fallbackOrder: ['first', 'second'], +}) + +// Should try first, fail, then succeed with second +await ai.chat({ adapters: [], model: 'gpt-4', messages: [] }) + +expect(mockAdapter1.chatCompletion).toHaveBeenCalled() +expect(mockAdapter2.chatCompletion).toHaveBeenCalled() +``` + +### Test ToolCallManager + +The `ToolCallManager` class has comprehensive unit tests: + +```bash +cd packages/ai +pnpm test +``` + +Test coverage includes: + +- ✅ Accumulating streaming tool call chunks (name, arguments) +- ✅ Filtering incomplete tool calls (missing ID or name) +- ✅ Executing tools with parsed arguments +- ✅ Handling tool execution errors gracefully +- ✅ Handling tools without execute functions +- ✅ Multiple tool calls in one iteration +- ✅ Clearing state between iterations +- ✅ Emitting tool_result chunks +- ✅ Creating tool result messages + +See `packages/ai/src/tool-call-manager.test.ts` for implementation. + +## Performance Considerations + +### Single Adapter Mode + +- **No overhead** - Direct call to adapter +- **Fast failure** - Error thrown immediately + +### Fallback Mode + +- **Sequential retry** - Tries each adapter in order +- **Additional latency** - On failure, waits for timeout before trying next +- **More robust** - Higher chance of success + +**Recommendation**: Use single adapter mode for performance-critical paths, fallback mode for user-facing features where reliability matters. + +## Future Enhancements + +### Possible Additions + +1. **Parallel fallback** - Try multiple adapters simultaneously +2. **Smart routing** - Choose adapter based on request characteristics +3. **Caching** - Remember which adapter succeeded for similar requests +4. **Circuit breaker** - Skip known-failing adapters temporarily +5. **Metrics** - Track success rate, latency per adapter +6. **Weighted fallback** - Probabilistic adapter selection + +### Extensibility + +The system is designed to be extended: + +```typescript +// Custom adapter with type-safe models +const MY_MODELS = ['model-1', 'model-2'] as const + +class MyAdapter extends BaseAdapter { + name = 'my-adapter' + models = MY_MODELS + // ... implement methods +} + +// Use with full type safety +const ai = new AI({ + adapters: { mine: new MyAdapter() }, +}) + +await ai.chat({ + adapter: 'mine', + model: 'model-1', // ✅ Type-safe + messages: [], +}) +``` + +## Conclusion + +This implementation provides: + +- ✅ **Compile-time safety** for model selection +- ✅ **Runtime reliability** with automatic fallback +- ✅ **Developer experience** improvements (autocomplete, error messages) +- ✅ **Production readiness** (error handling, logging) +- ✅ **Extensibility** for future enhancements + +The combination of type safety and fallback makes the SDK both safer and more reliable, suitable for production use cases where uptime and correctness are critical. diff --git a/ai-docs/MIGRATION_UNIFIED_CHAT.md b/ai-docs/MIGRATION_UNIFIED_CHAT.md index 5ac102140..23e87d965 100644 --- a/ai-docs/MIGRATION_UNIFIED_CHAT.md +++ b/ai-docs/MIGRATION_UNIFIED_CHAT.md @@ -1,233 +1,237 @@ -# Migration Guide: From `as` Option to Separate Methods - -## Overview - -The `as` option has been removed from the `chat()` method. Instead, use: -- **`chat()`** - For streaming (returns `AsyncIterable`) -- **`chatCompletion()`** - For promise-based completion (returns `Promise`) - -## Migration Examples - -### Before (Using `as` option) - -```typescript -import { createAPIFileRoute } from "@tanstack/start/api"; -import { ai } from "~/lib/ai-client"; - -export const Route = createAPIFileRoute("/api/tanchat")({ - POST: async ({ request }) => { - const { messages, tools } = await request.json(); - - // Old way: Using as: "response" - return ai.chat({ - model: "gpt-4o", - adapter: "openAi", - fallbacks: [ - { - adapter: "ollama", - model: "gpt-oss:20b" - } - ], - messages: allMessages, - temperature: 0.7, - toolChoice: "auto", - maxIterations: 5, - as: "response", // ← Old way - }); - } -}); -``` - -### After (Using separate methods) - -```typescript -import { createAPIFileRoute } from "@tanstack/start/api"; -import { ai } from "~/lib/ai-client"; -import { toStreamResponse } from "@tanstack/ai"; - -export const Route = createAPIFileRoute("/api/tanchat")({ - POST: async ({ request }) => { - const { messages, tools } = await request.json(); - - // New way: Use chat() + toStreamResponse() - const stream = ai.chat({ - model: "gpt-4o", - adapter: "openAi", - fallbacks: [ - { - adapter: "ollama", - model: "gpt-oss:20b" - } - ], - messages: allMessages, - temperature: 0.7, - toolChoice: "auto", - maxIterations: 5, - }); - - return toStreamResponse(stream); - } -}); -``` - -## Key Changes - -1. **Removed**: `as: "response"` option -2. **Changed**: `chat()` now always returns `AsyncIterable` -3. **Added**: `chatCompletion()` method for promise-based calls -4. **Added**: Import `toStreamResponse()` helper for HTTP responses - -## Migration Patterns - -### Pattern 1: Non-streaming (Promise mode) - -**Before:** -```typescript -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], - as: "promise", // or omit - it was the default -}); -``` - -**After:** -```typescript -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [], -}); -``` - -### Pattern 2: Streaming - -**Before:** -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], - as: "stream", -}); -``` - -**After:** -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], -}); -// No as option needed - chat() is now streaming-only -``` - -### Pattern 3: HTTP Response - -**Before:** -```typescript -return ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], - as: "response", -}); -``` - -**After:** -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], -}); - -return toStreamResponse(stream); -``` - -## Complete Example - -Here's a complete updated file: - -```typescript -import { createAPIFileRoute } from "@tanstack/start/api"; -import { ai } from "~/lib/ai-client"; -import { toStreamResponse } from "@tanstack/ai"; - -const SYSTEM_PROMPT = `You are a helpful AI assistant...`; - -export const Route = createAPIFileRoute("/api/tanchat")({ - POST: async ({ request }) => { - try { - const body = await request.json(); - const { messages, tools } = body; - - const allMessages = tools - ? messages - : [{ role: "system", content: SYSTEM_PROMPT }, ...messages]; - - // Use chat() for streaming, then convert to Response - const stream = ai.chat({ - adapter: "openAi", - model: "gpt-4o", - messages: allMessages, - temperature: 0.7, - tools, - toolChoice: "auto", - maxIterations: 5, - fallbacks: [ - { - adapter: "ollama", - model: "gpt-oss:20b" - } - ] - }); - - return toStreamResponse(stream); - } catch (error: any) { - return new Response( - JSON.stringify({ error: error.message }), - { - status: 500, - headers: { "Content-Type": "application/json" } - } - ); - } - } -}); -``` - -## Benefits - -✅ **Simpler code**: Clearer intent with separate methods -✅ **Same functionality**: Still returns SSE-formatted Response -✅ **Same fallback behavior**: OpenAI → Ollama failover still works -✅ **Same tool execution**: Tools are still executed automatically -✅ **Type-safe**: TypeScript knows exact return types -✅ **Better naming**: `chatCompletion()` clearly indicates promise-based completion - -## Testing - -The client-side code doesn't need any changes! It still consumes the SSE stream the same way: - -```typescript -const response = await fetch("/api/tanchat", { - method: "POST", - body: JSON.stringify({ messages, tools }) -}); - -const reader = response.body!.getReader(); -const decoder = new TextDecoder(); - -while (true) { - const { done, value } = await reader.read(); - if (done) break; - - const text = decoder.decode(value); - // Parse SSE format and handle chunks -} -``` - -Everything works exactly the same, just with a cleaner API! 🎉 +# Migration Guide: From `as` Option to Separate Methods + +## Overview + +The `as` option has been removed from the `chat()` method. Instead, use: + +- **`chat()`** - For streaming (returns `AsyncIterable`) +- **`chatCompletion()`** - For promise-based completion (returns `Promise`) + +## Migration Examples + +### Before (Using `as` option) + +```typescript +import { createAPIFileRoute } from '@tanstack/start/api' +import { ai } from '~/lib/ai-client' + +export const Route = createAPIFileRoute('/api/tanchat')({ + POST: async ({ request }) => { + const { messages, tools } = await request.json() + + // Old way: Using as: "response" + return ai.chat({ + model: 'gpt-4o', + adapter: 'openAi', + fallbacks: [ + { + adapter: 'ollama', + model: 'gpt-oss:20b', + }, + ], + messages: allMessages, + temperature: 0.7, + toolChoice: 'auto', + maxIterations: 5, + as: 'response', // ← Old way + }) + }, +}) +``` + +### After (Using separate methods) + +```typescript +import { createAPIFileRoute } from '@tanstack/start/api' +import { ai } from '~/lib/ai-client' +import { toStreamResponse } from '@tanstack/ai' + +export const Route = createAPIFileRoute('/api/tanchat')({ + POST: async ({ request }) => { + const { messages, tools } = await request.json() + + // New way: Use chat() + toStreamResponse() + const stream = ai.chat({ + model: 'gpt-4o', + adapter: 'openAi', + fallbacks: [ + { + adapter: 'ollama', + model: 'gpt-oss:20b', + }, + ], + messages: allMessages, + temperature: 0.7, + toolChoice: 'auto', + maxIterations: 5, + }) + + return toStreamResponse(stream) + }, +}) +``` + +## Key Changes + +1. **Removed**: `as: "response"` option +2. **Changed**: `chat()` now always returns `AsyncIterable` +3. **Added**: `chatCompletion()` method for promise-based calls +4. **Added**: Import `toStreamResponse()` helper for HTTP responses + +## Migration Patterns + +### Pattern 1: Non-streaming (Promise mode) + +**Before:** + +```typescript +const result = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], + as: 'promise', // or omit - it was the default +}) +``` + +**After:** + +```typescript +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) +``` + +### Pattern 2: Streaming + +**Before:** + +```typescript +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], + as: 'stream', +}) +``` + +**After:** + +```typescript +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) +// No as option needed - chat() is now streaming-only +``` + +### Pattern 3: HTTP Response + +**Before:** + +```typescript +return ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], + as: 'response', +}) +``` + +**After:** + +```typescript +import { toStreamResponse } from '@tanstack/ai' + +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) + +return toStreamResponse(stream) +``` + +## Complete Example + +Here's a complete updated file: + +```typescript +import { createAPIFileRoute } from '@tanstack/start/api' +import { ai } from '~/lib/ai-client' +import { toStreamResponse } from '@tanstack/ai' + +const SYSTEM_PROMPT = `You are a helpful AI assistant...` + +export const Route = createAPIFileRoute('/api/tanchat')({ + POST: async ({ request }) => { + try { + const body = await request.json() + const { messages, tools } = body + + const allMessages = tools + ? messages + : [{ role: 'system', content: SYSTEM_PROMPT }, ...messages] + + // Use chat() for streaming, then convert to Response + const stream = ai.chat({ + adapter: 'openAi', + model: 'gpt-4o', + messages: allMessages, + temperature: 0.7, + tools, + toolChoice: 'auto', + maxIterations: 5, + fallbacks: [ + { + adapter: 'ollama', + model: 'gpt-oss:20b', + }, + ], + }) + + return toStreamResponse(stream) + } catch (error: any) { + return new Response(JSON.stringify({ error: error.message }), { + status: 500, + headers: { 'Content-Type': 'application/json' }, + }) + } + }, +}) +``` + +## Benefits + +✅ **Simpler code**: Clearer intent with separate methods +✅ **Same functionality**: Still returns SSE-formatted Response +✅ **Same fallback behavior**: OpenAI → Ollama failover still works +✅ **Same tool execution**: Tools are still executed automatically +✅ **Type-safe**: TypeScript knows exact return types +✅ **Better naming**: `chatCompletion()` clearly indicates promise-based completion + +## Testing + +The client-side code doesn't need any changes! It still consumes the SSE stream the same way: + +```typescript +const response = await fetch('/api/tanchat', { + method: 'POST', + body: JSON.stringify({ messages, tools }), +}) + +const reader = response.body!.getReader() +const decoder = new TextDecoder() + +while (true) { + const { done, value } = await reader.read() + if (done) break + + const text = decoder.decode(value) + // Parse SSE format and handle chunks +} +``` + +Everything works exactly the same, just with a cleaner API! 🎉 diff --git a/ai-docs/TOOL_EXECUTION_LOOP.md b/ai-docs/TOOL_EXECUTION_LOOP.md index 9bf3c336b..d7fb04b0c 100644 --- a/ai-docs/TOOL_EXECUTION_LOOP.md +++ b/ai-docs/TOOL_EXECUTION_LOOP.md @@ -55,15 +55,15 @@ Done! ```typescript for await (const chunk of stream) { - if (chunk.type === "content") { + if (chunk.type === 'content') { // Display text to user - console.log(chunk.delta); - } else if (chunk.type === "tool_call") { + console.log(chunk.delta) + } else if (chunk.type === 'tool_call') { // Show that a tool is being called - console.log(`Calling: ${chunk.toolCall.function.name}`); - } else if (chunk.type === "tool_result") { + console.log(`Calling: ${chunk.toolCall.function.name}`) + } else if (chunk.type === 'tool_result') { // Show the tool result - console.log(`Result: ${chunk.content}`); + console.log(`Result: ${chunk.content}`) } } ``` @@ -79,78 +79,78 @@ for await (const chunk of stream) { ## Complete Example ```typescript -import { chat, tool } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; +import { chat, tool } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' // Define tools with execute functions const tools = [ tool({ - type: "function", + type: 'function', function: { - name: "get_weather", - description: "Get current weather for a location", + name: 'get_weather', + description: 'Get current weather for a location', parameters: { - type: "object", + type: 'object', properties: { - location: { type: "string" }, - unit: { type: "string", enum: ["celsius", "fahrenheit"] }, + location: { type: 'string' }, + unit: { type: 'string', enum: ['celsius', 'fahrenheit'] }, }, - required: ["location"], + required: ['location'], }, }, execute: async (args) => { // This is called automatically by the SDK - const weather = await fetchWeatherAPI(args.location); + const weather = await fetchWeatherAPI(args.location) return JSON.stringify({ temperature: weather.temp, conditions: weather.conditions, - unit: args.unit || "celsius", - }); + unit: args.unit || 'celsius', + }) }, }), tool({ - type: "function", + type: 'function', function: { - name: "calculate", - description: "Perform mathematical calculations", + name: 'calculate', + description: 'Perform mathematical calculations', parameters: { - type: "object", + type: 'object', properties: { - expression: { type: "string" }, + expression: { type: 'string' }, }, - required: ["expression"], + required: ['expression'], }, }, execute: async (args) => { // This is called automatically by the SDK - const result = evaluateExpression(args.expression); - return JSON.stringify({ result }); + const result = evaluateExpression(args.expression) + return JSON.stringify({ result }) }, }), -]; +] // Use with chat - tools are automatically executed const stream = chat({ adapter: openai(), - model: "gpt-4o", - messages: [{ role: "user", content: "What's the weather in Paris?" }], + model: 'gpt-4o', + messages: [{ role: 'user', content: "What's the weather in Paris?" }], tools, agentLoopStrategy: maxIterations(5), // Control loop behavior // Or use custom strategy: // agentLoopStrategy: ({ iterationCount, messages }) => iterationCount < 10, -}); +}) // Handle the stream for await (const chunk of stream) { - if (chunk.type === "content") { - process.stdout.write(chunk.delta); - } else if (chunk.type === "tool_call") { - console.log(`\n🔧 Calling: ${chunk.toolCall.function.name}`); - } else if (chunk.type === "tool_result") { - console.log(`✓ Result: ${chunk.content}\n`); - } else if (chunk.type === "done") { - console.log(`\nDone! (${chunk.finishReason})`); + if (chunk.type === 'content') { + process.stdout.write(chunk.delta) + } else if (chunk.type === 'tool_call') { + console.log(`\n🔧 Calling: ${chunk.toolCall.function.name}`) + } else if (chunk.type === 'tool_result') { + console.log(`✓ Result: ${chunk.content}\n`) + } else if (chunk.type === 'done') { + console.log(`\nDone! (${chunk.finishReason})`) } } ``` @@ -287,12 +287,12 @@ This is equivalent to `agentLoopStrategy: maxIterations(3)`. ```typescript export interface AgentLoopState { - iterationCount: number; // Current iteration (0-indexed) - messages: Message[]; // Current conversation messages - finishReason: string | null; // Last finish reason from model + iterationCount: number // Current iteration (0-indexed) + messages: Message[] // Current conversation messages + finishReason: string | null // Last finish reason from model } -export type AgentLoopStrategy = (state: AgentLoopState) => boolean; +export type AgentLoopStrategy = (state: AgentLoopState) => boolean ``` ### `toolChoice` @@ -366,35 +366,35 @@ Emitted after the SDK executes a tool: Perfect for API endpoints - tool execution happens on server, results stream to client: ```typescript -import { chat } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; -import { toStreamResponse } from "@tanstack/ai"; +import { chat } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' +import { toStreamResponse } from '@tanstack/ai' export async function POST(request: Request) { - const { messages } = await request.json(); + const { messages } = await request.json() const stream = chat({ adapter: openai(), - model: "gpt-4o", + model: 'gpt-4o', messages, tools: [weatherTool, calculateTool], maxIterations: 5, - }); + }) // Client receives tool_call and tool_result chunks - return toStreamResponse(stream); + return toStreamResponse(stream) } ``` **Client-side:** ```typescript -const response = await fetch("/api/chat", { - method: "POST", +const response = await fetch('/api/chat', { + method: 'POST', body: JSON.stringify({ messages }), -}); +}) -const reader = response.body.getReader(); +const reader = response.body.getReader() // Receives: content chunks, tool_call chunks, tool_result chunks, done chunk ``` @@ -461,24 +461,24 @@ The tool execution logic is implemented in the `ToolCallManager` class for bette ```typescript class ToolCallManager { - constructor(tools: ReadonlyArray); + constructor(tools: ReadonlyArray) // Add a streaming tool call chunk - addToolCallChunk(chunk: ToolCallChunk): void; + addToolCallChunk(chunk: ToolCallChunk): void // Check if there are complete tool calls - hasToolCalls(): boolean; + hasToolCalls(): boolean // Get all validated tool calls - getToolCalls(): ToolCall[]; + getToolCalls(): ToolCall[] // Execute tools and yield tool_result chunks async *executeTools( - doneChunk - ): AsyncGenerator; + doneChunk, + ): AsyncGenerator // Clear for next iteration - clear(): void; + clear(): void } ``` diff --git a/ai-docs/TOOL_REGISTRY.md b/ai-docs/TOOL_REGISTRY.md index 419258893..efe8ca834 100644 --- a/ai-docs/TOOL_REGISTRY.md +++ b/ai-docs/TOOL_REGISTRY.md @@ -1,463 +1,474 @@ -# Tool Registry API - -> **🔄 Automatic Tool Execution Loop:** The `chat()` method automatically executes tools in a loop. When the model decides to call a tool, the SDK: -> 1. Executes the tool's `execute` function -> 2. Emits `tool_result` chunks with the result -> 3. Adds tool results to messages automatically -> 4. Continues the conversation with the model -> 5. Repeats until no more tools are needed (up to `maxIterations`, default: 5) -> -> **You don't need to manually handle tool execution** - just provide tools with `execute` functions and the SDK handles everything! -> -> **📚 See also:** [Complete Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) - -## Overview - -The Tool Registry API allows you to define tools once in the AI constructor and then reference them by name throughout your application. This provides better organization, type safety, and reusability. - -## Key Benefits - -✅ **Define Once, Use Everywhere** - Register tools in one place -✅ **Type-Safe Tool Names** - TypeScript autocomplete and validation -✅ **Better Organization** - Centralized tool management -✅ **No Duplication** - Reuse tools across different chats -✅ **Runtime Validation** - Errors if referencing non-existent tools - -## Basic Usage - -### 1. Define Tools Registry - -```typescript -import { AI } from "@ts-poc/ai"; -import { OpenAIAdapter } from "@ts-poc/ai-openai"; - -// Define all your tools in a registry -const tools = { - get_weather: { - type: "function" as const, - function: { - name: "get_weather", - description: "Get current weather for a location", - parameters: { - type: "object", - properties: { - location: { type: "string", description: "City name" }, - }, - required: ["location"], - }, - }, - execute: async (args: { location: string }) => { - // Your implementation - return JSON.stringify({ temp: 72, condition: "sunny" }); - }, - }, - - calculate: { - type: "function" as const, - function: { - name: "calculate", - description: "Perform mathematical calculations", - parameters: { - type: "object", - properties: { - expression: { type: "string" }, - }, - required: ["expression"], - }, - }, - execute: async (args: { expression: string }) => { - const result = eval(args.expression); // Use safe math parser in production! - return JSON.stringify({ result }); - }, - }, -} as const; // ← Important: use "as const" for type safety! -``` - -### 2. Initialize AI with Tools - -```typescript -const ai = new AI({ - adapters: { - openai: new OpenAIAdapter({ - apiKey: process.env.OPENAI_API_KEY, - }), - }, - tools, // ← Register tools here! -}); -``` - -### 3. Use Tools by Name (Type-Safe!) - -```typescript -// Use specific tools -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [ - { role: "user", content: "What's the weather in SF?" }, - ], - tools: ["get_weather"], // ← Type-safe! Only registered tool names - toolChoice: "auto", - maxIterations: 5, -}); - -// Use multiple tools -const result2 = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [ - { role: "user", content: "What's the weather in SF and what's 2+2?" }, - ], - tools: ["get_weather", "calculate"], // ← Multiple tools, all type-safe! - toolChoice: "auto", - maxIterations: 5, -}); - -// No tools (regular chat) -const result3 = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [ - { role: "user", content: "Tell me a joke" }, - ], - // No tools specified -}); -``` - -## Type Safety - -TypeScript provides full autocomplete and validation: - -```typescript -const ai = new AI({ - adapters: { /* ... */ }, - tools: { - get_weather: { /* ... */ }, - calculate: { /* ... */ }, - }, -}); - -// ✅ Valid - TypeScript knows these tool names exist -ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather"], // ← Autocomplete works! -}); - -// ✅ Valid - multiple tools -ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather", "calculate"], // ← Both validated! -}); - -// ❌ TypeScript Error - invalid tool name -ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["invalid_tool"], // ← Compile error! -}); -``` - -## Migration from Old API - -### Before (Tools Inline) - -```typescript -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: [ - { - type: "function", - function: { - name: "get_weather", - description: "Get weather", - parameters: { /* ... */ }, - }, - execute: async (args) => { /* ... */ }, - }, - { - type: "function", - function: { - name: "calculate", - description: "Calculate", - parameters: { /* ... */ }, - }, - execute: async (args) => { /* ... */ }, - }, - ], - toolChoice: "auto", -}); -``` - -### After (Tool Registry) - -```typescript -// Define once in constructor -const ai = new AI({ - adapters: { /* ... */ }, - tools: { - get_weather: { - type: "function", - function: { - name: "get_weather", - description: "Get weather", - parameters: { /* ... */ }, - }, - execute: async (args) => { /* ... */ }, - }, - calculate: { - type: "function", - function: { - name: "calculate", - description: "Calculate", - parameters: { /* ... */ }, - }, - execute: async (args) => { /* ... */ }, - }, - }, -}); - -// Use by name (type-safe!) -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather", "calculate"], // ← Much cleaner! - toolChoice: "auto", -}); -``` - -## Working with Tools - -### Get Tool by Name - -```typescript -const weatherTool = ai.getTool("get_weather"); -console.log(weatherTool.function.description); -``` - -### List All Tool Names - -```typescript -const toolNames = ai.toolNames; -console.log("Available tools:", toolNames); -// Output: ["get_weather", "calculate"] -``` - -### Check if Tool Exists - -```typescript -try { - const tool = ai.getTool("some_tool"); - console.log("Tool exists!"); -} catch (error) { - console.log("Tool not found"); -} -``` - -## Streaming with Tools - -Tools work seamlessly with streaming: - -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [ - { role: "user", content: "What's the weather in Paris and what's 100*5?" }, - ], - tools: ["get_weather", "calculate"], - toolChoice: "auto", - maxIterations: 5, -}); - -for await (const chunk of stream) { - if (chunk.type === "content") { - process.stdout.write(chunk.delta); - } else if (chunk.type === "tool_call") { - console.log(`\n→ Calling: ${chunk.toolCall.function.name}`); - } else if (chunk.type === "done") { - console.log("\n✓ Done"); - } -} -``` - -## HTTP Streaming with Tools - -Perfect for API endpoints: - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -export const Route = createAPIFileRoute("/api/chat")({ - POST: async ({ request }): Promise => { - const { messages } = await request.json(); - - const stream = ai.chat({ - adapter: "openai", - model: "gpt-4o", - messages, - tools: ["get_weather", "search_database", "send_email"], - toolChoice: "auto", - maxIterations: 5, - }); - - return toStreamResponse(stream); - } -}); -``` - -## Real-World Example: E-commerce Assistant - -```typescript -const tools = { - search_products: { - type: "function" as const, - function: { - name: "search_products", - description: "Search for products in the catalog", - parameters: { - type: "object", - properties: { - query: { type: "string" }, - category: { type: "string" }, - maxPrice: { type: "number" }, - }, - required: ["query"], - }, - }, - execute: async (args: { query: string; category?: string; maxPrice?: number }) => { - const results = await db.products.search(args); - return JSON.stringify(results); - }, - }, - - get_product_details: { - type: "function" as const, - function: { - name: "get_product_details", - description: "Get detailed information about a product", - parameters: { - type: "object", - properties: { - productId: { type: "string" }, - }, - required: ["productId"], - }, - }, - execute: async (args: { productId: string }) => { - const product = await db.products.findById(args.productId); - return JSON.stringify(product); - }, - }, - - check_inventory: { - type: "function" as const, - function: { - name: "check_inventory", - description: "Check if a product is in stock", - parameters: { - type: "object", - properties: { - productId: { type: "string" }, - quantity: { type: "number", default: 1 }, - }, - required: ["productId"], - }, - }, - execute: async (args: { productId: string; quantity?: number }) => { - const available = await inventory.check(args.productId, args.quantity || 1); - return JSON.stringify({ available, productId: args.productId }); - }, - }, - - add_to_cart: { - type: "function" as const, - function: { - name: "add_to_cart", - description: "Add a product to the shopping cart", - parameters: { - type: "object", - properties: { - productId: { type: "string" }, - quantity: { type: "number", default: 1 }, - }, - required: ["productId"], - }, - }, - execute: async (args: { productId: string; quantity?: number }) => { - await cart.add(args.productId, args.quantity || 1); - return JSON.stringify({ success: true, productId: args.productId }); - }, - }, -} as const; - -const ai = new AI({ - adapters: { openai: new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY }) }, - tools, -}); - -// Now any chat can use these tools by name! -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [ - { role: "user", content: "I'm looking for a red guitar under $500" }, - ], - tools: ["search_products", "get_product_details", "check_inventory", "add_to_cart"], - toolChoice: "auto", - maxIterations: 10, -}); -``` - -## Advanced: Dynamic Tool Selection - -You can dynamically select which tools to use: - -```typescript -function getChatTools(userRole: string): string[] { - if (userRole === "admin") { - return ["search_products", "get_product_details", "check_inventory", "add_to_cart", "update_prices"]; - } else if (userRole === "customer") { - return ["search_products", "get_product_details", "add_to_cart"]; - } else { - return ["search_products"]; // Guest users - } -} - -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: getChatTools(user.role) as any, // Type assertion needed for dynamic arrays - toolChoice: "auto", -}); -``` - -## Best Practices - -1. **Use `as const`** when defining tools for maximum type safety -2. **Descriptive names** - Use clear, verb-based names like `get_weather`, `search_products` -3. **Comprehensive descriptions** - Help the AI understand when to use each tool -4. **Required parameters** - Mark parameters as required when appropriate -5. **Error handling** - Return error information in execute functions -6. **Validation** - Validate parameters in execute functions -7. **Centralize** - Keep all tool definitions in one place for maintainability - -## Summary - -The Tool Registry API provides: - -✅ **Type-Safe Tool References** - Autocomplete and validation -✅ **Centralized Management** - Define once, use everywhere -✅ **Cleaner Code** - Reference by name instead of inline definitions -✅ **Better Reusability** - Share tools across different chats -✅ **Runtime Validation** - Catch errors early - -**Migration Path**: Move inline tool definitions to the constructor registry, then reference them by name in your chat calls! +# Tool Registry API + +> **🔄 Automatic Tool Execution Loop:** The `chat()` method automatically executes tools in a loop. When the model decides to call a tool, the SDK: +> +> 1. Executes the tool's `execute` function +> 2. Emits `tool_result` chunks with the result +> 3. Adds tool results to messages automatically +> 4. Continues the conversation with the model +> 5. Repeats until no more tools are needed (up to `maxIterations`, default: 5) +> +> **You don't need to manually handle tool execution** - just provide tools with `execute` functions and the SDK handles everything! +> +> **📚 See also:** [Complete Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) + +## Overview + +The Tool Registry API allows you to define tools once in the AI constructor and then reference them by name throughout your application. This provides better organization, type safety, and reusability. + +## Key Benefits + +✅ **Define Once, Use Everywhere** - Register tools in one place +✅ **Type-Safe Tool Names** - TypeScript autocomplete and validation +✅ **Better Organization** - Centralized tool management +✅ **No Duplication** - Reuse tools across different chats +✅ **Runtime Validation** - Errors if referencing non-existent tools + +## Basic Usage + +### 1. Define Tools Registry + +```typescript +import { AI } from '@ts-poc/ai' +import { OpenAIAdapter } from '@ts-poc/ai-openai' + +// Define all your tools in a registry +const tools = { + get_weather: { + type: 'function' as const, + function: { + name: 'get_weather', + description: 'Get current weather for a location', + parameters: { + type: 'object', + properties: { + location: { type: 'string', description: 'City name' }, + }, + required: ['location'], + }, + }, + execute: async (args: { location: string }) => { + // Your implementation + return JSON.stringify({ temp: 72, condition: 'sunny' }) + }, + }, + + calculate: { + type: 'function' as const, + function: { + name: 'calculate', + description: 'Perform mathematical calculations', + parameters: { + type: 'object', + properties: { + expression: { type: 'string' }, + }, + required: ['expression'], + }, + }, + execute: async (args: { expression: string }) => { + const result = eval(args.expression) // Use safe math parser in production! + return JSON.stringify({ result }) + }, + }, +} as const // ← Important: use "as const" for type safety! +``` + +### 2. Initialize AI with Tools + +```typescript +const ai = new AI({ + adapters: { + openai: new OpenAIAdapter({ + apiKey: process.env.OPENAI_API_KEY, + }), + }, + tools, // ← Register tools here! +}) +``` + +### 3. Use Tools by Name (Type-Safe!) + +```typescript +// Use specific tools +const result = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: "What's the weather in SF?" }], + tools: ['get_weather'], // ← Type-safe! Only registered tool names + toolChoice: 'auto', + maxIterations: 5, +}) + +// Use multiple tools +const result2 = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [ + { role: 'user', content: "What's the weather in SF and what's 2+2?" }, + ], + tools: ['get_weather', 'calculate'], // ← Multiple tools, all type-safe! + toolChoice: 'auto', + maxIterations: 5, +}) + +// No tools (regular chat) +const result3 = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Tell me a joke' }], + // No tools specified +}) +``` + +## Type Safety + +TypeScript provides full autocomplete and validation: + +```typescript +const ai = new AI({ + adapters: { /* ... */ }, + tools: { + get_weather: { /* ... */ }, + calculate: { /* ... */ }, + }, +}); + +// ✅ Valid - TypeScript knows these tool names exist +ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather"], // ← Autocomplete works! +}); + +// ✅ Valid - multiple tools +ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather", "calculate"], // ← Both validated! +}); + +// ❌ TypeScript Error - invalid tool name +ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["invalid_tool"], // ← Compile error! +}); +``` + +## Migration from Old API + +### Before (Tools Inline) + +```typescript +const result = await ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: [ + { + type: "function", + function: { + name: "get_weather", + description: "Get weather", + parameters: { /* ... */ }, + }, + execute: async (args) => { /* ... */ }, + }, + { + type: "function", + function: { + name: "calculate", + description: "Calculate", + parameters: { /* ... */ }, + }, + execute: async (args) => { /* ... */ }, + }, + ], + toolChoice: "auto", +}); +``` + +### After (Tool Registry) + +```typescript +// Define once in constructor +const ai = new AI({ + adapters: { /* ... */ }, + tools: { + get_weather: { + type: "function", + function: { + name: "get_weather", + description: "Get weather", + parameters: { /* ... */ }, + }, + execute: async (args) => { /* ... */ }, + }, + calculate: { + type: "function", + function: { + name: "calculate", + description: "Calculate", + parameters: { /* ... */ }, + }, + execute: async (args) => { /* ... */ }, + }, + }, +}); + +// Use by name (type-safe!) +const result = await ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather", "calculate"], // ← Much cleaner! + toolChoice: "auto", +}); +``` + +## Working with Tools + +### Get Tool by Name + +```typescript +const weatherTool = ai.getTool('get_weather') +console.log(weatherTool.function.description) +``` + +### List All Tool Names + +```typescript +const toolNames = ai.toolNames +console.log('Available tools:', toolNames) +// Output: ["get_weather", "calculate"] +``` + +### Check if Tool Exists + +```typescript +try { + const tool = ai.getTool('some_tool') + console.log('Tool exists!') +} catch (error) { + console.log('Tool not found') +} +``` + +## Streaming with Tools + +Tools work seamlessly with streaming: + +```typescript +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [ + { role: 'user', content: "What's the weather in Paris and what's 100*5?" }, + ], + tools: ['get_weather', 'calculate'], + toolChoice: 'auto', + maxIterations: 5, +}) + +for await (const chunk of stream) { + if (chunk.type === 'content') { + process.stdout.write(chunk.delta) + } else if (chunk.type === 'tool_call') { + console.log(`\n→ Calling: ${chunk.toolCall.function.name}`) + } else if (chunk.type === 'done') { + console.log('\n✓ Done') + } +} +``` + +## HTTP Streaming with Tools + +Perfect for API endpoints: + +```typescript +import { toStreamResponse } from '@tanstack/ai' + +export const Route = createAPIFileRoute('/api/chat')({ + POST: async ({ request }): Promise => { + const { messages } = await request.json() + + const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4o', + messages, + tools: ['get_weather', 'search_database', 'send_email'], + toolChoice: 'auto', + maxIterations: 5, + }) + + return toStreamResponse(stream) + }, +}) +``` + +## Real-World Example: E-commerce Assistant + +```typescript +const tools = { + search_products: { + type: 'function' as const, + function: { + name: 'search_products', + description: 'Search for products in the catalog', + parameters: { + type: 'object', + properties: { + query: { type: 'string' }, + category: { type: 'string' }, + maxPrice: { type: 'number' }, + }, + required: ['query'], + }, + }, + execute: async (args: { + query: string + category?: string + maxPrice?: number + }) => { + const results = await db.products.search(args) + return JSON.stringify(results) + }, + }, + + get_product_details: { + type: 'function' as const, + function: { + name: 'get_product_details', + description: 'Get detailed information about a product', + parameters: { + type: 'object', + properties: { + productId: { type: 'string' }, + }, + required: ['productId'], + }, + }, + execute: async (args: { productId: string }) => { + const product = await db.products.findById(args.productId) + return JSON.stringify(product) + }, + }, + + check_inventory: { + type: 'function' as const, + function: { + name: 'check_inventory', + description: 'Check if a product is in stock', + parameters: { + type: 'object', + properties: { + productId: { type: 'string' }, + quantity: { type: 'number', default: 1 }, + }, + required: ['productId'], + }, + }, + execute: async (args: { productId: string; quantity?: number }) => { + const available = await inventory.check( + args.productId, + args.quantity || 1, + ) + return JSON.stringify({ available, productId: args.productId }) + }, + }, + + add_to_cart: { + type: 'function' as const, + function: { + name: 'add_to_cart', + description: 'Add a product to the shopping cart', + parameters: { + type: 'object', + properties: { + productId: { type: 'string' }, + quantity: { type: 'number', default: 1 }, + }, + required: ['productId'], + }, + }, + execute: async (args: { productId: string; quantity?: number }) => { + await cart.add(args.productId, args.quantity || 1) + return JSON.stringify({ success: true, productId: args.productId }) + }, + }, +} as const + +const ai = new AI({ + adapters: { + openai: new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY }), + }, + tools, +}) + +// Now any chat can use these tools by name! +const result = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [ + { role: 'user', content: "I'm looking for a red guitar under $500" }, + ], + tools: [ + 'search_products', + 'get_product_details', + 'check_inventory', + 'add_to_cart', + ], + toolChoice: 'auto', + maxIterations: 10, +}) +``` + +## Advanced: Dynamic Tool Selection + +You can dynamically select which tools to use: + +```typescript +function getChatTools(userRole: string): string[] { + if (userRole === "admin") { + return ["search_products", "get_product_details", "check_inventory", "add_to_cart", "update_prices"]; + } else if (userRole === "customer") { + return ["search_products", "get_product_details", "add_to_cart"]; + } else { + return ["search_products"]; // Guest users + } +} + +const result = await ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: getChatTools(user.role) as any, // Type assertion needed for dynamic arrays + toolChoice: "auto", +}); +``` + +## Best Practices + +1. **Use `as const`** when defining tools for maximum type safety +2. **Descriptive names** - Use clear, verb-based names like `get_weather`, `search_products` +3. **Comprehensive descriptions** - Help the AI understand when to use each tool +4. **Required parameters** - Mark parameters as required when appropriate +5. **Error handling** - Return error information in execute functions +6. **Validation** - Validate parameters in execute functions +7. **Centralize** - Keep all tool definitions in one place for maintainability + +## Summary + +The Tool Registry API provides: + +✅ **Type-Safe Tool References** - Autocomplete and validation +✅ **Centralized Management** - Define once, use everywhere +✅ **Cleaner Code** - Reference by name instead of inline definitions +✅ **Better Reusability** - Share tools across different chats +✅ **Runtime Validation** - Catch errors early + +**Migration Path**: Move inline tool definitions to the constructor registry, then reference them by name in your chat calls! diff --git a/ai-docs/TOOL_REGISTRY_IMPLEMENTATION.md b/ai-docs/TOOL_REGISTRY_IMPLEMENTATION.md index bd52e8693..6f741a6e4 100644 --- a/ai-docs/TOOL_REGISTRY_IMPLEMENTATION.md +++ b/ai-docs/TOOL_REGISTRY_IMPLEMENTATION.md @@ -1,405 +1,439 @@ -# Tool Registry API - Implementation Summary - -> **🔄 Automatic Tool Execution Loop:** This document describes how tools are registered and referenced. Remember that the `chat()` method automatically executes tools in a loop - when the model calls a tool, the SDK executes it, adds the result to messages, and continues the conversation automatically (up to `maxIterations`, default: 5). - -## Overview - -Successfully refactored the AI API to support a **tool registry** where tools are defined once in the constructor and then referenced by name in a type-safe manner throughout the application. - -## Key Changes - -### 1. Tool Registry in Constructor - -**Before:** -```typescript -const ai = new AI({ - adapters: { /* ... */ } -}); - -// Had to pass full tool definitions every time -ai.chat({ - messages: [...], - tools: [ - { type: "function", function: { name: "get_weather", ... }, execute: ... }, - { type: "function", function: { name: "calculate", ... }, execute: ... }, - ], -}); -``` - -**After:** -```typescript -const ai = new AI({ - adapters: { /* ... */ }, - tools: { - get_weather: { - type: "function" as const, - function: { name: "get_weather", ... }, - execute: async (args) => { ... }, - }, - calculate: { - type: "function" as const, - function: { name: "calculate", ... }, - execute: async (args) => { ... }, - }, - }, -}); - -// Reference by name - type-safe! -ai.chat({ - messages: [...], - tools: ["get_weather", "calculate"], // ← Type-safe string array! -}); -``` - -### 2. Type System Updates - -Added new generic parameter to `AI` class: -```typescript -class AI -``` - -Where: -- `T` - Adapter map (existing) -- `TTools` - Tool registry (new!) - -### 3. Type-Safe Tool Names - -Tool names are extracted from the registry type: -```typescript -type ToolNames = keyof TTools & string; -``` - -TypeScript provides: -- ✅ Autocomplete for tool names -- ✅ Compile-time validation -- ✅ Refactoring safety - -### 4. Updated Method Signatures - -All chat methods now accept tool names instead of full tool objects: - -```typescript -// ChatOptionsWithAdapter -type ChatOptionsWithAdapter = { - // ... other options - tools?: ReadonlyArray>; // ← Type-safe tool names! -}; -``` - -### 5. Internal Tool Resolution - -New helper methods: -```typescript -class AI { - getTool(name: ToolNames): Tool; // Get single tool - get toolNames(): Array>; // List all tool names - private getToolsByNames(names: ToolNames[]): Tool[]; // Convert names to objects -} -``` - -## API Examples - -### Basic Usage - -```typescript -const ai = new AI({ - adapters: { - openai: new OpenAIAdapter({ apiKey: "..." }), - }, - tools: { - get_weather: { /* ... */ }, - calculate: { /* ... */ }, - }, -}); - -// Use specific tools -await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather"], // ← Type-safe! -}); - -// Use multiple tools -await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather", "calculate"], // ← Both validated! -}); - -// No tools -await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - // No tools specified -}); -``` - -### With Streaming - -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather", "calculate"], -}); - -for await (const chunk of stream) { - // Handle chunks -} -``` - -### With HTTP Response - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather", "search_products"], -}); - -return toStreamResponse(stream); -``` - -## Real-World Example: api.tanchat.ts - -**Before:** -```typescript -const tools: Tool[] = [ - { type: "function", function: { name: "getGuitars", ... }, execute: ... }, - { type: "function", function: { name: "recommendGuitar", ... }, execute: ... }, -]; - -const ai = new AI({ adapters: { /* ... */ } }); - -ai.chat({ - messages: [...], - tools, // ← Pass array of Tool objects -}); -``` - -**After:** -```typescript -const tools = { - getGuitars: { - type: "function" as const, - function: { name: "getGuitars", ... }, - execute: async () => { ... }, - }, - recommendGuitar: { - type: "function" as const, - function: { name: "recommendGuitar", ... }, - execute: async (args) => { ... }, - }, -} as const; - -const ai = new AI({ - adapters: { /* ... */ }, - tools, // ← Register once! -}); - -ai.chat({ - messages: [...], - tools: ["getGuitars", "recommendGuitar"], // ← Type-safe names! -}); -``` - -## Benefits - -### 1. Type Safety -- ✅ Autocomplete for tool names in IDE -- ✅ Compile-time errors for invalid tool names -- ✅ Refactoring support (rename tools safely) - -### 2. Better Organization -- ✅ Centralized tool definitions -- ✅ Single source of truth -- ✅ Easy to maintain and update - -### 3. Code Reusability -- ✅ Define tools once, use everywhere -- ✅ Share tools across different chat calls -- ✅ No duplication - -### 4. Developer Experience -- ✅ Cleaner code (tool names vs full objects) -- ✅ Less typing (just reference by name) -- ✅ Better readability - -### 5. Runtime Safety -- ✅ Validation that tools exist -- ✅ Clear error messages -- ✅ No silent failures - -## Implementation Details - -### Type System - -```typescript -// Tool registry type -type ToolRegistry = Record; - -// Extract tool names -type ToolNames = keyof TTools & string; - -// AI class with tool registry -class AI { - private tools: TTools; - - constructor(config: AIConfig) { - this.tools = config.tools || {} as TTools; - } - - private getToolsByNames(names: ReadonlyArray>): Tool[] { - return names.map(name => this.getTool(name)); - } -} -``` - -### Chat Options - -```typescript -type ChatOptionsWithAdapter = { - adapter: keyof TAdapters; - model: ExtractModels; - messages: Message[]; - tools?: ReadonlyArray>; // ← Tool names, not objects - // ... other options -}; -``` - -### Internal Resolution - -When `chat()` is called: -1. Extract tool names from options -2. Convert tool names to Tool objects using `getToolsByNames()` -3. Pass Tool objects to adapter methods -4. Adapters work with full Tool objects (no changes needed) - -## Files Changed - -### Core Implementation -- ✅ `packages/ai/src/ai.ts` - - Added `TTools` generic parameter to `AI` class - - Added `ToolRegistry` and `ToolNames` types - - Updated `ChatOptionsWithAdapter` and `ChatOptionsWithFallback` - - Added `getTool()`, `toolNames`, and `getToolsByNames()` methods - - Updated `chatPromise()` and `chatStream()` to convert tool names - -### Documentation -- ✅ `docs/TOOL_REGISTRY.md` - Comprehensive guide -- ✅ `docs/TOOL_REGISTRY_QUICK_START.md` - Quick reference -- ✅ `examples/tool-registry-example.ts` - Full examples - -### Example Updates -- ✅ `examples/ts-chat/src/routes/demo/api.tanchat.ts` - Updated to use tool registry - -## Migration Guide - -### Step 1: Convert Tool Array to Registry - -```typescript -// Before -const tools: Tool[] = [ - { type: "function", function: { name: "tool1", ... } }, - { type: "function", function: { name: "tool2", ... } }, -]; - -// After -const tools = { - tool1: { type: "function" as const, function: { name: "tool1", ... } }, - tool2: { type: "function" as const, function: { name: "tool2", ... } }, -} as const; // ← Important! -``` - -### Step 2: Register Tools in Constructor - -```typescript -// Before -const ai = new AI({ adapters: { /* ... */ } }); - -// After -const ai = new AI({ - adapters: { /* ... */ }, - tools, // ← Add tools here -}); -``` - -### Step 3: Use Tool Names in Chat Calls - -```typescript -// Before -ai.chat({ - messages: [...], - tools: tools, // ← Full array -}); - -// After -ai.chat({ - messages: [...], - tools: ["tool1", "tool2"], // ← Just names! -}); -``` - -## Testing - -Verify type safety: -```typescript -const ai = new AI({ - adapters: { /* ... */ }, - tools: { - get_weather: { /* ... */ }, - calculate: { /* ... */ }, - }, -}); - -// ✅ Should work -ai.chat({ messages: [], tools: ["get_weather"] }); - -// ❌ Should show TypeScript error -ai.chat({ messages: [], tools: ["invalid_tool"] }); -``` - -## Performance - -No performance impact: -- Tool name resolution happens once per chat call -- Minimal overhead (simple object lookup) -- Tool execution unchanged - -## Backward Compatibility - -**Breaking Change**: This is a breaking change. Users must: -1. Convert tool arrays to registries -2. Register tools in constructor -3. Use tool names instead of objects - -However, the migration path is straightforward and provides significant benefits. - -## Future Enhancements - -Potential improvements: -- Tool namespaces (e.g., `weather.get`, `weather.forecast`) -- Tool permissions/access control -- Tool versioning -- Dynamic tool registration -- Tool composition/chaining - -## Summary - -The Tool Registry API provides: - -✅ **Type-Safe Tool References** - Autocomplete and validation -✅ **Centralized Management** - Define once, use everywhere -✅ **Cleaner Code** - Reference by name instead of objects -✅ **Better Reusability** - Share tools across chats -✅ **Runtime Validation** - Clear error messages -✅ **Developer Experience** - Improved DX with less code - -**Result**: More maintainable, type-safe, and developer-friendly tool management! 🎉 +# Tool Registry API - Implementation Summary + +> **🔄 Automatic Tool Execution Loop:** This document describes how tools are registered and referenced. Remember that the `chat()` method automatically executes tools in a loop - when the model calls a tool, the SDK executes it, adds the result to messages, and continues the conversation automatically (up to `maxIterations`, default: 5). + +## Overview + +Successfully refactored the AI API to support a **tool registry** where tools are defined once in the constructor and then referenced by name in a type-safe manner throughout the application. + +## Key Changes + +### 1. Tool Registry in Constructor + +**Before:** + +```typescript +const ai = new AI({ + adapters: { /* ... */ } +}); + +// Had to pass full tool definitions every time +ai.chat({ + messages: [...], + tools: [ + { type: "function", function: { name: "get_weather", ... }, execute: ... }, + { type: "function", function: { name: "calculate", ... }, execute: ... }, + ], +}); +``` + +**After:** + +```typescript +const ai = new AI({ + adapters: { /* ... */ }, + tools: { + get_weather: { + type: "function" as const, + function: { name: "get_weather", ... }, + execute: async (args) => { ... }, + }, + calculate: { + type: "function" as const, + function: { name: "calculate", ... }, + execute: async (args) => { ... }, + }, + }, +}); + +// Reference by name - type-safe! +ai.chat({ + messages: [...], + tools: ["get_weather", "calculate"], // ← Type-safe string array! +}); +``` + +### 2. Type System Updates + +Added new generic parameter to `AI` class: + +```typescript +class AI +``` + +Where: + +- `T` - Adapter map (existing) +- `TTools` - Tool registry (new!) + +### 3. Type-Safe Tool Names + +Tool names are extracted from the registry type: + +```typescript +type ToolNames = keyof TTools & string +``` + +TypeScript provides: + +- ✅ Autocomplete for tool names +- ✅ Compile-time validation +- ✅ Refactoring safety + +### 4. Updated Method Signatures + +All chat methods now accept tool names instead of full tool objects: + +```typescript +// ChatOptionsWithAdapter +type ChatOptionsWithAdapter = { + // ... other options + tools?: ReadonlyArray> // ← Type-safe tool names! +} +``` + +### 5. Internal Tool Resolution + +New helper methods: + +```typescript +class AI { + getTool(name: ToolNames): Tool // Get single tool + get toolNames(): Array> // List all tool names + private getToolsByNames(names: ToolNames[]): Tool[] // Convert names to objects +} +``` + +## API Examples + +### Basic Usage + +```typescript +const ai = new AI({ + adapters: { + openai: new OpenAIAdapter({ apiKey: "..." }), + }, + tools: { + get_weather: { /* ... */ }, + calculate: { /* ... */ }, + }, +}); + +// Use specific tools +await ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather"], // ← Type-safe! +}); + +// Use multiple tools +await ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather", "calculate"], // ← Both validated! +}); + +// No tools +await ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + // No tools specified +}); +``` + +### With Streaming + +```typescript +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather", "calculate"], +}); + +for await (const chunk of stream) { + // Handle chunks +} +``` + +### With HTTP Response + +```typescript +import { toStreamResponse } from "@tanstack/ai"; + +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather", "search_products"], +}); + +return toStreamResponse(stream); +``` + +## Real-World Example: api.tanchat.ts + +**Before:** + +```typescript +const tools: Tool[] = [ + { type: "function", function: { name: "getGuitars", ... }, execute: ... }, + { type: "function", function: { name: "recommendGuitar", ... }, execute: ... }, +]; + +const ai = new AI({ adapters: { /* ... */ } }); + +ai.chat({ + messages: [...], + tools, // ← Pass array of Tool objects +}); +``` + +**After:** + +```typescript +const tools = { + getGuitars: { + type: "function" as const, + function: { name: "getGuitars", ... }, + execute: async () => { ... }, + }, + recommendGuitar: { + type: "function" as const, + function: { name: "recommendGuitar", ... }, + execute: async (args) => { ... }, + }, +} as const; + +const ai = new AI({ + adapters: { /* ... */ }, + tools, // ← Register once! +}); + +ai.chat({ + messages: [...], + tools: ["getGuitars", "recommendGuitar"], // ← Type-safe names! +}); +``` + +## Benefits + +### 1. Type Safety + +- ✅ Autocomplete for tool names in IDE +- ✅ Compile-time errors for invalid tool names +- ✅ Refactoring support (rename tools safely) + +### 2. Better Organization + +- ✅ Centralized tool definitions +- ✅ Single source of truth +- ✅ Easy to maintain and update + +### 3. Code Reusability + +- ✅ Define tools once, use everywhere +- ✅ Share tools across different chat calls +- ✅ No duplication + +### 4. Developer Experience + +- ✅ Cleaner code (tool names vs full objects) +- ✅ Less typing (just reference by name) +- ✅ Better readability + +### 5. Runtime Safety + +- ✅ Validation that tools exist +- ✅ Clear error messages +- ✅ No silent failures + +## Implementation Details + +### Type System + +```typescript +// Tool registry type +type ToolRegistry = Record + +// Extract tool names +type ToolNames = keyof TTools & string + +// AI class with tool registry +class AI { + private tools: TTools + + constructor(config: AIConfig) { + this.tools = config.tools || ({} as TTools) + } + + private getToolsByNames(names: ReadonlyArray>): Tool[] { + return names.map((name) => this.getTool(name)) + } +} +``` + +### Chat Options + +```typescript +type ChatOptionsWithAdapter = { + adapter: keyof TAdapters + model: ExtractModels + messages: Message[] + tools?: ReadonlyArray> // ← Tool names, not objects + // ... other options +} +``` + +### Internal Resolution + +When `chat()` is called: + +1. Extract tool names from options +2. Convert tool names to Tool objects using `getToolsByNames()` +3. Pass Tool objects to adapter methods +4. Adapters work with full Tool objects (no changes needed) + +## Files Changed + +### Core Implementation + +- ✅ `packages/ai/src/ai.ts` + - Added `TTools` generic parameter to `AI` class + - Added `ToolRegistry` and `ToolNames` types + - Updated `ChatOptionsWithAdapter` and `ChatOptionsWithFallback` + - Added `getTool()`, `toolNames`, and `getToolsByNames()` methods + - Updated `chatPromise()` and `chatStream()` to convert tool names + +### Documentation + +- ✅ `docs/TOOL_REGISTRY.md` - Comprehensive guide +- ✅ `docs/TOOL_REGISTRY_QUICK_START.md` - Quick reference +- ✅ `examples/tool-registry-example.ts` - Full examples + +### Example Updates + +- ✅ `examples/ts-chat/src/routes/demo/api.tanchat.ts` - Updated to use tool registry + +## Migration Guide + +### Step 1: Convert Tool Array to Registry + +```typescript +// Before +const tools: Tool[] = [ + { type: "function", function: { name: "tool1", ... } }, + { type: "function", function: { name: "tool2", ... } }, +]; + +// After +const tools = { + tool1: { type: "function" as const, function: { name: "tool1", ... } }, + tool2: { type: "function" as const, function: { name: "tool2", ... } }, +} as const; // ← Important! +``` + +### Step 2: Register Tools in Constructor + +```typescript +// Before +const ai = new AI({ + adapters: { + /* ... */ + }, +}) + +// After +const ai = new AI({ + adapters: { + /* ... */ + }, + tools, // ← Add tools here +}) +``` + +### Step 3: Use Tool Names in Chat Calls + +```typescript +// Before +ai.chat({ + messages: [...], + tools: tools, // ← Full array +}); + +// After +ai.chat({ + messages: [...], + tools: ["tool1", "tool2"], // ← Just names! +}); +``` + +## Testing + +Verify type safety: + +```typescript +const ai = new AI({ + adapters: { + /* ... */ + }, + tools: { + get_weather: { + /* ... */ + }, + calculate: { + /* ... */ + }, + }, +}) + +// ✅ Should work +ai.chat({ messages: [], tools: ['get_weather'] }) + +// ❌ Should show TypeScript error +ai.chat({ messages: [], tools: ['invalid_tool'] }) +``` + +## Performance + +No performance impact: + +- Tool name resolution happens once per chat call +- Minimal overhead (simple object lookup) +- Tool execution unchanged + +## Backward Compatibility + +**Breaking Change**: This is a breaking change. Users must: + +1. Convert tool arrays to registries +2. Register tools in constructor +3. Use tool names instead of objects + +However, the migration path is straightforward and provides significant benefits. + +## Future Enhancements + +Potential improvements: + +- Tool namespaces (e.g., `weather.get`, `weather.forecast`) +- Tool permissions/access control +- Tool versioning +- Dynamic tool registration +- Tool composition/chaining + +## Summary + +The Tool Registry API provides: + +✅ **Type-Safe Tool References** - Autocomplete and validation +✅ **Centralized Management** - Define once, use everywhere +✅ **Cleaner Code** - Reference by name instead of objects +✅ **Better Reusability** - Share tools across chats +✅ **Runtime Validation** - Clear error messages +✅ **Developer Experience** - Improved DX with less code + +**Result**: More maintainable, type-safe, and developer-friendly tool management! 🎉 diff --git a/ai-docs/TOOL_REGISTRY_QUICK_START.md b/ai-docs/TOOL_REGISTRY_QUICK_START.md index 996032e4e..2ea166e59 100644 --- a/ai-docs/TOOL_REGISTRY_QUICK_START.md +++ b/ai-docs/TOOL_REGISTRY_QUICK_START.md @@ -1,208 +1,208 @@ -# Tool Registry API - Quick Start - -> **🔄 Automatic Tool Execution:** The `chat()` method automatically executes tools in a loop. When the model calls a tool, the SDK executes it, adds the result to messages, and continues the conversation automatically (controlled by `agentLoopStrategy`, default: `maxIterations(5)`). You don't need to manually handle tool execution! -> -> **📚 See also:** [Complete Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) - -## In 3 Steps - -### 1. Define Tools in Constructor - -```typescript -const ai = new AI({ - adapters: { - openai: new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY }), - }, - tools: { - // ← Define all tools here! - get_weather: { - type: "function" as const, - function: { - name: "get_weather", - description: "Get weather for a location", - parameters: { - type: "object", - properties: { - location: { type: "string" }, - }, - required: ["location"], - }, - }, - execute: async (args: { location: string }) => { - return JSON.stringify({ temp: 72, condition: "sunny" }); - }, - }, - calculate: { - type: "function" as const, - function: { - name: "calculate", - description: "Perform calculations", - parameters: { - type: "object", - properties: { - expression: { type: "string" }, - }, - required: ["expression"], - }, - }, - execute: async (args: { expression: string }) => { - return JSON.stringify({ result: eval(args.expression) }); - }, - }, - }, -}); -``` - -### 2. Reference Tools by Name (Type-Safe!) - -```typescript -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "What's the weather in SF?" }], - tools: ["get_weather"], // ← Type-safe! Autocomplete works! - toolChoice: "auto", -}); -``` - -### 3. Use Multiple Tools - -```typescript -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Weather in NYC and calculate 5*20" }], - tools: ["get_weather", "calculate"], // ← Both tools! - toolChoice: "auto", -}); -``` - -## Type Safety - -✅ **Autocomplete** - IDE suggests available tool names -✅ **Validation** - TypeScript catches typos at compile time -✅ **Runtime checks** - Errors if tool doesn't exist - -```typescript -// ✅ Valid -tools: ["get_weather", "calculate"]; - -// ❌ TypeScript Error -tools: ["invalid_tool"]; -``` - -## Benefits vs Old API - -### Before (Inline Tools) - -```typescript -// Had to define tools every time! -ai.chat({ - messages: [...], - tools: [ - { type: "function", function: { name: "get_weather", ... }, execute: ... }, - { type: "function", function: { name: "calculate", ... }, execute: ... }, - ], -}); -``` - -### After (Tool Registry) - -```typescript -// Define once in constructor, use by name everywhere! -ai.chat({ - messages: [...], - tools: ["get_weather", "calculate"], // ← Much cleaner! -}); -``` - -## With Streaming - -The `chat()` method automatically executes tools and emits chunks for each step: - -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather", "calculate"], - toolChoice: "auto", - agentLoopStrategy: maxIterations(5), // Optional: control loop -}); - -for await (const chunk of stream) { - if (chunk.type === "content") { - process.stdout.write(chunk.delta); // Stream text content - } else if (chunk.type === "tool_call") { - console.log(`→ Calling: ${chunk.toolCall.function.name}`); - } else if (chunk.type === "tool_result") { - console.log(`✓ Tool result: ${chunk.content}`); - } -} -``` - -**What happens internally:** - -1. Model decides to call a tool → `tool_call` chunk emitted -2. SDK executes the tool's `execute` function automatically -3. SDK emits `tool_result` chunk with the result -4. SDK adds tool result to messages and continues conversation -5. Model responds with final answer based on tool results - -## With HTTP Response - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -// Perfect for API endpoints! -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - tools: ["get_weather", "search_products", "send_email"], - toolChoice: "auto", -}); - -return toStreamResponse(stream); -``` - -## Pro Tips - -1. **Use `as const`** when defining tools for type safety -2. **Descriptive names** like `get_weather`, `search_products` -3. **Keep tools in one place** for easy maintenance -4. **List available tools**: `ai.toolNames` -5. **Get a tool**: `ai.getTool("get_weather")` - -## Common Pattern: Separate File - -```typescript -// tools.ts -export const tools = { - get_weather: { /* ... */ }, - calculate: { /* ... */ }, - search_products: { /* ... */ }, -} as const; - -// ai-client.ts -import { tools } from "./tools"; - -export const ai = new AI({ - adapters: { /* ... */ }, - tools, // ← Import from separate file! -}); - -// api.ts -import { ai } from "./ai-client"; - -ai.chat({ - messages: [...], - tools: ["get_weather"], // ← Type-safe across files! -}); -``` - -## Summary - -**Define once, use everywhere with full type safety!** 🎉 - -See full documentation: `docs/TOOL_REGISTRY.md` +# Tool Registry API - Quick Start + +> **🔄 Automatic Tool Execution:** The `chat()` method automatically executes tools in a loop. When the model calls a tool, the SDK executes it, adds the result to messages, and continues the conversation automatically (controlled by `agentLoopStrategy`, default: `maxIterations(5)`). You don't need to manually handle tool execution! +> +> **📚 See also:** [Complete Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) + +## In 3 Steps + +### 1. Define Tools in Constructor + +```typescript +const ai = new AI({ + adapters: { + openai: new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY }), + }, + tools: { + // ← Define all tools here! + get_weather: { + type: 'function' as const, + function: { + name: 'get_weather', + description: 'Get weather for a location', + parameters: { + type: 'object', + properties: { + location: { type: 'string' }, + }, + required: ['location'], + }, + }, + execute: async (args: { location: string }) => { + return JSON.stringify({ temp: 72, condition: 'sunny' }) + }, + }, + calculate: { + type: 'function' as const, + function: { + name: 'calculate', + description: 'Perform calculations', + parameters: { + type: 'object', + properties: { + expression: { type: 'string' }, + }, + required: ['expression'], + }, + }, + execute: async (args: { expression: string }) => { + return JSON.stringify({ result: eval(args.expression) }) + }, + }, + }, +}) +``` + +### 2. Reference Tools by Name (Type-Safe!) + +```typescript +const result = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: "What's the weather in SF?" }], + tools: ['get_weather'], // ← Type-safe! Autocomplete works! + toolChoice: 'auto', +}) +``` + +### 3. Use Multiple Tools + +```typescript +const result = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Weather in NYC and calculate 5*20' }], + tools: ['get_weather', 'calculate'], // ← Both tools! + toolChoice: 'auto', +}) +``` + +## Type Safety + +✅ **Autocomplete** - IDE suggests available tool names +✅ **Validation** - TypeScript catches typos at compile time +✅ **Runtime checks** - Errors if tool doesn't exist + +```typescript +// ✅ Valid +tools: ['get_weather', 'calculate'] + +// ❌ TypeScript Error +tools: ['invalid_tool'] +``` + +## Benefits vs Old API + +### Before (Inline Tools) + +```typescript +// Had to define tools every time! +ai.chat({ + messages: [...], + tools: [ + { type: "function", function: { name: "get_weather", ... }, execute: ... }, + { type: "function", function: { name: "calculate", ... }, execute: ... }, + ], +}); +``` + +### After (Tool Registry) + +```typescript +// Define once in constructor, use by name everywhere! +ai.chat({ + messages: [...], + tools: ["get_weather", "calculate"], // ← Much cleaner! +}); +``` + +## With Streaming + +The `chat()` method automatically executes tools and emits chunks for each step: + +```typescript +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather", "calculate"], + toolChoice: "auto", + agentLoopStrategy: maxIterations(5), // Optional: control loop +}); + +for await (const chunk of stream) { + if (chunk.type === "content") { + process.stdout.write(chunk.delta); // Stream text content + } else if (chunk.type === "tool_call") { + console.log(`→ Calling: ${chunk.toolCall.function.name}`); + } else if (chunk.type === "tool_result") { + console.log(`✓ Tool result: ${chunk.content}`); + } +} +``` + +**What happens internally:** + +1. Model decides to call a tool → `tool_call` chunk emitted +2. SDK executes the tool's `execute` function automatically +3. SDK emits `tool_result` chunk with the result +4. SDK adds tool result to messages and continues conversation +5. Model responds with final answer based on tool results + +## With HTTP Response + +```typescript +import { toStreamResponse } from "@tanstack/ai"; + +// Perfect for API endpoints! +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + tools: ["get_weather", "search_products", "send_email"], + toolChoice: "auto", +}); + +return toStreamResponse(stream); +``` + +## Pro Tips + +1. **Use `as const`** when defining tools for type safety +2. **Descriptive names** like `get_weather`, `search_products` +3. **Keep tools in one place** for easy maintenance +4. **List available tools**: `ai.toolNames` +5. **Get a tool**: `ai.getTool("get_weather")` + +## Common Pattern: Separate File + +```typescript +// tools.ts +export const tools = { + get_weather: { /* ... */ }, + calculate: { /* ... */ }, + search_products: { /* ... */ }, +} as const; + +// ai-client.ts +import { tools } from "./tools"; + +export const ai = new AI({ + adapters: { /* ... */ }, + tools, // ← Import from separate file! +}); + +// api.ts +import { ai } from "./ai-client"; + +ai.chat({ + messages: [...], + tools: ["get_weather"], // ← Type-safe across files! +}); +``` + +## Summary + +**Define once, use everywhere with full type safety!** 🎉 + +See full documentation: `docs/TOOL_REGISTRY.md` diff --git a/ai-docs/TOOL_STATES_MIGRATION.md b/ai-docs/TOOL_STATES_MIGRATION.md index 4aee5bfef..7b180fd84 100644 --- a/ai-docs/TOOL_STATES_MIGRATION.md +++ b/ai-docs/TOOL_STATES_MIGRATION.md @@ -13,15 +13,17 @@ This migration introduces comprehensive tool state tracking and a parts-based me The `Message` interface has been renamed to `ModelMessage` to better reflect its purpose as the format used for LLM communication. **Before:** + ```typescript -import type { Message } from "@tanstack/ai"; -const messages: Message[] = []; +import type { Message } from '@tanstack/ai' +const messages: Message[] = [] ``` **After:** + ```typescript -import type { ModelMessage } from "@tanstack/ai"; -const messages: ModelMessage[] = []; +import type { ModelMessage } from '@tanstack/ai' +const messages: ModelMessage[] = [] ``` ### 2. New UIMessage Type with Parts @@ -31,41 +33,43 @@ const messages: ModelMessage[] = []; A new `UIMessage` type has been introduced for client-side UI rendering. Messages are now composed of parts (text, tool calls, tool results) instead of flat content and toolCalls properties. **Structure:** + ```typescript interface UIMessage { - id: string; - role: "system" | "user" | "assistant"; - parts: MessagePart[]; - createdAt?: Date; + id: string + role: 'system' | 'user' | 'assistant' + parts: MessagePart[] + createdAt?: Date } -type MessagePart = TextPart | ToolCallPart | ToolResultPart; +type MessagePart = TextPart | ToolCallPart | ToolResultPart interface TextPart { - type: "text"; - content: string; + type: 'text' + content: string } interface ToolCallPart { - type: "tool-call"; - id: string; - name: string; - arguments: string; - state: ToolCallState; // "awaiting-input" | "input-streaming" | "input-complete" + type: 'tool-call' + id: string + name: string + arguments: string + state: ToolCallState // "awaiting-input" | "input-streaming" | "input-complete" } interface ToolResultPart { - type: "tool-result"; - toolCallId: string; - content: string; - state: ToolResultState; // "streaming" | "complete" | "error" - error?: string; + type: 'tool-result' + toolCallId: string + content: string + state: ToolResultState // "streaming" | "complete" | "error" + error?: string } ``` ### 3. Tool Call States Tool calls now track their lifecycle: + - **awaiting-input**: Tool call started but no arguments received yet - **input-streaming**: Partial arguments received (uses loose JSON parser) - **input-complete**: All arguments received @@ -75,10 +79,10 @@ Tool calls now track their lifecycle: A new loose JSON parser has been integrated to handle incomplete tool arguments during streaming: ```typescript -import { parsePartialJSON } from "@tanstack/ai-client"; +import { parsePartialJSON } from '@tanstack/ai-client' -const partialArgs = '{"name": "John", "ag'; -const parsed = parsePartialJSON(partialArgs); // { name: "John" } +const partialArgs = '{"name": "John", "ag' +const parsed = parsePartialJSON(partialArgs) // { name: "John" } ``` ### 5. Automatic Conversion @@ -89,15 +93,15 @@ Connection adapters automatically convert `UIMessage[]` to `ModelMessage[]` befo // Client code - works with UIMessages const messages: UIMessage[] = [ { - id: "1", - role: "user", - parts: [{ type: "text", content: "Hello" }] - } -]; + id: '1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], + }, +] // Automatically converted to ModelMessages when sent -const connection = fetchServerSentEvents("/api/chat"); -const stream = connection.connect(messages); // Converts internally +const connection = fetchServerSentEvents('/api/chat') +const stream = connection.connect(messages) // Converts internally ``` ## Migration Steps @@ -105,12 +109,14 @@ const stream = connection.connect(messages); // Converts internally ### For CLI/Backend Code (using @tanstack/ai) **Step 1:** Update type imports + ```diff - import type { Message } from "@tanstack/ai"; + import type { ModelMessage } from "@tanstack/ai"; ``` **Step 2:** Update variable types + ```diff - const messages: Message[] = []; + const messages: ModelMessage[] = []; @@ -121,6 +127,7 @@ const stream = connection.connect(messages); // Converts internally **Step 1:** Update message rendering to use parts **Before:** + ```typescript {messages.map(({ id, role, content, toolCalls }) => (
@@ -131,15 +138,16 @@ const stream = connection.connect(messages); // Converts internally ``` **After:** + ```typescript {messages.map(({ id, role, parts }) => { const textContent = parts .filter(p => p.type === "text") .map(p => p.content) .join(""); - + const toolCallParts = parts.filter(p => p.type === "tool-call"); - + return (
{textContent &&

{textContent}

} @@ -150,6 +158,7 @@ const stream = connection.connect(messages); // Converts internally ``` **Step 2:** Access tool call state + ```typescript {toolCallParts.map(tc => (
@@ -174,13 +183,13 @@ Monitor tool call progress in real-time: const processor = new StreamProcessor({ handlers: { onToolCallStateChange: (index, id, name, state, args, parsedArgs) => { - console.log(`Tool ${name} is now ${state}`); + console.log(`Tool ${name} is now ${state}`) if (parsedArgs) { - console.log("Parsed arguments so far:", parsedArgs); + console.log('Parsed arguments so far:', parsedArgs) } - } - } -}); + }, + }, +}) ``` ### 2. Message Converters @@ -191,17 +200,17 @@ Convert between UIMessages and ModelMessages: import { uiMessageToModelMessages, modelMessageToUIMessage, - modelMessagesToUIMessages -} from "@tanstack/ai-client"; + modelMessagesToUIMessages, +} from '@tanstack/ai-client' // Convert UI message to model message(s) -const modelMessages = uiMessageToModelMessages(uiMessage); +const modelMessages = uiMessageToModelMessages(uiMessage) // Convert model message to UI message -const uiMessage = modelMessageToUIMessage(modelMessage, "msg-123"); +const uiMessage = modelMessageToUIMessage(modelMessage, 'msg-123') // Convert array of model messages to UI messages -const uiMessages = modelMessagesToUIMessages(modelMessages); +const uiMessages = modelMessagesToUIMessages(modelMessages) ``` ### 3. Custom JSON Parser @@ -212,23 +221,27 @@ Provide your own parser for incomplete JSON: const customParser = { parse: (jsonString: string) => { // Your custom parsing logic - return myPartialJSONParser(jsonString); - } -}; + return myPartialJSONParser(jsonString) + }, +} const processor = new StreamProcessor({ jsonParser: customParser, - handlers: { /* ... */ } -}); + handlers: { + /* ... */ + }, +}) ``` ## Updated Exports ### @tanstack/ai + - ✅ `ModelMessage` (renamed from `Message`) - All other exports unchanged ### @tanstack/ai-client + - ✅ `UIMessage` - New parts-based message type - ✅ `MessagePart`, `TextPart`, `ToolCallPart`, `ToolResultPart` - Part types - ✅ `ToolCallState`, `ToolResultState` - State types @@ -239,16 +252,19 @@ const processor = new StreamProcessor({ ## Breaking Changes ### ❗️ Message Type Rename + - `Message` is now `ModelMessage` in `@tanstack/ai` - Update all type imports and variable declarations ### ❗️ UIMessage Structure Change + - Messages now have `parts: MessagePart[]` instead of `content` and `toolCalls` - Update UI rendering code to iterate over parts - Access text via `parts.filter(p => p.type === "text")` - Access tool calls via `parts.filter(p => p.type === "tool-call")` ### ✅ No Breaking Changes For + - Server-side code (Python, PHP) - continues to work as-is - Connection adapters - automatically convert UIMessages to ModelMessages - Core AI functionality - ModelMessage has same structure as old Message @@ -264,6 +280,7 @@ const processor = new StreamProcessor({ ## Examples See the updated examples: + - **CLI Example**: `/examples/cli/src/index.ts` - Uses ModelMessage - **React Chat Example**: `/examples/ts-chat/src/routes/demo/tanchat.tsx` - Uses UIMessage with parts - **AI Assistant Component**: `/examples/ts-chat/src/components/example-AIAssistant.tsx` - Uses UIMessage with parts @@ -271,4 +288,3 @@ See the updated examples: ## Support For questions or issues related to this migration, please refer to the TanStack AI documentation or open an issue on GitHub. - diff --git a/ai-docs/TYPE_NARROWING_SOLUTION.md b/ai-docs/TYPE_NARROWING_SOLUTION.md index 6526226f0..2f618e06a 100644 --- a/ai-docs/TYPE_NARROWING_SOLUTION.md +++ b/ai-docs/TYPE_NARROWING_SOLUTION.md @@ -1,156 +1,165 @@ -# Type Narrowing with Separate Methods ✅ - -> **Note**: This document describes type narrowing with the current API. The previous `as` option approach has been replaced with separate methods. - -## The Solution - -With separate methods, type narrowing is automatic and simple: - -```typescript -// Streaming - returns AsyncIterable -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], -}); -// Type: AsyncIterable ✅ - -// Promise-based - returns Promise -const result = ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [...], -}); -// Type: Promise ✅ -``` - -No need for `as const` assertions or discriminated unions - TypeScript automatically knows the return type! - -## How to Use - -### ✅ Correct Usage - Type is Automatically Narrowed - -```typescript -// Returns AsyncIterable -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], -}); - -for await (const chunk of stream) { - // TypeScript knows chunk is StreamChunk ✅ - console.log(chunk.type); -} - -// Returns Promise -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [...], -}); - -// TypeScript knows result is ChatCompletionResult ✅ -console.log(result.content); -console.log(result.usage.totalTokens); -``` - -### Type Inference Examples - -```typescript -// 1. Stream mode - returns AsyncIterable -const stream = ai.chat({ adapter: "openai", model: "gpt-4", messages: [] }); -// Type: AsyncIterable ✅ - -// 2. Promise mode - returns Promise -const promise = ai.chatCompletion({ adapter: "openai", model: "gpt-4", messages: [] }); -// Type: Promise ✅ - -// 3. After await - ChatCompletionResult -const result = await ai.chatCompletion({ adapter: "openai", model: "gpt-4", messages: [] }); -// Type: ChatCompletionResult ✅ -``` - -## Real-World Example: API Handler - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -export const Route = createAPIFileRoute("/api/chat")({ - POST: async ({ request }): Promise => { - const { messages } = await request.json(); - - // TypeScript knows this returns AsyncIterable ✅ - const stream = ai.chat({ - adapter: "openAi", - model: "gpt-4o", - messages, - fallbacks: [ - { adapter: "ollama", model: "llama2" } - ] - }); - - // Convert to Response - return toStreamResponse(stream); - } -}); -``` - -## Why Separate Methods Are Better - -With the old `as` option approach: -```typescript -const as = "response"; // Type: string -const result = ai.chat({ adapter: "openai", model: "gpt-4", messages: [], as }); -// Return type: Promise | AsyncIterable | Response -// ❌ TypeScript doesn't know which specific type -// Need: as: "response" as const -``` - -With separate methods: -```typescript -const stream = ai.chat({ adapter: "openai", model: "gpt-4", messages: [] }); -// Return type: AsyncIterable -// ✅ TypeScript knows exact type automatically! -``` - -## Technical Explanation - -The separate methods approach is simpler: - -```typescript -class AI { - chat(options: ChatOptions): AsyncIterable { - // Implementation... - } - - async chatCompletion(options: ChatOptions): Promise { - // Implementation... - } -} -``` - -TypeScript's type inference: -1. Call `chat()` → method signature says it returns `AsyncIterable` -2. Call `chatCompletion()` → method signature says it returns `Promise` -3. No conditional types needed - just straightforward method signatures! - -## Benefits - -✅ **Type Safety**: TypeScript knows exact return type at compile time -✅ **IntelliSense**: Autocomplete shows correct properties for each method -✅ **Compile-Time Errors**: Catch type mismatches before runtime -✅ **Refactoring Safety**: Changes are caught automatically -✅ **Self-Documenting**: Methods serve as inline documentation -✅ **Simpler**: No `as const` needed, no overloads needed - -## Summary - -The separate methods API provides perfect type narrowing without any special syntax: - -| Method | Return Type | -|--------|-------------| -| `chat()` | `AsyncIterable` | -| `chatCompletion()` | `Promise` | - -**Pro Tip**: Just call the method you need - TypeScript handles the rest! 🎉 +# Type Narrowing with Separate Methods ✅ + +> **Note**: This document describes type narrowing with the current API. The previous `as` option approach has been replaced with separate methods. + +## The Solution + +With separate methods, type narrowing is automatic and simple: + +```typescript +// Streaming - returns AsyncIterable +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], +}); +// Type: AsyncIterable ✅ + +// Promise-based - returns Promise +const result = ai.chatCompletion({ + adapter: "openai", + model: "gpt-4", + messages: [...], +}); +// Type: Promise ✅ +``` + +No need for `as const` assertions or discriminated unions - TypeScript automatically knows the return type! + +## How to Use + +### ✅ Correct Usage - Type is Automatically Narrowed + +```typescript +// Returns AsyncIterable +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], +}); + +for await (const chunk of stream) { + // TypeScript knows chunk is StreamChunk ✅ + console.log(chunk.type); +} + +// Returns Promise +const result = await ai.chatCompletion({ + adapter: "openai", + model: "gpt-4", + messages: [...], +}); + +// TypeScript knows result is ChatCompletionResult ✅ +console.log(result.content); +console.log(result.usage.totalTokens); +``` + +### Type Inference Examples + +```typescript +// 1. Stream mode - returns AsyncIterable +const stream = ai.chat({ adapter: 'openai', model: 'gpt-4', messages: [] }) +// Type: AsyncIterable ✅ + +// 2. Promise mode - returns Promise +const promise = ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) +// Type: Promise ✅ + +// 3. After await - ChatCompletionResult +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) +// Type: ChatCompletionResult ✅ +``` + +## Real-World Example: API Handler + +```typescript +import { toStreamResponse } from '@tanstack/ai' + +export const Route = createAPIFileRoute('/api/chat')({ + POST: async ({ request }): Promise => { + const { messages } = await request.json() + + // TypeScript knows this returns AsyncIterable ✅ + const stream = ai.chat({ + adapter: 'openAi', + model: 'gpt-4o', + messages, + fallbacks: [{ adapter: 'ollama', model: 'llama2' }], + }) + + // Convert to Response + return toStreamResponse(stream) + }, +}) +``` + +## Why Separate Methods Are Better + +With the old `as` option approach: + +```typescript +const as = 'response' // Type: string +const result = ai.chat({ adapter: 'openai', model: 'gpt-4', messages: [], as }) +// Return type: Promise | AsyncIterable | Response +// ❌ TypeScript doesn't know which specific type +// Need: as: "response" as const +``` + +With separate methods: + +```typescript +const stream = ai.chat({ adapter: 'openai', model: 'gpt-4', messages: [] }) +// Return type: AsyncIterable +// ✅ TypeScript knows exact type automatically! +``` + +## Technical Explanation + +The separate methods approach is simpler: + +```typescript +class AI { + chat(options: ChatOptions): AsyncIterable { + // Implementation... + } + + async chatCompletion(options: ChatOptions): Promise { + // Implementation... + } +} +``` + +TypeScript's type inference: + +1. Call `chat()` → method signature says it returns `AsyncIterable` +2. Call `chatCompletion()` → method signature says it returns `Promise` +3. No conditional types needed - just straightforward method signatures! + +## Benefits + +✅ **Type Safety**: TypeScript knows exact return type at compile time +✅ **IntelliSense**: Autocomplete shows correct properties for each method +✅ **Compile-Time Errors**: Catch type mismatches before runtime +✅ **Refactoring Safety**: Changes are caught automatically +✅ **Self-Documenting**: Methods serve as inline documentation +✅ **Simpler**: No `as const` needed, no overloads needed + +## Summary + +The separate methods API provides perfect type narrowing without any special syntax: + +| Method | Return Type | +| ------------------ | ------------------------------- | +| `chat()` | `AsyncIterable` | +| `chatCompletion()` | `Promise` | + +**Pro Tip**: Just call the method you need - TypeScript handles the rest! 🎉 diff --git a/ai-docs/TYPE_NARROWING_UNIFIED_CHAT.md b/ai-docs/TYPE_NARROWING_UNIFIED_CHAT.md index 879bf9d7d..adc0554d7 100644 --- a/ai-docs/TYPE_NARROWING_UNIFIED_CHAT.md +++ b/ai-docs/TYPE_NARROWING_UNIFIED_CHAT.md @@ -1,224 +1,225 @@ -# Type Narrowing in Chat API - -> **Note**: This document describes type narrowing with the current API using separate methods. The previous `as` option approach has been replaced with `chat()` for streaming and `chatCompletion()` for promise-based completion. - -## Overview - -The chat API uses separate methods, which provides automatic type narrowing without needing discriminated unions or const assertions: - -- **`chat()`** - Always returns `AsyncIterable` -- **`chatCompletion()`** - Always returns `Promise` - -TypeScript automatically knows the exact return type based on which method you call! - -## Type Narrowing Rules - -| Method | Return Type | Usage | -|--------|-------------|-------| -| `chat()` | `AsyncIterable` | Can use `for await...of`, iterate chunks | -| `chatCompletion()` | `Promise` | Can `await`, access `.content`, `.usage`, etc. | - -## Examples with Type Checking - -### 1. Promise Mode (chatCompletion) - Type is `Promise` - -```typescript -const result = ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); - -// TypeScript knows result is Promise -const resolved = await result; - -// ✅ These work - properties exist on ChatCompletionResult -console.log(resolved.content); -console.log(resolved.role); -console.log(resolved.usage.totalTokens); - -// ❌ TypeScript error - headers doesn't exist on ChatCompletionResult -console.log(resolved.headers); // Type error! -``` - -### 2. Stream Mode (chat) - Type is `AsyncIterable` - -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); - -// TypeScript knows stream is AsyncIterable -// ✅ This works - can iterate async iterable -for await (const chunk of stream) { - console.log(chunk.type); - console.log(chunk.id); - console.log(chunk.model); -} - -// ❌ TypeScript error - content doesn't exist on AsyncIterable -console.log(stream.content); // Type error! - -// ❌ TypeScript error - headers doesn't exist on AsyncIterable -console.log(stream.headers); // Type error! -``` - -### 3. HTTP Response Mode - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); - -const response = toStreamResponse(stream); - -// TypeScript knows response is Response -// ✅ These work - properties exist on Response -console.log(response.headers); -console.log(response.body); -console.log(response.status); -console.log(response.ok); - -const contentType = response.headers.get("Content-Type"); - -// ❌ TypeScript error - content doesn't exist on Response -console.log(response.content); // Type error! -``` - -## Function Return Type Inference - -TypeScript correctly infers return types in functions: - -### API Handler - Returns `Response` - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -function apiHandler() { - const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - }); - - return toStreamResponse(stream); - // TypeScript infers: function apiHandler(): Response ✅ -} -``` - -### Type-safe API Handler - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -function apiHandler(): Response { - const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - }); - - return toStreamResponse(stream); // ✅ Correct - returns Response -} - -function wrongApiHandler(): Response { - const result = ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [...], - }); - - return result; // ❌ TypeScript error - returns Promise, not Response -} -``` - -### Streaming Handler - -```typescript -async function* streamHandler() { - const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - }); - - // TypeScript knows stream is AsyncIterable - for await (const chunk of stream) { - yield chunk; // ✅ Works perfectly - } -} -``` - -## With Fallbacks - Type Narrowing Still Works - -```typescript -// Promise with fallbacks - Type: Promise -const promise = ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [...], - fallbacks: [{ adapter: "ollama", model: "llama2" }] -}); -const resolved = await promise; -console.log(resolved.content); // ✅ Works - -// Stream with fallbacks - Type: AsyncIterable -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - fallbacks: [{ adapter: "ollama", model: "llama2" }] -}); -for await (const chunk of stream) { - console.log(chunk.type); // ✅ Works -} -``` - -## How It Works (Technical Details) - -With separate methods, TypeScript doesn't need function overloads or conditional types: - -```typescript -class AI { - // Simple method signatures - no overloads needed! - chat(options: ChatOptions): AsyncIterable { - return this.adapter.chatStream(options); - } - - async chatCompletion(options: ChatOptions): Promise { - return this.adapter.chatCompletion(options); - } -} -``` - -TypeScript's type inference is straightforward: -- Call `chat()` → get `AsyncIterable` -- Call `chatCompletion()` → get `Promise` - -No need for `as const` assertions or discriminated unions! - -## Benefits - -✅ **Type Safety**: TypeScript knows exact return type at compile time -✅ **IntelliSense**: Autocomplete shows correct properties for each method -✅ **Compile-Time Errors**: Catch type mismatches before runtime -✅ **Refactoring Safety**: Changes are caught automatically -✅ **Self-Documenting**: Methods serve as inline documentation -✅ **Simpler**: No need for const assertions or overloads - -## Summary - -The separate methods API provides perfect type narrowing automatically: - -| Code | Return Type | -|------|-------------| -| `chat()` | `AsyncIterable` | -| `chatCompletion()` | `Promise` | - -TypeScript enforces these types at compile time, providing complete type safety without any special syntax! 🎉 +# Type Narrowing in Chat API + +> **Note**: This document describes type narrowing with the current API using separate methods. The previous `as` option approach has been replaced with `chat()` for streaming and `chatCompletion()` for promise-based completion. + +## Overview + +The chat API uses separate methods, which provides automatic type narrowing without needing discriminated unions or const assertions: + +- **`chat()`** - Always returns `AsyncIterable` +- **`chatCompletion()`** - Always returns `Promise` + +TypeScript automatically knows the exact return type based on which method you call! + +## Type Narrowing Rules + +| Method | Return Type | Usage | +| ------------------ | ------------------------------- | ---------------------------------------------- | +| `chat()` | `AsyncIterable` | Can use `for await...of`, iterate chunks | +| `chatCompletion()` | `Promise` | Can `await`, access `.content`, `.usage`, etc. | + +## Examples with Type Checking + +### 1. Promise Mode (chatCompletion) - Type is `Promise` + +```typescript +const result = ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) + +// TypeScript knows result is Promise +const resolved = await result + +// ✅ These work - properties exist on ChatCompletionResult +console.log(resolved.content) +console.log(resolved.role) +console.log(resolved.usage.totalTokens) + +// ❌ TypeScript error - headers doesn't exist on ChatCompletionResult +console.log(resolved.headers) // Type error! +``` + +### 2. Stream Mode (chat) - Type is `AsyncIterable` + +```typescript +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) + +// TypeScript knows stream is AsyncIterable +// ✅ This works - can iterate async iterable +for await (const chunk of stream) { + console.log(chunk.type) + console.log(chunk.id) + console.log(chunk.model) +} + +// ❌ TypeScript error - content doesn't exist on AsyncIterable +console.log(stream.content) // Type error! + +// ❌ TypeScript error - headers doesn't exist on AsyncIterable +console.log(stream.headers) // Type error! +``` + +### 3. HTTP Response Mode + +```typescript +import { toStreamResponse } from '@tanstack/ai' + +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) + +const response = toStreamResponse(stream) + +// TypeScript knows response is Response +// ✅ These work - properties exist on Response +console.log(response.headers) +console.log(response.body) +console.log(response.status) +console.log(response.ok) + +const contentType = response.headers.get('Content-Type') + +// ❌ TypeScript error - content doesn't exist on Response +console.log(response.content) // Type error! +``` + +## Function Return Type Inference + +TypeScript correctly infers return types in functions: + +### API Handler - Returns `Response` + +```typescript +import { toStreamResponse } from "@tanstack/ai"; + +function apiHandler() { + const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + }); + + return toStreamResponse(stream); + // TypeScript infers: function apiHandler(): Response ✅ +} +``` + +### Type-safe API Handler + +```typescript +import { toStreamResponse } from "@tanstack/ai"; + +function apiHandler(): Response { + const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + }); + + return toStreamResponse(stream); // ✅ Correct - returns Response +} + +function wrongApiHandler(): Response { + const result = ai.chatCompletion({ + adapter: "openai", + model: "gpt-4", + messages: [...], + }); + + return result; // ❌ TypeScript error - returns Promise, not Response +} +``` + +### Streaming Handler + +```typescript +async function* streamHandler() { + const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + }); + + // TypeScript knows stream is AsyncIterable + for await (const chunk of stream) { + yield chunk; // ✅ Works perfectly + } +} +``` + +## With Fallbacks - Type Narrowing Still Works + +```typescript +// Promise with fallbacks - Type: Promise +const promise = ai.chatCompletion({ + adapter: "openai", + model: "gpt-4", + messages: [...], + fallbacks: [{ adapter: "ollama", model: "llama2" }] +}); +const resolved = await promise; +console.log(resolved.content); // ✅ Works + +// Stream with fallbacks - Type: AsyncIterable +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + fallbacks: [{ adapter: "ollama", model: "llama2" }] +}); +for await (const chunk of stream) { + console.log(chunk.type); // ✅ Works +} +``` + +## How It Works (Technical Details) + +With separate methods, TypeScript doesn't need function overloads or conditional types: + +```typescript +class AI { + // Simple method signatures - no overloads needed! + chat(options: ChatOptions): AsyncIterable { + return this.adapter.chatStream(options) + } + + async chatCompletion(options: ChatOptions): Promise { + return this.adapter.chatCompletion(options) + } +} +``` + +TypeScript's type inference is straightforward: + +- Call `chat()` → get `AsyncIterable` +- Call `chatCompletion()` → get `Promise` + +No need for `as const` assertions or discriminated unions! + +## Benefits + +✅ **Type Safety**: TypeScript knows exact return type at compile time +✅ **IntelliSense**: Autocomplete shows correct properties for each method +✅ **Compile-Time Errors**: Catch type mismatches before runtime +✅ **Refactoring Safety**: Changes are caught automatically +✅ **Self-Documenting**: Methods serve as inline documentation +✅ **Simpler**: No need for const assertions or overloads + +## Summary + +The separate methods API provides perfect type narrowing automatically: + +| Code | Return Type | +| ------------------ | ------------------------------- | +| `chat()` | `AsyncIterable` | +| `chatCompletion()` | `Promise` | + +TypeScript enforces these types at compile time, providing complete type safety without any special syntax! 🎉 diff --git a/ai-docs/TYPE_SAFETY.md b/ai-docs/TYPE_SAFETY.md index 08d44be8a..48cf95eeb 100644 --- a/ai-docs/TYPE_SAFETY.md +++ b/ai-docs/TYPE_SAFETY.md @@ -1,303 +1,305 @@ -# Type-Safe Multi-Adapter AI API - -This package provides complete TypeScript type safety for working with multiple AI providers, ensuring that you can only use models that are supported by each adapter. - -## Features - -- ✅ **Adapter-specific model validation** - TypeScript prevents using GPT models with Anthropic and vice versa -- ✅ **Full autocomplete support** - Your IDE suggests only valid models for the selected adapter -- ✅ **Compile-time safety** - Catch model incompatibilities before runtime -- ✅ **Multi-adapter support** - Use multiple AI providers in a single application -- ✅ **Type inference** - Model types are automatically inferred from adapter configuration - -## Installation - -```bash -npm install @tanstack/ai @tanstack/ai-openai @tanstack/ai-anthropic -``` - -## Basic Usage - -### Creating an AI instance with multiple adapters - -```typescript -import { AI } from "@tanstack/ai"; -import { OpenAIAdapter } from "@tanstack/ai-openai"; -import { AnthropicAdapter } from "@tanstack/ai-anthropic"; - -const ai = new AI({ - adapters: { - "openai": new OpenAIAdapter({ - apiKey: process.env.OPENAI_API_KEY!, - }), - "anthropic": new AnthropicAdapter({ - apiKey: process.env.ANTHROPIC_API_KEY!, - }), - }, -}); -``` - -### Type-safe model selection - -```typescript -// ✅ VALID - OpenAI with GPT model -await ai.chat({ - adapter: "openai", - model: "gpt-4", // TypeScript knows this is valid - messages: [{ role: "user", content: "Hello!" }], -}); - -// ✅ VALID - Anthropic with Claude model -await ai.chat({ - adapter: "anthropic", - model: "claude-3-5-sonnet-20241022", // TypeScript knows this is valid - messages: [{ role: "user", content: "Hello!" }], -}); - -// ❌ COMPILE ERROR - Wrong model for adapter -await ai.chat({ - adapter: "anthropic", - model: "gpt-4", // TypeScript error: "gpt-4" not valid for Anthropic! - messages: [{ role: "user", content: "Hello!" }], -}); - -// ❌ COMPILE ERROR - Wrong model for adapter -await ai.chat({ - adapter: "openai", - model: "claude-3-5-sonnet-20241022", // TypeScript error: Claude not valid for OpenAI! - messages: [{ role: "user", content: "Hello!" }], -}); -``` - -## Available Models - -### OpenAI Models - -```typescript -type OpenAIModel = - | "gpt-4" - | "gpt-4-turbo" - | "gpt-4-turbo-preview" - | "gpt-4o" - | "gpt-4o-mini" - | "gpt-3.5-turbo" - | "gpt-3.5-turbo-16k" - | "gpt-3.5-turbo-instruct" - | "text-embedding-ada-002" - | "text-embedding-3-small" - | "text-embedding-3-large"; -``` - -### Anthropic Models - -```typescript -type AnthropicModel = - | "claude-3-5-sonnet-20241022" - | "claude-3-5-sonnet-20240620" - | "claude-3-opus-20240229" - | "claude-3-sonnet-20240229" - | "claude-3-haiku-20240307" - | "claude-2.1" - | "claude-2.0" - | "claude-instant-1.2"; -``` - -## API Methods - -All methods support the same type-safe adapter and model selection: - -### Chat Completion - -```typescript -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [ - { role: "system", content: "You are a helpful assistant." }, - { role: "user", content: "What is TypeScript?" }, - ], - temperature: 0.7, - maxTokens: 500, -}); -``` - -### Streaming Chat - -```typescript -for await (const chunk of ai.streamChat({ - adapter: "anthropic", - model: "claude-3-5-sonnet-20241022", - messages: [{ role: "user", content: "Count from 1 to 5" }], -})) { - if (chunk.type === "content") { - process.stdout.write(chunk.delta); - } -} -``` - -### Text Generation - -```typescript -const result = await ai.generateText({ - adapter: "openai", - model: "gpt-3.5-turbo-instruct", - prompt: "Write a haiku about TypeScript", - maxTokens: 100, -}); -``` - -### Summarization - -```typescript -const result = await ai.summarize({ - adapter: "anthropic", - model: "claude-3-haiku-20240307", - text: "Long text to summarize...", - style: "bullet-points", - maxLength: 200, -}); -``` - -### Embeddings - -```typescript -const result = await ai.embed({ - adapter: "openai", - model: "text-embedding-3-small", - input: "Text to embed", -}); -``` - -## Advanced Features - -### Dynamic Adapter Addition - -```typescript -const aiWithGemini = ai.addAdapter( - "gemini", - new GeminiAdapter({ apiKey: "..." }) -); - -// Now "gemini" is available with full type safety -await aiWithGemini.chat({ - adapter: "gemini", - model: "gemini-pro", // Types updated automatically - messages: [{ role: "user", content: "Hello!" }], -}); -``` - -### Getting Available Adapters - -```typescript -console.log(ai.adapterNames); // ["openai", "anthropic"] -``` - -### Direct Adapter Access - -```typescript -const openai = ai.getAdapter("openai"); -console.log(openai.models); // Array of OpenAI models -``` - -## Benefits - -### 1. Compile-Time Safety - -**Before:** -```typescript -// Runtime error when deployed -await ai.chat({ - provider: "anthropic", - model: "gpt-4", // Oops! Wrong model -}); -// Error: Model 'gpt-4' not found for provider 'anthropic' -``` - -**After:** -```typescript -// Compile-time error in your editor -await ai.chat({ - adapter: "anthropic", - model: "gpt-4", // TypeScript error immediately -}); -// Error: Type '"gpt-4"' is not assignable to type 'claude-...' -``` - -### 2. IDE Autocomplete - -When you type `model:`, your IDE will show you **only** the models available for the selected adapter: - -- Select `openai` → See GPT models -- Select `anthropic` → See Claude models - -### 3. Refactoring Safety - -If you switch adapters, TypeScript will immediately flag any incompatible models: - -```typescript -// Change from OpenAI to Anthropic -await ai.chat({ - adapter: "anthropic", // Changed this - model: "gpt-4", // TypeScript immediately flags this as an error - messages: [], -}); -``` - -### 4. Self-Documenting Code - -The types serve as documentation - you can see all available models without checking docs: - -```typescript -// Hover over "model" to see all valid options -ai.chat({ adapter: "openai", model: /* hover here */ }); -``` - -## Creating Custom Adapters - -To create a custom adapter with type safety: - -```typescript -import { BaseAdapter } from "@tanstack/ai"; - -const MY_MODELS = ["my-model-1", "my-model-2", "my-model-3"] as const; - -export class MyAdapter extends BaseAdapter { - name = "my-adapter"; - models = MY_MODELS; - - // Implement required methods... -} -``` - -Then use it with full type safety: - -```typescript -const ai = new AI({ - adapters: { - "my-adapter": new MyAdapter({ apiKey: "..." }), - }, -}); - -// TypeScript now knows about "my-model-1", "my-model-2", etc. -await ai.chat({ - adapter: "my-adapter", - model: "my-model-1", // Autocomplete works! - messages: [], -}); -``` - -## Examples - -See the `/examples` directory for complete working examples: - -- `model-safety-demo.ts` - Comprehensive demonstration of type safety -- `type-safety-demo.ts` - Quick reference showing valid and invalid usage -- `multi-adapter-example.ts` - Real-world multi-adapter usage - -## TypeScript Configuration - -This package requires TypeScript 4.5 or higher for full type inference support. - -## License - -MIT +# Type-Safe Multi-Adapter AI API + +This package provides complete TypeScript type safety for working with multiple AI providers, ensuring that you can only use models that are supported by each adapter. + +## Features + +- ✅ **Adapter-specific model validation** - TypeScript prevents using GPT models with Anthropic and vice versa +- ✅ **Full autocomplete support** - Your IDE suggests only valid models for the selected adapter +- ✅ **Compile-time safety** - Catch model incompatibilities before runtime +- ✅ **Multi-adapter support** - Use multiple AI providers in a single application +- ✅ **Type inference** - Model types are automatically inferred from adapter configuration + +## Installation + +```bash +npm install @tanstack/ai @tanstack/ai-openai @tanstack/ai-anthropic +``` + +## Basic Usage + +### Creating an AI instance with multiple adapters + +```typescript +import { AI } from '@tanstack/ai' +import { OpenAIAdapter } from '@tanstack/ai-openai' +import { AnthropicAdapter } from '@tanstack/ai-anthropic' + +const ai = new AI({ + adapters: { + openai: new OpenAIAdapter({ + apiKey: process.env.OPENAI_API_KEY!, + }), + anthropic: new AnthropicAdapter({ + apiKey: process.env.ANTHROPIC_API_KEY!, + }), + }, +}) +``` + +### Type-safe model selection + +```typescript +// ✅ VALID - OpenAI with GPT model +await ai.chat({ + adapter: 'openai', + model: 'gpt-4', // TypeScript knows this is valid + messages: [{ role: 'user', content: 'Hello!' }], +}) + +// ✅ VALID - Anthropic with Claude model +await ai.chat({ + adapter: 'anthropic', + model: 'claude-3-5-sonnet-20241022', // TypeScript knows this is valid + messages: [{ role: 'user', content: 'Hello!' }], +}) + +// ❌ COMPILE ERROR - Wrong model for adapter +await ai.chat({ + adapter: 'anthropic', + model: 'gpt-4', // TypeScript error: "gpt-4" not valid for Anthropic! + messages: [{ role: 'user', content: 'Hello!' }], +}) + +// ❌ COMPILE ERROR - Wrong model for adapter +await ai.chat({ + adapter: 'openai', + model: 'claude-3-5-sonnet-20241022', // TypeScript error: Claude not valid for OpenAI! + messages: [{ role: 'user', content: 'Hello!' }], +}) +``` + +## Available Models + +### OpenAI Models + +```typescript +type OpenAIModel = + | 'gpt-4' + | 'gpt-4-turbo' + | 'gpt-4-turbo-preview' + | 'gpt-4o' + | 'gpt-4o-mini' + | 'gpt-3.5-turbo' + | 'gpt-3.5-turbo-16k' + | 'gpt-3.5-turbo-instruct' + | 'text-embedding-ada-002' + | 'text-embedding-3-small' + | 'text-embedding-3-large' +``` + +### Anthropic Models + +```typescript +type AnthropicModel = + | 'claude-3-5-sonnet-20241022' + | 'claude-3-5-sonnet-20240620' + | 'claude-3-opus-20240229' + | 'claude-3-sonnet-20240229' + | 'claude-3-haiku-20240307' + | 'claude-2.1' + | 'claude-2.0' + | 'claude-instant-1.2' +``` + +## API Methods + +All methods support the same type-safe adapter and model selection: + +### Chat Completion + +```typescript +const result = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [ + { role: 'system', content: 'You are a helpful assistant.' }, + { role: 'user', content: 'What is TypeScript?' }, + ], + temperature: 0.7, + maxTokens: 500, +}) +``` + +### Streaming Chat + +```typescript +for await (const chunk of ai.streamChat({ + adapter: 'anthropic', + model: 'claude-3-5-sonnet-20241022', + messages: [{ role: 'user', content: 'Count from 1 to 5' }], +})) { + if (chunk.type === 'content') { + process.stdout.write(chunk.delta) + } +} +``` + +### Text Generation + +```typescript +const result = await ai.generateText({ + adapter: 'openai', + model: 'gpt-3.5-turbo-instruct', + prompt: 'Write a haiku about TypeScript', + maxTokens: 100, +}) +``` + +### Summarization + +```typescript +const result = await ai.summarize({ + adapter: 'anthropic', + model: 'claude-3-haiku-20240307', + text: 'Long text to summarize...', + style: 'bullet-points', + maxLength: 200, +}) +``` + +### Embeddings + +```typescript +const result = await ai.embed({ + adapter: 'openai', + model: 'text-embedding-3-small', + input: 'Text to embed', +}) +``` + +## Advanced Features + +### Dynamic Adapter Addition + +```typescript +const aiWithGemini = ai.addAdapter( + 'gemini', + new GeminiAdapter({ apiKey: '...' }), +) + +// Now "gemini" is available with full type safety +await aiWithGemini.chat({ + adapter: 'gemini', + model: 'gemini-pro', // Types updated automatically + messages: [{ role: 'user', content: 'Hello!' }], +}) +``` + +### Getting Available Adapters + +```typescript +console.log(ai.adapterNames) // ["openai", "anthropic"] +``` + +### Direct Adapter Access + +```typescript +const openai = ai.getAdapter('openai') +console.log(openai.models) // Array of OpenAI models +``` + +## Benefits + +### 1. Compile-Time Safety + +**Before:** + +```typescript +// Runtime error when deployed +await ai.chat({ + provider: 'anthropic', + model: 'gpt-4', // Oops! Wrong model +}) +// Error: Model 'gpt-4' not found for provider 'anthropic' +``` + +**After:** + +```typescript +// Compile-time error in your editor +await ai.chat({ + adapter: 'anthropic', + model: 'gpt-4', // TypeScript error immediately +}) +// Error: Type '"gpt-4"' is not assignable to type 'claude-...' +``` + +### 2. IDE Autocomplete + +When you type `model:`, your IDE will show you **only** the models available for the selected adapter: + +- Select `openai` → See GPT models +- Select `anthropic` → See Claude models + +### 3. Refactoring Safety + +If you switch adapters, TypeScript will immediately flag any incompatible models: + +```typescript +// Change from OpenAI to Anthropic +await ai.chat({ + adapter: 'anthropic', // Changed this + model: 'gpt-4', // TypeScript immediately flags this as an error + messages: [], +}) +``` + +### 4. Self-Documenting Code + +The types serve as documentation - you can see all available models without checking docs: + +```typescript +// Hover over "model" to see all valid options +ai.chat({ adapter: "openai", model: /* hover here */ }); +``` + +## Creating Custom Adapters + +To create a custom adapter with type safety: + +```typescript +import { BaseAdapter } from '@tanstack/ai' + +const MY_MODELS = ['my-model-1', 'my-model-2', 'my-model-3'] as const + +export class MyAdapter extends BaseAdapter { + name = 'my-adapter' + models = MY_MODELS + + // Implement required methods... +} +``` + +Then use it with full type safety: + +```typescript +const ai = new AI({ + adapters: { + 'my-adapter': new MyAdapter({ apiKey: '...' }), + }, +}) + +// TypeScript now knows about "my-model-1", "my-model-2", etc. +await ai.chat({ + adapter: 'my-adapter', + model: 'my-model-1', // Autocomplete works! + messages: [], +}) +``` + +## Examples + +See the `/examples` directory for complete working examples: + +- `model-safety-demo.ts` - Comprehensive demonstration of type safety +- `type-safety-demo.ts` - Quick reference showing valid and invalid usage +- `multi-adapter-example.ts` - Real-world multi-adapter usage + +## TypeScript Configuration + +This package requires TypeScript 4.5 or higher for full type inference support. + +## License + +MIT diff --git a/ai-docs/UNIFIED_CHAT_API.md b/ai-docs/UNIFIED_CHAT_API.md index cea718387..300fa93ea 100644 --- a/ai-docs/UNIFIED_CHAT_API.md +++ b/ai-docs/UNIFIED_CHAT_API.md @@ -1,389 +1,389 @@ -# Unified Chat API - -## Overview - -The chat API provides two methods for different use cases: - -- **`chat()`** - Returns `AsyncIterable` - streaming with **automatic tool execution loop** -- **`chatCompletion()`** - Returns `Promise` - standard non-streaming chat with optional structured output - -### 🔄 Automatic Tool Execution in `chat()` - -**IMPORTANT:** The `chat()` method runs an automatic tool execution loop. When you provide tools with `execute` functions: - -1. **Model calls a tool** → SDK executes it automatically -2. **SDK emits chunks** for tool calls and results (`tool_call`, `tool_result`) -3. **SDK adds results** to messages and continues conversation -4. **Loop repeats** until stopped by `agentLoopStrategy` (default: `maxIterations(5)`) - -**You don't need to manually execute tools or manage conversation state** - the SDK handles everything internally! - -**📚 See also:** [Complete Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) - -## Migration Guide - -### Before (Using `as` option) - -```typescript -// For non-streaming -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], - as: "promise", -}); - -// For streaming -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], - as: "stream", -}); -for await (const chunk of stream) { - console.log(chunk); -} - -// For HTTP response -const response = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], - as: "response", -}); -return response; -``` - -### After (Separate Methods) - -```typescript -// For non-streaming - use chatCompletion() -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); - -// For streaming - use chat() -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); -for await (const chunk of stream) { - console.log(chunk); -} - -// For HTTP response - use chat() + toStreamResponse() -import { toStreamResponse } from "@tanstack/ai"; - -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); -return toStreamResponse(stream); -``` - -## Usage Examples - -### 1. Promise Mode (chatCompletion) - -Standard non-streaming chat completion: - -```typescript -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [ - { role: "system", content: "You are a helpful assistant." }, - { role: "user", content: "What is TypeScript?" }, - ], - temperature: 0.7, -}); - -console.log(result.content); -console.log(`Tokens used: ${result.usage.totalTokens}`); -``` - -### 2. Stream Mode (chat) - -Streaming with automatic tool execution loop: - -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Write a story" }], - tools: [weatherTool], // Optional: tools are auto-executed - agentLoopStrategy: maxIterations(5), // Optional: control loop -}); - -for await (const chunk of stream) { - if (chunk.type === "content") { - process.stdout.write(chunk.delta); // Stream text response - } else if (chunk.type === "tool_call") { - console.log(`→ Calling tool: ${chunk.toolCall.function.name}`); - } else if (chunk.type === "tool_result") { - console.log(`✓ Tool result: ${chunk.content}`); - } else if (chunk.type === "done") { - console.log(`\nFinished: ${chunk.finishReason}`); - console.log(`Tokens: ${chunk.usage?.totalTokens}`); - } -} -``` - -**Chunk Types:** - -- `content` - Text content from the model (use `chunk.delta` for streaming) -- `tool_call` - Model is calling a tool (emitted by model, auto-executed by SDK) -- `tool_result` - Tool execution result (emitted after SDK executes tool) -- `done` - Stream complete (includes `finishReason` and token usage) -- `error` - An error occurred - -### 3. HTTP Response Mode - -Perfect for API endpoints: - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -// TanStack Start API Route -export const POST = async ({ request }: { request: Request }) => { - const { messages } = await request.json(); - - const stream = ai.chat({ - adapter: "openai", - model: "gpt-4o", - messages, - temperature: 0.7, - }); - - // Convert stream to Response with SSE headers - return toStreamResponse(stream); -}; -``` - -## With Fallbacks - -Both methods support fallbacks: - -```typescript -// Promise mode with fallbacks -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], - fallbacks: [ - { adapter: "anthropic", model: "claude-3-sonnet-20240229" }, - { adapter: "ollama", model: "llama2" }, - ], -}); - -// Stream mode with fallbacks -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], - fallbacks: [{ adapter: "anthropic", model: "claude-3-sonnet-20240229" }], -}); - -// HTTP response with fallbacks (seamless failover in HTTP streaming!) -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], - fallbacks: [{ adapter: "ollama", model: "llama2" }], -}); -return toStreamResponse(stream); -``` - -## Tool Execution with Automatic Loop - -**The `chat()` method automatically executes tools in a loop** - no manual management needed! - -```typescript -const tools = [ - { - type: "function" as const, - function: { - name: "get_weather", - description: "Get weather for a location", - parameters: { - type: "object", - properties: { - location: { type: "string" }, - }, - required: ["location"], - }, - }, - execute: async (args: { location: string }) => { - // This function is automatically called by the SDK - const weather = await fetchWeatherAPI(args.location); - return JSON.stringify(weather); - }, - }, -]; - -// Streaming chat with automatic tool execution -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "What's the weather in SF?" }], - tools, // Tools with execute functions are auto-executed - toolChoice: "auto", - agentLoopStrategy: maxIterations(5), // Control loop behavior -}); - -for await (const chunk of stream) { - if (chunk.type === "content") { - process.stdout.write(chunk.delta); // Stream text response - } else if (chunk.type === "tool_call") { - // Model decided to call a tool - SDK will execute it automatically - console.log(`→ Calling: ${chunk.toolCall.function.name}`); - } else if (chunk.type === "tool_result") { - // SDK executed the tool and got a result - console.log(`✓ Result: ${chunk.content}`); - } else if (chunk.type === "done") { - console.log(`Finished: ${chunk.finishReason}`); - } -} -``` - -**🔄 What Happens Internally:** - -1. User asks: "What's the weather in SF?" -2. Model decides to call `get_weather` tool - - SDK emits `tool_call` chunk -3. **SDK automatically executes** `tools[0].execute({ location: "SF" })` - - SDK emits `tool_result` chunk -4. SDK adds assistant message (with tool call) + tool result to messages -5. **SDK automatically continues** conversation by calling model again -6. Model responds: "The weather in SF is sunny, 72°F" - - SDK emits `content` chunks -7. SDK emits `done` chunk - -**Key Points:** - -- ✅ Tools are **automatically executed** by the SDK (you don't call `execute`) -- ✅ Tool results are **automatically added** to messages -- ✅ Conversation **automatically continues** after tool execution -- ✅ Loop controlled by `agentLoopStrategy` (default: `maxIterations(5)`) -- ✅ All you do is handle chunks for display -- ✅ Custom strategies available for advanced control - -**Promise Mode (No Tool Execution):** - -The `chatCompletion()` method does NOT execute tools - it returns the model's response immediately: - -```typescript -// chatCompletion does not execute tools -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "What's the weather in SF?" }], - tools, -}); - -// If model wanted to call a tool, result.toolCalls will contain the calls -// but they won't be executed. This is useful if you want manual control. -if (result.toolCalls) { - console.log("Model wants to call:", result.toolCalls); - // You would execute manually and call chatCompletion again -} -``` - -## Type Safety - -TypeScript automatically infers the correct return type: - -```typescript -// Type: Promise -const promise = ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [], -}); - -// Type: AsyncIterable -const stream = ai.chat({ adapter: "openai", model: "gpt-4", messages: [] }); -``` - -## Benefits - -1. **Clearer API**: Separate methods for different use cases -2. **Consistent Interface**: Same options across both methods -3. **HTTP Streaming Made Easy**: Use `toStreamResponse()` helper -4. **Fallbacks Everywhere**: Both methods support the same fallback mechanism -5. **Type Safety**: TypeScript infers the correct return type -6. **Structured Outputs**: Available in `chatCompletion()` method - -## Real-World Example: TanStack Start API - -```typescript -import { createAPIFileRoute } from "@tanstack/start/api"; -import { ai } from "~/lib/ai-client"; -import { toStreamResponse } from "@tanstack/ai"; - -export const Route = createAPIFileRoute("/api/chat")({ - POST: async ({ request }) => { - const { messages, tools } = await request.json(); - - const stream = ai.chat({ - adapter: "openAi", - model: "gpt-4o", - messages, - tools, - toolChoice: "auto", - maxIterations: 5, - temperature: 0.7, - fallbacks: [{ adapter: "ollama", model: "llama2" }], - }); - - return toStreamResponse(stream); - }, -}); -``` - -Client-side consumption: - -```typescript -const response = await fetch("/api/chat", { - method: "POST", - body: JSON.stringify({ messages, tools }), -}); - -const reader = response.body!.getReader(); -const decoder = new TextDecoder(); - -while (true) { - const { done, value } = await reader.read(); - if (done) break; - - const text = decoder.decode(value); - const lines = text.split("\n\n"); - - for (const line of lines) { - if (line.startsWith("data: ")) { - const data = line.slice(6); - if (data === "[DONE]") continue; - - const chunk = JSON.parse(data); - if (chunk.type === "content") { - console.log(chunk.delta); // Stream content to UI - } - } - } -} -``` - -## Summary - -The unified chat API provides: - -- **Two methods**: `chat()` for streaming, `chatCompletion()` for promises -- **Same options** across both methods -- **Built-in HTTP streaming** helper (`toStreamResponse`) -- **Full fallback support** in both methods -- **Type-safe** return types -- **Simpler code** for common patterns +# Unified Chat API + +## Overview + +The chat API provides two methods for different use cases: + +- **`chat()`** - Returns `AsyncIterable` - streaming with **automatic tool execution loop** +- **`chatCompletion()`** - Returns `Promise` - standard non-streaming chat with optional structured output + +### 🔄 Automatic Tool Execution in `chat()` + +**IMPORTANT:** The `chat()` method runs an automatic tool execution loop. When you provide tools with `execute` functions: + +1. **Model calls a tool** → SDK executes it automatically +2. **SDK emits chunks** for tool calls and results (`tool_call`, `tool_result`) +3. **SDK adds results** to messages and continues conversation +4. **Loop repeats** until stopped by `agentLoopStrategy` (default: `maxIterations(5)`) + +**You don't need to manually execute tools or manage conversation state** - the SDK handles everything internally! + +**📚 See also:** [Complete Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) + +## Migration Guide + +### Before (Using `as` option) + +```typescript +// For non-streaming +const result = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], + as: 'promise', +}) + +// For streaming +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], + as: 'stream', +}) +for await (const chunk of stream) { + console.log(chunk) +} + +// For HTTP response +const response = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], + as: 'response', +}) +return response +``` + +### After (Separate Methods) + +```typescript +// For non-streaming - use chatCompletion() +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) + +// For streaming - use chat() +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) +for await (const chunk of stream) { + console.log(chunk) +} + +// For HTTP response - use chat() + toStreamResponse() +import { toStreamResponse } from '@tanstack/ai' + +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) +return toStreamResponse(stream) +``` + +## Usage Examples + +### 1. Promise Mode (chatCompletion) + +Standard non-streaming chat completion: + +```typescript +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [ + { role: 'system', content: 'You are a helpful assistant.' }, + { role: 'user', content: 'What is TypeScript?' }, + ], + temperature: 0.7, +}) + +console.log(result.content) +console.log(`Tokens used: ${result.usage.totalTokens}`) +``` + +### 2. Stream Mode (chat) + +Streaming with automatic tool execution loop: + +```typescript +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Write a story' }], + tools: [weatherTool], // Optional: tools are auto-executed + agentLoopStrategy: maxIterations(5), // Optional: control loop +}) + +for await (const chunk of stream) { + if (chunk.type === 'content') { + process.stdout.write(chunk.delta) // Stream text response + } else if (chunk.type === 'tool_call') { + console.log(`→ Calling tool: ${chunk.toolCall.function.name}`) + } else if (chunk.type === 'tool_result') { + console.log(`✓ Tool result: ${chunk.content}`) + } else if (chunk.type === 'done') { + console.log(`\nFinished: ${chunk.finishReason}`) + console.log(`Tokens: ${chunk.usage?.totalTokens}`) + } +} +``` + +**Chunk Types:** + +- `content` - Text content from the model (use `chunk.delta` for streaming) +- `tool_call` - Model is calling a tool (emitted by model, auto-executed by SDK) +- `tool_result` - Tool execution result (emitted after SDK executes tool) +- `done` - Stream complete (includes `finishReason` and token usage) +- `error` - An error occurred + +### 3. HTTP Response Mode + +Perfect for API endpoints: + +```typescript +import { toStreamResponse } from '@tanstack/ai' + +// TanStack Start API Route +export const POST = async ({ request }: { request: Request }) => { + const { messages } = await request.json() + + const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4o', + messages, + temperature: 0.7, + }) + + // Convert stream to Response with SSE headers + return toStreamResponse(stream) +} +``` + +## With Fallbacks + +Both methods support fallbacks: + +```typescript +// Promise mode with fallbacks +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], + fallbacks: [ + { adapter: 'anthropic', model: 'claude-3-sonnet-20240229' }, + { adapter: 'ollama', model: 'llama2' }, + ], +}) + +// Stream mode with fallbacks +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], + fallbacks: [{ adapter: 'anthropic', model: 'claude-3-sonnet-20240229' }], +}) + +// HTTP response with fallbacks (seamless failover in HTTP streaming!) +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], + fallbacks: [{ adapter: 'ollama', model: 'llama2' }], +}) +return toStreamResponse(stream) +``` + +## Tool Execution with Automatic Loop + +**The `chat()` method automatically executes tools in a loop** - no manual management needed! + +```typescript +const tools = [ + { + type: 'function' as const, + function: { + name: 'get_weather', + description: 'Get weather for a location', + parameters: { + type: 'object', + properties: { + location: { type: 'string' }, + }, + required: ['location'], + }, + }, + execute: async (args: { location: string }) => { + // This function is automatically called by the SDK + const weather = await fetchWeatherAPI(args.location) + return JSON.stringify(weather) + }, + }, +] + +// Streaming chat with automatic tool execution +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: "What's the weather in SF?" }], + tools, // Tools with execute functions are auto-executed + toolChoice: 'auto', + agentLoopStrategy: maxIterations(5), // Control loop behavior +}) + +for await (const chunk of stream) { + if (chunk.type === 'content') { + process.stdout.write(chunk.delta) // Stream text response + } else if (chunk.type === 'tool_call') { + // Model decided to call a tool - SDK will execute it automatically + console.log(`→ Calling: ${chunk.toolCall.function.name}`) + } else if (chunk.type === 'tool_result') { + // SDK executed the tool and got a result + console.log(`✓ Result: ${chunk.content}`) + } else if (chunk.type === 'done') { + console.log(`Finished: ${chunk.finishReason}`) + } +} +``` + +**🔄 What Happens Internally:** + +1. User asks: "What's the weather in SF?" +2. Model decides to call `get_weather` tool + - SDK emits `tool_call` chunk +3. **SDK automatically executes** `tools[0].execute({ location: "SF" })` + - SDK emits `tool_result` chunk +4. SDK adds assistant message (with tool call) + tool result to messages +5. **SDK automatically continues** conversation by calling model again +6. Model responds: "The weather in SF is sunny, 72°F" + - SDK emits `content` chunks +7. SDK emits `done` chunk + +**Key Points:** + +- ✅ Tools are **automatically executed** by the SDK (you don't call `execute`) +- ✅ Tool results are **automatically added** to messages +- ✅ Conversation **automatically continues** after tool execution +- ✅ Loop controlled by `agentLoopStrategy` (default: `maxIterations(5)`) +- ✅ All you do is handle chunks for display +- ✅ Custom strategies available for advanced control + +**Promise Mode (No Tool Execution):** + +The `chatCompletion()` method does NOT execute tools - it returns the model's response immediately: + +```typescript +// chatCompletion does not execute tools +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: "What's the weather in SF?" }], + tools, +}) + +// If model wanted to call a tool, result.toolCalls will contain the calls +// but they won't be executed. This is useful if you want manual control. +if (result.toolCalls) { + console.log('Model wants to call:', result.toolCalls) + // You would execute manually and call chatCompletion again +} +``` + +## Type Safety + +TypeScript automatically infers the correct return type: + +```typescript +// Type: Promise +const promise = ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) + +// Type: AsyncIterable +const stream = ai.chat({ adapter: 'openai', model: 'gpt-4', messages: [] }) +``` + +## Benefits + +1. **Clearer API**: Separate methods for different use cases +2. **Consistent Interface**: Same options across both methods +3. **HTTP Streaming Made Easy**: Use `toStreamResponse()` helper +4. **Fallbacks Everywhere**: Both methods support the same fallback mechanism +5. **Type Safety**: TypeScript infers the correct return type +6. **Structured Outputs**: Available in `chatCompletion()` method + +## Real-World Example: TanStack Start API + +```typescript +import { createAPIFileRoute } from '@tanstack/start/api' +import { ai } from '~/lib/ai-client' +import { toStreamResponse } from '@tanstack/ai' + +export const Route = createAPIFileRoute('/api/chat')({ + POST: async ({ request }) => { + const { messages, tools } = await request.json() + + const stream = ai.chat({ + adapter: 'openAi', + model: 'gpt-4o', + messages, + tools, + toolChoice: 'auto', + maxIterations: 5, + temperature: 0.7, + fallbacks: [{ adapter: 'ollama', model: 'llama2' }], + }) + + return toStreamResponse(stream) + }, +}) +``` + +Client-side consumption: + +```typescript +const response = await fetch('/api/chat', { + method: 'POST', + body: JSON.stringify({ messages, tools }), +}) + +const reader = response.body!.getReader() +const decoder = new TextDecoder() + +while (true) { + const { done, value } = await reader.read() + if (done) break + + const text = decoder.decode(value) + const lines = text.split('\n\n') + + for (const line of lines) { + if (line.startsWith('data: ')) { + const data = line.slice(6) + if (data === '[DONE]') continue + + const chunk = JSON.parse(data) + if (chunk.type === 'content') { + console.log(chunk.delta) // Stream content to UI + } + } + } +} +``` + +## Summary + +The unified chat API provides: + +- **Two methods**: `chat()` for streaming, `chatCompletion()` for promises +- **Same options** across both methods +- **Built-in HTTP streaming** helper (`toStreamResponse`) +- **Full fallback support** in both methods +- **Type-safe** return types +- **Simpler code** for common patterns diff --git a/ai-docs/UNIFIED_CHAT_IMPLEMENTATION.md b/ai-docs/UNIFIED_CHAT_IMPLEMENTATION.md index 440894e41..a75ad3c2b 100644 --- a/ai-docs/UNIFIED_CHAT_IMPLEMENTATION.md +++ b/ai-docs/UNIFIED_CHAT_IMPLEMENTATION.md @@ -1,246 +1,257 @@ -# Unified Chat API - Implementation Summary - -> **Note**: This document describes the historical implementation with the `as` option. The current API uses separate methods: `chat()` for streaming and `chatCompletion()` for promise-based completion. See `docs/UNIFIED_CHAT_API.md` for current API documentation. - -## Overview - -The chat API was previously unified using an `as` configuration option. The current implementation separates streaming and promise-based completion into distinct methods: - -- **`chat()`** - Always returns `AsyncIterable` (streaming) -- **`chatCompletion()`** - Always returns `Promise` (promise-based) - -## Current API Design - -### Method Separation - -```typescript -class AI { - // Streaming method with automatic tool execution loop - async *chat(options): AsyncIterable { - // Manages tool execution internally using ToolCallManager - const toolCallManager = new ToolCallManager(options.tools || []); - - while (iterationCount < maxIterations) { - // Stream from adapter - for await (const chunk of this.adapter.chatStream(options)) { - yield chunk; - - // Track tool calls - if (chunk.type === "tool_call") { - toolCallManager.addToolCallChunk(chunk); - } - } - - // Execute tools if needed - if (shouldExecuteTools && toolCallManager.hasToolCalls()) { - const toolResults = yield* toolCallManager.executeTools(doneChunk); - messages = [...messages, ...toolResults]; - continue; // Next iteration - } - - break; // Done - } - } - - // Promise-based method (no tool execution loop) - async chatCompletion(options): Promise { - return this.adapter.chatCompletion(options); - } -} -``` - -### ToolCallManager Class - -The tool execution logic is extracted into a dedicated `ToolCallManager` class: - -```typescript -class ToolCallManager { - // Accumulate tool calls from streaming chunks - addToolCallChunk(chunk): void; - - // Check if there are tool calls to execute - hasToolCalls(): boolean; - - // Get all complete tool calls - getToolCalls(): ToolCall[]; - - // Execute tools and yield tool_result chunks - async *executeTools(doneChunk): AsyncGenerator; - - // Clear for next iteration - clear(): void; -} -``` - -**Benefits:** -- ✅ **Separation of concerns** - tool logic isolated from chat logic -- ✅ **Testable** - ToolCallManager can be unit tested independently -- ✅ **Maintainable** - changes to tool execution don't affect chat method -- ✅ **Reusable** - can be used in other contexts if needed - -### Benefits of Separate Methods - -✅ **Clearer API**: Method names indicate return type -✅ **Better Type Inference**: TypeScript knows exact return type without overloads -✅ **Simpler Implementation**: No need for discriminated unions -✅ **Easier to Use**: Less cognitive overhead - -## Usage Examples - -### 1. Promise Mode (chatCompletion) - -```typescript -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); -``` - -### 2. Stream Mode (chat) - -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); - -for await (const chunk of stream) { - console.log(chunk); -} -``` - -### 3. HTTP Response Mode - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); - -return toStreamResponse(stream); -``` - -## Historical Context - -The `as` option approach was implemented to unify `chat()` and `streamChat()` methods. However, separate methods provide better developer experience and type safety. - -### Migration Path - -See `docs/MIGRATION_UNIFIED_CHAT.md` for migration guide from the `as` option API to the current separate methods API. - -## Features Preserved - -✅ **All features still supported**: -- Discriminated union types for adapter-model pairs -- Fallback mechanism (single-with-fallbacks or fallbacks-only) -- **Automatic tool execution loop** (via `ToolCallManager`) -- Error chunk detection for streaming -- Type-safe model selection - -✅ **No breaking changes** to core functionality: -- Streaming behavior matches old `streamChat()` method -- Promise behavior matches old `chat()` method -- Error handling and fallbacks work identically -- **Tool execution now handled by `ToolCallManager` class** - -## Files Changed - -### Core Implementation -- ✅ `packages/ai/src/ai.ts` - - Removed `as` option from `chat()` method - - Made `chat()` streaming-only with automatic tool execution loop - - Added `chatCompletion()` method for promise-based calls - - Removed `streamToResponse()` private method (use `toStreamResponse()` from `stream-to-response.ts`) - - Refactored to use `ToolCallManager` for tool execution - -- ✅ `packages/ai/src/tool-call-manager.ts` (NEW) - - Encapsulates tool call accumulation, validation, and execution - - Independently testable - - Yields `tool_result` chunks during execution - - Returns tool result messages for conversation history - -- ✅ `packages/ai/src/types.ts` - - Added `ToolResultStreamChunk` type - - Added `"tool_result"` to `StreamChunkType` union - - Updated `StreamChunk` union to include `ToolResultStreamChunk` - -### Documentation -- ✅ `docs/UNIFIED_CHAT_API.md` - Updated API documentation with tool execution details -- ✅ `docs/MIGRATION_UNIFIED_CHAT.md` - Migration guide -- ✅ `docs/UNIFIED_CHAT_QUICK_REFERENCE.md` - Quick reference updated -- ✅ `docs/TOOL_EXECUTION_LOOP.md` (NEW) - Comprehensive tool execution guide -- ✅ `README.md` - Updated with tool execution loop documentation -- ✅ `examples/cli/README.md` - Updated with automatic tool execution details -- ✅ `packages/ai-react/README.md` - Updated backend examples with tool execution -- ✅ `packages/ai-client/README.md` - Added backend example with tool execution - -## Benefits of Current Approach - -1. **Simpler API Surface** - Two clear methods instead of one with options -2. **Consistent Interface** - Same options across both methods -3. **HTTP Streaming Made Easy** - Use `toStreamResponse()` helper -4. **Better Developer Experience** - Clear intent with method names -5. **Type Safety Maintained** - All discriminated unions still work -6. **Backward Compatible Migration** - Easy to migrate from old API -7. **Fallbacks Everywhere** - Both methods support same fallback mechanism -8. **Automatic Tool Execution** - `chat()` handles tool calling in a loop via `ToolCallManager` -9. **Testable Architecture** - Tool execution logic isolated in separate class -10. **Clean Separation** - `chat()` for streaming+tools, `chatCompletion()` for promises+structured output - -## Testing Recommendations - -Test scenarios: -1. ✅ Promise mode with primary adapter -2. ✅ Promise mode with fallbacks -3. ✅ Stream mode with primary adapter -4. ✅ Stream mode with fallbacks -5. ✅ HTTP response mode with primary adapter -6. ✅ HTTP response mode with fallbacks -7. ✅ Automatic tool execution in `chat()` (via `ToolCallManager`) -8. ✅ Manual tool handling in `chatCompletion()` -9. ✅ Error chunk detection triggers fallbacks -10. ✅ Type inference for both methods -11. ✅ Fallback-only mode (no primary adapter) -12. ✅ `ToolCallManager` unit tests (accumulation, validation, execution) -13. ✅ Multi-round tool execution (up to `maxIterations`) -14. ✅ Tool execution error handling - -## Next Steps - -### For Users -1. **Update method calls**: - - `chat({ as: "promise" })` → `chatCompletion()` - - `chat({ as: "stream" })` → `chat()` - - `chat({ as: "response" })` → `chat()` + `toStreamResponse()` -2. **Update imports**: Add `toStreamResponse` import if needed -3. **Test fallback behavior**: Verify seamless failover in all modes - -### Testing ToolCallManager - -The `ToolCallManager` class is independently testable. See `packages/ai/src/tool-call-manager.test.ts` for unit tests. - -Test scenarios: -- ✅ Accumulating streaming tool call chunks -- ✅ Filtering incomplete tool calls -- ✅ Executing tools with valid arguments -- ✅ Handling tool execution errors -- ✅ Handling tools without execute functions -- ✅ Multiple tool calls in one iteration -- ✅ Clearing tool calls between iterations - -### Future Enhancements -- Consider adding structured output support to streaming -- Add streaming response mode to embeddings -- Document SSE format for client-side consumption -- Add examples for different frameworks (Express, Fastify, etc.) - -## Conclusion - -Separating `chat()` and `chatCompletion()` provides a cleaner, more intuitive interface while maintaining all existing functionality. The two-method design covers all common use cases with clear, type-safe APIs. - -**Key Achievement**: Clear separation of concerns with `chat()` for streaming and `chatCompletion()` for promises, eliminating the need for a configuration option. +# Unified Chat API - Implementation Summary + +> **Note**: This document describes the historical implementation with the `as` option. The current API uses separate methods: `chat()` for streaming and `chatCompletion()` for promise-based completion. See `docs/UNIFIED_CHAT_API.md` for current API documentation. + +## Overview + +The chat API was previously unified using an `as` configuration option. The current implementation separates streaming and promise-based completion into distinct methods: + +- **`chat()`** - Always returns `AsyncIterable` (streaming) +- **`chatCompletion()`** - Always returns `Promise` (promise-based) + +## Current API Design + +### Method Separation + +```typescript +class AI { + // Streaming method with automatic tool execution loop + async *chat(options): AsyncIterable { + // Manages tool execution internally using ToolCallManager + const toolCallManager = new ToolCallManager(options.tools || []) + + while (iterationCount < maxIterations) { + // Stream from adapter + for await (const chunk of this.adapter.chatStream(options)) { + yield chunk + + // Track tool calls + if (chunk.type === 'tool_call') { + toolCallManager.addToolCallChunk(chunk) + } + } + + // Execute tools if needed + if (shouldExecuteTools && toolCallManager.hasToolCalls()) { + const toolResults = yield* toolCallManager.executeTools(doneChunk) + messages = [...messages, ...toolResults] + continue // Next iteration + } + + break // Done + } + } + + // Promise-based method (no tool execution loop) + async chatCompletion(options): Promise { + return this.adapter.chatCompletion(options) + } +} +``` + +### ToolCallManager Class + +The tool execution logic is extracted into a dedicated `ToolCallManager` class: + +```typescript +class ToolCallManager { + // Accumulate tool calls from streaming chunks + addToolCallChunk(chunk): void + + // Check if there are tool calls to execute + hasToolCalls(): boolean + + // Get all complete tool calls + getToolCalls(): ToolCall[] + + // Execute tools and yield tool_result chunks + async *executeTools( + doneChunk, + ): AsyncGenerator + + // Clear for next iteration + clear(): void +} +``` + +**Benefits:** + +- ✅ **Separation of concerns** - tool logic isolated from chat logic +- ✅ **Testable** - ToolCallManager can be unit tested independently +- ✅ **Maintainable** - changes to tool execution don't affect chat method +- ✅ **Reusable** - can be used in other contexts if needed + +### Benefits of Separate Methods + +✅ **Clearer API**: Method names indicate return type +✅ **Better Type Inference**: TypeScript knows exact return type without overloads +✅ **Simpler Implementation**: No need for discriminated unions +✅ **Easier to Use**: Less cognitive overhead + +## Usage Examples + +### 1. Promise Mode (chatCompletion) + +```typescript +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) +``` + +### 2. Stream Mode (chat) + +```typescript +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) + +for await (const chunk of stream) { + console.log(chunk) +} +``` + +### 3. HTTP Response Mode + +```typescript +import { toStreamResponse } from '@tanstack/ai' + +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) + +return toStreamResponse(stream) +``` + +## Historical Context + +The `as` option approach was implemented to unify `chat()` and `streamChat()` methods. However, separate methods provide better developer experience and type safety. + +### Migration Path + +See `docs/MIGRATION_UNIFIED_CHAT.md` for migration guide from the `as` option API to the current separate methods API. + +## Features Preserved + +✅ **All features still supported**: + +- Discriminated union types for adapter-model pairs +- Fallback mechanism (single-with-fallbacks or fallbacks-only) +- **Automatic tool execution loop** (via `ToolCallManager`) +- Error chunk detection for streaming +- Type-safe model selection + +✅ **No breaking changes** to core functionality: + +- Streaming behavior matches old `streamChat()` method +- Promise behavior matches old `chat()` method +- Error handling and fallbacks work identically +- **Tool execution now handled by `ToolCallManager` class** + +## Files Changed + +### Core Implementation + +- ✅ `packages/ai/src/ai.ts` + - Removed `as` option from `chat()` method + - Made `chat()` streaming-only with automatic tool execution loop + - Added `chatCompletion()` method for promise-based calls + - Removed `streamToResponse()` private method (use `toStreamResponse()` from `stream-to-response.ts`) + - Refactored to use `ToolCallManager` for tool execution + +- ✅ `packages/ai/src/tool-call-manager.ts` (NEW) + - Encapsulates tool call accumulation, validation, and execution + - Independently testable + - Yields `tool_result` chunks during execution + - Returns tool result messages for conversation history + +- ✅ `packages/ai/src/types.ts` + - Added `ToolResultStreamChunk` type + - Added `"tool_result"` to `StreamChunkType` union + - Updated `StreamChunk` union to include `ToolResultStreamChunk` + +### Documentation + +- ✅ `docs/UNIFIED_CHAT_API.md` - Updated API documentation with tool execution details +- ✅ `docs/MIGRATION_UNIFIED_CHAT.md` - Migration guide +- ✅ `docs/UNIFIED_CHAT_QUICK_REFERENCE.md` - Quick reference updated +- ✅ `docs/TOOL_EXECUTION_LOOP.md` (NEW) - Comprehensive tool execution guide +- ✅ `README.md` - Updated with tool execution loop documentation +- ✅ `examples/cli/README.md` - Updated with automatic tool execution details +- ✅ `packages/ai-react/README.md` - Updated backend examples with tool execution +- ✅ `packages/ai-client/README.md` - Added backend example with tool execution + +## Benefits of Current Approach + +1. **Simpler API Surface** - Two clear methods instead of one with options +2. **Consistent Interface** - Same options across both methods +3. **HTTP Streaming Made Easy** - Use `toStreamResponse()` helper +4. **Better Developer Experience** - Clear intent with method names +5. **Type Safety Maintained** - All discriminated unions still work +6. **Backward Compatible Migration** - Easy to migrate from old API +7. **Fallbacks Everywhere** - Both methods support same fallback mechanism +8. **Automatic Tool Execution** - `chat()` handles tool calling in a loop via `ToolCallManager` +9. **Testable Architecture** - Tool execution logic isolated in separate class +10. **Clean Separation** - `chat()` for streaming+tools, `chatCompletion()` for promises+structured output + +## Testing Recommendations + +Test scenarios: + +1. ✅ Promise mode with primary adapter +2. ✅ Promise mode with fallbacks +3. ✅ Stream mode with primary adapter +4. ✅ Stream mode with fallbacks +5. ✅ HTTP response mode with primary adapter +6. ✅ HTTP response mode with fallbacks +7. ✅ Automatic tool execution in `chat()` (via `ToolCallManager`) +8. ✅ Manual tool handling in `chatCompletion()` +9. ✅ Error chunk detection triggers fallbacks +10. ✅ Type inference for both methods +11. ✅ Fallback-only mode (no primary adapter) +12. ✅ `ToolCallManager` unit tests (accumulation, validation, execution) +13. ✅ Multi-round tool execution (up to `maxIterations`) +14. ✅ Tool execution error handling + +## Next Steps + +### For Users + +1. **Update method calls**: + - `chat({ as: "promise" })` → `chatCompletion()` + - `chat({ as: "stream" })` → `chat()` + - `chat({ as: "response" })` → `chat()` + `toStreamResponse()` +2. **Update imports**: Add `toStreamResponse` import if needed +3. **Test fallback behavior**: Verify seamless failover in all modes + +### Testing ToolCallManager + +The `ToolCallManager` class is independently testable. See `packages/ai/src/tool-call-manager.test.ts` for unit tests. + +Test scenarios: + +- ✅ Accumulating streaming tool call chunks +- ✅ Filtering incomplete tool calls +- ✅ Executing tools with valid arguments +- ✅ Handling tool execution errors +- ✅ Handling tools without execute functions +- ✅ Multiple tool calls in one iteration +- ✅ Clearing tool calls between iterations + +### Future Enhancements + +- Consider adding structured output support to streaming +- Add streaming response mode to embeddings +- Document SSE format for client-side consumption +- Add examples for different frameworks (Express, Fastify, etc.) + +## Conclusion + +Separating `chat()` and `chatCompletion()` provides a cleaner, more intuitive interface while maintaining all existing functionality. The two-method design covers all common use cases with clear, type-safe APIs. + +**Key Achievement**: Clear separation of concerns with `chat()` for streaming and `chatCompletion()` for promises, eliminating the need for a configuration option. diff --git a/ai-docs/UNIFIED_CHAT_QUICK_REFERENCE.md b/ai-docs/UNIFIED_CHAT_QUICK_REFERENCE.md index 6d9e0e85b..e0ec12357 100644 --- a/ai-docs/UNIFIED_CHAT_QUICK_REFERENCE.md +++ b/ai-docs/UNIFIED_CHAT_QUICK_REFERENCE.md @@ -1,329 +1,329 @@ -# Unified Chat API - Quick Reference - -> **🔄 Automatic Tool Execution:** The `chat()` method runs an automatic tool execution loop. Tools with `execute` functions are automatically called, results are added to messages, and the conversation continues - all handled internally by the SDK! -> -> **📚 See also:** [Complete Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) - -## Two Methods for Different Use Cases - -```typescript -// 1. CHATCOMPLETION - Returns Promise -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], -}); - -// 2. CHAT - Returns AsyncIterable with automatic tool execution loop -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "Hello" }], - tools: [weatherTool], // Optional: auto-executed when called - agentLoopStrategy: maxIterations(5), // Optional: control loop -}); -for await (const chunk of stream) { - if (chunk.type === "content") process.stdout.write(chunk.delta); - else if (chunk.type === "tool_call") console.log("Calling tool..."); - else if (chunk.type === "tool_result") console.log("Tool executed!"); -} -``` - -## Quick Comparison - -| Feature | chatCompletion | chat | -| --------------------- | ------------------------------- | ---------------------------- | -| **Return Type** | `Promise` | `AsyncIterable` | -| **When to Use** | Need complete response | Real-time streaming | -| **Async/Await** | ✅ Yes | ✅ Yes (for await) | -| **Fallbacks** | ✅ Yes | ✅ Yes | -| **Tool Execution** | ❌ No (manual) | ✅ **Automatic loop** | -| **Type-Safe Models** | ✅ Yes | ✅ Yes | -| **Structured Output** | ✅ Yes | ❌ No | - -## Common Patterns - -### API Endpoint (TanStack Start) - -```typescript -import { toStreamResponse } from "@tanstack/ai"; - -export const Route = createAPIFileRoute("/api/chat")({ - POST: async ({ request }) => { - const { messages } = await request.json(); - - const stream = ai.chat({ - adapter: "openAi", - model: "gpt-4o", - messages, - fallbacks: [{ adapter: "ollama", model: "llama2" }], - }); - - return toStreamResponse(stream); - }, -}); -``` - -### CLI Application - -```typescript -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: userInput }], -}); - -for await (const chunk of stream) { - if (chunk.type === "content") { - process.stdout.write(chunk.delta); - } -} -``` - -### Batch Processing - -```typescript -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: document }], -}); - -await saveToDatabase(result.content); -``` - -## With Tools - -### Automatic Execution (chat) - -The `chat()` method **automatically executes tools in a loop**: - -```typescript -const tools = [ - { - type: "function" as const, - function: { - name: "get_weather", - description: "Get weather for a location", - parameters: { - /* ... */ - }, - }, - execute: async (args: any) => { - // SDK automatically calls this when model calls the tool - return JSON.stringify({ temp: 72, condition: "sunny" }); - }, - }, -]; - -// Stream mode with automatic tool execution -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "What's the weather in SF?" }], - tools, // Tools with execute functions are auto-executed - toolChoice: "auto", - agentLoopStrategy: maxIterations(5), // Control loop behavior -}); - -for await (const chunk of stream) { - if (chunk.type === "content") { - process.stdout.write(chunk.delta); - } else if (chunk.type === "tool_call") { - console.log(`→ Calling: ${chunk.toolCall.function.name}`); - } else if (chunk.type === "tool_result") { - console.log(`✓ Result: ${chunk.content}`); - } -} -``` - -**How it works:** - -1. Model decides to call a tool → `tool_call` chunk -2. SDK executes `tool.execute()` → `tool_result` chunk -3. SDK adds result to messages → continues conversation -4. Repeats until complete (up to `maxIterations`) - -### Manual Execution (chatCompletion) - -The `chatCompletion()` method does NOT execute tools automatically: - -```typescript -// chatCompletion returns tool calls but doesn't execute them -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [{ role: "user", content: "What's the weather in SF?" }], - tools, -}); - -// Check if model wants to call tools -if (result.toolCalls) { - console.log("Model wants to call:", result.toolCalls); - // You must execute manually and call chatCompletion again -} -``` - -## With Fallbacks - -Both methods support the same fallback mechanism: - -```typescript -// Promise with fallbacks -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [...], - fallbacks: [ - { adapter: "anthropic", model: "claude-3-sonnet-20240229" }, - { adapter: "ollama", model: "llama2" } - ] -}); - -// Stream with fallbacks -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - fallbacks: [ - { adapter: "ollama", model: "llama2" } - ] -}); - -// HTTP response with fallbacks (seamless HTTP failover!) -import { toStreamResponse } from "@tanstack/ai"; - -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [...], - fallbacks: [ - { adapter: "ollama", model: "llama2" } - ] -}); -return toStreamResponse(stream); -``` - -## Fallback-Only Mode - -No primary adapter, just try fallbacks in order: - -```typescript -const result = await ai.chatCompletion({ - messages: [...], - fallbacks: [ - { adapter: "openai", model: "gpt-4" }, - { adapter: "anthropic", model: "claude-3-sonnet-20240229" }, - { adapter: "ollama", model: "llama2" } - ], -}); -``` - -## Migration from Old API - -### Before (using `as` option) - -```typescript -// Non-streaming -const result = await ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], - as: "promise", -}); - -// Streaming -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], - as: "stream", -}); - -// HTTP Response -const response = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], - as: "response", -}); -``` - -### After (separate methods) - -```typescript -// Non-streaming - use chatCompletion() -const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [], -}); - -// Streaming - use chat() -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], -}); - -// HTTP Response - use chat() + toStreamResponse() -import { toStreamResponse } from "@tanstack/ai"; - -const stream = ai.chat({ - adapter: "openai", - model: "gpt-4", - messages: [], -}); -return toStreamResponse(stream); -``` - -## Type Inference - -TypeScript automatically infers the correct return type: - -```typescript -// Type: Promise -const promise = ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [], -}); - -// Type: AsyncIterable -const stream = ai.chat({ adapter: "openai", model: "gpt-4", messages: [] }); -``` - -## Error Handling - -Both methods throw errors if all adapters fail: - -```typescript -try { - const result = await ai.chatCompletion({ - adapter: "openai", - model: "gpt-4", - messages: [...], - fallbacks: [{ adapter: "ollama", model: "llama2" }] - }); -} catch (error: any) { - console.error("All adapters failed:", error.message); -} -``` - -## Cheat Sheet - -| What You Want | Use This | Example | -| ----------------- | ------------------------------------ | ----------------------------------------------------- | -| Complete response | `chatCompletion()` | `const result = await ai.chatCompletion({...})` | -| Custom streaming | `chat()` | `for await (const chunk of ai.chat({...}))` | -| API endpoint | `chat()` + `toStreamResponse()` | `return toStreamResponse(ai.chat({...}))` | -| With fallbacks | Add `fallbacks: [...]` | `fallbacks: [{ adapter: "ollama", model: "llama2" }]` | -| With tools | Add `tools: [...]` | `tools: [{...}, {...}], toolChoice: "auto"` | -| Multiple adapters | Use `fallbacks` only | `fallbacks: [{ adapter: "a", model: "m1" }, {...}]` | -| Structured output | Use `chatCompletion()` with `output` | `chatCompletion({..., output: schema })` | - -## Documentation - -- **Full API Docs**: `docs/UNIFIED_CHAT_API.md` -- **Migration Guide**: `docs/MIGRATION_UNIFIED_CHAT.md` -- **Implementation**: `docs/UNIFIED_CHAT_IMPLEMENTATION.md` +# Unified Chat API - Quick Reference + +> **🔄 Automatic Tool Execution:** The `chat()` method runs an automatic tool execution loop. Tools with `execute` functions are automatically called, results are added to messages, and the conversation continues - all handled internally by the SDK! +> +> **📚 See also:** [Complete Tool Execution Loop Documentation](TOOL_EXECUTION_LOOP.md) + +## Two Methods for Different Use Cases + +```typescript +// 1. CHATCOMPLETION - Returns Promise +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], +}) + +// 2. CHAT - Returns AsyncIterable with automatic tool execution loop +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: 'Hello' }], + tools: [weatherTool], // Optional: auto-executed when called + agentLoopStrategy: maxIterations(5), // Optional: control loop +}) +for await (const chunk of stream) { + if (chunk.type === 'content') process.stdout.write(chunk.delta) + else if (chunk.type === 'tool_call') console.log('Calling tool...') + else if (chunk.type === 'tool_result') console.log('Tool executed!') +} +``` + +## Quick Comparison + +| Feature | chatCompletion | chat | +| --------------------- | ------------------------------- | ---------------------------- | +| **Return Type** | `Promise` | `AsyncIterable` | +| **When to Use** | Need complete response | Real-time streaming | +| **Async/Await** | ✅ Yes | ✅ Yes (for await) | +| **Fallbacks** | ✅ Yes | ✅ Yes | +| **Tool Execution** | ❌ No (manual) | ✅ **Automatic loop** | +| **Type-Safe Models** | ✅ Yes | ✅ Yes | +| **Structured Output** | ✅ Yes | ❌ No | + +## Common Patterns + +### API Endpoint (TanStack Start) + +```typescript +import { toStreamResponse } from '@tanstack/ai' + +export const Route = createAPIFileRoute('/api/chat')({ + POST: async ({ request }) => { + const { messages } = await request.json() + + const stream = ai.chat({ + adapter: 'openAi', + model: 'gpt-4o', + messages, + fallbacks: [{ adapter: 'ollama', model: 'llama2' }], + }) + + return toStreamResponse(stream) + }, +}) +``` + +### CLI Application + +```typescript +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: userInput }], +}) + +for await (const chunk of stream) { + if (chunk.type === 'content') { + process.stdout.write(chunk.delta) + } +} +``` + +### Batch Processing + +```typescript +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: document }], +}) + +await saveToDatabase(result.content) +``` + +## With Tools + +### Automatic Execution (chat) + +The `chat()` method **automatically executes tools in a loop**: + +```typescript +const tools = [ + { + type: 'function' as const, + function: { + name: 'get_weather', + description: 'Get weather for a location', + parameters: { + /* ... */ + }, + }, + execute: async (args: any) => { + // SDK automatically calls this when model calls the tool + return JSON.stringify({ temp: 72, condition: 'sunny' }) + }, + }, +] + +// Stream mode with automatic tool execution +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: "What's the weather in SF?" }], + tools, // Tools with execute functions are auto-executed + toolChoice: 'auto', + agentLoopStrategy: maxIterations(5), // Control loop behavior +}) + +for await (const chunk of stream) { + if (chunk.type === 'content') { + process.stdout.write(chunk.delta) + } else if (chunk.type === 'tool_call') { + console.log(`→ Calling: ${chunk.toolCall.function.name}`) + } else if (chunk.type === 'tool_result') { + console.log(`✓ Result: ${chunk.content}`) + } +} +``` + +**How it works:** + +1. Model decides to call a tool → `tool_call` chunk +2. SDK executes `tool.execute()` → `tool_result` chunk +3. SDK adds result to messages → continues conversation +4. Repeats until complete (up to `maxIterations`) + +### Manual Execution (chatCompletion) + +The `chatCompletion()` method does NOT execute tools automatically: + +```typescript +// chatCompletion returns tool calls but doesn't execute them +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [{ role: 'user', content: "What's the weather in SF?" }], + tools, +}) + +// Check if model wants to call tools +if (result.toolCalls) { + console.log('Model wants to call:', result.toolCalls) + // You must execute manually and call chatCompletion again +} +``` + +## With Fallbacks + +Both methods support the same fallback mechanism: + +```typescript +// Promise with fallbacks +const result = await ai.chatCompletion({ + adapter: "openai", + model: "gpt-4", + messages: [...], + fallbacks: [ + { adapter: "anthropic", model: "claude-3-sonnet-20240229" }, + { adapter: "ollama", model: "llama2" } + ] +}); + +// Stream with fallbacks +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + fallbacks: [ + { adapter: "ollama", model: "llama2" } + ] +}); + +// HTTP response with fallbacks (seamless HTTP failover!) +import { toStreamResponse } from "@tanstack/ai"; + +const stream = ai.chat({ + adapter: "openai", + model: "gpt-4", + messages: [...], + fallbacks: [ + { adapter: "ollama", model: "llama2" } + ] +}); +return toStreamResponse(stream); +``` + +## Fallback-Only Mode + +No primary adapter, just try fallbacks in order: + +```typescript +const result = await ai.chatCompletion({ + messages: [...], + fallbacks: [ + { adapter: "openai", model: "gpt-4" }, + { adapter: "anthropic", model: "claude-3-sonnet-20240229" }, + { adapter: "ollama", model: "llama2" } + ], +}); +``` + +## Migration from Old API + +### Before (using `as` option) + +```typescript +// Non-streaming +const result = await ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], + as: 'promise', +}) + +// Streaming +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], + as: 'stream', +}) + +// HTTP Response +const response = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], + as: 'response', +}) +``` + +### After (separate methods) + +```typescript +// Non-streaming - use chatCompletion() +const result = await ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) + +// Streaming - use chat() +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) + +// HTTP Response - use chat() + toStreamResponse() +import { toStreamResponse } from '@tanstack/ai' + +const stream = ai.chat({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) +return toStreamResponse(stream) +``` + +## Type Inference + +TypeScript automatically infers the correct return type: + +```typescript +// Type: Promise +const promise = ai.chatCompletion({ + adapter: 'openai', + model: 'gpt-4', + messages: [], +}) + +// Type: AsyncIterable +const stream = ai.chat({ adapter: 'openai', model: 'gpt-4', messages: [] }) +``` + +## Error Handling + +Both methods throw errors if all adapters fail: + +```typescript +try { + const result = await ai.chatCompletion({ + adapter: "openai", + model: "gpt-4", + messages: [...], + fallbacks: [{ adapter: "ollama", model: "llama2" }] + }); +} catch (error: any) { + console.error("All adapters failed:", error.message); +} +``` + +## Cheat Sheet + +| What You Want | Use This | Example | +| ----------------- | ------------------------------------ | ----------------------------------------------------- | +| Complete response | `chatCompletion()` | `const result = await ai.chatCompletion({...})` | +| Custom streaming | `chat()` | `for await (const chunk of ai.chat({...}))` | +| API endpoint | `chat()` + `toStreamResponse()` | `return toStreamResponse(ai.chat({...}))` | +| With fallbacks | Add `fallbacks: [...]` | `fallbacks: [{ adapter: "ollama", model: "llama2" }]` | +| With tools | Add `tools: [...]` | `tools: [{...}, {...}], toolChoice: "auto"` | +| Multiple adapters | Use `fallbacks` only | `fallbacks: [{ adapter: "a", model: "m1" }, {...}]` | +| Structured output | Use `chatCompletion()` with `output` | `chatCompletion({..., output: schema })` | + +## Documentation + +- **Full API Docs**: `docs/UNIFIED_CHAT_API.md` +- **Migration Guide**: `docs/MIGRATION_UNIFIED_CHAT.md` +- **Implementation**: `docs/UNIFIED_CHAT_IMPLEMENTATION.md` diff --git a/examples/README.md b/examples/README.md index 749f38756..e04570d09 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,437 +1,465 @@ -# TanStack AI Examples - -This directory contains comprehensive examples demonstrating TanStack AI across multiple languages and frameworks. - -## Quick Start - -Choose an example based on your use case: - -- **Want a full-stack TypeScript app?** → [TanStack Chat (ts-chat)](#tanstack-chat-ts-chat) -- **Want a simple CLI tool?** → [CLI Example](#cli-example) -- **Need a vanilla JS frontend?** → [Vanilla Chat](#vanilla-chat) -- **Building a Python backend?** → [Python FastAPI Server](#python-fastapi-server) -- **Building a PHP backend?** → [PHP Slim Framework Server](#php-slim-framework-server) - -## TypeScript Examples - -### TanStack Chat (ts-chat) - -A full-featured chat application built with the TanStack ecosystem. - -**Tech Stack:** -- TanStack Start (full-stack React framework) -- TanStack Router (type-safe routing) -- TanStack Store (state management) -- `@tanstack/ai` (AI backend) -- `@tanstack/ai-react` (React hooks) -- `@tanstack/ai-client` (headless client) - -**Features:** -- ✅ Real-time streaming with OpenAI GPT-4o -- ✅ Automatic tool execution loop -- ✅ Rich markdown rendering -- ✅ Conversation management -- ✅ Modern UI with Tailwind CSS - -**Getting Started:** -```bash -cd examples/ts-chat -pnpm install -cp env.example .env -# Edit .env and add your OPENAI_API_KEY -pnpm start -``` - -📖 [Full Documentation](ts-chat/README.md) - ---- - -### CLI Example - -An interactive command-line interface for AI interactions. - -**Features:** -- ✅ Multi-provider support (OpenAI, Anthropic, Ollama, Gemini) -- ✅ Interactive chat with streaming -- ✅ Automatic tool/function calling -- ✅ Smart API key management -- ✅ Debug mode for development - -**Getting Started:** -```bash -cd examples/cli -pnpm install -pnpm dev chat --provider openai -``` - -**Available Commands:** -- `chat` - Interactive chat with streaming -- `generate` - One-shot text generation -- `summarize` - Text summarization -- `embed` - Generate embeddings - -📖 [Full Documentation](cli/README.md) - ---- - -### Vanilla Chat - -A framework-free chat application using pure JavaScript and `@tanstack/ai-client`. - -**Tech Stack:** -- Vanilla JavaScript (no frameworks!) -- `@tanstack/ai-client` (headless client) -- Vite (dev server) -- Connects to Python FastAPI backend - -**Features:** -- ✅ Pure vanilla JavaScript -- ✅ Real-time streaming messages -- ✅ Beautiful, responsive UI -- ✅ No framework dependencies - -**Getting Started:** -```bash -# Start the Python backend first -cd examples/python-fastapi -python anthropic-server.py - -# Then start the frontend -cd examples/vanilla-chat -pnpm install -pnpm dev -``` - -Open `http://localhost:3000` - -📖 [Full Documentation](vanilla-chat/README.md) - ---- - -## Python Examples - -### Python FastAPI Server - -A FastAPI server that streams AI responses in Server-Sent Events (SSE) format, compatible with TanStack AI clients. - -**Features:** -- ✅ FastAPI with SSE streaming -- ✅ Converts Anthropic/OpenAI events to `StreamChunk` format -- ✅ Compatible with `@tanstack/ai-client` -- ✅ Tool call support -- ✅ Type-safe with Pydantic - -**Getting Started:** -```bash -cd examples/python-fastapi - -# Create virtual environment -python3 -m venv venv -source venv/bin/activate # On Windows: venv\Scripts\activate - -# Install dependencies -pip install -r requirements.txt - -# Set up environment -cp env.example .env -# Edit .env and add your ANTHROPIC_API_KEY or OPENAI_API_KEY - -# Run the server -python anthropic-server.py # or openai-server.py -``` - -**API Endpoints:** -- `POST /chat` - Stream chat responses in SSE format -- `GET /health` - Health check - -**Usage with TypeScript Client:** -```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; - -const client = new ChatClient({ - connection: fetchServerSentEvents("http://localhost:8000/chat"), -}); - -await client.sendMessage("Hello!"); -``` - -📖 [Full Documentation](python-fastapi/README.md) - ---- - -## PHP Examples - -### PHP Slim Framework Server - -A PHP Slim Framework server that streams AI responses in SSE format, with support for both Anthropic and OpenAI. - -**Features:** -- ✅ Slim Framework with SSE streaming -- ✅ Converts Anthropic/OpenAI events to `StreamChunk` format -- ✅ Compatible with `@tanstack/ai-client` -- ✅ Tool call support -- ✅ PHP 8.1+ with type safety - -**Getting Started:** -```bash -cd examples/php-slim - -# Install dependencies -composer install - -# Set up environment -cp env.example .env -# Edit .env and add your ANTHROPIC_API_KEY and/or OPENAI_API_KEY - -# Run the server -composer start-anthropic # Runs on port 8000 -# or -composer start-openai # Runs on port 8001 -``` - -**API Endpoints:** -- `POST /chat` - Stream chat responses in SSE format -- `GET /health` - Health check - -**Usage with TypeScript Client:** -```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; - -const client = new ChatClient({ - connection: fetchServerSentEvents("http://localhost:8000/chat"), -}); - -await client.sendMessage("Hello!"); -``` - -📖 [Full Documentation](php-slim/README.md) - ---- - -## Architecture Patterns - -### Full-Stack TypeScript - -Use TanStack AI end-to-end in TypeScript: - -``` -Frontend (React) - ↓ (useChat hook) -@tanstack/ai-react - ↓ (ChatClient) -@tanstack/ai-client - ↓ (SSE/HTTP) -Backend (TanStack Start API Route) - ↓ (chat() function) -@tanstack/ai - ↓ (adapter) -AI Provider (OpenAI/Anthropic/etc.) -``` - -**Example:** [TanStack Chat (ts-chat)](ts-chat/README.md) - -### Multi-Language Backend - -Use Python or PHP for the backend, TypeScript for the frontend: - -``` -Frontend (Vanilla JS/React/Vue/etc.) - ↓ (ChatClient) -@tanstack/ai-client - ↓ (SSE/HTTP) -Backend (Python FastAPI or PHP Slim) - ↓ (tanstack-ai or tanstack/ai) -Stream Conversion & Message Formatting - ↓ (provider SDK) -AI Provider (OpenAI/Anthropic/etc.) -``` - -**Examples:** -- [Python FastAPI](python-fastapi/README.md) + [Vanilla Chat](vanilla-chat/README.md) -- [PHP Slim](php-slim/README.md) + any frontend with `@tanstack/ai-client` - -### CLI Tool - -Use TanStack AI in command-line applications: - -``` -CLI - ↓ (chat() function) -@tanstack/ai - ↓ (adapter) -AI Provider (OpenAI/Anthropic/Ollama/Gemini) -``` - -**Example:** [CLI Example](cli/README.md) - ---- - -## Common Patterns - -### Server-Sent Events (SSE) Streaming - -All examples use SSE for real-time streaming: - -**Backend (TypeScript):** -```typescript -import { chat, toStreamResponse } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; - -const stream = chat({ - adapter: openai(), - model: "gpt-4o", - messages, -}); - -return toStreamResponse(stream); -``` - -**Backend (Python):** -```python -from tanstack_ai import StreamChunkConverter, format_sse_chunk - -async for event in anthropic_stream: - chunks = await converter.convert_event(event) - for chunk in chunks: - yield format_sse_chunk(chunk) -``` - -**Backend (PHP):** -```php -use TanStack\AI\StreamChunkConverter; -use TanStack\AI\SSEFormatter; - -foreach ($anthropicStream as $event) { - $chunks = $converter->convertEvent($event); - foreach ($chunks as $chunk) { - echo SSEFormatter::formatChunk($chunk); - } -} -``` - -**Frontend:** -```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; - -const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), -}); -``` - -### Automatic Tool Execution - -The TypeScript backend (`@tanstack/ai`) automatically handles tool execution: - -```typescript -import { chat, tool } from "@tanstack/ai"; - -const weatherTool = tool({ - function: { - name: "getWeather", - description: "Get weather for a location", - parameters: { /* ... */ }, - }, - execute: async (args) => { - // This is called automatically by the SDK - return JSON.stringify({ temp: 72, condition: "sunny" }); - }, -}); - -const stream = chat({ - adapter: openai(), - model: "gpt-4o", - messages, - tools: [weatherTool], // SDK executes these automatically -}); -``` - -Clients receive: -- `content` chunks - text from the model -- `tool_call` chunks - when the model calls a tool -- `tool_result` chunks - results from tool execution -- `done` chunk - conversation complete - ---- - -## Development Tips - -### Running Multiple Examples - -You can run backend and frontend examples together: - -```bash -# Terminal 1: Start Python backend -cd examples/python-fastapi -python anthropic-server.py - -# Terminal 2: Start vanilla frontend -cd examples/vanilla-chat -pnpm dev - -# Terminal 3: Start ts-chat (full-stack) -cd examples/ts-chat -pnpm start -``` - -### Environment Variables - -Each example has an `env.example` file. Copy it to `.env` and add your API keys: - -```bash -# TypeScript examples -OPENAI_API_KEY=sk-... -ANTHROPIC_API_KEY=sk-ant-... - -# Python examples -ANTHROPIC_API_KEY=sk-ant-... -OPENAI_API_KEY=sk-... - -# PHP examples -ANTHROPIC_API_KEY=sk-ant-... -OPENAI_API_KEY=sk-... -``` - -### Building for Production - -**TypeScript:** -```bash -pnpm build -``` - -**Python:** -```bash -# Use a production ASGI server -uvicorn anthropic-server:app --host 0.0.0.0 --port 8000 -``` - -**PHP:** -```bash -# Use a production web server (Apache, Nginx, etc.) -# See php-slim/README.md for deployment details -``` - ---- - -## Contributing - -When adding new examples: - -1. **Create a README.md** with setup instructions -2. **Add an env.example** file with required environment variables -3. **Document the tech stack** and key features -4. **Include usage examples** with code snippets -5. **Update this README** to list your example - ---- - -## Learn More - -- 📖 [Main README](../README.md) - Project overview -- 📖 [Documentation](../docs/) - Comprehensive guides -- 📖 [TypeScript Packages](../packages/typescript/) - Core libraries -- 📖 [Python Package](../packages/python/tanstack-ai/) - Python utilities -- 📖 [PHP Package](../packages/php/tanstack-ai/) - PHP utilities - ---- - -Built with ❤️ by the TanStack community +# TanStack AI Examples + +This directory contains comprehensive examples demonstrating TanStack AI across multiple languages and frameworks. + +## Quick Start + +Choose an example based on your use case: + +- **Want a full-stack TypeScript app?** → [TanStack Chat (ts-chat)](#tanstack-chat-ts-chat) +- **Want a simple CLI tool?** → [CLI Example](#cli-example) +- **Need a vanilla JS frontend?** → [Vanilla Chat](#vanilla-chat) +- **Building a Python backend?** → [Python FastAPI Server](#python-fastapi-server) +- **Building a PHP backend?** → [PHP Slim Framework Server](#php-slim-framework-server) + +## TypeScript Examples + +### TanStack Chat (ts-chat) + +A full-featured chat application built with the TanStack ecosystem. + +**Tech Stack:** + +- TanStack Start (full-stack React framework) +- TanStack Router (type-safe routing) +- TanStack Store (state management) +- `@tanstack/ai` (AI backend) +- `@tanstack/ai-react` (React hooks) +- `@tanstack/ai-client` (headless client) + +**Features:** + +- ✅ Real-time streaming with OpenAI GPT-4o +- ✅ Automatic tool execution loop +- ✅ Rich markdown rendering +- ✅ Conversation management +- ✅ Modern UI with Tailwind CSS + +**Getting Started:** + +```bash +cd examples/ts-chat +pnpm install +cp env.example .env +# Edit .env and add your OPENAI_API_KEY +pnpm start +``` + +📖 [Full Documentation](ts-chat/README.md) + +--- + +### CLI Example + +An interactive command-line interface for AI interactions. + +**Features:** + +- ✅ Multi-provider support (OpenAI, Anthropic, Ollama, Gemini) +- ✅ Interactive chat with streaming +- ✅ Automatic tool/function calling +- ✅ Smart API key management +- ✅ Debug mode for development + +**Getting Started:** + +```bash +cd examples/cli +pnpm install +pnpm dev chat --provider openai +``` + +**Available Commands:** + +- `chat` - Interactive chat with streaming +- `generate` - One-shot text generation +- `summarize` - Text summarization +- `embed` - Generate embeddings + +📖 [Full Documentation](cli/README.md) + +--- + +### Vanilla Chat + +A framework-free chat application using pure JavaScript and `@tanstack/ai-client`. + +**Tech Stack:** + +- Vanilla JavaScript (no frameworks!) +- `@tanstack/ai-client` (headless client) +- Vite (dev server) +- Connects to Python FastAPI backend + +**Features:** + +- ✅ Pure vanilla JavaScript +- ✅ Real-time streaming messages +- ✅ Beautiful, responsive UI +- ✅ No framework dependencies + +**Getting Started:** + +```bash +# Start the Python backend first +cd examples/python-fastapi +python anthropic-server.py + +# Then start the frontend +cd examples/vanilla-chat +pnpm install +pnpm dev +``` + +Open `http://localhost:3000` + +📖 [Full Documentation](vanilla-chat/README.md) + +--- + +## Python Examples + +### Python FastAPI Server + +A FastAPI server that streams AI responses in Server-Sent Events (SSE) format, compatible with TanStack AI clients. + +**Features:** + +- ✅ FastAPI with SSE streaming +- ✅ Converts Anthropic/OpenAI events to `StreamChunk` format +- ✅ Compatible with `@tanstack/ai-client` +- ✅ Tool call support +- ✅ Type-safe with Pydantic + +**Getting Started:** + +```bash +cd examples/python-fastapi + +# Create virtual environment +python3 -m venv venv +source venv/bin/activate # On Windows: venv\Scripts\activate + +# Install dependencies +pip install -r requirements.txt + +# Set up environment +cp env.example .env +# Edit .env and add your ANTHROPIC_API_KEY or OPENAI_API_KEY + +# Run the server +python anthropic-server.py # or openai-server.py +``` + +**API Endpoints:** + +- `POST /chat` - Stream chat responses in SSE format +- `GET /health` - Health check + +**Usage with TypeScript Client:** + +```typescript +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' + +const client = new ChatClient({ + connection: fetchServerSentEvents('http://localhost:8000/chat'), +}) + +await client.sendMessage('Hello!') +``` + +📖 [Full Documentation](python-fastapi/README.md) + +--- + +## PHP Examples + +### PHP Slim Framework Server + +A PHP Slim Framework server that streams AI responses in SSE format, with support for both Anthropic and OpenAI. + +**Features:** + +- ✅ Slim Framework with SSE streaming +- ✅ Converts Anthropic/OpenAI events to `StreamChunk` format +- ✅ Compatible with `@tanstack/ai-client` +- ✅ Tool call support +- ✅ PHP 8.1+ with type safety + +**Getting Started:** + +```bash +cd examples/php-slim + +# Install dependencies +composer install + +# Set up environment +cp env.example .env +# Edit .env and add your ANTHROPIC_API_KEY and/or OPENAI_API_KEY + +# Run the server +composer start-anthropic # Runs on port 8000 +# or +composer start-openai # Runs on port 8001 +``` + +**API Endpoints:** + +- `POST /chat` - Stream chat responses in SSE format +- `GET /health` - Health check + +**Usage with TypeScript Client:** + +```typescript +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' + +const client = new ChatClient({ + connection: fetchServerSentEvents('http://localhost:8000/chat'), +}) + +await client.sendMessage('Hello!') +``` + +📖 [Full Documentation](php-slim/README.md) + +--- + +## Architecture Patterns + +### Full-Stack TypeScript + +Use TanStack AI end-to-end in TypeScript: + +``` +Frontend (React) + ↓ (useChat hook) +@tanstack/ai-react + ↓ (ChatClient) +@tanstack/ai-client + ↓ (SSE/HTTP) +Backend (TanStack Start API Route) + ↓ (chat() function) +@tanstack/ai + ↓ (adapter) +AI Provider (OpenAI/Anthropic/etc.) +``` + +**Example:** [TanStack Chat (ts-chat)](ts-chat/README.md) + +### Multi-Language Backend + +Use Python or PHP for the backend, TypeScript for the frontend: + +``` +Frontend (Vanilla JS/React/Vue/etc.) + ↓ (ChatClient) +@tanstack/ai-client + ↓ (SSE/HTTP) +Backend (Python FastAPI or PHP Slim) + ↓ (tanstack-ai or tanstack/ai) +Stream Conversion & Message Formatting + ↓ (provider SDK) +AI Provider (OpenAI/Anthropic/etc.) +``` + +**Examples:** + +- [Python FastAPI](python-fastapi/README.md) + [Vanilla Chat](vanilla-chat/README.md) +- [PHP Slim](php-slim/README.md) + any frontend with `@tanstack/ai-client` + +### CLI Tool + +Use TanStack AI in command-line applications: + +``` +CLI + ↓ (chat() function) +@tanstack/ai + ↓ (adapter) +AI Provider (OpenAI/Anthropic/Ollama/Gemini) +``` + +**Example:** [CLI Example](cli/README.md) + +--- + +## Common Patterns + +### Server-Sent Events (SSE) Streaming + +All examples use SSE for real-time streaming: + +**Backend (TypeScript):** + +```typescript +import { chat, toStreamResponse } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' + +const stream = chat({ + adapter: openai(), + model: 'gpt-4o', + messages, +}) + +return toStreamResponse(stream) +``` + +**Backend (Python):** + +```python +from tanstack_ai import StreamChunkConverter, format_sse_chunk + +async for event in anthropic_stream: + chunks = await converter.convert_event(event) + for chunk in chunks: + yield format_sse_chunk(chunk) +``` + +**Backend (PHP):** + +```php +use TanStack\AI\StreamChunkConverter; +use TanStack\AI\SSEFormatter; + +foreach ($anthropicStream as $event) { + $chunks = $converter->convertEvent($event); + foreach ($chunks as $chunk) { + echo SSEFormatter::formatChunk($chunk); + } +} +``` + +**Frontend:** + +```typescript +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' + +const client = new ChatClient({ + connection: fetchServerSentEvents('/api/chat'), +}) +``` + +### Automatic Tool Execution + +The TypeScript backend (`@tanstack/ai`) automatically handles tool execution: + +```typescript +import { chat, tool } from '@tanstack/ai' + +const weatherTool = tool({ + function: { + name: 'getWeather', + description: 'Get weather for a location', + parameters: { + /* ... */ + }, + }, + execute: async (args) => { + // This is called automatically by the SDK + return JSON.stringify({ temp: 72, condition: 'sunny' }) + }, +}) + +const stream = chat({ + adapter: openai(), + model: 'gpt-4o', + messages, + tools: [weatherTool], // SDK executes these automatically +}) +``` + +Clients receive: + +- `content` chunks - text from the model +- `tool_call` chunks - when the model calls a tool +- `tool_result` chunks - results from tool execution +- `done` chunk - conversation complete + +--- + +## Development Tips + +### Running Multiple Examples + +You can run backend and frontend examples together: + +```bash +# Terminal 1: Start Python backend +cd examples/python-fastapi +python anthropic-server.py + +# Terminal 2: Start vanilla frontend +cd examples/vanilla-chat +pnpm dev + +# Terminal 3: Start ts-chat (full-stack) +cd examples/ts-chat +pnpm start +``` + +### Environment Variables + +Each example has an `env.example` file. Copy it to `.env` and add your API keys: + +```bash +# TypeScript examples +OPENAI_API_KEY=sk-... +ANTHROPIC_API_KEY=sk-ant-... + +# Python examples +ANTHROPIC_API_KEY=sk-ant-... +OPENAI_API_KEY=sk-... + +# PHP examples +ANTHROPIC_API_KEY=sk-ant-... +OPENAI_API_KEY=sk-... +``` + +### Building for Production + +**TypeScript:** + +```bash +pnpm build +``` + +**Python:** + +```bash +# Use a production ASGI server +uvicorn anthropic-server:app --host 0.0.0.0 --port 8000 +``` + +**PHP:** + +```bash +# Use a production web server (Apache, Nginx, etc.) +# See php-slim/README.md for deployment details +``` + +--- + +## Contributing + +When adding new examples: + +1. **Create a README.md** with setup instructions +2. **Add an env.example** file with required environment variables +3. **Document the tech stack** and key features +4. **Include usage examples** with code snippets +5. **Update this README** to list your example + +--- + +## Learn More + +- 📖 [Main README](../README.md) - Project overview +- 📖 [Documentation](../docs/) - Comprehensive guides +- 📖 [TypeScript Packages](../packages/typescript/) - Core libraries +- 📖 [Python Package](../packages/python/tanstack-ai/) - Python utilities +- 📖 [PHP Package](../packages/php/tanstack-ai/) - PHP utilities + +--- + +Built with ❤️ by the TanStack community diff --git a/examples/cli/package.json b/examples/cli/package.json new file mode 100644 index 000000000..51263f120 --- /dev/null +++ b/examples/cli/package.json @@ -0,0 +1,5 @@ +{ + "name": "cli", + "version": "0.0.0", + "private": true +} \ No newline at end of file diff --git a/examples/php-slim/README.md b/examples/php-slim/README.md index b2ea4ea8f..2d74876d6 100644 --- a/examples/php-slim/README.md +++ b/examples/php-slim/README.md @@ -45,26 +45,31 @@ cp env.example .env 4. **Run the server:** **For Anthropic:** + ```bash php -S 0.0.0.0:8000 -t public public/anthropic-server.php ``` Or using Composer: + ```bash composer start-anthropic ``` **For OpenAI:** + ```bash php -S 0.0.0.0:8001 -t public public/openai-server.php ``` Or using Composer: + ```bash composer start-openai ``` The servers will start on: + - Anthropic: `http://localhost:8000` - OpenAI: `http://localhost:8001` @@ -108,13 +113,13 @@ Health check endpoint. This server is compatible with the TypeScript TanStack AI client: ```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("http://localhost:8000/chat"), -}); + connection: fetchServerSentEvents('http://localhost:8000/chat'), +}) -await client.sendMessage("Hello!"); +await client.sendMessage('Hello!') ``` ## StreamChunk Format @@ -131,6 +136,7 @@ See `packages/typescript/ai/src/types.ts` for the full TypeScript type definitio ## Supported Providers The converter currently supports: + - ✅ **Anthropic** (Claude models) - fully implemented - ✅ **OpenAI** (GPT models) - fully implemented @@ -169,6 +175,7 @@ The converter package is installed as a local dependency, making it easy to deve To use the local `tanstack/ai` package during development: 1. Add to `composer.json`: + ```json { "repositories": [ @@ -184,7 +191,7 @@ To use the local `tanstack/ai` package during development: ``` 2. Run: + ```bash composer update tanstack/ai ``` - diff --git a/examples/php-slim/composer.json b/examples/php-slim/composer.json index c7d997e9b..5422a972c 100644 --- a/examples/php-slim/composer.json +++ b/examples/php-slim/composer.json @@ -1,40 +1,40 @@ { - "name": "tanstack/ai-php-example", - "description": "PHP Slim Framework example for TanStack AI", - "type": "project", - "repositories": [ - { - "type": "path", - "url": "../../packages/php/tanstack-ai" - } - ], - "require": { - "php": ">=8.1", - "slim/slim": "^4.12", - "slim/psr7": "^1.6", - "vlucas/phpdotenv": "^5.5", - "monolog/monolog": "^3.0", - "anthropic-ai/sdk": "^0.3.0", - "openai-php/client": "^0.10.0", - "tanstack/ai": "@dev", - "symfony/http-client": "^7.3" - }, - "require-dev": { - "slim/psr7": "^1.6" - }, - "autoload": { - "psr-4": { - "TanStack\\AI\\Example\\": "src/" - } - }, - "scripts": { - "start": "php -S 0.0.0.0:8000 -t public public/index.php", - "start-anthropic": "php -S 0.0.0.0:8000 -t public public/anthropic-server.php", - "start-openai": "php -S 0.0.0.0:8001 -t public public/openai-server.php" - }, - "config": { - "allow-plugins": { - "php-http/discovery": true - } + "name": "tanstack/ai-php-example", + "description": "PHP Slim Framework example for TanStack AI", + "type": "project", + "repositories": [ + { + "type": "path", + "url": "../../packages/php/tanstack-ai" } + ], + "require": { + "php": ">=8.1", + "slim/slim": "^4.12", + "slim/psr7": "^1.6", + "vlucas/phpdotenv": "^5.5", + "monolog/monolog": "^3.0", + "anthropic-ai/sdk": "^0.3.0", + "openai-php/client": "^0.10.0", + "tanstack/ai": "@dev", + "symfony/http-client": "^7.3" + }, + "require-dev": { + "slim/psr7": "^1.6" + }, + "autoload": { + "psr-4": { + "TanStack\\AI\\Example\\": "src/" + } + }, + "scripts": { + "start": "php -S 0.0.0.0:8000 -t public public/index.php", + "start-anthropic": "php -S 0.0.0.0:8000 -t public public/anthropic-server.php", + "start-openai": "php -S 0.0.0.0:8001 -t public public/openai-server.php" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true + } + } } diff --git a/examples/php-slim/package.json b/examples/php-slim/package.json new file mode 100644 index 000000000..d93538981 --- /dev/null +++ b/examples/php-slim/package.json @@ -0,0 +1,5 @@ +{ + "name": "php-slim", + "version": "0.0.0", + "private": true +} \ No newline at end of file diff --git a/examples/python-fastapi/README.md b/examples/python-fastapi/README.md index 55104bb8f..a7cd78cf0 100644 --- a/examples/python-fastapi/README.md +++ b/examples/python-fastapi/README.md @@ -34,7 +34,6 @@ python3 -m venv venv ``` 3. **Activate the virtual environment:** - - **On macOS/Linux:** ```bash @@ -129,13 +128,13 @@ Health check endpoint. This server is compatible with the TypeScript TanStack AI client: ```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("http://localhost:8000/chat"), -}); + connection: fetchServerSentEvents('http://localhost:8000/chat'), +}) -await client.sendMessage("Hello!"); +await client.sendMessage('Hello!') ``` ## StreamChunk Format @@ -152,6 +151,7 @@ See `packages/typescript/ai/src/types.ts` for the full TypeScript type definitio ## Supported Providers The converter currently supports: + - ✅ **Anthropic** (Claude models) - fully implemented - ✅ **OpenAI** (GPT models) - converter implemented, ready to use diff --git a/examples/python-fastapi/package.json b/examples/python-fastapi/package.json new file mode 100644 index 000000000..7c6dcd2a6 --- /dev/null +++ b/examples/python-fastapi/package.json @@ -0,0 +1,5 @@ +{ + "name": "python-fastapi", + "version": "0.0.0", + "private": true +} \ No newline at end of file diff --git a/examples/ts-chat/.cta.json b/examples/ts-chat/.cta.json index 2371ddc70..8142313ea 100644 --- a/examples/ts-chat/.cta.json +++ b/examples/ts-chat/.cta.json @@ -8,10 +8,5 @@ "git": true, "version": 1, "framework": "react-cra", - "chosenAddOns": [ - "nitro", - "start", - "tanchat", - "store" - ] -} \ No newline at end of file + "chosenAddOns": ["nitro", "start", "tanchat", "store"] +} diff --git a/examples/ts-chat/README.md b/examples/ts-chat/README.md index 0db61b98a..c2671c43d 100644 --- a/examples/ts-chat/README.md +++ b/examples/ts-chat/README.md @@ -94,7 +94,7 @@ Now that you have two routes you can use a `Link` component to navigate between To use SPA (Single Page Application) navigation you will need to import the `Link` component from `@tanstack/react-router`. ```tsx -import { Link } from "@tanstack/react-router"; +import { Link } from '@tanstack/react-router' ``` Then anywhere in your JSX you can use it like so: @@ -114,10 +114,10 @@ In the File Based Routing setup the layout is located in `src/routes/__root.tsx` Here is an example layout that includes a header: ```tsx -import { Outlet, createRootRoute } from "@tanstack/react-router"; -import { TanStackRouterDevtools } from "@tanstack/react-router-devtools"; +import { Outlet, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' -import { Link } from "@tanstack/react-router"; +import { Link } from '@tanstack/react-router' export const Route = createRootRoute({ component: () => ( @@ -132,7 +132,7 @@ export const Route = createRootRoute({ ), -}); +}) ``` The `` component is not required so you can remove it if you don't want it in your layout. @@ -148,26 +148,26 @@ For example: ```tsx const peopleRoute = createRoute({ getParentRoute: () => rootRoute, - path: "/people", + path: '/people', loader: async () => { - const response = await fetch("https://swapi.dev/api/people"); + const response = await fetch('https://swapi.dev/api/people') return response.json() as Promise<{ results: { - name: string; - }[]; - }>; + name: string + }[] + }> }, component: () => { - const data = peopleRoute.useLoaderData(); + const data = peopleRoute.useLoaderData() return (
    {data.results.map((person) => (
  • {person.name}
  • ))}
- ); + ) }, -}); +}) ``` Loaders simplify your data fetching logic dramatically. Check out more information in the [Loader documentation](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#loader-parameters). @@ -185,29 +185,29 @@ pnpm add @tanstack/react-query @tanstack/react-query-devtools Next we'll need to create a query client and provider. We recommend putting those in `main.tsx`. ```tsx -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' // ... -const queryClient = new QueryClient(); +const queryClient = new QueryClient() // ... if (!rootElement.innerHTML) { - const root = ReactDOM.createRoot(rootElement); + const root = ReactDOM.createRoot(rootElement) root.render( - - ); + , + ) } ``` You can also add TanStack Query Devtools to the root route (optional). ```tsx -import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' const rootRoute = createRootRoute({ component: () => ( @@ -217,25 +217,25 @@ const rootRoute = createRootRoute({ ), -}); +}) ``` Now you can use `useQuery` to fetch your data. ```tsx -import { useQuery } from "@tanstack/react-query"; +import { useQuery } from '@tanstack/react-query' -import "./App.css"; +import './App.css' function App() { const { data } = useQuery({ - queryKey: ["people"], + queryKey: ['people'], queryFn: () => - fetch("https://swapi.dev/api/people") + fetch('https://swapi.dev/api/people') .then((res) => res.json()) .then((data) => data.results as { name: string }[]), initialData: [], - }); + }) return (
@@ -245,10 +245,10 @@ function App() { ))}
- ); + ) } -export default App; +export default App ``` You can find out everything you need to know on how to use React-Query in the [React-Query documentation](https://tanstack.com/query/latest/docs/framework/react/overview). @@ -266,24 +266,24 @@ pnpm add @tanstack/store Now let's create a simple counter in the `src/App.tsx` file as a demonstration. ```tsx -import { useStore } from "@tanstack/react-store"; -import { Store } from "@tanstack/store"; -import "./App.css"; +import { useStore } from '@tanstack/react-store' +import { Store } from '@tanstack/store' +import './App.css' -const countStore = new Store(0); +const countStore = new Store(0) function App() { - const count = useStore(countStore); + const count = useStore(countStore) return (
- ); + ) } -export default App; +export default App ``` One of the many nice features of TanStack Store is the ability to derive state from other state. That derived state will update when the base state updates. @@ -291,21 +291,21 @@ One of the many nice features of TanStack Store is the ability to derive state f Let's check this out by doubling the count using derived state. ```tsx -import { useStore } from "@tanstack/react-store"; -import { Store, Derived } from "@tanstack/store"; -import "./App.css"; +import { useStore } from '@tanstack/react-store' +import { Store, Derived } from '@tanstack/store' +import './App.css' -const countStore = new Store(0); +const countStore = new Store(0) const doubledStore = new Derived({ fn: () => countStore.state * 2, deps: [countStore], -}); -doubledStore.mount(); +}) +doubledStore.mount() function App() { - const count = useStore(countStore); - const doubledCount = useStore(doubledStore); + const count = useStore(countStore) + const doubledCount = useStore(doubledStore) return (
@@ -314,10 +314,10 @@ function App() {
Doubled - {doubledCount}
- ); + ) } -export default App; +export default App ``` We use the `Derived` class to create a new store that is derived from another store. The `Derived` class has a `mount` method that will start the derived store updating. diff --git a/examples/ts-chat/api-verification.ts b/examples/ts-chat/api-verification.ts index 8aa07479d..336ce12bb 100644 --- a/examples/ts-chat/api-verification.ts +++ b/examples/ts-chat/api-verification.ts @@ -1 +1 @@ -export { }; +export {} diff --git a/examples/ts-chat/package.json b/examples/ts-chat/package.json index 035cdb28f..153ab45a8 100644 --- a/examples/ts-chat/package.json +++ b/examples/ts-chat/package.json @@ -51,7 +51,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^5.1.1", "jsdom": "^27.2.0", - "typescript": "^5.9.3", + "typescript": "5.9.3", "vite": "^7.2.4", "vitest": "^4.0.14", "web-vitals": "^5.1.0" diff --git a/examples/ts-chat/src/components/Approval.tsx b/examples/ts-chat/src/components/Approval.tsx index 2390d54bf..5b7e71bda 100644 --- a/examples/ts-chat/src/components/Approval.tsx +++ b/examples/ts-chat/src/components/Approval.tsx @@ -1,8 +1,8 @@ export interface ApprovalProps { - toolName: string; - input: any; - onApprove: () => void; - onDeny: () => void; + toolName: string + input: any + onApprove: () => void + onDeny: () => void } export default function Approval({ @@ -34,6 +34,5 @@ export default function Approval({
- ); + ) } - diff --git a/examples/ts-chat/src/components/Header.tsx b/examples/ts-chat/src/components/Header.tsx index 44b204671..57745b7b0 100644 --- a/examples/ts-chat/src/components/Header.tsx +++ b/examples/ts-chat/src/components/Header.tsx @@ -1,10 +1,10 @@ -import { Link } from "@tanstack/react-router"; +import { Link } from '@tanstack/react-router' -import { useState } from "react"; -import { Guitar, Home, Menu, X } from "lucide-react"; +import { useState } from 'react' +import { Guitar, Home, Menu, X } from 'lucide-react' export default function Header() { - const [isOpen, setIsOpen] = useState(false); + const [isOpen, setIsOpen] = useState(false) return ( <> @@ -29,7 +29,7 @@ export default function Header() { - ); + ) } diff --git a/examples/ts-chat/src/components/example-GuitarRecommendation.tsx b/examples/ts-chat/src/components/example-GuitarRecommendation.tsx index ed2e7608a..8f04cd99e 100644 --- a/examples/ts-chat/src/components/example-GuitarRecommendation.tsx +++ b/examples/ts-chat/src/components/example-GuitarRecommendation.tsx @@ -1,12 +1,12 @@ -import { useNavigate } from "@tanstack/react-router"; +import { useNavigate } from '@tanstack/react-router' -import guitars from "../data/example-guitars"; +import guitars from '../data/example-guitars' export default function GuitarRecommendation({ id }: { id: string }) { - const navigate = useNavigate(); - const guitar = guitars.find((guitar) => guitar.id === +id); + const navigate = useNavigate() + const guitar = guitars.find((guitar) => guitar.id === +id) if (!guitar) { - return null; + return null } return (
@@ -29,9 +29,9 @@ export default function GuitarRecommendation({ id }: { id: string }) {
- ); + ) } diff --git a/examples/ts-chat/src/lib/guitar-tools.ts b/examples/ts-chat/src/lib/guitar-tools.ts index 3a36c745a..c50303341 100644 --- a/examples/ts-chat/src/lib/guitar-tools.ts +++ b/examples/ts-chat/src/lib/guitar-tools.ts @@ -1,98 +1,98 @@ -import { tool } from "@tanstack/ai"; -import guitars from "@/data/example-guitars"; +import { tool } from '@tanstack/ai' +import guitars from '@/data/example-guitars' export const getGuitarsTool = tool({ - type: "function", + type: 'function', function: { - name: "getGuitars", - description: "Get all products from the database", + name: 'getGuitars', + description: 'Get all products from the database', parameters: { - type: "object", + type: 'object', properties: {}, required: [], }, }, execute: async () => { - return JSON.stringify(guitars); + return JSON.stringify(guitars) }, -}); +}) export const recommendGuitarTool = tool({ - type: "function", + type: 'function', function: { - name: "recommendGuitar", + name: 'recommendGuitar', description: - "REQUIRED tool to display a guitar recommendation to the user. This tool MUST be used whenever recommending a guitar - do NOT write recommendations yourself. This displays the guitar in a special appealing format with a buy button.", + 'REQUIRED tool to display a guitar recommendation to the user. This tool MUST be used whenever recommending a guitar - do NOT write recommendations yourself. This displays the guitar in a special appealing format with a buy button.', parameters: { - type: "object", + type: 'object', properties: { id: { - type: "string", + type: 'string', description: - "The ID of the guitar to recommend (from the getGuitars results)", + 'The ID of the guitar to recommend (from the getGuitars results)', }, }, - required: ["id"], + required: ['id'], }, }, -}); +}) export const getPersonalGuitarPreferenceTool = tool({ - type: "function", + type: 'function', function: { - name: "getPersonalGuitarPreference", + name: 'getPersonalGuitarPreference', description: "Get the user's guitar preference from their local browser storage", parameters: { - type: "object", + type: 'object', properties: {}, }, }, // No execute = client-side tool -}); +}) export const addToWishListTool = tool({ - type: "function", + type: 'function', function: { - name: "addToWishList", + name: 'addToWishList', description: "Add a guitar to the user's wish list (requires approval)", parameters: { - type: "object", + type: 'object', properties: { - guitarId: { type: "string" }, + guitarId: { type: 'string' }, }, - required: ["guitarId"], + required: ['guitarId'], }, }, needsApproval: true, // No execute = client-side but needs approval -}); +}) export const addToCartTool = tool({ - type: "function", + type: 'function', function: { - name: "addToCart", - description: "Add a guitar to the shopping cart (requires approval)", + name: 'addToCart', + description: 'Add a guitar to the shopping cart (requires approval)', parameters: { - type: "object", + type: 'object', properties: { - guitarId: { type: "string" }, - quantity: { type: "number" }, + guitarId: { type: 'string' }, + quantity: { type: 'number' }, }, - required: ["guitarId", "quantity"], + required: ['guitarId', 'quantity'], }, }, needsApproval: true, execute: async (args) => { return JSON.stringify({ success: true, - cartId: "CART_" + Date.now(), + cartId: 'CART_' + Date.now(), guitarId: args.guitarId, quantity: args.quantity, totalItems: args.quantity, - }); + }) }, -}); +}) export const allTools = [ getGuitarsTool, @@ -100,4 +100,4 @@ export const allTools = [ getPersonalGuitarPreferenceTool, addToWishListTool, addToCartTool, -]; +] diff --git a/examples/ts-chat/src/lib/stub-adapter.ts b/examples/ts-chat/src/lib/stub-adapter.ts index b50432999..0d519594c 100644 --- a/examples/ts-chat/src/lib/stub-adapter.ts +++ b/examples/ts-chat/src/lib/stub-adapter.ts @@ -1,5 +1,9 @@ -import type { AIAdapter, ChatCompletionOptions, StreamChunk } from "@tanstack/ai"; -import { stubLLM } from "./stub-llm"; +import type { + AIAdapter, + ChatCompletionOptions, + StreamChunk, +} from '@tanstack/ai' +import { stubLLM } from './stub-llm' /** * Stub adapter for testing without using real LLM tokens @@ -18,11 +22,12 @@ export function stubAdapter(): AIAdapter< any > { return { - name: "stub", - async *chatStream(options: ChatCompletionOptions): AsyncIterable { + name: 'stub', + async *chatStream( + options: ChatCompletionOptions, + ): AsyncIterable { // Use stub LLM instead of real API - yield* stubLLM(options.messages); + yield* stubLLM(options.messages) }, - } as any; + } as any } - diff --git a/examples/ts-chat/src/lib/stub-llm.ts b/examples/ts-chat/src/lib/stub-llm.ts index 203ae04b4..064851151 100644 --- a/examples/ts-chat/src/lib/stub-llm.ts +++ b/examples/ts-chat/src/lib/stub-llm.ts @@ -1,67 +1,67 @@ -import type { ModelMessage, StreamChunk } from "@tanstack/ai"; +import type { ModelMessage, StreamChunk } from '@tanstack/ai' /** * Stub LLM for testing tool calls without burning tokens * Detects which tool to call from user message keywords */ export async function* stubLLM( - messages: ModelMessage[] + messages: ModelMessage[], ): AsyncIterable { - const lastMessage = messages[messages.length - 1]; - const userMessage = lastMessage?.content?.toLowerCase() || ""; + const lastMessage = messages[messages.length - 1] + const userMessage = lastMessage?.content?.toLowerCase() || '' - const baseId = `stub_${Date.now()}`; - const timestamp = Date.now(); + const baseId = `stub_${Date.now()}` + const timestamp = Date.now() // Check if we have any assistant messages with tool calls already // If so, this is a continuation after approval/execution, not a new request // Handle both ModelMessage (toolCalls) and UIMessage (parts) formats const hasExistingToolCalls = messages.some((m) => { - if (m.role !== "assistant") return false; + if (m.role !== 'assistant') return false // Check ModelMessage format - if (m.toolCalls && m.toolCalls.length > 0) return true; + if (m.toolCalls && m.toolCalls.length > 0) return true // Check UIMessage format if ((m as any).parts) { - const parts = (m as any).parts; - return parts.some((p: any) => p.type === "tool-call"); + const parts = (m as any).parts + return parts.some((p: any) => p.type === 'tool-call') } - return false; - }); - - if (hasExistingToolCalls && lastMessage?.role === "assistant") { + return false + }) + + if (hasExistingToolCalls && lastMessage?.role === 'assistant') { // This means we're being called after an approval/tool execution // Check if the user approved or denied by looking at tool results - let wasApproved = false; - let wasDenied = false; - + let wasApproved = false + let wasDenied = false + // Check for tool results - const toolResults = messages.filter((m) => m.role === "tool"); + const toolResults = messages.filter((m) => m.role === 'tool') if (toolResults.length > 0) { // Check if any were successful or had errors for (const result of toolResults) { try { - const parsed = JSON.parse(result.content || "{}"); - if (parsed.error && parsed.error.includes("declined")) { - wasDenied = true; + const parsed = JSON.parse(result.content || '{}') + if (parsed.error && parsed.error.includes('declined')) { + wasDenied = true } else if (parsed.success || !parsed.error) { - wasApproved = true; + wasApproved = true } } catch { // If we can't parse, assume success - wasApproved = true; + wasApproved = true } } } else { // No tool results yet, must have just gotten approval response // Check the assistant message for approval status in UIMessage format if ((lastMessage as any).parts) { - const parts = (lastMessage as any).parts; + const parts = (lastMessage as any).parts for (const part of parts) { - if (part.type === "tool-call" && part.approval) { + if (part.type === 'tool-call' && part.approval) { if (part.approval.approved === true) { - wasApproved = true; + wasApproved = true } else if (part.approval.approved === false) { - wasDenied = true; + wasDenied = true } } } @@ -69,325 +69,331 @@ export async function* stubLLM( // This is a ModelMessage, check if it has approval info in content // (won't have it here, but we can infer from lack of tool results) // Default to approved for now - wasApproved = true; + wasApproved = true } } - - let response = ""; + + let response = '' if (wasDenied) { - response = "No worries! Maybe another time. Let me know if you need anything else."; + response = + 'No worries! Maybe another time. Let me know if you need anything else.' } else if (wasApproved) { - response = "All set! Let me know if you need anything else."; + response = 'All set! Let me know if you need anything else.' } else { - response = "Let me know if you need anything else!"; + response = 'Let me know if you need anything else!' } - + for (let i = 0; i < response.length; i++) { yield { - type: "content", + type: 'content', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, delta: response[i], content: response.substring(0, i + 1), - role: "assistant", - }; + role: 'assistant', + } } yield { - type: "done", + type: 'done', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, - finishReason: "stop", - }; - return; + finishReason: 'stop', + } + return } // Check if this is a follow-up after tool execution - const hasToolResults = messages.some((m) => m.role === "tool"); - + const hasToolResults = messages.some((m) => m.role === 'tool') + if (hasToolResults) { // Check if user approved or denied const lastAssistant = [...messages] .reverse() - .find((m) => m.role === "assistant" && m.toolCalls); - + .find((m) => m.role === 'assistant' && m.toolCalls) + if (lastAssistant) { // Look for approval in tool results const approvedTools = messages - .filter((m) => m.role === "tool") + .filter((m) => m.role === 'tool') .filter((m) => { try { - const result = JSON.parse(m.content || "{}"); - return !result.error; + const result = JSON.parse(m.content || '{}') + return !result.error } catch { - return true; + return true } - }); - + }) + const deniedTools = messages - .filter((m) => m.role === "tool") + .filter((m) => m.role === 'tool') .filter((m) => { try { - const result = JSON.parse(m.content || "{}"); - return result.error?.includes("declined"); + const result = JSON.parse(m.content || '{}') + return result.error?.includes('declined') } catch { - return false; + return false } - }); + }) - let responseText = ""; + let responseText = '' if (approvedTools.length > 0) { - responseText = "Good for you! I've processed that request."; + responseText = "Good for you! I've processed that request." } else if (deniedTools.length > 0) { - responseText = "Bummer! Maybe another time."; + responseText = 'Bummer! Maybe another time.' } else { - responseText = "Complete! If you need anything else, feel free to ask."; + responseText = 'Complete! If you need anything else, feel free to ask.' } // Send final response for (const char of responseText) { - const accumulated = responseText.substring(0, responseText.indexOf(char) + 1); + const accumulated = responseText.substring( + 0, + responseText.indexOf(char) + 1, + ) yield { - type: "content", + type: 'content', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, delta: char, content: accumulated, - role: "assistant", - }; + role: 'assistant', + } } yield { - type: "done", + type: 'done', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, - finishReason: "stop", - }; - return; + finishReason: 'stop', + } + return } } // Detect which tool to call based on user message - if (userMessage.includes("preference")) { + if (userMessage.includes('preference')) { // Send initial text - const initText = "Let me check your preferences..."; + const initText = 'Let me check your preferences...' for (let i = 0; i < initText.length; i++) { yield { - type: "content", + type: 'content', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, delta: initText[i], content: initText.substring(0, i + 1), - role: "assistant", - }; + role: 'assistant', + } } // Call getPersonalGuitarPreference yield { - type: "tool_call", + type: 'tool_call', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, toolCall: { id: `call_${Date.now()}`, - type: "function", + type: 'function', function: { - name: "getPersonalGuitarPreference", - arguments: "{}", + name: 'getPersonalGuitarPreference', + arguments: '{}', }, }, index: 0, - }; + } yield { - type: "done", + type: 'done', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, - finishReason: "tool_calls", - }; - return; + finishReason: 'tool_calls', + } + return } - if (userMessage.includes("recommend") || userMessage.includes("acoustic")) { + if (userMessage.includes('recommend') || userMessage.includes('acoustic')) { // Send initial text - const initText = "Let me find the perfect guitar for you!"; + const initText = 'Let me find the perfect guitar for you!' for (let i = 0; i < initText.length; i++) { yield { - type: "content", + type: 'content', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, delta: initText[i], content: initText.substring(0, i + 1), - role: "assistant", - }; + role: 'assistant', + } } // Call getGuitars then recommendGuitar - const getGuitarsId = `call_${Date.now()}_1`; + const getGuitarsId = `call_${Date.now()}_1` yield { - type: "tool_call", + type: 'tool_call', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, toolCall: { id: getGuitarsId, - type: "function", + type: 'function', function: { - name: "getGuitars", - arguments: "{}", + name: 'getGuitars', + arguments: '{}', }, }, index: 0, - }; + } yield { - type: "done", + type: 'done', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } // After getGuitars result, call recommendGuitar - const recommendId = `call_${Date.now()}_2`; + const recommendId = `call_${Date.now()}_2` yield { - type: "tool_call", - id: baseId + "_2", - model: "stub-llm", + type: 'tool_call', + id: baseId + '_2', + model: 'stub-llm', timestamp: timestamp + 100, toolCall: { id: recommendId, - type: "function", + type: 'function', function: { - name: "recommendGuitar", - arguments: JSON.stringify({ id: "6" }), + name: 'recommendGuitar', + arguments: JSON.stringify({ id: '6' }), }, }, index: 0, - }; + } yield { - type: "done", - id: baseId + "_2", - model: "stub-llm", + type: 'done', + id: baseId + '_2', + model: 'stub-llm', timestamp: timestamp + 100, - finishReason: "tool_calls", - }; - return; + finishReason: 'tool_calls', + } + return } - if (userMessage.includes("wish list")) { + if (userMessage.includes('wish list')) { // Send initial text - const initText = "I'll add that to your wish list. Just need your approval first!"; + const initText = + "I'll add that to your wish list. Just need your approval first!" for (let i = 0; i < initText.length; i++) { yield { - type: "content", + type: 'content', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, delta: initText[i], content: initText.substring(0, i + 1), - role: "assistant", - }; + role: 'assistant', + } } // Call addToWishList (needs approval) yield { - type: "tool_call", + type: 'tool_call', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, toolCall: { id: `call_${Date.now()}`, - type: "function", + type: 'function', function: { - name: "addToWishList", - arguments: JSON.stringify({ guitarId: "6" }), + name: 'addToWishList', + arguments: JSON.stringify({ guitarId: '6' }), }, }, index: 0, - }; + } yield { - type: "done", + type: 'done', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, - finishReason: "tool_calls", - }; - return; + finishReason: 'tool_calls', + } + return } - if (userMessage.includes("cart")) { + if (userMessage.includes('cart')) { // Send initial text - const initText = "Ready to add to your cart! I'll need your approval to proceed."; + const initText = + "Ready to add to your cart! I'll need your approval to proceed." for (let i = 0; i < initText.length; i++) { yield { - type: "content", + type: 'content', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, delta: initText[i], content: initText.substring(0, i + 1), - role: "assistant", - }; + role: 'assistant', + } } // Call addToCart (needs approval) yield { - type: "tool_call", + type: 'tool_call', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, toolCall: { id: `call_${Date.now()}`, - type: "function", + type: 'function', function: { - name: "addToCart", - arguments: JSON.stringify({ guitarId: "6", quantity: 1 }), + name: 'addToCart', + arguments: JSON.stringify({ guitarId: '6', quantity: 1 }), }, }, index: 0, - }; + } yield { - type: "done", + type: 'done', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, - finishReason: "tool_calls", - }; - return; + finishReason: 'tool_calls', + } + return } // Default response - const response = "I can help with guitar preferences, recommendations, wish lists, and cart!"; + const response = + 'I can help with guitar preferences, recommendations, wish lists, and cart!' for (const char of response) { - const accumulated = response.substring(0, response.indexOf(char) + 1); + const accumulated = response.substring(0, response.indexOf(char) + 1) yield { - type: "content", + type: 'content', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, delta: char, content: accumulated, - role: "assistant", - }; + role: 'assistant', + } } yield { - type: "done", + type: 'done', id: baseId, - model: "stub-llm", + model: 'stub-llm', timestamp, - finishReason: "stop", - }; + finishReason: 'stop', + } } - diff --git a/examples/ts-chat/src/routes/__root.tsx b/examples/ts-chat/src/routes/__root.tsx index c1146dad6..a68d0bea9 100644 --- a/examples/ts-chat/src/routes/__root.tsx +++ b/examples/ts-chat/src/routes/__root.tsx @@ -1,33 +1,33 @@ -import { HeadContent, Scripts, createRootRoute } from "@tanstack/react-router"; -import { TanStackRouterDevtoolsPanel } from "@tanstack/react-router-devtools"; -import { TanStackDevtools } from "@tanstack/react-devtools"; -import Header from "../components/Header"; -import appCss from "../styles.css?url"; +import { HeadContent, Scripts, createRootRoute } from '@tanstack/react-router' +import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools' +import { TanStackDevtools } from '@tanstack/react-devtools' +import Header from '../components/Header' +import appCss from '../styles.css?url' export const Route = createRootRoute({ head: () => ({ meta: [ { - charSet: "utf-8", + charSet: 'utf-8', }, { - name: "viewport", - content: "width=device-width, initial-scale=1", + name: 'viewport', + content: 'width=device-width, initial-scale=1', }, { - title: "TanStack Start Starter", + title: 'TanStack Start Starter', }, ], links: [ { - rel: "stylesheet", + rel: 'stylesheet', href: appCss, }, ], }), shellComponent: RootDocument, -}); +}) function RootDocument({ children }: { children: React.ReactNode }) { return ( @@ -40,11 +40,11 @@ function RootDocument({ children }: { children: React.ReactNode }) { {children} , }, ]} @@ -55,5 +55,5 @@ function RootDocument({ children }: { children: React.ReactNode }) { - ); + ) } diff --git a/examples/ts-chat/src/routes/api.tanchat.ts b/examples/ts-chat/src/routes/api.tanchat.ts index 1ddc1d097..ce09f3044 100644 --- a/examples/ts-chat/src/routes/api.tanchat.ts +++ b/examples/ts-chat/src/routes/api.tanchat.ts @@ -1,10 +1,10 @@ -import { createFileRoute } from "@tanstack/react-router"; -import { chat, toStreamResponse, maxIterations } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; +import { createFileRoute } from '@tanstack/react-router' +import { chat, toStreamResponse, maxIterations } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' // import { ollama } from "@tanstack/ai-ollama"; // import { anthropic } from "@tanstack/ai-anthropic"; // import { gemini } from "@tanstack/ai-gemini"; -import { allTools } from "@/lib/guitar-tools"; +import { allTools } from '@/lib/guitar-tools' const SYSTEM_PROMPT = `You are a helpful assistant for a guitar store. @@ -27,23 +27,23 @@ User: "I want an acoustic guitar" Step 1: Call getGuitars() Step 2: Call recommendGuitar(id: "6") Step 3: Done - do NOT add any text after calling recommendGuitar -`; +` -export const Route = createFileRoute("/api/tanchat")({ +export const Route = createFileRoute('/api/tanchat')({ server: { handlers: { POST: async ({ request }) => { // Capture request signal before reading body (it may be aborted after body is consumed) - const requestSignal = request.signal; + const requestSignal = request.signal // If request is already aborted, return early if (requestSignal?.aborted) { - return new Response(null, { status: 499 }); // 499 = Client Closed Request + return new Response(null, { status: 499 }) // 499 = Client Closed Request } - const abortController = new AbortController(); + const abortController = new AbortController() - const { messages } = await request.json(); + const { messages } = await request.json() try { // Use the stream abort signal for proper cancellation handling const stream = chat({ @@ -52,7 +52,7 @@ export const Route = createFileRoute("/api/tanchat")({ // - OpenAI: "gpt-5", "o3", "o3-pro", "o3-mini" (with reasoning option) // - Anthropic: "claude-sonnet-4-5-20250929", "claude-opus-4-5-20251101" (with thinking option) // - Gemini: "gemini-3-pro-preview", "gemini-2.5-pro" (with thinkingConfig option) - model: "gpt-5", + model: 'gpt-5', // model: "claude-sonnet-4-5-20250929", // model: "smollm", // model: "gemini-2.5-flash", @@ -72,11 +72,11 @@ export const Route = createFileRoute("/api/tanchat")({ }, */ }, abortController, - }); + }) - return toStreamResponse(stream, { abortController }); + return toStreamResponse(stream, { abortController }) } catch (error: any) { - console.error("[API Route] Error in chat request:", { + console.error('[API Route] Error in chat request:', { message: error?.message, name: error?.name, status: error?.status, @@ -85,22 +85,22 @@ export const Route = createFileRoute("/api/tanchat")({ type: error?.type, stack: error?.stack, error: error, - }); + }) // If request was aborted, return early (don't send error response) - if (error.name === "AbortError" || abortController.signal.aborted) { - return new Response(null, { status: 499 }); // 499 = Client Closed Request + if (error.name === 'AbortError' || abortController.signal.aborted) { + return new Response(null, { status: 499 }) // 499 = Client Closed Request } return new Response( JSON.stringify({ - error: error.message || "An error occurred", + error: error.message || 'An error occurred', }), { status: 500, - headers: { "Content-Type": "application/json" }, - } - ); + headers: { 'Content-Type': 'application/json' }, + }, + ) } }, }, }, -}); +}) diff --git a/examples/ts-chat/src/routes/api.test-chat.ts b/examples/ts-chat/src/routes/api.test-chat.ts index 78ba47385..5ee771966 100644 --- a/examples/ts-chat/src/routes/api.test-chat.ts +++ b/examples/ts-chat/src/routes/api.test-chat.ts @@ -1,19 +1,19 @@ -import { createFileRoute } from "@tanstack/react-router"; -import { chat, toStreamResponse, maxIterations } from "@tanstack/ai"; -import { stubAdapter } from "@/lib/stub-adapter"; -import { allTools } from "@/lib/guitar-tools"; +import { createFileRoute } from '@tanstack/react-router' +import { chat, toStreamResponse, maxIterations } from '@tanstack/ai' +import { stubAdapter } from '@/lib/stub-adapter' +import { allTools } from '@/lib/guitar-tools' -export const Route = createFileRoute("/api/test-chat")({ +export const Route = createFileRoute('/api/test-chat')({ server: { handlers: { POST: async ({ request }) => { - const { messages } = await request.json(); + const { messages } = await request.json() try { const stream = chat({ adapter: stubAdapter(), messages, - model: "gpt-4.1-nano", // Doesn't matter for stub + model: 'gpt-4.1-nano', // Doesn't matter for stub tools: allTools, systemPrompts: [], options: { @@ -27,21 +27,21 @@ export const Route = createFileRoute("/api/test-chat")({ }, agentLoopStrategy: maxIterations(20), providerOptions: {}, - }); + }) - return toStreamResponse(stream); + return toStreamResponse(stream) } catch (error: any) { return new Response( JSON.stringify({ - error: error.message || "An error occurred", + error: error.message || 'An error occurred', }), { status: 500, - headers: { "Content-Type": "application/json" }, - } - ); + headers: { 'Content-Type': 'application/json' }, + }, + ) } }, }, }, -}); +}) diff --git a/examples/ts-chat/src/routes/demo.tsx b/examples/ts-chat/src/routes/demo.tsx index 630c86f34..2bc79366e 100644 --- a/examples/ts-chat/src/routes/demo.tsx +++ b/examples/ts-chat/src/routes/demo.tsx @@ -1,48 +1,48 @@ -import { createFileRoute } from "@tanstack/react-router"; -import { useCallback } from "react"; +import { createFileRoute } from '@tanstack/react-router' +import { useCallback } from 'react' import { Chat, ChatMessages, ChatMessage, ChatInput, TextPart, -} from "@tanstack/ai-react-ui"; -import { fetchServerSentEvents } from "@tanstack/ai-client"; +} from '@tanstack/ai-react-ui' +import { fetchServerSentEvents } from '@tanstack/ai-client' -import GuitarRecommendation from "@/components/example-GuitarRecommendation"; +import GuitarRecommendation from '@/components/example-GuitarRecommendation' -export const Route = createFileRoute("/demo")({ +export const Route = createFileRoute('/demo')({ component: DemoPage, -}); +}) function DemoPage() { const handleToolCall = useCallback( async ({ toolName, input }: { toolName: string; input: any }) => { switch (toolName) { - case "getPersonalGuitarPreference": - return { preference: "acoustic" }; - case "recommendGuitar": - return { id: input.id }; - case "addToWishList": - const wishList = JSON.parse(localStorage.getItem("wishList") || "[]"); - wishList.push(input.guitarId); - localStorage.setItem("wishList", JSON.stringify(wishList)); + case 'getPersonalGuitarPreference': + return { preference: 'acoustic' } + case 'recommendGuitar': + return { id: input.id } + case 'addToWishList': + const wishList = JSON.parse(localStorage.getItem('wishList') || '[]') + wishList.push(input.guitarId) + localStorage.setItem('wishList', JSON.stringify(wishList)) return { success: true, guitarId: input.guitarId, totalItems: wishList.length, - }; + } default: - throw new Error(`Unknown tool: ${toolName}`); + throw new Error(`Unknown tool: ${toolName}`) } }, - [] - ); + [], + ) return (
@@ -65,10 +65,10 @@ function DemoPage() { toolsRenderer={{ recommendGuitar: ({ arguments: args }) => { try { - const parsed = JSON.parse(args); - return ; + const parsed = JSON.parse(args) + return } catch { - return null; + return null } }, }} @@ -83,5 +83,5 @@ function DemoPage() { />
- ); + ) } diff --git a/examples/ts-chat/src/routes/example.guitars/index.tsx b/examples/ts-chat/src/routes/example.guitars/index.tsx index b68ed3f51..8b6c87c7a 100644 --- a/examples/ts-chat/src/routes/example.guitars/index.tsx +++ b/examples/ts-chat/src/routes/example.guitars/index.tsx @@ -1,9 +1,9 @@ -import { Link, createFileRoute } from "@tanstack/react-router"; -import guitars from "../../data/example-guitars"; +import { Link, createFileRoute } from '@tanstack/react-router' +import guitars from '../../data/example-guitars' -export const Route = createFileRoute("/example/guitars/")({ +export const Route = createFileRoute('/example/guitars/')({ component: GuitarsIndex, -}); +}) function GuitarsIndex() { return ( @@ -50,5 +50,5 @@ function GuitarsIndex() { ))} - ); + ) } diff --git a/examples/ts-chat/src/routes/index.tsx b/examples/ts-chat/src/routes/index.tsx index 5bd4dfe84..d8c13e74b 100644 --- a/examples/ts-chat/src/routes/index.tsx +++ b/examples/ts-chat/src/routes/index.tsx @@ -1,49 +1,49 @@ -import { useEffect, useRef, useState } from "react"; -import { createFileRoute } from "@tanstack/react-router"; -import { Send, Square } from "lucide-react"; -import ReactMarkdown from "react-markdown"; -import rehypeRaw from "rehype-raw"; -import rehypeSanitize from "rehype-sanitize"; -import rehypeHighlight from "rehype-highlight"; -import remarkGfm from "remark-gfm"; +import { useEffect, useRef, useState } from 'react' +import { createFileRoute } from '@tanstack/react-router' +import { Send, Square } from 'lucide-react' +import ReactMarkdown from 'react-markdown' +import rehypeRaw from 'rehype-raw' +import rehypeSanitize from 'rehype-sanitize' +import rehypeHighlight from 'rehype-highlight' +import remarkGfm from 'remark-gfm' import { useChat, fetchServerSentEvents, type UIMessage, -} from "@tanstack/ai-react"; -import { ThinkingPart } from "@tanstack/ai-react-ui"; +} from '@tanstack/ai-react' +import { ThinkingPart } from '@tanstack/ai-react-ui' -import GuitarRecommendation from "@/components/example-GuitarRecommendation"; +import GuitarRecommendation from '@/components/example-GuitarRecommendation' function ChatInputArea({ children }: { children: React.ReactNode }) { return (
{children}
- ); + ) } function Messages({ messages, addToolApprovalResponse, }: { - messages: Array; + messages: Array addToolApprovalResponse: (response: { - id: string; - approved: boolean; - }) => Promise; + id: string + approved: boolean + }) => Promise }) { - const messagesContainerRef = useRef(null); + const messagesContainerRef = useRef(null) useEffect(() => { if (messagesContainerRef.current) { messagesContainerRef.current.scrollTop = - messagesContainerRef.current.scrollHeight; + messagesContainerRef.current.scrollHeight } - }, [messages]); + }, [messages]) if (!messages.length) { - return null; + return null } return ( @@ -56,13 +56,13 @@ function Messages({
- {role === "assistant" ? ( + {role === 'assistant' ? (
AI
@@ -75,11 +75,11 @@ function Messages({ {/* Render parts in order */} {parts.map((part, index) => { // Thinking part - if (part.type === "thinking") { + if (part.type === 'thinking') { // Check if thinking is complete (if there's a text part after) const isComplete = parts .slice(index + 1) - .some((p) => p.type === "text"); + .some((p) => p.type === 'text') return (
- ); + ) } - if (part.type === "text" && part.content) { + if (part.type === 'text' && part.content) { return (
- ); + ) } // Approval UI if ( - part.type === "tool-call" && - part.state === "approval-requested" && + part.type === 'tool-call' && + part.state === 'approval-requested' && part.approval ) { return ( @@ -130,7 +130,7 @@ function Messages({ {JSON.stringify( JSON.parse(part.arguments), null, - 2 + 2, )}
@@ -159,13 +159,13 @@ function Messages({
- ); + ) } // Guitar recommendation card if ( - part.type === "tool-call" && - part.name === "recommendGuitar" && + part.type === 'tool-call' && + part.name === 'recommendGuitar' && part.output ) { try { @@ -173,21 +173,21 @@ function Messages({
- ); + ) } catch { - return null; + return null } } - return null; + return null })} - ); + ) })} - ); + ) } function DebugPanel({ @@ -195,17 +195,17 @@ function DebugPanel({ chunks, onClearChunks, }: { - messages: Array; - chunks: any[]; - onClearChunks: () => void; + messages: Array + chunks: any[] + onClearChunks: () => void }) { - const [activeTab, setActiveTab] = useState<"messages" | "chunks">("messages"); + const [activeTab, setActiveTab] = useState<'messages' | 'chunks'>('messages') const exportToTypeScript = () => { - const tsCode = `const rawChunks = ${JSON.stringify(chunks, null, 2)};`; - navigator.clipboard.writeText(tsCode); - alert("TypeScript code copied to clipboard!"); - }; + const tsCode = `const rawChunks = ${JSON.stringify(chunks, null, 2)};` + navigator.clipboard.writeText(tsCode) + alert('TypeScript code copied to clipboard!') + } return (
@@ -218,21 +218,21 @@ function DebugPanel({ {/* Tabs */}
- {activeTab === "messages" && ( + {activeTab === 'messages' && (
               {JSON.stringify(messages, null, 2)}
@@ -249,7 +249,7 @@ function DebugPanel({
           
)} - {activeTab === "chunks" && ( + {activeTab === 'chunks' && (
- ); + ) } function ChatPage() { - const [chunks, setChunks] = useState([]); + const [chunks, setChunks] = useState([]) const { messages, sendMessage, isLoading, addToolApprovalResponse, stop } = useChat({ - connection: fetchServerSentEvents("/api/tanchat"), + connection: fetchServerSentEvents('/api/tanchat'), onChunk: (chunk: any) => { - setChunks((prev) => [...prev, chunk]); + setChunks((prev) => [...prev, chunk]) }, onToolCall: async ({ toolName, input }) => { // Handle client-side tool execution switch (toolName) { - case "getPersonalGuitarPreference": + case 'getPersonalGuitarPreference': // Pure client tool - executes immediately - return { preference: "acoustic" }; + return { preference: 'acoustic' } - case "recommendGuitar": + case 'recommendGuitar': // Client tool for UI display - return { id: input.id }; + return { id: input.id } - case "addToWishList": + case 'addToWishList': // Hybrid: client execution AFTER approval // Only runs after user approves const wishList = JSON.parse( - localStorage.getItem("wishList") || "[]" - ); - wishList.push(input.guitarId); - localStorage.setItem("wishList", JSON.stringify(wishList)); + localStorage.getItem('wishList') || '[]', + ) + wishList.push(input.guitarId) + localStorage.setItem('wishList', JSON.stringify(wishList)) return { success: true, guitarId: input.guitarId, totalItems: wishList.length, - }; + } default: - throw new Error(`Unknown client tool: ${toolName}`); + throw new Error(`Unknown client tool: ${toolName}`) } }, - }); - const [input, setInput] = useState(""); + }) + const [input, setInput] = useState('') - const clearChunks = () => setChunks([]); + const clearChunks = () => setChunks([]) return (
@@ -411,27 +411,27 @@ function ChatPage() { placeholder="Type something clever (or don't, we won't judge)..." className="w-full rounded-lg border border-orange-500/20 bg-gray-800/50 pl-4 pr-12 py-3 text-sm text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-orange-500/50 focus:border-transparent resize-none overflow-hidden shadow-lg" rows={1} - style={{ minHeight: "44px", maxHeight: "200px" }} + style={{ minHeight: '44px', maxHeight: '200px' }} disabled={isLoading} onInput={(e) => { - const target = e.target as HTMLTextAreaElement; - target.style.height = "auto"; + const target = e.target as HTMLTextAreaElement + target.style.height = 'auto' target.style.height = - Math.min(target.scrollHeight, 200) + "px"; + Math.min(target.scrollHeight, 200) + 'px' }} onKeyDown={(e) => { - if (e.key === "Enter" && !e.shiftKey && input.trim()) { - e.preventDefault(); - sendMessage(input); - setInput(""); + if (e.key === 'Enter' && !e.shiftKey && input.trim()) { + e.preventDefault() + sendMessage(input) + setInput('') } }} />
- ); + ) } -export const Route = createFileRoute("/")({ +export const Route = createFileRoute('/')({ component: ChatPage, -}); +}) diff --git a/examples/ts-chat/src/routes/tanchat.css b/examples/ts-chat/src/routes/tanchat.css index 49f1c69ae..a74144fea 100644 --- a/examples/ts-chat/src/routes/tanchat.css +++ b/examples/ts-chat/src/routes/tanchat.css @@ -1,5 +1,5 @@ -@import "tailwindcss"; -@import "highlight.js/styles/github-dark.css"; +@import 'tailwindcss'; +@import 'highlight.js/styles/github-dark.css'; /* Custom scrollbar styles */ ::-webkit-scrollbar { @@ -58,13 +58,17 @@ html { color: inherit; } -.prose h1, .prose h2, .prose h3, .prose h4 { +.prose h1, +.prose h2, +.prose h3, +.prose h4 { color: #f9fafb; /* text-gray-50 */ /* margin-top: 2em; */ /* margin-bottom: 1em; */ } -.prose ul, .prose ol { +.prose ul, +.prose ol { margin-top: 1.25em; margin-bottom: 1.25em; padding-left: 1.625em; @@ -105,7 +109,8 @@ html { margin: 1.25em 0; } -.prose th, .prose td { +.prose th, +.prose td { padding: 0.75em; border: 1px solid rgba(249, 115, 22, 0.2); } @@ -124,7 +129,9 @@ html { .message-enter-active { opacity: 1; transform: translateY(0); - transition: opacity 300ms, transform 300ms; + transition: + opacity 300ms, + transform 300ms; } .message-exit { @@ -217,4 +224,4 @@ html { background-color: transparent; padding: 0; border-radius: 0; -} \ No newline at end of file +} diff --git a/examples/ts-chat/src/styles.css b/examples/ts-chat/src/styles.css index 89be6093a..06f1bca4b 100644 --- a/examples/ts-chat/src/styles.css +++ b/examples/ts-chat/src/styles.css @@ -1,15 +1,15 @@ -@import "tailwindcss"; +@import 'tailwindcss'; body { @apply m-0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", - "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; + font-family: + -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', + 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", - monospace; + font-family: + source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } diff --git a/examples/ts-chat/vite.config.ts b/examples/ts-chat/vite.config.ts index 8a53245c0..634654ef0 100644 --- a/examples/ts-chat/vite.config.ts +++ b/examples/ts-chat/vite.config.ts @@ -1,20 +1,20 @@ -import { defineConfig } from "vite"; -import { tanstackStart } from "@tanstack/react-start/plugin/vite"; -import viteReact from "@vitejs/plugin-react"; -import viteTsConfigPaths from "vite-tsconfig-paths"; -import tailwindcss from "@tailwindcss/vite"; -import { nitroV2Plugin } from "@tanstack/nitro-v2-vite-plugin"; +import { defineConfig } from 'vite' +import { tanstackStart } from '@tanstack/react-start/plugin/vite' +import viteReact from '@vitejs/plugin-react' +import viteTsConfigPaths from 'vite-tsconfig-paths' +import tailwindcss from '@tailwindcss/vite' +import { nitroV2Plugin } from '@tanstack/nitro-v2-vite-plugin' const config = defineConfig({ plugins: [ nitroV2Plugin(), // this is the plugin that enables path aliases viteTsConfigPaths({ - projects: ["./tsconfig.json"], + projects: ['./tsconfig.json'], }), tailwindcss(), tanstackStart(), viteReact(), ], -}); +}) -export default config; +export default config diff --git a/examples/vanilla-chat/README.md b/examples/vanilla-chat/README.md index 5fd765c3f..11b865a92 100644 --- a/examples/vanilla-chat/README.md +++ b/examples/vanilla-chat/README.md @@ -63,7 +63,7 @@ vanilla-chat/ The app uses `ChatClient` from `@tanstack/ai-client` with the `fetchServerSentEvents` connection adapter to connect to the FastAPI server: ```javascript -import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client'; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' const client = new ChatClient({ connection: fetchServerSentEvents('http://localhost:8080/chat'), @@ -73,9 +73,7 @@ const client = new ChatClient({ onLoadingChange: (isLoading) => { // Update loading state }, -}); +}) ``` The FastAPI server streams responses in Server-Sent Events (SSE) format, which the client automatically parses and displays. - - diff --git a/examples/vanilla-chat/index.html b/examples/vanilla-chat/index.html index 488e45519..2f65e7f8d 100644 --- a/examples/vanilla-chat/index.html +++ b/examples/vanilla-chat/index.html @@ -1,40 +1,38 @@ - + - - - - TanStack AI - Vanilla Chat - - - -
-
-

💬 TanStack AI Chat

-

Vanilla JavaScript + FastAPI Example

-
+ + + + TanStack AI - Vanilla Chat + + + +
+
+

💬 TanStack AI Chat

+

Vanilla JavaScript + FastAPI Example

+
-
-
- -
-
- - -
-
+
+
+ +
+
+ + +
+
- + +
-
- - + + - - diff --git a/examples/vanilla-chat/src/main.js b/examples/vanilla-chat/src/main.js index df630c753..bdf9a4008 100644 --- a/examples/vanilla-chat/src/main.js +++ b/examples/vanilla-chat/src/main.js @@ -1,79 +1,79 @@ -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' // Initialize ChatClient const client = new ChatClient({ - connection: fetchServerSentEvents("http://localhost:8000/chat"), + connection: fetchServerSentEvents('http://localhost:8000/chat'), onMessagesChange: (messages) => { - renderMessages(messages); + renderMessages(messages) }, onLoadingChange: (isLoading) => { - updateLoadingState(isLoading); + updateLoadingState(isLoading) }, onErrorChange: (error) => { - showError(error); + showError(error) }, -}); +}) // DOM elements -const messagesContainer = document.getElementById("messages"); -const chatForm = document.getElementById("chat-form"); -const messageInput = document.getElementById("message-input"); -const sendButton = document.getElementById("send-button"); -const errorDiv = document.getElementById("error"); +const messagesContainer = document.getElementById('messages') +const chatForm = document.getElementById('chat-form') +const messageInput = document.getElementById('message-input') +const sendButton = document.getElementById('send-button') +const errorDiv = document.getElementById('error') // Auto-resize textarea -messageInput.addEventListener("input", () => { - messageInput.style.height = "auto"; - messageInput.style.height = messageInput.scrollHeight + "px"; -}); +messageInput.addEventListener('input', () => { + messageInput.style.height = 'auto' + messageInput.style.height = messageInput.scrollHeight + 'px' +}) // Handle form submission -chatForm.addEventListener("submit", async (e) => { - e.preventDefault(); +chatForm.addEventListener('submit', async (e) => { + e.preventDefault() - const message = messageInput.value.trim(); - if (!message || client.getIsLoading()) return; + const message = messageInput.value.trim() + if (!message || client.getIsLoading()) return // Clear input - messageInput.value = ""; - messageInput.style.height = "auto"; + messageInput.value = '' + messageInput.style.height = 'auto' // Focus back on input - messageInput.focus(); + messageInput.focus() try { - await client.sendMessage(message); + await client.sendMessage(message) } catch (error) { - console.error("Error sending message:", error); - showError(error); + console.error('Error sending message:', error) + showError(error) } -}); +}) // Allow Enter to send (Shift+Enter for new line) -messageInput.addEventListener("keydown", (e) => { - if (e.key === "Enter" && !e.shiftKey) { - e.preventDefault(); - chatForm.dispatchEvent(new Event("submit")); +messageInput.addEventListener('keydown', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault() + chatForm.dispatchEvent(new Event('submit')) } -}); +}) // Render messages function renderMessages(messages) { - if (!messagesContainer) return; + if (!messagesContainer) return - messagesContainer.innerHTML = ""; + messagesContainer.innerHTML = '' messages.forEach((message) => { - const messageDiv = document.createElement("div"); - messageDiv.className = `message ${message.role}`; + const messageDiv = document.createElement('div') + messageDiv.className = `message ${message.role}` - if (message.role === "user") { + if (message.role === 'user') { messageDiv.innerHTML = ` -
${escapeHtml(message.content || "")}
- `; - } else if (message.role === "assistant") { - const content = message.content || ""; - const toolCalls = message.toolCalls || []; +
${escapeHtml(message.content || '')}
+ ` + } else if (message.role === 'assistant') { + const content = message.content || '' + const toolCalls = message.toolCalls || [] messageDiv.innerHTML = `
${escapeHtml(content)}
@@ -87,74 +87,74 @@ function renderMessages(messages) {
${escapeHtml(tc.function.name)}
${escapeHtml(
-                  tc.function.arguments
+                  tc.function.arguments,
                 )}
- ` + `, ) - .join("")} + .join('')}
` - : "" + : '' } - `; + ` } - messagesContainer.appendChild(messageDiv); - }); + messagesContainer.appendChild(messageDiv) + }) // Scroll to bottom - messagesContainer.scrollTop = messagesContainer.scrollHeight; + messagesContainer.scrollTop = messagesContainer.scrollHeight } // Update loading state function updateLoadingState(isLoading) { if (sendButton) { - sendButton.disabled = isLoading; - sendButton.textContent = isLoading ? "Sending..." : "Send"; + sendButton.disabled = isLoading + sendButton.textContent = isLoading ? 'Sending...' : 'Send' } if (messageInput) { - messageInput.disabled = isLoading; + messageInput.disabled = isLoading } // Show typing indicator if (isLoading && messagesContainer) { - const typingIndicator = document.createElement("div"); - typingIndicator.className = "message assistant typing"; - typingIndicator.id = "typing-indicator"; - typingIndicator.innerHTML = '
...
'; - messagesContainer.appendChild(typingIndicator); - messagesContainer.scrollTop = messagesContainer.scrollHeight; + const typingIndicator = document.createElement('div') + typingIndicator.className = 'message assistant typing' + typingIndicator.id = 'typing-indicator' + typingIndicator.innerHTML = '
...
' + messagesContainer.appendChild(typingIndicator) + messagesContainer.scrollTop = messagesContainer.scrollHeight } else { - const indicator = document.getElementById("typing-indicator"); + const indicator = document.getElementById('typing-indicator') if (indicator) { - indicator.remove(); + indicator.remove() } } } // Show error function showError(error) { - if (!errorDiv) return; + if (!errorDiv) return if (error) { - errorDiv.textContent = error.message || "An error occurred"; - errorDiv.style.display = "block"; + errorDiv.textContent = error.message || 'An error occurred' + errorDiv.style.display = 'block' } else { - errorDiv.style.display = "none"; + errorDiv.style.display = 'none' } } // Escape HTML to prevent XSS function escapeHtml(text) { - const div = document.createElement("div"); - div.textContent = text; - return div.innerHTML; + const div = document.createElement('div') + div.textContent = text + return div.innerHTML } // Initialize - render any existing messages -renderMessages(client.getMessages()); +renderMessages(client.getMessages()) // Focus input on load -messageInput?.focus(); +messageInput?.focus() diff --git a/examples/vanilla-chat/src/style.css b/examples/vanilla-chat/src/style.css index 553092752..32d356c9a 100644 --- a/examples/vanilla-chat/src/style.css +++ b/examples/vanilla-chat/src/style.css @@ -5,7 +5,9 @@ } body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; + font-family: + -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, + Cantarell, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; display: flex; @@ -109,7 +111,8 @@ header p { } @keyframes pulse { - 0%, 100% { + 0%, + 100% { opacity: 1; } 50% { @@ -190,7 +193,9 @@ header p { font-size: 15px; font-weight: 600; cursor: pointer; - transition: background 0.2s, transform 0.1s; + transition: + background 0.2s, + transform 0.1s; min-width: 80px; } @@ -259,5 +264,3 @@ header p { padding: 16px; } } - - diff --git a/examples/vanilla-chat/vite.config.ts b/examples/vanilla-chat/vite.config.ts index 462005163..12a9d0843 100644 --- a/examples/vanilla-chat/vite.config.ts +++ b/examples/vanilla-chat/vite.config.ts @@ -9,8 +9,6 @@ export default defineConfig({ // target: 'http://localhost:8080', // changeOrigin: true, // } - } - } + }, + }, }) - - diff --git a/packages/php/tanstack-ai/README.md b/packages/php/tanstack-ai/README.md index 7dce5d72b..6081db88e 100644 --- a/packages/php/tanstack-ai/README.md +++ b/packages/php/tanstack-ai/README.md @@ -93,4 +93,3 @@ function generateStream($stream, $converter) { ## License MIT - diff --git a/packages/python/tanstack-ai/README.md b/packages/python/tanstack-ai/README.md index 35bd3d069..6f753597d 100644 --- a/packages/python/tanstack-ai/README.md +++ b/packages/python/tanstack-ai/README.md @@ -83,4 +83,3 @@ async def generate_stream(): ## License MIT - diff --git a/packages/typescript/ai-anthropic/package.json b/packages/typescript/ai-anthropic/package.json index 43aefbff9..5578bacd9 100644 --- a/packages/typescript/ai-anthropic/package.json +++ b/packages/typescript/ai-anthropic/package.json @@ -17,12 +17,12 @@ "adapter" ], "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" } }, "files": [ @@ -43,7 +43,6 @@ "@anthropic-ai/sdk": "^0.71.0", "@tanstack/ai": "workspace:*" }, - "devDependencies": {}, "peerDependencies": { "@tanstack/ai": "workspace:*" } diff --git a/packages/typescript/ai-anthropic/src/anthropic-adapter.ts b/packages/typescript/ai-anthropic/src/anthropic-adapter.ts index d6648194a..d4ee34452 100644 --- a/packages/typescript/ai-anthropic/src/anthropic-adapter.ts +++ b/packages/typescript/ai-anthropic/src/anthropic-adapter.ts @@ -1,54 +1,49 @@ -import Anthropic_SDK from "@anthropic-ai/sdk"; -import type { MessageParam } from "@anthropic-ai/sdk/resources/messages"; -import { - BaseAdapter, - type ChatStreamOptionsUnion, - type SummarizationOptions, - type SummarizationResult, - type EmbeddingOptions, - type EmbeddingResult, - type ModelMessage, - type StreamChunk, -} from "@tanstack/ai"; -import { - ANTHROPIC_EMBEDDING_MODELS, - ANTHROPIC_MODELS, - type AnthropicChatModelProviderOptionsByName, -} from "./model-meta"; -import { convertToolsToProviderFormat } from "./tools/tool-converter"; -import { +import Anthropic_SDK from '@anthropic-ai/sdk' +import { BaseAdapter } from '@tanstack/ai' +import { ANTHROPIC_EMBEDDING_MODELS, ANTHROPIC_MODELS } from './model-meta' +import { convertToolsToProviderFormat } from './tools/tool-converter' +import type { + ChatStreamOptionsUnion, + EmbeddingOptions, + EmbeddingResult, + ModelMessage, + StreamChunk, + SummarizationOptions, + SummarizationResult, +} from '@tanstack/ai' +import type { AnthropicChatModelProviderOptionsByName } from './model-meta' +import type { ExternalTextProviderOptions, InternalTextProviderOptions, -} from "./text/text-provider-options"; +} from './text/text-provider-options' +import type { MessageParam } from '@anthropic-ai/sdk/resources/messages' export interface AnthropicConfig { - apiKey: string; + apiKey: string } /** * Anthropic-specific provider options * @see https://ai-sdk.dev/providers/ai-sdk-providers/anthropic */ -export type AnthropicProviderOptions = ExternalTextProviderOptions; - -type AnthropicContentBlocks = Extract< - MessageParam["content"], - Array -> extends Array - ? Block[] - : never; -type AnthropicContentBlock = AnthropicContentBlocks extends Array - ? Block - : never; - - -type AnthropicChatOptions = ChatStreamOptionsUnion, - AnthropicChatModelProviderOptionsByName ->> +export type AnthropicProviderOptions = ExternalTextProviderOptions + +type AnthropicContentBlocks = + Extract> extends Array + ? Array + : never +type AnthropicContentBlock = + AnthropicContentBlocks extends Array ? Block : never + +type AnthropicChatOptions = ChatStreamOptionsUnion< + BaseAdapter< + typeof ANTHROPIC_MODELS, + typeof ANTHROPIC_EMBEDDING_MODELS, + AnthropicProviderOptions, + Record, + AnthropicChatModelProviderOptionsByName + > +> export class Anthropic extends BaseAdapter< typeof ANTHROPIC_MODELS, @@ -57,41 +52,38 @@ export class Anthropic extends BaseAdapter< Record, AnthropicChatModelProviderOptionsByName > { - name = "anthropic" as const; - models = ANTHROPIC_MODELS; - embeddingModels = ANTHROPIC_EMBEDDING_MODELS; - declare _modelProviderOptionsByName: AnthropicChatModelProviderOptionsByName; + name = 'anthropic' as const + models = ANTHROPIC_MODELS + embeddingModels = ANTHROPIC_EMBEDDING_MODELS + declare _modelProviderOptionsByName: AnthropicChatModelProviderOptionsByName - private client: Anthropic_SDK; + private client: Anthropic_SDK constructor(config: AnthropicConfig) { - super({}); + super({}) this.client = new Anthropic_SDK({ apiKey: config.apiKey, - }); + }) } - async *chatStream( - options: AnthropicChatOptions - ): AsyncIterable { + async *chatStream(options: AnthropicChatOptions): AsyncIterable { try { - // Map common options to Anthropic format using the centralized mapping function - const requestParams = this.mapCommonOptionsToAnthropic(options); + const requestParams = this.mapCommonOptionsToAnthropic(options) const stream = await this.client.beta.messages.create( { ...requestParams, stream: true }, { signal: options.request?.signal, headers: options.request?.headers, - } - ); + }, + ) yield* this.processAnthropicStream(stream, options.model, () => - this.generateId() - ); + this.generateId(), + ) } catch (error: any) { - console.error("[Anthropic Adapter] Error in chatStream:", { + console.error('[Anthropic Adapter] Error in chatStream:', { message: error?.message, status: error?.status, statusText: error?.statusText, @@ -99,37 +91,37 @@ export class Anthropic extends BaseAdapter< type: error?.type, error: error, stack: error?.stack, - }); + }) // Emit an error chunk yield { - type: "error", + type: 'error', id: this.generateId(), - model: options.model || "claude-3-sonnet-20240229", + model: options.model, timestamp: Date.now(), error: { - message: error?.message || "Unknown error occurred", + message: error?.message || 'Unknown error occurred', code: error?.code || error?.status, }, - }; + } } } async summarize(options: SummarizationOptions): Promise { - const systemPrompt = this.buildSummarizationPrompt(options); + const systemPrompt = this.buildSummarizationPrompt(options) const response = await this.client.messages.create({ model: options.model, - messages: [{ role: "user", content: options.text }], + messages: [{ role: 'user', content: options.text }], system: systemPrompt, max_tokens: options.maxLength || 500, temperature: 0.3, stream: false, - }); + }) const content = response.content - .map((c) => (c.type === "text" ? c.text : "")) - .join(""); + .map((c) => (c.type === 'text' ? c.text : '')) + .join('') return { id: response.id, @@ -140,43 +132,43 @@ export class Anthropic extends BaseAdapter< completionTokens: response.usage.output_tokens, totalTokens: response.usage.input_tokens + response.usage.output_tokens, }, - }; + } } async createEmbeddings(_options: EmbeddingOptions): Promise { // Note: Anthropic doesn't have a native embeddings API // You would need to use a different service or implement a workaround throw new Error( - "Embeddings are not natively supported by Anthropic. Consider using OpenAI or another provider for embeddings." - ); + 'Embeddings are not natively supported by Anthropic. Consider using OpenAI or another provider for embeddings.', + ) } private buildSummarizationPrompt(options: SummarizationOptions): string { - let prompt = "You are a professional summarizer. "; + let prompt = 'You are a professional summarizer. ' switch (options.style) { - case "bullet-points": - prompt += "Provide a summary in bullet point format. "; - break; - case "paragraph": - prompt += "Provide a summary in paragraph format. "; - break; - case "concise": - prompt += "Provide a very concise summary in 1-2 sentences. "; - break; + case 'bullet-points': + prompt += 'Provide a summary in bullet point format. ' + break + case 'paragraph': + prompt += 'Provide a summary in paragraph format. ' + break + case 'concise': + prompt += 'Provide a very concise summary in 1-2 sentences. ' + break default: - prompt += "Provide a clear and concise summary. "; + prompt += 'Provide a clear and concise summary. ' } if (options.focus && options.focus.length > 0) { - prompt += `Focus on the following aspects: ${options.focus.join(", ")}. `; + prompt += `Focus on the following aspects: ${options.focus.join(', ')}. ` } if (options.maxLength) { - prompt += `Keep the summary under ${options.maxLength} tokens. `; + prompt += `Keep the summary under ${options.maxLength} tokens. ` } - return prompt; + return prompt } /** @@ -186,47 +178,50 @@ export class Anthropic extends BaseAdapter< private mapCommonOptionsToAnthropic(options: AnthropicChatOptions) { const providerOptions = options.providerOptions as | InternalTextProviderOptions - | undefined; + | undefined - const formattedMessages = this.formatMessages(options.messages); + const formattedMessages = this.formatMessages(options.messages) const tools = options.tools ? convertToolsToProviderFormat(options.tools) - : undefined; + : undefined // Filter out invalid fields from providerOptions (like 'store' which is OpenAI-specific) - const validProviderOptions: Partial = {}; + const validProviderOptions: Partial = {} if (providerOptions) { - const validKeys: (keyof InternalTextProviderOptions)[] = [ - "container", - "context_management", - "mcp_servers", - "service_tier", - "stop_sequences", - "system", - "thinking", - "tool_choice", - "top_k", - ]; + const validKeys: Array = [ + 'container', + 'context_management', + 'mcp_servers', + 'service_tier', + 'stop_sequences', + 'system', + 'thinking', + 'tool_choice', + 'top_k', + ] for (const key of validKeys) { if (key in providerOptions) { - const value = (providerOptions)[key]; + const value = providerOptions[key] // Anthropic expects tool_choice to be an object, not a string - if (key === "tool_choice" && typeof value === "string") { - (validProviderOptions as any)[key] = { type: value }; + if (key === 'tool_choice' && typeof value === 'string') { + ;(validProviderOptions as any)[key] = { type: value } } else { - (validProviderOptions as any)[key] = value; + ;(validProviderOptions as any)[key] = value } } } } // Ensure max_tokens is greater than thinking.budget_tokens if thinking is enabled - const thinkingBudget = validProviderOptions.thinking?.type === "enabled" ? validProviderOptions.thinking?.budget_tokens : undefined; - const defaultMaxTokens = options.options?.maxTokens || 1024; + const thinkingBudget = + validProviderOptions.thinking?.type === 'enabled' + ? validProviderOptions.thinking.budget_tokens + : undefined + const defaultMaxTokens = options.options?.maxTokens || 1024 const maxTokens = thinkingBudget && thinkingBudget >= defaultMaxTokens ? thinkingBudget + 1 // Ensure max_tokens is greater than budget_tokens - : defaultMaxTokens; + : defaultMaxTokens const requestParams: InternalTextProviderOptions = { model: options.model, @@ -236,193 +231,193 @@ export class Anthropic extends BaseAdapter< messages: formattedMessages, tools: tools, ...validProviderOptions, - }; - return requestParams; + } + return requestParams } private formatMessages( - messages: ModelMessage[] - ): InternalTextProviderOptions["messages"] { - const formattedMessages: InternalTextProviderOptions["messages"] = []; + messages: Array, + ): InternalTextProviderOptions['messages'] { + const formattedMessages: InternalTextProviderOptions['messages'] = [] for (const message of messages) { - const role = message.role ?? "user"; + const role = message.role - if (role === "system") { - continue; + if (role === 'system') { + continue } - if (role === "tool" && message.toolCallId) { + if (role === 'tool' && message.toolCallId) { formattedMessages.push({ - role: "user", + role: 'user', content: [ { - type: "tool_result", + type: 'tool_result', tool_use_id: message.toolCallId, - content: message.content ?? "", + content: message.content ?? '', }, ], - }); - continue; + }) + continue } - if (role === "assistant" && message.toolCalls?.length) { - const contentBlocks: AnthropicContentBlocks = []; + if (role === 'assistant' && message.toolCalls?.length) { + const contentBlocks: AnthropicContentBlocks = [] if (message.content) { const textBlock: AnthropicContentBlock = { - type: "text", + type: 'text', text: message.content, - }; - contentBlocks.push(textBlock); + } + contentBlocks.push(textBlock) } for (const toolCall of message.toolCalls) { - let parsedInput: unknown = {}; + let parsedInput: unknown = {} try { parsedInput = toolCall.function.arguments ? JSON.parse(toolCall.function.arguments) - : {}; + : {} } catch { - parsedInput = toolCall.function.arguments; + parsedInput = toolCall.function.arguments } const toolUseBlock: AnthropicContentBlock = { - type: "tool_use", + type: 'tool_use', id: toolCall.id, name: toolCall.function.name, input: parsedInput, - }; - contentBlocks.push(toolUseBlock); + } + contentBlocks.push(toolUseBlock) } formattedMessages.push({ - role: "assistant", + role: 'assistant', content: contentBlocks, - }); + }) - continue; + continue } formattedMessages.push({ - role: role === "assistant" ? "assistant" : "user", - content: message.content ?? "", - }); + role: role === 'assistant' ? 'assistant' : 'user', + content: message.content ?? '', + }) } - return formattedMessages; + return formattedMessages } private async *processAnthropicStream( stream: AsyncIterable, model: string, - generateId: () => string + generateId: () => string, ): AsyncIterable { - let accumulatedContent = ""; - let accumulatedThinking = ""; - const timestamp = Date.now(); + let accumulatedContent = '' + let accumulatedThinking = '' + const timestamp = Date.now() const toolCallsMap = new Map< number, { id: string; name: string; input: string } - >(); - let currentToolIndex = -1; + >() + let currentToolIndex = -1 try { for await (const event of stream) { - if (event.type === "content_block_start") { - if (event.content_block.type === "tool_use") { - currentToolIndex++; + if (event.type === 'content_block_start') { + if (event.content_block.type === 'tool_use') { + currentToolIndex++ toolCallsMap.set(currentToolIndex, { id: event.content_block.id, name: event.content_block.name, - input: "", - }); - } else if (event.content_block.type === "thinking") { + input: '', + }) + } else if (event.content_block.type === 'thinking') { // Reset thinking content when a new thinking block starts - accumulatedThinking = ""; + accumulatedThinking = '' } - } else if (event.type === "content_block_delta") { - if (event.delta.type === "text_delta") { - const delta = event.delta.text; - accumulatedContent += delta; + } else if (event.type === 'content_block_delta') { + if (event.delta.type === 'text_delta') { + const delta = event.delta.text + accumulatedContent += delta yield { - type: "content", + type: 'content', id: generateId(), model: model, timestamp, delta, content: accumulatedContent, - role: "assistant", - }; - } else if (event.delta.type === "thinking_delta") { - // Handle thinking content - const delta = event.delta.thinking ?? ""; - accumulatedThinking += delta; + role: 'assistant', + } + } else if (event.delta.type === 'thinking_delta') { + // Handle thinking content + const delta = event.delta.thinking + accumulatedThinking += delta yield { - type: "thinking", + type: 'thinking', id: generateId(), model: model, timestamp, delta, content: accumulatedThinking, - }; - } else if (event.delta.type === "input_json_delta") { + } + } else if (event.delta.type === 'input_json_delta') { // Tool input is being streamed - const existing = toolCallsMap.get(currentToolIndex); + const existing = toolCallsMap.get(currentToolIndex) if (existing) { - existing.input += event.delta.partial_json; + existing.input += event.delta.partial_json yield { - type: "tool_call", + type: 'tool_call', id: generateId(), model: model, timestamp, toolCall: { id: existing.id, - type: "function", + type: 'function', function: { name: existing.name, arguments: event.delta.partial_json, }, }, index: currentToolIndex, - }; + } } } - } else if (event.type === "message_stop") { + } else if (event.type === 'message_stop') { yield { - type: "done", + type: 'done', id: generateId(), model: model, timestamp, - finishReason: "stop", - }; - } else if (event.type === "message_delta") { + finishReason: 'stop', + } + } else if (event.type === 'message_delta') { if (event.delta.stop_reason) { yield { - type: "done", + type: 'done', id: generateId(), model: model, timestamp, finishReason: - event.delta.stop_reason === "tool_use" - ? "tool_calls" - // TODO Fix the any and map the responses properly - : (event.delta.stop_reason as any), - - usage: event.usage - ? { - promptTokens: event.usage.input_tokens || 0, - completionTokens: event.usage.output_tokens || 0, - totalTokens: (event.usage.input_tokens || 0) + (event.usage.output_tokens || 0), - } - : undefined, - }; + event.delta.stop_reason === 'tool_use' + ? 'tool_calls' + : // TODO Fix the any and map the responses properly + (event.delta.stop_reason as any), + + usage: { + promptTokens: event.usage.input_tokens || 0, + completionTokens: event.usage.output_tokens || 0, + totalTokens: + (event.usage.input_tokens || 0) + + (event.usage.output_tokens || 0), + }, + } } } } } catch (error: any) { - console.error("[Anthropic Adapter] Error in processAnthropicStream:", { + console.error('[Anthropic Adapter] Error in processAnthropicStream:', { message: error?.message, status: error?.status, statusText: error?.statusText, @@ -430,18 +425,18 @@ export class Anthropic extends BaseAdapter< type: error?.type, error: error, stack: error?.stack, - }); + }) yield { - type: "error", + type: 'error', id: generateId(), model: model, timestamp, error: { - message: error?.message || "Unknown error occurred", + message: error?.message || 'Unknown error occurred', code: error?.code || error?.status, }, - }; + } } } } @@ -464,9 +459,9 @@ export class Anthropic extends BaseAdapter< */ export function createAnthropic( apiKey: string, - config?: Omit + config?: Omit, ): Anthropic { - return new Anthropic({ apiKey, ...config }); + return new Anthropic({ apiKey, ...config }) } /** @@ -486,20 +481,20 @@ export function createAnthropic( * const aiInstance = ai(anthropic()); * ``` */ -export function anthropic(config?: Omit): Anthropic { +export function anthropic(config?: Omit): Anthropic { const env = - typeof globalThis !== "undefined" && (globalThis as any).window?.env + typeof globalThis !== 'undefined' && (globalThis as any).window?.env ? (globalThis as any).window.env - : typeof process !== "undefined" + : typeof process !== 'undefined' ? process.env - : undefined; - const key = env?.ANTHROPIC_API_KEY; + : undefined + const key = env?.ANTHROPIC_API_KEY if (!key) { throw new Error( - "ANTHROPIC_API_KEY is required. Please set it in your environment variables or use createAnthropic(apiKey, config) instead." - ); + 'ANTHROPIC_API_KEY is required. Please set it in your environment variables or use createAnthropic(apiKey, config) instead.', + ) } - return createAnthropic(key, config); + return createAnthropic(key, config) } diff --git a/packages/typescript/ai-anthropic/src/index.ts b/packages/typescript/ai-anthropic/src/index.ts index 9338b9fa6..718165016 100644 --- a/packages/typescript/ai-anthropic/src/index.ts +++ b/packages/typescript/ai-anthropic/src/index.ts @@ -1,10 +1,13 @@ -export { Anthropic, createAnthropic, anthropic, type AnthropicConfig } from "./anthropic-adapter"; -export type { AnthropicChatModelProviderOptionsByName } from "./model-meta"; +export { + Anthropic, + createAnthropic, + anthropic, + type AnthropicConfig, +} from './anthropic-adapter' +export type { AnthropicChatModelProviderOptionsByName } from './model-meta' // Export tool conversion utilities -export { - convertToolsToProviderFormat, -} from "./tools/tool-converter"; +export { convertToolsToProviderFormat } from './tools/tool-converter' // Export tool types -export type { AnthropicTool, CustomTool } from "./tools"; \ No newline at end of file +export type { AnthropicTool, CustomTool } from './tools' diff --git a/packages/typescript/ai-anthropic/src/model-meta.ts b/packages/typescript/ai-anthropic/src/model-meta.ts index 56b817017..2b85e0e5a 100644 --- a/packages/typescript/ai-anthropic/src/model-meta.ts +++ b/packages/typescript/ai-anthropic/src/model-meta.ts @@ -1,377 +1,451 @@ -import type { - AnthropicContainerOptions, - AnthropicContextManagementOptions, - AnthropicMCPOptions, - AnthropicServiceTierOptions, - AnthropicStopSequencesOptions, - AnthropicThinkingOptions, - AnthropicToolChoiceOptions, - AnthropicSamplingOptions, -} from "./text/text-provider-options"; - -interface ModelMeta< - TProviderOptions = unknown, - TToolCapabilities = unknown, - TMessageCapabilities = unknown -> { - name: string; - id: string; - supports: { - extended_thinking?: boolean; - priority_tier?: boolean; - - }; - context_window?: number; - max_output_tokens?: number; - knowledge_cutoff?: string; - pricing: { - input: { - normal: number; - cached?: number; - }; - output: { - normal: number; - }; - }; - /** - * Type-level description of which provider options this model supports. - */ - providerOptions?: TProviderOptions; - /** - * Type-level description of which tool capabilities this model supports. - */ - toolCapabilities?: TToolCapabilities; - /** - * Type-level description of which message/input capabilities this model supports. - */ - messageCapabilities?: TMessageCapabilities; -} -const CLAUDE_SONNET_4_5 = { - name: "claude-sonnet-4-5", - id: "claude-sonnet-4-5-20250929", - context_window: 200_000, - max_output_tokens: 64_000, - knowledge_cutoff: "2025-09-29", - pricing: { - input: { - normal: 3, - }, - output: { - normal: 15 - } - }, - supports: { - extended_thinking: true, - priority_tier: true - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -const CLAUDE_HAIKU_4_5 = { - name: "claude-haiku-4-5", - id: "claude-haiku-4-5-20251001", - context_window: 200_000, - max_output_tokens: 64_000, - knowledge_cutoff: "2025-10-01", - pricing: { - input: { - normal: 1, - }, - output: { - normal: 5 - } - }, - supports: { - extended_thinking: true, - priority_tier: true - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -const CLAUDE_OPUS_4_1 = { - name: "claude-opus-4-1", - id: "claude-opus-4-1-20250805", - context_window: 200_000, - max_output_tokens: 64_000, - knowledge_cutoff: "2025-08-05", - pricing: { - input: { - normal: 15, - }, - output: { - normal: 75 - } - }, - supports: { - extended_thinking: true, - priority_tier: true - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -const CLAUDE_OPUS_4_5 = { - name: "claude-opus-4-5", - id: "claude-opus-4-5-20251101", - context_window: 200_000, - max_output_tokens: 32_000, - knowledge_cutoff: "2025-11-01", - pricing: { - input: { - normal: 15, - }, - output: { - normal: 75 - } - }, - supports: { - extended_thinking: true, - priority_tier: true - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -const CLAUDE_SONNET_4 = { - name: "claude-sonnet-4", - id: "claude-sonnet-4-20250514", - context_window: 200_000, - max_output_tokens: 64_000, - knowledge_cutoff: "2025-05-14", - pricing: { - input: { - normal: 3, - }, - output: { - normal: 15 - } - }, - supports: { - extended_thinking: true, - priority_tier: true - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -const CLAUDE_SONNET_3_7 = { - name: "claude-sonnet-3-7", - id: "claude-3-7-sonnet-20250219", - max_output_tokens: 64_000, - knowledge_cutoff: "2025-05-14", - pricing: { - input: { - normal: 3, - }, - output: { - normal: 15 - } - }, - supports: { - extended_thinking: true, - priority_tier: true - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -const CLAUDE_OPUS_4 = { - name: "claude-opus-4", - id: "claude-opus-4-20250514", - context_window: 200_000, - max_output_tokens: 32_000, - knowledge_cutoff: "2025-05-14", - pricing: { - input: { - normal: 15, - }, - output: { - normal: 75 - } - }, - supports: { - extended_thinking: true, - priority_tier: true - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -const CLAUDE_HAIKU_3_5 = { - name: "claude-haiku-3-5", - id: "claude-3-5-haiku-20241022", - context_window: 200_000, - max_output_tokens: 8_000, - knowledge_cutoff: "2025-10-22", - pricing: { - input: { - normal: 0.8, - }, - output: { - normal: 4 - } - }, - supports: { - extended_thinking: false, - priority_tier: true - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -const CLAUDE_HAIKU_3 = { - name: "claude-haiku-3", - id: "claude-3-haiku-20240307", - context_window: 200_000, - max_output_tokens: 4_000, - knowledge_cutoff: "2024-03-07", - pricing: { - input: { - normal: 0.25, - }, - output: { - normal: 1.25 - } - }, - supports: { - extended_thinking: false, - priority_tier: false - } -} as const satisfies ModelMeta< - AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions ->; - -export const ANTHROPIC_MODEL_META = { - [CLAUDE_OPUS_4_5.name]: CLAUDE_OPUS_4_5, - [CLAUDE_SONNET_4_5.name]: CLAUDE_SONNET_4_5, - [CLAUDE_HAIKU_4_5.name]: CLAUDE_HAIKU_4_5, - [CLAUDE_OPUS_4_1.name]: CLAUDE_OPUS_4_1, - [CLAUDE_SONNET_4.name]: CLAUDE_SONNET_4, - [CLAUDE_SONNET_3_7.name]: CLAUDE_SONNET_3_7, - [CLAUDE_OPUS_4.name]: CLAUDE_OPUS_4, - [CLAUDE_HAIKU_3_5.name]: CLAUDE_HAIKU_3_5, - [CLAUDE_HAIKU_3.name]: CLAUDE_HAIKU_3, -} as const; - -export type AnthropicModelMetaMap = typeof ANTHROPIC_MODEL_META; - -export type AnthropicModelProviderOptions< - TModel extends keyof AnthropicModelMetaMap -> = AnthropicModelMetaMap[TModel] extends ModelMeta - ? TProviderOptions - : unknown; - -export type AnthropicModelToolCapabilities< - TModel extends keyof AnthropicModelMetaMap -> = AnthropicModelMetaMap[TModel] extends ModelMeta - ? TToolCapabilities - : unknown; - -export type AnthropicModelMessageCapabilities< - TModel extends keyof AnthropicModelMetaMap -> = AnthropicModelMetaMap[TModel] extends ModelMeta - ? TMessageCapabilities - : unknown; - -export const ANTHROPIC_MODELS = [ - CLAUDE_OPUS_4_5.id, - CLAUDE_SONNET_4_5.id, - CLAUDE_HAIKU_4_5.id, - CLAUDE_OPUS_4_1.id, - CLAUDE_SONNET_4.id, - CLAUDE_SONNET_3_7.id, - CLAUDE_OPUS_4.id, - CLAUDE_HAIKU_3_5.id, - CLAUDE_HAIKU_3.id -] as const; - -export const ANTHROPIC_IMAGE_MODELS = [] as const; -export const ANTHROPIC_EMBEDDING_MODELS = [] as const; -export const ANTHROPIC_AUDIO_MODELS = [] as const; -export const ANTHROPIC_VIDEO_MODELS = [] as const; - -export type AnthropicModel = (typeof ANTHROPIC_MODELS)[number]; - -// Manual type map for per-model provider options -// Models are differentiated by extended_thinking and priority_tier support -export type AnthropicChatModelProviderOptionsByName = { - // Models with both extended_thinking and priority_tier - [CLAUDE_OPUS_4_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; - [CLAUDE_SONNET_4_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; - [CLAUDE_HAIKU_4_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; - [CLAUDE_OPUS_4_1.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; - [CLAUDE_SONNET_4.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; - [CLAUDE_SONNET_3_7.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; - [CLAUDE_OPUS_4.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicThinkingOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; - - // Model with priority_tier but NO extended_thinking - [CLAUDE_HAIKU_3_5.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicServiceTierOptions & AnthropicStopSequencesOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; - - // Model with neither extended_thinking nor priority_tier - [CLAUDE_HAIKU_3.id]: AnthropicContainerOptions & AnthropicContextManagementOptions & AnthropicMCPOptions & AnthropicStopSequencesOptions & AnthropicToolChoiceOptions & AnthropicSamplingOptions; -}; \ No newline at end of file +import type { + AnthropicContainerOptions, + AnthropicContextManagementOptions, + AnthropicMCPOptions, + AnthropicSamplingOptions, + AnthropicServiceTierOptions, + AnthropicStopSequencesOptions, + AnthropicThinkingOptions, + AnthropicToolChoiceOptions, +} from './text/text-provider-options' + +interface ModelMeta< + TProviderOptions = unknown, + TToolCapabilities = unknown, + TMessageCapabilities = unknown, +> { + name: string + id: string + supports: { + extended_thinking?: boolean + priority_tier?: boolean + } + context_window?: number + max_output_tokens?: number + knowledge_cutoff?: string + pricing: { + input: { + normal: number + cached?: number + } + output: { + normal: number + } + } + /** + * Type-level description of which provider options this model supports. + */ + providerOptions?: TProviderOptions + /** + * Type-level description of which tool capabilities this model supports. + */ + toolCapabilities?: TToolCapabilities + /** + * Type-level description of which message/input capabilities this model supports. + */ + messageCapabilities?: TMessageCapabilities +} +const CLAUDE_SONNET_4_5 = { + name: 'claude-sonnet-4-5', + id: 'claude-sonnet-4-5-20250929', + context_window: 200_000, + max_output_tokens: 64_000, + knowledge_cutoff: '2025-09-29', + pricing: { + input: { + normal: 3, + }, + output: { + normal: 15, + }, + }, + supports: { + extended_thinking: true, + priority_tier: true, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +const CLAUDE_HAIKU_4_5 = { + name: 'claude-haiku-4-5', + id: 'claude-haiku-4-5-20251001', + context_window: 200_000, + max_output_tokens: 64_000, + knowledge_cutoff: '2025-10-01', + pricing: { + input: { + normal: 1, + }, + output: { + normal: 5, + }, + }, + supports: { + extended_thinking: true, + priority_tier: true, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +const CLAUDE_OPUS_4_1 = { + name: 'claude-opus-4-1', + id: 'claude-opus-4-1-20250805', + context_window: 200_000, + max_output_tokens: 64_000, + knowledge_cutoff: '2025-08-05', + pricing: { + input: { + normal: 15, + }, + output: { + normal: 75, + }, + }, + supports: { + extended_thinking: true, + priority_tier: true, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +const CLAUDE_OPUS_4_5 = { + name: 'claude-opus-4-5', + id: 'claude-opus-4-5-20251101', + context_window: 200_000, + max_output_tokens: 32_000, + knowledge_cutoff: '2025-11-01', + pricing: { + input: { + normal: 15, + }, + output: { + normal: 75, + }, + }, + supports: { + extended_thinking: true, + priority_tier: true, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +const CLAUDE_SONNET_4 = { + name: 'claude-sonnet-4', + id: 'claude-sonnet-4-20250514', + context_window: 200_000, + max_output_tokens: 64_000, + knowledge_cutoff: '2025-05-14', + pricing: { + input: { + normal: 3, + }, + output: { + normal: 15, + }, + }, + supports: { + extended_thinking: true, + priority_tier: true, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +const CLAUDE_SONNET_3_7 = { + name: 'claude-sonnet-3-7', + id: 'claude-3-7-sonnet-20250219', + max_output_tokens: 64_000, + knowledge_cutoff: '2025-05-14', + pricing: { + input: { + normal: 3, + }, + output: { + normal: 15, + }, + }, + supports: { + extended_thinking: true, + priority_tier: true, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +const CLAUDE_OPUS_4 = { + name: 'claude-opus-4', + id: 'claude-opus-4-20250514', + context_window: 200_000, + max_output_tokens: 32_000, + knowledge_cutoff: '2025-05-14', + pricing: { + input: { + normal: 15, + }, + output: { + normal: 75, + }, + }, + supports: { + extended_thinking: true, + priority_tier: true, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +const CLAUDE_HAIKU_3_5 = { + name: 'claude-haiku-3-5', + id: 'claude-3-5-haiku-20241022', + context_window: 200_000, + max_output_tokens: 8_000, + knowledge_cutoff: '2025-10-22', + pricing: { + input: { + normal: 0.8, + }, + output: { + normal: 4, + }, + }, + supports: { + extended_thinking: false, + priority_tier: true, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +const CLAUDE_HAIKU_3 = { + name: 'claude-haiku-3', + id: 'claude-3-haiku-20240307', + context_window: 200_000, + max_output_tokens: 4_000, + knowledge_cutoff: '2024-03-07', + pricing: { + input: { + normal: 0.25, + }, + output: { + normal: 1.25, + }, + }, + supports: { + extended_thinking: false, + priority_tier: false, + }, +} as const satisfies ModelMeta< + AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +> + +export const ANTHROPIC_MODEL_META = { + [CLAUDE_OPUS_4_5.name]: CLAUDE_OPUS_4_5, + [CLAUDE_SONNET_4_5.name]: CLAUDE_SONNET_4_5, + [CLAUDE_HAIKU_4_5.name]: CLAUDE_HAIKU_4_5, + [CLAUDE_OPUS_4_1.name]: CLAUDE_OPUS_4_1, + [CLAUDE_SONNET_4.name]: CLAUDE_SONNET_4, + [CLAUDE_SONNET_3_7.name]: CLAUDE_SONNET_3_7, + [CLAUDE_OPUS_4.name]: CLAUDE_OPUS_4, + [CLAUDE_HAIKU_3_5.name]: CLAUDE_HAIKU_3_5, + [CLAUDE_HAIKU_3.name]: CLAUDE_HAIKU_3, +} as const + +export type AnthropicModelMetaMap = typeof ANTHROPIC_MODEL_META + +export type AnthropicModelProviderOptions< + TModel extends keyof AnthropicModelMetaMap, +> = + AnthropicModelMetaMap[TModel] extends ModelMeta< + infer TProviderOptions, + any, + any + > + ? TProviderOptions + : unknown + +export type AnthropicModelToolCapabilities< + TModel extends keyof AnthropicModelMetaMap, +> = + AnthropicModelMetaMap[TModel] extends ModelMeta< + any, + infer TToolCapabilities, + any + > + ? TToolCapabilities + : unknown + +export type AnthropicModelMessageCapabilities< + TModel extends keyof AnthropicModelMetaMap, +> = + AnthropicModelMetaMap[TModel] extends ModelMeta< + any, + any, + infer TMessageCapabilities + > + ? TMessageCapabilities + : unknown + +export const ANTHROPIC_MODELS = [ + CLAUDE_OPUS_4_5.id, + CLAUDE_SONNET_4_5.id, + CLAUDE_HAIKU_4_5.id, + CLAUDE_OPUS_4_1.id, + CLAUDE_SONNET_4.id, + CLAUDE_SONNET_3_7.id, + CLAUDE_OPUS_4.id, + CLAUDE_HAIKU_3_5.id, + CLAUDE_HAIKU_3.id, +] as const + +export const ANTHROPIC_IMAGE_MODELS = [] as const +export const ANTHROPIC_EMBEDDING_MODELS = [] as const +export const ANTHROPIC_AUDIO_MODELS = [] as const +export const ANTHROPIC_VIDEO_MODELS = [] as const + +export type AnthropicModel = (typeof ANTHROPIC_MODELS)[number] + +// Manual type map for per-model provider options +// Models are differentiated by extended_thinking and priority_tier support +export type AnthropicChatModelProviderOptionsByName = { + // Models with both extended_thinking and priority_tier + [CLAUDE_OPUS_4_5.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + [CLAUDE_SONNET_4_5.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + [CLAUDE_HAIKU_4_5.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + [CLAUDE_OPUS_4_1.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + [CLAUDE_SONNET_4.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + [CLAUDE_SONNET_3_7.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + [CLAUDE_OPUS_4.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + + // Model with priority_tier but NO extended_thinking + [CLAUDE_HAIKU_3_5.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + + // Model with neither extended_thinking nor priority_tier + [CLAUDE_HAIKU_3.id]: AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicStopSequencesOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions +} diff --git a/packages/typescript/ai-anthropic/src/text/text-provider-options.ts b/packages/typescript/ai-anthropic/src/text/text-provider-options.ts index 948b5713a..11054b99b 100644 --- a/packages/typescript/ai-anthropic/src/text/text-provider-options.ts +++ b/packages/typescript/ai-anthropic/src/text/text-provider-options.ts @@ -1,286 +1,300 @@ -import { MessageParam, TextBlockParam, } from "@anthropic-ai/sdk/resources/messages"; -import { AnthropicTool } from "../tools"; -import { BetaContextManagementConfig, BetaToolChoiceAny, BetaToolChoiceAuto, BetaToolChoiceTool } from "@anthropic-ai/sdk/resources/beta/messages/messages"; - -export interface AnthropicContainerOptions { - /** - * Container identifier for reuse across requests. - * Container parameters with skills to be loaded. - */ - container?: { - id: string | null; - /** - * List of skills to load into the container - */ - skills: { - /** - * Between 1-64 characters - */ - skill_id: string; - - type: "anthropic" | "custom"; - /** - * Skill version or latest by default - */ - version?: string - }[] | null - } | null -} - -export interface AnthropicContextManagementOptions { - /** - * Context management configuration. - -This allows you to control how Claude manages context across multiple requests, such as whether to clear function results or not. - */ - context_management?: BetaContextManagementConfig | null -} - -export interface AnthropicMCPOptions { - /** - * MCP servers to be utilized in this request - * Maximum of 20 servers - */ - mcp_servers?: MCPServer[] -} - -export interface AnthropicServiceTierOptions { - /** - * Determines whether to use priority capacity (if available) or standard capacity for this request. - */ - service_tier?: "auto" | "standard_only" -} - -export interface AnthropicStopSequencesOptions { - /** - * Custom text sequences that will cause the model to stop generating. - -Anthropic models will normally stop when they have naturally completed their turn, which will result in a response stop_reason of "end_turn". - -If you want the model to stop generating when it encounters custom strings of text, you can use the stop_sequences parameter. If the model encounters one of the custom sequences, the response stop_reason value will be "stop_sequence" and the response stop_sequence value will contain the matched stop sequence. - */ - stop_sequences?: string[]; -} - -export interface AnthropicThinkingOptions { - /** - * Configuration for enabling Claude's extended thinking. - -When enabled, responses include thinking content blocks showing Claude's thinking process before the final answer. Requires a minimum budget of 1,024 tokens and counts towards your max_tokens limit. - */ - thinking?: { - /** - * Determines how many tokens Claude can use for its internal reasoning process. Larger budgets can enable more thorough analysis for complex problems, improving response quality. - -Must be ≥1024 and less than max_tokens - */ - budget_tokens: number; - - type: "enabled" - } | { - type: "disabled" - } -} - -export interface AnthropicToolChoiceOptions { - tool_choice?: BetaToolChoiceAny | BetaToolChoiceTool | BetaToolChoiceAuto -} - -export interface AnthropicSamplingOptions { - /** - * Only sample from the top K options for each subsequent token. - -Used to remove "long tail" low probability responses. -Recommended for advanced use cases only. You usually only need to use temperature. - -Required range: x >= 0 - */ - top_k?: number; -} - -export type ExternalTextProviderOptions = AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions; - -export interface InternalTextProviderOptions extends ExternalTextProviderOptions { - - model: string; - - messages: MessageParam[] - - /** - * The maximum number of tokens to generate before stopping. This parameter only specifies the absolute maximum number of tokens to generate. - * Range x >= 1. - */ - max_tokens: number; - /** - * Whether to incrementally stream the response using server-sent events. - */ - stream?: boolean; - /** - * stem prompt. - - A system prompt is a way of providing context and instructions to Claude, such as specifying a particular goal or role. - */ - system?: string | TextBlockParam[] - /** - * Amount of randomness injected into the response. - * Either use this or top_p, but not both. - * Defaults to 1.0. Ranges from 0.0 to 1.0. Use temperature closer to 0.0 for analytical / multiple choice, and closer to 1.0 for creative and generative tasks. - * @default 1.0 - */ - temperature?: number; - - tools?: AnthropicTool[] - - /** - * Use nucleus sampling. - -In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it reaches a particular probability specified by top_p. You should either alter temperature or top_p, but not both. - */ - top_p?: number; -} - -export const validateTopPandTemperature = (options: InternalTextProviderOptions) => { - if (options.top_p !== null && options.temperature !== undefined) { - throw new Error("You should either set top_p or temperature, but not both."); - } -} - -export interface CacheControl { - type: "ephemeral", - ttl: "5m" | "1h" -} - -export const validateThinking = (options: InternalTextProviderOptions) => { - const thinking = options.thinking; - if (thinking && thinking.type === "enabled") { - if (thinking.budget_tokens < 1024) { - throw new Error("thinking.budget_tokens must be at least 1024."); - } - if (thinking.budget_tokens >= options.max_tokens) { - throw new Error("thinking.budget_tokens must be less than max_tokens."); - } - } -} -export type Citation = (CharacterLocationCitation | PageCitation | ContentBlockCitation | WebSearchResultCitation | RequestSearchResultLocation); - -interface CharacterLocationCitation { - cited_text: string; - /** - * Bigger than 0 - */ - document_index: number; - /** - * Between 1-255 characters - */ - document_title: string | null; - - end_char_index: number; - - start_char_index: number; - - type: "char_location" -} - -interface PageCitation { - cited_text: string; - /** - * Bigger than 0 - */ - document_index: number; - /** - * Between 1-255 characters - */ - document_title: string | null; - - end_page_number: number; - /** - * Has to be bigger than 0 - */ - start_page_number: number; - - type: "page_location" -} - -interface ContentBlockCitation { - cited_text: string; - /** - * Bigger than 0 - */ - document_index: number; - /** - * Between 1-255 characters - */ - document_title: string | null; - - end_block_index: number; - /** - * Has to be bigger than 0 - */ - start_block_index: number; - - type: "content_block_location" -} - -interface WebSearchResultCitation { - cited_text: string; - - encrypted_index: number; - /** - * Between 1-512 characters - */ - title: string | null; - /** - * Required length between 1-2048 characters - */ - url: string - type: "web_search_result_location" -} - -interface RequestSearchResultLocation { - cited_text: string; - - end_block_index: number; - /** - * Has to be bigger than 0 - */ - start_block_index: number; - /** - * Bigger than 0 - */ - search_result_index: number; - - source: string; - /** - * Between 1-512 characters - */ - title: string | null; - - type: "search_result_location" -} - - -interface MCPServer { - name: string; - url: string; - type: "url" - authorization_token?: string | null; - tool_configuration: { - allowed_tools?: string[] | null; - enabled?: boolean | null; - } | null; -} - - - -export const validateMaxTokens = (options: InternalTextProviderOptions) => { - if (options.max_tokens < 1) { - throw new Error("max_tokens must be at least 1."); - } -} \ No newline at end of file +import type { + BetaContextManagementConfig, + BetaToolChoiceAny, + BetaToolChoiceAuto, + BetaToolChoiceTool, +} from '@anthropic-ai/sdk/resources/beta/messages/messages' +import type { AnthropicTool } from '../tools' +import type { + MessageParam, + TextBlockParam, +} from '@anthropic-ai/sdk/resources/messages' + +export interface AnthropicContainerOptions { + /** + * Container identifier for reuse across requests. + * Container parameters with skills to be loaded. + */ + container?: { + id: string | null + /** + * List of skills to load into the container + */ + skills: Array<{ + /** + * Between 1-64 characters + */ + skill_id: string + + type: 'anthropic' | 'custom' + /** + * Skill version or latest by default + */ + version?: string + }> | null + } | null +} + +export interface AnthropicContextManagementOptions { + /** + * Context management configuration. + +This allows you to control how Claude manages context across multiple requests, such as whether to clear function results or not. + */ + context_management?: BetaContextManagementConfig | null +} + +export interface AnthropicMCPOptions { + /** + * MCP servers to be utilized in this request + * Maximum of 20 servers + */ + mcp_servers?: Array +} + +export interface AnthropicServiceTierOptions { + /** + * Determines whether to use priority capacity (if available) or standard capacity for this request. + */ + service_tier?: 'auto' | 'standard_only' +} + +export interface AnthropicStopSequencesOptions { + /** + * Custom text sequences that will cause the model to stop generating. + +Anthropic models will normally stop when they have naturally completed their turn, which will result in a response stop_reason of "end_turn". + +If you want the model to stop generating when it encounters custom strings of text, you can use the stop_sequences parameter. If the model encounters one of the custom sequences, the response stop_reason value will be "stop_sequence" and the response stop_sequence value will contain the matched stop sequence. + */ + stop_sequences?: Array +} + +export interface AnthropicThinkingOptions { + /** + * Configuration for enabling Claude's extended thinking. + +When enabled, responses include thinking content blocks showing Claude's thinking process before the final answer. Requires a minimum budget of 1,024 tokens and counts towards your max_tokens limit. + */ + thinking?: + | { + /** + * Determines how many tokens Claude can use for its internal reasoning process. Larger budgets can enable more thorough analysis for complex problems, improving response quality. + +Must be ≥1024 and less than max_tokens + */ + budget_tokens: number + + type: 'enabled' + } + | { + type: 'disabled' + } +} + +export interface AnthropicToolChoiceOptions { + tool_choice?: BetaToolChoiceAny | BetaToolChoiceTool | BetaToolChoiceAuto +} + +export interface AnthropicSamplingOptions { + /** + * Only sample from the top K options for each subsequent token. + +Used to remove "long tail" low probability responses. +Recommended for advanced use cases only. You usually only need to use temperature. + +Required range: x >= 0 + */ + top_k?: number +} + +export type ExternalTextProviderOptions = AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + +export interface InternalTextProviderOptions + extends ExternalTextProviderOptions { + model: string + + messages: Array + + /** + * The maximum number of tokens to generate before stopping. This parameter only specifies the absolute maximum number of tokens to generate. + * Range x >= 1. + */ + max_tokens: number + /** + * Whether to incrementally stream the response using server-sent events. + */ + stream?: boolean + /** + * stem prompt. + + A system prompt is a way of providing context and instructions to Claude, such as specifying a particular goal or role. + */ + system?: string | Array + /** + * Amount of randomness injected into the response. + * Either use this or top_p, but not both. + * Defaults to 1.0. Ranges from 0.0 to 1.0. Use temperature closer to 0.0 for analytical / multiple choice, and closer to 1.0 for creative and generative tasks. + * @default 1.0 + */ + temperature?: number + + tools?: Array + + /** + * Use nucleus sampling. + +In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it reaches a particular probability specified by top_p. You should either alter temperature or top_p, but not both. + */ + top_p?: number +} + +export const validateTopPandTemperature = ( + options: InternalTextProviderOptions, +) => { + if (options.top_p !== undefined && options.temperature !== undefined) { + throw new Error('You should either set top_p or temperature, but not both.') + } +} + +export interface CacheControl { + type: 'ephemeral' + ttl: '5m' | '1h' +} + +export const validateThinking = (options: InternalTextProviderOptions) => { + const thinking = options.thinking + if (thinking && thinking.type === 'enabled') { + if (thinking.budget_tokens < 1024) { + throw new Error('thinking.budget_tokens must be at least 1024.') + } + if (thinking.budget_tokens >= options.max_tokens) { + throw new Error('thinking.budget_tokens must be less than max_tokens.') + } + } +} +export type Citation = + | CharacterLocationCitation + | PageCitation + | ContentBlockCitation + | WebSearchResultCitation + | RequestSearchResultLocation + +interface CharacterLocationCitation { + cited_text: string + /** + * Bigger than 0 + */ + document_index: number + /** + * Between 1-255 characters + */ + document_title: string | null + + end_char_index: number + + start_char_index: number + + type: 'char_location' +} + +interface PageCitation { + cited_text: string + /** + * Bigger than 0 + */ + document_index: number + /** + * Between 1-255 characters + */ + document_title: string | null + + end_page_number: number + /** + * Has to be bigger than 0 + */ + start_page_number: number + + type: 'page_location' +} + +interface ContentBlockCitation { + cited_text: string + /** + * Bigger than 0 + */ + document_index: number + /** + * Between 1-255 characters + */ + document_title: string | null + + end_block_index: number + /** + * Has to be bigger than 0 + */ + start_block_index: number + + type: 'content_block_location' +} + +interface WebSearchResultCitation { + cited_text: string + + encrypted_index: number + /** + * Between 1-512 characters + */ + title: string | null + /** + * Required length between 1-2048 characters + */ + url: string + type: 'web_search_result_location' +} + +interface RequestSearchResultLocation { + cited_text: string + + end_block_index: number + /** + * Has to be bigger than 0 + */ + start_block_index: number + /** + * Bigger than 0 + */ + search_result_index: number + + source: string + /** + * Between 1-512 characters + */ + title: string | null + + type: 'search_result_location' +} + +interface MCPServer { + name: string + url: string + type: 'url' + authorization_token?: string | null + tool_configuration: { + allowed_tools?: Array | null + enabled?: boolean | null + } | null +} + +export const validateMaxTokens = (options: InternalTextProviderOptions) => { + if (options.max_tokens < 1) { + throw new Error('max_tokens must be at least 1.') + } +} diff --git a/packages/typescript/ai-anthropic/src/tools/bash-tool.ts b/packages/typescript/ai-anthropic/src/tools/bash-tool.ts index 2cfc132b6..0cd3d6f9d 100644 --- a/packages/typescript/ai-anthropic/src/tools/bash-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/bash-tool.ts @@ -1,26 +1,27 @@ -import { BetaToolBash20241022, BetaToolBash20250124 } from "@anthropic-ai/sdk/resources/beta"; -import type { Tool } from "@tanstack/ai"; - -export type BashTool = BetaToolBash20241022 | BetaToolBash20250124 - - - -export function createBashTool(config: BashTool): BashTool { - return config -} - -export function convertBashToolToAdapterFormat(tool: Tool): BashTool { - const metadata = tool.metadata as BashTool; - return metadata -} -export function bashTool(config: BashTool): Tool { - return { - type: "function", - function: { - name: "bash", - description: "", - parameters: {} - }, - metadata: config - } -} \ No newline at end of file +import type { + BetaToolBash20241022, + BetaToolBash20250124, +} from '@anthropic-ai/sdk/resources/beta' +import type { Tool } from '@tanstack/ai' + +export type BashTool = BetaToolBash20241022 | BetaToolBash20250124 + +export function createBashTool(config: BashTool): BashTool { + return config +} + +export function convertBashToolToAdapterFormat(tool: Tool): BashTool { + const metadata = tool.metadata as BashTool + return metadata +} +export function bashTool(config: BashTool): Tool { + return { + type: 'function', + function: { + name: 'bash', + description: '', + parameters: {}, + }, + metadata: config, + } +} diff --git a/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts b/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts index 77ec623d3..0b8a0bc3d 100644 --- a/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts @@ -1,26 +1,34 @@ -import { BetaCodeExecutionTool20250522, BetaCodeExecutionTool20250825 } from "@anthropic-ai/sdk/resources/beta"; -import type { Tool } from "@tanstack/ai"; - -export type CodeExecutionTool = BetaCodeExecutionTool20250522 | BetaCodeExecutionTool20250825 - -export function createCodeExecutionTool(config: CodeExecutionTool): CodeExecutionTool { - return config -} - -export function convertCodeExecutionToolToAdapterFormat(tool: Tool): CodeExecutionTool { - const metadata = tool.metadata as CodeExecutionTool - return metadata -} - -export function codeExecutionTool(config: CodeExecutionTool): Tool { - return { - type: "function", - function: { - name: "code_execution", - description: "", - parameters: {} - }, - metadata: config - } -} - +import type { + BetaCodeExecutionTool20250522, + BetaCodeExecutionTool20250825, +} from '@anthropic-ai/sdk/resources/beta' +import type { Tool } from '@tanstack/ai' + +export type CodeExecutionTool = + | BetaCodeExecutionTool20250522 + | BetaCodeExecutionTool20250825 + +export function createCodeExecutionTool( + config: CodeExecutionTool, +): CodeExecutionTool { + return config +} + +export function convertCodeExecutionToolToAdapterFormat( + tool: Tool, +): CodeExecutionTool { + const metadata = tool.metadata as CodeExecutionTool + return metadata +} + +export function codeExecutionTool(config: CodeExecutionTool): Tool { + return { + type: 'function', + function: { + name: 'code_execution', + description: '', + parameters: {}, + }, + metadata: config, + } +} diff --git a/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts b/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts index 4e5625795..63e09d7bf 100644 --- a/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts @@ -1,28 +1,34 @@ -import { BetaToolComputerUse20241022, BetaToolComputerUse20250124 } from "@anthropic-ai/sdk/resources/beta"; -import type { Tool } from "@tanstack/ai"; - - -export type ComputerUseTool = BetaToolComputerUse20241022 | BetaToolComputerUse20250124 - -export function createComputerUseTool( - config: ComputerUseTool -): ComputerUseTool { - return config -} - -export function convertComputerUseToolToAdapterFormat(tool: Tool): ComputerUseTool { - const metadata = tool.metadata as ComputerUseTool - return metadata -} - -export function computerUseTool(config: ComputerUseTool): Tool { - return { - type: "function", - function: { - name: "computer", - description: "", - parameters: {} - }, - metadata: config - } -} \ No newline at end of file +import type { + BetaToolComputerUse20241022, + BetaToolComputerUse20250124, +} from '@anthropic-ai/sdk/resources/beta' +import type { Tool } from '@tanstack/ai' + +export type ComputerUseTool = + | BetaToolComputerUse20241022 + | BetaToolComputerUse20250124 + +export function createComputerUseTool( + config: ComputerUseTool, +): ComputerUseTool { + return config +} + +export function convertComputerUseToolToAdapterFormat( + tool: Tool, +): ComputerUseTool { + const metadata = tool.metadata as ComputerUseTool + return metadata +} + +export function computerUseTool(config: ComputerUseTool): Tool { + return { + type: 'function', + function: { + name: 'computer', + description: '', + parameters: {}, + }, + metadata: config, + } +} diff --git a/packages/typescript/ai-anthropic/src/tools/custom-tool.ts b/packages/typescript/ai-anthropic/src/tools/custom-tool.ts index 3818a0da5..26e1021e3 100644 --- a/packages/typescript/ai-anthropic/src/tools/custom-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/custom-tool.ts @@ -1,53 +1,59 @@ -import { CacheControl } from "../text/text-provider-options"; -import type { Tool } from "@tanstack/ai"; - -export interface CustomTool { - /** - * The name of the tool. - */ - name: string; - type: "custom" - /** - * A brief description of what the tool does. Tool descriptions should be as detailed as possible. The more information that the model has about what the tool is and how to use it, the better it will perform. You can use natural language descriptions to reinforce important aspects of the tool input JSON schema. - */ - description: string; - /** - * This defines the shape of the input that your tool accepts and that the model will produce. - */ - input_schema: { - type: "object"; - properties: Record | null; - required?: string[] | null; - } - - cache_control?: CacheControl | null -} - -export function convertCustomToolToAdapterFormat(tool: Tool): CustomTool { - const metadata = (tool.metadata as { cacheControl?: CacheControl | null }) || {}; - return { - name: tool.function.name, - type: "custom", - description: tool.function.description, - input_schema: { - type: "object", - properties: (tool.function.parameters as any)?.properties || null, - required: (tool.function.parameters as any)?.required || null, - }, - cache_control: metadata.cacheControl || null, - }; -} - -export function customTool(name: string, description: string, parameters: Record, cacheControl?: CacheControl | null): Tool { - return { - type: "function", - function: { - name, - description, - parameters - }, - metadata: { - cacheControl - } - } -} \ No newline at end of file +import type { CacheControl } from '../text/text-provider-options' +import type { Tool } from '@tanstack/ai' + +export interface CustomTool { + /** + * The name of the tool. + */ + name: string + type: 'custom' + /** + * A brief description of what the tool does. Tool descriptions should be as detailed as possible. The more information that the model has about what the tool is and how to use it, the better it will perform. You can use natural language descriptions to reinforce important aspects of the tool input JSON schema. + */ + description: string + /** + * This defines the shape of the input that your tool accepts and that the model will produce. + */ + input_schema: { + type: 'object' + properties: Record | null + required?: Array | null + } + + cache_control?: CacheControl | null +} + +export function convertCustomToolToAdapterFormat(tool: Tool): CustomTool { + const metadata = + (tool.metadata as { cacheControl?: CacheControl | null } | undefined) || {} + return { + name: tool.function.name, + type: 'custom', + description: tool.function.description, + input_schema: { + type: 'object', + properties: tool.function.parameters.properties || null, + required: tool.function.parameters.required || null, + }, + cache_control: metadata.cacheControl || null, + } +} + +export function customTool( + name: string, + description: string, + parameters: Record, + cacheControl?: CacheControl | null, +): Tool { + return { + type: 'function', + function: { + name, + description, + parameters, + }, + metadata: { + cacheControl, + }, + } +} diff --git a/packages/typescript/ai-anthropic/src/tools/index.ts b/packages/typescript/ai-anthropic/src/tools/index.ts index d66c87112..67b1c7647 100644 --- a/packages/typescript/ai-anthropic/src/tools/index.ts +++ b/packages/typescript/ai-anthropic/src/tools/index.ts @@ -1,14 +1,13 @@ +import type { BashTool } from './bash-tool' +import type { CodeExecutionTool } from './code-execution-tool' +import type { ComputerUseTool } from './computer-use-tool' +import type { CustomTool } from './custom-tool' +import type { MemoryTool } from './memory-tool' +import type { TextEditorTool } from './text-editor-tool' +import type { WebFetchTool } from './web-fetch-tool' +import type { WebSearchTool } from './web-search-tool' -import { BashTool } from "./bash-tool"; -import { CodeExecutionTool } from "./code-execution-tool"; -import { ComputerUseTool } from "./computer-use-tool"; -import { CustomTool } from "./custom-tool"; -import { MemoryTool } from "./memory-tool"; -import { TextEditorTool } from "./text-editor-tool"; -import { WebFetchTool } from "./web-fetch-tool"; -import { WebSearchTool } from "./web-search-tool"; - -export type AnthropicTool = ( +export type AnthropicTool = | BashTool | CodeExecutionTool | ComputerUseTool @@ -17,7 +16,15 @@ export type AnthropicTool = ( | TextEditorTool | WebFetchTool | WebSearchTool -); // Export individual tool types -export type { BashTool, CodeExecutionTool, ComputerUseTool, CustomTool, MemoryTool, TextEditorTool, WebFetchTool, WebSearchTool }; +export type { + BashTool, + CodeExecutionTool, + ComputerUseTool, + CustomTool, + MemoryTool, + TextEditorTool, + WebFetchTool, + WebSearchTool, +} diff --git a/packages/typescript/ai-anthropic/src/tools/memory-tool.ts b/packages/typescript/ai-anthropic/src/tools/memory-tool.ts index e45cc3735..3318a48e3 100644 --- a/packages/typescript/ai-anthropic/src/tools/memory-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/memory-tool.ts @@ -1,24 +1,23 @@ -import { BetaMemoryTool20250818 } from "@anthropic-ai/sdk/resources/beta"; -import type { Tool } from "@tanstack/ai"; - -export type MemoryTool = BetaMemoryTool20250818 - - -export function convertMemoryToolToAdapterFormat(tool: Tool): MemoryTool { - const metadata = tool.metadata as MemoryTool - return metadata -} - -export function memoryTool(cacheControl?: MemoryTool): Tool { - return { - type: "function", - function: { - name: "memory", - description: "", - parameters: {} - }, - metadata: { - cacheControl - } - } -} \ No newline at end of file +import type { BetaMemoryTool20250818 } from '@anthropic-ai/sdk/resources/beta' +import type { Tool } from '@tanstack/ai' + +export type MemoryTool = BetaMemoryTool20250818 + +export function convertMemoryToolToAdapterFormat(tool: Tool): MemoryTool { + const metadata = tool.metadata as MemoryTool + return metadata +} + +export function memoryTool(cacheControl?: MemoryTool): Tool { + return { + type: 'function', + function: { + name: 'memory', + description: '', + parameters: {}, + }, + metadata: { + cacheControl, + }, + } +} diff --git a/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts b/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts index e41f9e4b0..c15437603 100644 --- a/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts @@ -1,36 +1,44 @@ -import { ToolTextEditor20250124, ToolTextEditor20250429, ToolTextEditor20250728 } from "@anthropic-ai/sdk/resources/messages"; -import type { CacheControl } from "../text/text-provider-options"; -import type { Tool } from "@tanstack/ai"; - -export type TextEditorTool = ToolTextEditor20250124 | ToolTextEditor20250429 | ToolTextEditor20250728 - -export function createTextEditorTool(config: T): T { - return config -} - -export function convertTextEditorToolToAdapterFormat(tool: Tool): TextEditorTool { - const metadata = tool.metadata as TextEditorTool - return { - ...metadata, - - } -} - -export function textEditorTool(config: T): Tool { - return { - type: "function", - function: { - name: "str_replace_editor", - description: "", - parameters: {} - }, - metadata: config - } -} - -export interface TextEditor { - name: "str_replace_based_edit_tool"; - type: "text_editor_20250728"; - cache_control?: CacheControl | null - max_characters?: number | null; -} \ No newline at end of file +import type { + ToolTextEditor20250124, + ToolTextEditor20250429, + ToolTextEditor20250728, +} from '@anthropic-ai/sdk/resources/messages' +import type { CacheControl } from '../text/text-provider-options' +import type { Tool } from '@tanstack/ai' + +export type TextEditorTool = + | ToolTextEditor20250124 + | ToolTextEditor20250429 + | ToolTextEditor20250728 + +export function createTextEditorTool(config: T): T { + return config +} + +export function convertTextEditorToolToAdapterFormat( + tool: Tool, +): TextEditorTool { + const metadata = tool.metadata as TextEditorTool + return { + ...metadata, + } +} + +export function textEditorTool(config: T): Tool { + return { + type: 'function', + function: { + name: 'str_replace_editor', + description: '', + parameters: {}, + }, + metadata: config, + } +} + +export interface TextEditor { + name: 'str_replace_based_edit_tool' + type: 'text_editor_20250728' + cache_control?: CacheControl | null + max_characters?: number | null +} diff --git a/packages/typescript/ai-anthropic/src/tools/tool-converter.ts b/packages/typescript/ai-anthropic/src/tools/tool-converter.ts index 6c3735821..0b3e08f9b 100644 --- a/packages/typescript/ai-anthropic/src/tools/tool-converter.ts +++ b/packages/typescript/ai-anthropic/src/tools/tool-converter.ts @@ -1,61 +1,61 @@ -import type { Tool } from "@tanstack/ai"; -import { AnthropicTool, } from "."; -import { convertBashToolToAdapterFormat } from "./bash-tool"; -import { convertCodeExecutionToolToAdapterFormat } from "./code-execution-tool"; -import { convertComputerUseToolToAdapterFormat } from "./computer-use-tool"; -import { convertCustomToolToAdapterFormat } from "./custom-tool"; -import { convertMemoryToolToAdapterFormat } from "./memory-tool"; -import { convertTextEditorToolToAdapterFormat } from "./text-editor-tool"; -import { convertWebFetchToolToAdapterFormat } from "./web-fetch-tool"; -import { convertWebSearchToolToAdapterFormat } from "./web-search-tool"; - -/** - * Converts standard Tool format to Anthropic-specific tool format - * - * @param tools - Array of standard Tool objects - * @returns Array of Anthropic-specific tool definitions - * - * @example - * ```typescript - * const tools: Tool[] = [{ - * type: "function", - * function: { - * name: "get_weather", - * description: "Get weather for a location", - * parameters: { - * type: "object", - * properties: { location: { type: "string" } }, - * required: ["location"] - * } - * } - * }]; - * - * const anthropicTools = convertToolsToProviderFormat(tools); - * ``` - */ -export function convertToolsToProviderFormat( - tools: TTool[], -): AnthropicTool[] { - return tools.map(tool => { - const name = tool.function.name; - - switch (name) { - case "bash": - return convertBashToolToAdapterFormat(tool); - case "code_execution": - return convertCodeExecutionToolToAdapterFormat(tool); - case "computer": - return convertComputerUseToolToAdapterFormat(tool); - case "memory": - return convertMemoryToolToAdapterFormat(tool); - case "str_replace_editor": - return convertTextEditorToolToAdapterFormat(tool); - case "web_fetch": - return convertWebFetchToolToAdapterFormat(tool); - case "web_search": - return convertWebSearchToolToAdapterFormat(tool); - default: - return convertCustomToolToAdapterFormat(tool); - } - }); -} +import { convertBashToolToAdapterFormat } from './bash-tool' +import { convertCodeExecutionToolToAdapterFormat } from './code-execution-tool' +import { convertComputerUseToolToAdapterFormat } from './computer-use-tool' +import { convertCustomToolToAdapterFormat } from './custom-tool' +import { convertMemoryToolToAdapterFormat } from './memory-tool' +import { convertTextEditorToolToAdapterFormat } from './text-editor-tool' +import { convertWebFetchToolToAdapterFormat } from './web-fetch-tool' +import { convertWebSearchToolToAdapterFormat } from './web-search-tool' +import type { AnthropicTool } from '.' +import type { Tool } from '@tanstack/ai' + +/** + * Converts standard Tool format to Anthropic-specific tool format + * + * @param tools - Array of standard Tool objects + * @returns Array of Anthropic-specific tool definitions + * + * @example + * ```typescript + * const tools: Tool[] = [{ + * type: "function", + * function: { + * name: "get_weather", + * description: "Get weather for a location", + * parameters: { + * type: "object", + * properties: { location: { type: "string" } }, + * required: ["location"] + * } + * } + * }]; + * + * const anthropicTools = convertToolsToProviderFormat(tools); + * ``` + */ +export function convertToolsToProviderFormat( + tools: Array, +): Array { + return tools.map((tool) => { + const name = tool.function.name + + switch (name) { + case 'bash': + return convertBashToolToAdapterFormat(tool) + case 'code_execution': + return convertCodeExecutionToolToAdapterFormat(tool) + case 'computer': + return convertComputerUseToolToAdapterFormat(tool) + case 'memory': + return convertMemoryToolToAdapterFormat(tool) + case 'str_replace_editor': + return convertTextEditorToolToAdapterFormat(tool) + case 'web_fetch': + return convertWebFetchToolToAdapterFormat(tool) + case 'web_search': + return convertWebSearchToolToAdapterFormat(tool) + default: + return convertCustomToolToAdapterFormat(tool) + } + }) +} diff --git a/packages/typescript/ai-anthropic/src/tools/web-fetch-tool.ts b/packages/typescript/ai-anthropic/src/tools/web-fetch-tool.ts index 66bd9f7f9..196eb579f 100644 --- a/packages/typescript/ai-anthropic/src/tools/web-fetch-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/web-fetch-tool.ts @@ -1,39 +1,52 @@ -import { BetaWebFetchTool20250910 } from "@anthropic-ai/sdk/resources/beta"; -import type { CacheControl } from "../text/text-provider-options"; -import type { Tool } from "@tanstack/ai"; - -export type WebFetchTool = BetaWebFetchTool20250910 - - -export function convertWebFetchToolToAdapterFormat(tool: Tool): WebFetchTool { - const metadata = tool.metadata as { allowedDomains?: string[] | null; blockedDomains?: string[] | null; maxUses?: number | null; citations?: { enabled?: boolean } | null; maxContentTokens?: number | null; cacheControl?: CacheControl | null }; - return { - name: "web_fetch", - type: "web_fetch_20250910", - allowed_domains: metadata.allowedDomains, - blocked_domains: metadata.blockedDomains, - max_uses: metadata.maxUses, - citations: metadata.citations, - max_content_tokens: metadata.maxContentTokens, - cache_control: metadata.cacheControl || null, - }; -} - -export function webFetchTool(config?: { allowedDomains?: string[] | null; blockedDomains?: string[] | null; maxUses?: number | null; citations?: { enabled?: boolean } | null; maxContentTokens?: number | null; cacheControl?: CacheControl | null }): Tool { - return { - type: "function", - function: { - name: "web_fetch", - description: "", - parameters: {} - }, - metadata: { - allowedDomains: config?.allowedDomains, - blockedDomains: config?.blockedDomains, - maxUses: config?.maxUses, - citations: config?.citations, - maxContentTokens: config?.maxContentTokens, - cacheControl: config?.cacheControl - } - } -} \ No newline at end of file +import type { BetaWebFetchTool20250910 } from '@anthropic-ai/sdk/resources/beta' +import type { CacheControl } from '../text/text-provider-options' +import type { Tool } from '@tanstack/ai' + +export type WebFetchTool = BetaWebFetchTool20250910 + +export function convertWebFetchToolToAdapterFormat(tool: Tool): WebFetchTool { + const metadata = tool.metadata as { + allowedDomains?: Array | null + blockedDomains?: Array | null + maxUses?: number | null + citations?: { enabled?: boolean } | null + maxContentTokens?: number | null + cacheControl?: CacheControl | null + } + return { + name: 'web_fetch', + type: 'web_fetch_20250910', + allowed_domains: metadata.allowedDomains, + blocked_domains: metadata.blockedDomains, + max_uses: metadata.maxUses, + citations: metadata.citations, + max_content_tokens: metadata.maxContentTokens, + cache_control: metadata.cacheControl || null, + } +} + +export function webFetchTool(config?: { + allowedDomains?: Array | null + blockedDomains?: Array | null + maxUses?: number | null + citations?: { enabled?: boolean } | null + maxContentTokens?: number | null + cacheControl?: CacheControl | null +}): Tool { + return { + type: 'function', + function: { + name: 'web_fetch', + description: '', + parameters: {}, + }, + metadata: { + allowedDomains: config?.allowedDomains, + blockedDomains: config?.blockedDomains, + maxUses: config?.maxUses, + citations: config?.citations, + maxContentTokens: config?.maxContentTokens, + cacheControl: config?.cacheControl, + }, + } +} diff --git a/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts b/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts index e6a832e6e..75f3ba963 100644 --- a/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts @@ -1,60 +1,102 @@ -import { WebSearchTool20250305 } from "@anthropic-ai/sdk/resources/messages"; -import { CacheControl } from "../text/text-provider-options"; -import type { Tool } from "@tanstack/ai"; - -export type WebSearchTool = WebSearchTool20250305 - - -export const validateDomains = (tool: WebSearchTool) => { - if (tool.allowed_domains && tool.blocked_domains) { - throw new Error("allowed_domains and blocked_domains cannot be used together."); - } -} - -export const validateUserLocation = (userLocation: WebSearchTool["user_location"]) => { - if (userLocation) { - if (userLocation.city && (userLocation.city.length < 1 || userLocation.city.length > 255)) { - throw new Error("user_location.city must be between 1 and 255 characters."); - } - if (userLocation.country && userLocation.country.length !== 2) { - throw new Error("user_location.country must be exactly 2 characters."); - } - if (userLocation.region && (userLocation.region.length < 1 || userLocation.region.length > 255)) { - throw new Error("user_location.region must be between 1 and 255 characters."); - } - if (userLocation.timezone && (userLocation.timezone.length < 1 || userLocation.timezone.length > 255)) { - throw new Error("user_location.timezone must be between 1 and 255 characters."); - } - } -} - -export function convertWebSearchToolToAdapterFormat(tool: Tool): WebSearchTool { - const metadata = tool.metadata as { allowedDomains?: string[] | null; blockedDomains?: string[] | null; maxUses?: number | null; userLocation?: { type: "approximate"; city?: string | null; country?: string | null; region?: string | null; timezone?: string | null } | null; cacheControl?: CacheControl | null }; - return { - name: "web_search", - type: "web_search_20250305", - allowed_domains: metadata.allowedDomains, - blocked_domains: metadata.blockedDomains, - max_uses: metadata.maxUses, - user_location: metadata.userLocation, - cache_control: metadata.cacheControl || null, - }; -} - -export function webSearchTool(config?: { allowedDomains?: string[] | null; blockedDomains?: string[] | null; maxUses?: number | null; userLocation?: { type: "approximate"; city?: string | null; country?: string | null; region?: string | null; timezone?: string | null } | null; cacheControl?: CacheControl | null }): Tool { - return { - type: "function", - function: { - name: "web_search", - description: "", - parameters: {} - }, - metadata: { - allowedDomains: config?.allowedDomains, - blockedDomains: config?.blockedDomains, - maxUses: config?.maxUses, - userLocation: config?.userLocation, - cacheControl: config?.cacheControl - } - } -} \ No newline at end of file +import type { WebSearchTool20250305 } from '@anthropic-ai/sdk/resources/messages' +import type { CacheControl } from '../text/text-provider-options' +import type { Tool } from '@tanstack/ai' + +export type WebSearchTool = WebSearchTool20250305 + +export const validateDomains = (tool: WebSearchTool) => { + if (tool.allowed_domains && tool.blocked_domains) { + throw new Error( + 'allowed_domains and blocked_domains cannot be used together.', + ) + } +} + +export const validateUserLocation = ( + userLocation: WebSearchTool['user_location'], +) => { + if (userLocation) { + if ( + userLocation.city && + (userLocation.city.length < 1 || userLocation.city.length > 255) + ) { + throw new Error( + 'user_location.city must be between 1 and 255 characters.', + ) + } + if (userLocation.country && userLocation.country.length !== 2) { + throw new Error('user_location.country must be exactly 2 characters.') + } + if ( + userLocation.region && + (userLocation.region.length < 1 || userLocation.region.length > 255) + ) { + throw new Error( + 'user_location.region must be between 1 and 255 characters.', + ) + } + if ( + userLocation.timezone && + (userLocation.timezone.length < 1 || userLocation.timezone.length > 255) + ) { + throw new Error( + 'user_location.timezone must be between 1 and 255 characters.', + ) + } + } +} + +export function convertWebSearchToolToAdapterFormat(tool: Tool): WebSearchTool { + const metadata = tool.metadata as { + allowedDomains?: Array | null + blockedDomains?: Array | null + maxUses?: number | null + userLocation?: { + type: 'approximate' + city?: string | null + country?: string | null + region?: string | null + timezone?: string | null + } | null + cacheControl?: CacheControl | null + } + return { + name: 'web_search', + type: 'web_search_20250305', + allowed_domains: metadata.allowedDomains, + blocked_domains: metadata.blockedDomains, + max_uses: metadata.maxUses, + user_location: metadata.userLocation, + cache_control: metadata.cacheControl || null, + } +} + +export function webSearchTool(config?: { + allowedDomains?: Array | null + blockedDomains?: Array | null + maxUses?: number | null + userLocation?: { + type: 'approximate' + city?: string | null + country?: string | null + region?: string | null + timezone?: string | null + } | null + cacheControl?: CacheControl | null +}): Tool { + return { + type: 'function', + function: { + name: 'web_search', + description: '', + parameters: {}, + }, + metadata: { + allowedDomains: config?.allowedDomains, + blockedDomains: config?.blockedDomains, + maxUses: config?.maxUses, + userLocation: config?.userLocation, + cacheControl: config?.cacheControl, + }, + } +} diff --git a/packages/typescript/ai-anthropic/tests/anthropic-adapter.test.ts b/packages/typescript/ai-anthropic/tests/anthropic-adapter.test.ts index 1d57f2338..c812f4ba1 100644 --- a/packages/typescript/ai-anthropic/tests/anthropic-adapter.test.ts +++ b/packages/typescript/ai-anthropic/tests/anthropic-adapter.test.ts @@ -1,195 +1,198 @@ -import { describe, it, expect, beforeEach, vi } from "vitest"; -import { chat, type Tool, type StreamChunk } from "@tanstack/ai"; -import { Anthropic, type AnthropicProviderOptions } from "../src/anthropic-adapter"; - -const mocks = vi.hoisted(() => { - const betaMessagesCreate = vi.fn(); - const messagesCreate = vi.fn(); - - const client = { - beta: { - messages: { - create: betaMessagesCreate, - }, - }, - messages: { - create: messagesCreate, - }, - }; - - return { betaMessagesCreate, messagesCreate, client }; -}); - -vi.mock("@anthropic-ai/sdk", () => { - const { client } = mocks; - - class MockAnthropic { - beta = client.beta; - messages = client.messages; - - constructor(_: { apiKey: string }) { } - } - - return { default: MockAnthropic }; -}); - -const createAdapter = () => new Anthropic({ apiKey: "test-key" }); - -const toolArguments = JSON.stringify({ location: "Berlin" }); - -const weatherTool: Tool = { - type: "function", - function: { - name: "lookup_weather", - description: "Return the weather for a city", - parameters: { - type: "object", - properties: { - location: { type: "string" }, - }, - required: ["location"], - }, - }, -}; - -describe("Anthropic adapter option mapping", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - it("maps normalized options and Anthropic provider settings", async () => { - // Mock the streaming response - const mockStream = (async function* () { - yield { - type: "content_block_start", - index: 0, - content_block: { type: "text", text: "" }, - }; - yield { - type: "content_block_delta", - index: 0, - delta: { type: "text_delta", text: "It will be sunny" }, - }; - yield { - type: "message_delta", - delta: { stop_reason: "end_turn" }, - usage: { output_tokens: 5 }, - }; - yield { - type: "message_stop", - }; - })(); - - mocks.betaMessagesCreate.mockResolvedValueOnce(mockStream); - - const providerOptions = { - container: { - id: "container-weather", - skills: [{ skill_id: "forecast", type: "custom", version: "1" }], - }, - mcp_servers: [ - { - name: "world-weather", - url: "https://mcp.example.com", - type: "url", - authorization_token: "secret", - tool_configuration: { - allowed_tools: ["lookup_weather"], - enabled: true, - }, - }, - ], - service_tier: "standard_only", - stop_sequences: [""], - thinking: { type: "enabled", budget_tokens: 1500 }, - top_k: 5, - system: "Respond with JSON", - } satisfies AnthropicProviderOptions & { system: string }; - - const adapter = createAdapter(); - - // Consume the stream to trigger the API call - const chunks: StreamChunk[] = []; - for await (const chunk of chat({ - adapter, - model: "claude-3-7-sonnet-20250219", - messages: [ - { role: "system", content: "Keep it structured" }, - { role: "user", content: "What is the forecast?" }, - { - role: "assistant", - content: "Checking", - toolCalls: [ - { - id: "call_weather", - type: "function", - function: { name: "lookup_weather", arguments: toolArguments }, - }, - ], - }, - { role: "tool", toolCallId: "call_weather", content: "{\"temp\":72}" }, - ], - tools: [weatherTool], - options: { - maxTokens: 3000, - temperature: 0.4, - topP: 0.8, - }, - providerOptions, - })) { - chunks.push(chunk); - } - - expect(mocks.betaMessagesCreate).toHaveBeenCalledTimes(1); - const [payload] = mocks.betaMessagesCreate.mock.calls[0]; - - expect(payload).toMatchObject({ - model: "claude-3-7-sonnet-20250219", - max_tokens: 3000, - temperature: 0.4, - top_p: 0.8, - container: providerOptions.container, - mcp_servers: providerOptions.mcp_servers, - service_tier: providerOptions.service_tier, - stop_sequences: providerOptions.stop_sequences, - thinking: providerOptions.thinking, - top_k: providerOptions.top_k, - system: providerOptions.system, - }); - expect(payload.stream).toBe(true); - - expect(payload.messages).toEqual([ - { - role: "user", - content: "What is the forecast?", - }, - { - role: "assistant", - content: [ - { type: "text", text: "Checking" }, - { - type: "tool_use", - id: "call_weather", - name: "lookup_weather", - input: { location: "Berlin" }, - }, - ], - }, - { - role: "user", - content: [ - { - type: "tool_result", - tool_use_id: "call_weather", - content: "{\"temp\":72}", - }, - ], - }, - ]); - - expect(payload.tools?.[0]).toMatchObject({ - name: "lookup_weather", - type: "custom", - }); - }); -}); +import { describe, it, expect, beforeEach, vi } from 'vitest' +import { chat, type Tool, type StreamChunk } from '@tanstack/ai' +import { + Anthropic, + type AnthropicProviderOptions, +} from '../src/anthropic-adapter' + +const mocks = vi.hoisted(() => { + const betaMessagesCreate = vi.fn() + const messagesCreate = vi.fn() + + const client = { + beta: { + messages: { + create: betaMessagesCreate, + }, + }, + messages: { + create: messagesCreate, + }, + } + + return { betaMessagesCreate, messagesCreate, client } +}) + +vi.mock('@anthropic-ai/sdk', () => { + const { client } = mocks + + class MockAnthropic { + beta = client.beta + messages = client.messages + + constructor(_: { apiKey: string }) {} + } + + return { default: MockAnthropic } +}) + +const createAdapter = () => new Anthropic({ apiKey: 'test-key' }) + +const toolArguments = JSON.stringify({ location: 'Berlin' }) + +const weatherTool: Tool = { + type: 'function', + function: { + name: 'lookup_weather', + description: 'Return the weather for a city', + parameters: { + type: 'object', + properties: { + location: { type: 'string' }, + }, + required: ['location'], + }, + }, +} + +describe('Anthropic adapter option mapping', () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it('maps normalized options and Anthropic provider settings', async () => { + // Mock the streaming response + const mockStream = (async function* () { + yield { + type: 'content_block_start', + index: 0, + content_block: { type: 'text', text: '' }, + } + yield { + type: 'content_block_delta', + index: 0, + delta: { type: 'text_delta', text: 'It will be sunny' }, + } + yield { + type: 'message_delta', + delta: { stop_reason: 'end_turn' }, + usage: { output_tokens: 5 }, + } + yield { + type: 'message_stop', + } + })() + + mocks.betaMessagesCreate.mockResolvedValueOnce(mockStream) + + const providerOptions = { + container: { + id: 'container-weather', + skills: [{ skill_id: 'forecast', type: 'custom', version: '1' }], + }, + mcp_servers: [ + { + name: 'world-weather', + url: 'https://mcp.example.com', + type: 'url', + authorization_token: 'secret', + tool_configuration: { + allowed_tools: ['lookup_weather'], + enabled: true, + }, + }, + ], + service_tier: 'standard_only', + stop_sequences: [''], + thinking: { type: 'enabled', budget_tokens: 1500 }, + top_k: 5, + system: 'Respond with JSON', + } satisfies AnthropicProviderOptions & { system: string } + + const adapter = createAdapter() + + // Consume the stream to trigger the API call + const chunks: StreamChunk[] = [] + for await (const chunk of chat({ + adapter, + model: 'claude-3-7-sonnet-20250219', + messages: [ + { role: 'system', content: 'Keep it structured' }, + { role: 'user', content: 'What is the forecast?' }, + { + role: 'assistant', + content: 'Checking', + toolCalls: [ + { + id: 'call_weather', + type: 'function', + function: { name: 'lookup_weather', arguments: toolArguments }, + }, + ], + }, + { role: 'tool', toolCallId: 'call_weather', content: '{"temp":72}' }, + ], + tools: [weatherTool], + options: { + maxTokens: 3000, + temperature: 0.4, + topP: 0.8, + }, + providerOptions, + })) { + chunks.push(chunk) + } + + expect(mocks.betaMessagesCreate).toHaveBeenCalledTimes(1) + const [payload] = mocks.betaMessagesCreate.mock.calls[0] + + expect(payload).toMatchObject({ + model: 'claude-3-7-sonnet-20250219', + max_tokens: 3000, + temperature: 0.4, + top_p: 0.8, + container: providerOptions.container, + mcp_servers: providerOptions.mcp_servers, + service_tier: providerOptions.service_tier, + stop_sequences: providerOptions.stop_sequences, + thinking: providerOptions.thinking, + top_k: providerOptions.top_k, + system: providerOptions.system, + }) + expect(payload.stream).toBe(true) + + expect(payload.messages).toEqual([ + { + role: 'user', + content: 'What is the forecast?', + }, + { + role: 'assistant', + content: [ + { type: 'text', text: 'Checking' }, + { + type: 'tool_use', + id: 'call_weather', + name: 'lookup_weather', + input: { location: 'Berlin' }, + }, + ], + }, + { + role: 'user', + content: [ + { + type: 'tool_result', + tool_use_id: 'call_weather', + content: '{"temp":72}', + }, + ], + }, + ]) + + expect(payload.tools?.[0]).toMatchObject({ + name: 'lookup_weather', + type: 'custom', + }) + }) +}) diff --git a/packages/typescript/ai-anthropic/tests/model-meta.test.ts b/packages/typescript/ai-anthropic/tests/model-meta.test.ts index 92571fceb..4c1f4f3e8 100644 --- a/packages/typescript/ai-anthropic/tests/model-meta.test.ts +++ b/packages/typescript/ai-anthropic/tests/model-meta.test.ts @@ -1,297 +1,466 @@ -import { describe, it, expectTypeOf } from "vitest"; -import type { - AnthropicChatModelProviderOptionsByName, -} from "../src/model-meta"; -import type { - AnthropicContainerOptions, - AnthropicContextManagementOptions, - AnthropicMCPOptions, - AnthropicServiceTierOptions, - AnthropicStopSequencesOptions, - AnthropicThinkingOptions, - AnthropicToolChoiceOptions, - AnthropicSamplingOptions, -} from "../src/text/text-provider-options"; - -/** - * Type assertion tests for Anthropic model provider options. - * - * These tests verify that: - * 1. Models with extended_thinking support have AnthropicThinkingOptions in their provider options - * 2. Models without extended_thinking support do NOT have AnthropicThinkingOptions - * 3. Models with priority_tier support have AnthropicServiceTierOptions in their provider options - * 4. Models without priority_tier support do NOT have AnthropicServiceTierOptions - * 5. All models have base options (container, context management, MCP, stop sequences, tool choice, sampling) - */ - -// Base options that ALL chat models should have -type BaseOptions = AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicStopSequencesOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions; - -describe("Anthropic Model Provider Options Type Assertions", () => { - describe("Models WITH extended_thinking support", () => { - it("claude-sonnet-4-5-20250929 should support thinking options", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-sonnet-4-5-20250929"]; - - // Should have thinking options - expectTypeOf().toExtend(); - - // Should have service tier options (priority_tier support) - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - - // Verify specific properties exist - expectTypeOf().toHaveProperty("thinking"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("top_k"); - }); - - it("claude-haiku-4-5-20251001 should support thinking options", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-haiku-4-5-20251001"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("claude-opus-4-1-20250805 should support thinking options", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-opus-4-1-20250805"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("claude-sonnet-4-20250514 should support thinking options", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-sonnet-4-20250514"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("claude-3-7-sonnet-20250219 should support thinking options", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-3-7-sonnet-20250219"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("claude-opus-4-20250514 should support thinking options", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-opus-4-20250514"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("claude-opus-4-5-20251101 should support thinking options", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-opus-4-5-20251101"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - - // Verify specific properties exist - expectTypeOf().toHaveProperty("thinking"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("top_k"); - }); - }); - - describe("Models WITHOUT extended_thinking support", () => { - it("claude-3-5-haiku-20241022 should NOT have thinking options but SHOULD have service tier", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-3-5-haiku-20241022"]; - - // Should NOT have thinking options - expectTypeOf().not.toExtend(); - - // Should have service tier options (priority_tier support) - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - - // Verify service_tier exists but thinking does not - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("top_k"); - }); - - it("claude-3-haiku-20240307 should NOT have thinking options AND NOT have service tier", () => { - type Options = AnthropicChatModelProviderOptionsByName["claude-3-haiku-20240307"]; - - // Should NOT have thinking options - expectTypeOf().not.toExtend(); - - // Should NOT have service tier options (no priority_tier support) - expectTypeOf().not.toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - - // Verify base properties exist - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("top_k"); - }); - }); - - describe("Provider options type completeness", () => { - it("AnthropicChatModelProviderOptionsByName should have entries for all chat models", () => { - type Keys = keyof AnthropicChatModelProviderOptionsByName; - - expectTypeOf<"claude-opus-4-5-20251101">().toExtend(); - expectTypeOf<"claude-sonnet-4-5-20250929">().toExtend(); - expectTypeOf<"claude-haiku-4-5-20251001">().toExtend(); - expectTypeOf<"claude-opus-4-1-20250805">().toExtend(); - expectTypeOf<"claude-sonnet-4-20250514">().toExtend(); - expectTypeOf<"claude-3-7-sonnet-20250219">().toExtend(); - expectTypeOf<"claude-opus-4-20250514">().toExtend(); - expectTypeOf<"claude-3-5-haiku-20241022">().toExtend(); - expectTypeOf<"claude-3-haiku-20240307">().toExtend(); - }); - }); - - describe("Detailed property type assertions", () => { - it("all models should have container options", () => { - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("container"); - expectTypeOf().toHaveProperty("container"); - }); - - it("all models should have context management options", () => { - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("context_management"); - expectTypeOf().toHaveProperty("context_management"); - }); - - it("all models should have MCP options", () => { - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("mcp_servers"); - expectTypeOf().toHaveProperty("mcp_servers"); - }); - - it("all models should have stop sequences options", () => { - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("stop_sequences"); - expectTypeOf().toHaveProperty("stop_sequences"); - }); - - it("all models should have tool choice options", () => { - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - }); - - it("all models should have sampling options (top_k)", () => { - expectTypeOf().toHaveProperty("top_k"); - expectTypeOf().toHaveProperty("top_k"); - expectTypeOf().toHaveProperty("top_k"); - expectTypeOf().toHaveProperty("top_k"); - expectTypeOf().toHaveProperty("top_k"); - expectTypeOf().toHaveProperty("top_k"); - expectTypeOf().toHaveProperty("top_k"); - expectTypeOf().toHaveProperty("top_k"); - expectTypeOf().toHaveProperty("top_k"); - }); - }); - - describe("Type discrimination between model categories", () => { - it("models with extended_thinking should extend AnthropicThinkingOptions", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("models without extended_thinking should NOT extend AnthropicThinkingOptions", () => { - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - }); - - it("models with priority_tier should extend AnthropicServiceTierOptions", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("models without priority_tier should NOT extend AnthropicServiceTierOptions", () => { - expectTypeOf().not.toExtend(); - }); - - it("all models should extend base options", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - }); -}); +import { describe, it, expectTypeOf } from 'vitest' +import type { AnthropicChatModelProviderOptionsByName } from '../src/model-meta' +import type { + AnthropicContainerOptions, + AnthropicContextManagementOptions, + AnthropicMCPOptions, + AnthropicServiceTierOptions, + AnthropicStopSequencesOptions, + AnthropicThinkingOptions, + AnthropicToolChoiceOptions, + AnthropicSamplingOptions, +} from '../src/text/text-provider-options' + +/** + * Type assertion tests for Anthropic model provider options. + * + * These tests verify that: + * 1. Models with extended_thinking support have AnthropicThinkingOptions in their provider options + * 2. Models without extended_thinking support do NOT have AnthropicThinkingOptions + * 3. Models with priority_tier support have AnthropicServiceTierOptions in their provider options + * 4. Models without priority_tier support do NOT have AnthropicServiceTierOptions + * 5. All models have base options (container, context management, MCP, stop sequences, tool choice, sampling) + */ + +// Base options that ALL chat models should have +type BaseOptions = AnthropicContainerOptions & + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicStopSequencesOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions + +describe('Anthropic Model Provider Options Type Assertions', () => { + describe('Models WITH extended_thinking support', () => { + it('claude-sonnet-4-5-20250929 should support thinking options', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + + // Should have thinking options + expectTypeOf().toExtend() + + // Should have service tier options (priority_tier support) + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + + // Verify specific properties exist + expectTypeOf().toHaveProperty('thinking') + expectTypeOf().toHaveProperty('service_tier') + expectTypeOf().toHaveProperty('container') + expectTypeOf().toHaveProperty('context_management') + expectTypeOf().toHaveProperty('mcp_servers') + expectTypeOf().toHaveProperty('stop_sequences') + expectTypeOf().toHaveProperty('tool_choice') + expectTypeOf().toHaveProperty('top_k') + }) + + it('claude-haiku-4-5-20251001 should support thinking options', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('claude-opus-4-1-20250805 should support thinking options', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('claude-sonnet-4-20250514 should support thinking options', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('claude-3-7-sonnet-20250219 should support thinking options', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('claude-opus-4-20250514 should support thinking options', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('claude-opus-4-5-20251101 should support thinking options', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + + // Verify specific properties exist + expectTypeOf().toHaveProperty('thinking') + expectTypeOf().toHaveProperty('service_tier') + expectTypeOf().toHaveProperty('container') + expectTypeOf().toHaveProperty('context_management') + expectTypeOf().toHaveProperty('mcp_servers') + expectTypeOf().toHaveProperty('stop_sequences') + expectTypeOf().toHaveProperty('tool_choice') + expectTypeOf().toHaveProperty('top_k') + }) + }) + + describe('Models WITHOUT extended_thinking support', () => { + it('claude-3-5-haiku-20241022 should NOT have thinking options but SHOULD have service tier', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + + // Should NOT have thinking options + expectTypeOf().not.toExtend() + + // Should have service tier options (priority_tier support) + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + + // Verify service_tier exists but thinking does not + expectTypeOf().toHaveProperty('service_tier') + expectTypeOf().toHaveProperty('container') + expectTypeOf().toHaveProperty('context_management') + expectTypeOf().toHaveProperty('mcp_servers') + expectTypeOf().toHaveProperty('stop_sequences') + expectTypeOf().toHaveProperty('tool_choice') + expectTypeOf().toHaveProperty('top_k') + }) + + it('claude-3-haiku-20240307 should NOT have thinking options AND NOT have service tier', () => { + type Options = + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + + // Should NOT have thinking options + expectTypeOf().not.toExtend() + + // Should NOT have service tier options (no priority_tier support) + expectTypeOf().not.toExtend() + + // Should have base options + expectTypeOf().toExtend() + + // Verify base properties exist + expectTypeOf().toHaveProperty('container') + expectTypeOf().toHaveProperty('context_management') + expectTypeOf().toHaveProperty('mcp_servers') + expectTypeOf().toHaveProperty('stop_sequences') + expectTypeOf().toHaveProperty('tool_choice') + expectTypeOf().toHaveProperty('top_k') + }) + }) + + describe('Provider options type completeness', () => { + it('AnthropicChatModelProviderOptionsByName should have entries for all chat models', () => { + type Keys = keyof AnthropicChatModelProviderOptionsByName + + expectTypeOf<'claude-opus-4-5-20251101'>().toExtend() + expectTypeOf<'claude-sonnet-4-5-20250929'>().toExtend() + expectTypeOf<'claude-haiku-4-5-20251001'>().toExtend() + expectTypeOf<'claude-opus-4-1-20250805'>().toExtend() + expectTypeOf<'claude-sonnet-4-20250514'>().toExtend() + expectTypeOf<'claude-3-7-sonnet-20250219'>().toExtend() + expectTypeOf<'claude-opus-4-20250514'>().toExtend() + expectTypeOf<'claude-3-5-haiku-20241022'>().toExtend() + expectTypeOf<'claude-3-haiku-20240307'>().toExtend() + }) + }) + + describe('Detailed property type assertions', () => { + it('all models should have container options', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toHaveProperty('container') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toHaveProperty('container') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toHaveProperty('container') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toHaveProperty('container') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toHaveProperty('container') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toHaveProperty('container') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toHaveProperty('container') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().toHaveProperty('container') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().toHaveProperty('container') + }) + + it('all models should have context management options', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toHaveProperty('context_management') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toHaveProperty('context_management') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toHaveProperty('context_management') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toHaveProperty('context_management') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toHaveProperty('context_management') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toHaveProperty('context_management') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toHaveProperty('context_management') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().toHaveProperty('context_management') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().toHaveProperty('context_management') + }) + + it('all models should have MCP options', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toHaveProperty('mcp_servers') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toHaveProperty('mcp_servers') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toHaveProperty('mcp_servers') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toHaveProperty('mcp_servers') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toHaveProperty('mcp_servers') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toHaveProperty('mcp_servers') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toHaveProperty('mcp_servers') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().toHaveProperty('mcp_servers') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().toHaveProperty('mcp_servers') + }) + + it('all models should have stop sequences options', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toHaveProperty('stop_sequences') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toHaveProperty('stop_sequences') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toHaveProperty('stop_sequences') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toHaveProperty('stop_sequences') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toHaveProperty('stop_sequences') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toHaveProperty('stop_sequences') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toHaveProperty('stop_sequences') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().toHaveProperty('stop_sequences') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().toHaveProperty('stop_sequences') + }) + + it('all models should have tool choice options', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toHaveProperty('tool_choice') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toHaveProperty('tool_choice') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toHaveProperty('tool_choice') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toHaveProperty('tool_choice') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toHaveProperty('tool_choice') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toHaveProperty('tool_choice') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toHaveProperty('tool_choice') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().toHaveProperty('tool_choice') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().toHaveProperty('tool_choice') + }) + + it('all models should have sampling options (top_k)', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toHaveProperty('top_k') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toHaveProperty('top_k') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toHaveProperty('top_k') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toHaveProperty('top_k') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toHaveProperty('top_k') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toHaveProperty('top_k') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toHaveProperty('top_k') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().toHaveProperty('top_k') + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().toHaveProperty('top_k') + }) + }) + + describe('Type discrimination between model categories', () => { + it('models with extended_thinking should extend AnthropicThinkingOptions', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toExtend() + }) + + it('models without extended_thinking should NOT extend AnthropicThinkingOptions', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().not.toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().not.toExtend() + }) + + it('models with priority_tier should extend AnthropicServiceTierOptions', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().toExtend() + }) + + it('models without priority_tier should NOT extend AnthropicServiceTierOptions', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().not.toExtend() + }) + + it('all models should extend base options', () => { + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-5-20251101'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-5-20250929'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-haiku-4-5-20251001'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-1-20250805'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-sonnet-4-20250514'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-7-sonnet-20250219'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-opus-4-20250514'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-5-haiku-20241022'] + >().toExtend() + expectTypeOf< + AnthropicChatModelProviderOptionsByName['claude-3-haiku-20240307'] + >().toExtend() + }) + }) +}) diff --git a/packages/typescript/ai-anthropic/tsconfig.json b/packages/typescript/ai-anthropic/tsconfig.json index e34123465..eabeb01ea 100644 --- a/packages/typescript/ai-anthropic/tsconfig.json +++ b/packages/typescript/ai-anthropic/tsconfig.json @@ -1,9 +1,8 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "outDir": "dist", - "rootDir": "src" + "outDir": "dist" }, - "include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "vite.config.ts"], - "exclude": ["node_modules", "dist", "**/*.config.ts", "eslint.config.js"] + "include": ["vite.config.ts", "eslint.config.js", "./src"], + "exclude": ["node_modules", "dist", "**/*.config.ts"] } diff --git a/packages/typescript/ai-client/ARCHITECTURE.md b/packages/typescript/ai-client/ARCHITECTURE.md index dc96f2eb3..1a0e48eb8 100644 --- a/packages/typescript/ai-client/ARCHITECTURE.md +++ b/packages/typescript/ai-client/ARCHITECTURE.md @@ -73,12 +73,13 @@ interface ConnectionAdapter { connect( messages: UIMessage[] | ModelMessage[], data?: Record, - abortSignal?: AbortSignal - ): AsyncIterable; + abortSignal?: AbortSignal, + ): AsyncIterable } ``` This design works with: + - Async generators - Any object with `[Symbol.asyncIterator]` - Fetch API Response bodies (via connection adapters) @@ -266,8 +267,8 @@ interface ConnectionAdapter { connect( messages: any[], data?: Record, - abortSignal?: AbortSignal // Abort signal from ChatClient for cancellation - ): AsyncIterable; + abortSignal?: AbortSignal, // Abort signal from ChatClient for cancellation + ): AsyncIterable } ``` @@ -417,16 +418,16 @@ class MyParser implements StreamParser { function createWebSocketAdapter(url: string): ConnectionAdapter { return { async *connect(messages, data, abortSignal) { - const ws = new WebSocket(url); - + const ws = new WebSocket(url) + if (abortSignal) { - abortSignal.addEventListener("abort", () => ws.close()); + abortSignal.addEventListener('abort', () => ws.close()) } - + // Yield chunks as they arrive // ... }, - }; + } } ``` @@ -435,13 +436,23 @@ function createWebSocketAdapter(url: string): ConnectionAdapter { ```typescript const processor = new StreamProcessor({ handlers: { - onTextUpdate: (content) => { /* ... */ }, - onToolCallStart: (idx, id, name) => { /* ... */ }, - onToolCallDelta: (idx, args) => { /* ... */ }, - onToolCallComplete: (idx, id, name, args) => { /* ... */ }, - onStreamEnd: (content, toolCalls) => { /* ... */ }, + onTextUpdate: (content) => { + /* ... */ + }, + onToolCallStart: (idx, id, name) => { + /* ... */ + }, + onToolCallDelta: (idx, args) => { + /* ... */ + }, + onToolCallComplete: (idx, id, name, args) => { + /* ... */ + }, + onStreamEnd: (content, toolCalls) => { + /* ... */ + }, }, -}); +}) ``` ## Performance Considerations @@ -578,4 +589,3 @@ StreamParser catches ✅ **Performance** - Efficient state management and updates ✅ **Type Safety** - Full TypeScript support ✅ **Developer Experience** - Simple by default, powerful when needed - diff --git a/packages/typescript/ai-client/README.md b/packages/typescript/ai-client/README.md index ebcc41dc7..ab8af8b67 100644 --- a/packages/typescript/ai-client/README.md +++ b/packages/typescript/ai-client/README.md @@ -26,42 +26,42 @@ yarn add @tanstack/ai-client ## Basic Usage ```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' // Create a client instance const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), onMessagesChange: (messages) => { - console.log("Messages updated:", messages); + console.log('Messages updated:', messages) }, onLoadingChange: (isLoading) => { - console.log("Loading state:", isLoading); + console.log('Loading state:', isLoading) }, onErrorChange: (error) => { - console.log("Error:", error); + console.log('Error:', error) }, -}); +}) // Send a message -await client.sendMessage("Hello, AI!"); +await client.sendMessage('Hello, AI!') // Get current messages -const messages = client.getMessages(); +const messages = client.getMessages() // Append a message manually await client.append({ - role: "user", - content: "Another message", -}); + role: 'user', + content: 'Another message', +}) // Reload the last response -await client.reload(); +await client.reload() // Stop the current response -client.stop(); +client.stop() // Clear all messages -client.clear(); +client.clear() ``` ## Connection Adapters @@ -73,24 +73,25 @@ Connection adapters provide a flexible way to connect to different types of stre For Server-Sent Events (SSE) format - the standard for HTTP streaming: ```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat", { + connection: fetchServerSentEvents('/api/chat', { headers: { - "Authorization": "Bearer token", - "X-Custom-Header": "value" + Authorization: 'Bearer token', + 'X-Custom-Header': 'value', }, - credentials: "include", // "omit" | "same-origin" | "include" + credentials: 'include', // "omit" | "same-origin" | "include" }), -}); +}) -await client.sendMessage("Hello!"); +await client.sendMessage('Hello!') ``` **Use when:** Your backend uses `toStreamResponse()` from `@tanstack/ai` **Format expected:** Server-Sent Events with `data:` prefix + ``` data: {"type":"content","delta":"Hello","content":"Hello",...} data: {"type":"content","delta":" world","content":"Hello world",...} @@ -103,20 +104,21 @@ data: [DONE] For raw HTTP streaming with newline-delimited JSON: ```typescript -import { ChatClient, fetchHttpStream } from "@tanstack/ai-client"; +import { ChatClient, fetchHttpStream } from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchHttpStream("/api/chat", { - headers: { "Authorization": "Bearer token" } + connection: fetchHttpStream('/api/chat', { + headers: { Authorization: 'Bearer token' }, }), -}); +}) -await client.sendMessage("Hello!"); +await client.sendMessage('Hello!') ``` **Use when:** Your backend streams newline-delimited JSON directly **Format expected:** Newline-delimited JSON + ``` {"type":"content","delta":"Hello","content":"Hello",...} {"type":"content","delta":" world","content":"Hello world",...} @@ -128,30 +130,32 @@ await client.sendMessage("Hello!"); For direct async iterables - use with server functions or in-memory streams: ```typescript -import { ChatClient, stream } from "@tanstack/ai-client"; -import { chat } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; +import { ChatClient, stream } from '@tanstack/ai-client' +import { chat } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' const client = new ChatClient({ connection: stream((messages, data) => { // Return an async iterable directly return chat({ adapter: openai(), - model: "gpt-4o", + model: 'gpt-4o', messages, - }); + }) }), -}); +}) -await client.sendMessage("Hello!"); +await client.sendMessage('Hello!') ``` **Use when:** + - TanStack Start server functions - Direct access to streaming functions - Testing with mock streams **Benefits:** + - ✅ No HTTP overhead - ✅ Perfect for server components - ✅ Easy to test with mocks @@ -161,48 +165,48 @@ await client.sendMessage("Hello!"); You can create custom connection adapters for special scenarios: ```typescript -import type { ConnectionAdapter } from "@tanstack/ai-client"; +import type { ConnectionAdapter } from '@tanstack/ai-client' // Example: WebSocket connection adapter function createWebSocketAdapter(url: string): ConnectionAdapter { return { async *connect(messages, data, abortSignal) { - const ws = new WebSocket(url); - + const ws = new WebSocket(url) + // Handle abort signal if (abortSignal) { - abortSignal.addEventListener("abort", () => { - ws.close(); - }); + abortSignal.addEventListener('abort', () => { + ws.close() + }) } - + return new Promise((resolve, reject) => { ws.onopen = () => { - ws.send(JSON.stringify({ messages, data })); - }; - + ws.send(JSON.stringify({ messages, data })) + } + ws.onmessage = (event) => { // Check if aborted before processing if (abortSignal?.aborted) { - ws.close(); - return; + ws.close() + return } - - const chunk = JSON.parse(event.data); + + const chunk = JSON.parse(event.data) // Yield chunks as they arrive - }; - - ws.onerror = (error) => reject(error); - ws.onclose = () => resolve(); - }); + } + + ws.onerror = (error) => reject(error) + ws.onclose = () => resolve() + }) }, - }; + } } // Use it const client = new ChatClient({ - connection: createWebSocketAdapter("wss://api.example.com/chat"), -}); + connection: createWebSocketAdapter('wss://api.example.com/chat'), +}) ``` ## Stream Processor @@ -214,16 +218,16 @@ The stream processor provides configurable text chunking strategies to control U By default, `ChatClient` uses immediate chunking (every chunk updates the UI): ```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), onMessagesChange: (messages) => { - console.log("Messages updated:", messages); + console.log('Messages updated:', messages) }, -}); +}) -await client.sendMessage("Hello!"); +await client.sendMessage('Hello!') ``` ### Using Chunk Strategies @@ -237,19 +241,19 @@ import { ChatClient, fetchServerSentEvents, PunctuationStrategy, -} from "@tanstack/ai-client"; +} from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), streamProcessor: { chunkStrategy: new PunctuationStrategy(), }, onMessagesChange: (messages) => { - console.log("Messages updated:", messages); + console.log('Messages updated:', messages) }, -}); +}) -await client.sendMessage("Tell me a story."); +await client.sendMessage('Tell me a story.') ``` #### Batch Strategy @@ -261,19 +265,19 @@ import { ChatClient, fetchServerSentEvents, BatchStrategy, -} from "@tanstack/ai-client"; +} from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), streamProcessor: { chunkStrategy: new BatchStrategy(10), // Update every 10 chunks }, onMessagesChange: (messages) => { - console.log("Messages updated:", messages); + console.log('Messages updated:', messages) }, -}); +}) -await client.sendMessage("Explain quantum physics."); +await client.sendMessage('Explain quantum physics.') ``` #### Combining Strategies @@ -287,10 +291,10 @@ import { CompositeStrategy, PunctuationStrategy, BatchStrategy, -} from "@tanstack/ai-client"; +} from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), streamProcessor: { chunkStrategy: new CompositeStrategy([ new PunctuationStrategy(), // Update on punctuation @@ -298,9 +302,9 @@ const client = new ChatClient({ ]), }, onMessagesChange: (messages) => { - console.log("Messages updated:", messages); + console.log('Messages updated:', messages) }, -}); +}) ``` #### Custom Chunk Strategy @@ -312,74 +316,74 @@ import { ChatClient, fetchServerSentEvents, type ChunkStrategy, -} from "@tanstack/ai-client"; +} from '@tanstack/ai-client' class CustomStrategy implements ChunkStrategy { - private wordCount = 0; + private wordCount = 0 shouldEmit(chunk: string, accumulated: string): boolean { // Count words in the chunk - const words = chunk.split(/\s+/).filter((w) => w.length > 0); - this.wordCount += words.length; + const words = chunk.split(/\s+/).filter((w) => w.length > 0) + this.wordCount += words.length // Emit every 5 words if (this.wordCount >= 5) { - this.wordCount = 0; - return true; + this.wordCount = 0 + return true } - return false; + return false } reset(): void { - this.wordCount = 0; + this.wordCount = 0 } } const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), streamProcessor: { chunkStrategy: new CustomStrategy(), }, onMessagesChange: (messages) => { - console.log("Messages updated:", messages); + console.log('Messages updated:', messages) }, -}); +}) ``` ### Built-in Strategies -| Strategy | When it Emits | Best For | -| ------------------------ | ----------------------------------------- | ---------------------------- | -| `ImmediateStrategy` | Every chunk | Default, real-time feel | -| `PunctuationStrategy` | When chunk contains `. , ! ? ; :` | Natural reading flow | -| `BatchStrategy(N)` | Every N chunks | Reducing update frequency | -| `WordBoundaryStrategy` | When chunk ends with whitespace | Preventing word cuts | -| `DebounceStrategy(ms)` | After ms of silence | High-frequency streams | -| `CompositeStrategy([])` | When ANY sub-strategy emits (OR) | Combining multiple rules | -| Custom `ChunkStrategy` | Your custom `shouldEmit()` logic | Fine-grained control | +| Strategy | When it Emits | Best For | +| ----------------------- | --------------------------------- | ------------------------- | +| `ImmediateStrategy` | Every chunk | Default, real-time feel | +| `PunctuationStrategy` | When chunk contains `. , ! ? ; :` | Natural reading flow | +| `BatchStrategy(N)` | Every N chunks | Reducing update frequency | +| `WordBoundaryStrategy` | When chunk ends with whitespace | Preventing word cuts | +| `DebounceStrategy(ms)` | After ms of silence | High-frequency streams | +| `CompositeStrategy([])` | When ANY sub-strategy emits (OR) | Combining multiple rules | +| Custom `ChunkStrategy` | Your custom `shouldEmit()` logic | Fine-grained control | ### Parallel Tool Calls The stream processor automatically handles multiple parallel tool calls: ```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' const client = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), streamProcessor: { // Use any chunk strategy }, onMessagesChange: (messages) => { - const lastMessage = messages[messages.length - 1]; + const lastMessage = messages[messages.length - 1] if (lastMessage.toolCalls) { - console.log("Tool calls in progress:", lastMessage.toolCalls); + console.log('Tool calls in progress:', lastMessage.toolCalls) // Can have multiple tool calls streaming simultaneously! } }, -}); +}) -await client.sendMessage("Get weather in Paris and Tokyo"); +await client.sendMessage('Get weather in Paris and Tokyo') ``` ### Custom Stream Parser @@ -392,7 +396,7 @@ import { stream, type StreamParser, type StreamChunk, -} from "@tanstack/ai-client"; +} from '@tanstack/ai-client' class CustomParser implements StreamParser { async *parse(source: AsyncIterable): AsyncIterable { @@ -400,14 +404,14 @@ class CustomParser implements StreamParser { // Custom parsing logic for your stream format if (chunk.message) { yield { - type: "text", + type: 'text', content: chunk.message, - }; + } } if (chunk.tool) { yield { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: chunk.tool.index, toolCall: { id: chunk.tool.id, @@ -416,7 +420,7 @@ class CustomParser implements StreamParser { arguments: chunk.tool.args, }, }, - }; + } } } } @@ -425,15 +429,15 @@ class CustomParser implements StreamParser { const client = new ChatClient({ connection: stream(async (messages) => { // Your custom stream source - return customStreamGenerator(messages); + return customStreamGenerator(messages) }), streamProcessor: { parser: new CustomParser(), }, onMessagesChange: (messages) => { - console.log("Messages updated:", messages); + console.log('Messages updated:', messages) }, -}); +}) ``` ## Working with Streams Directly @@ -441,20 +445,20 @@ const client = new ChatClient({ Connection adapters return async iterables of `StreamChunk` objects, which you can iterate over directly if needed: ```typescript -import type { StreamChunk } from '@tanstack/ai'; -import { fetchServerSentEvents } from '@tanstack/ai-client'; +import type { StreamChunk } from '@tanstack/ai' +import { fetchServerSentEvents } from '@tanstack/ai-client' -const connection = fetchServerSentEvents('/api/chat'); +const connection = fetchServerSentEvents('/api/chat') // Get the stream directly -const stream = connection.connect(messages, data); +const stream = connection.connect(messages, data) // Iterate over chunks for await (const chunk of stream) { if (chunk.type === 'content') { - console.log('Content:', chunk.content); + console.log('Content:', chunk.content) } else if (chunk.type === 'tool_call') { - console.log('Tool call:', chunk.toolCall); + console.log('Tool call:', chunk.toolCall) } } ``` @@ -464,80 +468,80 @@ for await (const chunk of stream) { You can create custom connection adapters for any transport protocol. Here's a WebSocket example: ```typescript -import type { ConnectionAdapter, StreamChunk } from '@tanstack/ai-client'; +import type { ConnectionAdapter, StreamChunk } from '@tanstack/ai-client' function createWebSocketAdapter(url: string): ConnectionAdapter { return { async *connect(messages, data, abortSignal) { - const ws = new WebSocket(url); - + const ws = new WebSocket(url) + // Handle abort signal if (abortSignal) { - abortSignal.addEventListener("abort", () => { - ws.close(); - }); + abortSignal.addEventListener('abort', () => { + ws.close() + }) } - + // Wait for connection await new Promise((resolve, reject) => { - ws.onopen = resolve; - ws.onerror = reject; - }); - + ws.onopen = resolve + ws.onerror = reject + }) + // Send messages - ws.send(JSON.stringify({ messages, data })); - + ws.send(JSON.stringify({ messages, data })) + // Yield chunks as they arrive - const queue: StreamChunk[] = []; - let resolver: ((chunk: StreamChunk | null) => void) | null = null; + const queue: StreamChunk[] = [] + let resolver: ((chunk: StreamChunk | null) => void) | null = null ws.onmessage = (event) => { try { - const chunk: StreamChunk = JSON.parse(event.data); + const chunk: StreamChunk = JSON.parse(event.data) if (abortSignal?.aborted) { - ws.close(); - return; + ws.close() + return } if (resolver) { - resolver(chunk); - resolver = null; + resolver(chunk) + resolver = null } else { - queue.push(chunk); + queue.push(chunk) } } catch (error) { - console.error('Failed to parse WebSocket message:', error); + console.error('Failed to parse WebSocket message:', error) } - }; + } ws.onclose = () => { if (resolver) { - resolver(null); + resolver(null) } - }; + } try { while (true) { if (queue.length > 0) { - yield queue.shift()!; + yield queue.shift()! } else { const chunk = await new Promise((resolve) => { - resolver = resolve; - }); - if (chunk === null) break; - yield chunk; + resolver = resolve + }) + if (chunk === null) break + yield chunk } } } finally { - ws.close(); + ws.close() } }, - }; + } } // Use it const client = new ChatClient({ - connection: createWebSocketAdapter("wss://api.example.com/chat"), -}); + connection: createWebSocketAdapter('wss://api.example.com/chat'), +}) ``` ## API Reference @@ -551,35 +555,35 @@ The main class for managing chat interactions. ```typescript interface ChatClientOptions { // Connection adapter (required) - connection: ConnectionAdapter; + connection: ConnectionAdapter // Initial messages - initialMessages?: UIMessage[]; + initialMessages?: UIMessage[] // Unique chat identifier - id?: string; + id?: string // Callbacks - onResponse?: (response: Response) => void | Promise; - onChunk?: (chunk: StreamChunk) => void; - onFinish?: (message: UIMessage) => void; - onError?: (error: Error) => void; - onMessagesChange?: (messages: UIMessage[]) => void; - onLoadingChange?: (isLoading: boolean) => void; - onErrorChange?: (error: Error | undefined) => void; + onResponse?: (response: Response) => void | Promise + onChunk?: (chunk: StreamChunk) => void + onFinish?: (message: UIMessage) => void + onError?: (error: Error) => void + onMessagesChange?: (messages: UIMessage[]) => void + onLoadingChange?: (isLoading: boolean) => void + onErrorChange?: (error: Error | undefined) => void // Stream processor configuration streamProcessor?: { - chunkStrategy?: ChunkStrategy; - parser?: StreamParser; - }; + chunkStrategy?: ChunkStrategy + parser?: StreamParser + } // Request configuration (for legacy api option) - api?: string; - headers?: Record | Headers; - body?: Record; - credentials?: "omit" | "same-origin" | "include"; - fetch?: typeof fetch; + api?: string + headers?: Record | Headers + body?: Record + credentials?: 'omit' | 'same-origin' | 'include' + fetch?: typeof fetch } ``` @@ -602,29 +606,29 @@ This package is used by framework-specific packages like `@tanstack/ai-react`, w ### Example: Custom React Hook ```typescript -import { ChatClient, fetchServerSentEvents } from "@tanstack/ai-client"; -import { useState, useRef, useCallback } from "react"; +import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' +import { useState, useRef, useCallback } from 'react' function useCustomChat(options) { - const [messages, setMessages] = useState([]); - const [isLoading, setIsLoading] = useState(false); + const [messages, setMessages] = useState([]) + const [isLoading, setIsLoading] = useState(false) - const clientRef = useRef(null); + const clientRef = useRef(null) if (!clientRef.current) { clientRef.current = new ChatClient({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), ...options, onMessagesChange: setMessages, onLoadingChange: setIsLoading, - }); + }) } const sendMessage = useCallback((content) => { - return clientRef.current.sendMessage(content); - }, []); + return clientRef.current.sendMessage(content) + }, []) - return { messages, isLoading, sendMessage }; + return { messages, isLoading, sendMessage } } ``` @@ -641,7 +645,7 @@ function ChatSSE() { const chat = useChat({ connection: fetchServerSentEvents("/api/chat"), }); - + return ; } @@ -650,7 +654,7 @@ function ChatHTTP() { const chat = useChat({ connection: fetchHttpStream("/api/chat"), }); - + return ; } @@ -659,7 +663,7 @@ function ChatDirect() { const chat = useChat({ connection: stream((messages) => myServerFunction({ messages })), }); - + return ; } ``` @@ -669,23 +673,23 @@ function ChatDirect() { Your backend should use `@tanstack/ai`'s `chat()` method with automatic tool execution: ```typescript -import { chat, toStreamResponse } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; +import { chat, toStreamResponse } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' export async function POST(request: Request) { - const { messages } = await request.json(); + const { messages } = await request.json() // chat() automatically executes tools in a loop const stream = chat({ adapter: openai(), - model: "gpt-4o", + model: 'gpt-4o', messages, tools: [weatherTool], // Tools are auto-executed when called agentLoopStrategy: maxIterations(5), // Control loop behavior - }); + }) // Stream includes tool_call and tool_result chunks - return toStreamResponse(stream); + return toStreamResponse(stream) } ``` diff --git a/packages/typescript/ai-client/package.json b/packages/typescript/ai-client/package.json index 9756c3235..aaade9d65 100644 --- a/packages/typescript/ai-client/package.json +++ b/packages/typescript/ai-client/package.json @@ -18,12 +18,12 @@ "streaming" ], "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" } }, "files": [ @@ -43,6 +43,5 @@ "dependencies": { "@tanstack/ai": "workspace:*", "partial-json": "^0.1.7" - }, - "devDependencies": {} + } } diff --git a/packages/typescript/ai-client/src/chat-client.ts b/packages/typescript/ai-client/src/chat-client.ts index 0eca7ee83..2a06c8b55 100644 --- a/packages/typescript/ai-client/src/chat-client.ts +++ b/packages/typescript/ai-client/src/chat-client.ts @@ -1,63 +1,61 @@ -import type { ModelMessage } from "@tanstack/ai"; -import type { UIMessage, ToolCallPart, ChatClientOptions } from "./types"; -import type { ConnectionAdapter } from "./connection-adapters"; -import { StreamProcessor } from "./stream/processor"; -import type { ChunkStrategy, StreamParser } from "./stream/types"; +import { StreamProcessor } from './stream/processor' import { - uiMessageToModelMessages, normalizeToUIMessage, -} from "./message-converters"; + uiMessageToModelMessages, +} from './message-converters' import { updateTextPart, - updateToolCallPart, - updateToolResultPart, + updateThinkingPart, updateToolCallApproval, + updateToolCallApprovalResponse, + updateToolCallPart, updateToolCallState, updateToolCallWithOutput, - updateToolCallApprovalResponse, - updateThinkingPart, -} from "./message-updaters"; -import { - ChatClientEventEmitter, - DefaultChatClientEventEmitter, -} from "./events"; + updateToolResultPart, +} from './message-updaters' +import { DefaultChatClientEventEmitter } from './events' +import type { ModelMessage } from '@tanstack/ai' +import type { ChatClientOptions, ToolCallPart, UIMessage } from './types' +import type { ConnectionAdapter } from './connection-adapters' +import type { ChunkStrategy, StreamParser } from './stream/types' +import type { ChatClientEventEmitter } from './events' export class ChatClient { - private messages: UIMessage[] = []; - private isLoading: boolean = false; - private error: Error | undefined = undefined; - private connection: ConnectionAdapter; - private uniqueId: string; - private body?: Record; + private messages: Array = [] + private isLoading = false + private error: Error | undefined = undefined + private connection: ConnectionAdapter + private uniqueId: string + private body?: Record private streamProcessorConfig?: { - chunkStrategy?: ChunkStrategy; - parser?: StreamParser; - }; - private abortController: AbortController | null = null; - private events: ChatClientEventEmitter; + chunkStrategy?: ChunkStrategy + parser?: StreamParser + } + private abortController: AbortController | null = null + private events: ChatClientEventEmitter private callbacks: { - onResponse: (response?: Response) => void | Promise; - onChunk: (chunk: any) => void; - onFinish: (message: UIMessage) => void; - onError: (error: Error) => void; - onMessagesChange: (messages: UIMessage[]) => void; - onLoadingChange: (isLoading: boolean) => void; - onErrorChange: (error: Error | undefined) => void; + onResponse: (response?: Response) => void | Promise + onChunk: (chunk: any) => void + onFinish: (message: UIMessage) => void + onError: (error: Error) => void + onMessagesChange: (messages: Array) => void + onLoadingChange: (isLoading: boolean) => void + onErrorChange: (error: Error | undefined) => void onToolCall?: (args: { - toolCallId: string; - toolName: string; - input: any; - }) => Promise; - }; + toolCallId: string + toolName: string + input: any + }) => Promise + } constructor(options: ChatClientOptions) { - this.uniqueId = options.id || this.generateUniqueId("chat"); - this.messages = options.initialMessages || []; - this.body = options.body; - this.connection = options.connection; - this.streamProcessorConfig = options.streamProcessor || {}; - this.events = new DefaultChatClientEventEmitter(this.uniqueId); + this.uniqueId = options.id || this.generateUniqueId('chat') + this.messages = options.initialMessages || [] + this.body = options.body + this.connection = options.connection + this.streamProcessorConfig = options.streamProcessor || {} + this.events = new DefaultChatClientEventEmitter(this.uniqueId) this.callbacks = { onResponse: options.onResponse || (() => {}), @@ -68,50 +66,50 @@ export class ChatClient { onLoadingChange: options.onLoadingChange || (() => {}), onErrorChange: options.onErrorChange || (() => {}), onToolCall: options.onToolCall, - }; + } - this.events.clientCreated(this.messages.length); + this.events.clientCreated(this.messages.length) } private generateUniqueId(prefix: string): string { - return `${prefix}-${Date.now()}-${Math.random().toString(36).substring(7)}`; + return `${prefix}-${Date.now()}-${Math.random().toString(36).substring(7)}` } private generateMessageId(): string { - return this.generateUniqueId(this.uniqueId); + return this.generateUniqueId(this.uniqueId) } - private setMessages(messages: UIMessage[]): void { - this.messages = messages; - this.callbacks.onMessagesChange(messages); + private setMessages(messages: Array): void { + this.messages = messages + this.callbacks.onMessagesChange(messages) } private setIsLoading(isLoading: boolean): void { - this.isLoading = isLoading; - this.callbacks.onLoadingChange(isLoading); - this.events.loadingChanged(isLoading); + this.isLoading = isLoading + this.callbacks.onLoadingChange(isLoading) + this.events.loadingChanged(isLoading) } private setError(error: Error | undefined): void { - this.error = error; - this.callbacks.onErrorChange(error); - this.events.errorChanged(error?.message || null); + this.error = error + this.callbacks.onErrorChange(error) + this.events.errorChanged(error?.message || null) } private async processStream(source: AsyncIterable): Promise { - const assistantMessageId = this.generateMessageId(); + const assistantMessageId = this.generateMessageId() const assistantMessage: UIMessage = { id: assistantMessageId, - role: "assistant", + role: 'assistant', parts: [], createdAt: new Date(), - }; + } // Add the assistant message placeholder - this.setMessages([...this.messages, assistantMessage]); + this.setMessages([...this.messages, assistantMessage]) // Always use the new StreamProcessor - return this.processStreamWithProcessor(source, assistantMessageId); + return this.processStreamWithProcessor(source, assistantMessageId) } /** @@ -119,21 +117,21 @@ export class ChatClient { */ private async processStreamWithProcessor( source: AsyncIterable, - assistantMessageId: string + assistantMessageId: string, ): Promise { // Collect raw chunks for debugging - const rawChunks: any[] = []; - const streamId = this.generateUniqueId("stream"); + const rawChunks: Array = [] + const streamId = this.generateUniqueId('stream') const processor = new StreamProcessor({ chunkStrategy: this.streamProcessorConfig?.chunkStrategy, parser: this.streamProcessorConfig?.parser, handlers: { onTextUpdate: (content) => { - this.events.textUpdated(streamId, assistantMessageId, content); + this.events.textUpdated(streamId, assistantMessageId, content) this.setMessages( - updateTextPart(this.messages, assistantMessageId, content) - ); + updateTextPart(this.messages, assistantMessageId, content), + ) }, onToolCallStateChange: (_index, id, name, state, args) => { this.events.toolCallStateChanged( @@ -142,8 +140,8 @@ export class ChatClient { id, name, state, - args - ); + args, + ) // Update or create tool call part with state this.setMessages( @@ -152,8 +150,8 @@ export class ChatClient { name, arguments: args, state, - }) - ); + }), + ) }, onToolResultStateChange: (toolCallId, content, state, error) => { this.events.toolResultStateChanged( @@ -161,8 +159,8 @@ export class ChatClient { toolCallId, content, state, - error - ); + error, + ) // Update or create tool result part this.setMessages( @@ -172,23 +170,18 @@ export class ChatClient { toolCallId, content, state, - error - ) - ); + error, + ), + ) }, - onApprovalRequested: async ( - toolCallId, - toolName, - input, - approvalId - ) => { + onApprovalRequested: (toolCallId, toolName, input, approvalId) => { this.events.approvalRequested( assistantMessageId, toolCallId, toolName, input, - approvalId - ); + approvalId, + ) // Update tool call part to show it needs approval this.setMessages( @@ -196,9 +189,9 @@ export class ChatClient { this.messages, assistantMessageId, toolCallId, - approvalId - ) - ); + approvalId, + ), + ) }, onToolInputAvailable: async (toolCallId, toolName, input) => { // If onToolCall callback exists, execute immediately @@ -208,23 +201,23 @@ export class ChatClient { toolCallId, toolName, input, - }); + }) // Add result and trigger auto-send await this.addToolResult({ toolCallId, tool: toolName, output, - state: "output-available", - }); + state: 'output-available', + }) } catch (error: any) { await this.addToolResult({ toolCallId, tool: toolName, output: null, - state: "output-error", + state: 'output-error', errorText: error.message, - }); + }) } } else { // No callback - just mark as input-complete (UI should handle) @@ -233,170 +226,170 @@ export class ChatClient { this.messages, assistantMessageId, toolCallId, - "input-complete" - ) - ); + 'input-complete', + ), + ) } }, onThinkingUpdate: (content) => { - this.events.textUpdated(streamId, assistantMessageId, content); + this.events.textUpdated(streamId, assistantMessageId, content) this.setMessages( - updateThinkingPart(this.messages, assistantMessageId, content) - ); + updateThinkingPart(this.messages, assistantMessageId, content), + ) }, onStreamEnd: () => { // Stream finished - parts are already updated }, }, - }); + }) // Wrap source to collect raw chunks const wrappedSource = async function* (this: ChatClient) { for await (const chunk of source) { - rawChunks.push(chunk); - this.callbacks.onChunk(chunk); - yield chunk; + rawChunks.push(chunk) + this.callbacks.onChunk(chunk) + yield chunk } - }.call(this); + }.call(this) - await processor.process(wrappedSource); + await processor.process(wrappedSource) const finalMessage = this.messages.find( - (msg) => msg.id === assistantMessageId - ); + (msg) => msg.id === assistantMessageId, + ) return ( finalMessage || { id: assistantMessageId, - role: "assistant", + role: 'assistant', parts: [], createdAt: new Date(), } - ); + ) } async append(message: UIMessage | ModelMessage): Promise { // Normalize message to UIMessage with guaranteed id and createdAt const uiMessage = normalizeToUIMessage(message, () => - this.generateMessageId() - ); + this.generateMessageId(), + ) // Emit message appended event - this.events.messageAppended(uiMessage); + this.events.messageAppended(uiMessage) // Add message immediately - this.setMessages([...this.messages, uiMessage]); - this.setIsLoading(true); - this.setError(undefined); + this.setMessages([...this.messages, uiMessage]) + this.setIsLoading(true) + this.setError(undefined) // Create abort controller for this request - this.abortController = new AbortController(); + this.abortController = new AbortController() try { // Convert UIMessages to ModelMessages for connection adapter - const modelMessages: ModelMessage[] = []; + const modelMessages: Array = [] for (const msg of this.messages) { - modelMessages.push(...uiMessageToModelMessages(msg)); + modelMessages.push(...uiMessageToModelMessages(msg)) } // Call onResponse callback (no Response object for non-fetch adapters) - await this.callbacks.onResponse(); + await this.callbacks.onResponse() // Connect and get stream from connection adapter, passing abort signal const stream = this.connection.connect( modelMessages, this.body, - this.abortController.signal - ); + this.abortController.signal, + ) - const assistantMessage = await this.processStream(stream); + const assistantMessage = await this.processStream(stream) // Call onFinish callback - this.callbacks.onFinish(assistantMessage); + this.callbacks.onFinish(assistantMessage) } catch (err) { if (err instanceof Error) { - if (err.name === "AbortError") { + if (err.name === 'AbortError') { // Request was aborted, ignore - return; + return } - this.setError(err); - this.callbacks.onError(err); + this.setError(err) + this.callbacks.onError(err) } } finally { - this.abortController = null; - this.setIsLoading(false); + this.abortController = null + this.setIsLoading(false) } } async sendMessage(content: string): Promise { if (!content.trim() || this.isLoading) { - return; + return } const userMessage: UIMessage = { id: this.generateMessageId(), - role: "user", - parts: [{ type: "text", content: content.trim() }], + role: 'user', + parts: [{ type: 'text', content: content.trim() }], createdAt: new Date(), - }; + } - this.events.messageSent(userMessage.id, content.trim()); + this.events.messageSent(userMessage.id, content.trim()) - await this.append(userMessage); + await this.append(userMessage) } async reload(): Promise { - if (this.messages.length === 0) return; + if (this.messages.length === 0) return // Find the last user message const lastUserMessageIndex = this.messages.findLastIndex( - (m: UIMessage) => m.role === "user" - ); + (m: UIMessage) => m.role === 'user', + ) - if (lastUserMessageIndex === -1) return; + if (lastUserMessageIndex === -1) return - this.events.reloaded(lastUserMessageIndex); + this.events.reloaded(lastUserMessageIndex) // Remove all messages after the last user message - const messagesToKeep = this.messages.slice(0, lastUserMessageIndex + 1); - this.setMessages(messagesToKeep); + const messagesToKeep = this.messages.slice(0, lastUserMessageIndex + 1) + this.setMessages(messagesToKeep) // Resend the last user message - await this.append(this.messages[lastUserMessageIndex]); + await this.append(this.messages[lastUserMessageIndex]!) } stop(): void { if (this.abortController) { - this.abortController.abort(); - this.abortController = null; + this.abortController.abort() + this.abortController = null } - this.setIsLoading(false); - this.events.stopped(); + this.setIsLoading(false) + this.events.stopped() } clear(): void { - this.setMessages([]); - this.setError(undefined); - this.events.messagesCleared(); + this.setMessages([]) + this.setError(undefined) + this.events.messagesCleared() } /** * Add the result of a client-side tool execution */ async addToolResult(result: { - toolCallId: string; - tool: string; - output: any; - state?: "output-available" | "output-error"; - errorText?: string; + toolCallId: string + tool: string + output: any + state?: 'output-available' | 'output-error' + errorText?: string }): Promise { this.events.toolResultAdded( result.toolCallId, result.tool, result.output, - result.state || "output-available" - ); + result.state || 'output-available', + ) // Update the tool call part with the output this.setMessages( @@ -404,15 +397,15 @@ export class ChatClient { this.messages, result.toolCallId, result.output, - result.state === "output-error" ? "input-complete" : undefined, - result.errorText - ) - ); + result.state === 'output-error' ? 'input-complete' : undefined, + result.errorText, + ), + ) // Check if we should auto-send if (this.shouldAutoSend()) { // Continue the flow without adding a new message - await this.continueFlow(); + await this.continueFlow() } } @@ -423,31 +416,31 @@ export class ChatClient { for (const msg of this.messages) { const toolCallPart = msg.parts.find( (p): p is ToolCallPart => - p.type === "tool-call" && p.approval?.id === approvalId - ) as ToolCallPart | undefined; + p.type === 'tool-call' && p.approval?.id === approvalId, + ) if (toolCallPart) { - return toolCallPart.id; + return toolCallPart.id } } - return undefined; + return undefined } /** * Respond to a tool approval request */ async addToolApprovalResponse(response: { - id: string; // approval.id, not toolCallId - approved: boolean; + id: string // approval.id, not toolCallId + approved: boolean }): Promise { - const foundToolCallId = this.findToolCallIdByApprovalId(response.id); + const foundToolCallId = this.findToolCallIdByApprovalId(response.id) if (foundToolCallId) { this.events.toolApprovalResponded( response.id, foundToolCallId, - response.approved - ); + response.approved, + ) } // Find and update the tool call part with approval decision @@ -455,14 +448,14 @@ export class ChatClient { updateToolCallApprovalResponse( this.messages, response.id, - response.approved - ) - ); + response.approved, + ), + ) // Check if we should auto-send if (this.shouldAutoSend()) { // Continue the flow without adding a new message - await this.continueFlow(); + await this.continueFlow() } } @@ -470,19 +463,19 @@ export class ChatClient { * Continue the agent flow with current messages (for approvals/tool results) */ private async continueFlow(): Promise { - if (this.isLoading) return; + if (this.isLoading) return // Create abort controller for this request - this.abortController = new AbortController(); + this.abortController = new AbortController() try { - this.setIsLoading(true); - this.setError(undefined); + this.setIsLoading(true) + this.setError(undefined) // Convert UIMessages to ModelMessages for connection adapter - const modelMessages: ModelMessage[] = []; + const modelMessages: Array = [] for (const msg of this.messages) { - modelMessages.push(...uiMessageToModelMessages(msg)); + modelMessages.push(...uiMessageToModelMessages(msg)) } // Process the current conversation state, passing abort signal @@ -490,19 +483,19 @@ export class ChatClient { this.connection.connect( modelMessages, this.body, - this.abortController.signal - ) - ); + this.abortController.signal, + ), + ) } catch (err: any) { - if (err instanceof Error && err.name === "AbortError") { + if (err instanceof Error && err.name === 'AbortError') { // Request was aborted, ignore - return; + return } - this.setError(err); - this.callbacks.onError(err); + this.setError(err) + this.callbacks.onError(err) } finally { - this.abortController = null; - this.setIsLoading(false); + this.abortController = null + this.setIsLoading(false) } } @@ -511,38 +504,38 @@ export class ChatClient { */ private shouldAutoSend(): boolean { const lastAssistant = this.messages.findLast( - (m: UIMessage) => m.role === "assistant" - ); + (m: UIMessage) => m.role === 'assistant', + ) - if (!lastAssistant) return false; + if (!lastAssistant) return false const toolParts = lastAssistant.parts.filter( - (p): p is ToolCallPart => p.type === "tool-call" - ); + (p): p is ToolCallPart => p.type === 'tool-call', + ) - if (toolParts.length === 0) return false; + if (toolParts.length === 0) return false // All tool calls must be in a terminal state return toolParts.every( (part) => - part.state === "approval-responded" || - (part.output !== undefined && !part.approval) // Has output and no approval needed - ); + part.state === 'approval-responded' || + (part.output !== undefined && !part.approval), // Has output and no approval needed + ) } - getMessages(): UIMessage[] { - return this.messages; + getMessages(): Array { + return this.messages } getIsLoading(): boolean { - return this.isLoading; + return this.isLoading } getError(): Error | undefined { - return this.error; + return this.error } - setMessagesManually(messages: UIMessage[]): void { - this.setMessages(messages); + setMessagesManually(messages: Array): void { + this.setMessages(messages) } } diff --git a/packages/typescript/ai-client/src/connection-adapters.ts b/packages/typescript/ai-client/src/connection-adapters.ts index 2bc59d95e..d02059042 100644 --- a/packages/typescript/ai-client/src/connection-adapters.ts +++ b/packages/typescript/ai-client/src/connection-adapters.ts @@ -1,24 +1,24 @@ -import type { StreamChunk, ModelMessage } from "@tanstack/ai"; -import type { UIMessage } from "./types"; -import { convertMessagesToModelMessages } from "./message-converters"; +import { convertMessagesToModelMessages } from './message-converters' +import type { ModelMessage, StreamChunk } from '@tanstack/ai' +import type { UIMessage } from './types' /** * Merge custom headers into request headers */ function mergeHeaders( - customHeaders?: Record | Headers + customHeaders?: Record | Headers, ): Record { if (!customHeaders) { - return {}; + return {} } if (customHeaders instanceof Headers) { - const result: Record = {}; + const result: Record = {} customHeaders.forEach((value, key) => { - result[key] = value; - }); - return result; + result[key] = value + }) + return result } - return customHeaders; + return customHeaders } /** @@ -26,40 +26,41 @@ function mergeHeaders( */ async function* readStreamLines( reader: ReadableStreamDefaultReader, - abortSignal?: AbortSignal + abortSignal?: AbortSignal, ): AsyncGenerator { try { - const decoder = new TextDecoder(); - let buffer = ""; + const decoder = new TextDecoder() + let buffer = '' + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition while (true) { // Check if aborted before reading if (abortSignal?.aborted) { - break; + break } - const { done, value } = await reader.read(); - if (done) break; + const { done, value } = await reader.read() + if (done) break - buffer += decoder.decode(value, { stream: true }); - const lines = buffer.split("\n"); + buffer += decoder.decode(value, { stream: true }) + const lines = buffer.split('\n') // Keep the last incomplete line in the buffer - buffer = lines.pop() || ""; + buffer = lines.pop() || '' for (const line of lines) { if (line.trim()) { - yield line; + yield line } } } // Process any remaining data in the buffer if (buffer.trim()) { - yield buffer; + yield buffer } } finally { - reader.releaseLock(); + reader.releaseLock() } } @@ -73,20 +74,20 @@ export interface ConnectionAdapter { * @param data - Additional data to send * @param abortSignal - Optional abort signal for request cancellation */ - connect( - messages: UIMessage[] | ModelMessage[], + connect: ( + messages: Array | Array, data?: Record, - abortSignal?: AbortSignal - ): AsyncIterable; + abortSignal?: AbortSignal, + ) => AsyncIterable } /** * Options for fetch-based connection adapters */ export interface FetchConnectionOptions { - headers?: Record | Headers; - credentials?: RequestCredentials; - signal?: AbortSignal; + headers?: Record | Headers + credentials?: RequestCredentials + signal?: AbortSignal } /** @@ -107,53 +108,53 @@ export interface FetchConnectionOptions { */ export function fetchServerSentEvents( url: string, - options: FetchConnectionOptions = {} + options: FetchConnectionOptions = {}, ): ConnectionAdapter { return { async *connect(messages, data, abortSignal) { - const modelMessages = convertMessagesToModelMessages(messages); + const modelMessages = convertMessagesToModelMessages(messages) const requestHeaders: Record = { - "Content-Type": "application/json", + 'Content-Type': 'application/json', ...mergeHeaders(options.headers), - }; + } const response = await fetch(url, { - method: "POST", + method: 'POST', headers: requestHeaders, body: JSON.stringify({ messages: modelMessages, data }), - credentials: options.credentials || "same-origin", + credentials: options.credentials || 'same-origin', signal: abortSignal || options.signal, - }); + }) if (!response.ok) { throw new Error( - `HTTP error! status: ${response.status} ${response.statusText}` - ); + `HTTP error! status: ${response.status} ${response.statusText}`, + ) } // Parse Server-Sent Events format - const reader = response.body?.getReader(); + const reader = response.body?.getReader() if (!reader) { - throw new Error("Response body is not readable"); + throw new Error('Response body is not readable') } for await (const line of readStreamLines(reader, abortSignal)) { // Handle Server-Sent Events format - const data = line.startsWith("data: ") ? line.slice(6) : line; + const data = line.startsWith('data: ') ? line.slice(6) : line - if (data === "[DONE]") continue; + if (data === '[DONE]') continue try { - const parsed: StreamChunk = JSON.parse(data); - yield parsed; + const parsed: StreamChunk = JSON.parse(data) + yield parsed } catch (parseError) { // Skip non-JSON lines or malformed chunks - console.warn("Failed to parse SSE chunk:", data); + console.warn('Failed to parse SSE chunk:', data) } } }, - }; + } } /** @@ -174,48 +175,48 @@ export function fetchServerSentEvents( */ export function fetchHttpStream( url: string, - options: FetchConnectionOptions = {} + options: FetchConnectionOptions = {}, ): ConnectionAdapter { return { async *connect(messages, data, abortSignal) { // Convert UIMessages to ModelMessages if needed - const modelMessages = convertMessagesToModelMessages(messages); + const modelMessages = convertMessagesToModelMessages(messages) const requestHeaders: Record = { - "Content-Type": "application/json", + 'Content-Type': 'application/json', ...mergeHeaders(options.headers), - }; + } const response = await fetch(url, { - method: "POST", + method: 'POST', headers: requestHeaders, body: JSON.stringify({ messages: modelMessages, data }), - credentials: options.credentials || "same-origin", + credentials: options.credentials || 'same-origin', signal: abortSignal || options.signal, - }); + }) if (!response.ok) { throw new Error( - `HTTP error! status: ${response.status} ${response.statusText}` - ); + `HTTP error! status: ${response.status} ${response.statusText}`, + ) } // Parse raw HTTP stream (newline-delimited JSON) - const reader = response.body?.getReader(); + const reader = response.body?.getReader() if (!reader) { - throw new Error("Response body is not readable"); + throw new Error('Response body is not readable') } for await (const line of readStreamLines(reader, abortSignal)) { try { - const parsed: StreamChunk = JSON.parse(line); - yield parsed; + const parsed: StreamChunk = JSON.parse(line) + yield parsed } catch (parseError) { - console.warn("Failed to parse HTTP stream chunk:", line); + console.warn('Failed to parse HTTP stream chunk:', line) } } }, - }; + } } /** @@ -234,14 +235,14 @@ export function fetchHttpStream( */ export function stream( streamFactory: ( - messages: ModelMessage[], - data?: Record - ) => AsyncIterable + messages: Array, + data?: Record, + ) => AsyncIterable, ): ConnectionAdapter { return { async *connect(messages, data) { - const modelMessages = convertMessagesToModelMessages(messages); - yield* streamFactory(modelMessages, data); + const modelMessages = convertMessagesToModelMessages(messages) + yield* streamFactory(modelMessages, data) }, - }; + } } diff --git a/packages/typescript/ai-client/src/events.ts b/packages/typescript/ai-client/src/events.ts index 321677966..646676c79 100644 --- a/packages/typescript/ai-client/src/events.ts +++ b/packages/typescript/ai-client/src/events.ts @@ -1,14 +1,14 @@ -import { aiEventClient } from "@tanstack/ai/event-client"; -import type { UIMessage } from "./types"; +import { aiEventClient } from '@tanstack/ai/event-client' +import type { UIMessage } from './types' /** * Abstract base class for ChatClient event emission */ export abstract class ChatClientEventEmitter { - protected clientId: string; + protected clientId: string constructor(clientId: string) { - this.clientId = clientId; + this.clientId = clientId } /** @@ -17,51 +17,47 @@ export abstract class ChatClientEventEmitter { */ protected abstract emitEvent( eventName: string, - data?: Record - ): void; + data?: Record, + ): void /** * Emit client created event */ clientCreated(initialMessageCount: number): void { - this.emitEvent("client:created", { + this.emitEvent('client:created', { initialMessageCount, - }); + }) } /** * Emit loading state changed event */ loadingChanged(isLoading: boolean): void { - this.emitEvent("client:loading-changed", { isLoading }); + this.emitEvent('client:loading-changed', { isLoading }) } /** * Emit error state changed event */ errorChanged(error: string | null): void { - this.emitEvent("client:error-changed", { + this.emitEvent('client:error-changed', { error, - }); + }) } /** * Emit text update events (combines processor and client events) */ - textUpdated( - streamId: string, - messageId: string, - content: string - ): void { - this.emitEvent("processor:text-updated", { + textUpdated(streamId: string, messageId: string, content: string): void { + this.emitEvent('processor:text-updated', { streamId, content, - }); + }) - this.emitEvent("client:assistant-message-updated", { + this.emitEvent('client:assistant-message-updated', { messageId, content, - }); + }) } /** @@ -73,23 +69,23 @@ export abstract class ChatClientEventEmitter { toolCallId: string, toolName: string, state: string, - args: string + args: string, ): void { - this.emitEvent("processor:tool-call-state-changed", { + this.emitEvent('processor:tool-call-state-changed', { streamId, toolCallId, toolName, state, arguments: args, - }); + }) - this.emitEvent("client:tool-call-updated", { + this.emitEvent('client:tool-call-updated', { messageId, toolCallId, toolName, state, arguments: args, - }); + }) } /** @@ -100,15 +96,15 @@ export abstract class ChatClientEventEmitter { toolCallId: string, content: string, state: string, - error?: string + error?: string, ): void { - this.emitEvent("processor:tool-result-state-changed", { + this.emitEvent('processor:tool-result-state-changed', { streamId, toolCallId, content, state, error, - }); + }) } /** @@ -119,15 +115,15 @@ export abstract class ChatClientEventEmitter { toolCallId: string, toolName: string, input: any, - approvalId: string + approvalId: string, ): void { - this.emitEvent("client:approval-requested", { + this.emitEvent('client:approval-requested', { messageId, toolCallId, toolName, input, approvalId, - }); + }) } /** @@ -135,49 +131,49 @@ export abstract class ChatClientEventEmitter { */ messageAppended(uiMessage: UIMessage): void { const contentPreview = uiMessage.parts - .filter((p) => p.type === "text") + .filter((p) => p.type === 'text') .map((p) => (p as any).content) - .join(" ") - .substring(0, 100); + .join(' ') + .substring(0, 100) - this.emitEvent("client:message-appended", { + this.emitEvent('client:message-appended', { messageId: uiMessage.id, role: uiMessage.role, contentPreview, - }); + }) } /** * Emit message sent event */ messageSent(messageId: string, content: string): void { - this.emitEvent("client:message-sent", { + this.emitEvent('client:message-sent', { messageId, content, - }); + }) } /** * Emit reloaded event */ reloaded(fromMessageIndex: number): void { - this.emitEvent("client:reloaded", { + this.emitEvent('client:reloaded', { fromMessageIndex, - }); + }) } /** * Emit stopped event */ stopped(): void { - this.emitEvent("client:stopped"); + this.emitEvent('client:stopped') } /** * Emit messages cleared event */ messagesCleared(): void { - this.emitEvent("client:messages-cleared"); + this.emitEvent('client:messages-cleared') } /** @@ -187,14 +183,14 @@ export abstract class ChatClientEventEmitter { toolCallId: string, toolName: string, output: any, - state: string + state: string, ): void { - this.emitEvent("tool:result-added", { + this.emitEvent('tool:result-added', { toolCallId, toolName, output, state, - }); + }) } /** @@ -203,13 +199,13 @@ export abstract class ChatClientEventEmitter { toolApprovalResponded( approvalId: string, toolCallId: string, - approved: boolean + approved: boolean, ): void { - this.emitEvent("tool:approval-responded", { + this.emitEvent('tool:approval-responded', { approvalId, toolCallId, approved, - }); + }) } } @@ -220,24 +216,20 @@ export class DefaultChatClientEventEmitter extends ChatClientEventEmitter { /** * Emit an event with automatic clientId and timestamp for client/tool events */ - protected emitEvent( - eventName: string, - data?: Record - ): void { + protected emitEvent(eventName: string, data?: Record): void { // For client:* and tool:* events, automatically add clientId and timestamp - if (eventName.startsWith("client:") || eventName.startsWith("tool:")) { + if (eventName.startsWith('client:') || eventName.startsWith('tool:')) { aiEventClient.emit(eventName as any, { ...data, clientId: this.clientId, timestamp: Date.now(), - }); + }) } else { // For other events (e.g., processor:*), just add timestamp aiEventClient.emit(eventName as any, { ...data, timestamp: Date.now(), - }); + }) } } } - diff --git a/packages/typescript/ai-client/src/index.ts b/packages/typescript/ai-client/src/index.ts index 7f4f356d2..8fd7f223a 100644 --- a/packages/typescript/ai-client/src/index.ts +++ b/packages/typescript/ai-client/src/index.ts @@ -1,4 +1,4 @@ -export { ChatClient } from "./chat-client"; +export { ChatClient } from './chat-client' export type { // Core message types UIMessage, @@ -11,14 +11,14 @@ export type { // Client configuration types ChatClientOptions, ChatRequestBody, -} from "./types"; +} from './types' export { fetchServerSentEvents, fetchHttpStream, stream, type ConnectionAdapter, type FetchConnectionOptions, -} from "./connection-adapters"; +} from './connection-adapters' export { StreamProcessor, ImmediateStrategy, @@ -34,15 +34,15 @@ export { type StreamProcessorOptions, type StreamProcessorHandlers, type InternalToolCallState, -} from "./stream/index"; +} from './stream/index' export { uiMessageToModelMessages, modelMessageToUIMessage, modelMessagesToUIMessages, -} from "./message-converters"; +} from './message-converters' export { parsePartialJSON, PartialJSONParser, defaultJSONParser, type JSONParser, -} from "./loose-json-parser"; +} from './loose-json-parser' diff --git a/packages/typescript/ai-client/src/loose-json-parser.ts b/packages/typescript/ai-client/src/loose-json-parser.ts index 52d48e1c2..58f9b6e80 100644 --- a/packages/typescript/ai-client/src/loose-json-parser.ts +++ b/packages/typescript/ai-client/src/loose-json-parser.ts @@ -1,4 +1,4 @@ -import { parse as parsePartialJSONLib } from "partial-json"; +import { parse as parsePartialJSONLib } from 'partial-json' /** * JSON Parser interface - allows for custom parser implementations @@ -9,7 +9,7 @@ export interface JSONParser { * @param jsonString - The JSON string to parse * @returns The parsed object, or undefined if parsing fails */ - parse(jsonString: string): any; + parse: (jsonString: string) => any } /** @@ -23,16 +23,16 @@ export class PartialJSONParser implements JSONParser { * @returns The parsed object, or undefined if parsing fails */ parse(jsonString: string): any { - if (!jsonString || jsonString.trim() === "") { - return undefined; + if (!jsonString || jsonString.trim() === '') { + return undefined } try { - return parsePartialJSONLib(jsonString); + return parsePartialJSONLib(jsonString) } catch (error) { // If partial parsing fails, return undefined // This is expected during early streaming when we have very little data - return undefined; + return undefined } } } @@ -40,7 +40,7 @@ export class PartialJSONParser implements JSONParser { /** * Default parser instance */ -export const defaultJSONParser = new PartialJSONParser(); +export const defaultJSONParser = new PartialJSONParser() /** * Parse partial JSON string (convenience function) @@ -48,6 +48,5 @@ export const defaultJSONParser = new PartialJSONParser(); * @returns The parsed object, or undefined if parsing fails */ export function parsePartialJSON(jsonString: string): any { - return defaultJSONParser.parse(jsonString); + return defaultJSONParser.parse(jsonString) } - diff --git a/packages/typescript/ai-client/src/message-converters.ts b/packages/typescript/ai-client/src/message-converters.ts index ef2cdd117..3a7cdb721 100644 --- a/packages/typescript/ai-client/src/message-converters.ts +++ b/packages/typescript/ai-client/src/message-converters.ts @@ -1,29 +1,29 @@ -import type { ModelMessage } from "@tanstack/ai"; +import type { ModelMessage } from '@tanstack/ai' import type { - UIMessage, MessagePart, TextPart, ToolCallPart, ToolResultPart, -} from "./types"; + UIMessage, +} from './types' /** * Convert UIMessages or ModelMessages to ModelMessages */ export function convertMessagesToModelMessages( - messages: UIMessage[] | ModelMessage[] -): ModelMessage[] { - const modelMessages: ModelMessage[] = []; + messages: Array | Array, +): Array { + const modelMessages: Array = [] for (const msg of messages) { - if ("parts" in msg) { + if ('parts' in msg) { // UIMessage - convert to ModelMessages - modelMessages.push(...uiMessageToModelMessages(msg as UIMessage)); + modelMessages.push(...uiMessageToModelMessages(msg)) } else { // Already ModelMessage - modelMessages.push(msg as ModelMessage); + modelMessages.push(msg) } } - return modelMessages; + return modelMessages } /** @@ -37,78 +37,80 @@ export function convertMessagesToModelMessages( * @param uiMessage - The UIMessage to convert * @returns An array of ModelMessages (may be multiple if tool results are present) */ -export function uiMessageToModelMessages(uiMessage: UIMessage): ModelMessage[] { - const messages: ModelMessage[] = []; +export function uiMessageToModelMessages( + uiMessage: UIMessage, +): Array { + const messages: Array = [] // Separate parts by type // Note: thinking parts are UI-only and not included in ModelMessages - const textParts: TextPart[] = []; - const toolCallParts: ToolCallPart[] = []; - const toolResultParts: ToolResultPart[] = []; + const textParts: Array = [] + const toolCallParts: Array = [] + const toolResultParts: Array = [] for (const part of uiMessage.parts) { - if (part.type === "text") { - textParts.push(part); - } else if (part.type === "tool-call") { - toolCallParts.push(part); - } else if (part.type === "tool-result") { - toolResultParts.push(part); + if (part.type === 'text') { + textParts.push(part) + } else if (part.type === 'tool-call') { + toolCallParts.push(part) + } else if (part.type === 'tool-result') { + toolResultParts.push(part) } // thinking parts are skipped - they're UI-only } // Build the main message (system, user, or assistant) - const content = textParts.map((p) => p.content).join("") || null; + const content = textParts.map((p) => p.content).join('') || null const toolCalls = toolCallParts.length > 0 ? toolCallParts .filter( (p) => - p.state === "input-complete" || - p.state === "approval-responded" || - p.output !== undefined // Include if has output (client tool result) + p.state === 'input-complete' || + p.state === 'approval-responded' || + p.output !== undefined, // Include if has output (client tool result) ) .map((p) => ({ id: p.id, - type: "function" as const, + type: 'function' as const, function: { name: p.name, arguments: p.arguments, }, })) - : undefined; + : undefined // Create the main message - if (uiMessage.role !== "assistant" || content || !toolCalls) { + if (uiMessage.role !== 'assistant' || content || !toolCalls) { messages.push({ role: uiMessage.role, content, ...(toolCalls && toolCalls.length > 0 && { toolCalls }), - }); - } else if (toolCalls && toolCalls.length > 0) { + }) + } else if (toolCalls.length > 0) { // Assistant message with only tool calls messages.push({ - role: "assistant", + role: 'assistant', content, toolCalls, - }); + }) } // Add tool result messages (only completed ones) for (const toolResultPart of toolResultParts) { if ( - toolResultPart.state === "complete" || - toolResultPart.state === "error" + toolResultPart.state === 'complete' || + toolResultPart.state === 'error' ) { messages.push({ - role: "tool", + role: 'tool', content: toolResultPart.content, toolCallId: toolResultPart.toolCallId, - }); + }) } } - return messages; + return messages } /** @@ -125,46 +127,46 @@ export function uiMessageToModelMessages(uiMessage: UIMessage): ModelMessage[] { */ export function modelMessageToUIMessage( modelMessage: ModelMessage, - id?: string + id?: string, ): UIMessage { - const parts: MessagePart[] = []; + const parts: Array = [] // Handle content if (modelMessage.content) { parts.push({ - type: "text", + type: 'text', content: modelMessage.content, - }); + }) } // Handle tool calls if (modelMessage.toolCalls && modelMessage.toolCalls.length > 0) { for (const toolCall of modelMessage.toolCalls) { parts.push({ - type: "tool-call", + type: 'tool-call', id: toolCall.id, name: toolCall.function.name, arguments: toolCall.function.arguments, - state: "input-complete", // Model messages have complete arguments - }); + state: 'input-complete', // Model messages have complete arguments + }) } } // Handle tool results (when role is "tool") - if (modelMessage.role === "tool" && modelMessage.toolCallId) { + if (modelMessage.role === 'tool' && modelMessage.toolCallId) { parts.push({ - type: "tool-result", + type: 'tool-result', toolCallId: modelMessage.toolCallId, - content: modelMessage.content || "", - state: "complete", - }); + content: modelMessage.content || '', + state: 'complete', + }) } return { id: id || generateMessageId(), - role: modelMessage.role === "tool" ? "assistant" : modelMessage.role, + role: modelMessage.role === 'tool' ? 'assistant' : modelMessage.role, parts, - }; + } } /** @@ -176,46 +178,44 @@ export function modelMessageToUIMessage( * @returns Array of UIMessages */ export function modelMessagesToUIMessages( - modelMessages: ModelMessage[] -): UIMessage[] { - const uiMessages: UIMessage[] = []; - let currentAssistantMessage: UIMessage | null = null; + modelMessages: Array, +): Array { + const uiMessages: Array = [] + let currentAssistantMessage: UIMessage | null = null - for (let i = 0; i < modelMessages.length; i++) { - const msg = modelMessages[i]; - - if (msg.role === "tool") { + for (const msg of modelMessages) { + if (msg.role === 'tool') { // Tool result - merge into the last assistant message if possible if ( currentAssistantMessage && - currentAssistantMessage.role === "assistant" + currentAssistantMessage.role === 'assistant' ) { currentAssistantMessage.parts.push({ - type: "tool-result", + type: 'tool-result', toolCallId: msg.toolCallId!, - content: msg.content || "", - state: "complete", - }); + content: msg.content || '', + state: 'complete', + }) } else { // No assistant message to merge into, create a standalone one - const toolResultUIMessage = modelMessageToUIMessage(msg); - uiMessages.push(toolResultUIMessage); + const toolResultUIMessage = modelMessageToUIMessage(msg) + uiMessages.push(toolResultUIMessage) } } else { // Regular message - const uiMessage = modelMessageToUIMessage(msg); - uiMessages.push(uiMessage); + const uiMessage = modelMessageToUIMessage(msg) + uiMessages.push(uiMessage) // Track assistant messages for potential tool result merging - if (msg.role === "assistant") { - currentAssistantMessage = uiMessage; + if (msg.role === 'assistant') { + currentAssistantMessage = uiMessage } else { - currentAssistantMessage = null; + currentAssistantMessage = null } } } - return uiMessages; + return uiMessages } /** @@ -228,21 +228,21 @@ export function modelMessagesToUIMessages( */ export function normalizeToUIMessage( message: UIMessage | ModelMessage, - generateId: () => string + generateId: () => string, ): UIMessage { - if ("parts" in message) { + if ('parts' in message) { // Already a UIMessage return { ...message, id: message.id || generateId(), createdAt: message.createdAt || new Date(), - }; + } } else { // ModelMessage - convert to UIMessage return { ...modelMessageToUIMessage(message, generateId()), createdAt: new Date(), - }; + } } } @@ -250,5 +250,5 @@ export function normalizeToUIMessage( * Generate a unique message ID */ function generateMessageId(): string { - return `msg-${Date.now()}-${Math.random().toString(36).substring(7)}`; + return `msg-${Date.now()}-${Math.random().toString(36).substring(7)}` } diff --git a/packages/typescript/ai-client/src/message-updaters.ts b/packages/typescript/ai-client/src/message-updaters.ts index d0558d669..564bf3de0 100644 --- a/packages/typescript/ai-client/src/message-updaters.ts +++ b/packages/typescript/ai-client/src/message-updaters.ts @@ -1,46 +1,45 @@ import type { - UIMessage, - MessagePart, - ToolCallPart, - ToolResultPart, ThinkingPart, + ToolCallPart, ToolCallState, + ToolResultPart, ToolResultState, -} from "./types"; + UIMessage, +} from './types' /** * Update or add a text part to a message, ensuring tool calls come before text. * Text parts are always placed at the end (after tool calls). */ export function updateTextPart( - messages: UIMessage[], + messages: Array, messageId: string, - content: string -): UIMessage[] { + content: string, +): Array { return messages.map((msg) => { if (msg.id !== messageId) { - return msg; + return msg } - let parts = [...msg.parts]; - const textPartIndex = parts.findIndex((p) => p.type === "text"); + let parts = [...msg.parts] + const textPartIndex = parts.findIndex((p) => p.type === 'text') // Always add/update text part at the end (after tool calls) if (textPartIndex >= 0) { - parts[textPartIndex] = { type: "text", content }; + parts[textPartIndex] = { type: 'text', content } } else { // Remove existing parts temporarily to ensure order - const toolCallParts = parts.filter((p) => p.type === "tool-call"); + const toolCallParts = parts.filter((p) => p.type === 'tool-call') const otherParts = parts.filter( - (p) => p.type !== "tool-call" && p.type !== "text" - ); + (p) => p.type !== 'tool-call' && p.type !== 'text', + ) // Rebuild: tool calls first, then other parts, then text - parts = [...toolCallParts, ...otherParts, { type: "text", content }]; + parts = [...toolCallParts, ...otherParts, { type: 'text', content }] } - return { ...msg, parts }; - }); + return { ...msg, parts } + }) } /** @@ -48,147 +47,147 @@ export function updateTextPart( * Tool calls are inserted before any text parts. */ export function updateToolCallPart( - messages: UIMessage[], + messages: Array, messageId: string, toolCall: { - id: string; - name: string; - arguments: string; - state: ToolCallState; - } -): UIMessage[] { + id: string + name: string + arguments: string + state: ToolCallState + }, +): Array { return messages.map((msg) => { if (msg.id !== messageId) { - return msg; + return msg } - let parts = [...msg.parts]; + const parts = [...msg.parts] // Find by ID, not index! const existingPartIndex = parts.findIndex( - (p): p is ToolCallPart => p.type === "tool-call" && p.id === toolCall.id - ); + (p): p is ToolCallPart => p.type === 'tool-call' && p.id === toolCall.id, + ) const toolCallPart: ToolCallPart = { - type: "tool-call", + type: 'tool-call', id: toolCall.id, name: toolCall.name, arguments: toolCall.arguments, state: toolCall.state, - }; + } if (existingPartIndex >= 0) { // Update existing tool call - parts[existingPartIndex] = toolCallPart; + parts[existingPartIndex] = toolCallPart } else { // Insert tool call before any text parts - const textPartIndex = parts.findIndex((p) => p.type === "text"); + const textPartIndex = parts.findIndex((p) => p.type === 'text') if (textPartIndex >= 0) { - parts.splice(textPartIndex, 0, toolCallPart); + parts.splice(textPartIndex, 0, toolCallPart) } else { - parts.push(toolCallPart); + parts.push(toolCallPart) } } - return { ...msg, parts }; - }); + return { ...msg, parts } + }) } /** * Update or add a tool result part to a message. */ export function updateToolResultPart( - messages: UIMessage[], + messages: Array, messageId: string, toolCallId: string, content: string, state: ToolResultState, - error?: string -): UIMessage[] { + error?: string, +): Array { return messages.map((msg) => { if (msg.id !== messageId) { - return msg; + return msg } - const parts = [...msg.parts]; + const parts = [...msg.parts] const resultPartIndex = parts.findIndex( (p): p is ToolResultPart => - p.type === "tool-result" && p.toolCallId === toolCallId - ); + p.type === 'tool-result' && p.toolCallId === toolCallId, + ) const toolResultPart: ToolResultPart = { - type: "tool-result", + type: 'tool-result', toolCallId, content, state, ...(error && { error }), - }; + } if (resultPartIndex >= 0) { - parts[resultPartIndex] = toolResultPart; + parts[resultPartIndex] = toolResultPart } else { - parts.push(toolResultPart); + parts.push(toolResultPart) } - return { ...msg, parts }; - }); + return { ...msg, parts } + }) } /** * Update a tool call part with approval request metadata. */ export function updateToolCallApproval( - messages: UIMessage[], + messages: Array, messageId: string, toolCallId: string, - approvalId: string -): UIMessage[] { + approvalId: string, +): Array { return messages.map((msg) => { if (msg.id !== messageId) { - return msg; + return msg } - const parts = [...msg.parts]; + const parts = [...msg.parts] const toolCallPart = parts.find( - (p): p is ToolCallPart => p.type === "tool-call" && p.id === toolCallId - ) as ToolCallPart | undefined; + (p): p is ToolCallPart => p.type === 'tool-call' && p.id === toolCallId, + ) if (toolCallPart) { - toolCallPart.state = "approval-requested"; + toolCallPart.state = 'approval-requested' toolCallPart.approval = { id: approvalId, needsApproval: true, - }; + } } - return { ...msg, parts }; - }); + return { ...msg, parts } + }) } /** * Update a tool call part's state (e.g., to "input-complete"). */ export function updateToolCallState( - messages: UIMessage[], + messages: Array, messageId: string, toolCallId: string, - state: ToolCallState -): UIMessage[] { + state: ToolCallState, +): Array { return messages.map((msg) => { if (msg.id !== messageId) { - return msg; + return msg } - const parts = [...msg.parts]; + const parts = [...msg.parts] const toolCallPart = parts.find( - (p): p is ToolCallPart => p.type === "tool-call" && p.id === toolCallId - ) as ToolCallPart | undefined; + (p): p is ToolCallPart => p.type === 'tool-call' && p.id === toolCallId, + ) if (toolCallPart) { - toolCallPart.state = state; + toolCallPart.state = state } - return { ...msg, parts }; - }); + return { ...msg, parts } + }) } /** @@ -196,29 +195,29 @@ export function updateToolCallState( * Searches all messages to find the tool call by ID. */ export function updateToolCallWithOutput( - messages: UIMessage[], + messages: Array, toolCallId: string, output: any, state?: ToolCallState, - errorText?: string -): UIMessage[] { + errorText?: string, +): Array { return messages.map((msg) => { - const parts = [...msg.parts]; + const parts = [...msg.parts] const toolCallPart = parts.find( - (p): p is ToolCallPart => p.type === "tool-call" && p.id === toolCallId - ) as ToolCallPart | undefined; + (p): p is ToolCallPart => p.type === 'tool-call' && p.id === toolCallId, + ) if (toolCallPart) { - toolCallPart.output = errorText ? { error: errorText } : output; + toolCallPart.output = errorText ? { error: errorText } : output if (state) { - toolCallPart.state = state; + toolCallPart.state = state } else { - toolCallPart.state = "input-complete"; + toolCallPart.state = 'input-complete' } } - return { ...msg, parts }; - }); + return { ...msg, parts } + }) } /** @@ -226,24 +225,24 @@ export function updateToolCallWithOutput( * Searches all messages to find the tool call by approval ID. */ export function updateToolCallApprovalResponse( - messages: UIMessage[], + messages: Array, approvalId: string, - approved: boolean -): UIMessage[] { + approved: boolean, +): Array { return messages.map((msg) => { - const parts = [...msg.parts]; + const parts = [...msg.parts] const toolCallPart = parts.find( (p): p is ToolCallPart => - p.type === "tool-call" && p.approval?.id === approvalId - ) as ToolCallPart | undefined; + p.type === 'tool-call' && p.approval?.id === approvalId, + ) if (toolCallPart && toolCallPart.approval) { - toolCallPart.approval.approved = approved; - toolCallPart.state = "approval-responded"; + toolCallPart.approval.approved = approved + toolCallPart.state = 'approval-responded' } - return { ...msg, parts }; - }); + return { ...msg, parts } + }) } /** @@ -251,37 +250,37 @@ export function updateToolCallApprovalResponse( * Thinking parts are typically placed before text parts. */ export function updateThinkingPart( - messages: UIMessage[], + messages: Array, messageId: string, - content: string -): UIMessage[] { + content: string, +): Array { return messages.map((msg) => { if (msg.id !== messageId) { - return msg; + return msg } - let parts = [...msg.parts]; - const thinkingPartIndex = parts.findIndex((p) => p.type === "thinking"); + const parts = [...msg.parts] + const thinkingPartIndex = parts.findIndex((p) => p.type === 'thinking') const thinkingPart: ThinkingPart = { - type: "thinking", + type: 'thinking', content, - }; + } if (thinkingPartIndex >= 0) { // Update existing thinking part - parts[thinkingPartIndex] = thinkingPart; + parts[thinkingPartIndex] = thinkingPart } else { // Insert thinking part before text parts (but after tool calls) - const textPartIndex = parts.findIndex((p) => p.type === "text"); + const textPartIndex = parts.findIndex((p) => p.type === 'text') if (textPartIndex >= 0) { - parts.splice(textPartIndex, 0, thinkingPart); + parts.splice(textPartIndex, 0, thinkingPart) } else { // No text part, add at end - parts.push(thinkingPart); + parts.push(thinkingPart) } } - return { ...msg, parts }; - }); + return { ...msg, parts } + }) } diff --git a/packages/typescript/ai-client/src/stream/chunk-strategies.ts b/packages/typescript/ai-client/src/stream/chunk-strategies.ts index 833e5fc09..145aaa35a 100644 --- a/packages/typescript/ai-client/src/stream/chunk-strategies.ts +++ b/packages/typescript/ai-client/src/stream/chunk-strategies.ts @@ -4,14 +4,14 @@ * Strategies for controlling when text updates are emitted to the UI */ -import type { ChunkStrategy } from "./types"; +import type { ChunkStrategy } from './types' /** * Immediate Strategy - emit on every chunk (default behavior) */ export class ImmediateStrategy implements ChunkStrategy { shouldEmit(_chunk: string, _accumulated: string): boolean { - return true; + return true } } @@ -20,10 +20,10 @@ export class ImmediateStrategy implements ChunkStrategy { * Useful for natural text flow in UI */ export class PunctuationStrategy implements ChunkStrategy { - private punctuation = /[.,!?;:\n]/; + private punctuation = /[.,!?;:\n]/ shouldEmit(chunk: string, _accumulated: string): boolean { - return this.punctuation.test(chunk); + return this.punctuation.test(chunk) } } @@ -32,21 +32,21 @@ export class PunctuationStrategy implements ChunkStrategy { * Useful for reducing UI update frequency */ export class BatchStrategy implements ChunkStrategy { - private chunkCount = 0; + private chunkCount = 0 constructor(private batchSize: number = 5) {} shouldEmit(_chunk: string, _accumulated: string): boolean { - this.chunkCount++; + this.chunkCount++ if (this.chunkCount >= this.batchSize) { - this.chunkCount = 0; - return true; + this.chunkCount = 0 + return true } - return false; + return false } reset(): void { - this.chunkCount = 0; + this.chunkCount = 0 } } @@ -57,7 +57,7 @@ export class BatchStrategy implements ChunkStrategy { export class WordBoundaryStrategy implements ChunkStrategy { shouldEmit(chunk: string, _accumulated: string): boolean { // Emit if chunk ends with whitespace - return /\s$/.test(chunk); + return /\s$/.test(chunk) } } @@ -66,14 +66,14 @@ export class WordBoundaryStrategy implements ChunkStrategy { * Emits if ANY strategy says to emit */ export class CompositeStrategy implements ChunkStrategy { - constructor(private strategies: ChunkStrategy[]) {} + constructor(private strategies: Array) {} shouldEmit(chunk: string, accumulated: string): boolean { - return this.strategies.some((s) => s.shouldEmit(chunk, accumulated)); + return this.strategies.some((s) => s.shouldEmit(chunk, accumulated)) } reset(): void { - this.strategies.forEach((s) => s.reset?.()); + this.strategies.forEach((s) => s.reset?.()) } } @@ -82,29 +82,29 @@ export class CompositeStrategy implements ChunkStrategy { * Useful for reducing jitter in fast streams */ export class DebounceStrategy implements ChunkStrategy { - private timeoutId: NodeJS.Timeout | null = null; - private shouldEmitNow = false; + private timeoutId: NodeJS.Timeout | null = null + private shouldEmitNow = false constructor(private delayMs: number = 100) {} shouldEmit(_chunk: string, _accumulated: string): boolean { if (this.timeoutId) { - clearTimeout(this.timeoutId); + clearTimeout(this.timeoutId) } - this.shouldEmitNow = false; + this.shouldEmitNow = false this.timeoutId = setTimeout(() => { - this.shouldEmitNow = true; - }, this.delayMs); + this.shouldEmitNow = true + }, this.delayMs) - return this.shouldEmitNow; + return this.shouldEmitNow } reset(): void { if (this.timeoutId) { - clearTimeout(this.timeoutId); - this.timeoutId = null; + clearTimeout(this.timeoutId) + this.timeoutId = null } - this.shouldEmitNow = false; + this.shouldEmitNow = false } } diff --git a/packages/typescript/ai-client/src/stream/index.ts b/packages/typescript/ai-client/src/stream/index.ts index 81ad4f4bf..2fc9bf596 100644 --- a/packages/typescript/ai-client/src/stream/index.ts +++ b/packages/typescript/ai-client/src/stream/index.ts @@ -7,7 +7,7 @@ * - Types: All stream processing types */ -export { StreamProcessor } from "./processor"; +export { StreamProcessor } from './processor' export { ImmediateStrategy, PunctuationStrategy, @@ -15,7 +15,7 @@ export { WordBoundaryStrategy, CompositeStrategy, DebounceStrategy, -} from "./chunk-strategies"; +} from './chunk-strategies' export type { StreamChunk, ProcessedEvent, @@ -24,4 +24,4 @@ export type { StreamProcessorOptions, StreamProcessorHandlers, InternalToolCallState, -} from "./types"; +} from './types' diff --git a/packages/typescript/ai-client/src/stream/processor.ts b/packages/typescript/ai-client/src/stream/processor.ts index 10e6aa172..8cf3eadc7 100644 --- a/packages/typescript/ai-client/src/stream/processor.ts +++ b/packages/typescript/ai-client/src/stream/processor.ts @@ -8,17 +8,17 @@ * - Custom stream parsers */ +import { defaultJSONParser } from '../loose-json-parser' +import { ImmediateStrategy } from './chunk-strategies' import type { - StreamChunk, - StreamProcessorOptions, - StreamProcessorHandlers, - InternalToolCallState, ChunkStrategy, + InternalToolCallState, + StreamChunk, StreamParser, -} from "./types"; -import type { ToolCallState, ToolResultState } from "../types"; -import { ImmediateStrategy } from "./chunk-strategies"; -import { defaultJSONParser } from "../loose-json-parser"; + StreamProcessorHandlers, + StreamProcessorOptions, +} from './types' +import type { ToolCallState, ToolResultState } from '../types' /** * Default parser - converts adapter StreamChunk format to processor format @@ -30,65 +30,65 @@ class DefaultStreamParser implements StreamParser { for await (const chunk of stream) { // Pass through known processor format chunks if ( - chunk.type === "text" || - chunk.type === "tool-call-delta" || - chunk.type === "done" || - chunk.type === "approval-requested" || - chunk.type === "tool-input-available" || - chunk.type === "thinking" + chunk.type === 'text' || + chunk.type === 'tool-call-delta' || + chunk.type === 'done' || + chunk.type === 'approval-requested' || + chunk.type === 'tool-input-available' || + chunk.type === 'thinking' ) { - yield chunk as StreamChunk; - continue; + yield chunk as StreamChunk + continue } // Convert adapter format: "content" or "content delta" to "text" if ( - chunk.type === "content" && + chunk.type === 'content' && (chunk.content !== undefined || chunk.delta !== undefined) ) { yield { - type: "text", - content: (chunk as any).content, - delta: (chunk as any).delta, - }; + type: 'text', + content: chunk.content, + delta: chunk.delta, + } } // Convert adapter format: "tool_result" to processor format - if (chunk.type === "tool_result" || chunk.type === "tool-result") { + if (chunk.type === 'tool_result' || chunk.type === 'tool-result') { // Tool result chunks have toolCallId and content at the top level - const toolCallId = (chunk as any).toolCallId; - const content = (chunk as any).content; - const error = (chunk as any).error; + const toolCallId = chunk.toolCallId + const content = chunk.content + const error = chunk.error if (toolCallId !== undefined) { yield { - type: "tool-result", + type: 'tool-result', toolCallId, - content: content || "", + content: content || '', error, - }; + } } } // Convert adapter format: "tool_call" to "tool-call-delta" if ( - (chunk.type === "tool_call" || chunk.type === "tool-call-delta") && + (chunk.type === 'tool_call' || chunk.type === 'tool-call-delta') && chunk.toolCall ) { yield { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: chunk.index ?? chunk.toolCallIndex, toolCall: chunk.toolCall, - }; + } } // Convert adapter format: "thinking" chunks - if (chunk.type === "thinking") { + if (chunk.type === 'thinking') { yield { - type: "thinking", - content: (chunk as any).content, - delta: (chunk as any).delta, - }; + type: 'thinking', + content: chunk.content, + delta: chunk.delta, + } } } } @@ -108,50 +108,50 @@ class DefaultStreamParser implements StreamParser { * 3. Stream ends */ export class StreamProcessor { - private chunkStrategy: ChunkStrategy; - private parser: StreamParser; - private handlers: StreamProcessorHandlers; - private jsonParser: { parse(jsonString: string): any }; + private chunkStrategy: ChunkStrategy + private parser: StreamParser + private handlers: StreamProcessorHandlers + private jsonParser: { parse: (jsonString: string) => any } // State - private textContent: string = ""; - private lastEmittedText: string = ""; - private thinkingContent: string = ""; - private toolCalls: Map = new Map(); // Track by ID, not index - private toolCallOrder: string[] = []; // Track order of tool call IDs + private textContent = '' + private lastEmittedText = '' + private thinkingContent = '' + private toolCalls: Map = new Map() // Track by ID, not index + private toolCallOrder: Array = [] // Track order of tool call IDs constructor(options: StreamProcessorOptions) { - this.chunkStrategy = options.chunkStrategy || new ImmediateStrategy(); - this.parser = options.parser || new DefaultStreamParser(); - this.handlers = options.handlers; - this.jsonParser = options.jsonParser || defaultJSONParser; + this.chunkStrategy = options.chunkStrategy || new ImmediateStrategy() + this.parser = options.parser || new DefaultStreamParser() + this.handlers = options.handlers + this.jsonParser = options.jsonParser || defaultJSONParser } /** * Process a stream and emit events through handlers */ async process(stream: AsyncIterable): Promise<{ - content: string; - toolCalls?: any[]; + content: string + toolCalls?: Array }> { // Reset state - this.reset(); + this.reset() // Parse and process each chunk - const parsedStream = this.parser.parse(stream); + const parsedStream = this.parser.parse(stream) for await (const chunk of parsedStream) { - this.processChunk(chunk); + this.processChunk(chunk) } // Stream ended - finalize everything - this.finalizeStream(); + this.finalizeStream() - const toolCalls = this.getCompletedToolCalls(); + const toolCalls = this.getCompletedToolCalls() return { content: this.textContent, toolCalls: toolCalls.length > 0 ? toolCalls : undefined, - }; + } } /** @@ -159,52 +159,52 @@ export class StreamProcessor { */ private processChunk(chunk: StreamChunk): void { switch (chunk.type) { - case "text": - this.handleTextChunk(chunk.content, chunk.delta); - break; + case 'text': + this.handleTextChunk(chunk.content, chunk.delta) + break - case "tool-call-delta": - this.handleToolCallDelta(chunk.toolCallIndex!, chunk.toolCall!); - break; + case 'tool-call-delta': + this.handleToolCallDelta(chunk.toolCallIndex!, chunk.toolCall!) + break - case "done": + case 'done': // Response finished - complete any remaining tool calls - this.completeAllToolCalls(); - break; + this.completeAllToolCalls() + break - case "tool-result": + case 'tool-result': // Handle tool result chunk if (chunk.toolCallId && chunk.content !== undefined) { - const state: ToolResultState = chunk.error ? "error" : "complete"; + const state: ToolResultState = chunk.error ? 'error' : 'complete' this.handlers.onToolResultStateChange?.( chunk.toolCallId, - chunk.content || "", + chunk.content || '', state, - chunk.error - ); + chunk.error, + ) } - break; + break - case "approval-requested": + case 'approval-requested': this.handlers.onApprovalRequested?.( chunk.toolCallId!, chunk.toolName!, - chunk.input!, - chunk.approval!.id - ); - break; + chunk.input, + chunk.approval!.id, + ) + break - case "tool-input-available": + case 'tool-input-available': this.handlers.onToolInputAvailable?.( chunk.toolCallId!, chunk.toolName!, - chunk.input! - ); - break; + chunk.input, + ) + break - case "thinking": - this.handleThinkingChunk(chunk.content, chunk.delta); - break; + case 'thinking': + this.handleThinkingChunk(chunk.content, chunk.delta) + break } } @@ -219,40 +219,40 @@ export class StreamProcessor { */ private handleTextChunk(content?: string, delta?: string): void { // Text arriving means all current tool calls are complete - this.completeAllToolCalls(); + this.completeAllToolCalls() - const previous = this.textContent ?? ""; - let nextText = previous; + const previous = this.textContent + let nextText = previous // ALWAYS prefer delta - adapters should send deltas, not accumulated content // The processor maintains its own accumulation state - if (delta !== undefined && delta !== "") { - nextText = previous + delta; - } else if (content !== undefined && content !== "") { + if (delta !== undefined && delta !== '') { + nextText = previous + delta + } else if (content !== undefined && content !== '') { // Fallback: use content only if delta is not provided (backwards compatibility) // If it starts with what we have, it's an extension/update if (content.startsWith(previous)) { - nextText = content; + nextText = content } else if (previous.startsWith(content)) { // Previous is longer (shouldn't happen with proper adapters, but handle gracefully) - nextText = previous; + nextText = previous } else { // No overlap - append (shouldn't happen with proper adapters) - nextText = previous + content; + nextText = previous + content } } - this.textContent = nextText; + this.textContent = nextText // Use delta for chunk strategy if available, otherwise use content or empty string // This allows chunk strategies to make decisions based on the incremental change - const chunkPortion = delta ?? content ?? ""; + const chunkPortion = delta ?? content ?? '' const shouldEmit = this.chunkStrategy.shouldEmit( chunkPortion, - this.textContent - ); + this.textContent, + ) if (shouldEmit && this.textContent !== this.lastEmittedText) { - this.emitTextUpdate(); + this.emitTextUpdate() } } @@ -261,16 +261,16 @@ export class StreamProcessor { */ private handleToolCallDelta( index: number, - toolCall: { id: string; function: { name: string; arguments: string } } + toolCall: { id: string; function: { name: string; arguments: string } }, ): void { - const toolCallId = toolCall.id; - const existingToolCall = this.toolCalls.get(toolCallId); + const toolCallId = toolCall.id + const existingToolCall = this.toolCalls.get(toolCallId) if (!existingToolCall) { // New tool call starting const initialState: ToolCallState = toolCall.function.arguments - ? "input-streaming" - : "awaiting-input"; + ? 'input-streaming' + : 'awaiting-input' const newToolCall: InternalToolCallState = { id: toolCall.id, @@ -278,27 +278,27 @@ export class StreamProcessor { arguments: toolCall.function.arguments, state: initialState, parsedArguments: undefined, - }; + } // Try to parse the arguments if (toolCall.function.arguments) { newToolCall.parsedArguments = this.jsonParser.parse( - toolCall.function.arguments - ); + toolCall.function.arguments, + ) } - this.toolCalls.set(toolCallId, newToolCall); - this.toolCallOrder.push(toolCallId); // Track order + this.toolCalls.set(toolCallId, newToolCall) + this.toolCallOrder.push(toolCallId) // Track order // Get actual index for this tool call (based on order) - const actualIndex = this.toolCallOrder.indexOf(toolCallId); + const actualIndex = this.toolCallOrder.indexOf(toolCallId) // Emit lifecycle event this.handlers.onToolCallStart?.( actualIndex, toolCall.id, - toolCall.function.name - ); + toolCall.function.name, + ) // Emit state change event this.handlers.onToolCallStateChange?.( @@ -307,34 +307,34 @@ export class StreamProcessor { toolCall.function.name, initialState, toolCall.function.arguments, - newToolCall.parsedArguments - ); + newToolCall.parsedArguments, + ) // Emit initial delta if (toolCall.function.arguments) { this.handlers.onToolCallDelta?.( actualIndex, - toolCall.function.arguments - ); + toolCall.function.arguments, + ) } } else { // Continuing existing tool call - const wasAwaitingInput = existingToolCall.state === "awaiting-input"; + const wasAwaitingInput = existingToolCall.state === 'awaiting-input' - existingToolCall.arguments += toolCall.function.arguments; + existingToolCall.arguments += toolCall.function.arguments // Update state if (wasAwaitingInput && toolCall.function.arguments) { - existingToolCall.state = "input-streaming"; + existingToolCall.state = 'input-streaming' } // Try to parse the updated arguments existingToolCall.parsedArguments = this.jsonParser.parse( - existingToolCall.arguments - ); + existingToolCall.arguments, + ) // Get actual index for this tool call - const actualIndex = this.toolCallOrder.indexOf(toolCallId); + const actualIndex = this.toolCallOrder.indexOf(toolCallId) // Emit state change event this.handlers.onToolCallStateChange?.( @@ -343,15 +343,15 @@ export class StreamProcessor { existingToolCall.name, existingToolCall.state, existingToolCall.arguments, - existingToolCall.parsedArguments - ); + existingToolCall.parsedArguments, + ) // Emit delta if (toolCall.function.arguments) { this.handlers.onToolCallDelta?.( actualIndex, - toolCall.function.arguments - ); + toolCall.function.arguments, + ) } } } @@ -361,11 +361,11 @@ export class StreamProcessor { */ private completeAllToolCalls(): void { this.toolCalls.forEach((toolCall, id) => { - if (toolCall.state !== "input-complete") { - const index = this.toolCallOrder.indexOf(id); - this.completeToolCall(index, toolCall); + if (toolCall.state !== 'input-complete') { + const index = this.toolCallOrder.indexOf(id) + this.completeToolCall(index, toolCall) } - }); + }) } /** @@ -373,38 +373,38 @@ export class StreamProcessor { */ private completeToolCall( index: number, - toolCall: InternalToolCallState + toolCall: InternalToolCallState, ): void { - toolCall.state = "input-complete"; + toolCall.state = 'input-complete' // Try final parse - toolCall.parsedArguments = this.jsonParser.parse(toolCall.arguments); + toolCall.parsedArguments = this.jsonParser.parse(toolCall.arguments) // Emit state change event this.handlers.onToolCallStateChange?.( index, toolCall.id, toolCall.name, - "input-complete", + 'input-complete', toolCall.arguments, - toolCall.parsedArguments - ); + toolCall.parsedArguments, + ) // Emit complete event this.handlers.onToolCallComplete?.( index, toolCall.id, toolCall.name, - toolCall.arguments - ); + toolCall.arguments, + ) } /** * Emit pending text update */ private emitTextUpdate(): void { - this.lastEmittedText = this.textContent; - this.handlers.onTextUpdate?.(this.textContent); + this.lastEmittedText = this.textContent + this.handlers.onTextUpdate?.(this.textContent) } /** @@ -412,70 +412,70 @@ export class StreamProcessor { */ private finalizeStream(): void { // Complete any remaining tool calls - this.completeAllToolCalls(); + this.completeAllToolCalls() // Emit any pending text if not already emitted if (this.textContent !== this.lastEmittedText) { - this.emitTextUpdate(); + this.emitTextUpdate() } // Emit stream end - const toolCalls = this.getCompletedToolCalls(); + const toolCalls = this.getCompletedToolCalls() this.handlers.onStreamEnd?.( this.textContent, - toolCalls.length > 0 ? toolCalls : undefined - ); + toolCalls.length > 0 ? toolCalls : undefined, + ) } /** * Get completed tool calls in API format */ - private getCompletedToolCalls(): any[] { + private getCompletedToolCalls(): Array { return Array.from(this.toolCalls.values()) - .filter((tc) => tc.state === "input-complete") + .filter((tc) => tc.state === 'input-complete') .map((tc) => ({ id: tc.id, - type: "function", + type: 'function', function: { name: tc.name, arguments: tc.arguments, }, - })); + })) } /** * Handle a thinking chunk */ private handleThinkingChunk(content?: string, delta?: string): void { - const previous = this.thinkingContent ?? ""; - let nextThinking = previous; + const previous = this.thinkingContent + let nextThinking = previous // Prefer delta over content (same pattern as text chunks) - if (delta !== undefined && delta !== "") { - nextThinking = previous + delta; - } else if (content !== undefined && content !== "") { + if (delta !== undefined && delta !== '') { + nextThinking = previous + delta + } else if (content !== undefined && content !== '') { if (content.startsWith(previous)) { - nextThinking = content; + nextThinking = content } else if (previous.startsWith(content)) { - nextThinking = previous; + nextThinking = previous } else { - nextThinking = previous + content; + nextThinking = previous + content } } - this.thinkingContent = nextThinking; - this.handlers.onThinkingUpdate?.(this.thinkingContent); + this.thinkingContent = nextThinking + this.handlers.onThinkingUpdate?.(this.thinkingContent) } /** * Reset processor state */ private reset(): void { - this.textContent = ""; - this.lastEmittedText = ""; - this.thinkingContent = ""; - this.toolCalls.clear(); - this.toolCallOrder = []; - this.chunkStrategy.reset?.(); + this.textContent = '' + this.lastEmittedText = '' + this.thinkingContent = '' + this.toolCalls.clear() + this.toolCallOrder = [] + this.chunkStrategy.reset?.() } } diff --git a/packages/typescript/ai-client/src/stream/types.ts b/packages/typescript/ai-client/src/stream/types.ts index e3b454c54..2960b3909 100644 --- a/packages/typescript/ai-client/src/stream/types.ts +++ b/packages/typescript/ai-client/src/stream/types.ts @@ -8,68 +8,68 @@ * - Partial JSON parsing for incomplete tool arguments */ -import type { ToolCallState as ToolState, ToolResultState } from "../types"; +import type { ToolResultState, ToolCallState as ToolState } from '../types' /** * Raw events that come from the stream */ export interface StreamChunk { type: - | "text" - | "tool-call-delta" - | "done" - | "approval-requested" - | "tool-input-available" - | "tool-result" - | "thinking"; - content?: string; - delta?: string; - toolCallIndex?: number; + | 'text' + | 'tool-call-delta' + | 'done' + | 'approval-requested' + | 'tool-input-available' + | 'tool-result' + | 'thinking' + content?: string + delta?: string + toolCallIndex?: number toolCall?: { - id: string; + id: string function: { - name: string; - arguments: string; - }; - }; + name: string + arguments: string + } + } // For approval-requested approval?: { - id: string; - needsApproval: boolean; - }; + id: string + needsApproval: boolean + } // For tool-input-available and approval-requested - toolCallId?: string; - toolName?: string; - input?: any; + toolCallId?: string + toolName?: string + input?: any // For tool-result - error?: string; + error?: string } /** * Processed events emitted by the StreamProcessor */ export type ProcessedEvent = - | { type: "text-chunk"; content: string } - | { type: "text-update"; content: string } // Emitted based on chunk strategy + | { type: 'text-chunk'; content: string } + | { type: 'text-update'; content: string } // Emitted based on chunk strategy | { - type: "tool-call-start"; - index: number; - id: string; - name: string; + type: 'tool-call-start' + index: number + id: string + name: string } | { - type: "tool-call-delta"; - index: number; - arguments: string; + type: 'tool-call-delta' + index: number + arguments: string } | { - type: "tool-call-complete"; - index: number; - id: string; - name: string; - arguments: string; + type: 'tool-call-complete' + index: number + id: string + name: string + arguments: string } - | { type: "stream-end"; finalContent: string; toolCalls?: any[] }; + | { type: 'stream-end'; finalContent: string; toolCalls?: Array } /** * Strategy for determining when to emit text updates @@ -81,19 +81,19 @@ export interface ChunkStrategy { * @param accumulated - All text accumulated so far * @returns true if an update should be emitted now */ - shouldEmit(chunk: string, accumulated: string): boolean; + shouldEmit: (chunk: string, accumulated: string) => boolean /** * Optional: Reset strategy state (called when streaming starts) */ - reset?(): void; + reset?: () => void } /** * Handlers for processed stream events */ export interface StreamProcessorHandlers { - onTextUpdate?: (content: string) => void; + onTextUpdate?: (content: string) => void // Enhanced tool call handlers with state tracking onToolCallStateChange?: ( @@ -102,38 +102,38 @@ export interface StreamProcessorHandlers { name: string, state: ToolState, args: string, - parsedArgs?: any - ) => void; + parsedArgs?: any, + ) => void onToolResultStateChange?: ( toolCallId: string, content: string, state: ToolResultState, - error?: string - ) => void; + error?: string, + ) => void // Additional handlers for detailed lifecycle events - onToolCallStart?: (index: number, id: string, name: string) => void; - onToolCallDelta?: (index: number, args: string) => void; + onToolCallStart?: (index: number, id: string, name: string) => void + onToolCallDelta?: (index: number, args: string) => void onToolCallComplete?: ( index: number, id: string, name: string, - args: string - ) => void; + args: string, + ) => void onApprovalRequested?: ( toolCallId: string, toolName: string, input: any, - approvalId: string - ) => void; + approvalId: string, + ) => void onToolInputAvailable?: ( toolCallId: string, toolName: string, - input: any - ) => void; - onThinkingUpdate?: (content: string) => void; - onStreamEnd?: (content: string, toolCalls?: any[]) => void; + input: any, + ) => void + onThinkingUpdate?: (content: string) => void + onStreamEnd?: (content: string, toolCalls?: Array) => void } /** @@ -141,28 +141,28 @@ export interface StreamProcessorHandlers { * Allows users to provide their own parsing logic if needed */ export interface StreamParser { - parse(stream: AsyncIterable): AsyncIterable; + parse: (stream: AsyncIterable) => AsyncIterable } /** * Options for StreamProcessor */ export interface StreamProcessorOptions { - chunkStrategy?: ChunkStrategy; - parser?: StreamParser; - handlers: StreamProcessorHandlers; + chunkStrategy?: ChunkStrategy + parser?: StreamParser + handlers: StreamProcessorHandlers jsonParser?: { - parse(jsonString: string): any; - }; + parse: (jsonString: string) => any + } } /** * Internal state for a tool call being tracked */ export interface InternalToolCallState { - id: string; - name: string; - arguments: string; - state: ToolState; - parsedArguments?: any; // Parsed (potentially incomplete) JSON + id: string + name: string + arguments: string + state: ToolState + parsedArguments?: any // Parsed (potentially incomplete) JSON } diff --git a/packages/typescript/ai-client/src/types.ts b/packages/typescript/ai-client/src/types.ts index e3fc1207a..9db8ed594 100644 --- a/packages/typescript/ai-client/src/types.ts +++ b/packages/typescript/ai-client/src/types.ts @@ -1,77 +1,77 @@ -import type { ModelMessage, StreamChunk } from "@tanstack/ai"; -import type { ConnectionAdapter } from "./connection-adapters"; -import type { ChunkStrategy, StreamParser } from "./stream/types"; +import type { ModelMessage, StreamChunk } from '@tanstack/ai' +import type { ConnectionAdapter } from './connection-adapters' +import type { ChunkStrategy, StreamParser } from './stream/types' /** * Tool call states - track the lifecycle of a tool call */ export type ToolCallState = - | "awaiting-input" // Received start but no arguments yet - | "input-streaming" // Partial arguments received - | "input-complete" // All arguments received - | "approval-requested" // Waiting for user approval - | "approval-responded"; // User has approved/denied + | 'awaiting-input' // Received start but no arguments yet + | 'input-streaming' // Partial arguments received + | 'input-complete' // All arguments received + | 'approval-requested' // Waiting for user approval + | 'approval-responded' // User has approved/denied /** * Tool result states - track the lifecycle of a tool result */ export type ToolResultState = - | "streaming" // Placeholder for future streamed output - | "complete" // Result is complete - | "error"; // Error occurred + | 'streaming' // Placeholder for future streamed output + | 'complete' // Result is complete + | 'error' // Error occurred /** * Message parts - building blocks of UIMessage */ export interface TextPart { - type: "text"; - content: string; + type: 'text' + content: string } export interface ToolCallPart { - type: "tool-call"; - id: string; - name: string; - arguments: string; // JSON string (may be incomplete) - state: ToolCallState; + type: 'tool-call' + id: string + name: string + arguments: string // JSON string (may be incomplete) + state: ToolCallState /** Approval metadata if tool requires user approval */ approval?: { - id: string; // Unique approval ID - needsApproval: boolean; // Always true if present - approved?: boolean; // User's decision (undefined until responded) - }; + id: string // Unique approval ID + needsApproval: boolean // Always true if present + approved?: boolean // User's decision (undefined until responded) + } /** Tool execution output (for client tools or after approval) */ - output?: any; + output?: any } export interface ToolResultPart { - type: "tool-result"; - toolCallId: string; - content: string; - state: ToolResultState; - error?: string; // Error message if state is "error" + type: 'tool-result' + toolCallId: string + content: string + state: ToolResultState + error?: string // Error message if state is "error" } export interface ThinkingPart { - type: "thinking"; - content: string; + type: 'thinking' + content: string } export type MessagePart = | TextPart | ToolCallPart | ToolResultPart - | ThinkingPart; + | ThinkingPart /** * UIMessage - Domain-specific message format optimized for building chat UIs * Contains parts that can be text, tool calls, or tool results */ export interface UIMessage { - id: string; - role: "system" | "user" | "assistant"; - parts: MessagePart[]; - createdAt?: Date; + id: string + role: 'system' | 'user' | 'assistant' + parts: Array + createdAt?: Date } export interface ChatClientOptions { @@ -79,68 +79,68 @@ export interface ChatClientOptions { * Connection adapter for streaming * Use fetchServerSentEvents(), fetchHttpStream(), or stream() to create adapters */ - connection: ConnectionAdapter; + connection: ConnectionAdapter /** * Initial messages to populate the chat */ - initialMessages?: UIMessage[]; + initialMessages?: Array /** * Unique identifier for this chat instance * Used for managing multiple chats */ - id?: string; + id?: string /** * Additional body parameters to send */ - body?: Record; + body?: Record /** * Callback when a response is received */ - onResponse?: (response?: Response) => void | Promise; + onResponse?: (response?: Response) => void | Promise /** * Callback when a stream chunk is received */ - onChunk?: (chunk: StreamChunk) => void; + onChunk?: (chunk: StreamChunk) => void /** * Callback when the response is finished */ - onFinish?: (message: UIMessage) => void; + onFinish?: (message: UIMessage) => void /** * Callback when an error occurs */ - onError?: (error: Error) => void; + onError?: (error: Error) => void /** * Callback when messages change */ - onMessagesChange?: (messages: UIMessage[]) => void; + onMessagesChange?: (messages: Array) => void /** * Callback when loading state changes */ - onLoadingChange?: (isLoading: boolean) => void; + onLoadingChange?: (isLoading: boolean) => void /** * Callback when error state changes */ - onErrorChange?: (error: Error | undefined) => void; + onErrorChange?: (error: Error | undefined) => void /** * Callback when a client-side tool needs to be executed * Tool has no execute function - client must provide the result */ onToolCall?: (args: { - toolCallId: string; - toolName: string; - input: any; - }) => Promise; + toolCallId: string + toolName: string + input: any + }) => Promise /** * Stream processing options (optional) @@ -151,17 +151,17 @@ export interface ChatClientOptions { * Strategy for when to emit text updates * Defaults to ImmediateStrategy (every chunk) */ - chunkStrategy?: ChunkStrategy; + chunkStrategy?: ChunkStrategy /** * Custom stream parser * Override to handle different stream formats */ - parser?: StreamParser; - }; + parser?: StreamParser + } } export interface ChatRequestBody { - messages: ModelMessage[]; - data?: Record; + messages: Array + data?: Record } diff --git a/packages/typescript/ai-client/tests/chat-client-abort.test.ts b/packages/typescript/ai-client/tests/chat-client-abort.test.ts index 7527a4ef4..f44058f1c 100644 --- a/packages/typescript/ai-client/tests/chat-client-abort.test.ts +++ b/packages/typescript/ai-client/tests/chat-client-abort.test.ts @@ -1,238 +1,313 @@ -import { describe, it, expect, vi, beforeEach } from "vitest"; -import { ChatClient } from "../src/chat-client"; -import type { ConnectionAdapter, StreamChunk } from "../src/connection-adapters"; -import type { UIMessage } from "../src/types"; +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { ChatClient } from '../src/chat-client' +import type { ConnectionAdapter, StreamChunk } from '../src/connection-adapters' +import type { UIMessage } from '../src/types' -describe("ChatClient - Abort Signal Handling", () => { - let mockAdapter: ConnectionAdapter; - let receivedAbortSignal: AbortSignal | undefined; +describe('ChatClient - Abort Signal Handling', () => { + let mockAdapter: ConnectionAdapter + let receivedAbortSignal: AbortSignal | undefined beforeEach(() => { - receivedAbortSignal = undefined; - + receivedAbortSignal = undefined + mockAdapter = { async *connect(messages, data, abortSignal) { - receivedAbortSignal = abortSignal; - + receivedAbortSignal = abortSignal + // Simulate streaming chunks - yield { type: "content", id: "1", model: "test", timestamp: Date.now(), delta: "Hello", content: "Hello", role: "assistant" }; - yield { type: "content", id: "1", model: "test", timestamp: Date.now(), delta: " World", content: "Hello World", role: "assistant" }; - yield { type: "done", id: "1", model: "test", timestamp: Date.now(), finishReason: "stop" }; + yield { + type: 'content', + id: '1', + model: 'test', + timestamp: Date.now(), + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } + yield { + type: 'content', + id: '1', + model: 'test', + timestamp: Date.now(), + delta: ' World', + content: 'Hello World', + role: 'assistant', + } + yield { + type: 'done', + id: '1', + model: 'test', + timestamp: Date.now(), + finishReason: 'stop', + } }, - }; - }); + } + }) - it("should create AbortController and pass signal to adapter", async () => { + it('should create AbortController and pass signal to adapter', async () => { const client = new ChatClient({ connection: mockAdapter, - }); + }) const appendPromise = client.append({ - id: "user-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'user-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }); + }) // Wait a bit to ensure connect is called - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => setTimeout(resolve, 10)) - expect(receivedAbortSignal).toBeDefined(); - expect(receivedAbortSignal).toBeInstanceOf(AbortSignal); - expect(receivedAbortSignal?.aborted).toBe(false); + expect(receivedAbortSignal).toBeDefined() + expect(receivedAbortSignal).toBeInstanceOf(AbortSignal) + expect(receivedAbortSignal?.aborted).toBe(false) - await appendPromise; - }); + await appendPromise + }) + + it('should abort request when stop() is called', async () => { + let abortControllerRef: AbortController | null = null - it("should abort request when stop() is called", async () => { - let abortControllerRef: AbortController | null = null; - const adapterWithAbort: ConnectionAdapter = { async *connect(messages, data, abortSignal) { - abortControllerRef = new AbortController(); + abortControllerRef = new AbortController() if (abortSignal) { - abortSignal.addEventListener("abort", () => { - abortControllerRef?.abort(); - }); + abortSignal.addEventListener('abort', () => { + abortControllerRef?.abort() + }) } try { - yield { type: "content", id: "1", model: "test", timestamp: Date.now(), delta: "Hello", content: "Hello", role: "assistant" }; + yield { + type: 'content', + id: '1', + model: 'test', + timestamp: Date.now(), + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } // Simulate long-running stream - await new Promise((resolve) => setTimeout(resolve, 100)); - yield { type: "content", id: "1", model: "test", timestamp: Date.now(), delta: " World", content: "Hello World", role: "assistant" }; + await new Promise((resolve) => setTimeout(resolve, 100)) + yield { + type: 'content', + id: '1', + model: 'test', + timestamp: Date.now(), + delta: ' World', + content: 'Hello World', + role: 'assistant', + } } catch (err) { // Abort errors are expected - if (err instanceof Error && err.name === "AbortError") { - return; + if (err instanceof Error && err.name === 'AbortError') { + return } - throw err; + throw err } }, - }; + } const client = new ChatClient({ connection: adapterWithAbort, - }); + }) const appendPromise = client.append({ - id: "user-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'user-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }); + }) // Wait a bit then stop - await new Promise((resolve) => setTimeout(resolve, 10)); - client.stop(); + await new Promise((resolve) => setTimeout(resolve, 10)) + client.stop() - await appendPromise; + await appendPromise - expect(client.getIsLoading()).toBe(false); - }); + expect(client.getIsLoading()).toBe(false) + }) - it("should preserve partial content when aborted", async () => { - const chunks: StreamChunk[] = []; - let yieldedChunks = 0; + it('should preserve partial content when aborted', async () => { + const chunks: StreamChunk[] = [] + let yieldedChunks = 0 const adapterWithPartial: ConnectionAdapter = { async *connect(messages, data, abortSignal) { - yield { type: "content", id: "1", model: "test", timestamp: Date.now(), delta: "Hello", content: "Hello", role: "assistant" }; - yieldedChunks++; - + yield { + type: 'content', + id: '1', + model: 'test', + timestamp: Date.now(), + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } + yieldedChunks++ + if (abortSignal?.aborted) { - return; + return } - yield { type: "content", id: "1", model: "test", timestamp: Date.now(), delta: " World", content: "Hello World", role: "assistant" }; - yieldedChunks++; + yield { + type: 'content', + id: '1', + model: 'test', + timestamp: Date.now(), + delta: ' World', + content: 'Hello World', + role: 'assistant', + } + yieldedChunks++ }, - }; + } const client = new ChatClient({ connection: adapterWithPartial, onChunk: (chunk) => { - chunks.push(chunk); + chunks.push(chunk) }, - }); + }) const appendPromise = client.append({ - id: "user-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'user-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }); + }) // Wait for first chunk then abort - await new Promise((resolve) => setTimeout(resolve, 10)); - client.stop(); + await new Promise((resolve) => setTimeout(resolve, 10)) + client.stop() - await appendPromise; + await appendPromise // Should have received at least one chunk before abort - expect(chunks.length).toBeGreaterThan(0); - expect(client.getMessages().length).toBeGreaterThan(0); - }); + expect(chunks.length).toBeGreaterThan(0) + expect(client.getMessages().length).toBeGreaterThan(0) + }) + + it('should handle abort gracefully without throwing error', async () => { + const errorSpy = vi.fn() - it("should handle abort gracefully without throwing error", async () => { - const errorSpy = vi.fn(); - const adapterWithAbort: ConnectionAdapter = { async *connect(messages, data, abortSignal) { - yield { type: "content", id: "1", model: "test", timestamp: Date.now(), delta: "Hello", content: "Hello", role: "assistant" }; - + yield { + type: 'content', + id: '1', + model: 'test', + timestamp: Date.now(), + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } + if (abortSignal?.aborted) { - return; + return } }, - }; + } const client = new ChatClient({ connection: adapterWithAbort, onError: errorSpy, - }); + }) const appendPromise = client.append({ - id: "user-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'user-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }); + }) - await new Promise((resolve) => setTimeout(resolve, 10)); - client.stop(); + await new Promise((resolve) => setTimeout(resolve, 10)) + client.stop() - await appendPromise; + await appendPromise // Should not have called onError for abort - expect(errorSpy).not.toHaveBeenCalled(); - expect(client.getError()).toBeUndefined(); - }); + expect(errorSpy).not.toHaveBeenCalled() + expect(client.getError()).toBeUndefined() + }) - it("should set isLoading to false after abort", async () => { + it('should set isLoading to false after abort', async () => { const adapterWithAbort: ConnectionAdapter = { async *connect(messages, data, abortSignal) { - yield { type: "content", id: "1", model: "test", timestamp: Date.now(), delta: "Hello", content: "Hello", role: "assistant" }; - await new Promise((resolve) => setTimeout(resolve, 50)); + yield { + type: 'content', + id: '1', + model: 'test', + timestamp: Date.now(), + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } + await new Promise((resolve) => setTimeout(resolve, 50)) }, - }; + } const client = new ChatClient({ connection: adapterWithAbort, - }); + }) const appendPromise = client.append({ - id: "user-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'user-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }); + }) - expect(client.getIsLoading()).toBe(true); + expect(client.getIsLoading()).toBe(true) - await new Promise((resolve) => setTimeout(resolve, 10)); - client.stop(); + await new Promise((resolve) => setTimeout(resolve, 10)) + client.stop() - await appendPromise; + await appendPromise - expect(client.getIsLoading()).toBe(false); - }); + expect(client.getIsLoading()).toBe(false) + }) - it("should create new AbortController for each request", async () => { - const abortSignals: AbortSignal[] = []; + it('should create new AbortController for each request', async () => { + const abortSignals: AbortSignal[] = [] const adapter: ConnectionAdapter = { async *connect(messages, data, abortSignal) { if (abortSignal) { - abortSignals.push(abortSignal); + abortSignals.push(abortSignal) + } + yield { + type: 'done', + id: '1', + model: 'test', + timestamp: Date.now(), + finishReason: 'stop', } - yield { type: "done", id: "1", model: "test", timestamp: Date.now(), finishReason: "stop" }; }, - }; + } const client = new ChatClient({ connection: adapter, - }); + }) // First request await client.append({ - id: "user-1", - role: "user", - parts: [{ type: "text", content: "Hello 1" }], + id: 'user-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello 1' }], createdAt: new Date(), - }); + }) // Second request await client.append({ - id: "user-2", - role: "user", - parts: [{ type: "text", content: "Hello 2" }], + id: 'user-2', + role: 'user', + parts: [{ type: 'text', content: 'Hello 2' }], createdAt: new Date(), - }); + }) - expect(abortSignals.length).toBe(2); + expect(abortSignals.length).toBe(2) // Each should be a different signal instance - expect(abortSignals[0]).not.toBe(abortSignals[1]); - }); -}); - + expect(abortSignals[0]).not.toBe(abortSignals[1]) + }) +}) diff --git a/packages/typescript/ai-client/tests/chat-client.test.ts b/packages/typescript/ai-client/tests/chat-client.test.ts index 3c6081a67..bd986c71a 100644 --- a/packages/typescript/ai-client/tests/chat-client.test.ts +++ b/packages/typescript/ai-client/tests/chat-client.test.ts @@ -1,582 +1,580 @@ -import { describe, it, expect, vi } from "vitest"; -import { ChatClient } from "../src/chat-client"; +import { describe, it, expect, vi } from 'vitest' +import { ChatClient } from '../src/chat-client' import { createMockConnectionAdapter, createTextChunks, createToolCallChunks, -} from "./test-utils"; -import type { UIMessage } from "../src/types"; - -describe("ChatClient", () => { - describe("constructor", () => { - it("should create a client with default options", () => { - const adapter = createMockConnectionAdapter(); - const client = new ChatClient({ connection: adapter }); - - expect(client.getMessages()).toEqual([]); - expect(client.getIsLoading()).toBe(false); - expect(client.getError()).toBeUndefined(); - }); - - it("should initialize with provided messages", () => { - const adapter = createMockConnectionAdapter(); +} from './test-utils' +import type { UIMessage } from '../src/types' + +describe('ChatClient', () => { + describe('constructor', () => { + it('should create a client with default options', () => { + const adapter = createMockConnectionAdapter() + const client = new ChatClient({ connection: adapter }) + + expect(client.getMessages()).toEqual([]) + expect(client.getIsLoading()).toBe(false) + expect(client.getError()).toBeUndefined() + }) + + it('should initialize with provided messages', () => { + const adapter = createMockConnectionAdapter() const initialMessages: UIMessage[] = [ { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), }, - ]; + ] const client = new ChatClient({ connection: adapter, initialMessages, - }); + }) - expect(client.getMessages()).toEqual(initialMessages); - }); + expect(client.getMessages()).toEqual(initialMessages) + }) - it("should use provided id or generate one", async () => { + it('should use provided id or generate one', async () => { const adapter = createMockConnectionAdapter({ - chunks: createTextChunks("Response"), - }); + chunks: createTextChunks('Response'), + }) const client1 = new ChatClient({ connection: adapter, - id: "custom-id", - }); + id: 'custom-id', + }) const client2 = new ChatClient({ connection: adapter, - }); + }) // Message IDs are generated using the client's uniqueId as prefix // Format: `${this.uniqueId}-${Date.now()}-${random}` // So we can verify the custom ID is used by checking message ID format - await client1.sendMessage("Test"); - await client2.sendMessage("Test"); + await client1.sendMessage('Test') + await client2.sendMessage('Test') - const messages1 = client1.getMessages(); - const messages2 = client2.getMessages(); + const messages1 = client1.getMessages() + const messages2 = client2.getMessages() // Both should have messages - expect(messages1.length).toBeGreaterThan(0); - expect(messages2.length).toBeGreaterThan(0); + expect(messages1.length).toBeGreaterThan(0) + expect(messages2.length).toBeGreaterThan(0) // Message IDs from client1 should start with "custom-id-" - const client1MessageId = messages1[0].id; - expect(client1MessageId).toMatch(/^custom-id-/); + const client1MessageId = messages1[0].id + expect(client1MessageId).toMatch(/^custom-id-/) // Message IDs from client2 should NOT start with "custom-id-" // (they'll have a generated ID like "chat-...") - const client2MessageId = messages2[0].id; - expect(client2MessageId).not.toMatch(/^custom-id-/); - expect(client2MessageId).toMatch(/^chat-/); - }); - }); + const client2MessageId = messages2[0].id + expect(client2MessageId).not.toMatch(/^custom-id-/) + expect(client2MessageId).toMatch(/^chat-/) + }) + }) - describe("sendMessage", () => { - it("should send a message and append it", async () => { - const chunks = createTextChunks("Hello, world!"); - const adapter = createMockConnectionAdapter({ chunks }); + describe('sendMessage', () => { + it('should send a message and append it', async () => { + const chunks = createTextChunks('Hello, world!') + const adapter = createMockConnectionAdapter({ chunks }) - const client = new ChatClient({ connection: adapter }); + const client = new ChatClient({ connection: adapter }) - await client.sendMessage("Hello"); + await client.sendMessage('Hello') - const messages = client.getMessages(); - expect(messages.length).toBeGreaterThan(0); - expect(messages[0].role).toBe("user"); + const messages = client.getMessages() + expect(messages.length).toBeGreaterThan(0) + expect(messages[0].role).toBe('user') expect(messages[0].parts[0]).toEqual({ - type: "text", - content: "Hello", - }); - }); + type: 'text', + content: 'Hello', + }) + }) - it("should create and return assistant message from stream chunks", async () => { - const chunks = createTextChunks("Hello, world!"); - const adapter = createMockConnectionAdapter({ chunks }); + it('should create and return assistant message from stream chunks', async () => { + const chunks = createTextChunks('Hello, world!') + const adapter = createMockConnectionAdapter({ chunks }) - const client = new ChatClient({ connection: adapter }); + const client = new ChatClient({ connection: adapter }) - await client.sendMessage("Hello"); + await client.sendMessage('Hello') - const messages = client.getMessages(); + const messages = client.getMessages() // Should have both user and assistant messages - expect(messages.length).toBeGreaterThanOrEqual(2); + expect(messages.length).toBeGreaterThanOrEqual(2) // Find the assistant message created from chunks - const assistantMessage = messages.find((m) => m.role === "assistant"); - expect(assistantMessage).toBeDefined(); + const assistantMessage = messages.find((m) => m.role === 'assistant') + expect(assistantMessage).toBeDefined() if (assistantMessage) { // Verify the assistant message is readable and has content - expect(assistantMessage.id).toBeTruthy(); - expect(assistantMessage.createdAt).toBeInstanceOf(Date); - expect(assistantMessage.parts.length).toBeGreaterThan(0); + expect(assistantMessage.id).toBeTruthy() + expect(assistantMessage.createdAt).toBeInstanceOf(Date) + expect(assistantMessage.parts.length).toBeGreaterThan(0) // Verify it has text content from the chunks - const textPart = assistantMessage.parts.find((p) => p.type === "text"); - expect(textPart).toBeDefined(); - if (textPart && textPart.type === "text") { - expect(textPart.content).toBe("Hello, world!"); + const textPart = assistantMessage.parts.find((p) => p.type === 'text') + expect(textPart).toBeDefined() + if (textPart && textPart.type === 'text') { + expect(textPart.content).toBe('Hello, world!') } } - }); + }) - it("should not send empty messages", async () => { - const adapter = createMockConnectionAdapter(); - const client = new ChatClient({ connection: adapter }); + it('should not send empty messages', async () => { + const adapter = createMockConnectionAdapter() + const client = new ChatClient({ connection: adapter }) - await client.sendMessage(""); - await client.sendMessage(" "); + await client.sendMessage('') + await client.sendMessage(' ') - expect(client.getMessages().length).toBe(0); - }); + expect(client.getMessages().length).toBe(0) + }) - it("should not send message while loading", async () => { + it('should not send message while loading', async () => { const adapter = createMockConnectionAdapter({ - chunks: createTextChunks("Response"), + chunks: createTextChunks('Response'), chunkDelay: 100, - }); - const client = new ChatClient({ connection: adapter }); + }) + const client = new ChatClient({ connection: adapter }) - const promise1 = client.sendMessage("First"); - const promise2 = client.sendMessage("Second"); + const promise1 = client.sendMessage('First') + const promise2 = client.sendMessage('Second') - await Promise.all([promise1, promise2]); + await Promise.all([promise1, promise2]) // Should only have one user message since second was blocked - const userMessages = client - .getMessages() - .filter((m) => m.role === "user"); - expect(userMessages.length).toBe(1); - }); - }); - - describe("append", () => { - it("should append a UIMessage", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const client = new ChatClient({ connection: adapter }); + const userMessages = client.getMessages().filter((m) => m.role === 'user') + expect(userMessages.length).toBe(1) + }) + }) + + describe('append', () => { + it('should append a UIMessage', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const client = new ChatClient({ connection: adapter }) const message: UIMessage = { - id: "user-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'user-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }; + } - await client.append(message); + await client.append(message) - const messages = client.getMessages(); - expect(messages.length).toBeGreaterThan(0); - expect(messages[0].id).toBe("user-1"); - }); + const messages = client.getMessages() + expect(messages.length).toBeGreaterThan(0) + expect(messages[0].id).toBe('user-1') + }) - it("should convert and append a ModelMessage", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const client = new ChatClient({ connection: adapter }); + it('should convert and append a ModelMessage', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const client = new ChatClient({ connection: adapter }) await client.append({ - role: "user", - content: "Hello from model", - }); + role: 'user', + content: 'Hello from model', + }) - const messages = client.getMessages(); - expect(messages.length).toBeGreaterThan(0); - expect(messages[0].role).toBe("user"); + const messages = client.getMessages() + expect(messages.length).toBeGreaterThan(0) + expect(messages[0].role).toBe('user') expect(messages[0].parts[0]).toEqual({ - type: "text", - content: "Hello from model", - }); - }); + type: 'text', + content: 'Hello from model', + }) + }) - it("should generate id and createdAt if missing", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const client = new ChatClient({ connection: adapter }); + it('should generate id and createdAt if missing', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const client = new ChatClient({ connection: adapter }) const message: UIMessage = { - id: "", - role: "user", - parts: [{ type: "text", content: "Hello" }], - }; + id: '', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], + } - await client.append(message); + await client.append(message) - const messages = client.getMessages(); - expect(messages[0].id).toBeTruthy(); - expect(messages[0].createdAt).toBeInstanceOf(Date); - }); - }); + const messages = client.getMessages() + expect(messages[0].id).toBeTruthy() + expect(messages[0].createdAt).toBeInstanceOf(Date) + }) + }) - describe("reload", () => { - it("should reload from last user message", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const client = new ChatClient({ connection: adapter }); + describe('reload', () => { + it('should reload from last user message', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const client = new ChatClient({ connection: adapter }) - await client.sendMessage("First"); - await client.sendMessage("Second"); + await client.sendMessage('First') + await client.sendMessage('Second') - await client.reload(); + await client.reload() // After reload, messages after the last user message are removed // Then the last user message is resent, which triggers a new assistant response - const messagesAfter = client.getMessages(); + const messagesAfter = client.getMessages() // Should have the same user messages, plus a new assistant response - const userMessagesAfter = messagesAfter.filter((m) => m.role === "user"); - expect(userMessagesAfter.length).toBeGreaterThanOrEqual(2); + const userMessagesAfter = messagesAfter.filter((m) => m.role === 'user') + expect(userMessagesAfter.length).toBeGreaterThanOrEqual(2) // The last user message should match what was resent const lastUserMessageAfter = - userMessagesAfter[userMessagesAfter.length - 1]; + userMessagesAfter[userMessagesAfter.length - 1] expect(lastUserMessageAfter.parts[0]).toEqual({ - type: "text", - content: "Second", - }); - }); + type: 'text', + content: 'Second', + }) + }) - it("should do nothing if no user messages", async () => { - const adapter = createMockConnectionAdapter(); - const client = new ChatClient({ connection: adapter }); + it('should do nothing if no user messages', async () => { + const adapter = createMockConnectionAdapter() + const client = new ChatClient({ connection: adapter }) - await client.reload(); + await client.reload() - expect(client.getMessages().length).toBe(0); - }); + expect(client.getMessages().length).toBe(0) + }) - it("should do nothing if messages array is empty", async () => { - const adapter = createMockConnectionAdapter(); - const client = new ChatClient({ connection: adapter }); + it('should do nothing if messages array is empty', async () => { + const adapter = createMockConnectionAdapter() + const client = new ChatClient({ connection: adapter }) - await client.reload(); + await client.reload() - expect(client.getMessages().length).toBe(0); - }); - }); + expect(client.getMessages().length).toBe(0) + }) + }) - describe("stop", () => { - it("should stop loading and abort request", async () => { - const chunks = createTextChunks("Long response that takes time"); + describe('stop', () => { + it('should stop loading and abort request', async () => { + const chunks = createTextChunks('Long response that takes time') const adapter = createMockConnectionAdapter({ chunks, chunkDelay: 50, - }); - const client = new ChatClient({ connection: adapter }); + }) + const client = new ChatClient({ connection: adapter }) const appendPromise = client.append({ - role: "user", - content: "Hello", - }); + role: 'user', + content: 'Hello', + }) // Wait a bit then stop - await new Promise((resolve) => setTimeout(resolve, 10)); - client.stop(); + await new Promise((resolve) => setTimeout(resolve, 10)) + client.stop() - await appendPromise; + await appendPromise - expect(client.getIsLoading()).toBe(false); - }); - }); + expect(client.getIsLoading()).toBe(false) + }) + }) - describe("clear", () => { - it("should clear all messages", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const client = new ChatClient({ connection: adapter }); + describe('clear', () => { + it('should clear all messages', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const client = new ChatClient({ connection: adapter }) - await client.sendMessage("Hello"); + await client.sendMessage('Hello') - expect(client.getMessages().length).toBeGreaterThan(0); + expect(client.getMessages().length).toBeGreaterThan(0) - client.clear(); + client.clear() - expect(client.getMessages().length).toBe(0); - expect(client.getError()).toBeUndefined(); - }); - }); + expect(client.getMessages().length).toBe(0) + expect(client.getError()).toBeUndefined() + }) + }) - describe("callbacks", () => { - it("should call onMessagesChange when messages update", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const onMessagesChange = vi.fn(); + describe('callbacks', () => { + it('should call onMessagesChange when messages update', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const onMessagesChange = vi.fn() const client = new ChatClient({ connection: adapter, onMessagesChange, - }); + }) - await client.sendMessage("Hello"); + await client.sendMessage('Hello') - expect(onMessagesChange).toHaveBeenCalled(); - expect(onMessagesChange.mock.calls.length).toBeGreaterThan(0); - }); + expect(onMessagesChange).toHaveBeenCalled() + expect(onMessagesChange.mock.calls.length).toBeGreaterThan(0) + }) - it("should call onLoadingChange when loading state changes", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const onLoadingChange = vi.fn(); + it('should call onLoadingChange when loading state changes', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const onLoadingChange = vi.fn() const client = new ChatClient({ connection: adapter, onLoadingChange, - }); + }) - const promise = client.sendMessage("Hello"); + const promise = client.sendMessage('Hello') // Should be called with true - expect(onLoadingChange).toHaveBeenCalledWith(true); + expect(onLoadingChange).toHaveBeenCalledWith(true) - await promise; + await promise // Should be called with false - expect(onLoadingChange).toHaveBeenCalledWith(false); - }); + expect(onLoadingChange).toHaveBeenCalledWith(false) + }) - it("should call onChunk for each chunk", async () => { - const chunks = createTextChunks("Hello"); - const adapter = createMockConnectionAdapter({ chunks }); - const onChunk = vi.fn(); + it('should call onChunk for each chunk', async () => { + const chunks = createTextChunks('Hello') + const adapter = createMockConnectionAdapter({ chunks }) + const onChunk = vi.fn() const client = new ChatClient({ connection: adapter, onChunk, - }); + }) - await client.sendMessage("Hello"); + await client.sendMessage('Hello') - expect(onChunk).toHaveBeenCalled(); - expect(onChunk.mock.calls.length).toBeGreaterThan(0); - }); + expect(onChunk).toHaveBeenCalled() + expect(onChunk.mock.calls.length).toBeGreaterThan(0) + }) - it("should call onFinish when stream completes", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const onFinish = vi.fn(); + it('should call onFinish when stream completes', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const onFinish = vi.fn() const client = new ChatClient({ connection: adapter, onFinish, - }); + }) - await client.sendMessage("Hello"); + await client.sendMessage('Hello') - expect(onFinish).toHaveBeenCalled(); - const finishCall = onFinish.mock.calls[0][0]; - expect(finishCall.role).toBe("assistant"); - }); + expect(onFinish).toHaveBeenCalled() + const finishCall = onFinish.mock.calls[0][0] + expect(finishCall.role).toBe('assistant') + }) - it("should call onError when error occurs", async () => { - const error = new Error("Connection failed"); + it('should call onError when error occurs', async () => { + const error = new Error('Connection failed') const adapter = createMockConnectionAdapter({ shouldError: true, error, - }); - const onError = vi.fn(); + }) + const onError = vi.fn() const client = new ChatClient({ connection: adapter, onError, - }); + }) - await client.sendMessage("Hello"); + await client.sendMessage('Hello') - expect(onError).toHaveBeenCalledWith(error); - expect(client.getError()).toBe(error); - }); - }); + expect(onError).toHaveBeenCalledWith(error) + expect(client.getError()).toBe(error) + }) + }) - describe("tool calls", () => { - it("should handle tool calls from stream", async () => { + describe('tool calls', () => { + it('should handle tool calls from stream', async () => { const chunks = createToolCallChunks([ - { id: "tool-1", name: "get_weather", arguments: '{"city": "NYC"}' }, - ]); - const adapter = createMockConnectionAdapter({ chunks }); - const client = new ChatClient({ connection: adapter }); + { id: 'tool-1', name: 'get_weather', arguments: '{"city": "NYC"}' }, + ]) + const adapter = createMockConnectionAdapter({ chunks }) + const client = new ChatClient({ connection: adapter }) - await client.sendMessage("What's the weather?"); + await client.sendMessage("What's the weather?") - const messages = client.getMessages(); - const assistantMessage = messages.find((m) => m.role === "assistant"); + const messages = client.getMessages() + const assistantMessage = messages.find((m) => m.role === 'assistant') - expect(assistantMessage).toBeDefined(); + expect(assistantMessage).toBeDefined() if (assistantMessage) { const toolCallPart = assistantMessage.parts.find( - (p) => p.type === "tool-call" - ); - expect(toolCallPart).toBeDefined(); - if (toolCallPart && toolCallPart.type === "tool-call") { - expect(toolCallPart.name).toBe("get_weather"); + (p) => p.type === 'tool-call', + ) + expect(toolCallPart).toBeDefined() + if (toolCallPart && toolCallPart.type === 'tool-call') { + expect(toolCallPart.name).toBe('get_weather') } } - }); + }) - it("should execute tool call when onToolCall callback provided", async () => { + it('should execute tool call when onToolCall callback provided', async () => { const chunks = createToolCallChunks([ - { id: "tool-1", name: "test_tool", arguments: '{"x": 1}' }, - ]); - const adapter = createMockConnectionAdapter({ chunks }); - const onToolCall = vi.fn().mockResolvedValue({ result: "success" }); + { id: 'tool-1', name: 'test_tool', arguments: '{"x": 1}' }, + ]) + const adapter = createMockConnectionAdapter({ chunks }) + const onToolCall = vi.fn().mockResolvedValue({ result: 'success' }) const client = new ChatClient({ connection: adapter, onToolCall, - }); + }) - await client.sendMessage("Test"); + await client.sendMessage('Test') - expect(onToolCall).toHaveBeenCalled(); - const call = onToolCall.mock.calls[0][0]; - expect(call.toolName).toBe("test_tool"); - expect(call.input).toEqual({ x: 1 }); - }); + expect(onToolCall).toHaveBeenCalled() + const call = onToolCall.mock.calls[0][0] + expect(call.toolName).toBe('test_tool') + expect(call.input).toEqual({ x: 1 }) + }) - it("should handle tool call errors", async () => { - const toolCallId = "tool-1"; + it('should handle tool call errors', async () => { + const toolCallId = 'tool-1' const chunks = createToolCallChunks([ - { id: toolCallId, name: "test_tool", arguments: '{"x": 1}' }, - ]); - const adapter = createMockConnectionAdapter({ chunks }); + { id: toolCallId, name: 'test_tool', arguments: '{"x": 1}' }, + ]) + const adapter = createMockConnectionAdapter({ chunks }) // Capture the tool call ID from the callback - let capturedToolCallId: string | undefined; + let capturedToolCallId: string | undefined const onToolCall = vi.fn().mockImplementation(async (args) => { - capturedToolCallId = args.toolCallId; - throw new Error("Tool execution failed"); - }); + capturedToolCallId = args.toolCallId + throw new Error('Tool execution failed') + }) const client = new ChatClient({ connection: adapter, onToolCall, - }); + }) - await client.sendMessage("Test"); + await client.sendMessage('Test') - expect(onToolCall).toHaveBeenCalled(); - expect(capturedToolCallId).toBe(toolCallId); + expect(onToolCall).toHaveBeenCalled() + expect(capturedToolCallId).toBe(toolCallId) // Wait for async operations to complete (addToolResult is async) // Need to wait for the stream to finish and addToolResult to complete - await new Promise((resolve) => setTimeout(resolve, 200)); + await new Promise((resolve) => setTimeout(resolve, 200)) // Should have tool call with error output - const messages = client.getMessages(); - const assistantMessage = messages.find((m) => m.role === "assistant"); - expect(assistantMessage).toBeDefined(); + const messages = client.getMessages() + const assistantMessage = messages.find((m) => m.role === 'assistant') + expect(assistantMessage).toBeDefined() if (assistantMessage) { // Find any tool call part const allToolCalls = assistantMessage.parts.filter( - (p) => p.type === "tool-call" - ); - expect(allToolCalls.length).toBeGreaterThan(0); + (p) => p.type === 'tool-call', + ) + expect(allToolCalls.length).toBeGreaterThan(0) // Find the tool call part by the captured ID const toolCallPart = allToolCalls.find( - (p) => p.type === "tool-call" && p.id === capturedToolCallId - ); + (p) => p.type === 'tool-call' && p.id === capturedToolCallId, + ) // The tool call part should exist - expect(toolCallPart).toBeDefined(); + expect(toolCallPart).toBeDefined() - if (toolCallPart && toolCallPart.type === "tool-call") { + if (toolCallPart && toolCallPart.type === 'tool-call') { // After error, output should be set with error object // Note: The output might be set asynchronously, so we check if it exists // If it doesn't exist yet, the error handling still worked (onToolCall was called) if (toolCallPart.output !== undefined) { expect(toolCallPart.output).toEqual({ - error: "Tool execution failed", - }); + error: 'Tool execution failed', + }) } else { // Output not set yet, but error was handled (onToolCall was called with error) // This is acceptable - the error was caught and handled - expect(onToolCall).toHaveBeenCalled(); + expect(onToolCall).toHaveBeenCalled() } } } - }); - }); + }) + }) - describe("addToolResult", () => { - it("should add tool result and update message", async () => { + describe('addToolResult', () => { + it('should add tool result and update message', async () => { const chunks = createToolCallChunks([ - { id: "tool-1", name: "test_tool", arguments: "{}" }, - ]); - const adapter = createMockConnectionAdapter({ chunks }); - const client = new ChatClient({ connection: adapter }); + { id: 'tool-1', name: 'test_tool', arguments: '{}' }, + ]) + const adapter = createMockConnectionAdapter({ chunks }) + const client = new ChatClient({ connection: adapter }) - await client.sendMessage("Test"); + await client.sendMessage('Test') // Find the tool call - const messages = client.getMessages(); - const assistantMessage = messages.find((m) => m.role === "assistant"); + const messages = client.getMessages() + const assistantMessage = messages.find((m) => m.role === 'assistant') const toolCallPart = assistantMessage?.parts.find( - (p) => p.type === "tool-call" - ); + (p) => p.type === 'tool-call', + ) - if (toolCallPart && toolCallPart.type === "tool-call") { + if (toolCallPart && toolCallPart.type === 'tool-call') { await client.addToolResult({ toolCallId: toolCallPart.id, tool: toolCallPart.name, - output: { result: "success" }, - }); + output: { result: 'success' }, + }) // Tool call should have output - const updatedMessages = client.getMessages(); + const updatedMessages = client.getMessages() const updatedAssistant = updatedMessages.find( - (m) => m.role === "assistant" - ); + (m) => m.role === 'assistant', + ) const updatedToolCall = updatedAssistant?.parts.find( - (p) => p.type === "tool-call" && p.id === toolCallPart.id - ); + (p) => p.type === 'tool-call' && p.id === toolCallPart.id, + ) - if (updatedToolCall && updatedToolCall.type === "tool-call") { - expect(updatedToolCall.output).toEqual({ result: "success" }); + if (updatedToolCall && updatedToolCall.type === 'tool-call') { + expect(updatedToolCall.output).toEqual({ result: 'success' }) } } - }); - }); + }) + }) - describe("error handling", () => { - it("should set error state on connection failure", async () => { - const error = new Error("Network error"); + describe('error handling', () => { + it('should set error state on connection failure', async () => { + const error = new Error('Network error') const adapter = createMockConnectionAdapter({ shouldError: true, error, - }); - const client = new ChatClient({ connection: adapter }); + }) + const client = new ChatClient({ connection: adapter }) - await client.sendMessage("Hello"); + await client.sendMessage('Hello') - expect(client.getError()).toBe(error); - }); + expect(client.getError()).toBe(error) + }) - it("should clear error on successful request", async () => { + it('should clear error on successful request', async () => { const errorAdapter = createMockConnectionAdapter({ shouldError: true, - error: new Error("First error"), - }); + error: new Error('First error'), + }) const successAdapter = createMockConnectionAdapter({ - chunks: createTextChunks("Success"), - }); + chunks: createTextChunks('Success'), + }) - const client = new ChatClient({ connection: errorAdapter }); + const client = new ChatClient({ connection: errorAdapter }) - await client.sendMessage("Fail"); - expect(client.getError()).toBeDefined(); + await client.sendMessage('Fail') + expect(client.getError()).toBeDefined() // @ts-ignore - Replace adapter for second request - client.connection = successAdapter; + client.connection = successAdapter - await client.sendMessage("Success"); - expect(client.getError()).toBeUndefined(); - }); - }); -}); + await client.sendMessage('Success') + expect(client.getError()).toBeUndefined() + }) + }) +}) diff --git a/packages/typescript/ai-client/tests/connection-adapters-abort.test.ts b/packages/typescript/ai-client/tests/connection-adapters-abort.test.ts index cc130778b..3f2a34c82 100644 --- a/packages/typescript/ai-client/tests/connection-adapters-abort.test.ts +++ b/packages/typescript/ai-client/tests/connection-adapters-abort.test.ts @@ -1,26 +1,29 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; -import { fetchServerSentEvents, fetchHttpStream } from "../src/connection-adapters"; -import type { StreamChunk } from "@tanstack/ai"; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { + fetchServerSentEvents, + fetchHttpStream, +} from '../src/connection-adapters' +import type { StreamChunk } from '@tanstack/ai' -describe("Connection Adapters - Abort Signal Handling", () => { - let originalFetch: typeof fetch; - let fetchMock: ReturnType; +describe('Connection Adapters - Abort Signal Handling', () => { + let originalFetch: typeof fetch + let fetchMock: ReturnType beforeEach(() => { - originalFetch = global.fetch; - fetchMock = vi.fn(); - global.fetch = fetchMock; - }); + originalFetch = global.fetch + fetchMock = vi.fn() + global.fetch = fetchMock + }) afterEach(() => { - global.fetch = originalFetch; - vi.clearAllMocks(); - }); + global.fetch = originalFetch + vi.clearAllMocks() + }) - describe("fetchServerSentEvents", () => { - it("should pass abortSignal to fetch", async () => { - const abortController = new AbortController(); - const abortSignal = abortController.signal; + describe('fetchServerSentEvents', () => { + it('should pass abortSignal to fetch', async () => { + const abortController = new AbortController() + const abortSignal = abortController.signal const mockResponse = { ok: true, @@ -30,30 +33,30 @@ describe("Connection Adapters - Abort Signal Handling", () => { releaseLock: vi.fn(), }), }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); + const adapter = fetchServerSentEvents('/api/chat') const generator = adapter.connect( - [{ role: "user", content: "Hello" }], + [{ role: 'user', content: 'Hello' }], undefined, - abortSignal - ); + abortSignal, + ) // Consume generator to trigger fetch for await (const _ of generator) { // Consume all chunks } - expect(fetchMock).toHaveBeenCalled(); - const fetchCall = fetchMock.mock.calls[0]; - expect(fetchCall[1]?.signal).toBe(abortSignal); - }); + expect(fetchMock).toHaveBeenCalled() + const fetchCall = fetchMock.mock.calls[0] + expect(fetchCall[1]?.signal).toBe(abortSignal) + }) - it("should use provided abortSignal over options.signal", async () => { - const providedSignal = new AbortController().signal; - const optionsSignal = new AbortController().signal; + it('should use provided abortSignal over options.signal', async () => { + const providedSignal = new AbortController().signal + const optionsSignal = new AbortController().signal const mockResponse = { ok: true, @@ -63,127 +66,131 @@ describe("Connection Adapters - Abort Signal Handling", () => { releaseLock: vi.fn(), }), }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat", { + const adapter = fetchServerSentEvents('/api/chat', { signal: optionsSignal, - }); + }) const generator = adapter.connect( - [{ role: "user", content: "Hello" }], + [{ role: 'user', content: 'Hello' }], undefined, - providedSignal - ); + providedSignal, + ) for await (const _ of generator) { // Consume all chunks } - const fetchCall = fetchMock.mock.calls[0]; - expect(fetchCall[1]?.signal).toBe(providedSignal); - }); + const fetchCall = fetchMock.mock.calls[0] + expect(fetchCall[1]?.signal).toBe(providedSignal) + }) - it("should stop reading stream when aborted", async () => { - const abortController = new AbortController(); - const abortSignal = abortController.signal; + it('should stop reading stream when aborted', async () => { + const abortController = new AbortController() + const abortSignal = abortController.signal - let readCount = 0; + let readCount = 0 const mockReader = { read: async () => { - readCount++; + readCount++ if (readCount === 1) { // Abort after first read - abortController.abort(); + abortController.abort() return { done: false, - value: new TextEncoder().encode("data: {\"type\":\"content\",\"id\":\"1\",\"model\":\"test\",\"timestamp\":123,\"delta\":\"Hello\",\"content\":\"Hello\",\"role\":\"assistant\"}\n\n"), - }; + value: new TextEncoder().encode( + 'data: {"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n\n', + ), + } } - return { done: true, value: undefined }; + return { done: true, value: undefined } }, releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); + const adapter = fetchServerSentEvents('/api/chat') const generator = adapter.connect( - [{ role: "user", content: "Hello" }], + [{ role: 'user', content: 'Hello' }], undefined, - abortSignal - ); + abortSignal, + ) - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of generator) { - chunks.push(chunk); + chunks.push(chunk) } // Should have read at least once but stopped after abort - expect(readCount).toBeGreaterThan(0); - expect(mockReader.releaseLock).toHaveBeenCalled(); - }); + expect(readCount).toBeGreaterThan(0) + expect(mockReader.releaseLock).toHaveBeenCalled() + }) - it("should check abortSignal before each read", async () => { - const abortController = new AbortController(); - const abortSignal = abortController.signal; + it('should check abortSignal before each read', async () => { + const abortController = new AbortController() + const abortSignal = abortController.signal - let readCount = 0; + let readCount = 0 const mockReader = { read: async () => { - readCount++; + readCount++ if (readCount === 1) { - abortController.abort(); + abortController.abort() } return { done: false, - value: new TextEncoder().encode("data: {\"type\":\"content\",\"id\":\"1\",\"model\":\"test\",\"timestamp\":123,\"delta\":\"Hello\",\"content\":\"Hello\",\"role\":\"assistant\"}\n\n"), - }; + value: new TextEncoder().encode( + 'data: {"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n\n', + ), + } }, releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); + const adapter = fetchServerSentEvents('/api/chat') const generator = adapter.connect( - [{ role: "user", content: "Hello" }], + [{ role: 'user', content: 'Hello' }], undefined, - abortSignal - ); + abortSignal, + ) - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] try { for await (const chunk of generator) { - chunks.push(chunk); + chunks.push(chunk) } } catch (err) { // Ignore abort errors } // Should stop reading after abort - expect(readCount).toBeLessThanOrEqual(2); // At most 2 reads (one before check, one after) - }); - }); + expect(readCount).toBeLessThanOrEqual(2) // At most 2 reads (one before check, one after) + }) + }) - describe("fetchHttpStream", () => { - it("should pass abortSignal to fetch", async () => { - const abortController = new AbortController(); - const abortSignal = abortController.signal; + describe('fetchHttpStream', () => { + it('should pass abortSignal to fetch', async () => { + const abortController = new AbortController() + const abortSignal = abortController.signal const mockResponse = { ok: true, @@ -193,70 +200,71 @@ describe("Connection Adapters - Abort Signal Handling", () => { releaseLock: vi.fn(), }), }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchHttpStream("/api/chat"); + const adapter = fetchHttpStream('/api/chat') const generator = adapter.connect( - [{ role: "user", content: "Hello" }], + [{ role: 'user', content: 'Hello' }], undefined, - abortSignal - ); + abortSignal, + ) for await (const _ of generator) { // Consume all chunks } - expect(fetchMock).toHaveBeenCalled(); - const fetchCall = fetchMock.mock.calls[0]; - expect(fetchCall[1]?.signal).toBe(abortSignal); - }); + expect(fetchMock).toHaveBeenCalled() + const fetchCall = fetchMock.mock.calls[0] + expect(fetchCall[1]?.signal).toBe(abortSignal) + }) - it("should stop reading stream when aborted", async () => { - const abortController = new AbortController(); - const abortSignal = abortController.signal; + it('should stop reading stream when aborted', async () => { + const abortController = new AbortController() + const abortSignal = abortController.signal - let readCount = 0; + let readCount = 0 const mockReader = { read: async () => { - readCount++; + readCount++ if (readCount === 1) { - abortController.abort(); + abortController.abort() return { done: false, - value: new TextEncoder().encode("{\"type\":\"content\",\"id\":\"1\",\"model\":\"test\",\"timestamp\":123,\"delta\":\"Hello\",\"content\":\"Hello\",\"role\":\"assistant\"}\n"), - }; + value: new TextEncoder().encode( + '{"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n', + ), + } } - return { done: true, value: undefined }; + return { done: true, value: undefined } }, releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchHttpStream("/api/chat"); + const adapter = fetchHttpStream('/api/chat') const generator = adapter.connect( - [{ role: "user", content: "Hello" }], + [{ role: 'user', content: 'Hello' }], undefined, - abortSignal - ); + abortSignal, + ) - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of generator) { - chunks.push(chunk); + chunks.push(chunk) } - expect(readCount).toBeGreaterThan(0); - expect(mockReader.releaseLock).toHaveBeenCalled(); - }); - }); -}); - + expect(readCount).toBeGreaterThan(0) + expect(mockReader.releaseLock).toHaveBeenCalled() + }) + }) +}) diff --git a/packages/typescript/ai-client/tests/connection-adapters.test.ts b/packages/typescript/ai-client/tests/connection-adapters.test.ts index 6d2ec3310..a3a64ef97 100644 --- a/packages/typescript/ai-client/tests/connection-adapters.test.ts +++ b/packages/typescript/ai-client/tests/connection-adapters.test.ts @@ -1,470 +1,473 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { fetchServerSentEvents, fetchHttpStream, stream, -} from "../src/connection-adapters"; -import type { StreamChunk } from "@tanstack/ai"; +} from '../src/connection-adapters' +import type { StreamChunk } from '@tanstack/ai' -describe("connection-adapters", () => { - let originalFetch: typeof fetch; - let fetchMock: ReturnType; +describe('connection-adapters', () => { + let originalFetch: typeof fetch + let fetchMock: ReturnType beforeEach(() => { - originalFetch = global.fetch; - fetchMock = vi.fn(); - global.fetch = fetchMock; - }); + originalFetch = global.fetch + fetchMock = vi.fn() + global.fetch = fetchMock + }) afterEach(() => { - global.fetch = originalFetch; - vi.clearAllMocks(); - }); + global.fetch = originalFetch + vi.clearAllMocks() + }) - describe("fetchServerSentEvents", () => { - it("should handle SSE format with data: prefix", async () => { + describe('fetchServerSentEvents', () => { + it('should handle SSE format with data: prefix', async () => { const mockReader = { read: vi .fn() .mockResolvedValueOnce({ done: false, value: new TextEncoder().encode( - 'data: {"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n\n' + 'data: {"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n\n', ), }) .mockResolvedValueOnce({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); - const chunks: StreamChunk[] = []; + const adapter = fetchServerSentEvents('/api/chat') + const chunks: StreamChunk[] = [] - for await (const chunk of adapter.connect( - [{ role: "user", content: "Hello" }] - )) { - chunks.push(chunk); + for await (const chunk of adapter.connect([ + { role: 'user', content: 'Hello' }, + ])) { + chunks.push(chunk) } - expect(chunks).toHaveLength(1); + expect(chunks).toHaveLength(1) expect(chunks[0]).toMatchObject({ - type: "content", - delta: "Hello", - }); - }); + type: 'content', + delta: 'Hello', + }) + }) - it("should handle SSE format without data: prefix", async () => { + it('should handle SSE format without data: prefix', async () => { const mockReader = { read: vi .fn() .mockResolvedValueOnce({ done: false, value: new TextEncoder().encode( - '{"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n' + '{"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n', ), }) .mockResolvedValueOnce({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); - const chunks: StreamChunk[] = []; + const adapter = fetchServerSentEvents('/api/chat') + const chunks: StreamChunk[] = [] - for await (const chunk of adapter.connect( - [{ role: "user", content: "Hello" }] - )) { - chunks.push(chunk); + for await (const chunk of adapter.connect([ + { role: 'user', content: 'Hello' }, + ])) { + chunks.push(chunk) } - expect(chunks).toHaveLength(1); - }); + expect(chunks).toHaveLength(1) + }) - it("should skip [DONE] markers", async () => { + it('should skip [DONE] markers', async () => { const mockReader = { read: vi .fn() .mockResolvedValueOnce({ done: false, - value: new TextEncoder().encode("data: [DONE]\n\n"), + value: new TextEncoder().encode('data: [DONE]\n\n'), }) .mockResolvedValueOnce({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); - const chunks: StreamChunk[] = []; + const adapter = fetchServerSentEvents('/api/chat') + const chunks: StreamChunk[] = [] - for await (const chunk of adapter.connect( - [{ role: "user", content: "Hello" }] - )) { - chunks.push(chunk); + for await (const chunk of adapter.connect([ + { role: 'user', content: 'Hello' }, + ])) { + chunks.push(chunk) } - expect(chunks).toHaveLength(0); - }); + expect(chunks).toHaveLength(0) + }) - it("should handle malformed JSON gracefully", async () => { - const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); + it('should handle malformed JSON gracefully', async () => { + const consoleWarnSpy = vi + .spyOn(console, 'warn') + .mockImplementation(() => {}) const mockReader = { read: vi .fn() .mockResolvedValueOnce({ done: false, - value: new TextEncoder().encode("data: invalid json\n\n"), + value: new TextEncoder().encode('data: invalid json\n\n'), }) .mockResolvedValueOnce({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); - const chunks: StreamChunk[] = []; + const adapter = fetchServerSentEvents('/api/chat') + const chunks: StreamChunk[] = [] - for await (const chunk of adapter.connect( - [{ role: "user", content: "Hello" }] - )) { - chunks.push(chunk); + for await (const chunk of adapter.connect([ + { role: 'user', content: 'Hello' }, + ])) { + chunks.push(chunk) } - expect(chunks).toHaveLength(0); - expect(consoleWarnSpy).toHaveBeenCalled(); - consoleWarnSpy.mockRestore(); - }); + expect(chunks).toHaveLength(0) + expect(consoleWarnSpy).toHaveBeenCalled() + consoleWarnSpy.mockRestore() + }) - it("should handle HTTP errors", async () => { + it('should handle HTTP errors', async () => { const mockResponse = { ok: false, status: 500, - statusText: "Internal Server Error", - }; + statusText: 'Internal Server Error', + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); + const adapter = fetchServerSentEvents('/api/chat') await expect( (async () => { for await (const _ of adapter.connect([ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, ])) { // Consume } - })() - ).rejects.toThrow("HTTP error! status: 500 Internal Server Error"); - }); + })(), + ).rejects.toThrow('HTTP error! status: 500 Internal Server Error') + }) - it("should handle missing response body", async () => { + it('should handle missing response body', async () => { const mockResponse = { ok: true, body: null, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); + const adapter = fetchServerSentEvents('/api/chat') await expect( (async () => { for await (const _ of adapter.connect([ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, ])) { // Consume } - })() - ).rejects.toThrow("Response body is not readable"); - }); + })(), + ).rejects.toThrow('Response body is not readable') + }) - it("should merge custom headers", async () => { + it('should merge custom headers', async () => { const mockReader = { read: vi.fn().mockResolvedValue({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat", { - headers: { Authorization: "Bearer token" }, - }); + const adapter = fetchServerSentEvents('/api/chat', { + headers: { Authorization: 'Bearer token' }, + }) for await (const _ of adapter.connect([ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, ])) { // Consume } - expect(fetchMock).toHaveBeenCalled(); - const call = fetchMock.mock.calls[0]; + expect(fetchMock).toHaveBeenCalled() + const call = fetchMock.mock.calls[0] expect(call[1]?.headers).toMatchObject({ - "Content-Type": "application/json", - Authorization: "Bearer token", - }); - }); + 'Content-Type': 'application/json', + Authorization: 'Bearer token', + }) + }) - it("should handle Headers object", async () => { + it('should handle Headers object', async () => { const mockReader = { read: vi.fn().mockResolvedValue({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const headers = new Headers(); - headers.set("Authorization", "Bearer token"); + const headers = new Headers() + headers.set('Authorization', 'Bearer token') - const adapter = fetchServerSentEvents("/api/chat", { headers }); + const adapter = fetchServerSentEvents('/api/chat', { headers }) for await (const _ of adapter.connect([ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, ])) { // Consume } - expect(fetchMock).toHaveBeenCalled(); - const call = fetchMock.mock.calls[0]; - const requestHeaders = call[1]?.headers; - + expect(fetchMock).toHaveBeenCalled() + const call = fetchMock.mock.calls[0] + const requestHeaders = call[1]?.headers + // mergeHeaders converts Headers to plain object, then spread into new object // The headers should be a plain object with both Content-Type and Authorization - const headersObj = requestHeaders as Record; - expect(headersObj).toBeDefined(); - expect(headersObj["Content-Type"]).toBe("application/json"); + const headersObj = requestHeaders as Record + expect(headersObj).toBeDefined() + expect(headersObj['Content-Type']).toBe('application/json') // Check if Authorization exists (it should from the Headers object) // The mergeHeaders function should convert Headers.forEach to object keys const authValue = Object.entries(headersObj).find( - ([key]) => key.toLowerCase() === "authorization" - )?.[1]; - expect(authValue).toBe("Bearer token"); - }); + ([key]) => key.toLowerCase() === 'authorization', + )?.[1] + expect(authValue).toBe('Bearer token') + }) - it("should pass data to request body", async () => { + it('should pass data to request body', async () => { const mockReader = { read: vi.fn().mockResolvedValue({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchServerSentEvents("/api/chat"); + const adapter = fetchServerSentEvents('/api/chat') for await (const _ of adapter.connect( - [{ role: "user", content: "Hello" }], - { key: "value" } + [{ role: 'user', content: 'Hello' }], + { key: 'value' }, )) { // Consume } - expect(fetchMock).toHaveBeenCalled(); - const call = fetchMock.mock.calls[0]; - const body = JSON.parse(call[1]?.body as string); - expect(body.data).toEqual({ key: "value" }); - }); - }); + expect(fetchMock).toHaveBeenCalled() + const call = fetchMock.mock.calls[0] + const body = JSON.parse(call[1]?.body as string) + expect(body.data).toEqual({ key: 'value' }) + }) + }) - describe("fetchHttpStream", () => { - it("should parse newline-delimited JSON", async () => { + describe('fetchHttpStream', () => { + it('should parse newline-delimited JSON', async () => { const mockReader = { read: vi .fn() .mockResolvedValueOnce({ done: false, value: new TextEncoder().encode( - '{"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n' + '{"type":"content","id":"1","model":"test","timestamp":123,"delta":"Hello","content":"Hello","role":"assistant"}\n', ), }) .mockResolvedValueOnce({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchHttpStream("/api/chat"); - const chunks: StreamChunk[] = []; + const adapter = fetchHttpStream('/api/chat') + const chunks: StreamChunk[] = [] for await (const chunk of adapter.connect([ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, ])) { - chunks.push(chunk); + chunks.push(chunk) } - expect(chunks).toHaveLength(1); - }); + expect(chunks).toHaveLength(1) + }) - it("should handle malformed JSON gracefully", async () => { - const consoleWarnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); + it('should handle malformed JSON gracefully', async () => { + const consoleWarnSpy = vi + .spyOn(console, 'warn') + .mockImplementation(() => {}) const mockReader = { read: vi .fn() .mockResolvedValueOnce({ done: false, - value: new TextEncoder().encode("invalid json\n"), + value: new TextEncoder().encode('invalid json\n'), }) .mockResolvedValueOnce({ done: true, value: undefined }), releaseLock: vi.fn(), - }; + } const mockResponse = { ok: true, body: { getReader: () => mockReader, }, - }; + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchHttpStream("/api/chat"); - const chunks: StreamChunk[] = []; + const adapter = fetchHttpStream('/api/chat') + const chunks: StreamChunk[] = [] for await (const chunk of adapter.connect([ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, ])) { - chunks.push(chunk); + chunks.push(chunk) } - expect(chunks).toHaveLength(0); - expect(consoleWarnSpy).toHaveBeenCalled(); - consoleWarnSpy.mockRestore(); - }); + expect(chunks).toHaveLength(0) + expect(consoleWarnSpy).toHaveBeenCalled() + consoleWarnSpy.mockRestore() + }) - it("should handle HTTP errors", async () => { + it('should handle HTTP errors', async () => { const mockResponse = { ok: false, status: 404, - statusText: "Not Found", - }; + statusText: 'Not Found', + } - fetchMock.mockResolvedValue(mockResponse as any); + fetchMock.mockResolvedValue(mockResponse as any) - const adapter = fetchHttpStream("/api/chat"); + const adapter = fetchHttpStream('/api/chat') await expect( (async () => { for await (const _ of adapter.connect([ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, ])) { // Consume } - })() - ).rejects.toThrow("HTTP error! status: 404 Not Found"); - }); - }); + })(), + ).rejects.toThrow('HTTP error! status: 404 Not Found') + }) + }) - describe("stream", () => { - it("should delegate to stream factory", async () => { + describe('stream', () => { + it('should delegate to stream factory', async () => { const streamFactory = vi.fn().mockImplementation(async function* () { yield { - type: "content", - id: "1", - model: "test", + type: 'content', + id: '1', + model: 'test', timestamp: Date.now(), - delta: "Hello", - content: "Hello", - role: "assistant", - }; - }); + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } + }) - const adapter = stream(streamFactory); - const chunks: StreamChunk[] = []; + const adapter = stream(streamFactory) + const chunks: StreamChunk[] = [] for await (const chunk of adapter.connect([ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, ])) { - chunks.push(chunk); + chunks.push(chunk) } - expect(streamFactory).toHaveBeenCalled(); - expect(chunks).toHaveLength(1); - }); + expect(streamFactory).toHaveBeenCalled() + expect(chunks).toHaveLength(1) + }) - it("should pass data to stream factory", async () => { + it('should pass data to stream factory', async () => { const streamFactory = vi.fn().mockImplementation(async function* () { yield { - type: "done", - id: "1", - model: "test", + type: 'done', + id: '1', + model: 'test', timestamp: Date.now(), - finishReason: "stop", - }; - }); + finishReason: 'stop', + } + }) - const adapter = stream(streamFactory); - const data = { key: "value" }; + const adapter = stream(streamFactory) + const data = { key: 'value' } for await (const _ of adapter.connect( - [{ role: "user", content: "Hello" }], - data + [{ role: 'user', content: 'Hello' }], + data, )) { // Consume } expect(streamFactory).toHaveBeenCalledWith( - expect.arrayContaining([expect.objectContaining({ role: "user" })]), - data - ); - }); - }); -}); - + expect.arrayContaining([expect.objectContaining({ role: 'user' })]), + data, + ) + }) + }) +}) diff --git a/packages/typescript/ai-client/tests/events.test.ts b/packages/typescript/ai-client/tests/events.test.ts index 0702cea38..28606b083 100644 --- a/packages/typescript/ai-client/tests/events.test.ts +++ b/packages/typescript/ai-client/tests/events.test.ts @@ -1,334 +1,344 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { ChatClientEventEmitter, DefaultChatClientEventEmitter, -} from "../src/events"; -import { aiEventClient } from "@tanstack/ai/event-client"; -import type { UIMessage } from "../src/types"; +} from '../src/events' +import { aiEventClient } from '@tanstack/ai/event-client' +import type { UIMessage } from '../src/types' // Mock the event client -vi.mock("@tanstack/ai/event-client", () => ({ +vi.mock('@tanstack/ai/event-client', () => ({ aiEventClient: { emit: vi.fn(), }, -})); +})) -describe("events", () => { +describe('events', () => { beforeEach(() => { - vi.clearAllMocks(); - }); + vi.clearAllMocks() + }) - describe("DefaultChatClientEventEmitter", () => { - let emitter: DefaultChatClientEventEmitter; + describe('DefaultChatClientEventEmitter', () => { + let emitter: DefaultChatClientEventEmitter beforeEach(() => { - emitter = new DefaultChatClientEventEmitter("test-client-id"); - }); + emitter = new DefaultChatClientEventEmitter('test-client-id') + }) - it("should emit client:created event with clientId and timestamp", () => { - emitter.clientCreated(5); + it('should emit client:created event with clientId and timestamp', () => { + emitter.clientCreated(5) - expect(aiEventClient.emit).toHaveBeenCalledWith("client:created", { + expect(aiEventClient.emit).toHaveBeenCalledWith('client:created', { initialMessageCount: 5, - clientId: "test-client-id", + clientId: 'test-client-id', timestamp: expect.any(Number), - }); - }); + }) + }) - it("should emit client:loading-changed event", () => { - emitter.loadingChanged(true); + it('should emit client:loading-changed event', () => { + emitter.loadingChanged(true) expect(aiEventClient.emit).toHaveBeenCalledWith( - "client:loading-changed", + 'client:loading-changed', { isLoading: true, - clientId: "test-client-id", + clientId: 'test-client-id', timestamp: expect.any(Number), - } - ); - }); + }, + ) + }) - it("should emit client:error-changed event with null", () => { - emitter.errorChanged(null); + it('should emit client:error-changed event with null', () => { + emitter.errorChanged(null) - expect(aiEventClient.emit).toHaveBeenCalledWith("client:error-changed", { + expect(aiEventClient.emit).toHaveBeenCalledWith('client:error-changed', { error: null, - clientId: "test-client-id", + clientId: 'test-client-id', timestamp: expect.any(Number), - }); - }); + }) + }) - it("should emit client:error-changed event with error string", () => { - emitter.errorChanged("Something went wrong"); + it('should emit client:error-changed event with error string', () => { + emitter.errorChanged('Something went wrong') - expect(aiEventClient.emit).toHaveBeenCalledWith("client:error-changed", { - error: "Something went wrong", - clientId: "test-client-id", + expect(aiEventClient.emit).toHaveBeenCalledWith('client:error-changed', { + error: 'Something went wrong', + clientId: 'test-client-id', timestamp: expect.any(Number), - }); - }); + }) + }) - it("should emit processor:text-updated and client:assistant-message-updated", () => { - emitter.textUpdated("stream-1", "msg-1", "Hello world"); + it('should emit processor:text-updated and client:assistant-message-updated', () => { + emitter.textUpdated('stream-1', 'msg-1', 'Hello world') - expect(aiEventClient.emit).toHaveBeenCalledTimes(2); + expect(aiEventClient.emit).toHaveBeenCalledTimes(2) expect(aiEventClient.emit).toHaveBeenNthCalledWith( 1, - "processor:text-updated", + 'processor:text-updated', { - streamId: "stream-1", - content: "Hello world", + streamId: 'stream-1', + content: 'Hello world', timestamp: expect.any(Number), - } - ); + }, + ) expect(aiEventClient.emit).toHaveBeenNthCalledWith( 2, - "client:assistant-message-updated", + 'client:assistant-message-updated', { - messageId: "msg-1", - content: "Hello world", - clientId: "test-client-id", + messageId: 'msg-1', + content: 'Hello world', + clientId: 'test-client-id', timestamp: expect.any(Number), - } - ); - }); + }, + ) + }) - it("should emit processor:tool-call-state-changed and client:tool-call-updated", () => { + it('should emit processor:tool-call-state-changed and client:tool-call-updated', () => { emitter.toolCallStateChanged( - "stream-1", - "msg-1", - "call-1", - "get_weather", - "input-complete", - '{"city": "NYC"}' - ); - - expect(aiEventClient.emit).toHaveBeenCalledTimes(2); + 'stream-1', + 'msg-1', + 'call-1', + 'get_weather', + 'input-complete', + '{"city": "NYC"}', + ) + + expect(aiEventClient.emit).toHaveBeenCalledTimes(2) expect(aiEventClient.emit).toHaveBeenNthCalledWith( 1, - "processor:tool-call-state-changed", + 'processor:tool-call-state-changed', { - streamId: "stream-1", - toolCallId: "call-1", - toolName: "get_weather", - state: "input-complete", + streamId: 'stream-1', + toolCallId: 'call-1', + toolName: 'get_weather', + state: 'input-complete', arguments: '{"city": "NYC"}', timestamp: expect.any(Number), - } - ); + }, + ) expect(aiEventClient.emit).toHaveBeenNthCalledWith( 2, - "client:tool-call-updated", + 'client:tool-call-updated', { - messageId: "msg-1", - toolCallId: "call-1", - toolName: "get_weather", - state: "input-complete", + messageId: 'msg-1', + toolCallId: 'call-1', + toolName: 'get_weather', + state: 'input-complete', arguments: '{"city": "NYC"}', - clientId: "test-client-id", + clientId: 'test-client-id', timestamp: expect.any(Number), - } - ); - }); + }, + ) + }) - it("should emit processor:tool-result-state-changed event", () => { + it('should emit processor:tool-result-state-changed event', () => { emitter.toolResultStateChanged( - "stream-1", - "call-1", - "Result content", - "complete" - ); + 'stream-1', + 'call-1', + 'Result content', + 'complete', + ) expect(aiEventClient.emit).toHaveBeenCalledWith( - "processor:tool-result-state-changed", + 'processor:tool-result-state-changed', { - streamId: "stream-1", - toolCallId: "call-1", - content: "Result content", - state: "complete", + streamId: 'stream-1', + toolCallId: 'call-1', + content: 'Result content', + state: 'complete', timestamp: expect.any(Number), - } - ); - }); + }, + ) + }) - it("should emit processor:tool-result-state-changed with error", () => { + it('should emit processor:tool-result-state-changed with error', () => { emitter.toolResultStateChanged( - "stream-1", - "call-1", - "Error occurred", - "error", - "Something failed" - ); + 'stream-1', + 'call-1', + 'Error occurred', + 'error', + 'Something failed', + ) expect(aiEventClient.emit).toHaveBeenCalledWith( - "processor:tool-result-state-changed", + 'processor:tool-result-state-changed', { - streamId: "stream-1", - toolCallId: "call-1", - content: "Error occurred", - state: "error", - error: "Something failed", + streamId: 'stream-1', + toolCallId: 'call-1', + content: 'Error occurred', + state: 'error', + error: 'Something failed', timestamp: expect.any(Number), - } - ); - }); + }, + ) + }) - it("should emit client:approval-requested event", () => { + it('should emit client:approval-requested event', () => { emitter.approvalRequested( - "msg-1", - "call-1", - "get_weather", - { city: "NYC" }, - "approval-1" - ); + 'msg-1', + 'call-1', + 'get_weather', + { city: 'NYC' }, + 'approval-1', + ) expect(aiEventClient.emit).toHaveBeenCalledWith( - "client:approval-requested", + 'client:approval-requested', { - messageId: "msg-1", - toolCallId: "call-1", - toolName: "get_weather", - input: { city: "NYC" }, - approvalId: "approval-1", - clientId: "test-client-id", + messageId: 'msg-1', + toolCallId: 'call-1', + toolName: 'get_weather', + input: { city: 'NYC' }, + approvalId: 'approval-1', + clientId: 'test-client-id', timestamp: expect.any(Number), - } - ); - }); + }, + ) + }) - it("should emit client:message-appended with content preview", () => { + it('should emit client:message-appended with content preview', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "user", + id: 'msg-1', + role: 'user', parts: [ - { type: "text", content: "Hello" }, - { type: "text", content: "World" }, + { type: 'text', content: 'Hello' }, + { type: 'text', content: 'World' }, ], createdAt: new Date(), - }; + } - emitter.messageAppended(uiMessage); + emitter.messageAppended(uiMessage) expect(aiEventClient.emit).toHaveBeenCalledWith( - "client:message-appended", + 'client:message-appended', { - messageId: "msg-1", - role: "user", - contentPreview: "Hello World", - clientId: "test-client-id", + messageId: 'msg-1', + role: 'user', + contentPreview: 'Hello World', + clientId: 'test-client-id', timestamp: expect.any(Number), - } - ); - }); + }, + ) + }) - it("should truncate content preview to 100 characters", () => { - const longContent = "a".repeat(150); + it('should truncate content preview to 100 characters', () => { + const longContent = 'a'.repeat(150) const uiMessage: UIMessage = { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: longContent }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: longContent }], createdAt: new Date(), - }; + } - emitter.messageAppended(uiMessage); + emitter.messageAppended(uiMessage) - const call = (aiEventClient.emit as any).mock.calls[0]; - expect(call[1].contentPreview).toHaveLength(100); - }); + const call = (aiEventClient.emit as any).mock.calls[0] + expect(call[1].contentPreview).toHaveLength(100) + }) - it("should handle message with no text parts", () => { + it('should handle message with no text parts', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "call-1", - name: "tool1", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'call-1', + name: 'tool1', + arguments: '{}', + state: 'input-complete', }, ], createdAt: new Date(), - }; + } - emitter.messageAppended(uiMessage); + emitter.messageAppended(uiMessage) expect(aiEventClient.emit).toHaveBeenCalledWith( - "client:message-appended", + 'client:message-appended', { - messageId: "msg-1", - role: "assistant", - contentPreview: "", - clientId: "test-client-id", + messageId: 'msg-1', + role: 'assistant', + contentPreview: '', + clientId: 'test-client-id', timestamp: expect.any(Number), - } - ); - }); + }, + ) + }) - it("should emit client:message-sent event", () => { - emitter.messageSent("msg-1", "Hello world"); + it('should emit client:message-sent event', () => { + emitter.messageSent('msg-1', 'Hello world') - expect(aiEventClient.emit).toHaveBeenCalledWith("client:message-sent", { - messageId: "msg-1", - content: "Hello world", - clientId: "test-client-id", + expect(aiEventClient.emit).toHaveBeenCalledWith('client:message-sent', { + messageId: 'msg-1', + content: 'Hello world', + clientId: 'test-client-id', timestamp: expect.any(Number), - }); - }); + }) + }) - it("should emit client:reloaded event", () => { - emitter.reloaded(3); + it('should emit client:reloaded event', () => { + emitter.reloaded(3) - expect(aiEventClient.emit).toHaveBeenCalledWith("client:reloaded", { + expect(aiEventClient.emit).toHaveBeenCalledWith('client:reloaded', { fromMessageIndex: 3, - clientId: "test-client-id", + clientId: 'test-client-id', timestamp: expect.any(Number), - }); - }); + }) + }) - it("should emit client:stopped event", () => { - emitter.stopped(); + it('should emit client:stopped event', () => { + emitter.stopped() - expect(aiEventClient.emit).toHaveBeenCalledWith("client:stopped", { - clientId: "test-client-id", + expect(aiEventClient.emit).toHaveBeenCalledWith('client:stopped', { + clientId: 'test-client-id', timestamp: expect.any(Number), - }); - }); + }) + }) - it("should emit client:messages-cleared event", () => { - emitter.messagesCleared(); + it('should emit client:messages-cleared event', () => { + emitter.messagesCleared() - expect(aiEventClient.emit).toHaveBeenCalledWith("client:messages-cleared", { - clientId: "test-client-id", - timestamp: expect.any(Number), - }); - }); - - it("should emit tool:result-added event", () => { - emitter.toolResultAdded("call-1", "get_weather", { temp: 72 }, "output-available"); - - expect(aiEventClient.emit).toHaveBeenCalledWith("tool:result-added", { - toolCallId: "call-1", - toolName: "get_weather", + expect(aiEventClient.emit).toHaveBeenCalledWith( + 'client:messages-cleared', + { + clientId: 'test-client-id', + timestamp: expect.any(Number), + }, + ) + }) + + it('should emit tool:result-added event', () => { + emitter.toolResultAdded( + 'call-1', + 'get_weather', + { temp: 72 }, + 'output-available', + ) + + expect(aiEventClient.emit).toHaveBeenCalledWith('tool:result-added', { + toolCallId: 'call-1', + toolName: 'get_weather', output: { temp: 72 }, - state: "output-available", - clientId: "test-client-id", + state: 'output-available', + clientId: 'test-client-id', timestamp: expect.any(Number), - }); - }); + }) + }) - it("should emit tool:approval-responded event", () => { - emitter.toolApprovalResponded("approval-1", "call-1", true); - - expect(aiEventClient.emit).toHaveBeenCalledWith("tool:approval-responded", { - approvalId: "approval-1", - toolCallId: "call-1", - approved: true, - clientId: "test-client-id", - timestamp: expect.any(Number), - }); - }); - }); -}); + it('should emit tool:approval-responded event', () => { + emitter.toolApprovalResponded('approval-1', 'call-1', true) + expect(aiEventClient.emit).toHaveBeenCalledWith( + 'tool:approval-responded', + { + approvalId: 'approval-1', + toolCallId: 'call-1', + approved: true, + clientId: 'test-client-id', + timestamp: expect.any(Number), + }, + ) + }) + }) +}) diff --git a/packages/typescript/ai-client/tests/message-converters.test.ts b/packages/typescript/ai-client/tests/message-converters.test.ts index 63dfccc18..760ab4101 100644 --- a/packages/typescript/ai-client/tests/message-converters.test.ts +++ b/packages/typescript/ai-client/tests/message-converters.test.ts @@ -1,626 +1,626 @@ -import { describe, it, expect } from "vitest"; +import { describe, it, expect } from 'vitest' import { convertMessagesToModelMessages, uiMessageToModelMessages, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, -} from "../src/message-converters"; -import type { UIMessage, ModelMessage } from "../src/types"; +} from '../src/message-converters' +import type { UIMessage, ModelMessage } from '../src/types' -describe("message-converters", () => { - describe("convertMessagesToModelMessages", () => { - it("should convert UIMessages to ModelMessages", () => { +describe('message-converters', () => { + describe('convertMessagesToModelMessages', () => { + it('should convert UIMessages to ModelMessages', () => { const uiMessages: UIMessage[] = [ { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), }, - ]; + ] - const result = convertMessagesToModelMessages(uiMessages); - expect(result).toHaveLength(1); + const result = convertMessagesToModelMessages(uiMessages) + expect(result).toHaveLength(1) expect(result[0]).toEqual({ - role: "user", - content: "Hello", - }); - }); + role: 'user', + content: 'Hello', + }) + }) - it("should pass through ModelMessages", () => { + it('should pass through ModelMessages', () => { const modelMessages: ModelMessage[] = [ { - role: "user", - content: "Hello", + role: 'user', + content: 'Hello', }, - ]; + ] - const result = convertMessagesToModelMessages(modelMessages); - expect(result).toEqual(modelMessages); - }); + const result = convertMessagesToModelMessages(modelMessages) + expect(result).toEqual(modelMessages) + }) - it("should handle mixed UIMessages and ModelMessages", () => { + it('should handle mixed UIMessages and ModelMessages', () => { const messages: (UIMessage | ModelMessage)[] = [ { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), }, { - role: "assistant", - content: "Hi there", + role: 'assistant', + content: 'Hi there', }, - ]; - - const result = convertMessagesToModelMessages(messages); - expect(result).toHaveLength(2); - expect(result[0]).toEqual({ role: "user", content: "Hello" }); - expect(result[1]).toEqual({ role: "assistant", content: "Hi there" }); - }); - - it("should handle empty array", () => { - const result = convertMessagesToModelMessages([]); - expect(result).toEqual([]); - }); - }); - - describe("uiMessageToModelMessages", () => { - it("should convert text-only message", () => { + ] + + const result = convertMessagesToModelMessages(messages) + expect(result).toHaveLength(2) + expect(result[0]).toEqual({ role: 'user', content: 'Hello' }) + expect(result[1]).toEqual({ role: 'assistant', content: 'Hi there' }) + }) + + it('should handle empty array', () => { + const result = convertMessagesToModelMessages([]) + expect(result).toEqual([]) + }) + }) + + describe('uiMessageToModelMessages', () => { + it('should convert text-only message', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result).toHaveLength(1); + const result = uiMessageToModelMessages(uiMessage) + expect(result).toHaveLength(1) expect(result[0]).toEqual({ - role: "user", - content: "Hello", - }); - }); + role: 'user', + content: 'Hello', + }) + }) - it("should convert message with multiple text parts", () => { + it('should convert message with multiple text parts', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "user", + id: 'msg-1', + role: 'user', parts: [ - { type: "text", content: "Hello " }, - { type: "text", content: "World" }, + { type: 'text', content: 'Hello ' }, + { type: 'text', content: 'World' }, ], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result[0].content).toBe("Hello World"); - }); + const result = uiMessageToModelMessages(uiMessage) + expect(result[0].content).toBe('Hello World') + }) - it("should convert message with tool calls", () => { + it('should convert message with tool calls', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "call-1", - name: "get_weather", + type: 'tool-call', + id: 'call-1', + name: 'get_weather', arguments: '{"city": "NYC"}', - state: "input-complete", + state: 'input-complete', }, ], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result).toHaveLength(1); - expect(result[0].toolCalls).toBeDefined(); + const result = uiMessageToModelMessages(uiMessage) + expect(result).toHaveLength(1) + expect(result[0].toolCalls).toBeDefined() expect(result[0].toolCalls?.[0]).toEqual({ - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "get_weather", + name: 'get_weather', arguments: '{"city": "NYC"}', }, - }); - }); + }) + }) - it("should filter tool calls by state", () => { + it('should filter tool calls by state', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "call-1", - name: "tool1", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'call-1', + name: 'tool1', + arguments: '{}', + state: 'input-complete', }, { - type: "tool-call", - id: "call-2", - name: "tool2", - arguments: "{}", - state: "input-streaming", // Not complete + type: 'tool-call', + id: 'call-2', + name: 'tool2', + arguments: '{}', + state: 'input-streaming', // Not complete }, { - type: "tool-call", - id: "call-3", - name: "tool3", - arguments: "{}", - state: "approval-responded", + type: 'tool-call', + id: 'call-3', + name: 'tool3', + arguments: '{}', + state: 'approval-responded', }, ], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result[0].toolCalls).toHaveLength(2); // call-1 and call-3 + const result = uiMessageToModelMessages(uiMessage) + expect(result[0].toolCalls).toHaveLength(2) // call-1 and call-3 expect(result[0].toolCalls?.map((tc) => tc.id)).toEqual([ - "call-1", - "call-3", - ]); - }); + 'call-1', + 'call-3', + ]) + }) - it("should include tool calls with output", () => { + it('should include tool calls with output', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "call-1", - name: "tool1", - arguments: "{}", - state: "awaiting-input", - output: { result: "success" }, + type: 'tool-call', + id: 'call-1', + name: 'tool1', + arguments: '{}', + state: 'awaiting-input', + output: { result: 'success' }, }, ], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result[0].toolCalls).toHaveLength(1); - }); + const result = uiMessageToModelMessages(uiMessage) + expect(result[0].toolCalls).toHaveLength(1) + }) - it("should convert tool result parts to separate messages", () => { + it('should convert tool result parts to separate messages', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-result", - toolCallId: "call-1", - content: "Result content", - state: "complete", + type: 'tool-result', + toolCallId: 'call-1', + content: 'Result content', + state: 'complete', }, ], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result).toHaveLength(2); // Main message + tool result + const result = uiMessageToModelMessages(uiMessage) + expect(result).toHaveLength(2) // Main message + tool result expect(result[1]).toEqual({ - role: "tool", - content: "Result content", - toolCallId: "call-1", - }); - }); + role: 'tool', + content: 'Result content', + toolCallId: 'call-1', + }) + }) - it("should filter tool results by state", () => { + it('should filter tool results by state', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-result", - toolCallId: "call-1", - content: "Complete", - state: "complete", + type: 'tool-result', + toolCallId: 'call-1', + content: 'Complete', + state: 'complete', }, { - type: "tool-result", - toolCallId: "call-2", - content: "Error", - state: "error", + type: 'tool-result', + toolCallId: 'call-2', + content: 'Error', + state: 'error', }, { - type: "tool-result", - toolCallId: "call-3", - content: "Streaming", - state: "streaming", // Not included + type: 'tool-result', + toolCallId: 'call-3', + content: 'Streaming', + state: 'streaming', // Not included }, ], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result).toHaveLength(3); // Main message + 2 tool results - expect(result.filter((m) => m.role === "tool")).toHaveLength(2); - }); + const result = uiMessageToModelMessages(uiMessage) + expect(result).toHaveLength(3) // Main message + 2 tool results + expect(result.filter((m) => m.role === 'tool')).toHaveLength(2) + }) - it("should handle assistant message with only tool calls", () => { + it('should handle assistant message with only tool calls', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "call-1", - name: "tool1", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'call-1', + name: 'tool1', + arguments: '{}', + state: 'input-complete', }, ], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result).toHaveLength(1); - expect(result[0].toolCalls).toBeDefined(); - expect(result[0].content).toBeNull(); - }); + const result = uiMessageToModelMessages(uiMessage) + expect(result).toHaveLength(1) + expect(result[0].toolCalls).toBeDefined() + expect(result[0].content).toBeNull() + }) - it("should handle message with text and tool calls", () => { + it('should handle message with text and tool calls', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ - { type: "text", content: "Let me check" }, + { type: 'text', content: 'Let me check' }, { - type: "tool-call", - id: "call-1", - name: "tool1", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'call-1', + name: 'tool1', + arguments: '{}', + state: 'input-complete', }, ], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result[0].content).toBe("Let me check"); - expect(result[0].toolCalls).toBeDefined(); - }); + const result = uiMessageToModelMessages(uiMessage) + expect(result[0].content).toBe('Let me check') + expect(result[0].toolCalls).toBeDefined() + }) - it("should handle empty content", () => { + it('should handle empty content', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "user", + id: 'msg-1', + role: 'user', parts: [], createdAt: new Date(), - }; + } - const result = uiMessageToModelMessages(uiMessage); - expect(result[0].content).toBeNull(); - }); - }); + const result = uiMessageToModelMessages(uiMessage) + expect(result[0].content).toBeNull() + }) + }) - describe("modelMessageToUIMessage", () => { - it("should convert text message", () => { + describe('modelMessageToUIMessage', () => { + it('should convert text message', () => { const modelMessage: ModelMessage = { - role: "user", - content: "Hello", - }; - - const result = modelMessageToUIMessage(modelMessage, "msg-1"); - expect(result.id).toBe("msg-1"); - expect(result.role).toBe("user"); - expect(result.parts).toHaveLength(1); + role: 'user', + content: 'Hello', + } + + const result = modelMessageToUIMessage(modelMessage, 'msg-1') + expect(result.id).toBe('msg-1') + expect(result.role).toBe('user') + expect(result.parts).toHaveLength(1) expect(result.parts[0]).toEqual({ - type: "text", - content: "Hello", - }); - }); + type: 'text', + content: 'Hello', + }) + }) - it("should generate ID if not provided", () => { + it('should generate ID if not provided', () => { const modelMessage: ModelMessage = { - role: "user", - content: "Hello", - }; + role: 'user', + content: 'Hello', + } - const result = modelMessageToUIMessage(modelMessage); - expect(result.id).toBeTruthy(); - expect(result.id).toMatch(/^msg-/); - }); + const result = modelMessageToUIMessage(modelMessage) + expect(result.id).toBeTruthy() + expect(result.id).toMatch(/^msg-/) + }) - it("should convert message with tool calls", () => { + it('should convert message with tool calls', () => { const modelMessage: ModelMessage = { - role: "assistant", + role: 'assistant', toolCalls: [ { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "get_weather", + name: 'get_weather', arguments: '{"city": "NYC"}', }, }, ], - }; + } - const result = modelMessageToUIMessage(modelMessage); - expect(result.parts).toHaveLength(1); + const result = modelMessageToUIMessage(modelMessage) + expect(result.parts).toHaveLength(1) expect(result.parts[0]).toEqual({ - type: "tool-call", - id: "call-1", - name: "get_weather", + type: 'tool-call', + id: 'call-1', + name: 'get_weather', arguments: '{"city": "NYC"}', - state: "input-complete", - }); - }); + state: 'input-complete', + }) + }) - it("should convert tool role message", () => { + it('should convert tool role message', () => { const modelMessage: ModelMessage = { - role: "tool", - content: "Tool result", - toolCallId: "call-1", - }; + role: 'tool', + content: 'Tool result', + toolCallId: 'call-1', + } - const result = modelMessageToUIMessage(modelMessage); - expect(result.role).toBe("assistant"); // Tool messages converted to assistant + const result = modelMessageToUIMessage(modelMessage) + expect(result.role).toBe('assistant') // Tool messages converted to assistant // Tool messages with content create both text and tool-result parts - expect(result.parts.length).toBeGreaterThanOrEqual(1); - const toolResultPart = result.parts.find((p) => p.type === "tool-result"); + expect(result.parts.length).toBeGreaterThanOrEqual(1) + const toolResultPart = result.parts.find((p) => p.type === 'tool-result') expect(toolResultPart).toEqual({ - type: "tool-result", - toolCallId: "call-1", - content: "Tool result", - state: "complete", - }); - }); - - it("should handle message without content", () => { + type: 'tool-result', + toolCallId: 'call-1', + content: 'Tool result', + state: 'complete', + }) + }) + + it('should handle message without content', () => { const modelMessage: ModelMessage = { - role: "assistant", + role: 'assistant', toolCalls: [ { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "tool1", - arguments: "{}", + name: 'tool1', + arguments: '{}', }, }, ], - }; + } - const result = modelMessageToUIMessage(modelMessage); - expect(result.parts).toHaveLength(1); - expect(result.parts[0].type).toBe("tool-call"); - }); + const result = modelMessageToUIMessage(modelMessage) + expect(result.parts).toHaveLength(1) + expect(result.parts[0].type).toBe('tool-call') + }) - it("should handle empty tool result content", () => { + it('should handle empty tool result content', () => { const modelMessage: ModelMessage = { - role: "tool", + role: 'tool', content: null, - toolCallId: "call-1", - }; + toolCallId: 'call-1', + } - const result = modelMessageToUIMessage(modelMessage); + const result = modelMessageToUIMessage(modelMessage) expect(result.parts[0]).toEqual({ - type: "tool-result", - toolCallId: "call-1", - content: "", - state: "complete", - }); - }); - }); - - describe("modelMessagesToUIMessages", () => { - it("should convert simple messages", () => { + type: 'tool-result', + toolCallId: 'call-1', + content: '', + state: 'complete', + }) + }) + }) + + describe('modelMessagesToUIMessages', () => { + it('should convert simple messages', () => { const modelMessages: ModelMessage[] = [ - { role: "user", content: "Hello" }, - { role: "assistant", content: "Hi" }, - ]; + { role: 'user', content: 'Hello' }, + { role: 'assistant', content: 'Hi' }, + ] - const result = modelMessagesToUIMessages(modelMessages); - expect(result).toHaveLength(2); - expect(result[0].role).toBe("user"); - expect(result[1].role).toBe("assistant"); - }); + const result = modelMessagesToUIMessages(modelMessages) + expect(result).toHaveLength(2) + expect(result[0].role).toBe('user') + expect(result[1].role).toBe('assistant') + }) - it("should merge tool results into assistant messages", () => { + it('should merge tool results into assistant messages', () => { const modelMessages: ModelMessage[] = [ { - role: "assistant", + role: 'assistant', toolCalls: [ { - id: "call-1", - type: "function", - function: { name: "tool1", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'tool1', arguments: '{}' }, }, ], }, { - role: "tool", - content: "Result", - toolCallId: "call-1", + role: 'tool', + content: 'Result', + toolCallId: 'call-1', }, - ]; + ] - const result = modelMessagesToUIMessages(modelMessages); - expect(result).toHaveLength(1); - expect(result[0].parts).toHaveLength(2); // tool-call + tool-result + const result = modelMessagesToUIMessages(modelMessages) + expect(result).toHaveLength(1) + expect(result[0].parts).toHaveLength(2) // tool-call + tool-result expect(result[0].parts[1]).toEqual({ - type: "tool-result", - toolCallId: "call-1", - content: "Result", - state: "complete", - }); - }); - - it("should create standalone tool result if no assistant message", () => { + type: 'tool-result', + toolCallId: 'call-1', + content: 'Result', + state: 'complete', + }) + }) + + it('should create standalone tool result if no assistant message', () => { const modelMessages: ModelMessage[] = [ - { role: "user", content: "Hello" }, + { role: 'user', content: 'Hello' }, { - role: "tool", - content: "Result", - toolCallId: "call-1", + role: 'tool', + content: 'Result', + toolCallId: 'call-1', }, - ]; + ] - const result = modelMessagesToUIMessages(modelMessages); - expect(result).toHaveLength(2); - expect(result[1].role).toBe("assistant"); + const result = modelMessagesToUIMessages(modelMessages) + expect(result).toHaveLength(2) + expect(result[1].role).toBe('assistant') // Tool messages with content create both text and tool-result parts const toolResultPart = result[1].parts.find( - (p) => p.type === "tool-result" - ); - expect(toolResultPart).toBeDefined(); + (p) => p.type === 'tool-result', + ) + expect(toolResultPart).toBeDefined() expect(toolResultPart).toEqual({ - type: "tool-result", - toolCallId: "call-1", - content: "Result", - state: "complete", - }); - }); - - it("should reset assistant tracking on non-assistant message", () => { + type: 'tool-result', + toolCallId: 'call-1', + content: 'Result', + state: 'complete', + }) + }) + + it('should reset assistant tracking on non-assistant message', () => { const modelMessages: ModelMessage[] = [ { - role: "assistant", - content: "First", + role: 'assistant', + content: 'First', }, - { role: "user", content: "Second" }, + { role: 'user', content: 'Second' }, { - role: "tool", - content: "Result", - toolCallId: "call-1", + role: 'tool', + content: 'Result', + toolCallId: 'call-1', }, - ]; + ] - const result = modelMessagesToUIMessages(modelMessages); - expect(result).toHaveLength(3); + const result = modelMessagesToUIMessages(modelMessages) + expect(result).toHaveLength(3) // Tool result should be standalone since user message reset tracking // Tool messages with content create both text and tool-result parts const toolResultPart = result[2].parts.find( - (p) => p.type === "tool-result" - ); - expect(toolResultPart).toBeDefined(); + (p) => p.type === 'tool-result', + ) + expect(toolResultPart).toBeDefined() expect(toolResultPart).toEqual({ - type: "tool-result", - toolCallId: "call-1", - content: "Result", - state: "complete", - }); - }); - - it("should handle multiple tool results for same assistant", () => { + type: 'tool-result', + toolCallId: 'call-1', + content: 'Result', + state: 'complete', + }) + }) + + it('should handle multiple tool results for same assistant', () => { const modelMessages: ModelMessage[] = [ { - role: "assistant", + role: 'assistant', toolCalls: [ { - id: "call-1", - type: "function", - function: { name: "tool1", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'tool1', arguments: '{}' }, }, { - id: "call-2", - type: "function", - function: { name: "tool2", arguments: "{}" }, + id: 'call-2', + type: 'function', + function: { name: 'tool2', arguments: '{}' }, }, ], }, { - role: "tool", - content: "Result 1", - toolCallId: "call-1", + role: 'tool', + content: 'Result 1', + toolCallId: 'call-1', }, { - role: "tool", - content: "Result 2", - toolCallId: "call-2", + role: 'tool', + content: 'Result 2', + toolCallId: 'call-2', }, - ]; + ] - const result = modelMessagesToUIMessages(modelMessages); - expect(result).toHaveLength(1); - expect(result[0].parts).toHaveLength(4); // 2 tool-calls + 2 tool-results - }); - }); + const result = modelMessagesToUIMessages(modelMessages) + expect(result).toHaveLength(1) + expect(result[0].parts).toHaveLength(4) // 2 tool-calls + 2 tool-results + }) + }) - describe("normalizeToUIMessage", () => { - it("should normalize UIMessage with missing id", () => { + describe('normalizeToUIMessage', () => { + it('should normalize UIMessage with missing id', () => { const uiMessage: UIMessage = { - id: "", - role: "user", - parts: [{ type: "text", content: "Hello" }], - }; + id: '', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], + } - const generateId = () => "generated-id"; - const result = normalizeToUIMessage(uiMessage, generateId); + const generateId = () => 'generated-id' + const result = normalizeToUIMessage(uiMessage, generateId) - expect(result.id).toBe("generated-id"); - expect(result.createdAt).toBeInstanceOf(Date); - }); + expect(result.id).toBe('generated-id') + expect(result.createdAt).toBeInstanceOf(Date) + }) - it("should normalize UIMessage with missing createdAt", () => { + it('should normalize UIMessage with missing createdAt', () => { const uiMessage: UIMessage = { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], - }; + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], + } - const generateId = () => "id"; - const result = normalizeToUIMessage(uiMessage, generateId); + const generateId = () => 'id' + const result = normalizeToUIMessage(uiMessage, generateId) - expect(result.id).toBe("msg-1"); - expect(result.createdAt).toBeInstanceOf(Date); - }); + expect(result.id).toBe('msg-1') + expect(result.createdAt).toBeInstanceOf(Date) + }) - it("should preserve existing id and createdAt", () => { - const createdAt = new Date("2024-01-01"); + it('should preserve existing id and createdAt', () => { + const createdAt = new Date('2024-01-01') const uiMessage: UIMessage = { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt, - }; + } - const generateId = () => "new-id"; - const result = normalizeToUIMessage(uiMessage, generateId); + const generateId = () => 'new-id' + const result = normalizeToUIMessage(uiMessage, generateId) - expect(result.id).toBe("msg-1"); - expect(result.createdAt).toBe(createdAt); - }); + expect(result.id).toBe('msg-1') + expect(result.createdAt).toBe(createdAt) + }) - it("should convert ModelMessage to UIMessage", () => { + it('should convert ModelMessage to UIMessage', () => { const modelMessage: ModelMessage = { - role: "user", - content: "Hello", - }; + role: 'user', + content: 'Hello', + } - const generateId = () => "msg-1"; - const result = normalizeToUIMessage(modelMessage, generateId); + const generateId = () => 'msg-1' + const result = normalizeToUIMessage(modelMessage, generateId) - expect(result.id).toBe("msg-1"); - expect(result.role).toBe("user"); - expect(result.parts).toHaveLength(1); - expect(result.createdAt).toBeInstanceOf(Date); - }); + expect(result.id).toBe('msg-1') + expect(result.role).toBe('user') + expect(result.parts).toHaveLength(1) + expect(result.createdAt).toBeInstanceOf(Date) + }) - it("should convert ModelMessage with tool calls", () => { + it('should convert ModelMessage with tool calls', () => { const modelMessage: ModelMessage = { - role: "assistant", + role: 'assistant', toolCalls: [ { - id: "call-1", - type: "function", - function: { name: "tool1", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'tool1', arguments: '{}' }, }, ], - }; + } - const generateId = () => "msg-1"; - const result = normalizeToUIMessage(modelMessage, generateId); + const generateId = () => 'msg-1' + const result = normalizeToUIMessage(modelMessage, generateId) - expect(result.parts).toHaveLength(1); - expect(result.parts[0].type).toBe("tool-call"); - }); - }); -}); + expect(result.parts).toHaveLength(1) + expect(result.parts[0].type).toBe('tool-call') + }) + }) +}) diff --git a/packages/typescript/ai-client/tests/message-updaters.test.ts b/packages/typescript/ai-client/tests/message-updaters.test.ts index eebe287fb..0da5c6849 100644 --- a/packages/typescript/ai-client/tests/message-updaters.test.ts +++ b/packages/typescript/ai-client/tests/message-updaters.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect } from "vitest"; +import { describe, it, expect } from 'vitest' import { updateTextPart, updateToolCallPart, @@ -7,734 +7,729 @@ import { updateToolCallState, updateToolCallWithOutput, updateToolCallApprovalResponse, -} from "../src/message-updaters"; -import type { UIMessage } from "../src/types"; +} from '../src/message-updaters' +import type { UIMessage } from '../src/types' -describe("message-updaters", () => { - describe("updateTextPart", () => { - it("should add text part to empty message", () => { +describe('message-updaters', () => { + describe('updateTextPart', () => { + it('should add text part to empty message', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, - ]; + ] - const result = updateTextPart(messages, "msg-1", "Hello"); + const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result[0].parts).toHaveLength(1); - expect(result[0].parts[0]).toEqual({ type: "text", content: "Hello" }); - }); + expect(result[0].parts).toHaveLength(1) + expect(result[0].parts[0]).toEqual({ type: 'text', content: 'Hello' }) + }) - it("should update existing text part", () => { + it('should update existing text part', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'assistant', + parts: [{ type: 'text', content: 'Hello' }], }, - ]; + ] - const result = updateTextPart(messages, "msg-1", "Hello world"); + const result = updateTextPart(messages, 'msg-1', 'Hello world') - expect(result[0].parts).toHaveLength(1); + expect(result[0].parts).toHaveLength(1) expect(result[0].parts[0]).toEqual({ - type: "text", - content: "Hello world", - }); - }); + type: 'text', + content: 'Hello world', + }) + }) - it("should place text part after tool calls", () => { + it('should place text part after tool calls', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', }, ], }, - ]; + ] - const result = updateTextPart(messages, "msg-1", "Hello"); + const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result[0].parts).toHaveLength(2); - expect(result[0].parts[0].type).toBe("tool-call"); - expect(result[0].parts[1]).toEqual({ type: "text", content: "Hello" }); - }); + expect(result[0].parts).toHaveLength(2) + expect(result[0].parts[0].type).toBe('tool-call') + expect(result[0].parts[1]).toEqual({ type: 'text', content: 'Hello' }) + }) - it("should maintain order: tool calls, other parts, text", () => { + it('should maintain order: tool calls, other parts, text', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', }, { - type: "tool-result", - toolCallId: "tool-1", - content: "result", - state: "complete", + type: 'tool-result', + toolCallId: 'tool-1', + content: 'result', + state: 'complete', }, ], }, - ]; + ] - const result = updateTextPart(messages, "msg-1", "Hello"); + const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result[0].parts).toHaveLength(3); - expect(result[0].parts[0].type).toBe("tool-call"); - expect(result[0].parts[1].type).toBe("tool-result"); - expect(result[0].parts[2]).toEqual({ type: "text", content: "Hello" }); - }); + expect(result[0].parts).toHaveLength(3) + expect(result[0].parts[0].type).toBe('tool-call') + expect(result[0].parts[1].type).toBe('tool-result') + expect(result[0].parts[2]).toEqual({ type: 'text', content: 'Hello' }) + }) - it("should not modify other messages", () => { + it('should not modify other messages', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, { - id: "msg-2", - role: "user", - parts: [{ type: "text", content: "User message" }], + id: 'msg-2', + role: 'user', + parts: [{ type: 'text', content: 'User message' }], }, - ]; + ] - const result = updateTextPart(messages, "msg-1", "Hello"); + const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result[0].parts).toHaveLength(1); - expect(result[1].parts).toHaveLength(1); + expect(result[0].parts).toHaveLength(1) + expect(result[1].parts).toHaveLength(1) expect(result[1].parts[0]).toEqual({ - type: "text", - content: "User message", - }); - }); + type: 'text', + content: 'User message', + }) + }) - it("should return new array (immutability)", () => { + it('should return new array (immutability)', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, - ]; + ] - const result = updateTextPart(messages, "msg-1", "Hello"); + const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result).not.toBe(messages); - expect(messages[0].parts).toHaveLength(0); - }); - }); + expect(result).not.toBe(messages) + expect(messages[0].parts).toHaveLength(0) + }) + }) - describe("updateToolCallPart", () => { - it("should add tool call part to empty message", () => { + describe('updateToolCallPart', () => { + it('should add tool call part to empty message', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, - ]; + ] - const result = updateToolCallPart(messages, "msg-1", { - id: "tool-1", - name: "test", + const result = updateToolCallPart(messages, 'msg-1', { + id: 'tool-1', + name: 'test', arguments: '{"x": 1}', - state: "input-complete", - }); + state: 'input-complete', + }) - expect(result[0].parts).toHaveLength(1); + expect(result[0].parts).toHaveLength(1) expect(result[0].parts[0]).toEqual({ - type: "tool-call", - id: "tool-1", - name: "test", + type: 'tool-call', + id: 'tool-1', + name: 'test', arguments: '{"x": 1}', - state: "input-complete", - }); - }); + state: 'input-complete', + }) + }) - it("should update existing tool call part", () => { + it('should update existing tool call part', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", + type: 'tool-call', + id: 'tool-1', + name: 'test', arguments: '{"x": 1}', - state: "input-streaming", + state: 'input-streaming', }, ], }, - ]; + ] - const result = updateToolCallPart(messages, "msg-1", { - id: "tool-1", - name: "test", + const result = updateToolCallPart(messages, 'msg-1', { + id: 'tool-1', + name: 'test', arguments: '{"x": 1, "y": 2}', - state: "input-complete", - }); + state: 'input-complete', + }) - expect(result[0].parts).toHaveLength(1); + expect(result[0].parts).toHaveLength(1) expect(result[0].parts[0]).toEqual({ - type: "tool-call", - id: "tool-1", - name: "test", + type: 'tool-call', + id: 'tool-1', + name: 'test', arguments: '{"x": 1, "y": 2}', - state: "input-complete", - }); - }); + state: 'input-complete', + }) + }) - it("should insert tool call before text parts", () => { + it('should insert tool call before text parts', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'assistant', + parts: [{ type: 'text', content: 'Hello' }], }, - ]; + ] - const result = updateToolCallPart(messages, "msg-1", { - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", - }); + const result = updateToolCallPart(messages, 'msg-1', { + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', + }) - expect(result[0].parts).toHaveLength(2); - expect(result[0].parts[0].type).toBe("tool-call"); - expect(result[0].parts[1].type).toBe("text"); - }); + expect(result[0].parts).toHaveLength(2) + expect(result[0].parts[0].type).toBe('tool-call') + expect(result[0].parts[1].type).toBe('text') + }) - it("should not modify other messages", () => { + it('should not modify other messages', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, { - id: "msg-2", - role: "user", - parts: [{ type: "text", content: "User message" }], + id: 'msg-2', + role: 'user', + parts: [{ type: 'text', content: 'User message' }], }, - ]; - - const result = updateToolCallPart(messages, "msg-1", { - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", - }); - - expect(result[0].parts).toHaveLength(1); - expect(result[1].parts).toHaveLength(1); - }); - }); - - describe("updateToolResultPart", () => { - it("should add tool result part to message", () => { + ] + + const result = updateToolCallPart(messages, 'msg-1', { + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', + }) + + expect(result[0].parts).toHaveLength(1) + expect(result[1].parts).toHaveLength(1) + }) + }) + + describe('updateToolResultPart', () => { + it('should add tool result part to message', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, - ]; + ] const result = updateToolResultPart( messages, - "msg-1", - "tool-1", - "result content", - "complete" - ); + 'msg-1', + 'tool-1', + 'result content', + 'complete', + ) - expect(result[0].parts).toHaveLength(1); + expect(result[0].parts).toHaveLength(1) expect(result[0].parts[0]).toEqual({ - type: "tool-result", - toolCallId: "tool-1", - content: "result content", - state: "complete", - }); - }); - - it("should update existing tool result part", () => { + type: 'tool-result', + toolCallId: 'tool-1', + content: 'result content', + state: 'complete', + }) + }) + + it('should update existing tool result part', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-result", - toolCallId: "tool-1", - content: "old content", - state: "streaming", + type: 'tool-result', + toolCallId: 'tool-1', + content: 'old content', + state: 'streaming', }, ], }, - ]; + ] const result = updateToolResultPart( messages, - "msg-1", - "tool-1", - "new content", - "complete" - ); + 'msg-1', + 'tool-1', + 'new content', + 'complete', + ) - expect(result[0].parts).toHaveLength(1); + expect(result[0].parts).toHaveLength(1) expect(result[0].parts[0]).toEqual({ - type: "tool-result", - toolCallId: "tool-1", - content: "new content", - state: "complete", - }); - }); - - it("should include error when provided", () => { + type: 'tool-result', + toolCallId: 'tool-1', + content: 'new content', + state: 'complete', + }) + }) + + it('should include error when provided', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, - ]; + ] const result = updateToolResultPart( messages, - "msg-1", - "tool-1", - "error content", - "error", - "Something went wrong" - ); + 'msg-1', + 'tool-1', + 'error content', + 'error', + 'Something went wrong', + ) expect(result[0].parts[0]).toEqual({ - type: "tool-result", - toolCallId: "tool-1", - content: "error content", - state: "error", - error: "Something went wrong", - }); - }); - }); - - describe("updateToolCallApproval", () => { - it("should add approval metadata to tool call", () => { + type: 'tool-result', + toolCallId: 'tool-1', + content: 'error content', + state: 'error', + error: 'Something went wrong', + }) + }) + }) + + describe('updateToolCallApproval', () => { + it('should add approval metadata to tool call', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', }, ], }, - ]; + ] const result = updateToolCallApproval( messages, - "msg-1", - "tool-1", - "approval-123" - ); - - const toolCall = result[0].parts[0]; - expect(toolCall.type).toBe("tool-call"); - if (toolCall.type === "tool-call") { - expect(toolCall.state).toBe("approval-requested"); + 'msg-1', + 'tool-1', + 'approval-123', + ) + + const toolCall = result[0].parts[0] + expect(toolCall.type).toBe('tool-call') + if (toolCall.type === 'tool-call') { + expect(toolCall.state).toBe('approval-requested') expect(toolCall.approval).toEqual({ - id: "approval-123", + id: 'approval-123', needsApproval: true, - }); + }) } - }); + }) - it("should not modify tool call if not found", () => { + it('should not modify tool call if not found', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', }, ], }, - ]; + ] const result = updateToolCallApproval( messages, - "msg-1", - "tool-2", - "approval-123" - ); - - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call") { - expect(toolCall.state).toBe("input-complete"); - expect(toolCall.approval).toBeUndefined(); + 'msg-1', + 'tool-2', + 'approval-123', + ) + + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call') { + expect(toolCall.state).toBe('input-complete') + expect(toolCall.approval).toBeUndefined() } - }); - }); + }) + }) - describe("updateToolCallState", () => { - it("should update tool call state", () => { + describe('updateToolCallState', () => { + it('should update tool call state', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-streaming", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-streaming', }, ], }, - ]; + ] const result = updateToolCallState( messages, - "msg-1", - "tool-1", - "input-complete" - ); - - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call") { - expect(toolCall.state).toBe("input-complete"); + 'msg-1', + 'tool-1', + 'input-complete', + ) + + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call') { + expect(toolCall.state).toBe('input-complete') } - }); + }) - it("should not modify tool call if not found", () => { + it('should not modify tool call if not found', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-streaming", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-streaming', }, ], }, - ]; + ] const result = updateToolCallState( messages, - "msg-1", - "tool-2", - "input-complete" - ); - - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call") { - expect(toolCall.state).toBe("input-streaming"); + 'msg-1', + 'tool-2', + 'input-complete', + ) + + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call') { + expect(toolCall.state).toBe('input-streaming') } - }); - }); + }) + }) - describe("updateToolCallWithOutput", () => { - it("should update tool call with output", () => { + describe('updateToolCallWithOutput', () => { + it('should update tool call with output', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', }, ], }, - ]; + ] - const result = updateToolCallWithOutput( - messages, - "tool-1", - { result: "success" } - ); - - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call") { - expect(toolCall.output).toEqual({ result: "success" }); - expect(toolCall.state).toBe("input-complete"); + const result = updateToolCallWithOutput(messages, 'tool-1', { + result: 'success', + }) + + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call') { + expect(toolCall.output).toEqual({ result: 'success' }) + expect(toolCall.state).toBe('input-complete') } - }); + }) - it("should update state when provided", () => { + it('should update state when provided', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', }, ], }, - ]; + ] const result = updateToolCallWithOutput( messages, - "tool-1", - { result: "success" }, - "approval-requested" - ); - - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call") { - expect(toolCall.state).toBe("approval-requested"); + 'tool-1', + { result: 'success' }, + 'approval-requested', + ) + + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call') { + expect(toolCall.state).toBe('approval-requested') } - }); + }) - it("should handle error text", () => { + it('should handle error text', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', }, ], }, - ]; + ] const result = updateToolCallWithOutput( messages, - "tool-1", + 'tool-1', null, undefined, - "Error occurred" - ); + 'Error occurred', + ) - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call") { - expect(toolCall.output).toEqual({ error: "Error occurred" }); + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call') { + expect(toolCall.output).toEqual({ error: 'Error occurred' }) } - }); + }) - it("should search across all messages", () => { + it('should search across all messages', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, { - id: "msg-2", - role: "assistant", + id: 'msg-2', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "input-complete", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'input-complete', }, ], }, - ]; + ] - const result = updateToolCallWithOutput( - messages, - "tool-1", - { result: "success" } - ); - - expect(result[0].parts).toHaveLength(0); - const toolCall = result[1].parts[0]; - if (toolCall.type === "tool-call") { - expect(toolCall.output).toEqual({ result: "success" }); + const result = updateToolCallWithOutput(messages, 'tool-1', { + result: 'success', + }) + + expect(result[0].parts).toHaveLength(0) + const toolCall = result[1].parts[0] + if (toolCall.type === 'tool-call') { + expect(toolCall.output).toEqual({ result: 'success' }) } - }); - }); + }) + }) - describe("updateToolCallApprovalResponse", () => { - it("should update approval response", () => { + describe('updateToolCallApprovalResponse', () => { + it('should update approval response', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "approval-requested", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'approval-requested', approval: { - id: "approval-123", + id: 'approval-123', needsApproval: true, }, }, ], }, - ]; + ] const result = updateToolCallApprovalResponse( messages, - "approval-123", - true - ); - - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call" && toolCall.approval) { - expect(toolCall.approval.approved).toBe(true); - expect(toolCall.state).toBe("approval-responded"); + 'approval-123', + true, + ) + + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call' && toolCall.approval) { + expect(toolCall.approval.approved).toBe(true) + expect(toolCall.state).toBe('approval-responded') } - }); + }) - it("should handle denied approval", () => { + it('should handle denied approval', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "approval-requested", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'approval-requested', approval: { - id: "approval-123", + id: 'approval-123', needsApproval: true, }, }, ], }, - ]; + ] const result = updateToolCallApprovalResponse( messages, - "approval-123", - false - ); - - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call" && toolCall.approval) { - expect(toolCall.approval.approved).toBe(false); - expect(toolCall.state).toBe("approval-responded"); + 'approval-123', + false, + ) + + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call' && toolCall.approval) { + expect(toolCall.approval.approved).toBe(false) + expect(toolCall.state).toBe('approval-responded') } - }); + }) - it("should search across all messages", () => { + it('should search across all messages', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [], }, { - id: "msg-2", - role: "assistant", + id: 'msg-2', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "approval-requested", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'approval-requested', approval: { - id: "approval-123", + id: 'approval-123', needsApproval: true, }, }, ], }, - ]; + ] const result = updateToolCallApprovalResponse( messages, - "approval-123", - true - ); - - expect(result[0].parts).toHaveLength(0); - const toolCall = result[1].parts[0]; - if (toolCall.type === "tool-call" && toolCall.approval) { - expect(toolCall.approval.approved).toBe(true); + 'approval-123', + true, + ) + + expect(result[0].parts).toHaveLength(0) + const toolCall = result[1].parts[0] + if (toolCall.type === 'tool-call' && toolCall.approval) { + expect(toolCall.approval.approved).toBe(true) } - }); + }) - it("should not modify if approval not found", () => { + it('should not modify if approval not found', () => { const messages: UIMessage[] = [ { - id: "msg-1", - role: "assistant", + id: 'msg-1', + role: 'assistant', parts: [ { - type: "tool-call", - id: "tool-1", - name: "test", - arguments: "{}", - state: "approval-requested", + type: 'tool-call', + id: 'tool-1', + name: 'test', + arguments: '{}', + state: 'approval-requested', approval: { - id: "approval-123", + id: 'approval-123', needsApproval: true, }, }, ], }, - ]; + ] const result = updateToolCallApprovalResponse( messages, - "approval-999", - true - ); - - const toolCall = result[0].parts[0]; - if (toolCall.type === "tool-call" && toolCall.approval) { - expect(toolCall.approval.approved).toBeUndefined(); - expect(toolCall.state).toBe("approval-requested"); + 'approval-999', + true, + ) + + const toolCall = result[0].parts[0] + if (toolCall.type === 'tool-call' && toolCall.approval) { + expect(toolCall.approval.approved).toBeUndefined() + expect(toolCall.state).toBe('approval-requested') } - }); - }); -}); - + }) + }) +}) diff --git a/packages/typescript/ai-client/tests/stream-processor.test.ts b/packages/typescript/ai-client/tests/stream-processor.test.ts index d954a11b6..0361ce965 100644 --- a/packages/typescript/ai-client/tests/stream-processor.test.ts +++ b/packages/typescript/ai-client/tests/stream-processor.test.ts @@ -1,333 +1,333 @@ -import { describe, it, expect, vi } from "vitest"; -import { StreamProcessor } from "../src/stream/processor"; +import { describe, it, expect, vi } from 'vitest' +import { StreamProcessor } from '../src/stream/processor' -describe("StreamProcessor - Tool Call Handling", () => { - it("should handle multiple tool calls with same index correctly", async () => { +describe('StreamProcessor - Tool Call Handling', () => { + it('should handle multiple tool calls with same index correctly', async () => { // REAL chunks captured from actual OpenAI stream const rawChunks = [ // First response: getGuitars { - type: "tool_call", - id: "chatcmpl-CXZrKuhSRu4G2qbT1mNYCEvNd8DMJ", - model: "gpt-4o-2024-08-06", + type: 'tool_call', + id: 'chatcmpl-CXZrKuhSRu4G2qbT1mNYCEvNd8DMJ', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703060, toolCall: { - id: "call_RhSbfkt2O34Wozns6KFxSvL7", - type: "function", + id: 'call_RhSbfkt2O34Wozns6KFxSvL7', + type: 'function', function: { - name: "getGuitars", - arguments: "", + name: 'getGuitars', + arguments: '', }, }, index: 0, }, { - type: "tool_call", - id: "chatcmpl-CXZrKuhSRu4G2qbT1mNYCEvNd8DMJ", - model: "gpt-4o-2024-08-06", + type: 'tool_call', + id: 'chatcmpl-CXZrKuhSRu4G2qbT1mNYCEvNd8DMJ', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703060, toolCall: { - id: "call_RhSbfkt2O34Wozns6KFxSvL7", - type: "function", + id: 'call_RhSbfkt2O34Wozns6KFxSvL7', + type: 'function', function: { - name: "getGuitars", - arguments: "{}", + name: 'getGuitars', + arguments: '{}', }, }, index: 0, }, { - type: "done", - id: "chatcmpl-CXZrKuhSRu4G2qbT1mNYCEvNd8DMJ", - model: "gpt-4o-2024-08-06", + type: 'done', + id: 'chatcmpl-CXZrKuhSRu4G2qbT1mNYCEvNd8DMJ', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703060, - finishReason: "tool_calls", + finishReason: 'tool_calls', }, // Tool result { - type: "tool_result", - id: "chatcmpl-CXZrKuhSRu4G2qbT1mNYCEvNd8DMJ", - model: "gpt-4o-2024-08-06", + type: 'tool_result', + id: 'chatcmpl-CXZrKuhSRu4G2qbT1mNYCEvNd8DMJ', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703087, - toolCallId: "call_RhSbfkt2O34Wozns6KFxSvL7", + toolCallId: 'call_RhSbfkt2O34Wozns6KFxSvL7', content: '[{"id":6,"name":"Travelin\' Man Guitar"}]', }, // Second response: recommendGuitar (ALSO index 0!) { - type: "tool_call", - id: "chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I", - model: "gpt-4o-2024-08-06", + type: 'tool_call', + id: 'chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703598, toolCall: { - id: "call_SP6fjKyNURSf4EebfrnsdpTM", - type: "function", + id: 'call_SP6fjKyNURSf4EebfrnsdpTM', + type: 'function', function: { - name: "recommendGuitar", - arguments: "", + name: 'recommendGuitar', + arguments: '', }, }, index: 0, }, { - type: "tool_call", - id: "chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I", - model: "gpt-4o-2024-08-06", + type: 'tool_call', + id: 'chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703598, toolCall: { - id: "call_SP6fjKyNURSf4EebfrnsdpTM", - type: "function", + id: 'call_SP6fjKyNURSf4EebfrnsdpTM', + type: 'function', function: { - name: "recommendGuitar", + name: 'recommendGuitar', arguments: '{"', }, }, index: 0, }, { - type: "tool_call", - id: "chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I", - model: "gpt-4o-2024-08-06", + type: 'tool_call', + id: 'chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703598, toolCall: { - id: "call_SP6fjKyNURSf4EebfrnsdpTM", - type: "function", + id: 'call_SP6fjKyNURSf4EebfrnsdpTM', + type: 'function', function: { - name: "recommendGuitar", - arguments: "id", + name: 'recommendGuitar', + arguments: 'id', }, }, index: 0, }, { - type: "tool_call", - id: "chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I", - model: "gpt-4o-2024-08-06", + type: 'tool_call', + id: 'chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703598, toolCall: { - id: "call_SP6fjKyNURSf4EebfrnsdpTM", - type: "function", + id: 'call_SP6fjKyNURSf4EebfrnsdpTM', + type: 'function', function: { - name: "recommendGuitar", + name: 'recommendGuitar', arguments: '":"', }, }, index: 0, }, { - type: "tool_call", - id: "chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I", - model: "gpt-4o-2024-08-06", + type: 'tool_call', + id: 'chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703598, toolCall: { - id: "call_SP6fjKyNURSf4EebfrnsdpTM", - type: "function", + id: 'call_SP6fjKyNURSf4EebfrnsdpTM', + type: 'function', function: { - name: "recommendGuitar", - arguments: "6", + name: 'recommendGuitar', + arguments: '6', }, }, index: 0, }, { - type: "tool_call", - id: "chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I", - model: "gpt-4o-2024-08-06", + type: 'tool_call', + id: 'chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703598, toolCall: { - id: "call_SP6fjKyNURSf4EebfrnsdpTM", - type: "function", + id: 'call_SP6fjKyNURSf4EebfrnsdpTM', + type: 'function', function: { - name: "recommendGuitar", + name: 'recommendGuitar', arguments: '"}', }, }, index: 0, }, { - type: "done", - id: "chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I", - model: "gpt-4o-2024-08-06", + type: 'done', + id: 'chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703598, - finishReason: "tool_calls", + finishReason: 'tool_calls', }, // Tool result for recommendGuitar { - type: "tool_result", - id: "chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I", - model: "gpt-4o-2024-08-06", + type: 'tool_result', + id: 'chatcmpl-CXZrLsKvaT7GXnWB6MY7v0uxylC4I', + model: 'gpt-4o-2024-08-06', timestamp: 1762118703715, - toolCallId: "call_SP6fjKyNURSf4EebfrnsdpTM", + toolCallId: 'call_SP6fjKyNURSf4EebfrnsdpTM', content: '{"id":"6"}', }, // Final response with text content { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: "Complete", - content: "Complete", - role: "assistant", + delta: 'Complete', + content: 'Complete', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: "!", - content: "Complete!", - role: "assistant", + delta: '!', + content: 'Complete!', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " If", - content: "Complete! If", - role: "assistant", + delta: ' If', + content: 'Complete! If', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " you", - content: "Complete! If you", - role: "assistant", + delta: ' you', + content: 'Complete! If you', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " need", - content: "Complete! If you need", - role: "assistant", + delta: ' need', + content: 'Complete! If you need', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " anything", - content: "Complete! If you need anything", - role: "assistant", + delta: ' anything', + content: 'Complete! If you need anything', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " else", - content: "Complete! If you need anything else", - role: "assistant", + delta: ' else', + content: 'Complete! If you need anything else', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: ",", - content: "Complete! If you need anything else,", - role: "assistant", + delta: ',', + content: 'Complete! If you need anything else,', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " feel", - content: "Complete! If you need anything else, feel", - role: "assistant", + delta: ' feel', + content: 'Complete! If you need anything else, feel', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " free", - content: "Complete! If you need anything else, feel free", - role: "assistant", + delta: ' free', + content: 'Complete! If you need anything else, feel free', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " to", - content: "Complete! If you need anything else, feel free to", - role: "assistant", + delta: ' to', + content: 'Complete! If you need anything else, feel free to', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: " ask", - content: "Complete! If you need anything else, feel free to ask", - role: "assistant", + delta: ' ask', + content: 'Complete! If you need anything else, feel free to ask', + role: 'assistant', }, { - type: "content", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'content', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - delta: ".", - content: "Complete! If you need anything else, feel free to ask.", - role: "assistant", + delta: '.', + content: 'Complete! If you need anything else, feel free to ask.', + role: 'assistant', }, { - type: "done", - id: "chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81", - model: "gpt-4o-2024-08-06", + type: 'done', + id: 'chatcmpl-CXZrLlrA0MSqH2JAUVEz6OWwc7z81', + model: 'gpt-4o-2024-08-06', timestamp: 1762118704048, - finishReason: "stop", + finishReason: 'stop', }, - ]; + ] // Track what handlers are called - const events: any[] = []; + const events: any[] = [] const processor = new StreamProcessor({ handlers: { onTextUpdate: (content) => { - events.push({ type: "text", content }); + events.push({ type: 'text', content }) }, onToolCallStateChange: (index, id, name, state, args) => { - events.push({ type: "tool-call", index, id, name, state, args }); + events.push({ type: 'tool-call', index, id, name, state, args }) }, }, - }); + }) // Convert chunks to async iterable async function* createStream() { for (const chunk of rawChunks) { - yield chunk; + yield chunk } } - const result = await processor.process(createStream()); + const result = await processor.process(createStream()) // Expected: TWO tool calls with different IDs - expect(result.toolCalls).toBeDefined(); - expect(result.toolCalls!.length).toBe(2); + expect(result.toolCalls).toBeDefined() + expect(result.toolCalls!.length).toBe(2) // First tool call: getGuitars - const getGuitarsCall = result.toolCalls![0]; - expect(getGuitarsCall.function.name).toBe("getGuitars"); - expect(getGuitarsCall.function.arguments).toBe("{}"); - expect(getGuitarsCall.id).toBe("call_RhSbfkt2O34Wozns6KFxSvL7"); + const getGuitarsCall = result.toolCalls![0] + expect(getGuitarsCall.function.name).toBe('getGuitars') + expect(getGuitarsCall.function.arguments).toBe('{}') + expect(getGuitarsCall.id).toBe('call_RhSbfkt2O34Wozns6KFxSvL7') // Second tool call: recommendGuitar - const recommendCall = result.toolCalls![1]; - expect(recommendCall.function.name).toBe("recommendGuitar"); - expect(recommendCall.function.arguments).toBe('{"id":"6"}'); - expect(recommendCall.id).toBe("call_SP6fjKyNURSf4EebfrnsdpTM"); + const recommendCall = result.toolCalls![1] + expect(recommendCall.function.name).toBe('recommendGuitar') + expect(recommendCall.function.arguments).toBe('{"id":"6"}') + expect(recommendCall.id).toBe('call_SP6fjKyNURSf4EebfrnsdpTM') // Text content should be present expect(result.content).toBe( - "Complete! If you need anything else, feel free to ask." - ); - }); -}); + 'Complete! If you need anything else, feel free to ask.', + ) + }) +}) diff --git a/packages/typescript/ai-client/tests/stream/chunk-strategies.test.ts b/packages/typescript/ai-client/tests/stream/chunk-strategies.test.ts index 5c594bd29..25bfd071d 100644 --- a/packages/typescript/ai-client/tests/stream/chunk-strategies.test.ts +++ b/packages/typescript/ai-client/tests/stream/chunk-strategies.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' import { ImmediateStrategy, PunctuationStrategy, @@ -6,406 +6,407 @@ import { WordBoundaryStrategy, CompositeStrategy, DebounceStrategy, -} from "../../src/stream/chunk-strategies"; +} from '../../src/stream/chunk-strategies' -describe("ImmediateStrategy", () => { - let strategy: ImmediateStrategy; +describe('ImmediateStrategy', () => { + let strategy: ImmediateStrategy beforeEach(() => { - strategy = new ImmediateStrategy(); - }); - - it("should emit on every chunk", () => { - expect(strategy.shouldEmit("Hello", "Hello")).toBe(true); - expect(strategy.shouldEmit(" world", "Hello world")).toBe(true); - expect(strategy.shouldEmit("!", "Hello world!")).toBe(true); - }); - - it("should emit regardless of chunk content", () => { - expect(strategy.shouldEmit("", "")).toBe(true); - expect(strategy.shouldEmit("abc", "abc")).toBe(true); - expect(strategy.shouldEmit("123", "123")).toBe(true); - expect(strategy.shouldEmit("!@#", "!@#")).toBe(true); - }); - - it("should emit regardless of accumulated content", () => { - expect(strategy.shouldEmit("chunk", "")).toBe(true); - expect(strategy.shouldEmit("chunk", "previous")).toBe(true); - expect(strategy.shouldEmit("chunk", "very long accumulated text")).toBe(true); - }); -}); - -describe("PunctuationStrategy", () => { - let strategy: PunctuationStrategy; + strategy = new ImmediateStrategy() + }) + + it('should emit on every chunk', () => { + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(true) + expect(strategy.shouldEmit(' world', 'Hello world')).toBe(true) + expect(strategy.shouldEmit('!', 'Hello world!')).toBe(true) + }) + + it('should emit regardless of chunk content', () => { + expect(strategy.shouldEmit('', '')).toBe(true) + expect(strategy.shouldEmit('abc', 'abc')).toBe(true) + expect(strategy.shouldEmit('123', '123')).toBe(true) + expect(strategy.shouldEmit('!@#', '!@#')).toBe(true) + }) + + it('should emit regardless of accumulated content', () => { + expect(strategy.shouldEmit('chunk', '')).toBe(true) + expect(strategy.shouldEmit('chunk', 'previous')).toBe(true) + expect(strategy.shouldEmit('chunk', 'very long accumulated text')).toBe( + true, + ) + }) +}) + +describe('PunctuationStrategy', () => { + let strategy: PunctuationStrategy beforeEach(() => { - strategy = new PunctuationStrategy(); - }); + strategy = new PunctuationStrategy() + }) - it("should emit when chunk contains period", () => { - expect(strategy.shouldEmit("Hello.", "Hello.")).toBe(true); - }); + it('should emit when chunk contains period', () => { + expect(strategy.shouldEmit('Hello.', 'Hello.')).toBe(true) + }) - it("should emit when chunk contains comma", () => { - expect(strategy.shouldEmit("Hi,", "Hi,")).toBe(true); - }); + it('should emit when chunk contains comma', () => { + expect(strategy.shouldEmit('Hi,', 'Hi,')).toBe(true) + }) - it("should emit when chunk contains exclamation", () => { - expect(strategy.shouldEmit("Wow!", "Wow!")).toBe(true); - }); + it('should emit when chunk contains exclamation', () => { + expect(strategy.shouldEmit('Wow!', 'Wow!')).toBe(true) + }) - it("should emit when chunk contains question mark", () => { - expect(strategy.shouldEmit("Why?", "Why?")).toBe(true); - }); + it('should emit when chunk contains question mark', () => { + expect(strategy.shouldEmit('Why?', 'Why?')).toBe(true) + }) - it("should emit when chunk contains semicolon", () => { - expect(strategy.shouldEmit("First;", "First;")).toBe(true); - }); + it('should emit when chunk contains semicolon', () => { + expect(strategy.shouldEmit('First;', 'First;')).toBe(true) + }) - it("should emit when chunk contains colon", () => { - expect(strategy.shouldEmit("Title:", "Title:")).toBe(true); - }); + it('should emit when chunk contains colon', () => { + expect(strategy.shouldEmit('Title:', 'Title:')).toBe(true) + }) - it("should emit when chunk contains newline", () => { - expect(strategy.shouldEmit("Line\n", "Line\n")).toBe(true); - }); + it('should emit when chunk contains newline', () => { + expect(strategy.shouldEmit('Line\n', 'Line\n')).toBe(true) + }) - it("should not emit when chunk has no punctuation", () => { - expect(strategy.shouldEmit("Hello", "Hello")).toBe(false); - expect(strategy.shouldEmit(" world", "Hello world")).toBe(false); - expect(strategy.shouldEmit("abc123", "abc123")).toBe(false); - }); + it('should not emit when chunk has no punctuation', () => { + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(false) + expect(strategy.shouldEmit(' world', 'Hello world')).toBe(false) + expect(strategy.shouldEmit('abc123', 'abc123')).toBe(false) + }) - it("should emit when punctuation is in the middle of chunk", () => { - expect(strategy.shouldEmit("Hello.world", "Hello.world")).toBe(true); - expect(strategy.shouldEmit("test,data", "test,data")).toBe(true); - }); + it('should emit when punctuation is in the middle of chunk', () => { + expect(strategy.shouldEmit('Hello.world', 'Hello.world')).toBe(true) + expect(strategy.shouldEmit('test,data', 'test,data')).toBe(true) + }) - it("should handle multiple punctuation marks", () => { - expect(strategy.shouldEmit("Hello, world!", "Hello, world!")).toBe(true); - expect(strategy.shouldEmit("What?!", "What?!")).toBe(true); - }); + it('should handle multiple punctuation marks', () => { + expect(strategy.shouldEmit('Hello, world!', 'Hello, world!')).toBe(true) + expect(strategy.shouldEmit('What?!', 'What?!')).toBe(true) + }) - it("should handle empty chunks", () => { - expect(strategy.shouldEmit("", "")).toBe(false); - }); -}); + it('should handle empty chunks', () => { + expect(strategy.shouldEmit('', '')).toBe(false) + }) +}) -describe("BatchStrategy", () => { - it("should emit every N chunks", () => { - const strategy = new BatchStrategy(3); +describe('BatchStrategy', () => { + it('should emit every N chunks', () => { + const strategy = new BatchStrategy(3) - expect(strategy.shouldEmit("1", "1")).toBe(false); - expect(strategy.shouldEmit("2", "12")).toBe(false); - expect(strategy.shouldEmit("3", "123")).toBe(true); // 3rd chunk + expect(strategy.shouldEmit('1', '1')).toBe(false) + expect(strategy.shouldEmit('2', '12')).toBe(false) + expect(strategy.shouldEmit('3', '123')).toBe(true) // 3rd chunk - expect(strategy.shouldEmit("4", "1234")).toBe(false); - expect(strategy.shouldEmit("5", "12345")).toBe(false); - expect(strategy.shouldEmit("6", "123456")).toBe(true); // 6th chunk - }); + expect(strategy.shouldEmit('4', '1234')).toBe(false) + expect(strategy.shouldEmit('5', '12345')).toBe(false) + expect(strategy.shouldEmit('6', '123456')).toBe(true) // 6th chunk + }) - it("should reset counter when reset is called", () => { - const strategy = new BatchStrategy(3); + it('should reset counter when reset is called', () => { + const strategy = new BatchStrategy(3) - strategy.shouldEmit("1", "1"); - strategy.shouldEmit("2", "12"); + strategy.shouldEmit('1', '1') + strategy.shouldEmit('2', '12') - strategy.reset(); + strategy.reset() - expect(strategy.shouldEmit("1", "1")).toBe(false); - expect(strategy.shouldEmit("2", "12")).toBe(false); - expect(strategy.shouldEmit("3", "123")).toBe(true); - }); + expect(strategy.shouldEmit('1', '1')).toBe(false) + expect(strategy.shouldEmit('2', '12')).toBe(false) + expect(strategy.shouldEmit('3', '123')).toBe(true) + }) - it("should work with batch size of 1", () => { - const strategy = new BatchStrategy(1); + it('should work with batch size of 1', () => { + const strategy = new BatchStrategy(1) - expect(strategy.shouldEmit("1", "1")).toBe(true); - expect(strategy.shouldEmit("2", "12")).toBe(true); - expect(strategy.shouldEmit("3", "123")).toBe(true); - }); + expect(strategy.shouldEmit('1', '1')).toBe(true) + expect(strategy.shouldEmit('2', '12')).toBe(true) + expect(strategy.shouldEmit('3', '123')).toBe(true) + }) - it("should use default batch size of 5", () => { - const strategy = new BatchStrategy(); + it('should use default batch size of 5', () => { + const strategy = new BatchStrategy() - expect(strategy.shouldEmit("1", "1")).toBe(false); - expect(strategy.shouldEmit("2", "12")).toBe(false); - expect(strategy.shouldEmit("3", "123")).toBe(false); - expect(strategy.shouldEmit("4", "1234")).toBe(false); - expect(strategy.shouldEmit("5", "12345")).toBe(true); - }); + expect(strategy.shouldEmit('1', '1')).toBe(false) + expect(strategy.shouldEmit('2', '12')).toBe(false) + expect(strategy.shouldEmit('3', '123')).toBe(false) + expect(strategy.shouldEmit('4', '1234')).toBe(false) + expect(strategy.shouldEmit('5', '12345')).toBe(true) + }) - it("should handle very large batch sizes", () => { - const strategy = new BatchStrategy(10); + it('should handle very large batch sizes', () => { + const strategy = new BatchStrategy(10) for (let i = 1; i < 10; i++) { - expect(strategy.shouldEmit(`${i}`, "1".repeat(i))).toBe(false); + expect(strategy.shouldEmit(`${i}`, '1'.repeat(i))).toBe(false) } - expect(strategy.shouldEmit("10", "1".repeat(10))).toBe(true); - }); + expect(strategy.shouldEmit('10', '1'.repeat(10))).toBe(true) + }) - it("should work correctly across multiple batches", () => { - const strategy = new BatchStrategy(2); + it('should work correctly across multiple batches', () => { + const strategy = new BatchStrategy(2) // First batch - expect(strategy.shouldEmit("a", "a")).toBe(false); - expect(strategy.shouldEmit("b", "ab")).toBe(true); + expect(strategy.shouldEmit('a', 'a')).toBe(false) + expect(strategy.shouldEmit('b', 'ab')).toBe(true) // Second batch - expect(strategy.shouldEmit("c", "abc")).toBe(false); - expect(strategy.shouldEmit("d", "abcd")).toBe(true); + expect(strategy.shouldEmit('c', 'abc')).toBe(false) + expect(strategy.shouldEmit('d', 'abcd')).toBe(true) // Third batch - expect(strategy.shouldEmit("e", "abcde")).toBe(false); - expect(strategy.shouldEmit("f", "abcdef")).toBe(true); - }); -}); + expect(strategy.shouldEmit('e', 'abcde')).toBe(false) + expect(strategy.shouldEmit('f', 'abcdef')).toBe(true) + }) +}) -describe("WordBoundaryStrategy", () => { - let strategy: WordBoundaryStrategy; +describe('WordBoundaryStrategy', () => { + let strategy: WordBoundaryStrategy beforeEach(() => { - strategy = new WordBoundaryStrategy(); - }); - - it("should emit when chunk ends with space", () => { - expect(strategy.shouldEmit("Hello ", "Hello ")).toBe(true); - }); - - it("should emit when chunk ends with tab", () => { - expect(strategy.shouldEmit("Hello\t", "Hello\t")).toBe(true); - }); - - it("should emit when chunk ends with newline", () => { - expect(strategy.shouldEmit("Hello\n", "Hello\n")).toBe(true); - }); - - it("should not emit when chunk ends with letter", () => { - expect(strategy.shouldEmit("Hello", "Hello")).toBe(false); - expect(strategy.shouldEmit("Hel", "Hel")).toBe(false); - }); - - it("should not emit when chunk ends with punctuation (no space)", () => { - expect(strategy.shouldEmit("Hello!", "Hello!")).toBe(false); - expect(strategy.shouldEmit("Hello.", "Hello.")).toBe(false); - expect(strategy.shouldEmit("Hello?", "Hello?")).toBe(false); - }); - - it("should emit when chunk ends with multiple spaces", () => { - expect(strategy.shouldEmit("Hello ", "Hello ")).toBe(true); - expect(strategy.shouldEmit("Hello\t\t", "Hello\t\t")).toBe(true); - }); - - it("should not emit when chunk starts with whitespace but ends with character", () => { - expect(strategy.shouldEmit(" Hello", " Hello")).toBe(false); - expect(strategy.shouldEmit("\tHello", "\tHello")).toBe(false); - }); - - it("should handle empty chunks", () => { - expect(strategy.shouldEmit("", "")).toBe(false); - }); - - it("should handle chunks that are only whitespace", () => { - expect(strategy.shouldEmit(" ", " ")).toBe(true); - expect(strategy.shouldEmit("\t", "\t")).toBe(true); - expect(strategy.shouldEmit("\n", "\n")).toBe(true); - }); -}); - -describe("CompositeStrategy", () => { - it("should emit if ANY sub-strategy returns true", () => { + strategy = new WordBoundaryStrategy() + }) + + it('should emit when chunk ends with space', () => { + expect(strategy.shouldEmit('Hello ', 'Hello ')).toBe(true) + }) + + it('should emit when chunk ends with tab', () => { + expect(strategy.shouldEmit('Hello\t', 'Hello\t')).toBe(true) + }) + + it('should emit when chunk ends with newline', () => { + expect(strategy.shouldEmit('Hello\n', 'Hello\n')).toBe(true) + }) + + it('should not emit when chunk ends with letter', () => { + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(false) + expect(strategy.shouldEmit('Hel', 'Hel')).toBe(false) + }) + + it('should not emit when chunk ends with punctuation (no space)', () => { + expect(strategy.shouldEmit('Hello!', 'Hello!')).toBe(false) + expect(strategy.shouldEmit('Hello.', 'Hello.')).toBe(false) + expect(strategy.shouldEmit('Hello?', 'Hello?')).toBe(false) + }) + + it('should emit when chunk ends with multiple spaces', () => { + expect(strategy.shouldEmit('Hello ', 'Hello ')).toBe(true) + expect(strategy.shouldEmit('Hello\t\t', 'Hello\t\t')).toBe(true) + }) + + it('should not emit when chunk starts with whitespace but ends with character', () => { + expect(strategy.shouldEmit(' Hello', ' Hello')).toBe(false) + expect(strategy.shouldEmit('\tHello', '\tHello')).toBe(false) + }) + + it('should handle empty chunks', () => { + expect(strategy.shouldEmit('', '')).toBe(false) + }) + + it('should handle chunks that are only whitespace', () => { + expect(strategy.shouldEmit(' ', ' ')).toBe(true) + expect(strategy.shouldEmit('\t', '\t')).toBe(true) + expect(strategy.shouldEmit('\n', '\n')).toBe(true) + }) +}) + +describe('CompositeStrategy', () => { + it('should emit if ANY sub-strategy returns true', () => { const strategy = new CompositeStrategy([ new PunctuationStrategy(), new WordBoundaryStrategy(), - ]); + ]) // Punctuation - should emit - expect(strategy.shouldEmit("Hello.", "Hello.")).toBe(true); + expect(strategy.shouldEmit('Hello.', 'Hello.')).toBe(true) // Word boundary - should emit - expect(strategy.shouldEmit("Hello ", "Hello ")).toBe(true); + expect(strategy.shouldEmit('Hello ', 'Hello ')).toBe(true) // Both - should emit - expect(strategy.shouldEmit("Hello. ", "Hello. ")).toBe(true); + expect(strategy.shouldEmit('Hello. ', 'Hello. ')).toBe(true) // Neither - should not emit - expect(strategy.shouldEmit("Hello", "Hello")).toBe(false); - }); + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(false) + }) - it("should reset all sub-strategies", () => { - const batch1 = new BatchStrategy(2); - const batch2 = new BatchStrategy(3); - const strategy = new CompositeStrategy([batch1, batch2]); + it('should reset all sub-strategies', () => { + const batch1 = new BatchStrategy(2) + const batch2 = new BatchStrategy(3) + const strategy = new CompositeStrategy([batch1, batch2]) - batch1.shouldEmit("1", "1"); - batch2.shouldEmit("1", "1"); + batch1.shouldEmit('1', '1') + batch2.shouldEmit('1', '1') - strategy.reset(); + strategy.reset() // After reset, counters should be back to 0 - expect(batch1.shouldEmit("1", "1")).toBe(false); - expect(batch2.shouldEmit("1", "1")).toBe(false); - }); + expect(batch1.shouldEmit('1', '1')).toBe(false) + expect(batch2.shouldEmit('1', '1')).toBe(false) + }) - it("should work with empty strategies array", () => { - const strategy = new CompositeStrategy([]); - expect(strategy.shouldEmit("Hello", "Hello")).toBe(false); - }); + it('should work with empty strategies array', () => { + const strategy = new CompositeStrategy([]) + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(false) + }) - it("should work with single strategy", () => { - const strategy = new CompositeStrategy([new ImmediateStrategy()]); - expect(strategy.shouldEmit("Hello", "Hello")).toBe(true); - }); + it('should work with single strategy', () => { + const strategy = new CompositeStrategy([new ImmediateStrategy()]) + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(true) + }) - it("should handle strategies without reset method", () => { - const strategyWithoutReset = new ImmediateStrategy(); - const strategy = new CompositeStrategy([strategyWithoutReset]); + it('should handle strategies without reset method', () => { + const strategyWithoutReset = new ImmediateStrategy() + const strategy = new CompositeStrategy([strategyWithoutReset]) // Should not throw when calling reset - expect(() => strategy.reset()).not.toThrow(); - }); + expect(() => strategy.reset()).not.toThrow() + }) - it("should work with three or more strategies", () => { + it('should work with three or more strategies', () => { const strategy = new CompositeStrategy([ new PunctuationStrategy(), new WordBoundaryStrategy(), new ImmediateStrategy(), - ]); + ]) // Should always emit because ImmediateStrategy always returns true - expect(strategy.shouldEmit("Hello", "Hello")).toBe(true); - expect(strategy.shouldEmit(" world", "Hello world")).toBe(true); - }); + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(true) + expect(strategy.shouldEmit(' world', 'Hello world')).toBe(true) + }) - it("should handle mixed strategy results correctly", () => { + it('should handle mixed strategy results correctly', () => { const strategy = new CompositeStrategy([ new PunctuationStrategy(), new WordBoundaryStrategy(), - ]); + ]) // Only punctuation - should emit - expect(strategy.shouldEmit("Hello.", "Hello.")).toBe(true); + expect(strategy.shouldEmit('Hello.', 'Hello.')).toBe(true) // Only word boundary - should emit - expect(strategy.shouldEmit("Hello ", "Hello ")).toBe(true); + expect(strategy.shouldEmit('Hello ', 'Hello ')).toBe(true) // Both - should emit - expect(strategy.shouldEmit("Hello. ", "Hello. ")).toBe(true); + expect(strategy.shouldEmit('Hello. ', 'Hello. ')).toBe(true) // Neither - should not emit - expect(strategy.shouldEmit("Hello", "Hello")).toBe(false); - }); -}); + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(false) + }) +}) -describe("DebounceStrategy", () => { +describe('DebounceStrategy', () => { beforeEach(() => { - vi.useFakeTimers(); - }); + vi.useFakeTimers() + }) afterEach(() => { - vi.restoreAllMocks(); - vi.useRealTimers(); - }); + vi.restoreAllMocks() + vi.useRealTimers() + }) - it("should not emit immediately on first chunk", () => { - const strategy = new DebounceStrategy(100); + it('should not emit immediately on first chunk', () => { + const strategy = new DebounceStrategy(100) - expect(strategy.shouldEmit("Hello", "Hello")).toBe(false); - }); + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(false) + }) - it("should schedule emission after delay", () => { - const strategy = new DebounceStrategy(100); + it('should schedule emission after delay', () => { + const strategy = new DebounceStrategy(100) + + strategy.shouldEmit('Hello', 'Hello') - strategy.shouldEmit("Hello", "Hello"); - // After delay, shouldEmitNow should be true - vi.advanceTimersByTime(100); - + vi.advanceTimersByTime(100) + // Note: The current implementation has a limitation - shouldEmitNow // is set asynchronously, so we can't check it synchronously. // This test documents the current behavior. - expect(strategy.shouldEmit(" world", "Hello world")).toBe(false); - }); + expect(strategy.shouldEmit(' world', 'Hello world')).toBe(false) + }) + + it('should reset timeout when new chunk arrives before delay', () => { + const strategy = new DebounceStrategy(100) - it("should reset timeout when new chunk arrives before delay", () => { - const strategy = new DebounceStrategy(100); + strategy.shouldEmit('Hello', 'Hello') - strategy.shouldEmit("Hello", "Hello"); - // Advance time but not enough to trigger - vi.advanceTimersByTime(50); - + vi.advanceTimersByTime(50) + // New chunk should reset the timer - strategy.shouldEmit(" world", "Hello world"); - + strategy.shouldEmit(' world', 'Hello world') + // Advance remaining time from first chunk - should not trigger - vi.advanceTimersByTime(50); - + vi.advanceTimersByTime(50) + // Advance time for second chunk - should trigger - vi.advanceTimersByTime(50); - + vi.advanceTimersByTime(50) + // The strategy should still return false synchronously - expect(strategy.shouldEmit("!", "Hello world!")).toBe(false); - }); + expect(strategy.shouldEmit('!', 'Hello world!')).toBe(false) + }) - it("should use default delay of 100ms", () => { - const strategy = new DebounceStrategy(); + it('should use default delay of 100ms', () => { + const strategy = new DebounceStrategy() - expect(strategy.shouldEmit("Hello", "Hello")).toBe(false); - }); + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(false) + }) - it("should clear timeout on reset", () => { - const strategy = new DebounceStrategy(100); + it('should clear timeout on reset', () => { + const strategy = new DebounceStrategy(100) - strategy.shouldEmit("Hello", "Hello"); - strategy.reset(); + strategy.shouldEmit('Hello', 'Hello') + strategy.reset() // After reset, timeout should be cleared - vi.advanceTimersByTime(100); + vi.advanceTimersByTime(100) // New chunk after reset - expect(strategy.shouldEmit(" world", "Hello world")).toBe(false); - }); - - it("should handle multiple rapid chunks", () => { - const strategy = new DebounceStrategy(100); - - strategy.shouldEmit("a", "a"); - vi.advanceTimersByTime(30); - - strategy.shouldEmit("b", "ab"); - vi.advanceTimersByTime(30); - - strategy.shouldEmit("c", "abc"); - vi.advanceTimersByTime(30); - - strategy.shouldEmit("d", "abcd"); - + expect(strategy.shouldEmit(' world', 'Hello world')).toBe(false) + }) + + it('should handle multiple rapid chunks', () => { + const strategy = new DebounceStrategy(100) + + strategy.shouldEmit('a', 'a') + vi.advanceTimersByTime(30) + + strategy.shouldEmit('b', 'ab') + vi.advanceTimersByTime(30) + + strategy.shouldEmit('c', 'abc') + vi.advanceTimersByTime(30) + + strategy.shouldEmit('d', 'abcd') + // All should return false synchronously - expect(strategy.shouldEmit("e", "abcde")).toBe(false); - }); + expect(strategy.shouldEmit('e', 'abcde')).toBe(false) + }) - it("should handle custom delay values", () => { - const strategy = new DebounceStrategy(50); + it('should handle custom delay values', () => { + const strategy = new DebounceStrategy(50) - expect(strategy.shouldEmit("Hello", "Hello")).toBe(false); - - strategy.shouldEmit(" world", "Hello world"); - vi.advanceTimersByTime(50); - - expect(strategy.shouldEmit("!", "Hello world!")).toBe(false); - }); + expect(strategy.shouldEmit('Hello', 'Hello')).toBe(false) - it("should handle reset when no timeout is active", () => { - const strategy = new DebounceStrategy(100); + strategy.shouldEmit(' world', 'Hello world') + vi.advanceTimersByTime(50) + + expect(strategy.shouldEmit('!', 'Hello world!')).toBe(false) + }) + + it('should handle reset when no timeout is active', () => { + const strategy = new DebounceStrategy(100) // Reset without any chunks should not throw - expect(() => strategy.reset()).not.toThrow(); - - // Reset after timeout has been cleared should not throw - strategy.shouldEmit("Hello", "Hello"); - strategy.reset(); - expect(() => strategy.reset()).not.toThrow(); - }); -}); + expect(() => strategy.reset()).not.toThrow() + // Reset after timeout has been cleared should not throw + strategy.shouldEmit('Hello', 'Hello') + strategy.reset() + expect(() => strategy.reset()).not.toThrow() + }) +}) diff --git a/packages/typescript/ai-client/tests/stream/processor.test.ts b/packages/typescript/ai-client/tests/stream/processor.test.ts index 0d02fc6e9..51382c1ce 100644 --- a/packages/typescript/ai-client/tests/stream/processor.test.ts +++ b/packages/typescript/ai-client/tests/stream/processor.test.ts @@ -1,610 +1,618 @@ -import { describe, it, expect, vi } from "vitest"; -import { StreamProcessor } from "../../src/stream/processor"; +import { describe, it, expect, vi } from 'vitest' +import { StreamProcessor } from '../../src/stream/processor' import { ImmediateStrategy, PunctuationStrategy, BatchStrategy, -} from "../../src/stream/chunk-strategies"; -import type { StreamChunk, StreamProcessorHandlers } from "../../src/stream/types"; +} from '../../src/stream/chunk-strategies' +import type { + StreamChunk, + StreamProcessorHandlers, +} from '../../src/stream/types' // Mock stream generator helper async function* createMockStream( - chunks: StreamChunk[] + chunks: StreamChunk[], ): AsyncGenerator { for (const chunk of chunks) { - yield chunk; + yield chunk } } -describe("StreamProcessor", () => { - describe("Text Streaming", () => { - it("should accumulate text content", async () => { +describe('StreamProcessor', () => { + describe('Text Streaming', () => { + it('should accumulate text content', async () => { const handlers: StreamProcessorHandlers = { onTextUpdate: vi.fn(), onStreamEnd: vi.fn(), - }; + } const processor = new StreamProcessor({ chunkStrategy: new ImmediateStrategy(), handlers, - }); + }) const stream = createMockStream([ - { type: "text", content: "Hello" }, - { type: "text", content: " world" }, - { type: "text", content: "!" }, - ]); + { type: 'text', content: 'Hello' }, + { type: 'text', content: ' world' }, + { type: 'text', content: '!' }, + ]) - const result = await processor.process(stream); + const result = await processor.process(stream) - expect(result.content).toBe("Hello world!"); - expect(handlers.onTextUpdate).toHaveBeenCalledTimes(3); - expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(1, "Hello"); - expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(2, "Hello world"); - expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(3, "Hello world!"); - }); + expect(result.content).toBe('Hello world!') + expect(handlers.onTextUpdate).toHaveBeenCalledTimes(3) + expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(1, 'Hello') + expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(2, 'Hello world') + expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(3, 'Hello world!') + }) - it("should respect ImmediateStrategy", async () => { + it('should respect ImmediateStrategy', async () => { const handlers: StreamProcessorHandlers = { onTextUpdate: vi.fn(), - }; + } const processor = new StreamProcessor({ chunkStrategy: new ImmediateStrategy(), handlers, - }); + }) const stream = createMockStream([ - { type: "text", content: "Hello" }, - { type: "text", content: " world" }, - ]); + { type: 'text', content: 'Hello' }, + { type: 'text', content: ' world' }, + ]) - await processor.process(stream); + await processor.process(stream) - expect(handlers.onTextUpdate).toHaveBeenCalledTimes(2); - }); + expect(handlers.onTextUpdate).toHaveBeenCalledTimes(2) + }) - it("should respect PunctuationStrategy", async () => { + it('should respect PunctuationStrategy', async () => { const handlers: StreamProcessorHandlers = { onTextUpdate: vi.fn(), - }; + } const processor = new StreamProcessor({ chunkStrategy: new PunctuationStrategy(), handlers, - }); + }) const stream = createMockStream([ - { type: "text", content: "Hello" }, - { type: "text", content: " world" }, - { type: "text", content: "!" }, - { type: "text", content: " How" }, - { type: "text", content: " are" }, - { type: "text", content: " you?" }, - ]); + { type: 'text', content: 'Hello' }, + { type: 'text', content: ' world' }, + { type: 'text', content: '!' }, + { type: 'text', content: ' How' }, + { type: 'text', content: ' are' }, + { type: 'text', content: ' you?' }, + ]) - await processor.process(stream); + await processor.process(stream) // Should only emit on punctuation (! and ?) - expect(handlers.onTextUpdate).toHaveBeenCalledTimes(2); - expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(1, "Hello world!"); + expect(handlers.onTextUpdate).toHaveBeenCalledTimes(2) + expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(1, 'Hello world!') expect(handlers.onTextUpdate).toHaveBeenNthCalledWith( 2, - "Hello world! How are you?" - ); - }); + 'Hello world! How are you?', + ) + }) - it("should respect BatchStrategy", async () => { + it('should respect BatchStrategy', async () => { const handlers: StreamProcessorHandlers = { onTextUpdate: vi.fn(), - }; + } const processor = new StreamProcessor({ chunkStrategy: new BatchStrategy(3), handlers, - }); + }) const stream = createMockStream([ - { type: "text", content: "1" }, - { type: "text", content: "2" }, - { type: "text", content: "3" }, - { type: "text", content: "4" }, - { type: "text", content: "5" }, - { type: "text", content: "6" }, - ]); + { type: 'text', content: '1' }, + { type: 'text', content: '2' }, + { type: 'text', content: '3' }, + { type: 'text', content: '4' }, + { type: 'text', content: '5' }, + { type: 'text', content: '6' }, + ]) - await processor.process(stream); + await processor.process(stream) // Should emit on chunks 3 and 6 - expect(handlers.onTextUpdate).toHaveBeenCalledTimes(2); - expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(1, "123"); - expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(2, "123456"); - }); + expect(handlers.onTextUpdate).toHaveBeenCalledTimes(2) + expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(1, '123') + expect(handlers.onTextUpdate).toHaveBeenNthCalledWith(2, '123456') + }) it("should emit final text on stream end even if strategy hasn't triggered", async () => { const handlers: StreamProcessorHandlers = { onTextUpdate: vi.fn(), onStreamEnd: vi.fn(), - }; + } const processor = new StreamProcessor({ chunkStrategy: new BatchStrategy(10), // High batch size handlers, - }); + }) const stream = createMockStream([ - { type: "text", content: "Hello" }, - { type: "text", content: " world" }, - ]); + { type: 'text', content: 'Hello' }, + { type: 'text', content: ' world' }, + ]) - const result = await processor.process(stream); + const result = await processor.process(stream) - expect(result.content).toBe("Hello world"); + expect(result.content).toBe('Hello world') expect(handlers.onStreamEnd).toHaveBeenCalledWith( - "Hello world", - undefined - ); - }); - }); - - describe("Single Tool Call", () => { - it("should track a single tool call", async () => { + 'Hello world', + undefined, + ) + }) + }) + + describe('Single Tool Call', () => { + it('should track a single tool call', async () => { const handlers: StreamProcessorHandlers = { onToolCallStart: vi.fn(), onToolCallDelta: vi.fn(), onToolCallComplete: vi.fn(), onStreamEnd: vi.fn(), - }; + } const processor = new StreamProcessor({ handlers, - }); + }) const stream = createMockStream([ { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "getWeather", arguments: '{"lo' }, + id: 'call_1', + function: { name: 'getWeather', arguments: '{"lo' }, }, }, { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "getWeather", arguments: 'cation":' }, + id: 'call_1', + function: { name: 'getWeather', arguments: 'cation":' }, }, }, { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "getWeather", arguments: ' "Paris"}' }, + id: 'call_1', + function: { name: 'getWeather', arguments: ' "Paris"}' }, }, }, - ]); + ]) - const result = await processor.process(stream); + const result = await processor.process(stream) // Verify start event - expect(handlers.onToolCallStart).toHaveBeenCalledTimes(1); + expect(handlers.onToolCallStart).toHaveBeenCalledTimes(1) expect(handlers.onToolCallStart).toHaveBeenCalledWith( 0, - "call_1", - "getWeather" - ); + 'call_1', + 'getWeather', + ) // Verify delta events - expect(handlers.onToolCallDelta).toHaveBeenCalledTimes(3); - expect(handlers.onToolCallDelta).toHaveBeenNthCalledWith(1, 0, '{"lo'); - expect(handlers.onToolCallDelta).toHaveBeenNthCalledWith(2, 0, 'cation":'); + expect(handlers.onToolCallDelta).toHaveBeenCalledTimes(3) + expect(handlers.onToolCallDelta).toHaveBeenNthCalledWith(1, 0, '{"lo') + expect(handlers.onToolCallDelta).toHaveBeenNthCalledWith(2, 0, 'cation":') expect(handlers.onToolCallDelta).toHaveBeenNthCalledWith( 3, 0, - ' "Paris"}' - ); + ' "Paris"}', + ) // Verify completion (triggered by stream end) - expect(handlers.onToolCallComplete).toHaveBeenCalledTimes(1); + expect(handlers.onToolCallComplete).toHaveBeenCalledTimes(1) expect(handlers.onToolCallComplete).toHaveBeenCalledWith( 0, - "call_1", - "getWeather", - '{"location": "Paris"}' - ); + 'call_1', + 'getWeather', + '{"location": "Paris"}', + ) // Verify result - expect(result.toolCalls).toHaveLength(1); + expect(result.toolCalls).toHaveLength(1) expect(result.toolCalls![0]).toEqual({ - id: "call_1", - type: "function", + id: 'call_1', + type: 'function', function: { - name: "getWeather", + name: 'getWeather', arguments: '{"location": "Paris"}', }, - }); - }); - }); + }) + }) + }) - describe("Parallel Tool Calls", () => { - it("should handle multiple parallel tool calls", async () => { + describe('Parallel Tool Calls', () => { + it('should handle multiple parallel tool calls', async () => { const handlers: StreamProcessorHandlers = { onToolCallStart: vi.fn(), onToolCallDelta: vi.fn(), onToolCallComplete: vi.fn(), onStreamEnd: vi.fn(), - }; + } const processor = new StreamProcessor({ handlers, - }); + }) const stream = createMockStream([ { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "getWeather", arguments: '{"lo' }, + id: 'call_1', + function: { name: 'getWeather', arguments: '{"lo' }, }, }, { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 1, toolCall: { - id: "call_2", - function: { name: "getTime", arguments: '{"ci' }, + id: 'call_2', + function: { name: 'getTime', arguments: '{"ci' }, }, }, { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "getWeather", arguments: 'cation":"Paris"}' }, + id: 'call_1', + function: { name: 'getWeather', arguments: 'cation":"Paris"}' }, }, }, { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 1, toolCall: { - id: "call_2", - function: { name: "getTime", arguments: 'ty":"Tokyo"}' }, + id: 'call_2', + function: { name: 'getTime', arguments: 'ty":"Tokyo"}' }, }, }, - ]); + ]) - const result = await processor.process(stream); + const result = await processor.process(stream) // Should start both tool calls - expect(handlers.onToolCallStart).toHaveBeenCalledTimes(2); + expect(handlers.onToolCallStart).toHaveBeenCalledTimes(2) expect(handlers.onToolCallStart).toHaveBeenNthCalledWith( 1, 0, - "call_1", - "getWeather" - ); + 'call_1', + 'getWeather', + ) expect(handlers.onToolCallStart).toHaveBeenNthCalledWith( 2, 1, - "call_2", - "getTime" - ); + 'call_2', + 'getTime', + ) // Tool 0 completes when tool 1 starts - expect(handlers.onToolCallComplete).toHaveBeenCalledTimes(2); + expect(handlers.onToolCallComplete).toHaveBeenCalledTimes(2) // Both tool calls in result - expect(result.toolCalls).toHaveLength(2); - expect(result.toolCalls![0].function.name).toBe("getWeather"); - expect(result.toolCalls![1].function.name).toBe("getTime"); - }); + expect(result.toolCalls).toHaveLength(2) + expect(result.toolCalls![0].function.name).toBe('getWeather') + expect(result.toolCalls![1].function.name).toBe('getTime') + }) - it("should complete tool calls when switching indices", async () => { + it('should complete tool calls when switching indices', async () => { const handlers: StreamProcessorHandlers = { onToolCallComplete: vi.fn(), - }; + } const processor = new StreamProcessor({ handlers, - }); + }) const stream = createMockStream([ { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "tool1", arguments: "args1" }, + id: 'call_1', + function: { name: 'tool1', arguments: 'args1' }, }, }, { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 1, toolCall: { - id: "call_2", - function: { name: "tool2", arguments: "args2" }, + id: 'call_2', + function: { name: 'tool2', arguments: 'args2' }, }, }, - ]); + ]) - await processor.process(stream); + await processor.process(stream) // Tool 0 should complete when tool 1 starts expect(handlers.onToolCallComplete).toHaveBeenNthCalledWith( 1, 0, - "call_1", - "tool1", - "args1" - ); - }); - }); - - describe("Mixed: Tool Calls + Text", () => { - it("should complete tool calls when text arrives", async () => { + 'call_1', + 'tool1', + 'args1', + ) + }) + }) + + describe('Mixed: Tool Calls + Text', () => { + it('should complete tool calls when text arrives', async () => { const handlers: StreamProcessorHandlers = { onToolCallStart: vi.fn(), onToolCallComplete: vi.fn(), onTextUpdate: vi.fn(), onStreamEnd: vi.fn(), - }; + } const processor = new StreamProcessor({ chunkStrategy: new ImmediateStrategy(), handlers, - }); + }) const stream = createMockStream([ { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "getWeather", arguments: '{"location":"Paris"}' }, + id: 'call_1', + function: { name: 'getWeather', arguments: '{"location":"Paris"}' }, }, }, - { type: "text", content: "The weather in Paris is" }, - { type: "text", content: " sunny" }, - { type: "text", content: " and warm." }, - ]); + { type: 'text', content: 'The weather in Paris is' }, + { type: 'text', content: ' sunny' }, + { type: 'text', content: ' and warm.' }, + ]) - const result = await processor.process(stream); + const result = await processor.process(stream) // Tool call should start expect(handlers.onToolCallStart).toHaveBeenCalledWith( 0, - "call_1", - "getWeather" - ); + 'call_1', + 'getWeather', + ) // Tool call should complete when text arrives expect(handlers.onToolCallComplete).toHaveBeenCalledWith( 0, - "call_1", - "getWeather", - '{"location":"Paris"}' - ); + 'call_1', + 'getWeather', + '{"location":"Paris"}', + ) // Text should accumulate - expect(result.content).toBe("The weather in Paris is sunny and warm."); + expect(result.content).toBe('The weather in Paris is sunny and warm.') // Should have both tool calls and text - expect(result.toolCalls).toHaveLength(1); - expect(result.content).toBeTruthy(); - }); - }); + expect(result.toolCalls).toHaveLength(1) + expect(result.content).toBeTruthy() + }) + }) - describe("Edge Cases", () => { - it("should handle empty stream", async () => { + describe('Edge Cases', () => { + it('should handle empty stream', async () => { const handlers: StreamProcessorHandlers = { onStreamEnd: vi.fn(), - }; + } const processor = new StreamProcessor({ handlers, - }); + }) - const stream = createMockStream([]); - const result = await processor.process(stream); + const stream = createMockStream([]) + const result = await processor.process(stream) - expect(result.content).toBe(""); - expect(result.toolCalls).toBeUndefined(); - expect(handlers.onStreamEnd).toHaveBeenCalledWith("", undefined); - }); + expect(result.content).toBe('') + expect(result.toolCalls).toBeUndefined() + expect(handlers.onStreamEnd).toHaveBeenCalledWith('', undefined) + }) - it("should handle text-only stream", async () => { + it('should handle text-only stream', async () => { const processor = new StreamProcessor({ handlers: {}, - }); + }) const stream = createMockStream([ - { type: "text", content: "Hello world" }, - ]); + { type: 'text', content: 'Hello world' }, + ]) - const result = await processor.process(stream); + const result = await processor.process(stream) - expect(result.content).toBe("Hello world"); - expect(result.toolCalls).toBeUndefined(); - }); + expect(result.content).toBe('Hello world') + expect(result.toolCalls).toBeUndefined() + }) - it("should handle tool-calls-only stream", async () => { + it('should handle tool-calls-only stream', async () => { const processor = new StreamProcessor({ handlers: {}, - }); + }) const stream = createMockStream([ { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "test", arguments: "args" }, + id: 'call_1', + function: { name: 'test', arguments: 'args' }, }, }, - ]); + ]) - const result = await processor.process(stream); + const result = await processor.process(stream) - expect(result.content).toBe(""); - expect(result.toolCalls).toHaveLength(1); - }); + expect(result.content).toBe('') + expect(result.toolCalls).toHaveLength(1) + }) - it("should handle missing optional handlers gracefully", async () => { + it('should handle missing optional handlers gracefully', async () => { const processor = new StreamProcessor({ handlers: {}, // No handlers - }); + }) const stream = createMockStream([ - { type: "text", content: "Hello" }, + { type: 'text', content: 'Hello' }, { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "test", arguments: "args" }, + id: 'call_1', + function: { name: 'test', arguments: 'args' }, }, }, - ]); + ]) // Should not throw - const result = await processor.process(stream); - expect(result).toBeDefined(); - }); - }); + const result = await processor.process(stream) + expect(result).toBeDefined() + }) + }) - describe("Stream End Events", () => { - it("should call onStreamEnd with final content and tool calls", async () => { + describe('Stream End Events', () => { + it('should call onStreamEnd with final content and tool calls', async () => { const handlers: StreamProcessorHandlers = { onStreamEnd: vi.fn(), - }; + } const processor = new StreamProcessor({ handlers, - }); + }) const stream = createMockStream([ - { type: "text", content: "Hello" }, + { type: 'text', content: 'Hello' }, { - type: "tool-call-delta", + type: 'tool-call-delta', toolCallIndex: 0, toolCall: { - id: "call_1", - function: { name: "test", arguments: "args" }, + id: 'call_1', + function: { name: 'test', arguments: 'args' }, }, }, - ]); + ]) - await processor.process(stream); + await processor.process(stream) - expect(handlers.onStreamEnd).toHaveBeenCalledWith("Hello", [ + expect(handlers.onStreamEnd).toHaveBeenCalledWith('Hello', [ { - id: "call_1", - type: "function", + id: 'call_1', + type: 'function', function: { - name: "test", - arguments: "args", + name: 'test', + arguments: 'args', }, }, - ]); - }); + ]) + }) - it("should call onStreamEnd with undefined toolCalls if none exist", async () => { + it('should call onStreamEnd with undefined toolCalls if none exist', async () => { const handlers: StreamProcessorHandlers = { onStreamEnd: vi.fn(), - }; + } const processor = new StreamProcessor({ handlers, - }); + }) - const stream = createMockStream([{ type: "text", content: "Hello" }]); + const stream = createMockStream([{ type: 'text', content: 'Hello' }]) - await processor.process(stream); + await processor.process(stream) - expect(handlers.onStreamEnd).toHaveBeenCalledWith("Hello", undefined); - }); - }); + expect(handlers.onStreamEnd).toHaveBeenCalledWith('Hello', undefined) + }) + }) - describe("Delta Content Handling", () => { - it("emits cumulative text for content+delta chunks", async () => { - const onTextUpdate = vi.fn(); - const onStreamEnd = vi.fn(); + describe('Delta Content Handling', () => { + it('emits cumulative text for content+delta chunks', async () => { + const onTextUpdate = vi.fn() + const onStreamEnd = vi.fn() const processor = new StreamProcessor({ handlers: { onTextUpdate, onStreamEnd, }, - }); + }) const chunks = [ - { type: "content", content: "", delta: "Hello" }, - { type: "content", content: "Hello", delta: " world" }, - { type: "content", content: "", delta: "!" }, - { type: "done" }, - ]; - - await processor.process((async function* () { - yield* chunks; - })()); - - expect(onTextUpdate).toHaveBeenCalledTimes(3); + { type: 'content', content: '', delta: 'Hello' }, + { type: 'content', content: 'Hello', delta: ' world' }, + { type: 'content', content: '', delta: '!' }, + { type: 'done' }, + ] + + await processor.process( + (async function* () { + yield* chunks + })(), + ) + + expect(onTextUpdate).toHaveBeenCalledTimes(3) expect(onTextUpdate.mock.calls.map((c) => c[0])).toEqual([ - "Hello", - "Hello world", - "Hello world!", - ]); + 'Hello', + 'Hello world', + 'Hello world!', + ]) - expect(onStreamEnd).toHaveBeenCalledWith("Hello world!", undefined); - }); + expect(onStreamEnd).toHaveBeenCalledWith('Hello world!', undefined) + }) - it("emits text when only delta is present", async () => { - const onTextUpdate = vi.fn(); + it('emits text when only delta is present', async () => { + const onTextUpdate = vi.fn() const processor = new StreamProcessor({ handlers: { onTextUpdate, }, - }); + }) - const chunks = [{ type: "content", delta: "Hi there" }, { type: "done" }]; + const chunks = [{ type: 'content', delta: 'Hi there' }, { type: 'done' }] - await processor.process((async function* () { - yield* chunks; - })()); + await processor.process( + (async function* () { + yield* chunks + })(), + ) - expect(onTextUpdate).toHaveBeenCalledTimes(1); - expect(onTextUpdate).toHaveBeenLastCalledWith("Hi there"); - }); + expect(onTextUpdate).toHaveBeenCalledTimes(1) + expect(onTextUpdate).toHaveBeenLastCalledWith('Hi there') + }) - it("appends delta-only chunks to previous text", async () => { - const onTextUpdate = vi.fn(); + it('appends delta-only chunks to previous text', async () => { + const onTextUpdate = vi.fn() const processor = new StreamProcessor({ handlers: { onTextUpdate, }, - }); + }) const chunks = [ - { type: "content", delta: "Hello" }, - { type: "content", delta: " world" }, - { type: "done" }, - ]; + { type: 'content', delta: 'Hello' }, + { type: 'content', delta: ' world' }, + { type: 'done' }, + ] - await processor.process((async function* () { - yield* chunks; - })()); + await processor.process( + (async function* () { + yield* chunks + })(), + ) expect(onTextUpdate.mock.calls.map((c) => c[0])).toEqual([ - "Hello", - "Hello world", - ]); - }); - }); -}); - + 'Hello', + 'Hello world', + ]) + }) + }) +}) diff --git a/packages/typescript/ai-client/tests/test-utils.ts b/packages/typescript/ai-client/tests/test-utils.ts index 19a7ebf00..2377be1c0 100644 --- a/packages/typescript/ai-client/tests/test-utils.ts +++ b/packages/typescript/ai-client/tests/test-utils.ts @@ -1,6 +1,6 @@ -import type { ConnectionAdapter } from "../src/connection-adapters"; -import type { StreamChunk } from "@tanstack/ai"; -import type { ModelMessage, UIMessage } from "../src/types"; +import type { ConnectionAdapter } from '../src/connection-adapters' +import type { StreamChunk } from '@tanstack/ai' +import type { ModelMessage, UIMessage } from '../src/types' /** * Options for creating a mock connection adapter @@ -9,37 +9,41 @@ export interface MockConnectionAdapterOptions { /** * Chunks to yield from the stream */ - chunks?: StreamChunk[]; - + chunks?: StreamChunk[] + /** * Delay between chunks (in ms) */ - chunkDelay?: number; - + chunkDelay?: number + /** * Whether to throw an error */ - shouldError?: boolean; - + shouldError?: boolean + /** * Error to throw */ - error?: Error; - + error?: Error + /** * Callback when connect is called */ - onConnect?: (messages: ModelMessage[] | UIMessage[], data?: Record, abortSignal?: AbortSignal) => void; - + onConnect?: ( + messages: ModelMessage[] | UIMessage[], + data?: Record, + abortSignal?: AbortSignal, + ) => void + /** * Callback to check abort signal during streaming */ - onAbort?: (abortSignal: AbortSignal) => void; + onAbort?: (abortSignal: AbortSignal) => void } /** * Create a mock connection adapter for testing - * + * * @example * ```typescript * const adapter = createMockConnectionAdapter({ @@ -51,52 +55,52 @@ export interface MockConnectionAdapterOptions { * ``` */ export function createMockConnectionAdapter( - options: MockConnectionAdapterOptions = {} + options: MockConnectionAdapterOptions = {}, ): ConnectionAdapter { const { chunks = [], chunkDelay = 0, shouldError = false, - error = new Error("Mock adapter error"), + error = new Error('Mock adapter error'), onConnect, onAbort, - } = options; + } = options return { async *connect(messages, data, abortSignal) { if (onConnect) { - onConnect(messages, data, abortSignal); + onConnect(messages, data, abortSignal) } if (shouldError) { - throw error; + throw error } for (const chunk of chunks) { // Check abort signal before yielding if (abortSignal?.aborted) { if (onAbort) { - onAbort(abortSignal); + onAbort(abortSignal) } - return; + return } if (chunkDelay > 0) { - await new Promise((resolve) => setTimeout(resolve, chunkDelay)); + await new Promise((resolve) => setTimeout(resolve, chunkDelay)) } // Check again after delay if (abortSignal?.aborted) { if (onAbort) { - onAbort(abortSignal); + onAbort(abortSignal) } - return; + return } - yield chunk; + yield chunk } }, - }; + } } /** @@ -104,34 +108,34 @@ export function createMockConnectionAdapter( */ export function createTextChunks( text: string, - messageId: string = "msg-1", - model: string = "test" + messageId: string = 'msg-1', + model: string = 'test', ): StreamChunk[] { - const chunks: StreamChunk[] = []; - let accumulated = ""; - + const chunks: StreamChunk[] = [] + let accumulated = '' + for (let i = 0; i < text.length; i++) { - accumulated += text[i]; + accumulated += text[i] chunks.push({ - type: "content", + type: 'content', id: messageId, model, timestamp: Date.now(), delta: text[i], content: accumulated, - role: "assistant", - } as StreamChunk); + role: 'assistant', + } as StreamChunk) } - + chunks.push({ - type: "done", + type: 'done', id: messageId, model, timestamp: Date.now(), - finishReason: "stop", - } as StreamChunk); - - return chunks; + finishReason: 'stop', + } as StreamChunk) + + return chunks } /** @@ -140,59 +144,58 @@ export function createTextChunks( */ export function createToolCallChunks( toolCalls: Array<{ id: string; name: string; arguments: string }>, - messageId: string = "msg-1", - model: string = "test", - includeToolInputAvailable: boolean = true + messageId: string = 'msg-1', + model: string = 'test', + includeToolInputAvailable: boolean = true, ): StreamChunk[] { - const chunks: StreamChunk[] = []; - + const chunks: StreamChunk[] = [] + for (let i = 0; i < toolCalls.length; i++) { - const toolCall = toolCalls[i]; + const toolCall = toolCalls[i] chunks.push({ - type: "tool_call", + type: 'tool_call', id: messageId, model, timestamp: Date.now(), index: i, toolCall: { id: toolCall.id, - type: "function", + type: 'function', function: { name: toolCall.name, arguments: toolCall.arguments, }, }, - } as StreamChunk); - + } as StreamChunk) + // Add tool-input-available chunk if requested if (includeToolInputAvailable) { - let parsedInput: any; + let parsedInput: any try { - parsedInput = JSON.parse(toolCall.arguments); + parsedInput = JSON.parse(toolCall.arguments) } catch { - parsedInput = toolCall.arguments; + parsedInput = toolCall.arguments } - + chunks.push({ - type: "tool-input-available", + type: 'tool-input-available', id: messageId, model, timestamp: Date.now(), toolCallId: toolCall.id, toolName: toolCall.name, input: parsedInput, - } as StreamChunk); + } as StreamChunk) } } - + chunks.push({ - type: "done", + type: 'done', id: messageId, model, timestamp: Date.now(), - finishReason: "stop", - } as StreamChunk); - - return chunks; -} + finishReason: 'stop', + } as StreamChunk) + return chunks +} diff --git a/packages/typescript/ai-devtools/src/components/ConversationDetails.tsx b/packages/typescript/ai-devtools/src/components/ConversationDetails.tsx index 3212be8af..cac6e747e 100644 --- a/packages/typescript/ai-devtools/src/components/ConversationDetails.tsx +++ b/packages/typescript/ai-devtools/src/components/ConversationDetails.tsx @@ -1,51 +1,68 @@ -import { Component, Show, createSignal, createEffect } from "solid-js"; -import { useStyles } from "../styles/use-styles"; -import { useAIStore, type Conversation } from "../store/ai-context"; -import { ConversationHeader, ConversationTabs, MessagesTab, ChunksTab } from "./conversation"; - -export const ConversationDetails: Component = () => { - const { state } = useAIStore(); - const styles = useStyles(); - const [activeTab, setActiveTab] = createSignal<"messages" | "chunks">("messages"); - - const activeConversation = (): Conversation | undefined => { - if (!state.activeConversationId) return undefined; - return state.conversations[state.activeConversationId]; - }; - - // Update active tab when conversation changes - createEffect(() => { - const conv = activeConversation(); - if (conv) { - // For server conversations, default to chunks tab - if (conv.type === "server") { - setActiveTab("chunks"); - } else { - // For client conversations, default to messages tab - setActiveTab("messages"); - } - } - }); - - return ( - Select a conversation to view details
} - > - {(conv) => ( -
- - -
- - - - - - -
-
- )} - - ); -}; +import { Show, createEffect, createSignal } from 'solid-js' +import { useStyles } from '../styles/use-styles' +import { useAIStore } from '../store/ai-context' +import { + ChunksTab, + ConversationHeader, + ConversationTabs, + MessagesTab, +} from './conversation' +import type { Conversation } from '../store/ai-context' +import type { Component } from 'solid-js' + +export const ConversationDetails: Component = () => { + const { state } = useAIStore() + const styles = useStyles() + const [activeTab, setActiveTab] = createSignal<'messages' | 'chunks'>( + 'messages', + ) + + const activeConversation = (): Conversation | undefined => { + if (!state.activeConversationId) return undefined + return state.conversations[state.activeConversationId] + } + + // Update active tab when conversation changes + createEffect(() => { + const conv = activeConversation() + if (conv) { + // For server conversations, default to chunks tab + if (conv.type === 'server') { + setActiveTab('chunks') + } else { + // For client conversations, default to messages tab + setActiveTab('messages') + } + } + }) + + return ( + + Select a conversation to view details + + } + > + {(conv) => ( +
+ + +
+ + + + + + +
+
+ )} +
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/ConversationsList.tsx b/packages/typescript/ai-devtools/src/components/ConversationsList.tsx index 1a8d7a592..50ac76561 100644 --- a/packages/typescript/ai-devtools/src/components/ConversationsList.tsx +++ b/packages/typescript/ai-devtools/src/components/ConversationsList.tsx @@ -1,23 +1,29 @@ -import { Component, For } from "solid-js"; -import { useStyles } from "../styles/use-styles"; -import { useAIStore, type Conversation } from "../store/ai-context"; -import { ConversationRow } from "./list"; - -export const ConversationsList: Component<{ - filterType: "all" | "client" | "server"; -}> = (props) => { - const { state } = useAIStore(); - const styles = useStyles(); - - const filteredConversations = () => { - const conversations = Object.values(state.conversations); - if (props.filterType === "all") return conversations; - return conversations.filter((conv: Conversation) => conv.type === props.filterType); - }; - - return ( -
- {(conv: Conversation) => } -
- ); -}; +import { For } from 'solid-js' +import { useStyles } from '../styles/use-styles' +import { useAIStore } from '../store/ai-context' +import { ConversationRow } from './list' +import type { Conversation } from '../store/ai-context' +import type { Component } from 'solid-js' + +export const ConversationsList: Component<{ + filterType: 'all' | 'client' | 'server' +}> = (props) => { + const { state } = useAIStore() + const styles = useStyles() + + const filteredConversations = () => { + const conversations = Object.values(state.conversations) + if (props.filterType === 'all') return conversations + return conversations.filter( + (conv: Conversation) => conv.type === props.filterType, + ) + } + + return ( +
+ + {(conv: Conversation) => } + +
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/Shell.tsx b/packages/typescript/ai-devtools/src/components/Shell.tsx index 7aea84e44..c4829c969 100644 --- a/packages/typescript/ai-devtools/src/components/Shell.tsx +++ b/packages/typescript/ai-devtools/src/components/Shell.tsx @@ -1,129 +1,142 @@ -import { createSignal, onCleanup, onMount } from "solid-js"; -import { Header, HeaderLogo, MainPanel } from "@tanstack/devtools-ui"; -import { useStyles } from "../styles/use-styles"; -import { ConversationsList } from "./ConversationsList"; -import { ConversationDetails } from "./ConversationDetails"; -import { AIProvider, useAIStore } from "../store/ai-context"; - -export default function Devtools() { - return ( - - - - ); -} - -function DevtoolsContent() { - const { state, clearAllConversations } = useAIStore(); - const styles = useStyles(); - const [leftPanelWidth, setLeftPanelWidth] = createSignal(300); - const [isDragging, setIsDragging] = createSignal(false); - const [filterType, setFilterType] = createSignal<"all" | "client" | "server">("all"); - - let dragStartX = 0; - let dragStartWidth = 0; - - const handleMouseDown = (e: MouseEvent) => { - e.preventDefault(); - e.stopPropagation(); - setIsDragging(true); - document.body.style.cursor = "col-resize"; - document.body.style.userSelect = "none"; - dragStartX = e.clientX; - dragStartWidth = leftPanelWidth(); - }; - - const handleMouseMove = (e: MouseEvent) => { - if (!isDragging()) return; - - e.preventDefault(); - const deltaX = e.clientX - dragStartX; - const newWidth = Math.max(150, Math.min(800, dragStartWidth + deltaX)); - setLeftPanelWidth(newWidth); - }; - - const handleMouseUp = () => { - setIsDragging(false); - document.body.style.cursor = ""; - document.body.style.userSelect = ""; - }; - - onMount(() => { - document.addEventListener("mousemove", handleMouseMove); - document.addEventListener("mouseup", handleMouseUp); - }); - - onCleanup(() => { - document.removeEventListener("mousemove", handleMouseMove); - document.removeEventListener("mouseup", handleMouseUp); - }); - - const conversationCount = () => Object.keys(state.conversations).length; - - return ( - -
- TanStack AI -
- -
-
- {/* Filter tabs and action buttons */} -
-
- - - -
-
- -
-
- - -
- -
- -
- -
-
- - ); -} +import { createSignal, onCleanup, onMount } from 'solid-js' +import { Header, HeaderLogo, MainPanel } from '@tanstack/devtools-ui' +import { useStyles } from '../styles/use-styles' +import { AIProvider, useAIStore } from '../store/ai-context' +import { ConversationsList } from './ConversationsList' +import { ConversationDetails } from './ConversationDetails' + +export default function Devtools() { + return ( + + + + ) +} + +function DevtoolsContent() { + const { state, clearAllConversations } = useAIStore() + const styles = useStyles() + const [leftPanelWidth, setLeftPanelWidth] = createSignal(300) + const [isDragging, setIsDragging] = createSignal(false) + const [filterType, setFilterType] = createSignal<'all' | 'client' | 'server'>( + 'all', + ) + + let dragStartX = 0 + let dragStartWidth = 0 + + const handleMouseDown = (e: MouseEvent) => { + e.preventDefault() + e.stopPropagation() + setIsDragging(true) + document.body.style.cursor = 'col-resize' + document.body.style.userSelect = 'none' + dragStartX = e.clientX + dragStartWidth = leftPanelWidth() + } + + const handleMouseMove = (e: MouseEvent) => { + if (!isDragging()) return + + e.preventDefault() + const deltaX = e.clientX - dragStartX + const newWidth = Math.max(150, Math.min(800, dragStartWidth + deltaX)) + setLeftPanelWidth(newWidth) + } + + const handleMouseUp = () => { + setIsDragging(false) + document.body.style.cursor = '' + document.body.style.userSelect = '' + } + + onMount(() => { + document.addEventListener('mousemove', handleMouseMove) + document.addEventListener('mouseup', handleMouseUp) + }) + + onCleanup(() => { + document.removeEventListener('mousemove', handleMouseMove) + document.removeEventListener('mouseup', handleMouseUp) + }) + + const conversationCount = () => Object.keys(state.conversations).length + + return ( + +
+ + TanStack AI + +
+ +
+
+ {/* Filter tabs and action buttons */} +
+
+ + + +
+
+ +
+
+ + +
+ +
+ +
+ +
+
+ + ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/ChunkBadges.tsx b/packages/typescript/ai-devtools/src/components/conversation/ChunkBadges.tsx index 1ee958431..cf8935cd3 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/ChunkBadges.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/ChunkBadges.tsx @@ -1,41 +1,51 @@ -import { Component, Show } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Chunk } from "../../store/ai-store"; - -interface ChunkBadgesProps { - chunks: Chunk[]; -} - -export const ChunkBadges: Component = (props) => { - const styles = useStyles(); - - const hasToolCalls = () => props.chunks.some((c) => c.type === "tool_call"); - const hasErrors = () => props.chunks.some((c) => c.type === "error"); - const hasApproval = () => props.chunks.some((c) => c.type === "approval"); - const finishReason = () => props.chunks.find((c) => c.type === "done")?.finishReason; - - return ( - <> - - - 🔧 Tool Calls - - - - - ❌ Error - - - - - ⚠️ Approval - - - - - ✓ {finishReason()} - - - - ); -}; +import { Show } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import type { Component } from 'solid-js' +import type { Chunk } from '../../store/ai-store' + +interface ChunkBadgesProps { + chunks: Array +} + +export const ChunkBadges: Component = (props) => { + const styles = useStyles() + + const hasToolCalls = () => props.chunks.some((c) => c.type === 'tool_call') + const hasErrors = () => props.chunks.some((c) => c.type === 'error') + const hasApproval = () => props.chunks.some((c) => c.type === 'approval') + const finishReason = () => + props.chunks.find((c) => c.type === 'done')?.finishReason + + return ( + <> + + + 🔧 Tool Calls + + + + + ❌ Error + + + + + ⚠️ Approval + + + + + ✓ {finishReason()} + + + + ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/ChunkItem.tsx b/packages/typescript/ai-devtools/src/components/conversation/ChunkItem.tsx index e7dcc040d..3d91ca7bb 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/ChunkItem.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/ChunkItem.tsx @@ -1,152 +1,204 @@ -import { Component, Show, createSignal } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Chunk } from "../../store/ai-store"; -import { formatTimestamp, getChunkTypeColor } from "../utils"; - -interface ChunkItemProps { - chunk: Chunk; - index: number; - variant?: "small" | "large"; -} - -export const ChunkItem: Component = (props) => { - const styles = useStyles(); - const [showRaw, setShowRaw] = createSignal(false); - const isLarge = () => props.variant === "large"; - const chunkCount = () => props.chunk.chunkCount || 1; - - return ( -
- {/* Chunk Header */} -
- {/* Chunk Number */} -
- #{props.index + 1} - 1}> - ({chunkCount()} chunks) - -
- - {/* Type Badge */} -
-
-
- {props.chunk.type} -
-
- - {/* Tool Name Badge */} - -
- 🔧 {props.chunk.toolName} -
-
- - {/* Timestamp */} -
- {formatTimestamp(props.chunk.timestamp)} -
- - {/* Toggle Raw JSON Button */} - -
- - {/* Chunk Content */} - - -
- {props.chunk.content} -
-
- -
- ❌ {props.chunk.error} -
-
- -
- ✓ {isLarge() ? `Finish: ${props.chunk.finishReason}` : props.chunk.finishReason} -
-
- -
-
- ⚠️ Approval Required -
- -
- Input: {JSON.stringify(props.chunk.input, null, 2)} -
-
-
-
-
- - {/* Raw JSON View */} - -
- {JSON.stringify(props.chunk, null, 2)} -
-
-
- ); -}; +import { Show, createSignal } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import { formatTimestamp, getChunkTypeColor } from '../utils' +import type { Component } from 'solid-js' +import type { Chunk } from '../../store/ai-store' + +interface ChunkItemProps { + chunk: Chunk + index: number + variant?: 'small' | 'large' +} + +export const ChunkItem: Component = (props) => { + const styles = useStyles() + const [showRaw, setShowRaw] = createSignal(false) + const isLarge = () => props.variant === 'large' + const chunkCount = () => props.chunk.chunkCount || 1 + + return ( +
+ {/* Chunk Header */} +
+ {/* Chunk Number */} +
+ #{props.index + 1} + 1}> + + ({chunkCount()} chunks) + + +
+ + {/* Type Badge */} +
+
+
+ {props.chunk.type} +
+
+ + {/* Tool Name Badge */} + +
+ 🔧 {props.chunk.toolName} +
+
+ + {/* Timestamp */} +
+ {formatTimestamp(props.chunk.timestamp)} +
+ + {/* Toggle Raw JSON Button */} + +
+ + {/* Chunk Content */} + + +
+ {props.chunk.content} +
+
+ +
+ ❌ {props.chunk.error} +
+
+ +
+ ✓{' '} + {isLarge() + ? `Finish: ${props.chunk.finishReason}` + : props.chunk.finishReason} +
+
+ +
+
+ ⚠️ Approval Required +
+ +
+ Input: {JSON.stringify(props.chunk.input, null, 2)} +
+
+
+
+
+ + {/* Raw JSON View */} + +
+ {JSON.stringify(props.chunk, null, 2)} +
+
+
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/ChunksCollapsible.tsx b/packages/typescript/ai-devtools/src/components/conversation/ChunksCollapsible.tsx index c67e4a6ff..229611c96 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/ChunksCollapsible.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/ChunksCollapsible.tsx @@ -1,48 +1,57 @@ -import { Component, For, Show } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Chunk } from "../../store/ai-store"; -import { ChunkItem } from "./ChunkItem"; -import { ChunkBadges } from "./ChunkBadges"; - -interface ChunksCollapsibleProps { - chunks: Chunk[]; -} - -export const ChunksCollapsible: Component = (props) => { - const styles = useStyles(); - - const accumulatedContent = () => - props.chunks - .filter((c) => c.type === "content" && (c.content || c.delta)) - .map((c) => c.delta || c.content) - .join(""); - - // Total raw chunks = sum of all chunkCounts - const totalRawChunks = () => props.chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0); - - return ( -
- -
- {/* Header */} -
- 📦 Server Chunks ({totalRawChunks()}) - -
- - {/* Accumulated Content Preview */} - -
- {accumulatedContent()} -
-
-
-
-
-
- {(chunk, index) => } -
-
-
- ); -}; +import { For, Show } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import { ChunkItem } from './ChunkItem' +import { ChunkBadges } from './ChunkBadges' +import type { Component } from 'solid-js' +import type { Chunk } from '../../store/ai-store' + +interface ChunksCollapsibleProps { + chunks: Array +} + +export const ChunksCollapsible: Component = (props) => { + const styles = useStyles() + + const accumulatedContent = () => + props.chunks + .filter((c) => c.type === 'content' && (c.content || c.delta)) + .map((c) => c.delta || c.content) + .join('') + + // Total raw chunks = sum of all chunkCounts + const totalRawChunks = () => + props.chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0) + + return ( +
+ +
+ {/* Header */} +
+ 📦 Server Chunks ({totalRawChunks()}) + +
+ + {/* Accumulated Content Preview */} + +
+ {accumulatedContent()} +
+
+
+
+
+
+ + {(chunk, index) => ( + + )} + +
+
+
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/ChunksTab.tsx b/packages/typescript/ai-devtools/src/components/conversation/ChunksTab.tsx index abefb123b..ddd739469 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/ChunksTab.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/ChunksTab.tsx @@ -1,58 +1,72 @@ -import { Component, For, Show } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Chunk } from "../../store/ai-store"; -import { MessageGroup } from "./MessageGroup"; - -interface ChunksTabProps { - chunks: Chunk[]; -} - -export const ChunksTab: Component = (props) => { - const styles = useStyles(); - - const groupedChunks = () => { - const groups = new Map>(); - - props.chunks.forEach((chunk) => { - const key = chunk.messageId || "no-message-id"; - if (!groups.has(key)) { - groups.set(key, []); - } - groups.get(key)!.push(chunk); - }); - - return Array.from(groups.entries()); - }; - - // Calculate total raw chunks (sum of all chunkCounts) - const totalRawChunks = () => props.chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0); - - return ( - 0} - fallback={
No chunks yet
} - > -
- {/* Stream Header */} -
-
-
Stream Responses
-
- {totalRawChunks()} chunks · {groupedChunks().length} messages -
-
-
Grouped by message ID
-
- - {/* Message Groups */} -
- - {([messageId, chunks], groupIndex) => ( - - )} - -
-
-
- ); -}; +import { For, Show } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import { MessageGroup } from './MessageGroup' +import type { Component } from 'solid-js' +import type { Chunk } from '../../store/ai-store' + +interface ChunksTabProps { + chunks: Array +} + +export const ChunksTab: Component = (props) => { + const styles = useStyles() + + const groupedChunks = () => { + const groups = new Map>() + + props.chunks.forEach((chunk) => { + const key = chunk.messageId || 'no-message-id' + if (!groups.has(key)) { + groups.set(key, []) + } + groups.get(key)!.push(chunk) + }) + + return Array.from(groups.entries()) + } + + // Calculate total raw chunks (sum of all chunkCounts) + const totalRawChunks = () => + props.chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0) + + return ( + 0} + fallback={ +
No chunks yet
+ } + > +
+ {/* Stream Header */} +
+
+
+ Stream Responses +
+
+ {totalRawChunks()} chunks · {groupedChunks().length} messages +
+
+
+ Grouped by message ID +
+
+ + {/* Message Groups */} +
+ + {([messageId, chunks], groupIndex) => ( + + )} + +
+
+
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/ConversationHeader.tsx b/packages/typescript/ai-devtools/src/components/conversation/ConversationHeader.tsx index 0487c6fdc..63ba1378f 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/ConversationHeader.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/ConversationHeader.tsx @@ -1,104 +1,133 @@ -import { Component, For, Show, createSignal } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Conversation } from "../../store/ai-store"; -import { formatDuration } from "../utils"; - -interface ConversationHeaderProps { - conversation: Conversation; -} - -export const ConversationHeader: Component = (props) => { - const styles = useStyles(); - const conv = () => props.conversation; - const [showOptions, setShowOptions] = createSignal(false); - - const hasExtendedInfo = () => { - const c = conv(); - return ( - (c.toolNames && c.toolNames.length > 0) || - (c.options && Object.keys(c.options).length > 0) || - (c.providerOptions && Object.keys(c.providerOptions).length > 0) - ); - }; - - const toolNames = () => conv().toolNames ?? []; - const options = () => conv().options; - const providerOptions = () => conv().providerOptions; - - return ( -
-
-
-
{conv().label}
-
- {conv().status} -
-
-
- {conv().model && `Model: ${conv().model}`} - {conv().provider && ` • Provider: ${conv().provider}`} - {conv().completedAt && ` • Duration: ${formatDuration(conv().completedAt! - conv().startedAt)}`} -
- -
- 🎯 Tokens: - Prompt: {conv().usage?.promptTokens.toLocaleString() || 0} - - Completion: {conv().usage?.completionTokens.toLocaleString() || 0} - - - Total: {conv().usage?.totalTokens.toLocaleString() || 0} - -
-
- - - -
- 0}> -
- 🔧 Tools: -
- - {(toolName) => {toolName}} - -
-
-
- - {(opts) => ( - 0}> -
- ⚙️ Options: -
{JSON.stringify(opts(), null, 2)}
-
-
- )} -
- - {(provOpts) => ( - 0}> -
- 🏷️ Provider Options: -
{JSON.stringify(provOpts(), null, 2)}
-
-
- )} -
-
-
-
-
-
- ); -}; +import { For, Show, createSignal } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import { formatDuration } from '../utils' +import type { Component } from 'solid-js' +import type { Conversation } from '../../store/ai-store' + +interface ConversationHeaderProps { + conversation: Conversation +} + +export const ConversationHeader: Component = ( + props, +) => { + const styles = useStyles() + const conv = () => props.conversation + const [showOptions, setShowOptions] = createSignal(false) + + const hasExtendedInfo = () => { + const c = conv() + return ( + (c.toolNames && c.toolNames.length > 0) || + (c.options && Object.keys(c.options).length > 0) || + (c.providerOptions && Object.keys(c.providerOptions).length > 0) + ) + } + + const toolNames = () => conv().toolNames ?? [] + const options = () => conv().options + const providerOptions = () => conv().providerOptions + + return ( +
+
+
+
+ {conv().label} +
+
+ {conv().status} +
+
+
+ {conv().model && `Model: ${conv().model}`} + {conv().provider && ` • Provider: ${conv().provider}`} + {conv().completedAt && + ` • Duration: ${formatDuration(conv().completedAt! - conv().startedAt)}`} +
+ +
+ + 🎯 Tokens: + + + Prompt: {conv().usage?.promptTokens.toLocaleString() || 0} + + + + Completion: {conv().usage?.completionTokens.toLocaleString() || 0} + + + + Total: {conv().usage?.totalTokens.toLocaleString() || 0} + +
+
+ + + +
+ 0}> +
+ + 🔧 Tools: + +
+ + {(toolName) => ( + + {toolName} + + )} + +
+
+
+ + {(opts) => ( + 0}> +
+ + ⚙️ Options: + +
+                        {JSON.stringify(opts(), null, 2)}
+                      
+
+
+ )} +
+ + {(provOpts) => ( + 0}> +
+ + 🏷️ Provider Options: + +
+                        {JSON.stringify(provOpts(), null, 2)}
+                      
+
+
+ )} +
+
+
+
+
+
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/ConversationTabs.tsx b/packages/typescript/ai-devtools/src/components/conversation/ConversationTabs.tsx index e50ab56be..f3aee16f7 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/ConversationTabs.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/ConversationTabs.tsx @@ -1,44 +1,50 @@ -import { Component, Show } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Conversation } from "../../store/ai-store"; - -interface ConversationTabsProps { - conversation: Conversation; - activeTab: "messages" | "chunks"; - onTabChange: (tab: "messages" | "chunks") => void; -} - -export const ConversationTabs: Component = (props) => { - const styles = useStyles(); - const conv = () => props.conversation; - - // Total raw chunks = sum of all chunkCounts - const totalRawChunks = () => conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0); - - return ( -
- {/* Only show messages tab for client conversations */} - - - - {/* Only show chunks tab for server-only conversations */} - - - -
- ); -}; +import { Show } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import type { Component } from 'solid-js' +import type { Conversation } from '../../store/ai-store' + +interface ConversationTabsProps { + conversation: Conversation + activeTab: 'messages' | 'chunks' + onTabChange: (tab: 'messages' | 'chunks') => void +} + +export const ConversationTabs: Component = (props) => { + const styles = useStyles() + const conv = () => props.conversation + + // Total raw chunks = sum of all chunkCounts + const totalRawChunks = () => + conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0) + + return ( +
+ {/* Only show messages tab for client conversations */} + + + + {/* Only show chunks tab for server-only conversations */} + + + +
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/MessageCard.tsx b/packages/typescript/ai-devtools/src/components/conversation/MessageCard.tsx index 8c8df4b9d..6b51b3288 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/MessageCard.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/MessageCard.tsx @@ -1,80 +1,93 @@ -import { Component, For, Show } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Message } from "../../store/ai-store"; -import { ToolCallDisplay } from "./ToolCallDisplay"; -import { ChunksCollapsible } from "./ChunksCollapsible"; -import { formatTimestamp } from "../utils"; - -interface MessageCardProps { - message: Message; -} - -export const MessageCard: Component = (props) => { - const styles = useStyles(); - const msg = () => props.message; - - return ( -
-
-
- {msg().role === "user" ? "U" : "🤖"} -
-
-
- {msg().role} -
-
-
{formatTimestamp(msg().timestamp)}
- {/* Per-message token usage */} - -
- 🎯 - {msg().usage?.promptTokens.toLocaleString()} in - - {msg().usage?.completionTokens.toLocaleString()} out -
-
-
- - {/* Thinking content (for extended thinking models) */} - -
- 💭 Thinking... -
{msg().thinkingContent}
-
-
- -
{msg().content}
- - {/* Tool Calls Display */} - 0}> -
- {(tool) => } -
-
- - {/* Chunks Display (for client conversations with server chunks) */} - 0}> - - -
- ); -}; +import { For, Show } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import { formatTimestamp } from '../utils' +import { ToolCallDisplay } from './ToolCallDisplay' +import { ChunksCollapsible } from './ChunksCollapsible' +import type { Message } from '../../store/ai-store' +import type { Component } from 'solid-js' + +interface MessageCardProps { + message: Message +} + +export const MessageCard: Component = (props) => { + const styles = useStyles() + const msg = () => props.message + + return ( +
+
+
+ {msg().role === 'user' ? 'U' : '🤖'} +
+
+
+ {msg().role} +
+
+
+ {formatTimestamp(msg().timestamp)} +
+ {/* Per-message token usage */} + +
+ + 🎯 + + {msg().usage?.promptTokens.toLocaleString()} in + + {msg().usage?.completionTokens.toLocaleString()} out +
+
+
+ + {/* Thinking content (for extended thinking models) */} + +
+ + 💭 Thinking... + +
+ {msg().thinkingContent} +
+
+
+ +
+ {msg().content} +
+ + {/* Tool Calls Display */} + 0}> +
+ + {(tool) => } + +
+
+ + {/* Chunks Display (for client conversations with server chunks) */} + 0}> + + +
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/MessageGroup.tsx b/packages/typescript/ai-devtools/src/components/conversation/MessageGroup.tsx index 3b3f55f2e..f22202556 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/MessageGroup.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/MessageGroup.tsx @@ -1,67 +1,81 @@ -import { Component, For, Show } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Chunk } from "../../store/ai-store"; -import { ChunkItem } from "./ChunkItem"; -import { ChunkBadges } from "./ChunkBadges"; - -interface MessageGroupProps { - messageId: string; - chunks: Chunk[]; - groupIndex: number; -} - -export const MessageGroup: Component = (props) => { - const styles = useStyles(); - - const accumulatedContent = () => - props.chunks - .filter((c) => c.type === "content" && (c.content || c.delta)) - .map((c) => c.content) - .join(""); - - // Total raw chunks = sum of all chunkCounts - const totalRawChunks = () => props.chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0); - // Consolidated entries = number of entries in the chunks array - const consolidatedEntries = () => props.chunks.length; - - return ( -
- -
- {/* Header */} -
- Message #{props.groupIndex + 1} -
- 📦 {totalRawChunks()} chunks - - ({consolidatedEntries()} entries) - -
- -
- - {/* Message ID */} -
- ID: {props.messageId} -
- - {/* Accumulated Content Preview */} - -
- {accumulatedContent()} -
-
-
-
- - {/* Chunks in this group */} -
-
- - {(chunk, chunkIndex) => } - -
-
-
- ); -}; +import { For, Show } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import { ChunkItem } from './ChunkItem' +import { ChunkBadges } from './ChunkBadges' +import type { Component } from 'solid-js' +import type { Chunk } from '../../store/ai-store' + +interface MessageGroupProps { + messageId: string + chunks: Array + groupIndex: number +} + +export const MessageGroup: Component = (props) => { + const styles = useStyles() + + const accumulatedContent = () => + props.chunks + .filter((c) => c.type === 'content' && (c.content || c.delta)) + .map((c) => c.content) + .join('') + + // Total raw chunks = sum of all chunkCounts + const totalRawChunks = () => + props.chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0) + // Consolidated entries = number of entries in the chunks array + const consolidatedEntries = () => props.chunks.length + + return ( +
+ +
+ {/* Header */} +
+ Message #{props.groupIndex + 1} +
+ 📦 {totalRawChunks()} chunks + + + ({consolidatedEntries()} entries) + + +
+ +
+ + {/* Message ID */} +
+ ID: {props.messageId} +
+ + {/* Accumulated Content Preview */} + +
+ {accumulatedContent()} +
+
+
+
+ + {/* Chunks in this group */} +
+
+ + {(chunk, chunkIndex) => ( + + )} + +
+
+
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/MessagesTab.tsx b/packages/typescript/ai-devtools/src/components/conversation/MessagesTab.tsx index 470522496..3cfd6da8d 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/MessagesTab.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/MessagesTab.tsx @@ -1,27 +1,30 @@ -import { Component, For, Show } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import type { Message } from "../../store/ai-store"; -import { MessageCard } from "./MessageCard"; - -interface MessagesTabProps { - messages: Message[]; -} - -export const MessagesTab: Component = (props) => { - const styles = useStyles(); - - return ( - 0} - fallback={ -
- No messages yet. Start a conversation to see messages here. -
- } - > -
- {(msg) => } -
-
- ); -}; +import { For, Show } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import { MessageCard } from './MessageCard' +import type { Component } from 'solid-js' +import type { Message } from '../../store/ai-store' + +interface MessagesTabProps { + messages: Array +} + +export const MessagesTab: Component = (props) => { + const styles = useStyles() + + return ( + 0} + fallback={ +
+ No messages yet. Start a conversation to see messages here. +
+ } + > +
+ + {(msg) => } + +
+
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/ToolCallDisplay.tsx b/packages/typescript/ai-devtools/src/components/conversation/ToolCallDisplay.tsx index b74e06f49..51c4d0995 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/ToolCallDisplay.tsx +++ b/packages/typescript/ai-devtools/src/components/conversation/ToolCallDisplay.tsx @@ -1,76 +1,91 @@ -import { Component, Show } from "solid-js"; -import { JsonTree } from "@tanstack/devtools-ui"; -import { useStyles } from "../../styles/use-styles"; -import type { ToolCall } from "../../store/ai-store"; - -interface ToolCallDisplayProps { - tool: ToolCall; -} - -export const ToolCallDisplay: Component = (props) => { - const styles = useStyles(); - const tool = () => props.tool; - - // Parse arguments if they're a string - const parsedArguments = () => { - const args = tool().arguments; - if (typeof args === "string") { - try { - return JSON.parse(args); - } catch { - return args; - } - } - return args; - }; - - return ( -
-
-
- {tool().approvalRequired ? "⚠️" : "🔧"} {tool().name} -
-
- {tool().state} -
- -
APPROVAL REQUIRED
-
-
- -
-
Arguments
-
- } defaultExpansionDepth={2} copyable /> -
-
-
- -
-
Result
-
- } defaultExpansionDepth={2} copyable /> -
-
-
-
- ); -}; +import { Show } from 'solid-js' +import { JsonTree } from '@tanstack/devtools-ui' +import { useStyles } from '../../styles/use-styles' +import type { Component } from 'solid-js' +import type { ToolCall } from '../../store/ai-store' + +interface ToolCallDisplayProps { + tool: ToolCall +} + +export const ToolCallDisplay: Component = (props) => { + const styles = useStyles() + const tool = () => props.tool + + // Parse arguments if they're a string + const parsedArguments = () => { + const args = tool().arguments + if (typeof args === 'string') { + try { + return JSON.parse(args) + } catch { + return args + } + } + return args + } + + return ( +
+
+
+ {tool().approvalRequired ? '⚠️' : '🔧'} {tool().name} +
+
+ {tool().state} +
+ +
+ APPROVAL REQUIRED +
+
+
+ +
+
+ Arguments +
+
+ } + defaultExpansionDepth={2} + copyable + /> +
+
+
+ +
+
+ Result +
+
+ } + defaultExpansionDepth={2} + copyable + /> +
+
+
+
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/index.ts b/packages/typescript/ai-devtools/src/components/conversation/index.ts index b2dd46c75..a78156fe0 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/index.ts +++ b/packages/typescript/ai-devtools/src/components/conversation/index.ts @@ -1,10 +1,10 @@ -export { ConversationHeader } from "./ConversationHeader"; -export { ConversationTabs } from "./ConversationTabs"; -export { MessageCard } from "./MessageCard"; -export { ToolCallDisplay } from "./ToolCallDisplay"; -export { ChunkBadges } from "./ChunkBadges"; -export { ChunkItem } from "./ChunkItem"; -export { ChunksCollapsible } from "./ChunksCollapsible"; -export { MessageGroup } from "./MessageGroup"; -export { MessagesTab } from "./MessagesTab"; -export { ChunksTab } from "./ChunksTab"; +export { ConversationHeader } from './ConversationHeader' +export { ConversationTabs } from './ConversationTabs' +export { MessageCard } from './MessageCard' +export { ToolCallDisplay } from './ToolCallDisplay' +export { ChunkBadges } from './ChunkBadges' +export { ChunkItem } from './ChunkItem' +export { ChunksCollapsible } from './ChunksCollapsible' +export { MessageGroup } from './MessageGroup' +export { MessagesTab } from './MessagesTab' +export { ChunksTab } from './ChunksTab' diff --git a/packages/typescript/ai-devtools/src/components/list/ConversationRow.tsx b/packages/typescript/ai-devtools/src/components/list/ConversationRow.tsx index d6bf81e31..e9227a73e 100644 --- a/packages/typescript/ai-devtools/src/components/list/ConversationRow.tsx +++ b/packages/typescript/ai-devtools/src/components/list/ConversationRow.tsx @@ -1,67 +1,83 @@ -import { Component, Show } from "solid-js"; -import { useStyles } from "../../styles/use-styles"; -import { useAIStore, type Conversation } from "../../store/ai-context"; -import { getStatusColor, getTypeColor } from "../utils"; - -interface ConversationRowProps { - conversation: Conversation; -} - -export const ConversationRow: Component = (props) => { - const { state, selectConversation } = useAIStore(); - const styles = useStyles(); - const conv = () => props.conversation; - - const hasToolCalls = () => { - return conv().messages.some((msg) => msg.toolCalls && msg.toolCalls.length > 0); - }; - - const countToolCalls = () => { - return conv().messages.reduce((total, msg) => { - return total + (msg.toolCalls?.length || 0); - }, 0); - }; - - // Total raw chunks = sum of all chunkCounts from all chunks - const totalRawChunks = () => { - return conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0); - }; - - return ( -
selectConversation(conv().id)} - > -
-
-
-
{conv().label}
- -
- 🔧 {countToolCalls()} -
-
-
-
-
-
-
💬 {conv().messages.length}
-
📦 {totalRawChunks()}
- -
- 🎯 {conv().usage?.totalTokens || 0} -
-
-
- -
⟳ Loading...
-
-
- ); -}; +import { Show } from 'solid-js' +import { useStyles } from '../../styles/use-styles' +import { useAIStore } from '../../store/ai-context' +import { getStatusColor, getTypeColor } from '../utils' +import type { Conversation } from '../../store/ai-context' +import type { Component } from 'solid-js' + +interface ConversationRowProps { + conversation: Conversation +} + +export const ConversationRow: Component = (props) => { + const { state, selectConversation } = useAIStore() + const styles = useStyles() + const conv = () => props.conversation + + const hasToolCalls = () => { + return conv().messages.some( + (msg) => msg.toolCalls && msg.toolCalls.length > 0, + ) + } + + const countToolCalls = () => { + return conv().messages.reduce((total, msg) => { + return total + (msg.toolCalls?.length || 0) + }, 0) + } + + // Total raw chunks = sum of all chunkCounts from all chunks + const totalRawChunks = () => { + return conv().chunks.reduce((sum, c) => sum + (c.chunkCount || 1), 0) + } + + return ( +
selectConversation(conv().id)} + > +
+
+
+
{conv().label}
+ +
+ 🔧 {countToolCalls()} +
+
+
+
+
+
+
+ 💬 {conv().messages.length} +
+
+ 📦 {totalRawChunks()} +
+ +
+ 🎯 {conv().usage?.totalTokens || 0} +
+
+
+ +
+ ⟳ Loading... +
+
+
+ ) +} diff --git a/packages/typescript/ai-devtools/src/components/list/index.ts b/packages/typescript/ai-devtools/src/components/list/index.ts index 983a286f0..1cde25059 100644 --- a/packages/typescript/ai-devtools/src/components/list/index.ts +++ b/packages/typescript/ai-devtools/src/components/list/index.ts @@ -1 +1 @@ -export { ConversationRow } from "./ConversationRow"; +export { ConversationRow } from './ConversationRow' diff --git a/packages/typescript/ai-devtools/src/components/utils/format.ts b/packages/typescript/ai-devtools/src/components/utils/format.ts index 849cdf606..b0cf6136f 100644 --- a/packages/typescript/ai-devtools/src/components/utils/format.ts +++ b/packages/typescript/ai-devtools/src/components/utils/format.ts @@ -1,55 +1,61 @@ -import type { Chunk } from "../../store/ai-store"; - -export const formatTimestamp = (timestamp: number): string => { - const date = new Date(timestamp); - return date.toLocaleTimeString() + "." + date.getMilliseconds().toString().padStart(3, "0"); -}; - -export const formatDuration = (ms?: number): string => { - if (!ms) return "-"; - if (ms < 1000) return `${ms}ms`; - return `${(ms / 1000).toFixed(2)}s`; -}; - -export const getChunkTypeColor = (type: Chunk["type"]): string => { - switch (type) { - case "content": - return "#10b981"; // green - case "tool_call": - return "#8b5cf6"; // purple - case "tool_result": - return "#3b82f6"; // blue - case "done": - return "#6b7280"; // gray - case "error": - return "#ef4444"; // red - case "approval": - return "#f59e0b"; // orange/amber - default: - return "#6b7280"; // gray - } -}; - -export const getStatusColor = (status: "active" | "completed" | "error"): string => { - switch (status) { - case "active": - return "oklch(0.7 0.17 142)"; // green - case "completed": - return "oklch(0.65 0.1 260)"; // blue - case "error": - return "oklch(0.65 0.2 25)"; // red - default: - return "oklch(0.6 0.05 200)"; - } -}; - -export const getTypeColor = (type: "client" | "server"): string => { - switch (type) { - case "client": - return "oklch(0.68 0.16 330)"; // pink - case "server": - return "oklch(0.68 0.15 280)"; // purple - default: - return "oklch(0.6 0.05 200)"; - } -}; +import type { Chunk } from '../../store/ai-store' + +export const formatTimestamp = (timestamp: number): string => { + const date = new Date(timestamp) + return ( + date.toLocaleTimeString() + + '.' + + date.getMilliseconds().toString().padStart(3, '0') + ) +} + +export const formatDuration = (ms?: number): string => { + if (!ms) return '-' + if (ms < 1000) return `${ms}ms` + return `${(ms / 1000).toFixed(2)}s` +} + +export const getChunkTypeColor = (type: Chunk['type']): string => { + switch (type) { + case 'content': + return '#10b981' // green + case 'tool_call': + return '#8b5cf6' // purple + case 'tool_result': + return '#3b82f6' // blue + case 'done': + return '#6b7280' // gray + case 'error': + return '#ef4444' // red + case 'approval': + return '#f59e0b' // orange/amber + default: + return '#6b7280' // gray + } +} + +export const getStatusColor = ( + status: 'active' | 'completed' | 'error', +): string => { + switch (status) { + case 'active': + return 'oklch(0.7 0.17 142)' // green + case 'completed': + return 'oklch(0.65 0.1 260)' // blue + case 'error': + return 'oklch(0.65 0.2 25)' // red + default: + return 'oklch(0.6 0.05 200)' + } +} + +export const getTypeColor = (type: 'client' | 'server'): string => { + switch (type) { + case 'client': + return 'oklch(0.68 0.16 330)' // pink + case 'server': + return 'oklch(0.68 0.15 280)' // purple + default: + return 'oklch(0.6 0.05 200)' + } +} diff --git a/packages/typescript/ai-devtools/src/components/utils/index.ts b/packages/typescript/ai-devtools/src/components/utils/index.ts index 704c53ac2..d1884f921 100644 --- a/packages/typescript/ai-devtools/src/components/utils/index.ts +++ b/packages/typescript/ai-devtools/src/components/utils/index.ts @@ -1 +1 @@ -export * from "./format"; +export * from './format' diff --git a/packages/typescript/ai-devtools/src/core.tsx b/packages/typescript/ai-devtools/src/core.tsx index a4eb67ee2..c0eedff68 100644 --- a/packages/typescript/ai-devtools/src/core.tsx +++ b/packages/typescript/ai-devtools/src/core.tsx @@ -1,10 +1,10 @@ -import { lazy } from "solid-js"; -import { constructCoreClass } from "@tanstack/devtools-utils/solid"; +import { lazy } from 'solid-js' +import { constructCoreClass } from '@tanstack/devtools-utils/solid' -const Component = lazy(() => import("./components/Shell")); +const Component = lazy(() => import('./components/Shell')) export interface AiDevtoolsInit {} -const [AiDevtoolsCore, AiDevtoolsCoreNoOp] = constructCoreClass(Component); +const [AiDevtoolsCore, AiDevtoolsCoreNoOp] = constructCoreClass(Component) -export { AiDevtoolsCore, AiDevtoolsCoreNoOp }; +export { AiDevtoolsCore, AiDevtoolsCoreNoOp } diff --git a/packages/typescript/ai-devtools/src/store/ai-context.tsx b/packages/typescript/ai-devtools/src/store/ai-context.tsx index be2d0a114..543a9f307 100644 --- a/packages/typescript/ai-devtools/src/store/ai-context.tsx +++ b/packages/typescript/ai-devtools/src/store/ai-context.tsx @@ -1,1221 +1,1412 @@ -import { createContext, useContext, onMount, onCleanup, ParentComponent, batch } from "solid-js"; -import { createStore, produce } from "solid-js/store"; -import { aiEventClient } from "@tanstack/ai/event-client"; - -export interface MessagePart { - type: "text" | "tool-call" | "tool-result"; - content?: string; - toolCallId?: string; - toolName?: string; - arguments?: string; - state?: string; - output?: unknown; - error?: string; -} - -export interface ToolCall { - id: string; - name: string; - arguments: string; - state: string; - result?: unknown; - approvalRequired?: boolean; - approvalId?: string; -} - -export interface TokenUsage { - promptTokens: number; - completionTokens: number; - totalTokens: number; -} - -export interface Message { - id: string; - role: "user" | "assistant" | "system"; - content: string; - timestamp: number; - parts?: MessagePart[]; - toolCalls?: ToolCall[]; - /** Consolidated chunks - consecutive same-type chunks are merged into one entry */ - chunks?: Chunk[]; - /** Total number of raw chunks received (before consolidation) */ - totalChunkCount?: number; - model?: string; - usage?: TokenUsage; - thinkingContent?: string; -} - -/** - * Consolidated chunk - represents one or more raw chunks of the same type. - * Consecutive content/thinking chunks are merged into a single entry with accumulated content. - */ -export interface Chunk { - id: string; - type: "content" | "tool_call" | "tool_result" | "done" | "error" | "approval" | "thinking"; - timestamp: number; - messageId?: string; - /** Accumulated content from all merged chunks */ - content?: string; - /** The last delta received (kept for debugging) */ - delta?: string; - toolName?: string; - toolCallId?: string; - finishReason?: string; - error?: string; - approvalId?: string; - input?: unknown; - /** Number of raw chunks that were merged into this consolidated chunk */ - chunkCount: number; -} - -export interface Conversation { - id: string; - type: "client" | "server"; - label: string; - messages: Message[]; - chunks: Chunk[]; - model?: string; - provider?: string; - status: "active" | "completed" | "error"; - startedAt: number; - completedAt?: number; - usage?: TokenUsage; - iterationCount?: number; - toolNames?: string[]; - options?: Record; - providerOptions?: Record; -} - -export interface AIStoreState { - conversations: Record; - activeConversationId: string | null; -} - -interface AIContextValue { - state: AIStoreState; - clearAllConversations: () => void; - selectConversation: (id: string) => void; -} - -const AIContext = createContext(); - -export function useAIStore(): AIContextValue { - const context = useContext(AIContext); - if (!context) { - throw new Error("useAIStore must be used within an AIProvider"); - } - return context; -} - -export const AIProvider: ParentComponent = (props) => { - const [state, setState] = createStore({ - conversations: {}, - activeConversationId: null, - }); - - const streamToConversation = new Map(); - const requestToConversation = new Map(); - - // Batching system for high-frequency chunk updates with consolidated chunk merging - // Stores: conversationId -> { chunks to merge, totalNewChunks count } - const pendingConversationChunks = new Map(); - // Stores: conversationId -> messageIndex -> { chunks to merge, totalNewChunks count } - const pendingMessageChunks = new Map>(); - let batchScheduled = false; - - function scheduleBatchFlush(): void { - if (batchScheduled) return; - batchScheduled = true; - queueMicrotask(flushPendingChunks); - } - - /** Check if a chunk type can be merged with consecutive same-type chunks */ - function isMergeableChunkType(type: Chunk["type"]): boolean { - return type === "content" || type === "thinking"; - } - - /** Merge pending chunks into existing chunks array, consolidating consecutive same-type chunks */ - function mergeChunks(existing: Chunk[], pending: Chunk[]): void { - for (const chunk of pending) { - const lastChunk = existing[existing.length - 1]; - - // If last chunk exists, is the same type, and both are mergeable types, merge them - if ( - lastChunk && - lastChunk.type === chunk.type && - isMergeableChunkType(chunk.type) && - lastChunk.messageId === chunk.messageId - ) { - // Merge: append content, update delta, increment count - lastChunk.content = (lastChunk.content || "") + (chunk.delta || chunk.content || ""); - lastChunk.delta = chunk.delta; - lastChunk.chunkCount += chunk.chunkCount; - } else { - // Different type or not mergeable - add as new entry - existing.push(chunk); - } - } - } - - function flushPendingChunks(): void { - batchScheduled = false; - - batch(() => { - // Flush conversation-level chunks - for (const [conversationId, { chunks, newChunkCount }] of pendingConversationChunks) { - const conv = state.conversations[conversationId]; - if (conv) { - setState( - "conversations", - conversationId, - "chunks", - produce((arr: Chunk[]) => { - mergeChunks(arr, chunks); - }) - ); - } - } - pendingConversationChunks.clear(); - - // Flush message-level chunks - for (const [conversationId, messageMap] of pendingMessageChunks) { - const conv = state.conversations[conversationId]; - if (!conv) continue; - - for (const [messageIndex, { chunks, newChunkCount }] of messageMap) { - const message = conv.messages[messageIndex]; - if (message) { - // Update chunks array with merging - setState( - "conversations", - conversationId, - "messages", - messageIndex, - "chunks", - produce((arr: Chunk[] | undefined) => { - if (!arr) { - // First time - just set the chunks (they're already consolidated in pending) - return chunks; - } - mergeChunks(arr, chunks); - return arr; - }) - ); - // Update total chunk count - const currentTotal = message.totalChunkCount || 0; - setState( - "conversations", - conversationId, - "messages", - messageIndex, - "totalChunkCount", - currentTotal + newChunkCount - ); - } - } - } - pendingMessageChunks.clear(); - }); - } - - function queueChunk(conversationId: string, chunk: Chunk): void { - if (!pendingConversationChunks.has(conversationId)) { - pendingConversationChunks.set(conversationId, { chunks: [], newChunkCount: 0 }); - } - const pending = pendingConversationChunks.get(conversationId)!; - - // Pre-merge in pending buffer to reduce array operations during flush - const lastPending = pending.chunks[pending.chunks.length - 1]; - if ( - lastPending && - lastPending.type === chunk.type && - isMergeableChunkType(chunk.type) && - lastPending.messageId === chunk.messageId - ) { - // Merge into pending buffer - lastPending.content = (lastPending.content || "") + (chunk.delta || chunk.content || ""); - lastPending.delta = chunk.delta; - lastPending.chunkCount += chunk.chunkCount; - } else { - pending.chunks.push(chunk); - } - pending.newChunkCount += chunk.chunkCount; - scheduleBatchFlush(); - } - - function queueMessageChunk(conversationId: string, messageIndex: number, chunk: Chunk): void { - if (!pendingMessageChunks.has(conversationId)) { - pendingMessageChunks.set(conversationId, new Map()); - } - const messageMap = pendingMessageChunks.get(conversationId)!; - if (!messageMap.has(messageIndex)) { - messageMap.set(messageIndex, { chunks: [], newChunkCount: 0 }); - } - const pending = messageMap.get(messageIndex)!; - - // Pre-merge in pending buffer - const lastPending = pending.chunks[pending.chunks.length - 1]; - if ( - lastPending && - lastPending.type === chunk.type && - isMergeableChunkType(chunk.type) && - lastPending.messageId === chunk.messageId - ) { - // Merge into pending buffer - lastPending.content = (lastPending.content || "") + (chunk.delta || chunk.content || ""); - lastPending.delta = chunk.delta; - lastPending.chunkCount += chunk.chunkCount; - } else { - pending.chunks.push(chunk); - } - pending.newChunkCount += chunk.chunkCount; - scheduleBatchFlush(); - } - - // Optimized helper functions using path-based updates - function getOrCreateConversation(id: string, type: "client" | "server", label: string): void { - if (!state.conversations[id]) { - setState("conversations", id, { - id, - type, - label, - messages: [], - chunks: [], - status: "active", - startedAt: Date.now(), - }); - if (!state.activeConversationId) { - setState("activeConversationId", id); - } - } - } - - function addMessage(conversationId: string, message: Message): void { - const conv = state.conversations[conversationId]; - if (!conv) return; - setState("conversations", conversationId, "messages", conv.messages.length, message); - } - - function addChunkToMessage(conversationId: string, chunk: Chunk): void { - const conv = state.conversations[conversationId]; - if (!conv) return; - - if (chunk.messageId) { - const messageIndex = conv.messages.findIndex((msg) => msg.id === chunk.messageId); - - if (messageIndex !== -1) { - queueMessageChunk(conversationId, messageIndex, chunk); - return; - } else { - // Create new message with the chunk - const newMessage: Message = { - id: chunk.messageId, - role: "assistant", - content: "", - timestamp: chunk.timestamp, - model: conv.model, - chunks: [chunk], - }; - setState("conversations", conversationId, "messages", conv.messages.length, newMessage); - return; - } - } - - // Find last assistant message - for (let i = conv.messages.length - 1; i >= 0; i--) { - const message = conv.messages[i]; - if (message && message.role === "assistant") { - queueMessageChunk(conversationId, i, chunk); - return; - } - } - } - - function updateMessageUsage(conversationId: string, messageId: string | undefined, usage: TokenUsage): void { - const conv = state.conversations[conversationId]; - if (!conv) return; - - if (messageId) { - const messageIndex = conv.messages.findIndex((msg) => msg.id === messageId); - if (messageIndex !== -1) { - setState("conversations", conversationId, "messages", messageIndex, "usage", usage); - return; - } - } - - for (let i = conv.messages.length - 1; i >= 0; i--) { - const message = conv.messages[i]; - if (message && message.role === "assistant") { - setState("conversations", conversationId, "messages", i, "usage", usage); - return; - } - } - } - - // Public actions - function clearAllConversations() { - setState("conversations", {}); - setState("activeConversationId", null); - streamToConversation.clear(); - requestToConversation.clear(); - pendingConversationChunks.clear(); - pendingMessageChunks.clear(); - } - - function selectConversation(id: string) { - setState("activeConversationId", id); - } - - // Additional optimized helper functions - function updateConversation(conversationId: string, updates: Partial): void { - if (!state.conversations[conversationId]) return; - for (const [key, value] of Object.entries(updates)) { - setState("conversations", conversationId, key as keyof Conversation, value as Conversation[keyof Conversation]); - } - } - - function updateMessage(conversationId: string, messageIndex: number, updates: Partial): void { - const conv = state.conversations[conversationId]; - if (!conv || !conv.messages[messageIndex]) return; - for (const [key, value] of Object.entries(updates)) { - setState( - "conversations", - conversationId, - "messages", - messageIndex, - key as keyof Message, - value as Message[keyof Message] - ); - } - } - - function updateToolCall( - conversationId: string, - messageIndex: number, - toolCallIndex: number, - updates: Partial - ): void { - const conv = state.conversations[conversationId]; - if (!conv?.messages[messageIndex]?.toolCalls?.[toolCallIndex]) return; - setState( - "conversations", - conversationId, - "messages", - messageIndex, - "toolCalls", - toolCallIndex, - produce((tc: ToolCall) => Object.assign(tc, updates)) - ); - } - - function setToolCalls(conversationId: string, messageIndex: number, toolCalls: ToolCall[]): void { - if (!state.conversations[conversationId]?.messages[messageIndex]) return; - setState("conversations", conversationId, "messages", messageIndex, "toolCalls", toolCalls); - } - - function addChunk(conversationId: string, chunk: Chunk): void { - if (!state.conversations[conversationId]) return; - queueChunk(conversationId, chunk); - } - - // Register all event listeners on mount - onMount(() => { - const cleanupFns: Array<() => void> = []; - - // ============= Client Events ============= - - cleanupFns.push( - aiEventClient.on( - "client:created", - (e) => { - const clientId = e.payload.clientId; - getOrCreateConversation(clientId, "client", `Client Chat (${clientId.substring(0, 8)})`); - updateConversation(clientId, { model: undefined, provider: "Client" }); - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:message-sent", - (e) => { - const clientId = e.payload.clientId; - if (!state.conversations[clientId]) { - getOrCreateConversation(clientId, "client", `Client Chat (${clientId.substring(0, 8)})`); - } - addMessage(clientId, { - id: e.payload.messageId, - role: "user", - content: e.payload.content, - timestamp: e.payload.timestamp, - }); - updateConversation(clientId, { status: "active" }); - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:message-appended", - (e) => { - const clientId = e.payload.clientId; - const role = e.payload.role; - - if (role === "user") return; - if (!state.conversations[clientId]) return; - - if (role === "assistant") { - addMessage(clientId, { - id: e.payload.messageId, - role: "assistant", - content: e.payload.contentPreview, - timestamp: e.payload.timestamp, - }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:loading-changed", - (e) => { - const clientId = e.payload.clientId; - if (state.conversations[clientId]) { - updateConversation(clientId, { status: e.payload.isLoading ? "active" : "completed" }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:stopped", - (e) => { - const clientId = e.payload.clientId; - if (state.conversations[clientId]) { - updateConversation(clientId, { status: "completed", completedAt: e.payload.timestamp }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:messages-cleared", - (e) => { - const clientId = e.payload.clientId; - if (state.conversations[clientId]) { - updateConversation(clientId, { messages: [], chunks: [], usage: undefined }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:reloaded", - (e) => { - const clientId = e.payload.clientId; - const conv = state.conversations[clientId]; - if (conv) { - updateConversation(clientId, { - messages: conv.messages.slice(0, e.payload.fromMessageIndex), - status: "active", - }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:error-changed", - (e) => { - const clientId = e.payload.clientId; - if (state.conversations[clientId] && e.payload.error) { - updateConversation(clientId, { status: "error" }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:assistant-message-updated", - (e) => { - const clientId = e.payload.clientId; - const messageId = e.payload.messageId; - const content = e.payload.content; - - if (!state.conversations[clientId]) return; - - const conv = state.conversations[clientId]; - const lastMessage = conv.messages[conv.messages.length - 1]; - - if (lastMessage && lastMessage.role === "assistant" && lastMessage.id === messageId) { - updateMessage(clientId, conv.messages.length - 1, { content, model: conv.model }); - } else { - addMessage(clientId, { - id: messageId, - role: "assistant", - content: content, - timestamp: e.payload.timestamp, - model: conv.model, - chunks: [], - }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:tool-call-updated", - (e) => { - const { - clientId, - messageId, - toolCallId, - toolName, - state: toolCallState, - arguments: args, - } = e.payload as { - clientId: string; - messageId: string; - toolCallId: string; - toolName: string; - state: string; - arguments: unknown; - timestamp: number; - }; - - if (!state.conversations[clientId]) return; - - const conv = state.conversations[clientId]; - const messageIndex = conv.messages.findIndex((m: Message) => m.id === messageId); - if (messageIndex === -1) return; - - const message = conv.messages[messageIndex]; - if (!message) return; - - const toolCalls = message.toolCalls || []; - const existingToolIndex = toolCalls.findIndex((t: ToolCall) => t.id === toolCallId); - - const toolCall: ToolCall = { - id: toolCallId, - name: toolName, - arguments: JSON.stringify(args, null, 2), - state: toolCallState, - }; - - if (existingToolIndex >= 0) { - updateToolCall(clientId, messageIndex, existingToolIndex, toolCall); - } else { - setToolCalls(clientId, messageIndex, [...toolCalls, toolCall]); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "client:approval-requested", - (e) => { - const { clientId, messageId, toolCallId, approvalId } = e.payload; - - if (!state.conversations[clientId]) return; - - const conv = state.conversations[clientId]; - const messageIndex = conv.messages.findIndex((m) => m.id === messageId); - if (messageIndex === -1) return; - - const message = conv.messages[messageIndex]; - if (!message?.toolCalls) return; - - const toolCallIndex = message.toolCalls.findIndex((t) => t.id === toolCallId); - if (toolCallIndex === -1) return; - - updateToolCall(clientId, messageIndex, toolCallIndex, { - approvalRequired: true, - approvalId, - state: "approval-requested", - }); - }, - { withEventTarget: false } - ) - ); - - // ============= Tool Events ============= - - cleanupFns.push( - aiEventClient.on( - "tool:result-added", - (e) => { - const { clientId, toolCallId, output, state: resultState } = e.payload; - - if (!state.conversations[clientId]) return; - - const conv = state.conversations[clientId]; - - for (let messageIndex = conv.messages.length - 1; messageIndex >= 0; messageIndex--) { - const message = conv.messages[messageIndex]; - if (!message?.toolCalls) continue; - - const toolCallIndex = message.toolCalls.findIndex((t: ToolCall) => t.id === toolCallId); - if (toolCallIndex >= 0) { - updateToolCall(clientId, messageIndex, toolCallIndex, { - result: output, - state: resultState === "output-error" ? "error" : "complete", - }); - return; - } - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "tool:approval-responded", - (e) => { - const { clientId, toolCallId, approved } = e.payload; - - if (!state.conversations[clientId]) return; - - const conv = state.conversations[clientId]; - - for (let messageIndex = conv.messages.length - 1; messageIndex >= 0; messageIndex--) { - const message = conv.messages[messageIndex]; - if (!message?.toolCalls) continue; - - const toolCallIndex = message.toolCalls.findIndex((t: ToolCall) => t.id === toolCallId); - if (toolCallIndex >= 0) { - updateToolCall(clientId, messageIndex, toolCallIndex, { - state: approved ? "approved" : "denied", - approvalRequired: false, - }); - return; - } - } - }, - { withEventTarget: false } - ) - ); - - // ============= Stream Events ============= - - cleanupFns.push( - aiEventClient.on( - "stream:started", - (e) => { - const streamId = e.payload.streamId; - const model = e.payload.model; - const provider = e.payload.provider; - const clientId = e.payload.clientId; - - if (clientId && state.conversations[clientId]) { - streamToConversation.set(streamId, clientId); - updateConversation(clientId, { model, provider, status: "active" }); - return; - } - - const activeClient = Object.values(state.conversations).find( - (c) => c.type === "client" && c.status === "active" && !c.model - ); - - if (activeClient) { - streamToConversation.set(streamId, activeClient.id); - updateConversation(activeClient.id, { model, provider }); - } else { - const existingServerConv = Object.values(state.conversations).find( - (c) => c.type === "server" && c.model === model - ); - - if (existingServerConv) { - streamToConversation.set(streamId, existingServerConv.id); - updateConversation(existingServerConv.id, { status: "active" }); - } else { - const serverId = `server-${model}`; - getOrCreateConversation(serverId, "server", `${model} Server`); - streamToConversation.set(streamId, serverId); - updateConversation(serverId, { model, provider }); - } - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "stream:chunk:content", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - if (!conversationId) return; - - const chunk: Chunk = { - id: `chunk-${Date.now()}-${Math.random()}`, - type: "content", - messageId: e.payload.messageId, - content: e.payload.content, - delta: e.payload.delta, - timestamp: e.payload.timestamp, - chunkCount: 1, - }; - - const conv = state.conversations[conversationId]; - if (conv?.type === "client") { - addChunkToMessage(conversationId, chunk); - } else { - addChunk(conversationId, chunk); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "stream:chunk:tool-call", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - if (!conversationId) return; - - const chunk: Chunk = { - id: `chunk-${Date.now()}-${Math.random()}`, - type: "tool_call", - messageId: e.payload.messageId, - toolCallId: e.payload.toolCallId, - toolName: e.payload.toolName, - timestamp: e.payload.timestamp, - chunkCount: 1, - }; - - const conv = state.conversations[conversationId]; - if (conv?.type === "client") { - addChunkToMessage(conversationId, chunk); - } else { - addChunk(conversationId, chunk); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "stream:chunk:tool-result", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - if (!conversationId) return; - - const chunk: Chunk = { - id: `chunk-${Date.now()}-${Math.random()}`, - type: "tool_result", - messageId: e.payload.messageId, - toolCallId: e.payload.toolCallId, - content: e.payload.result, - timestamp: e.payload.timestamp, - chunkCount: 1, - }; - - const conv = state.conversations[conversationId]; - if (conv?.type === "client") { - addChunkToMessage(conversationId, chunk); - } else { - addChunk(conversationId, chunk); - } - - // Also update the toolCalls array with the result - if (conv && e.payload.toolCallId) { - for (let i = conv.messages.length - 1; i >= 0; i--) { - const message = conv.messages[i]; - if (!message?.toolCalls) continue; - - const toolCallIndex = message.toolCalls.findIndex((t) => t.id === e.payload.toolCallId); - if (toolCallIndex >= 0) { - updateToolCall(conversationId, i, toolCallIndex, { - result: e.payload.result, - state: "complete", - }); - break; - } - } - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "stream:chunk:thinking", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - if (!conversationId) return; - - const chunk: Chunk = { - id: `chunk-${Date.now()}-${Math.random()}`, - type: "thinking", - messageId: e.payload.messageId, - content: e.payload.content, - delta: e.payload.delta, - timestamp: e.payload.timestamp, - chunkCount: 1, - }; - - const conv = state.conversations[conversationId]; - if (conv?.type === "client") { - addChunkToMessage(conversationId, chunk); - - if (e.payload.messageId) { - const messageIndex = conv.messages.findIndex((msg) => msg.id === e.payload.messageId); - if (messageIndex !== -1) { - updateMessage(conversationId, messageIndex, { thinkingContent: e.payload.content }); - } - } - } else { - addChunk(conversationId, chunk); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "stream:chunk:done", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - if (!conversationId) return; - - const chunk: Chunk = { - id: `chunk-${Date.now()}-${Math.random()}`, - type: "done", - messageId: e.payload.messageId, - finishReason: e.payload.finishReason || undefined, - timestamp: e.payload.timestamp, - chunkCount: 1, - }; - - if (e.payload.usage) { - updateConversation(conversationId, { usage: e.payload.usage }); - updateMessageUsage(conversationId, e.payload.messageId, e.payload.usage); - } - - const conv = state.conversations[conversationId]; - if (conv?.type === "client") { - addChunkToMessage(conversationId, chunk); - } else { - addChunk(conversationId, chunk); - } - - // Mark as completed when we receive a done chunk with a terminal finish reason - const finishReason = e.payload.finishReason; - if (finishReason === "stop" || finishReason === "end_turn" || finishReason === "length") { - updateConversation(conversationId, { status: "completed", completedAt: e.payload.timestamp }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "stream:chunk:error", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - if (!conversationId) return; - - const chunk: Chunk = { - id: `chunk-${Date.now()}-${Math.random()}`, - type: "error", - messageId: e.payload.messageId, - error: e.payload.error, - timestamp: e.payload.timestamp, - chunkCount: 1, - }; - - const conv = state.conversations[conversationId]; - if (conv?.type === "client") { - addChunkToMessage(conversationId, chunk); - } else { - addChunk(conversationId, chunk); - } - - updateConversation(conversationId, { status: "error", completedAt: e.payload.timestamp }); - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "stream:ended", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - if (!conversationId) return; - - updateConversation(conversationId, { status: "completed", completedAt: e.payload.timestamp }); - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "stream:approval-requested", - (e) => { - const { streamId, messageId, toolCallId, toolName, input, approvalId, timestamp } = e.payload; - - const conversationId = streamToConversation.get(streamId); - if (!conversationId) return; - - const conv = state.conversations[conversationId]; - if (!conv) return; - - const chunk: Chunk = { - id: `chunk-${Date.now()}-${Math.random()}`, - type: "approval", - messageId: messageId, - toolCallId, - toolName, - approvalId, - input, - timestamp, - chunkCount: 1, - }; - - if (conv.type === "client") { - addChunkToMessage(conversationId, chunk); - } else { - addChunk(conversationId, chunk); - } - - for (let i = conv.messages.length - 1; i >= 0; i--) { - const message = conv.messages[i]; - if (!message) continue; - - if (message.role === "assistant" && message.toolCalls) { - const toolCallIndex = message.toolCalls.findIndex((t: ToolCall) => t.id === toolCallId); - if (toolCallIndex >= 0) { - updateToolCall(conversationId, i, toolCallIndex, { - approvalRequired: true, - approvalId, - state: "approval-requested", - }); - return; - } - } - } - }, - { withEventTarget: false } - ) - ); - - // ============= Processor Events ============= - - cleanupFns.push( - aiEventClient.on( - "processor:text-updated", - (e) => { - const streamId = e.payload.streamId; - - let conversationId = streamToConversation.get(streamId); - - if (!conversationId) { - const activeClients = Object.values(state.conversations) - .filter((c) => c.type === "client" && c.status === "active") - .sort((a, b) => b.startedAt - a.startedAt); - - if (activeClients.length > 0 && activeClients[0]) { - conversationId = activeClients[0].id; - streamToConversation.set(streamId, conversationId); - } - } - - if (!conversationId) return; - - const conv = state.conversations[conversationId]; - if (!conv) return; - - const lastMessage = conv.messages[conv.messages.length - 1]; - if (lastMessage && lastMessage.role === "assistant") { - updateMessage(conversationId, conv.messages.length - 1, { content: e.payload.content }); - } else { - addMessage(conversationId, { - id: `msg-assistant-${Date.now()}`, - role: "assistant", - content: e.payload.content, - timestamp: e.payload.timestamp, - }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "processor:tool-call-state-changed", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - - if (!conversationId || !state.conversations[conversationId]) return; - - const conv = state.conversations[conversationId]; - const lastMessage = conv.messages[conv.messages.length - 1]; - - if (lastMessage && lastMessage.role === "assistant") { - const toolCalls = lastMessage.toolCalls || []; - const existingToolIndex = toolCalls.findIndex((t) => t.id === e.payload.toolCallId); - - const toolCall: ToolCall = { - id: e.payload.toolCallId, - name: e.payload.toolName, - arguments: JSON.stringify(e.payload.arguments, null, 2), - state: e.payload.state, - }; - - if (existingToolIndex >= 0) { - updateToolCall(conversationId, conv.messages.length - 1, existingToolIndex, toolCall); - } else { - setToolCalls(conversationId, conv.messages.length - 1, [...toolCalls, toolCall]); - } - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "processor:tool-result-state-changed", - (e) => { - const streamId = e.payload.streamId; - const conversationId = streamToConversation.get(streamId); - - if (!conversationId || !state.conversations[conversationId]) return; - - const conv = state.conversations[conversationId]; - - for (let i = conv.messages.length - 1; i >= 0; i--) { - const message = conv.messages[i]; - if (!message?.toolCalls) continue; - - const toolCallIndex = message.toolCalls.findIndex((t) => t.id === e.payload.toolCallId); - if (toolCallIndex >= 0) { - updateToolCall(conversationId, i, toolCallIndex, { - result: e.payload.content, - state: e.payload.error ? "error" : e.payload.state, - }); - return; - } - } - }, - { withEventTarget: false } - ) - ); - - // ============= Chat Events (for usage tracking) ============= - - cleanupFns.push( - aiEventClient.on( - "chat:started", - (e) => { - const { requestId, model, clientId, toolNames, options, providerOptions } = e.payload; - - if (clientId && state.conversations[clientId]) { - requestToConversation.set(requestId, clientId); - updateConversation(clientId, { model, status: "active", toolNames, options, providerOptions }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "chat:completed", - (e) => { - const { requestId, usage } = e.payload; - - const conversationId = requestToConversation.get(requestId); - if (conversationId && state.conversations[conversationId] && usage) { - updateConversation(conversationId, { usage }); - updateMessageUsage(conversationId, undefined, usage); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "chat:iteration", - (e) => { - const { requestId, iterationNumber } = e.payload; - - const conversationId = requestToConversation.get(requestId); - if (conversationId && state.conversations[conversationId]) { - updateConversation(conversationId, { iterationCount: iterationNumber }); - } - }, - { withEventTarget: false } - ) - ); - - cleanupFns.push( - aiEventClient.on( - "usage:tokens", - (e) => { - const { requestId, usage, messageId } = e.payload; - - const conversationId = requestToConversation.get(requestId); - if (conversationId && state.conversations[conversationId]) { - updateConversation(conversationId, { usage }); - updateMessageUsage(conversationId, messageId, usage); - } - }, - { withEventTarget: false } - ) - ); - - // Cleanup all listeners on unmount - onCleanup(() => { - for (const cleanup of cleanupFns) { - cleanup(); - } - streamToConversation.clear(); - requestToConversation.clear(); - }); - }); - - const contextValue: AIContextValue = { - state, - clearAllConversations, - selectConversation, - }; - - return {props.children}; -}; +import { batch, createContext, onCleanup, onMount, useContext } from 'solid-js' +import { createStore, produce } from 'solid-js/store' +import { aiEventClient } from '@tanstack/ai/event-client' +import type { ParentComponent } from 'solid-js' + +export interface MessagePart { + type: 'text' | 'tool-call' | 'tool-result' + content?: string + toolCallId?: string + toolName?: string + arguments?: string + state?: string + output?: unknown + error?: string +} + +export interface ToolCall { + id: string + name: string + arguments: string + state: string + result?: unknown + approvalRequired?: boolean + approvalId?: string +} + +export interface TokenUsage { + promptTokens: number + completionTokens: number + totalTokens: number +} + +export interface Message { + id: string + role: 'user' | 'assistant' | 'system' + content: string + timestamp: number + parts?: Array + toolCalls?: Array + /** Consolidated chunks - consecutive same-type chunks are merged into one entry */ + chunks?: Array + /** Total number of raw chunks received (before consolidation) */ + totalChunkCount?: number + model?: string + usage?: TokenUsage + thinkingContent?: string +} + +/** + * Consolidated chunk - represents one or more raw chunks of the same type. + * Consecutive content/thinking chunks are merged into a single entry with accumulated content. + */ +export interface Chunk { + id: string + type: + | 'content' + | 'tool_call' + | 'tool_result' + | 'done' + | 'error' + | 'approval' + | 'thinking' + timestamp: number + messageId?: string + /** Accumulated content from all merged chunks */ + content?: string + /** The last delta received (kept for debugging) */ + delta?: string + toolName?: string + toolCallId?: string + finishReason?: string + error?: string + approvalId?: string + input?: unknown + /** Number of raw chunks that were merged into this consolidated chunk */ + chunkCount: number +} + +export interface Conversation { + id: string + type: 'client' | 'server' + label: string + messages: Array + chunks: Array + model?: string + provider?: string + status: 'active' | 'completed' | 'error' + startedAt: number + completedAt?: number + usage?: TokenUsage + iterationCount?: number + toolNames?: Array + options?: Record + providerOptions?: Record +} + +export interface AIStoreState { + conversations: Record + activeConversationId: string | null +} + +interface AIContextValue { + state: AIStoreState + clearAllConversations: () => void + selectConversation: (id: string) => void +} + +const AIContext = createContext() + +export function useAIStore(): AIContextValue { + const context = useContext(AIContext) + if (!context) { + throw new Error('useAIStore must be used within an AIProvider') + } + return context +} + +export const AIProvider: ParentComponent = (props) => { + const [state, setState] = createStore({ + conversations: {}, + activeConversationId: null, + }) + + const streamToConversation = new Map() + const requestToConversation = new Map() + + // Batching system for high-frequency chunk updates with consolidated chunk merging + // Stores: conversationId -> { chunks to merge, totalNewChunks count } + const pendingConversationChunks = new Map< + string, + { chunks: Array; newChunkCount: number } + >() + // Stores: conversationId -> messageIndex -> { chunks to merge, totalNewChunks count } + const pendingMessageChunks = new Map< + string, + Map; newChunkCount: number }> + >() + let batchScheduled = false + + function scheduleBatchFlush(): void { + if (batchScheduled) return + batchScheduled = true + queueMicrotask(flushPendingChunks) + } + + /** Check if a chunk type can be merged with consecutive same-type chunks */ + function isMergeableChunkType(type: Chunk['type']): boolean { + return type === 'content' || type === 'thinking' + } + + /** Merge pending chunks into existing chunks array, consolidating consecutive same-type chunks */ + function mergeChunks(existing: Array, pending: Array): void { + for (const chunk of pending) { + const lastChunk = existing[existing.length - 1] + + // If last chunk exists, is the same type, and both are mergeable types, merge them + if ( + lastChunk && + lastChunk.type === chunk.type && + isMergeableChunkType(chunk.type) && + lastChunk.messageId === chunk.messageId + ) { + // Merge: append content, update delta, increment count + lastChunk.content = + (lastChunk.content || '') + (chunk.delta || chunk.content || '') + lastChunk.delta = chunk.delta + lastChunk.chunkCount += chunk.chunkCount + } else { + // Different type or not mergeable - add as new entry + existing.push(chunk) + } + } + } + + function flushPendingChunks(): void { + batchScheduled = false + + batch(() => { + // Flush conversation-level chunks + for (const [ + conversationId, + { chunks, newChunkCount }, + ] of pendingConversationChunks) { + const conv = state.conversations[conversationId] + if (conv) { + setState( + 'conversations', + conversationId, + 'chunks', + produce((arr: Array) => { + mergeChunks(arr, chunks) + }), + ) + } + } + pendingConversationChunks.clear() + + // Flush message-level chunks + for (const [conversationId, messageMap] of pendingMessageChunks) { + const conv = state.conversations[conversationId] + if (!conv) continue + + for (const [messageIndex, { chunks, newChunkCount }] of messageMap) { + const message = conv.messages[messageIndex] + if (message) { + // Update chunks array with merging + setState( + 'conversations', + conversationId, + 'messages', + messageIndex, + 'chunks', + produce((arr: Array | undefined) => { + if (!arr) { + // First time - just set the chunks (they're already consolidated in pending) + return chunks + } + mergeChunks(arr, chunks) + return arr + }), + ) + // Update total chunk count + const currentTotal = message.totalChunkCount || 0 + setState( + 'conversations', + conversationId, + 'messages', + messageIndex, + 'totalChunkCount', + currentTotal + newChunkCount, + ) + } + } + } + pendingMessageChunks.clear() + }) + } + + function queueChunk(conversationId: string, chunk: Chunk): void { + if (!pendingConversationChunks.has(conversationId)) { + pendingConversationChunks.set(conversationId, { + chunks: [], + newChunkCount: 0, + }) + } + const pending = pendingConversationChunks.get(conversationId)! + + // Pre-merge in pending buffer to reduce array operations during flush + const lastPending = pending.chunks[pending.chunks.length - 1] + if ( + lastPending && + lastPending.type === chunk.type && + isMergeableChunkType(chunk.type) && + lastPending.messageId === chunk.messageId + ) { + // Merge into pending buffer + lastPending.content = + (lastPending.content || '') + (chunk.delta || chunk.content || '') + lastPending.delta = chunk.delta + lastPending.chunkCount += chunk.chunkCount + } else { + pending.chunks.push(chunk) + } + pending.newChunkCount += chunk.chunkCount + scheduleBatchFlush() + } + + function queueMessageChunk( + conversationId: string, + messageIndex: number, + chunk: Chunk, + ): void { + if (!pendingMessageChunks.has(conversationId)) { + pendingMessageChunks.set(conversationId, new Map()) + } + const messageMap = pendingMessageChunks.get(conversationId)! + if (!messageMap.has(messageIndex)) { + messageMap.set(messageIndex, { chunks: [], newChunkCount: 0 }) + } + const pending = messageMap.get(messageIndex)! + + // Pre-merge in pending buffer + const lastPending = pending.chunks[pending.chunks.length - 1] + if ( + lastPending && + lastPending.type === chunk.type && + isMergeableChunkType(chunk.type) && + lastPending.messageId === chunk.messageId + ) { + // Merge into pending buffer + lastPending.content = + (lastPending.content || '') + (chunk.delta || chunk.content || '') + lastPending.delta = chunk.delta + lastPending.chunkCount += chunk.chunkCount + } else { + pending.chunks.push(chunk) + } + pending.newChunkCount += chunk.chunkCount + scheduleBatchFlush() + } + + // Optimized helper functions using path-based updates + function getOrCreateConversation( + id: string, + type: 'client' | 'server', + label: string, + ): void { + if (!state.conversations[id]) { + setState('conversations', id, { + id, + type, + label, + messages: [], + chunks: [], + status: 'active', + startedAt: Date.now(), + }) + if (!state.activeConversationId) { + setState('activeConversationId', id) + } + } + } + + function addMessage(conversationId: string, message: Message): void { + const conv = state.conversations[conversationId] + if (!conv) return + setState( + 'conversations', + conversationId, + 'messages', + conv.messages.length, + message, + ) + } + + function addChunkToMessage(conversationId: string, chunk: Chunk): void { + const conv = state.conversations[conversationId] + if (!conv) return + + if (chunk.messageId) { + const messageIndex = conv.messages.findIndex( + (msg) => msg.id === chunk.messageId, + ) + + if (messageIndex !== -1) { + queueMessageChunk(conversationId, messageIndex, chunk) + return + } else { + // Create new message with the chunk + const newMessage: Message = { + id: chunk.messageId, + role: 'assistant', + content: '', + timestamp: chunk.timestamp, + model: conv.model, + chunks: [chunk], + } + setState( + 'conversations', + conversationId, + 'messages', + conv.messages.length, + newMessage, + ) + return + } + } + + // Find last assistant message + for (let i = conv.messages.length - 1; i >= 0; i--) { + const message = conv.messages[i] + if (message && message.role === 'assistant') { + queueMessageChunk(conversationId, i, chunk) + return + } + } + } + + function updateMessageUsage( + conversationId: string, + messageId: string | undefined, + usage: TokenUsage, + ): void { + const conv = state.conversations[conversationId] + if (!conv) return + + if (messageId) { + const messageIndex = conv.messages.findIndex( + (msg) => msg.id === messageId, + ) + if (messageIndex !== -1) { + setState( + 'conversations', + conversationId, + 'messages', + messageIndex, + 'usage', + usage, + ) + return + } + } + + for (let i = conv.messages.length - 1; i >= 0; i--) { + const message = conv.messages[i] + if (message && message.role === 'assistant') { + setState('conversations', conversationId, 'messages', i, 'usage', usage) + return + } + } + } + + // Public actions + function clearAllConversations() { + setState('conversations', {}) + setState('activeConversationId', null) + streamToConversation.clear() + requestToConversation.clear() + pendingConversationChunks.clear() + pendingMessageChunks.clear() + } + + function selectConversation(id: string) { + setState('activeConversationId', id) + } + + // Additional optimized helper functions + function updateConversation( + conversationId: string, + updates: Partial, + ): void { + if (!state.conversations[conversationId]) return + for (const [key, value] of Object.entries(updates)) { + setState( + 'conversations', + conversationId, + key as keyof Conversation, + value as Conversation[keyof Conversation], + ) + } + } + + function updateMessage( + conversationId: string, + messageIndex: number, + updates: Partial, + ): void { + const conv = state.conversations[conversationId] + if (!conv || !conv.messages[messageIndex]) return + for (const [key, value] of Object.entries(updates)) { + setState( + 'conversations', + conversationId, + 'messages', + messageIndex, + key as keyof Message, + value as Message[keyof Message], + ) + } + } + + function updateToolCall( + conversationId: string, + messageIndex: number, + toolCallIndex: number, + updates: Partial, + ): void { + const conv = state.conversations[conversationId] + if (!conv?.messages[messageIndex]?.toolCalls?.[toolCallIndex]) return + setState( + 'conversations', + conversationId, + 'messages', + messageIndex, + 'toolCalls', + toolCallIndex, + produce((tc: ToolCall) => Object.assign(tc, updates)), + ) + } + + function setToolCalls( + conversationId: string, + messageIndex: number, + toolCalls: Array, + ): void { + if (!state.conversations[conversationId]?.messages[messageIndex]) return + setState( + 'conversations', + conversationId, + 'messages', + messageIndex, + 'toolCalls', + toolCalls, + ) + } + + function addChunk(conversationId: string, chunk: Chunk): void { + if (!state.conversations[conversationId]) return + queueChunk(conversationId, chunk) + } + + // Register all event listeners on mount + onMount(() => { + const cleanupFns: Array<() => void> = [] + + // ============= Client Events ============= + + cleanupFns.push( + aiEventClient.on( + 'client:created', + (e) => { + const clientId = e.payload.clientId + getOrCreateConversation( + clientId, + 'client', + `Client Chat (${clientId.substring(0, 8)})`, + ) + updateConversation(clientId, { model: undefined, provider: 'Client' }) + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:message-sent', + (e) => { + const clientId = e.payload.clientId + if (!state.conversations[clientId]) { + getOrCreateConversation( + clientId, + 'client', + `Client Chat (${clientId.substring(0, 8)})`, + ) + } + addMessage(clientId, { + id: e.payload.messageId, + role: 'user', + content: e.payload.content, + timestamp: e.payload.timestamp, + }) + updateConversation(clientId, { status: 'active' }) + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:message-appended', + (e) => { + const clientId = e.payload.clientId + const role = e.payload.role + + if (role === 'user') return + if (!state.conversations[clientId]) return + + if (role === 'assistant') { + addMessage(clientId, { + id: e.payload.messageId, + role: 'assistant', + content: e.payload.contentPreview, + timestamp: e.payload.timestamp, + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:loading-changed', + (e) => { + const clientId = e.payload.clientId + if (state.conversations[clientId]) { + updateConversation(clientId, { + status: e.payload.isLoading ? 'active' : 'completed', + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:stopped', + (e) => { + const clientId = e.payload.clientId + if (state.conversations[clientId]) { + updateConversation(clientId, { + status: 'completed', + completedAt: e.payload.timestamp, + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:messages-cleared', + (e) => { + const clientId = e.payload.clientId + if (state.conversations[clientId]) { + updateConversation(clientId, { + messages: [], + chunks: [], + usage: undefined, + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:reloaded', + (e) => { + const clientId = e.payload.clientId + const conv = state.conversations[clientId] + if (conv) { + updateConversation(clientId, { + messages: conv.messages.slice(0, e.payload.fromMessageIndex), + status: 'active', + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:error-changed', + (e) => { + const clientId = e.payload.clientId + if (state.conversations[clientId] && e.payload.error) { + updateConversation(clientId, { status: 'error' }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:assistant-message-updated', + (e) => { + const clientId = e.payload.clientId + const messageId = e.payload.messageId + const content = e.payload.content + + if (!state.conversations[clientId]) return + + const conv = state.conversations[clientId] + const lastMessage = conv.messages[conv.messages.length - 1] + + if ( + lastMessage && + lastMessage.role === 'assistant' && + lastMessage.id === messageId + ) { + updateMessage(clientId, conv.messages.length - 1, { + content, + model: conv.model, + }) + } else { + addMessage(clientId, { + id: messageId, + role: 'assistant', + content: content, + timestamp: e.payload.timestamp, + model: conv.model, + chunks: [], + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:tool-call-updated', + (e) => { + const { + clientId, + messageId, + toolCallId, + toolName, + state: toolCallState, + arguments: args, + } = e.payload as { + clientId: string + messageId: string + toolCallId: string + toolName: string + state: string + arguments: unknown + timestamp: number + } + + if (!state.conversations[clientId]) return + + const conv = state.conversations[clientId] + const messageIndex = conv.messages.findIndex( + (m: Message) => m.id === messageId, + ) + if (messageIndex === -1) return + + const message = conv.messages[messageIndex] + if (!message) return + + const toolCalls = message.toolCalls || [] + const existingToolIndex = toolCalls.findIndex( + (t: ToolCall) => t.id === toolCallId, + ) + + const toolCall: ToolCall = { + id: toolCallId, + name: toolName, + arguments: JSON.stringify(args, null, 2), + state: toolCallState, + } + + if (existingToolIndex >= 0) { + updateToolCall(clientId, messageIndex, existingToolIndex, toolCall) + } else { + setToolCalls(clientId, messageIndex, [...toolCalls, toolCall]) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'client:approval-requested', + (e) => { + const { clientId, messageId, toolCallId, approvalId } = e.payload + + if (!state.conversations[clientId]) return + + const conv = state.conversations[clientId] + const messageIndex = conv.messages.findIndex( + (m) => m.id === messageId, + ) + if (messageIndex === -1) return + + const message = conv.messages[messageIndex] + if (!message?.toolCalls) return + + const toolCallIndex = message.toolCalls.findIndex( + (t) => t.id === toolCallId, + ) + if (toolCallIndex === -1) return + + updateToolCall(clientId, messageIndex, toolCallIndex, { + approvalRequired: true, + approvalId, + state: 'approval-requested', + }) + }, + { withEventTarget: false }, + ), + ) + + // ============= Tool Events ============= + + cleanupFns.push( + aiEventClient.on( + 'tool:result-added', + (e) => { + const { clientId, toolCallId, output, state: resultState } = e.payload + + if (!state.conversations[clientId]) return + + const conv = state.conversations[clientId] + + for ( + let messageIndex = conv.messages.length - 1; + messageIndex >= 0; + messageIndex-- + ) { + const message = conv.messages[messageIndex] + if (!message?.toolCalls) continue + + const toolCallIndex = message.toolCalls.findIndex( + (t: ToolCall) => t.id === toolCallId, + ) + if (toolCallIndex >= 0) { + updateToolCall(clientId, messageIndex, toolCallIndex, { + result: output, + state: resultState === 'output-error' ? 'error' : 'complete', + }) + return + } + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'tool:approval-responded', + (e) => { + const { clientId, toolCallId, approved } = e.payload + + if (!state.conversations[clientId]) return + + const conv = state.conversations[clientId] + + for ( + let messageIndex = conv.messages.length - 1; + messageIndex >= 0; + messageIndex-- + ) { + const message = conv.messages[messageIndex] + if (!message?.toolCalls) continue + + const toolCallIndex = message.toolCalls.findIndex( + (t: ToolCall) => t.id === toolCallId, + ) + if (toolCallIndex >= 0) { + updateToolCall(clientId, messageIndex, toolCallIndex, { + state: approved ? 'approved' : 'denied', + approvalRequired: false, + }) + return + } + } + }, + { withEventTarget: false }, + ), + ) + + // ============= Stream Events ============= + + cleanupFns.push( + aiEventClient.on( + 'stream:started', + (e) => { + const streamId = e.payload.streamId + const model = e.payload.model + const provider = e.payload.provider + const clientId = e.payload.clientId + + if (clientId && state.conversations[clientId]) { + streamToConversation.set(streamId, clientId) + updateConversation(clientId, { model, provider, status: 'active' }) + return + } + + const activeClient = Object.values(state.conversations).find( + (c) => c.type === 'client' && c.status === 'active' && !c.model, + ) + + if (activeClient) { + streamToConversation.set(streamId, activeClient.id) + updateConversation(activeClient.id, { model, provider }) + } else { + const existingServerConv = Object.values(state.conversations).find( + (c) => c.type === 'server' && c.model === model, + ) + + if (existingServerConv) { + streamToConversation.set(streamId, existingServerConv.id) + updateConversation(existingServerConv.id, { status: 'active' }) + } else { + const serverId = `server-${model}` + getOrCreateConversation(serverId, 'server', `${model} Server`) + streamToConversation.set(streamId, serverId) + updateConversation(serverId, { model, provider }) + } + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'stream:chunk:content', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + if (!conversationId) return + + const chunk: Chunk = { + id: `chunk-${Date.now()}-${Math.random()}`, + type: 'content', + messageId: e.payload.messageId, + content: e.payload.content, + delta: e.payload.delta, + timestamp: e.payload.timestamp, + chunkCount: 1, + } + + const conv = state.conversations[conversationId] + if (conv?.type === 'client') { + addChunkToMessage(conversationId, chunk) + } else { + addChunk(conversationId, chunk) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'stream:chunk:tool-call', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + if (!conversationId) return + + const chunk: Chunk = { + id: `chunk-${Date.now()}-${Math.random()}`, + type: 'tool_call', + messageId: e.payload.messageId, + toolCallId: e.payload.toolCallId, + toolName: e.payload.toolName, + timestamp: e.payload.timestamp, + chunkCount: 1, + } + + const conv = state.conversations[conversationId] + if (conv?.type === 'client') { + addChunkToMessage(conversationId, chunk) + } else { + addChunk(conversationId, chunk) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'stream:chunk:tool-result', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + if (!conversationId) return + + const chunk: Chunk = { + id: `chunk-${Date.now()}-${Math.random()}`, + type: 'tool_result', + messageId: e.payload.messageId, + toolCallId: e.payload.toolCallId, + content: e.payload.result, + timestamp: e.payload.timestamp, + chunkCount: 1, + } + + const conv = state.conversations[conversationId] + if (conv?.type === 'client') { + addChunkToMessage(conversationId, chunk) + } else { + addChunk(conversationId, chunk) + } + + // Also update the toolCalls array with the result + if (conv && e.payload.toolCallId) { + for (let i = conv.messages.length - 1; i >= 0; i--) { + const message = conv.messages[i] + if (!message?.toolCalls) continue + + const toolCallIndex = message.toolCalls.findIndex( + (t) => t.id === e.payload.toolCallId, + ) + if (toolCallIndex >= 0) { + updateToolCall(conversationId, i, toolCallIndex, { + result: e.payload.result, + state: 'complete', + }) + break + } + } + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'stream:chunk:thinking', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + if (!conversationId) return + + const chunk: Chunk = { + id: `chunk-${Date.now()}-${Math.random()}`, + type: 'thinking', + messageId: e.payload.messageId, + content: e.payload.content, + delta: e.payload.delta, + timestamp: e.payload.timestamp, + chunkCount: 1, + } + + const conv = state.conversations[conversationId] + if (conv?.type === 'client') { + addChunkToMessage(conversationId, chunk) + + if (e.payload.messageId) { + const messageIndex = conv.messages.findIndex( + (msg) => msg.id === e.payload.messageId, + ) + if (messageIndex !== -1) { + updateMessage(conversationId, messageIndex, { + thinkingContent: e.payload.content, + }) + } + } + } else { + addChunk(conversationId, chunk) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'stream:chunk:done', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + if (!conversationId) return + + const chunk: Chunk = { + id: `chunk-${Date.now()}-${Math.random()}`, + type: 'done', + messageId: e.payload.messageId, + finishReason: e.payload.finishReason || undefined, + timestamp: e.payload.timestamp, + chunkCount: 1, + } + + if (e.payload.usage) { + updateConversation(conversationId, { usage: e.payload.usage }) + updateMessageUsage( + conversationId, + e.payload.messageId, + e.payload.usage, + ) + } + + const conv = state.conversations[conversationId] + if (conv?.type === 'client') { + addChunkToMessage(conversationId, chunk) + } else { + addChunk(conversationId, chunk) + } + + // Mark as completed when we receive a done chunk with a terminal finish reason + const finishReason = e.payload.finishReason + if ( + finishReason === 'stop' || + finishReason === 'end_turn' || + finishReason === 'length' + ) { + updateConversation(conversationId, { + status: 'completed', + completedAt: e.payload.timestamp, + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'stream:chunk:error', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + if (!conversationId) return + + const chunk: Chunk = { + id: `chunk-${Date.now()}-${Math.random()}`, + type: 'error', + messageId: e.payload.messageId, + error: e.payload.error, + timestamp: e.payload.timestamp, + chunkCount: 1, + } + + const conv = state.conversations[conversationId] + if (conv?.type === 'client') { + addChunkToMessage(conversationId, chunk) + } else { + addChunk(conversationId, chunk) + } + + updateConversation(conversationId, { + status: 'error', + completedAt: e.payload.timestamp, + }) + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'stream:ended', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + if (!conversationId) return + + updateConversation(conversationId, { + status: 'completed', + completedAt: e.payload.timestamp, + }) + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'stream:approval-requested', + (e) => { + const { + streamId, + messageId, + toolCallId, + toolName, + input, + approvalId, + timestamp, + } = e.payload + + const conversationId = streamToConversation.get(streamId) + if (!conversationId) return + + const conv = state.conversations[conversationId] + if (!conv) return + + const chunk: Chunk = { + id: `chunk-${Date.now()}-${Math.random()}`, + type: 'approval', + messageId: messageId, + toolCallId, + toolName, + approvalId, + input, + timestamp, + chunkCount: 1, + } + + if (conv.type === 'client') { + addChunkToMessage(conversationId, chunk) + } else { + addChunk(conversationId, chunk) + } + + for (let i = conv.messages.length - 1; i >= 0; i--) { + const message = conv.messages[i] + if (!message) continue + + if (message.role === 'assistant' && message.toolCalls) { + const toolCallIndex = message.toolCalls.findIndex( + (t: ToolCall) => t.id === toolCallId, + ) + if (toolCallIndex >= 0) { + updateToolCall(conversationId, i, toolCallIndex, { + approvalRequired: true, + approvalId, + state: 'approval-requested', + }) + return + } + } + } + }, + { withEventTarget: false }, + ), + ) + + // ============= Processor Events ============= + + cleanupFns.push( + aiEventClient.on( + 'processor:text-updated', + (e) => { + const streamId = e.payload.streamId + + let conversationId = streamToConversation.get(streamId) + + if (!conversationId) { + const activeClients = Object.values(state.conversations) + .filter((c) => c.type === 'client' && c.status === 'active') + .sort((a, b) => b.startedAt - a.startedAt) + + if (activeClients.length > 0 && activeClients[0]) { + conversationId = activeClients[0].id + streamToConversation.set(streamId, conversationId) + } + } + + if (!conversationId) return + + const conv = state.conversations[conversationId] + if (!conv) return + + const lastMessage = conv.messages[conv.messages.length - 1] + if (lastMessage && lastMessage.role === 'assistant') { + updateMessage(conversationId, conv.messages.length - 1, { + content: e.payload.content, + }) + } else { + addMessage(conversationId, { + id: `msg-assistant-${Date.now()}`, + role: 'assistant', + content: e.payload.content, + timestamp: e.payload.timestamp, + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'processor:tool-call-state-changed', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + + if (!conversationId || !state.conversations[conversationId]) return + + const conv = state.conversations[conversationId] + const lastMessage = conv.messages[conv.messages.length - 1] + + if (lastMessage && lastMessage.role === 'assistant') { + const toolCalls = lastMessage.toolCalls || [] + const existingToolIndex = toolCalls.findIndex( + (t) => t.id === e.payload.toolCallId, + ) + + const toolCall: ToolCall = { + id: e.payload.toolCallId, + name: e.payload.toolName, + arguments: JSON.stringify(e.payload.arguments, null, 2), + state: e.payload.state, + } + + if (existingToolIndex >= 0) { + updateToolCall( + conversationId, + conv.messages.length - 1, + existingToolIndex, + toolCall, + ) + } else { + setToolCalls(conversationId, conv.messages.length - 1, [ + ...toolCalls, + toolCall, + ]) + } + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'processor:tool-result-state-changed', + (e) => { + const streamId = e.payload.streamId + const conversationId = streamToConversation.get(streamId) + + if (!conversationId || !state.conversations[conversationId]) return + + const conv = state.conversations[conversationId] + + for (let i = conv.messages.length - 1; i >= 0; i--) { + const message = conv.messages[i] + if (!message?.toolCalls) continue + + const toolCallIndex = message.toolCalls.findIndex( + (t) => t.id === e.payload.toolCallId, + ) + if (toolCallIndex >= 0) { + updateToolCall(conversationId, i, toolCallIndex, { + result: e.payload.content, + state: e.payload.error ? 'error' : e.payload.state, + }) + return + } + } + }, + { withEventTarget: false }, + ), + ) + + // ============= Chat Events (for usage tracking) ============= + + cleanupFns.push( + aiEventClient.on( + 'chat:started', + (e) => { + const { + requestId, + model, + clientId, + toolNames, + options, + providerOptions, + } = e.payload + + if (clientId && state.conversations[clientId]) { + requestToConversation.set(requestId, clientId) + updateConversation(clientId, { + model, + status: 'active', + toolNames, + options, + providerOptions, + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'chat:completed', + (e) => { + const { requestId, usage } = e.payload + + const conversationId = requestToConversation.get(requestId) + if (conversationId && state.conversations[conversationId] && usage) { + updateConversation(conversationId, { usage }) + updateMessageUsage(conversationId, undefined, usage) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'chat:iteration', + (e) => { + const { requestId, iterationNumber } = e.payload + + const conversationId = requestToConversation.get(requestId) + if (conversationId && state.conversations[conversationId]) { + updateConversation(conversationId, { + iterationCount: iterationNumber, + }) + } + }, + { withEventTarget: false }, + ), + ) + + cleanupFns.push( + aiEventClient.on( + 'usage:tokens', + (e) => { + const { requestId, usage, messageId } = e.payload + + const conversationId = requestToConversation.get(requestId) + if (conversationId && state.conversations[conversationId]) { + updateConversation(conversationId, { usage }) + updateMessageUsage(conversationId, messageId, usage) + } + }, + { withEventTarget: false }, + ), + ) + + // Cleanup all listeners on unmount + onCleanup(() => { + for (const cleanup of cleanupFns) { + cleanup() + } + streamToConversation.clear() + requestToConversation.clear() + }) + }) + + const contextValue: AIContextValue = { + state, + clearAllConversations, + selectConversation, + } + + return ( + + {props.children} + + ) +} diff --git a/packages/typescript/ai-devtools/src/store/ai-store.ts b/packages/typescript/ai-devtools/src/store/ai-store.ts index deddda286..29fdaf9c2 100644 --- a/packages/typescript/ai-devtools/src/store/ai-store.ts +++ b/packages/typescript/ai-devtools/src/store/ai-store.ts @@ -1,14 +1,13 @@ -// Re-export types from ai-context for backward compatibility -export type { - MessagePart, - ToolCall, - TokenUsage, - Message, - Chunk, - Conversation, - AIStoreState, -} from "./ai-context"; - -// Re-export the context and provider for components that need the full store -export { AIProvider, useAIStore } from "./ai-context"; - +// Re-export types from ai-context for backward compatibility +export type { + MessagePart, + ToolCall, + TokenUsage, + Message, + Chunk, + Conversation, + AIStoreState, +} from './ai-context' + +// Re-export the context and provider for components that need the full store +export { AIProvider, useAIStore } from './ai-context' diff --git a/packages/typescript/ai-devtools/src/styles/use-styles.ts b/packages/typescript/ai-devtools/src/styles/use-styles.ts index d92fcbee6..9a73fce27 100644 --- a/packages/typescript/ai-devtools/src/styles/use-styles.ts +++ b/packages/typescript/ai-devtools/src/styles/use-styles.ts @@ -304,8 +304,8 @@ const stylesFactory = (theme: 'light' | 'dark') => { background: ${t(colors.gray[100], colors.darkGray[800])}; border-radius: ${border.radius.lg}; box-shadow: ${tokens.shadow.md( - t(colors.gray[400] + alpha[80], colors.black + alpha[80]), - )}; + t(colors.gray[400] + alpha[80], colors.black + alpha[80]), + )}; padding: ${size[4]}; margin-bottom: ${size[4]}; border: 1px solid ${t(colors.gray[200], colors.darkGray[700])}; @@ -629,11 +629,19 @@ const stylesFactory = (theme: 'light' | 'dark') => { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); `, messageCardUser: css` - background: linear-gradient(135deg, oklch(0.25 0.04 260) 0%, oklch(0.22 0.03 260) 100%); + background: linear-gradient( + 135deg, + oklch(0.25 0.04 260) 0%, + oklch(0.22 0.03 260) 100% + ); border: 1.5px solid oklch(0.5 0.15 260); `, messageCardAssistant: css` - background: linear-gradient(135deg, oklch(0.25 0.04 142) 0%, oklch(0.22 0.03 142) 100%); + background: linear-gradient( + 135deg, + oklch(0.25 0.04 142) 0%, + oklch(0.22 0.03 142) 100% + ); border: 1.5px solid oklch(0.5 0.15 142); `, messageHeader: css` @@ -738,7 +746,10 @@ const stylesFactory = (theme: 'light' | 'dark') => { white-space: pre-wrap; word-break: break-word; color: oklch(0.85 0.02 260); - font-family: system-ui, -apple-system, sans-serif; + font-family: + system-ui, + -apple-system, + sans-serif; `, toolCallsContainer: css` margin-top: ${size[2]}; diff --git a/packages/typescript/ai-devtools/vite.config.ts b/packages/typescript/ai-devtools/vite.config.ts index c70016ffc..ef245a3aa 100644 --- a/packages/typescript/ai-devtools/vite.config.ts +++ b/packages/typescript/ai-devtools/vite.config.ts @@ -1,26 +1,26 @@ -import { defineConfig, mergeConfig } from 'vitest/config' -import { tanstackViteConfig } from '@tanstack/config/vite' -import solid from 'vite-plugin-solid' -import packageJson from './package.json' - -const config = defineConfig({ - plugins: [solid()], - test: { - name: packageJson.name, - dir: './tests', - watch: false, - environment: 'jsdom', - setupFiles: ['./tests/test-setup.ts'], - coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, - typecheck: { enabled: true }, - }, -}) - -export default mergeConfig( - config, - tanstackViteConfig({ - entry: ['./src/index.ts', './src/production.ts'], - srcDir: './src', - cjs: false, - }), -) +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import solid from 'vite-plugin-solid' +import packageJson from './package.json' + +const config = defineConfig({ + plugins: [solid()], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + setupFiles: ['./tests/test-setup.ts'], + coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, + typecheck: { enabled: true }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts', './src/production.ts'], + srcDir: './src', + cjs: false, + }), +) diff --git a/packages/typescript/ai-devtools/vitest.config.ts b/packages/typescript/ai-devtools/vitest.config.ts index 68ef5ebfb..57223ef4f 100644 --- a/packages/typescript/ai-devtools/vitest.config.ts +++ b/packages/typescript/ai-devtools/vitest.config.ts @@ -1,10 +1,9 @@ -import { defineConfig } from "vitest/config"; +import { defineConfig } from 'vitest/config' export default defineConfig({ test: { globals: true, - environment: "node", - include: ["tests/**/*.test.ts"], + environment: 'node', + include: ['tests/**/*.test.ts'], }, -}); - +}) diff --git a/packages/typescript/ai-fallback/README.md b/packages/typescript/ai-fallback/README.md deleted file mode 100644 index 883653482..000000000 --- a/packages/typescript/ai-fallback/README.md +++ /dev/null @@ -1,143 +0,0 @@ -# @tanstack/ai-fallback - -Automatic fallback wrapper for TanStack AI - try multiple adapters in sequence until one succeeds. - -## Installation - -```bash -npm install @tanstack/ai-fallback -``` - -## Quick Start - -```typescript -import { ai } from '@tanstack/ai'; -import { openai } from '@tanstack/ai-openai'; -import { anthropic } from '@tanstack/ai-anthropic'; -import { fallback, withModel } from '@tanstack/ai-fallback'; - -// Create AI instances with model and options pre-bound -const openAI = withModel(ai(openai()), { - model: 'gpt-4', - temperature: 0.7, -}); - -const anthropicAI = withModel(ai(anthropic()), { - model: 'claude-3-5-sonnet-20241022', - temperature: 0.8, -}); - -// Create fallback wrapper - tries openAI first, then anthropicAI -const aiWithFallback = fallback([openAI, anthropicAI]); - -// Use it - only need to pass messages now! -const stream = aiWithFallback.chat({ - messages: [{ role: 'user', content: 'Hello!' }], -}); - -for await (const chunk of stream) { - if (chunk.type === 'content') { - console.log(chunk.delta); - } -} -``` - -## API - -### `withModel(ai, options)` - -Creates a `BoundAI` instance with model and options pre-configured. - -**Parameters:** -- `ai`: An `AI` instance -- `options`: Model and options to bind (everything except `messages`/`input`) - -**Returns:** `BoundAI` instance - -### `fallback(instances, config?)` - -Creates a `FallbackAI` instance that tries multiple `BoundAI` instances in sequence. - -**Parameters:** -- `instances`: Array of `BoundAI` instances to try in order -- `config`: Optional configuration: - - `onError?: (adapterName: string, error: Error) => void` - Called when an adapter fails - - `stopOnError?: (error: Error) => boolean` - Return `true` to stop trying other adapters - -**Returns:** `FallbackAI` instance - -## Use Cases - -### Rate Limit Protection - -```typescript -const openAI = withModel(ai(openai()), { model: 'gpt-4' }); -const anthropicAI = withModel(ai(anthropic()), { model: 'claude-3-5-sonnet-20241022' }); - -const aiWithFallback = fallback([openAI, anthropicAI]); - -// If OpenAI hits rate limit, automatically uses Anthropic -const result = await aiWithFallback.chatCompletion({ - messages: [{ role: 'user', content: 'Hello!' }], -}); -``` - -### Cost Optimization - -```typescript -const localAI = withModel(ai(ollama()), { model: 'llama3' }); -const cloudAI = withModel(ai(openai()), { model: 'gpt-4' }); - -// Try cheap local option first, fall back to cloud if needed -const aiWithFallback = fallback([localAI, cloudAI]); -``` - -### Error Handling - -```typescript -const aiWithFallback = fallback([openAI, anthropicAI], { - onError: (adapterName, error) => { - console.error(`Adapter ${adapterName} failed:`, error); - // Send to monitoring service, etc. - }, - stopOnError: (error) => { - // Stop trying if it's a 401 (auth error) - won't work with other adapters - return error.message.includes('401'); - }, -}); -``` - -## Supported Methods - -All methods work the same as the regular `AI` class, but only require `messages`/`input`: - -- `chat({ messages, ... })` - Stream chat with automatic tool execution -- `chatCompletion({ messages, ... })` - Complete chat with optional structured output -- `embed({ input, ... })` - Generate embeddings -- `summarize({ text, ... })` - Summarize text -- `image({ prompt, ... })` - Generate images -- `audio({ file, ... })` - Transcribe audio -- `speak({ input, voice, ... })` - Generate speech -- `video({ prompt, ... })` - Generate videos - -## How It Works - -1. When you call a method, `FallbackAI` tries the first `BoundAI` instance -2. If it fails (throws an error), it automatically tries the next one -3. Continues until one succeeds or all fail -4. If all fail, throws a comprehensive error listing all failures - -## Streaming Behavior - -For streaming methods (`chat`), the fallback works as follows: - -- The stream must succeed before yielding chunks (can't retry mid-stream) -- If an error occurs before the first chunk, it tries the next adapter -- Once streaming starts, errors are forwarded (no retry) - -This means fallback only happens before streaming begins, not during the stream. - -## License - -MIT - diff --git a/packages/typescript/ai-fallback/package.json b/packages/typescript/ai-fallback/package.json deleted file mode 100644 index 99f796290..000000000 --- a/packages/typescript/ai-fallback/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "@tanstack/ai-fallback", - "version": "0.1.0", - "description": "Fallback wrapper for TanStack AI - automatically try multiple adapters in sequence", - "author": "", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/TanStack/ai.git", - "directory": "packages/typescript/ai-fallback" - }, - "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - } - }, - "files": [ - "dist", - "src" - ], - "scripts": { - "build": "vite build", - "clean": "premove ./build ./dist", - "lint:fix": "eslint ./src --fix", - "test:build": "publint --strict", - "test:eslint": "eslint ./src", - "test:lib": "vitest", - "test:lib:dev": "pnpm test:lib --watch", - "test:types": "tsc" - }, - "keywords": [ - "ai", - "fallback", - "tanstack", - "adapter", - "retry" - ], - "dependencies": { - "@tanstack/ai": "workspace:*" - }, - "devDependencies": {}, - "peerDependencies": { - "@tanstack/ai": "workspace:*" - } -} diff --git a/packages/typescript/ai-fallback/src/bound-ai.ts b/packages/typescript/ai-fallback/src/bound-ai.ts deleted file mode 100644 index 116f00b46..000000000 --- a/packages/typescript/ai-fallback/src/bound-ai.ts +++ /dev/null @@ -1,235 +0,0 @@ -import type { - AIAdapter, - ChatCompletionOptions, - StreamChunk, - SummarizationOptions, - SummarizationResult, - EmbeddingOptions, - EmbeddingResult, - ImageGenerationOptions, - ImageGenerationResult, - AudioTranscriptionOptions, - AudioTranscriptionResult, - TextToSpeechOptions, - TextToSpeechResult, - VideoGenerationOptions, - VideoGenerationResult, - Tool, - ResponseFormat, -} from "@tanstack/ai"; -import type { BoundOptions, ChatCompletionReturnType, AI } from "./types"; - -type ExtractChatProviderOptions = T extends AIAdapter< - any, - any, - any, - any, - any, - infer P, - any, - any, - any, - any -> - ? P - : Record; - -type ExtractImageProviderOptions = T extends AIAdapter< - any, - any, - any, - any, - any, - any, - infer P, - any, - any, - any -> - ? P - : Record; - -type ExtractAudioProviderOptions = T extends AIAdapter< - any, - any, - any, - any, - any, - any, - any, - any, - infer P, - any -> - ? P - : Record; - -type ExtractVideoProviderOptions = T extends AIAdapter< - any, - any, - any, - any, - any, - any, - any, - any, - any, - infer P -> - ? P - : Record; - -/** - * BoundAI - Wraps an AI instance with pre-bound model and options - * - * This allows you to create AI instances with model and options already configured, - * so you only need to pass messages/input at call time. - */ -export class BoundAI< - TAdapter extends AIAdapter -> { - private ai: AI; - private boundOptions: BoundOptions; - - constructor(ai: AI, boundOptions: BoundOptions) { - this.ai = ai; - this.boundOptions = boundOptions; - } - - /** - * Get the adapter name for logging/debugging - */ - get adapterName(): string { - // Access private adapter field via type assertion - // This is safe since we're just reading the name property - return ((this.ai as any).adapter as TAdapter).name || "unknown"; - } - - /** - * Stream a chat conversation with automatic tool execution - */ - async *chat( - options: Omit & { - messages: ChatCompletionOptions["messages"]; - tools?: ReadonlyArray; - systemPrompts?: string[]; - providerOptions?: ExtractChatProviderOptions; - } - ): AsyncIterable { - yield* this.ai.chat({ - ...this.boundOptions, - ...options, - } as any); - } - - /** - * Complete a chat conversation with optional structured output - */ - async chatCompletion< - TOptions extends { - output?: ResponseFormat; - providerOptions?: ExtractChatProviderOptions; - } - >( - options: Omit & { - messages: ChatCompletionOptions["messages"]; - tools?: ReadonlyArray; - systemPrompts?: string[]; - } & TOptions - ): Promise> { - return this.ai.chatCompletion({ - ...this.boundOptions, - ...options, - } as any) as Promise>; - } - - /** - * Summarize text - */ - async summarize( - options: Omit & { - text: string; - } - ): Promise { - return this.ai.summarize({ - ...this.boundOptions, - ...options, - } as any); - } - - /** - * Generate embeddings - */ - async embed( - options: Omit & { - input: string | string[]; - } - ): Promise { - return this.ai.embed({ - ...this.boundOptions, - ...options, - } as any); - } - - /** - * Generate an image - */ - async image( - options: Omit & { - prompt: string; - providerOptions?: ExtractImageProviderOptions; - } - ): Promise { - return this.ai.image({ - ...this.boundOptions, - ...options, - } as any); - } - - /** - * Transcribe audio - */ - async audio( - options: Omit & { - file: Blob | Buffer; - providerOptions?: ExtractAudioProviderOptions; - } - ): Promise { - return this.ai.audio({ - ...this.boundOptions, - ...options, - } as any); - } - - /** - * Generate speech from text - */ - async speak( - options: Omit & { - input: string; - voice: string; - providerOptions?: ExtractChatProviderOptions; - } - ): Promise { - return this.ai.speak({ - ...this.boundOptions, - ...options, - } as any); - } - - /** - * Generate a video - */ - async video( - options: Omit & { - prompt: string; - providerOptions?: ExtractVideoProviderOptions; - } - ): Promise { - return this.ai.video({ - ...this.boundOptions, - ...options, - } as any); - } -} - diff --git a/packages/typescript/ai-fallback/src/fallback-ai.ts b/packages/typescript/ai-fallback/src/fallback-ai.ts deleted file mode 100644 index f992dad6c..000000000 --- a/packages/typescript/ai-fallback/src/fallback-ai.ts +++ /dev/null @@ -1,263 +0,0 @@ -import type { - ChatCompletionOptions, - StreamChunk, - SummarizationOptions, - SummarizationResult, - EmbeddingOptions, - EmbeddingResult, - ImageGenerationOptions, - ImageGenerationResult, - AudioTranscriptionOptions, - AudioTranscriptionResult, - TextToSpeechOptions, - TextToSpeechResult, - VideoGenerationOptions, - VideoGenerationResult, - Tool, - ResponseFormat, -} from "@tanstack/ai"; -import type { BoundAI } from "./bound-ai"; -import type { ChatCompletionReturnType, FallbackConfig } from "./types"; - -/** - * FallbackAI - Wraps multiple BoundAI instances and tries them in sequence - * - * When a method is called, it tries the first BoundAI instance. If it fails, - * it automatically tries the next one, and so on, until one succeeds or all fail. - */ -export class FallbackAI { - private instances: BoundAI[]; - private config: FallbackConfig; - - constructor(instances: BoundAI[], config: FallbackConfig = {}) { - if (instances.length === 0) { - throw new Error("At least one AI instance is required for fallback"); - } - this.instances = instances; - this.config = config; - } - - /** - * Try multiple adapters in order until one succeeds - */ - private async tryWithFallback( - operation: (instance: BoundAI) => Promise, - operationName: string - ): Promise { - const errors: Array<{ adapter: string; error: Error }> = []; - - for (const instance of this.instances) { - try { - return await operation(instance); - } catch (error: any) { - const err = error instanceof Error ? error : new Error(String(error)); - errors.push({ - adapter: instance.adapterName, - error: err, - }); - - // Call error handler if provided - if (this.config.onError) { - this.config.onError(instance.adapterName, err); - } - - // Check if we should stop trying - if (this.config.stopOnError && this.config.stopOnError(err)) { - throw err; - } - - // Log warning - console.warn( - `[AI Fallback] Adapter "${instance.adapterName}" failed for ${operationName}:`, - err.message - ); - } - } - - // All adapters failed, throw comprehensive error - const errorMessage = errors - .map((e) => ` - ${e.adapter}: ${e.error.message}`) - .join("\n"); - throw new Error( - `All adapters failed for ${operationName}:\n${errorMessage}` - ); - } - - /** - * Try multiple adapters in order until one succeeds (async generator version) - */ - private async *tryStreamWithFallback( - operation: (instance: BoundAI) => AsyncIterable, - operationName: string - ): AsyncIterable { - const errors: Array<{ adapter: string; error: Error }> = []; - - for (const instance of this.instances) { - try { - for await (const chunk of operation(instance)) { - yield chunk; - } - // If we got here, the stream completed successfully - return; - } catch (error: any) { - const err = error instanceof Error ? error : new Error(String(error)); - errors.push({ - adapter: instance.adapterName, - error: err, - }); - - // Call error handler if provided - if (this.config.onError) { - this.config.onError(instance.adapterName, err); - } - - // Check if we should stop trying - if (this.config.stopOnError && this.config.stopOnError(err)) { - throw err; - } - - // Log warning - console.warn( - `[AI Fallback] Adapter "${instance.adapterName}" failed for ${operationName}:`, - err.message - ); - } - } - - // All adapters failed - const errorMessage = errors - .map((e) => ` - ${e.adapter}: ${e.error.message}`) - .join("\n"); - throw new Error( - `All adapters failed for ${operationName}:\n${errorMessage}` - ); - } - - /** - * Stream a chat conversation with automatic tool execution - */ - async *chat( - options: Omit & { - messages: ChatCompletionOptions["messages"]; - tools?: ReadonlyArray; - systemPrompts?: string[]; - providerOptions?: Record; - } - ): AsyncIterable { - yield* this.tryStreamWithFallback( - (instance) => instance.chat(options), - "chat" - ); - } - - /** - * Complete a chat conversation with optional structured output - */ - async chatCompletion< - TOptions extends { - output?: ResponseFormat; - providerOptions?: Record; - } - >( - options: Omit & { - messages: ChatCompletionOptions["messages"]; - tools?: ReadonlyArray; - systemPrompts?: string[]; - } & TOptions - ): Promise> { - return this.tryWithFallback( - (instance) => instance.chatCompletion(options), - "chatCompletion" - ); - } - - /** - * Summarize text - */ - async summarize( - options: Omit & { - text: string; - } - ): Promise { - return this.tryWithFallback( - (instance) => instance.summarize(options), - "summarize" - ); - } - - /** - * Generate embeddings - */ - async embed( - options: Omit & { - input: string | string[]; - } - ): Promise { - return this.tryWithFallback( - (instance) => instance.embed(options), - "embed" - ); - } - - /** - * Generate an image - */ - async image( - options: Omit & { - prompt: string; - providerOptions?: Record; - } - ): Promise { - return this.tryWithFallback( - (instance) => instance.image(options), - "image" - ); - } - - /** - * Transcribe audio - */ - async audio( - options: Omit & { - file: Blob | Buffer; - providerOptions?: Record; - } - ): Promise { - return this.tryWithFallback( - (instance) => instance.audio(options), - "audio" - ); - } - - /** - * Generate speech from text - */ - async speak( - options: Omit & { - input: string; - voice: string; - providerOptions?: Record; - } - ): Promise { - return this.tryWithFallback( - (instance) => instance.speak(options), - "speak" - ); - } - - /** - * Generate a video - */ - async video( - options: Omit & { - prompt: string; - providerOptions?: Record; - } - ): Promise { - return this.tryWithFallback( - (instance) => instance.video(options), - "video" - ); - } -} - diff --git a/packages/typescript/ai-fallback/src/index.ts b/packages/typescript/ai-fallback/src/index.ts deleted file mode 100644 index 6fd74cda1..000000000 --- a/packages/typescript/ai-fallback/src/index.ts +++ /dev/null @@ -1,107 +0,0 @@ -import type { AIAdapter, ChatCompletionOptions, Tool } from "@tanstack/ai"; -import { BoundAI } from "./bound-ai"; -import { FallbackAI } from "./fallback-ai"; -import type { BoundOptions, FallbackConfig, AI } from "./types"; - -// Extract types from adapter -type ExtractModels = T extends AIAdapter< - infer M, - any, - any, - any, - any, - any, - any, - any, - any, - any -> - ? M[number] - : string; - -type ExtractChatProviderOptions = T extends AIAdapter< - any, - any, - any, - any, - any, - infer P, - any, - any, - any, - any -> - ? P - : Record; - -/** - * Create a BoundAI instance that wraps an AI instance with pre-bound model and options - * - * @param ai - The AI instance to wrap - * @param options - Model and options to bind (everything except messages/input) - * @returns A BoundAI instance with model and options pre-configured - * - * @example - * ```typescript - * import { ai } from '@tanstack/ai'; - * import { openai } from '@tanstack/ai-openai'; - * import { withModel } from '@tanstack/ai-fallback'; - * - * const openAI = withModel(ai(openai()), { - * model: 'gpt-4', - * temperature: 0.7, - * }); - * - * // Now you can call chat without specifying model - * const stream = openAI.chat({ messages: [...] }); - * ``` - */ -export function withModel< - TAdapter extends AIAdapter ->( - aiInstance: AI, - options: Omit & { - model: ExtractModels; - providerOptions?: ExtractChatProviderOptions; - tools?: ReadonlyArray; - systemPrompts?: string[]; - } -): BoundAI { - return new BoundAI(aiInstance, options as BoundOptions); -} - -/** - * Create a FallbackAI instance that tries multiple BoundAI instances in sequence - * - * @param instances - Array of BoundAI instances to try in order - * @param config - Optional fallback configuration - * @returns A FallbackAI instance that tries each adapter until one succeeds - * - * @example - * ```typescript - * import { ai } from '@tanstack/ai'; - * import { openai } from '@tanstack/ai-openai'; - * import { anthropic } from '@tanstack/ai-anthropic'; - * import { fallback, withModel } from '@tanstack/ai-fallback'; - * - * const openAI = withModel(ai(openai()), { model: 'gpt-4' }); - * const anthropicAI = withModel(ai(anthropic()), { model: 'claude-3-5-sonnet-20241022' }); - * - * const aiWithFallback = fallback([openAI, anthropicAI]); - * - * // Tries openAI first, then anthropicAI if it fails - * const stream = aiWithFallback.chat({ messages: [...] }); - * ``` - */ -export function fallback( - instances: BoundAI[], - config?: FallbackConfig -): FallbackAI { - return new FallbackAI(instances, config); -} - -// Re-export types -export type { BoundAI } from "./bound-ai"; -export type { FallbackAI } from "./fallback-ai"; -export type { BoundOptions, BoundChatOptions, FallbackConfig, ChatCompletionReturnType } from "./types"; - diff --git a/packages/typescript/ai-fallback/src/types.ts b/packages/typescript/ai-fallback/src/types.ts deleted file mode 100644 index 2dba6d893..000000000 --- a/packages/typescript/ai-fallback/src/types.ts +++ /dev/null @@ -1,76 +0,0 @@ -import type { ai } from "@tanstack/ai"; -import type { - AIAdapter, - ChatCompletionOptions, - ResponseFormat, - Tool, - ChatCompletionResult, -} from "@tanstack/ai"; - -// Extract AI type from the ai function -export type AI = AIAdapter> = ReturnType>; - -// Extract adapter type from AI instance -export type ExtractAdapter = T extends AI ? A : never; - -// Extract model types from adapter -type ExtractModels = T extends AIAdapter< - infer M, - any, - any, - any, - any, - any, - any, - any, - any, - any -> - ? M[number] - : string; - -type ExtractChatProviderOptions = T extends AIAdapter< - any, - any, - any, - any, - any, - infer P, - any, - any, - any, - any -> - ? P - : Record; - -// Bound options type - all chat options except messages and model -export type BoundChatOptions> = Omit< - ChatCompletionOptions, - "model" | "messages" | "providerOptions" | "responseFormat" -> & { - model: ExtractModels; - providerOptions?: ExtractChatProviderOptions; - tools?: ReadonlyArray; - systemPrompts?: string[]; -}; - -// Options that can be bound (excludes messages/input) -export type BoundOptions> = Omit< - BoundChatOptions, - "messages" ->; - -// Helper type for chatCompletion return type -export type ChatCompletionReturnType< - TOptions extends { output?: ResponseFormat } -> = TOptions["output"] extends ResponseFormat - ? ChatCompletionResult - : ChatCompletionResult; - -// Fallback configuration -export interface FallbackConfig { - onError?: (adapterName: string, error: Error) => void; - stopOnError?: (error: Error) => boolean; -} - diff --git a/packages/typescript/ai-fallback/tests/fallback.test.ts b/packages/typescript/ai-fallback/tests/fallback.test.ts deleted file mode 100644 index 50034826b..000000000 --- a/packages/typescript/ai-fallback/tests/fallback.test.ts +++ /dev/null @@ -1,459 +0,0 @@ -import { describe, it, expect, vi, beforeEach } from "vitest"; -import { ai } from "@tanstack/ai"; -import { BaseAdapter } from "@tanstack/ai"; -import type { - ChatCompletionOptions, - ChatCompletionResult, - StreamChunk, - SummarizationOptions, - SummarizationResult, - EmbeddingOptions, - EmbeddingResult, -} from "@tanstack/ai"; -import { fallback, withModel } from "../src/index"; - -// Mock adapter that can be configured to succeed or fail -class MockAdapter extends BaseAdapter< - readonly ["test-model"], - readonly [], - readonly [], - readonly [], - readonly [] -> { - name: string; - models = ["test-model"] as const; - private shouldFail: boolean; - private errorMessage: string; - private succeedWith: any; - - constructor( - name: string, - shouldFail: boolean = false, - errorMessage: string = "Adapter failed", - succeedWith?: any - ) { - super(); - this.name = name; - this.shouldFail = shouldFail; - this.errorMessage = errorMessage; - this.succeedWith = succeedWith || { - id: `${name}-123`, - model: "test-model", - content: `Success from ${name}`, - usage: { - promptTokens: 10, - completionTokens: 20, - totalTokens: 30, - }, - }; - } - - async *chatStream( - _options: ChatCompletionOptions - ): AsyncIterable { - if (this.shouldFail) { - throw new Error(this.errorMessage); - } - const id = `${this.name}-123`; - const timestamp = Date.now(); - yield { - type: "content", - id, - model: "test-model", - timestamp, - delta: "Hello", - content: "Hello", - role: "assistant", - }; - yield { - type: "content", - id, - model: "test-model", - timestamp, - delta: " World", - content: "Hello World", - role: "assistant", - }; - yield { - type: "done", - id, - model: "test-model", - timestamp, - finishReason: "stop", - usage: { - promptTokens: 10, - completionTokens: 20, - totalTokens: 30, - }, - }; - } - - async generateText(_options: any): Promise { - if (this.shouldFail) { - throw new Error(this.errorMessage); - } - return { text: `Text from ${this.name}` }; - } - - async *generateTextStream(_options: any): AsyncIterable { - if (this.shouldFail) { - throw new Error(this.errorMessage); - } - yield "text"; - yield " chunk"; - } - - async summarize(options: SummarizationOptions): Promise { - if (this.shouldFail) { - throw new Error(this.errorMessage); - } - return { - summary: `Summary from ${this.name}`, - id: `${this.name}-123`, - model: options.model, - usage: { - promptTokens: 10, - completionTokens: 20, - totalTokens: 30, - }, - }; - } - - async createEmbeddings(options: EmbeddingOptions): Promise { - if (this.shouldFail) { - throw new Error(this.errorMessage); - } - return { - embeddings: [[0.1, 0.2, 0.3]], - id: `${this.name}-123`, - model: options.model, - usage: { - promptTokens: 10, - completionTokens: 0, - totalTokens: 10, - }, - }; - } -} - -describe("ai-fallback", () => { - beforeEach(() => { - vi.clearAllMocks(); - vi.spyOn(console, "warn").mockImplementation(() => {}); - }); - - describe("withModel", () => { - it("should create a BoundAI instance", () => { - const adapter = new MockAdapter("test-adapter"); - const aiInstance = ai(adapter); - const bound = withModel(aiInstance, { - model: "test-model", - temperature: 0.7, - }); - - expect(bound).toBeDefined(); - expect(bound.adapterName).toBe("test-adapter"); - }); - }); - - describe("fallback - chatCompletion", () => { - it("should use first adapter when it succeeds", async () => { - const adapter1 = new MockAdapter("adapter1", false); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - const result = await fallbackAI.chatCompletion({ - messages: [{ role: "user", content: "Hello" }], - }); - - expect(result.content).toBe("Success from adapter1"); - expect(console.warn).not.toHaveBeenCalled(); - }); - - it("should fallback to second adapter when first fails", async () => { - const adapter1 = new MockAdapter("adapter1", true, "Rate limit exceeded"); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - const result = await fallbackAI.chatCompletion({ - messages: [{ role: "user", content: "Hello" }], - }); - - expect(result.content).toBe("Success from adapter2"); - expect(console.warn).toHaveBeenCalledWith( - expect.stringContaining('Adapter "adapter1" failed'), - "Rate limit exceeded" - ); - }); - - it("should throw comprehensive error when all adapters fail", async () => { - const adapter1 = new MockAdapter("adapter1", true, "Rate limit exceeded"); - const adapter2 = new MockAdapter("adapter2", true, "Service unavailable"); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - await expect( - fallbackAI.chatCompletion({ - messages: [{ role: "user", content: "Hello" }], - }) - ).rejects.toThrow("All adapters failed for chatCompletion"); - - await expect( - fallbackAI.chatCompletion({ - messages: [{ role: "user", content: "Hello" }], - }) - ).rejects.toThrow(/adapter1: Rate limit exceeded/); - - await expect( - fallbackAI.chatCompletion({ - messages: [{ role: "user", content: "Hello" }], - }) - ).rejects.toThrow(/adapter2: Service unavailable/); - }); - - it("should call onError callback when adapter fails", async () => { - const adapter1 = new MockAdapter("adapter1", true, "Rate limit exceeded"); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const onError = vi.fn(); - const fallbackAI = fallback([bound1, bound2], { onError }); - - await fallbackAI.chatCompletion({ - messages: [{ role: "user", content: "Hello" }], - }); - - expect(onError).toHaveBeenCalledWith("adapter1", expect.any(Error)); - expect(onError).toHaveBeenCalledTimes(1); - }); - - it("should stop trying when stopOnError returns true", async () => { - const adapter1 = new MockAdapter("adapter1", true, "401 Unauthorized"); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const stopOnError = (error: Error) => error.message.includes("401"); - const fallbackAI = fallback([bound1, bound2], { stopOnError }); - - await expect( - fallbackAI.chatCompletion({ - messages: [{ role: "user", content: "Hello" }], - }) - ).rejects.toThrow("401 Unauthorized"); - - // When stopOnError returns true, we throw immediately without logging warning - // Should not have tried adapter2 (no warnings at all when stopping early) - expect(console.warn).not.toHaveBeenCalled(); - }); - }); - - describe("fallback - chat (streaming)", () => { - it("should use first adapter when it succeeds", async () => { - const adapter1 = new MockAdapter("adapter1", false); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - const chunks: StreamChunk[] = []; - for await (const chunk of fallbackAI.chat({ - messages: [{ role: "user", content: "Hello" }], - })) { - chunks.push(chunk); - } - - expect(chunks.length).toBeGreaterThan(0); - expect(chunks[0].model).toBe("test-model"); - expect(console.warn).not.toHaveBeenCalled(); - }); - - it("should fallback to second adapter when first fails before streaming", async () => { - const adapter1 = new MockAdapter("adapter1", true, "Connection error"); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - const chunks: StreamChunk[] = []; - for await (const chunk of fallbackAI.chat({ - messages: [{ role: "user", content: "Hello" }], - })) { - chunks.push(chunk); - } - - expect(chunks.length).toBeGreaterThan(0); - expect(chunks[0].model).toBe("test-model"); - expect(console.warn).toHaveBeenCalledWith( - expect.stringContaining('Adapter "adapter1" failed'), - "Connection error" - ); - }); - - it("should throw when all adapters fail", async () => { - const adapter1 = new MockAdapter("adapter1", true, "Error 1"); - const adapter2 = new MockAdapter("adapter2", true, "Error 2"); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - const chunks: StreamChunk[] = []; - let error: Error | null = null; - - try { - for await (const chunk of fallbackAI.chat({ - messages: [{ role: "user", content: "Hello" }], - })) { - chunks.push(chunk); - } - } catch (e) { - error = e as Error; - } - - expect(error).toBeTruthy(); - expect(error!.message).toContain("All adapters failed for chat"); - expect(error!.message).toContain("adapter1: Error 1"); - expect(error!.message).toContain("adapter2: Error 2"); - }); - }); - - describe("fallback - embed", () => { - it("should use first adapter when it succeeds", async () => { - const adapter1 = new MockAdapter("adapter1", false); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - const result = await fallbackAI.embed({ - input: "test text", - }); - - expect(result.embeddings).toBeDefined(); - expect(result.model).toBe("test-model"); - expect(console.warn).not.toHaveBeenCalled(); - }); - - it("should fallback to second adapter when first fails", async () => { - const adapter1 = new MockAdapter("adapter1", true, "Embedding error"); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - const result = await fallbackAI.embed({ - input: "test text", - }); - - expect(result.embeddings).toBeDefined(); - expect(console.warn).toHaveBeenCalledWith( - expect.stringContaining('Adapter "adapter1" failed'), - "Embedding error" - ); - }); - }); - - describe("fallback - summarize", () => { - it("should fallback to second adapter when first fails", async () => { - const adapter1 = new MockAdapter("adapter1", true, "Summarization error"); - const adapter2 = new MockAdapter("adapter2", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2]); - - const result = await fallbackAI.summarize({ - text: "Long text to summarize", - }); - - expect(result.summary).toBe("Summary from adapter2"); - expect(console.warn).toHaveBeenCalledWith( - expect.stringContaining('Adapter "adapter1" failed'), - "Summarization error" - ); - }); - }); - - describe("fallback - multiple adapters", () => { - it("should try all adapters in order until one succeeds", async () => { - const adapter1 = new MockAdapter("adapter1", true, "Error 1"); - const adapter2 = new MockAdapter("adapter2", true, "Error 2"); - const adapter3 = new MockAdapter("adapter3", false); - - const ai1 = ai(adapter1); - const ai2 = ai(adapter2); - const ai3 = ai(adapter3); - - const bound1 = withModel(ai1, { model: "test-model" }); - const bound2 = withModel(ai2, { model: "test-model" }); - const bound3 = withModel(ai3, { model: "test-model" }); - - const fallbackAI = fallback([bound1, bound2, bound3]); - - const result = await fallbackAI.chatCompletion({ - messages: [{ role: "user", content: "Hello" }], - }); - - expect(result.content).toBe("Success from adapter3"); - expect(console.warn).toHaveBeenCalledTimes(2); - }); - }); -}); diff --git a/packages/typescript/ai-fallback/tsconfig.json b/packages/typescript/ai-fallback/tsconfig.json deleted file mode 100644 index 204ca8d3f..000000000 --- a/packages/typescript/ai-fallback/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "src" - }, - "include": ["src/**/*.ts", "src/**/*.tsx"], - "exclude": ["node_modules", "dist", "**/*.config.ts"], - "references": [{ "path": "../ai" }] -} diff --git a/packages/typescript/ai-fallback/tsdown.config.ts b/packages/typescript/ai-fallback/tsdown.config.ts deleted file mode 100644 index 01597a963..000000000 --- a/packages/typescript/ai-fallback/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from "tsdown"; - -export default defineConfig({ - entry: ["./src/index.ts"], - format: ["esm"], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, -}); - diff --git a/packages/typescript/ai-fallback/vitest.config.ts b/packages/typescript/ai-fallback/vitest.config.ts deleted file mode 100644 index 4583b2da7..000000000 --- a/packages/typescript/ai-fallback/vitest.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from "vitest/config"; -import { resolve } from "path"; -import { fileURLToPath } from "url"; - -const __dirname = fileURLToPath(new URL(".", import.meta.url)); - -export default defineConfig({ - test: { - globals: true, - environment: "node", - }, - resolve: { - alias: { - "@tanstack/ai": resolve(__dirname, "../ai/src/index.ts"), - }, - }, -}); - diff --git a/packages/typescript/ai-gemini/package.json b/packages/typescript/ai-gemini/package.json index a8173dff6..9eab3e267 100644 --- a/packages/typescript/ai-gemini/package.json +++ b/packages/typescript/ai-gemini/package.json @@ -10,12 +10,12 @@ "directory": "packages/typescript/ai-gemini" }, "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" } }, "files": [ @@ -43,7 +43,6 @@ "@google/genai": "^1.30.0", "@tanstack/ai": "workspace:*" }, - "devDependencies": {}, "peerDependencies": { "@tanstack/ai": "workspace:*" } diff --git a/packages/typescript/ai-gemini/src/gemini-adapter.ts b/packages/typescript/ai-gemini/src/gemini-adapter.ts index 123e76234..794deaa2f 100644 --- a/packages/typescript/ai-gemini/src/gemini-adapter.ts +++ b/packages/typescript/ai-gemini/src/gemini-adapter.ts @@ -1,36 +1,42 @@ -import type { GenerateContentParameters } from "@google/genai"; -import { GoogleGenAI } from "@google/genai"; -import { - BaseAdapter, - type AIAdapterConfig, - type ChatCompletionOptions, - type ChatCompletionResult, - type SummarizationOptions, - type SummarizationResult, - type EmbeddingOptions, - type EmbeddingResult, - type ModelMessage, - type StreamChunk, -} from "@tanstack/ai"; -import { - GEMINI_MODELS, - GEMINI_EMBEDDING_MODELS, - type GeminiChatModelProviderOptionsByName, -} from "./model-meta"; -import { ExternalTextProviderOptions } from "./text/text-provider-options"; -import { convertToolsToProviderFormat } from "./tools/tool-converter"; +import { GoogleGenAI } from '@google/genai' +import { BaseAdapter } from '@tanstack/ai' +import { GEMINI_EMBEDDING_MODELS, GEMINI_MODELS } from './model-meta' +import { convertToolsToProviderFormat } from './tools/tool-converter' +import type { + AIAdapterConfig, + ChatStreamOptionsUnion, + EmbeddingOptions, + EmbeddingResult, + ModelMessage, + StreamChunk, + SummarizationOptions, + SummarizationResult, +} from '@tanstack/ai' +import type { GeminiChatModelProviderOptionsByName } from './model-meta' +import type { ExternalTextProviderOptions } from './text/text-provider-options' +import type { GenerateContentParameters } from '@google/genai' export interface GeminiAdapterConfig extends AIAdapterConfig { - apiKey: string; + apiKey: string } -export type GeminiModel = (typeof GEMINI_MODELS)[number]; +export type GeminiModel = (typeof GEMINI_MODELS)[number] /** * Gemini-specific provider options * Based on Google Generative AI SDK * @see https://ai.google.dev/api/rest/v1/GenerationConfig */ -export type GeminiProviderOptions = ExternalTextProviderOptions; +export type GeminiProviderOptions = ExternalTextProviderOptions + +type ChatOptions = ChatStreamOptionsUnion< + BaseAdapter< + typeof GEMINI_MODELS, + typeof GEMINI_EMBEDDING_MODELS, + GeminiProviderOptions, + Record, + GeminiChatModelProviderOptionsByName + > +> export class GeminiAdapter extends BaseAdapter< typeof GEMINI_MODELS, @@ -39,423 +45,408 @@ export class GeminiAdapter extends BaseAdapter< Record, GeminiChatModelProviderOptionsByName > { - name = "gemini"; - models = GEMINI_MODELS; - embeddingModels = GEMINI_EMBEDDING_MODELS; - declare _modelProviderOptionsByName: GeminiChatModelProviderOptionsByName; - private client: GoogleGenAI; + name = 'gemini' + models = GEMINI_MODELS + embeddingModels = GEMINI_EMBEDDING_MODELS + declare _modelProviderOptionsByName: GeminiChatModelProviderOptionsByName + private client: GoogleGenAI constructor(config: GeminiAdapterConfig) { - super(config); + super(config) this.client = new GoogleGenAI({ apiKey: config.apiKey, - }); + }) } async *chatStream( - options: ChatCompletionOptions + options: ChatOptions, ): AsyncIterable { // Map common options to Gemini format - const mappedOptions = this.mapCommonOptionsToGemini(options); + const mappedOptions = this.mapCommonOptionsToGemini(options) - const result = await this.client.models.generateContentStream( - mappedOptions - ); + const result = await this.client.models.generateContentStream(mappedOptions) - yield* this.processStreamChunks(result, options.model); + yield* this.processStreamChunks(result, options.model) } async summarize(options: SummarizationOptions): Promise { - const prompt = this.buildSummarizationPrompt(options, options.text); + const prompt = this.buildSummarizationPrompt(options, options.text) // Use models API like chatCompletion const result = await this.client.models.generateContent({ - model: options.model || "gemini-pro", - contents: [{ role: "user", parts: [{ text: prompt }] }], + model: options.model, + contents: [{ role: 'user', parts: [{ text: prompt }] }], config: { temperature: 0.3, maxOutputTokens: options.maxLength || 500, }, - }); - - // Handle response structure (might have .response property or be direct) - let response: any; - if (result.response && typeof result.response.then === "function") { - response = await result.response; - } else if (result.candidates) { - response = result; - } else { - response = (result as any).response || result; - } + }) // Extract text from candidates or use .text() method - let summary = ""; - if (response.candidates?.[0]?.content?.parts) { - const parts = response.candidates[0].content.parts; + let summary = '' + if (result.candidates?.[0]?.content?.parts) { + const parts = result.candidates[0].content.parts for (const part of parts) { if (part.text) { - summary += part.text; + summary += part.text } } } - if (!summary && typeof response.text === "function") { - try { - summary = response.text() || ""; - } catch { - // If .text() fails, summary remains empty - } + if (!summary && typeof result.text === 'string') { + summary = result.text + } - const promptTokens = this.estimateTokens(prompt); - const completionTokens = this.estimateTokens(summary); + const promptTokens = this.estimateTokens(prompt) + const completionTokens = this.estimateTokens(summary) return { id: this.generateId(), - model: options.model || "gemini-pro", + model: options.model || 'gemini-pro', summary, usage: { promptTokens, completionTokens, totalTokens: promptTokens + completionTokens, }, - }; + } } async createEmbeddings(options: EmbeddingOptions): Promise { const inputs = Array.isArray(options.input) ? options.input - : [options.input]; + : [options.input] // According to docs: contents can be a string or array of strings // Response has embeddings (plural) array with values property const result = await this.client.models.embedContent({ model: options.model, contents: inputs, - }); + }) // Extract embeddings from result.embeddings array - const embeddings: number[][] = []; + const embeddings: Array> = [] if (result.embeddings && Array.isArray(result.embeddings)) { for (const embedding of result.embeddings) { if (embedding.values && Array.isArray(embedding.values)) { - embeddings.push(embedding.values); + embeddings.push(embedding.values) } else if (Array.isArray(embedding)) { - embeddings.push(embedding); + embeddings.push(embedding) } } } const promptTokens = inputs.reduce( (sum, input) => sum + this.estimateTokens(input), - 0 - ); + 0, + ) return { id: this.generateId(), - model: options.model || "gemini-embedding-001", + model: options.model || 'gemini-embedding-001', embeddings, usage: { promptTokens, totalTokens: promptTokens, }, - }; + } } private buildSummarizationPrompt( options: SummarizationOptions, - text: string + text: string, ): string { - let prompt = "You are a professional summarizer. "; + let prompt = 'You are a professional summarizer. ' switch (options.style) { - case "bullet-points": - prompt += "Provide a summary in bullet point format. "; - break; - case "paragraph": - prompt += "Provide a summary in paragraph format. "; - break; - case "concise": - prompt += "Provide a very concise summary in 1-2 sentences. "; - break; + case 'bullet-points': + prompt += 'Provide a summary in bullet point format. ' + break + case 'paragraph': + prompt += 'Provide a summary in paragraph format. ' + break + case 'concise': + prompt += 'Provide a very concise summary in 1-2 sentences. ' + break default: - prompt += "Provide a clear and concise summary. "; + prompt += 'Provide a clear and concise summary. ' } if (options.focus && options.focus.length > 0) { - prompt += `Focus on the following aspects: ${options.focus.join(", ")}. `; + prompt += `Focus on the following aspects: ${options.focus.join(', ')}. ` } - prompt += `\n\nText to summarize:\n${text}\n\nSummary:`; + prompt += `\n\nText to summarize:\n${text}\n\nSummary:` - return prompt; + return prompt } private estimateTokens(text: string): number { // Rough approximation: 1 token ≈ 4 characters - return Math.ceil(text.length / 4); + return Math.ceil(text.length / 4) } // TODO the proper type here is AsyncGenerator private async *processStreamChunks( result: AsyncIterable, - model: string + model: string, ): AsyncIterable { - const timestamp = Date.now(); - let accumulatedContent = ""; + const timestamp = Date.now() + let accumulatedContent = '' const toolCallMap = new Map< string, { name: string; args: string; index: number } - >(); - let nextToolIndex = 0; + >() + let nextToolIndex = 0 // Iterate over the stream result (it's already an AsyncGenerator) for await (const chunk of result) { // Check for errors in the chunk if (chunk.error) { - console.log("[GeminiAdapter] Error in chunk:", chunk.error); + console.log('[GeminiAdapter] Error in chunk:', chunk.error) yield { - type: "error", + type: 'error', id: this.generateId(), model, timestamp, error: { - message: chunk.error.message || "Unknown error", + message: chunk.error.message || 'Unknown error', code: chunk.error.code, }, - }; - return; + } + return } // Check if candidates array exists and has entries if (!chunk.candidates || chunk.candidates.length === 0) { // Skip empty chunks or check for finish reason in other places if (chunk.finishReason) { - const finishReason = chunk.finishReason as string; - let mappedFinishReason = finishReason; + const finishReason = chunk.finishReason as string + let mappedFinishReason = finishReason if ( - finishReason === "UNEXPECTED_TOOL_CALL" || - finishReason === "STOP" + finishReason === 'UNEXPECTED_TOOL_CALL' || + finishReason === 'STOP' ) { - mappedFinishReason = toolCallMap.size > 0 ? "tool_calls" : "stop"; + mappedFinishReason = toolCallMap.size > 0 ? 'tool_calls' : 'stop' } yield { - type: "done", + type: 'done', id: this.generateId(), model, timestamp, finishReason: mappedFinishReason as any, usage: chunk.usageMetadata ? { - promptTokens: chunk.usageMetadata.promptTokenCount ?? 0, - completionTokens: chunk.usageMetadata.thoughtsTokenCount ?? 0, - totalTokens: chunk.usageMetadata.totalTokenCount ?? 0, - } + promptTokens: chunk.usageMetadata.promptTokenCount ?? 0, + completionTokens: chunk.usageMetadata.thoughtsTokenCount ?? 0, + totalTokens: chunk.usageMetadata.totalTokenCount ?? 0, + } : undefined, - }; + } } - continue; + continue } // Extract content from candidates[0].content.parts // Parts can contain text or functionCall if (chunk.candidates?.[0]?.content?.parts) { - const parts = chunk.candidates[0].content.parts; + const parts = chunk.candidates[0].content.parts for (const part of parts) { // Handle text content if (part.text) { - accumulatedContent += part.text; + accumulatedContent += part.text yield { - type: "content", + type: 'content', id: this.generateId(), model, timestamp, delta: part.text, content: accumulatedContent, - role: "assistant", - }; + role: 'assistant', + } } // Handle function calls (tool calls) // Check both camelCase (SDK) and snake_case (direct API) formats - const functionCall = part.functionCall || part.function_call; + const functionCall = part.functionCall || part.function_call if (functionCall) { const toolCallId = - functionCall.name || `call_${Date.now()}_${nextToolIndex}`; + functionCall.name || `call_${Date.now()}_${nextToolIndex}` const functionArgs = - functionCall.args || functionCall.arguments || {}; + functionCall.args || functionCall.arguments || {} // Check if we've seen this tool call before (for streaming args) - let toolCallData = toolCallMap.get(toolCallId); + let toolCallData = toolCallMap.get(toolCallId) if (!toolCallData) { toolCallData = { - name: functionCall.name || "", + name: functionCall.name || '', args: - typeof functionArgs === "string" + typeof functionArgs === 'string' ? functionArgs : JSON.stringify(functionArgs || {}), index: nextToolIndex++, - }; - toolCallMap.set(toolCallId, toolCallData); + } + toolCallMap.set(toolCallId, toolCallData) } else { // Merge arguments if streaming if (functionArgs) { try { - const existingArgs = JSON.parse(toolCallData.args); + const existingArgs = JSON.parse(toolCallData.args) const newArgs = - typeof functionArgs === "string" + typeof functionArgs === 'string' ? JSON.parse(functionArgs) - : functionArgs; - const mergedArgs = { ...existingArgs, ...newArgs }; - toolCallData.args = JSON.stringify(mergedArgs); + : functionArgs + const mergedArgs = { ...existingArgs, ...newArgs } + toolCallData.args = JSON.stringify(mergedArgs) } catch { // If parsing fails, use new args toolCallData.args = - typeof functionArgs === "string" + typeof functionArgs === 'string' ? functionArgs - : JSON.stringify(functionArgs); + : JSON.stringify(functionArgs) } } } yield { - type: "tool_call", + type: 'tool_call', id: this.generateId(), model, timestamp, toolCall: { id: toolCallId, - type: "function", + type: 'function', function: { name: toolCallData.name, arguments: toolCallData.args, }, }, index: toolCallData.index, - }; + } } } } else if (chunk.data) { // Fallback to chunk.data if available - accumulatedContent += chunk.data; + accumulatedContent += chunk.data yield { - type: "content", + type: 'content', id: this.generateId(), model, timestamp, delta: chunk.data, content: accumulatedContent, - role: "assistant", - }; + role: 'assistant', + } } // Check for finish reason if (chunk.candidates?.[0]?.finishReason) { - const finishReason = chunk.candidates[0].finishReason as string; + const finishReason = chunk.candidates[0].finishReason as string // UNEXPECTED_TOOL_CALL means Gemini tried to call a function but it wasn't properly declared // This typically means there's an issue with the tool declaration format // We should map it to tool_calls to try to process it anyway - let mappedFinishReason = finishReason; - if (finishReason === "UNEXPECTED_TOOL_CALL") { + let mappedFinishReason = finishReason + if (finishReason === 'UNEXPECTED_TOOL_CALL') { // Try to extract function call from content.parts if available if (chunk.candidates[0].content?.parts) { for (const part of chunk.candidates[0].content.parts) { - const functionCall = part.functionCall || part.function_call; + const functionCall = part.functionCall || part.function_call if (functionCall) { // We found a function call - process it const toolCallId = - functionCall.name || `call_${Date.now()}_${nextToolIndex}`; + functionCall.name || `call_${Date.now()}_${nextToolIndex}` const functionArgs = - functionCall.args || functionCall.arguments || {}; + functionCall.args || functionCall.arguments || {} toolCallMap.set(toolCallId, { - name: functionCall.name || "", + name: functionCall.name || '', args: - typeof functionArgs === "string" + typeof functionArgs === 'string' ? functionArgs : JSON.stringify(functionArgs || {}), index: nextToolIndex++, - }); + }) yield { - type: "tool_call", + type: 'tool_call', id: this.generateId(), model, timestamp, toolCall: { id: toolCallId, - type: "function", + type: 'function', function: { - name: functionCall.name || "", + name: functionCall.name || '', arguments: - typeof functionArgs === "string" + typeof functionArgs === 'string' ? functionArgs : JSON.stringify(functionArgs || {}), }, }, index: nextToolIndex - 1, - }; + } } } } - mappedFinishReason = toolCallMap.size > 0 ? "tool_calls" : "stop"; - } else if (finishReason === "STOP") { - mappedFinishReason = toolCallMap.size > 0 ? "tool_calls" : "stop"; + mappedFinishReason = toolCallMap.size > 0 ? 'tool_calls' : 'stop' + } else if (finishReason === 'STOP') { + mappedFinishReason = toolCallMap.size > 0 ? 'tool_calls' : 'stop' } yield { - type: "done", + type: 'done', id: this.generateId(), model, timestamp, finishReason: mappedFinishReason as any, usage: chunk.usageMetadata ? { - promptTokens: chunk.usageMetadata.promptTokenCount ?? 0, - completionTokens: chunk.usageMetadata.thoughtsTokenCount ?? 0, - totalTokens: chunk.usageMetadata.totalTokenCount ?? 0, - } + promptTokens: chunk.usageMetadata.promptTokenCount ?? 0, + completionTokens: chunk.usageMetadata.thoughtsTokenCount ?? 0, + totalTokens: chunk.usageMetadata.totalTokenCount ?? 0, + } : undefined, - }; + } } } } - private formatMessages(messages: ModelMessage[]): Array<{ - role: "user" | "model"; + private formatMessages(messages: Array): Array<{ + role: 'user' | 'model' parts: Array<{ - text?: string; - functionCall?: { name: string; args: Record }; - functionResponse?: { name: string; response: Record }; - }>; + text?: string + functionCall?: { name: string; args: Record } + functionResponse?: { name: string; response: Record } + }> }> { return messages - .filter((m) => m.role !== "system") // Skip system messages + .filter((m) => m.role !== 'system') // Skip system messages .map((msg) => { - const role: "user" | "model" = - msg.role === "assistant" ? "model" : "user"; + const role: 'user' | 'model' = + msg.role === 'assistant' ? 'model' : 'user' const parts: Array<{ - text?: string; - functionCall?: { name: string; args: Record }; - functionResponse?: { name: string; response: Record }; - }> = []; + text?: string + functionCall?: { name: string; args: Record } + functionResponse?: { name: string; response: Record } + }> = [] // Add text content if present if (msg.content) { - parts.push({ text: msg.content }); + parts.push({ text: msg.content }) } // Handle tool calls (from assistant) - if (msg.role === "assistant" && msg.toolCalls?.length) { + if (msg.role === 'assistant' && msg.toolCalls?.length) { for (const toolCall of msg.toolCalls) { - let parsedArgs: Record = {}; + let parsedArgs: Record = {} try { parsedArgs = toolCall.function.arguments ? JSON.parse(toolCall.function.arguments) - : {}; + : {} } catch { - parsedArgs = toolCall.function.arguments as any; + parsedArgs = toolCall.function.arguments as any } parts.push({ @@ -463,27 +454,27 @@ export class GeminiAdapter extends BaseAdapter< name: toolCall.function.name, args: parsedArgs, }, - }); + }) } } // Handle tool results (from tool role) - if (msg.role === "tool" && msg.toolCallId) { + if (msg.role === 'tool' && msg.toolCallId) { parts.push({ functionResponse: { name: msg.toolCallId, // Gemini uses function name here response: { - content: msg.content || "", + content: msg.content || '', }, }, - }); + }) } return { role, - parts: parts.length > 0 ? parts : [{ text: "" }], - }; - }); + parts: parts.length > 0 ? parts : [{ text: '' }], + } + }) } /** @@ -491,9 +482,9 @@ export class GeminiAdapter extends BaseAdapter< * Handles translation of normalized options to Gemini's API format */ private mapCommonOptionsToGemini( - options: ChatCompletionOptions + options: ChatOptions, ) { - const providerOpts = options.providerOptions; + const providerOpts = options.providerOptions const requestOptions: GenerateContentParameters = { model: options.model, contents: this.formatMessages(options.messages), @@ -502,13 +493,13 @@ export class GeminiAdapter extends BaseAdapter< temperature: options.options?.temperature, topP: options.options?.topP, maxOutputTokens: options.options?.maxTokens, - systemInstruction: options.systemPrompts?.join("\n"), + systemInstruction: options.systemPrompts?.join('\n'), ...providerOpts?.generationConfig, tools: convertToolsToProviderFormat(options.tools), }, - }; + } - return requestOptions; + return requestOptions } } @@ -530,9 +521,9 @@ export class GeminiAdapter extends BaseAdapter< */ export function createGemini( apiKey: string, - config?: Omit + config?: Omit, ): GeminiAdapter { - return new GeminiAdapter({ apiKey, ...config }); + return new GeminiAdapter({ apiKey, ...config }) } /** @@ -553,21 +544,21 @@ export function createGemini( * ``` */ export function gemini( - config?: Omit + config?: Omit, ): GeminiAdapter { const env = - typeof globalThis !== "undefined" && (globalThis as any).window?.env + typeof globalThis !== 'undefined' && (globalThis as any).window?.env ? (globalThis as any).window.env - : typeof process !== "undefined" - ? process.env - : undefined; - const key = env?.GOOGLE_API_KEY || env?.GEMINI_API_KEY; + : typeof process !== 'undefined' + ? process.env + : undefined + const key = env?.GOOGLE_API_KEY || env?.GEMINI_API_KEY if (!key) { throw new Error( - "GOOGLE_API_KEY or GEMINI_API_KEY is required. Please set it in your environment variables or use createGemini(apiKey, config) instead." - ); + 'GOOGLE_API_KEY or GEMINI_API_KEY is required. Please set it in your environment variables or use createGemini(apiKey, config) instead.', + ) } - return createGemini(key, config); + return createGemini(key, config) } diff --git a/packages/typescript/ai-gemini/src/index.ts b/packages/typescript/ai-gemini/src/index.ts index 70aadec25..07d6392c1 100644 --- a/packages/typescript/ai-gemini/src/index.ts +++ b/packages/typescript/ai-gemini/src/index.ts @@ -1,4 +1,7 @@ -export { GeminiAdapter, createGemini, gemini } from "./gemini-adapter"; -export type { GeminiAdapterConfig } from "./gemini-adapter"; -export type { GeminiChatModelProviderOptionsByName } from "./model-meta"; -export type { GeminiStructuredOutputOptions, GeminiThinkingOptions } from "./text/text-provider-options"; +export { GeminiAdapter, createGemini, gemini } from './gemini-adapter' +export type { GeminiAdapterConfig } from './gemini-adapter' +export type { GeminiChatModelProviderOptionsByName } from './model-meta' +export type { + GeminiStructuredOutputOptions, + GeminiThinkingOptions, +} from './text/text-provider-options' diff --git a/packages/typescript/ai-gemini/src/model-meta.ts b/packages/typescript/ai-gemini/src/model-meta.ts index 954d6c7be..6be8f79b8 100644 --- a/packages/typescript/ai-gemini/src/model-meta.ts +++ b/packages/typescript/ai-gemini/src/model-meta.ts @@ -1,764 +1,869 @@ -import type { - GeminiToolConfigOptions, - GeminiSafetyOptions, - GeminiGenerationConfigOptions, - GeminiCachedContentOptions, - GeminiStructuredOutputOptions, - GeminiThinkingOptions, -} from "./text/text-provider-options"; - -interface ModelMeta { - name: string; - supports: { - input: ("text" | "image" | "audio" | "video" | "pdf")[]; - output: ("text" | "image" | "audio" | "video")[]; - capabilities?: ("audio_generation" | "batch_api" | "caching" | "code_execution" | "file_search" | "function_calling" | "grounding_with_gmaps" | "image_generation" | "live_api" | "search_grounding" | "structured_output" | "thinking" | "url_context")[] - }; - max_input_tokens?: number; - max_output_tokens?: number; - knowledge_cutoff?: string; - pricing?: { - input: { - normal: number; - cached?: number; - }; - output: { - normal: number; - }; - }; - /** - * Type-level description of which provider options this model supports. - */ - providerOptions?: TProviderOptions; -} - - -const GEMINI_3_PRO = { - name: "gemini-3-pro-preview", - max_input_tokens: 1_048_576, - max_output_tokens: 65_536, - knowledge_cutoff: "2025-01-01", - supports: { - input: ["text", "image", "audio", "video", "pdf"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "code_execution", - "file_search", - "function_calling", - "search_grounding", - "structured_output", - "thinking", - "url_context" - ] - }, - pricing: { - input: { - normal: 2.5, - }, - output: { - normal: 15 - } - } -} as const satisfies ModelMeta< - GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions -> - - -const GEMINI_2_5_PRO = { - name: "gemini-2.5-pro", - max_input_tokens: 1_048_576, - max_output_tokens: 65_536, - knowledge_cutoff: "2025-01-01", - supports: { - input: ["text", "image", "audio", "video", "pdf"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "code_execution", - "file_search", - "function_calling", - "grounding_with_gmaps", - "search_grounding", - "structured_output", - "thinking", - "url_context" - ] - }, - pricing: { - input: { - normal: 2.5, - }, - output: { - normal: 15 - } - } -} as const satisfies ModelMeta< - GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions -> - -const GEMINI_2_5_PRO_TTS = { - name: "gemini-2.5-pro-preview-tts", - max_input_tokens: 8_192, - max_output_tokens: 16_384, - knowledge_cutoff: "2025-05-01", - supports: { - input: ["text",], - output: ["audio"], - capabilities: [ - "audio_generation", - "file_search" - ] - }, - pricing: { - input: { - normal: 2.5, - }, - output: { - normal: 15 - } - } -} as const satisfies ModelMeta - -const GEMINI_2_5_FLASH = { - name: "gemini-2.5-flash", - max_input_tokens: 1_048_576, - max_output_tokens: 65_536, - knowledge_cutoff: "2025-01-01", - supports: { - input: ["text", "image", "audio", "video"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "code_execution", - "file_search", - "function_calling", - "grounding_with_gmaps", - "search_grounding", - "structured_output", - "thinking", - "url_context" - ] - }, - pricing: { - input: { - normal: 1, - }, - output: { - normal: 2.5 - } - } -} as const satisfies ModelMeta< - GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions -> - -const GEMINI_2_5_FLASH_PREVIEW = { - name: "gemini-2.5-flash-preview-09-2025", - max_input_tokens: 1_048_576, - max_output_tokens: 65_536, - knowledge_cutoff: "2025-01-01", - supports: { - input: ["text", "image", "audio", "video"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "code_execution", - "file_search", - "function_calling", - "search_grounding", - "structured_output", - "thinking", - "url_context" - ] - }, - pricing: { - input: { - normal: 1, - }, - output: { - normal: 2.5 - } - } -} as const satisfies ModelMeta< - GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions -> - - -const GEMINI_2_5_FLASH_IMAGE = { - name: "gemini-2.5-flash-image", - max_input_tokens: 1_048_576, - max_output_tokens: 65_536, - knowledge_cutoff: "2025-06-01", - supports: { - input: ["text", "image"], - output: ["text", "image"], - capabilities: [ - "batch_api", - "caching", - "file_search", - "image_generation", - "structured_output", - ] - }, - pricing: { - input: { - normal: 0.3, - }, - output: { - normal: 0.4 - } - } -} as const satisfies ModelMeta - - -const GEMINI_2_5_FLASH_LIVE = { - name: "gemini-2.5-flash-native-audio-preview-09-2025", - max_input_tokens: 141_072, - max_output_tokens: 8_192, - knowledge_cutoff: "2025-01-01", - supports: { - input: ["text", "audio", "video"], - output: ["text", "audio"], - capabilities: [ - "audio_generation", - "file_search", - "function_calling", - "live_api", - "search_grounding", - "thinking" - ] - }, - pricing: { - // todo find this info - input: { - normal: 0, - }, - output: { - normal: 0 - } - } -} as const satisfies ModelMeta - - -const GEMINI_2_5_FLASH_TTS = { - name: "gemini-2.5-flash-preview-tts", - max_input_tokens: 8_192, - max_output_tokens: 16_384, - knowledge_cutoff: "2025-05-01", - supports: { - input: ["text",], - output: ["audio"], - capabilities: [ - "audio_generation", - "batch_api", - "file_search" - ] - }, - pricing: { - input: { - normal: 1, - }, - output: { - normal: 2.5 - } - } -} as const satisfies ModelMeta - - -const GEMINI_2_5_FLASH_LITE = { - name: "gemini-2.5-flash-lite", - max_input_tokens: 1_048_576, - max_output_tokens: 65_536, - knowledge_cutoff: "2025-01-01", - supports: { - input: ["text", "image", "audio", "video", "pdf"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "code_execution", - "function_calling", - "grounding_with_gmaps", - "search_grounding", - "structured_output", - "thinking", - "url_context" - ] - }, - pricing: { - input: { - normal: 0.1, - }, - output: { - normal: 0.4 - } - } -} as const satisfies ModelMeta< - GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions -> - -const GEMINI_2_5_FLASH_LITE_PREVIEW = { - name: "gemini-2.5-flash-lite-preview-09-2025", - max_input_tokens: 1_048_576, - max_output_tokens: 65_536, - knowledge_cutoff: "2025-01-01", - supports: { - input: ["text", "image", "audio", "video", "pdf"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "code_execution", - "function_calling", - "search_grounding", - "structured_output", - "thinking", - "url_context" - ] - }, - pricing: { - input: { - normal: 0.1, - }, - output: { - normal: 0.4 - } - } -} as const satisfies ModelMeta< - GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions -> - - -const GEMINI_2_FLASH = { - name: "gemini-2.0-flash", - max_input_tokens: 1_048_576, - max_output_tokens: 8_192, - knowledge_cutoff: "2024-08-01", - supports: { - input: ["text", "image", "audio", "video"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "code_execution", - "function_calling", - "grounding_with_gmaps", - "live_api", - "search_grounding", - "structured_output" - ] - }, - pricing: { - input: { - normal: 0.1, - }, - output: { - normal: 0.4 - } - } -} as const satisfies ModelMeta< - GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions -> - - -const GEMINI_2_FLASH_IMAGE = { - name: "gemini-2.0-flash-preview-image-generation", - max_input_tokens: 32_768, - max_output_tokens: 8_192, - knowledge_cutoff: "2024-08-01", - supports: { - input: ["text", "image", "audio", "video"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "image_generation", - "structured_output" - ] - }, - pricing: { - input: { - normal: 0.1, - }, - output: { - normal: 0.039 - } - } -} as const satisfies ModelMeta - - -const GEMINI_2_FLASH_LIVE = { - name: "gemini-2.0-flash-live-001", - max_input_tokens: 1_048_576, - max_output_tokens: 8_192, - knowledge_cutoff: "2024-08-01", - supports: { - input: ["text", "audio", "video"], - output: ["text", "audio"], - capabilities: [ - "audio_generation", - "code_execution", - "function_calling", - "live_api", - "search_grounding", - "structured_output", - "url_context" - ] - }, - pricing: { - // todo find this info - input: { - normal: 0, - }, - output: { - normal: 0 - } - } -} as const satisfies ModelMeta - - -const GEMINI_2_FLASH_LITE = { - name: "gemini-2.0-flash-lite", - max_input_tokens: 1_048_576, - max_output_tokens: 8_192, - knowledge_cutoff: "2024-08-01", - supports: { - input: ["text", "audio", "video", "image"], - output: ["text"], - capabilities: [ - "batch_api", - "caching", - "function_calling", - "structured_output" - ] - }, - pricing: { - input: { - normal: 0.075, - }, - output: { - normal: 0.3 - } - } -} as const satisfies ModelMeta< - GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions -> - -const IMAGEN_4_GENERATE = { - name: "imagen-4.0-generate-001", - max_input_tokens: 480, - max_output_tokens: 4, - supports: { - input: ["text"], - output: ["image"], - - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.4 - } - } -} as const satisfies ModelMeta - -const IMAGEN_4_GENERATE_ULTRA = { - name: "imagen-4.0-ultra-generate-001", - max_input_tokens: 480, - max_output_tokens: 4, - supports: { - input: ["text"], - output: ["image"], - - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.6 - } - } -} as const satisfies ModelMeta - - -const IMAGEN_4_GENERATE_FAST = { - name: "imagen-4.0-fast-generate-001", - max_input_tokens: 480, - max_output_tokens: 4, - supports: { - input: ["text"], - output: ["image"], - - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.2 - } - } -} as const satisfies ModelMeta - - -const IMAGEN_3 = { - name: "imagen-3.0-generate-002", - max_output_tokens: 4, - supports: { - input: ["text"], - output: ["image"], - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.03 - } - } -} as const satisfies ModelMeta - -const VEO_3_1_PREVIEW = { - name: "veo-3.1-generate-preview", - max_input_tokens: 1024, - max_output_tokens: 1, - supports: { - input: ["text", "image"], - output: ["video", "audio"], - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.4 - } - } -} as const satisfies ModelMeta - - -const VEO_3_1_FAST_PREVIEW = { - name: "veo-3.1-fast-generate-preview", - max_input_tokens: 1024, - max_output_tokens: 1, - supports: { - input: ["text", "image"], - output: ["video", "audio"], - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.15 - } - } -} as const satisfies ModelMeta - -const VEO_3 = { - name: "veo-3.0-generate-001", - max_input_tokens: 1024, - max_output_tokens: 1, - supports: { - input: ["text", "image"], - output: ["video", "audio"], - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.4 - } - } -} as const satisfies ModelMeta - - -const VEO_3_FAST = { - name: "veo-3.0-fast-generate-001", - max_input_tokens: 1024, - max_output_tokens: 1, - supports: { - input: ["text", "image"], - output: ["video", "audio"], - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.15 - } - } -} as const satisfies ModelMeta - - -const VEO_2 = { - name: "veo-2.0-generate-001", - max_output_tokens: 2, - supports: { - input: ["text", "image"], - output: ["video",], - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.35 - } - } -} as const satisfies ModelMeta - -const GEMINI_EMBEDDING = { - name: "gemini-embedding-001", - max_input_tokens: 2048, - supports: { - input: ["text"], - output: ["text"], - }, - pricing: { - input: { - normal: 0, - }, - output: { - normal: 0.15 - } - } -} as const satisfies ModelMeta; - -export const GEMINI_MODEL_META = { - [GEMINI_3_PRO.name]: GEMINI_3_PRO, - [GEMINI_2_5_PRO.name]: GEMINI_2_5_PRO, - [GEMINI_2_5_PRO_TTS.name]: GEMINI_2_5_PRO_TTS, - [GEMINI_2_5_FLASH.name]: GEMINI_2_5_FLASH, - [GEMINI_2_5_FLASH_PREVIEW.name]: GEMINI_2_5_FLASH_PREVIEW, - [GEMINI_2_5_FLASH_IMAGE.name]: GEMINI_2_5_FLASH_IMAGE, - [GEMINI_2_5_FLASH_LIVE.name]: GEMINI_2_5_FLASH_LIVE, - [GEMINI_2_5_FLASH_TTS.name]: GEMINI_2_5_FLASH_TTS, - [GEMINI_2_5_FLASH_LITE.name]: GEMINI_2_5_FLASH_LITE, - [GEMINI_2_5_FLASH_LITE_PREVIEW.name]: GEMINI_2_5_FLASH_LITE_PREVIEW, - [GEMINI_2_FLASH.name]: GEMINI_2_FLASH, - [GEMINI_2_FLASH_IMAGE.name]: GEMINI_2_FLASH_IMAGE, - [GEMINI_2_FLASH_LIVE.name]: GEMINI_2_FLASH_LIVE, - [GEMINI_2_FLASH_LITE.name]: GEMINI_2_FLASH_LITE, - [IMAGEN_4_GENERATE.name]: IMAGEN_4_GENERATE, - [IMAGEN_4_GENERATE_ULTRA.name]: IMAGEN_4_GENERATE_ULTRA, - [IMAGEN_4_GENERATE_FAST.name]: IMAGEN_4_GENERATE_FAST, - [IMAGEN_3.name]: IMAGEN_3, - [VEO_3_1_PREVIEW.name]: VEO_3_1_PREVIEW, - [VEO_3_1_FAST_PREVIEW.name]: VEO_3_1_FAST_PREVIEW, - [VEO_3.name]: VEO_3, - [VEO_3_FAST.name]: VEO_3_FAST, - [VEO_2.name]: VEO_2, - [GEMINI_EMBEDDING.name]: GEMINI_EMBEDDING, -} as const; - -export type GeminiModelMetaMap = typeof GEMINI_MODEL_META; - -export type GeminiModelProviderOptions< - TModel extends keyof GeminiModelMetaMap -> = GeminiModelMetaMap[TModel] extends ModelMeta - ? TProviderOptions - : unknown; - -export const GEMINI_MODELS = [ - GEMINI_3_PRO.name, - GEMINI_2_5_PRO.name, - GEMINI_2_5_FLASH.name, - GEMINI_2_5_FLASH_PREVIEW.name, - GEMINI_2_5_FLASH_LITE.name, - GEMINI_2_5_FLASH_LITE_PREVIEW.name, - GEMINI_2_FLASH.name, - GEMINI_2_FLASH_LITE.name, -] as const - - -export const GEMINI_IMAGE_MODELS = [ - GEMINI_2_5_FLASH_IMAGE.name, - GEMINI_2_FLASH_IMAGE.name, - IMAGEN_3.name, - IMAGEN_4_GENERATE.name, - IMAGEN_4_GENERATE_FAST.name, - IMAGEN_4_GENERATE_ULTRA.name - -] as const; - -export const GEMINI_EMBEDDING_MODELS = [ - GEMINI_EMBEDDING.name -] as const; - -export const GEMINI_AUDIO_MODELS = [ - GEMINI_2_5_PRO_TTS.name, - GEMINI_2_5_FLASH_TTS.name, - GEMINI_2_5_FLASH_LIVE.name, - GEMINI_2_FLASH_LIVE.name -] as const; - -export const GEMINI_VIDEO_MODELS = [ - VEO_3_1_PREVIEW.name, - VEO_3_1_FAST_PREVIEW.name, - VEO_3.name, - VEO_3_FAST.name, - VEO_2.name -] as const; - -export type GeminiChatModels = typeof GEMINI_MODELS[number]; - -// Manual type map for per-model provider options -export type GeminiChatModelProviderOptionsByName = { - // Models with thinking and structured output support - [GEMINI_3_PRO.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions; - [GEMINI_2_5_PRO.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions; - [GEMINI_2_5_FLASH.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions; - [GEMINI_2_5_FLASH_PREVIEW.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions; - [GEMINI_2_5_FLASH_LITE.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions; - [GEMINI_2_5_FLASH_LITE_PREVIEW.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions & GeminiThinkingOptions; - // Models with structured output but no thinking support - [GEMINI_2_FLASH.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions; - [GEMINI_2_FLASH_LITE.name]: GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions & GeminiStructuredOutputOptions; -}; \ No newline at end of file +import type { + GeminiCachedContentOptions, + GeminiGenerationConfigOptions, + GeminiSafetyOptions, + GeminiStructuredOutputOptions, + GeminiThinkingOptions, + GeminiToolConfigOptions, +} from './text/text-provider-options' + +interface ModelMeta { + name: string + supports: { + input: Array<'text' | 'image' | 'audio' | 'video' | 'pdf'> + output: Array<'text' | 'image' | 'audio' | 'video'> + capabilities?: Array< + | 'audio_generation' + | 'batch_api' + | 'caching' + | 'code_execution' + | 'file_search' + | 'function_calling' + | 'grounding_with_gmaps' + | 'image_generation' + | 'live_api' + | 'search_grounding' + | 'structured_output' + | 'thinking' + | 'url_context' + > + } + max_input_tokens?: number + max_output_tokens?: number + knowledge_cutoff?: string + pricing?: { + input: { + normal: number + cached?: number + } + output: { + normal: number + } + } + /** + * Type-level description of which provider options this model supports. + */ + providerOptions?: TProviderOptions +} + +const GEMINI_3_PRO = { + name: 'gemini-3-pro-preview', + max_input_tokens: 1_048_576, + max_output_tokens: 65_536, + knowledge_cutoff: '2025-01-01', + supports: { + input: ['text', 'image', 'audio', 'video', 'pdf'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'code_execution', + 'file_search', + 'function_calling', + 'search_grounding', + 'structured_output', + 'thinking', + 'url_context', + ], + }, + pricing: { + input: { + normal: 2.5, + }, + output: { + normal: 15, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions +> + +const GEMINI_2_5_PRO = { + name: 'gemini-2.5-pro', + max_input_tokens: 1_048_576, + max_output_tokens: 65_536, + knowledge_cutoff: '2025-01-01', + supports: { + input: ['text', 'image', 'audio', 'video', 'pdf'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'code_execution', + 'file_search', + 'function_calling', + 'grounding_with_gmaps', + 'search_grounding', + 'structured_output', + 'thinking', + 'url_context', + ], + }, + pricing: { + input: { + normal: 2.5, + }, + output: { + normal: 15, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions +> + +const GEMINI_2_5_PRO_TTS = { + name: 'gemini-2.5-pro-preview-tts', + max_input_tokens: 8_192, + max_output_tokens: 16_384, + knowledge_cutoff: '2025-05-01', + supports: { + input: ['text'], + output: ['audio'], + capabilities: ['audio_generation', 'file_search'], + }, + pricing: { + input: { + normal: 2.5, + }, + output: { + normal: 15, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const GEMINI_2_5_FLASH = { + name: 'gemini-2.5-flash', + max_input_tokens: 1_048_576, + max_output_tokens: 65_536, + knowledge_cutoff: '2025-01-01', + supports: { + input: ['text', 'image', 'audio', 'video'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'code_execution', + 'file_search', + 'function_calling', + 'grounding_with_gmaps', + 'search_grounding', + 'structured_output', + 'thinking', + 'url_context', + ], + }, + pricing: { + input: { + normal: 1, + }, + output: { + normal: 2.5, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions +> + +const GEMINI_2_5_FLASH_PREVIEW = { + name: 'gemini-2.5-flash-preview-09-2025', + max_input_tokens: 1_048_576, + max_output_tokens: 65_536, + knowledge_cutoff: '2025-01-01', + supports: { + input: ['text', 'image', 'audio', 'video'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'code_execution', + 'file_search', + 'function_calling', + 'search_grounding', + 'structured_output', + 'thinking', + 'url_context', + ], + }, + pricing: { + input: { + normal: 1, + }, + output: { + normal: 2.5, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions +> + +const GEMINI_2_5_FLASH_IMAGE = { + name: 'gemini-2.5-flash-image', + max_input_tokens: 1_048_576, + max_output_tokens: 65_536, + knowledge_cutoff: '2025-06-01', + supports: { + input: ['text', 'image'], + output: ['text', 'image'], + capabilities: [ + 'batch_api', + 'caching', + 'file_search', + 'image_generation', + 'structured_output', + ], + }, + pricing: { + input: { + normal: 0.3, + }, + output: { + normal: 0.4, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const GEMINI_2_5_FLASH_LIVE = { + name: 'gemini-2.5-flash-native-audio-preview-09-2025', + max_input_tokens: 141_072, + max_output_tokens: 8_192, + knowledge_cutoff: '2025-01-01', + supports: { + input: ['text', 'audio', 'video'], + output: ['text', 'audio'], + capabilities: [ + 'audio_generation', + 'file_search', + 'function_calling', + 'live_api', + 'search_grounding', + 'thinking', + ], + }, + pricing: { + // todo find this info + input: { + normal: 0, + }, + output: { + normal: 0, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiThinkingOptions +> + +const GEMINI_2_5_FLASH_TTS = { + name: 'gemini-2.5-flash-preview-tts', + max_input_tokens: 8_192, + max_output_tokens: 16_384, + knowledge_cutoff: '2025-05-01', + supports: { + input: ['text'], + output: ['audio'], + capabilities: ['audio_generation', 'batch_api', 'file_search'], + }, + pricing: { + input: { + normal: 1, + }, + output: { + normal: 2.5, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const GEMINI_2_5_FLASH_LITE = { + name: 'gemini-2.5-flash-lite', + max_input_tokens: 1_048_576, + max_output_tokens: 65_536, + knowledge_cutoff: '2025-01-01', + supports: { + input: ['text', 'image', 'audio', 'video', 'pdf'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'code_execution', + 'function_calling', + 'grounding_with_gmaps', + 'search_grounding', + 'structured_output', + 'thinking', + 'url_context', + ], + }, + pricing: { + input: { + normal: 0.1, + }, + output: { + normal: 0.4, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions +> + +const GEMINI_2_5_FLASH_LITE_PREVIEW = { + name: 'gemini-2.5-flash-lite-preview-09-2025', + max_input_tokens: 1_048_576, + max_output_tokens: 65_536, + knowledge_cutoff: '2025-01-01', + supports: { + input: ['text', 'image', 'audio', 'video', 'pdf'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'code_execution', + 'function_calling', + 'search_grounding', + 'structured_output', + 'thinking', + 'url_context', + ], + }, + pricing: { + input: { + normal: 0.1, + }, + output: { + normal: 0.4, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions +> + +const GEMINI_2_FLASH = { + name: 'gemini-2.0-flash', + max_input_tokens: 1_048_576, + max_output_tokens: 8_192, + knowledge_cutoff: '2024-08-01', + supports: { + input: ['text', 'image', 'audio', 'video'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'code_execution', + 'function_calling', + 'grounding_with_gmaps', + 'live_api', + 'search_grounding', + 'structured_output', + ], + }, + pricing: { + input: { + normal: 0.1, + }, + output: { + normal: 0.4, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions +> + +const GEMINI_2_FLASH_IMAGE = { + name: 'gemini-2.0-flash-preview-image-generation', + max_input_tokens: 32_768, + max_output_tokens: 8_192, + knowledge_cutoff: '2024-08-01', + supports: { + input: ['text', 'image', 'audio', 'video'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'image_generation', + 'structured_output', + ], + }, + pricing: { + input: { + normal: 0.1, + }, + output: { + normal: 0.039, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const GEMINI_2_FLASH_LIVE = { + name: 'gemini-2.0-flash-live-001', + max_input_tokens: 1_048_576, + max_output_tokens: 8_192, + knowledge_cutoff: '2024-08-01', + supports: { + input: ['text', 'audio', 'video'], + output: ['text', 'audio'], + capabilities: [ + 'audio_generation', + 'code_execution', + 'function_calling', + 'live_api', + 'search_grounding', + 'structured_output', + 'url_context', + ], + }, + pricing: { + // todo find this info + input: { + normal: 0, + }, + output: { + normal: 0, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const GEMINI_2_FLASH_LITE = { + name: 'gemini-2.0-flash-lite', + max_input_tokens: 1_048_576, + max_output_tokens: 8_192, + knowledge_cutoff: '2024-08-01', + supports: { + input: ['text', 'audio', 'video', 'image'], + output: ['text'], + capabilities: [ + 'batch_api', + 'caching', + 'function_calling', + 'structured_output', + ], + }, + pricing: { + input: { + normal: 0.075, + }, + output: { + normal: 0.3, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions +> + +const IMAGEN_4_GENERATE = { + name: 'imagen-4.0-generate-001', + max_input_tokens: 480, + max_output_tokens: 4, + supports: { + input: ['text'], + output: ['image'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.4, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const IMAGEN_4_GENERATE_ULTRA = { + name: 'imagen-4.0-ultra-generate-001', + max_input_tokens: 480, + max_output_tokens: 4, + supports: { + input: ['text'], + output: ['image'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.6, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const IMAGEN_4_GENERATE_FAST = { + name: 'imagen-4.0-fast-generate-001', + max_input_tokens: 480, + max_output_tokens: 4, + supports: { + input: ['text'], + output: ['image'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.2, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const IMAGEN_3 = { + name: 'imagen-3.0-generate-002', + max_output_tokens: 4, + supports: { + input: ['text'], + output: ['image'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.03, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const VEO_3_1_PREVIEW = { + name: 'veo-3.1-generate-preview', + max_input_tokens: 1024, + max_output_tokens: 1, + supports: { + input: ['text', 'image'], + output: ['video', 'audio'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.4, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const VEO_3_1_FAST_PREVIEW = { + name: 'veo-3.1-fast-generate-preview', + max_input_tokens: 1024, + max_output_tokens: 1, + supports: { + input: ['text', 'image'], + output: ['video', 'audio'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.15, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const VEO_3 = { + name: 'veo-3.0-generate-001', + max_input_tokens: 1024, + max_output_tokens: 1, + supports: { + input: ['text', 'image'], + output: ['video', 'audio'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.4, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const VEO_3_FAST = { + name: 'veo-3.0-fast-generate-001', + max_input_tokens: 1024, + max_output_tokens: 1, + supports: { + input: ['text', 'image'], + output: ['video', 'audio'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.15, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const VEO_2 = { + name: 'veo-2.0-generate-001', + max_output_tokens: 2, + supports: { + input: ['text', 'image'], + output: ['video'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.35, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +const GEMINI_EMBEDDING = { + name: 'gemini-embedding-001', + max_input_tokens: 2048, + supports: { + input: ['text'], + output: ['text'], + }, + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0.15, + }, + }, +} as const satisfies ModelMeta< + GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +> + +export const GEMINI_MODEL_META = { + [GEMINI_3_PRO.name]: GEMINI_3_PRO, + [GEMINI_2_5_PRO.name]: GEMINI_2_5_PRO, + [GEMINI_2_5_PRO_TTS.name]: GEMINI_2_5_PRO_TTS, + [GEMINI_2_5_FLASH.name]: GEMINI_2_5_FLASH, + [GEMINI_2_5_FLASH_PREVIEW.name]: GEMINI_2_5_FLASH_PREVIEW, + [GEMINI_2_5_FLASH_IMAGE.name]: GEMINI_2_5_FLASH_IMAGE, + [GEMINI_2_5_FLASH_LIVE.name]: GEMINI_2_5_FLASH_LIVE, + [GEMINI_2_5_FLASH_TTS.name]: GEMINI_2_5_FLASH_TTS, + [GEMINI_2_5_FLASH_LITE.name]: GEMINI_2_5_FLASH_LITE, + [GEMINI_2_5_FLASH_LITE_PREVIEW.name]: GEMINI_2_5_FLASH_LITE_PREVIEW, + [GEMINI_2_FLASH.name]: GEMINI_2_FLASH, + [GEMINI_2_FLASH_IMAGE.name]: GEMINI_2_FLASH_IMAGE, + [GEMINI_2_FLASH_LIVE.name]: GEMINI_2_FLASH_LIVE, + [GEMINI_2_FLASH_LITE.name]: GEMINI_2_FLASH_LITE, + [IMAGEN_4_GENERATE.name]: IMAGEN_4_GENERATE, + [IMAGEN_4_GENERATE_ULTRA.name]: IMAGEN_4_GENERATE_ULTRA, + [IMAGEN_4_GENERATE_FAST.name]: IMAGEN_4_GENERATE_FAST, + [IMAGEN_3.name]: IMAGEN_3, + [VEO_3_1_PREVIEW.name]: VEO_3_1_PREVIEW, + [VEO_3_1_FAST_PREVIEW.name]: VEO_3_1_FAST_PREVIEW, + [VEO_3.name]: VEO_3, + [VEO_3_FAST.name]: VEO_3_FAST, + [VEO_2.name]: VEO_2, + [GEMINI_EMBEDDING.name]: GEMINI_EMBEDDING, +} as const + +export type GeminiModelMetaMap = typeof GEMINI_MODEL_META + +export type GeminiModelProviderOptions< + TModel extends keyof GeminiModelMetaMap, +> = + GeminiModelMetaMap[TModel] extends ModelMeta + ? TProviderOptions + : unknown + +export const GEMINI_MODELS = [ + GEMINI_3_PRO.name, + GEMINI_2_5_PRO.name, + GEMINI_2_5_FLASH.name, + GEMINI_2_5_FLASH_PREVIEW.name, + GEMINI_2_5_FLASH_LITE.name, + GEMINI_2_5_FLASH_LITE_PREVIEW.name, + GEMINI_2_FLASH.name, + GEMINI_2_FLASH_LITE.name, +] as const + +export const GEMINI_IMAGE_MODELS = [ + GEMINI_2_5_FLASH_IMAGE.name, + GEMINI_2_FLASH_IMAGE.name, + IMAGEN_3.name, + IMAGEN_4_GENERATE.name, + IMAGEN_4_GENERATE_FAST.name, + IMAGEN_4_GENERATE_ULTRA.name, +] as const + +export const GEMINI_EMBEDDING_MODELS = [GEMINI_EMBEDDING.name] as const + +export const GEMINI_AUDIO_MODELS = [ + GEMINI_2_5_PRO_TTS.name, + GEMINI_2_5_FLASH_TTS.name, + GEMINI_2_5_FLASH_LIVE.name, + GEMINI_2_FLASH_LIVE.name, +] as const + +export const GEMINI_VIDEO_MODELS = [ + VEO_3_1_PREVIEW.name, + VEO_3_1_FAST_PREVIEW.name, + VEO_3.name, + VEO_3_FAST.name, + VEO_2.name, +] as const + +export type GeminiChatModels = (typeof GEMINI_MODELS)[number] + +// Manual type map for per-model provider options +export type GeminiChatModelProviderOptionsByName = { + // Models with thinking and structured output support + [GEMINI_3_PRO.name]: GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions + [GEMINI_2_5_PRO.name]: GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions + [GEMINI_2_5_FLASH.name]: GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions + [GEMINI_2_5_FLASH_PREVIEW.name]: GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions + [GEMINI_2_5_FLASH_LITE.name]: GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions + [GEMINI_2_5_FLASH_LITE_PREVIEW.name]: GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions + // Models with structured output but no thinking support + [GEMINI_2_FLASH.name]: GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions + [GEMINI_2_FLASH_LITE.name]: GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions +} diff --git a/packages/typescript/ai-gemini/src/text/text-provider-options.ts b/packages/typescript/ai-gemini/src/text/text-provider-options.ts index 6b58800a8..49c6fd1f5 100644 --- a/packages/typescript/ai-gemini/src/text/text-provider-options.ts +++ b/packages/typescript/ai-gemini/src/text/text-provider-options.ts @@ -1,413 +1,495 @@ -import { GeminiChatModels } from "../model-meta"; -import { Schema } from "../tools/function-declaration-tool"; -import { GoogleGeminiTool } from "../tools"; -import { ContentListUnion, MediaResolution, SafetySetting, ThinkingLevel, ToolConfig } from "@google/genai"; - -export interface GeminiToolConfigOptions { - /** - * Tool configuration for any Tool specified in the request. - */ - toolConfig?: ToolConfig -} - -export interface GeminiSafetyOptions { - /** - * list of unique SafetySetting instances for blocking unsafe content. - -This will be enforced on the GenerateContentRequest.contents and GenerateContentResponse.candidates. There should not be more than one setting for each SafetyCategory type. The API will block any contents and responses that fail to meet the thresholds set by these settings. This list overrides the default settings for each SafetyCategory specified in the safetySettings. If there is no SafetySetting for a given SafetyCategory provided in the list, the API will use the default safety setting for that category. Harm categories HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT, HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_CIVIC_INTEGRITY are supported - */ - safetySettings?: SafetySetting[] -} - -export interface GeminiGenerationConfigOptions { - /** - * Configuration options for model generation and outputs. - */ - generationConfig?: { - /** - * The set of character sequences (up to 5) that will stop output generation. If specified, the API will stop at the first appearance of a stop_sequence. The stop sequence will not be included as part of the response. - */ - stopSequences?: string[]; - /** - * The requested modalities of the response. Represents the set of modalities that the model can return, and should be expected in the response. This is an exact match to the modalities of the response. - -A model may have multiple combinations of supported modalities. If the requested modalities do not match any of the supported combinations, an error will be returned. - */ - responseModalities?: ("MODALITY_UNSPECIFIED" | "TEXT" | "IMAGE" | "AUDIO")[] - /** - * Number of generated responses to return. If unset, this will default to 1. Please note that this doesn't work for previous generation models (Gemini 1.0 family) - */ - candidateCount?: number; - /** - * The maximum number of tokens to consider when sampling. - -Gemini models use Top-p (nucleus) sampling or a combination of Top-k and nucleus sampling. Top-k sampling considers the set of topK most probable tokens. Models running with nucleus sampling don't allow topK setting. - -Note: The default value varies by Model and is specified by theModel.top_p attribute returned from the getModel function. An empty topK attribute indicates that the model doesn't apply top-k sampling and doesn't allow setting topK on requests. - */ - topK?: number; - /** - * Seed used in decoding. If not set, the request uses a randomly generated seed. - */ - seed?: number; - /** - * Presence penalty applied to the next token's logprobs if the token has already been seen in the response. - -This penalty is binary on/off and not dependant on the number of times the token is used (after the first). Use frequencyPenalty for a penalty that increases with each use. - -A positive penalty will discourage the use of tokens that have already been used in the response, increasing the vocabulary. - -A negative penalty will encourage the use of tokens that have already been used in the response, decreasing the vocabulary. - */ - presencePenalty?: number; - /** - * Frequency penalty applied to the next token's logprobs, multiplied by the number of times each token has been seen in the respponse so far. - -A positive penalty will discourage the use of tokens that have already been used, proportional to the number of times the token has been used: The more a token is used, the more difficult it is for the model to use that token again increasing the vocabulary of responses. - -Caution: A negative penalty will encourage the model to reuse tokens proportional to the number of times the token has been used. Small negative values will reduce the vocabulary of a response. Larger negative values will cause the model to start repeating a common token until it hits the maxOutputTokens limit. - */ - frequencyPenalty?: number; - /** - * If true, export the logprobs results in response. - */ - responseLogprobs?: boolean; - - /** - * Only valid if responseLogprobs=True. This sets the number of top logprobs to return at each decoding step in the Candidate.logprobs_result. The number must be in the range of [0, 20]. - */ - logprobs?: number; - - /** - * Enables enhanced civic answers. It may not be available for all models. - */ - enableEnhancedCivicAnswers?: boolean; - - /** - * The speech generation config. - */ - speechConfig?: { - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: string - } - } - - multiSpeakerVoiceConfig?: { - speakerVoiceConfigs?: { - speaker: string; - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: string - } - } - }[] - } - /** - * Language code (in BCP 47 format, e.g. "en-US") for speech synthesis. - -Valid values are: de-DE, en-AU, en-GB, en-IN, en-US, es-US, fr-FR, hi-IN, pt-BR, ar-XA, es-ES, fr-CA, id-ID, it-IT, ja-JP, tr-TR, vi-VN, bn-IN, gu-IN, kn-IN, ml-IN, mr-IN, ta-IN, te-IN, nl-NL, ko-KR, cmn-CN, pl-PL, ru-RU, and th-TH. - */ - languageCode?: "de-DE" | "en-AU" | "en-GB" | "en-IN" | "en-US" | "es-US" | "fr-FR" | "hi-IN" | "pt-BR" | "ar-XA" | "es-ES" | "fr-CA" | "id-ID" | "it-IT" | "ja-JP" | "tr-TR" | "vi-VN" | "bn-IN" | "gu-IN" | "kn-IN" | "ml-IN" | "mr-IN" | "ta-IN" | "te-IN" | "nl-NL" | "ko-KR" | "cmn-CN" | "pl-PL" | "ru-RU" | "th-TH"; - } - /** - * Config for image generation. An error will be returned if this field is set for models that don't support these config options. - */ - imageConfig?: { - aspectRatio?: "1:1" | "2:3" | "3:2" | "3:4" | "4:3" | "9:16" | "16:9" | "21:9" - } - /** - * If specified, the media resolution specified will be used. - */ - mediaResolution?: MediaResolution - } & GeminiThinkingOptions & GeminiStructuredOutputOptions -} - -export interface GeminiCachedContentOptions { - /** - * The name of the content cached to use as context to serve the prediction. Format: cachedContents/{cachedContent} - */ - cachedContent?: `cachedContents/${string}`; -} - -export interface GeminiStructuredOutputOptions { - /** - * MIME type of the generated candidate text. Supported MIME types are: text/plain: (default) Text output. application/json: JSON response in the response candidates. text/x.enum: ENUM as a string response in the response candidates. - */ - responseMimeType?: string; - /** - * Output schema of the generated candidate text. Schemas must be a subset of the OpenAPI schema and can be objects, primitives or arrays. - -If set, a compatible responseMimeType must also be set. Compatible MIME types: application/json: Schema for JSON response. - */ - responseSchema?: Schema - /** - * Output schema of the generated response. This is an alternative to responseSchema that accepts JSON Schema. - -If set, responseSchema must be omitted, but responseMimeType is required. - -While the full JSON Schema may be sent, not all features are supported. Specifically, only the following properties are supported: - -$id -$defs -$ref -$anchor -type -format -title -description -enum (for strings and numbers) -items -prefixItems -minItems -maxItems -minimum -maximum -anyOf -oneOf (interpreted the same as anyOf) -properties -additionalProperties -required -The non-standard propertyOrdering property may also be set. - -Cyclic references are unrolled to a limited degree and, as such, may only be used within non-required properties. (Nullable properties are not sufficient.) If $ref is set on a sub-schema, no other properties, except for than those starting as a $, may be set. - */ - responseJsonSchema?: Schema -} - -export interface GeminiThinkingOptions { - /** - * Config for thinking features. An error will be returned if this field is set for models that don't support thinking. - */ - thinkingConfig?: { - /** - * Indicates whether to include thoughts in the response. If true, thoughts are returned only when available. - */ - includeThoughts: boolean; - - /** - * The number of thoughts tokens that the model should generate. - */ - thinkingBudget: number; - /** - * The level of thoughts tokens that the model should generate. - */ - thinkingLevel?: ThinkingLevel - } -} - - - -export type ExternalTextProviderOptions = GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions; -export interface InternalTextProviderOptions extends ExternalTextProviderOptions { - // path parameter - model: GeminiChatModels; - /** - * Developer set system instruction(s). - */ - systemInstruction?: string; - /** - * The content of the current conversation with the model. - -For single-turn queries, this is a single instance. For multi-turn queries like chat, this is a repeated field that contains the conversation history and the latest request. - */ - contents: string | ContentListUnion; - /** - * A list of Tools the Model may use to generate the next response. - * A Tool is a piece of code that enables the system to interact with external systems to perform an action, or set of actions, outside of knowledge and scope of the Model. Supported Tools are Function and codeExecution. - */ - tools?: GoogleGeminiTool[]; - - - /** - * Configuration options for model generation and outputs. - */ - generationConfig?: { - /** - * The set of character sequences (up to 5) that will stop output generation. If specified, the API will stop at the first appearance of a stop_sequence. The stop sequence will not be included as part of the response. - */ - stopSequences?: string[]; - /** - * MIME type of the generated candidate text. Supported MIME types are: text/plain: (default) Text output. application/json: JSON response in the response candidates. text/x.enum: ENUM as a string response in the response candidates. - */ - responseMimeType?: string; - /** - * Output schema of the generated candidate text. Schemas must be a subset of the OpenAPI schema and can be objects, primitives or arrays. - -If set, a compatible responseMimeType must also be set. Compatible MIME types: application/json: Schema for JSON response. - */ - responseSchema?: Schema - /** - * Output schema of the generated response. This is an alternative to responseSchema that accepts JSON Schema. - -If set, responseSchema must be omitted, but responseMimeType is required. - -While the full JSON Schema may be sent, not all features are supported. Specifically, only the following properties are supported: - -$id -$defs -$ref -$anchor -type -format -title -description -enum (for strings and numbers) -items -prefixItems -minItems -maxItems -minimum -maximum -anyOf -oneOf (interpreted the same as anyOf) -properties -additionalProperties -required -The non-standard propertyOrdering property may also be set. - -Cyclic references are unrolled to a limited degree and, as such, may only be used within non-required properties. (Nullable properties are not sufficient.) If $ref is set on a sub-schema, no other properties, except for than those starting as a $, may be set. - */ - responseJsonSchema?: Schema - /** - * The requested modalities of the response. Represents the set of modalities that the model can return, and should be expected in the response. This is an exact match to the modalities of the response. - -A model may have multiple combinations of supported modalities. If the requested modalities do not match any of the supported combinations, an error will be returned. - */ - responseModalities?: ("MODALITY_UNSPECIFIED" | "TEXT" | "IMAGE" | "AUDIO")[] - /** - * Number of generated responses to return. If unset, this will default to 1. Please note that this doesn't work for previous generation models (Gemini 1.0 family) - */ - candidateCount?: number; - /** - * The maximum number of tokens to include in a response candidate. - -Note: The default value varies by model, see the Model.output_token_limit attribute of the Model returned from the getModel function. - */ - maxOutputTokens?: number; - /** - * Controls the randomness of the output. - -Note: The default value varies by model, see the Model.temperature attribute of the Model returned from the getModel function. - -Values can range from [0.0, 2.0]. - */ - temperature?: number; - /** - * The maximum cumulative probability of tokens to consider when sampling. - -The model uses combined Top-k and Top-p (nucleus) sampling. - -Tokens are sorted based on their assigned probabilities so that only the most likely tokens are considered. Top-k sampling directly limits the maximum number of tokens to consider, while Nucleus sampling limits the number of tokens based on the cumulative probability. - -Note: The default value varies by Model and is specified by theModel.top_p attribute returned from the getModel function. An empty topK attribute indicates that the model doesn't apply top-k sampling and doesn't allow setting topK on requests. - */ - topP?: number; - /** - * The maximum number of tokens to consider when sampling. - -Gemini models use Top-p (nucleus) sampling or a combination of Top-k and nucleus sampling. Top-k sampling considers the set of topK most probable tokens. Models running with nucleus sampling don't allow topK setting. - -Note: The default value varies by Model and is specified by theModel.top_p attribute returned from the getModel function. An empty topK attribute indicates that the model doesn't apply top-k sampling and doesn't allow setting topK on requests. - */ - topK?: number; - /** - * Seed used in decoding. If not set, the request uses a randomly generated seed. - */ - seed?: number; - /** - * Presence penalty applied to the next token's logprobs if the token has already been seen in the response. - -This penalty is binary on/off and not dependant on the number of times the token is used (after the first). Use frequencyPenalty for a penalty that increases with each use. - -A positive penalty will discourage the use of tokens that have already been used in the response, increasing the vocabulary. - -A negative penalty will encourage the use of tokens that have already been used in the response, decreasing the vocabulary. - */ - presencePenalty?: number; - /** - * Frequency penalty applied to the next token's logprobs, multiplied by the number of times each token has been seen in the respponse so far. - -A positive penalty will discourage the use of tokens that have already been used, proportional to the number of times the token has been used: The more a token is used, the more difficult it is for the model to use that token again increasing the vocabulary of responses. - -Caution: A negative penalty will encourage the model to reuse tokens proportional to the number of times the token has been used. Small negative values will reduce the vocabulary of a response. Larger negative values will cause the model to start repeating a common token until it hits the maxOutputTokens limit. - */ - frequencyPenalty?: number; - /** - * If true, export the logprobs results in response. - */ - responseLogprobs?: boolean; - - /** - * Only valid if responseLogprobs=True. This sets the number of top logprobs to return at each decoding step in the Candidate.logprobs_result. The number must be in the range of [0, 20]. - */ - logprobs?: number; - - /** - * Enables enhanced civic answers. It may not be available for all models. - */ - enableEnhancedCivicAnswers?: boolean; - - /** - * The speech generation config. - */ - speechConfig?: { - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: string - } - } - - multiSpeakerVoiceConfig?: { - speakerVoiceConfigs?: { - speaker: string; - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: string - } - } - }[] - } - /** - * Language code (in BCP 47 format, e.g. "en-US") for speech synthesis. - -Valid values are: de-DE, en-AU, en-GB, en-IN, en-US, es-US, fr-FR, hi-IN, pt-BR, ar-XA, es-ES, fr-CA, id-ID, it-IT, ja-JP, tr-TR, vi-VN, bn-IN, gu-IN, kn-IN, ml-IN, mr-IN, ta-IN, te-IN, nl-NL, ko-KR, cmn-CN, pl-PL, ru-RU, and th-TH. - */ - languageCode?: "de-DE" | "en-AU" | "en-GB" | "en-IN" | "en-US" | "es-US" | "fr-FR" | "hi-IN" | "pt-BR" | "ar-XA" | "es-ES" | "fr-CA" | "id-ID" | "it-IT" | "ja-JP" | "tr-TR" | "vi-VN" | "bn-IN" | "gu-IN" | "kn-IN" | "ml-IN" | "mr-IN" | "ta-IN" | "te-IN" | "nl-NL" | "ko-KR" | "cmn-CN" | "pl-PL" | "ru-RU" | "th-TH"; - } - /** - * Config for thinking features. An error will be returned if this field is set for models that don't support thinking. - */ - thinkingConfig?: { - /** - * Indicates whether to include thoughts in the response. If true, thoughts are returned only when available. - */ - includeThoughts: boolean; - - /** - * The number of thoughts tokens that the model should generate. - */ - thinkingBudget: number; - /** - * The level of thoughts tokens that the model should generate. - */ - thinkingLevel?: ThinkingLevel - } - /** - * Config for image generation. An error will be returned if this field is set for models that don't support these config options. - */ - imageConfig?: { - aspectRatio?: "1:1" | "2:3" | "3:2" | "3:4" | "4:3" | "9:16" | "16:9" | "21:9" - } - /** - * If specified, the media resolution specified will be used. - */ - mediaResolution?: MediaResolution - } - -} - - +import type { + ContentListUnion, + MediaResolution, + SafetySetting, + ThinkingLevel, + ToolConfig, +} from '@google/genai' +import type { GeminiChatModels } from '../model-meta' +import type { Schema } from '../tools/function-declaration-tool' +import type { GoogleGeminiTool } from '../tools' + +export interface GeminiToolConfigOptions { + /** + * Tool configuration for any Tool specified in the request. + */ + toolConfig?: ToolConfig +} + +export interface GeminiSafetyOptions { + /** + * list of unique SafetySetting instances for blocking unsafe content. + +This will be enforced on the GenerateContentRequest.contents and GenerateContentResponse.candidates. There should not be more than one setting for each SafetyCategory type. The API will block any contents and responses that fail to meet the thresholds set by these settings. This list overrides the default settings for each SafetyCategory specified in the safetySettings. If there is no SafetySetting for a given SafetyCategory provided in the list, the API will use the default safety setting for that category. Harm categories HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT, HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_CIVIC_INTEGRITY are supported + */ + safetySettings?: Array +} + +export interface GeminiGenerationConfigOptions { + /** + * Configuration options for model generation and outputs. + */ + generationConfig?: { + /** + * The set of character sequences (up to 5) that will stop output generation. If specified, the API will stop at the first appearance of a stop_sequence. The stop sequence will not be included as part of the response. + */ + stopSequences?: Array + /** + * The requested modalities of the response. Represents the set of modalities that the model can return, and should be expected in the response. This is an exact match to the modalities of the response. + +A model may have multiple combinations of supported modalities. If the requested modalities do not match any of the supported combinations, an error will be returned. + */ + responseModalities?: Array< + 'MODALITY_UNSPECIFIED' | 'TEXT' | 'IMAGE' | 'AUDIO' + > + /** + * Number of generated responses to return. If unset, this will default to 1. Please note that this doesn't work for previous generation models (Gemini 1.0 family) + */ + candidateCount?: number + /** + * The maximum number of tokens to consider when sampling. + +Gemini models use Top-p (nucleus) sampling or a combination of Top-k and nucleus sampling. Top-k sampling considers the set of topK most probable tokens. Models running with nucleus sampling don't allow topK setting. + +Note: The default value varies by Model and is specified by theModel.top_p attribute returned from the getModel function. An empty topK attribute indicates that the model doesn't apply top-k sampling and doesn't allow setting topK on requests. + */ + topK?: number + /** + * Seed used in decoding. If not set, the request uses a randomly generated seed. + */ + seed?: number + /** + * Presence penalty applied to the next token's logprobs if the token has already been seen in the response. + +This penalty is binary on/off and not dependant on the number of times the token is used (after the first). Use frequencyPenalty for a penalty that increases with each use. + +A positive penalty will discourage the use of tokens that have already been used in the response, increasing the vocabulary. + +A negative penalty will encourage the use of tokens that have already been used in the response, decreasing the vocabulary. + */ + presencePenalty?: number + /** + * Frequency penalty applied to the next token's logprobs, multiplied by the number of times each token has been seen in the respponse so far. + +A positive penalty will discourage the use of tokens that have already been used, proportional to the number of times the token has been used: The more a token is used, the more difficult it is for the model to use that token again increasing the vocabulary of responses. + +Caution: A negative penalty will encourage the model to reuse tokens proportional to the number of times the token has been used. Small negative values will reduce the vocabulary of a response. Larger negative values will cause the model to start repeating a common token until it hits the maxOutputTokens limit. + */ + frequencyPenalty?: number + /** + * If true, export the logprobs results in response. + */ + responseLogprobs?: boolean + + /** + * Only valid if responseLogprobs=True. This sets the number of top logprobs to return at each decoding step in the Candidate.logprobs_result. The number must be in the range of [0, 20]. + */ + logprobs?: number + + /** + * Enables enhanced civic answers. It may not be available for all models. + */ + enableEnhancedCivicAnswers?: boolean + + /** + * The speech generation config. + */ + speechConfig?: { + voiceConfig: { + prebuiltVoiceConfig: { + voiceName: string + } + } + + multiSpeakerVoiceConfig?: { + speakerVoiceConfigs?: Array<{ + speaker: string + voiceConfig: { + prebuiltVoiceConfig: { + voiceName: string + } + } + }> + } + /** + * Language code (in BCP 47 format, e.g. "en-US") for speech synthesis. + +Valid values are: de-DE, en-AU, en-GB, en-IN, en-US, es-US, fr-FR, hi-IN, pt-BR, ar-XA, es-ES, fr-CA, id-ID, it-IT, ja-JP, tr-TR, vi-VN, bn-IN, gu-IN, kn-IN, ml-IN, mr-IN, ta-IN, te-IN, nl-NL, ko-KR, cmn-CN, pl-PL, ru-RU, and th-TH. + */ + languageCode?: + | 'de-DE' + | 'en-AU' + | 'en-GB' + | 'en-IN' + | 'en-US' + | 'es-US' + | 'fr-FR' + | 'hi-IN' + | 'pt-BR' + | 'ar-XA' + | 'es-ES' + | 'fr-CA' + | 'id-ID' + | 'it-IT' + | 'ja-JP' + | 'tr-TR' + | 'vi-VN' + | 'bn-IN' + | 'gu-IN' + | 'kn-IN' + | 'ml-IN' + | 'mr-IN' + | 'ta-IN' + | 'te-IN' + | 'nl-NL' + | 'ko-KR' + | 'cmn-CN' + | 'pl-PL' + | 'ru-RU' + | 'th-TH' + } + /** + * Config for image generation. An error will be returned if this field is set for models that don't support these config options. + */ + imageConfig?: { + aspectRatio?: + | '1:1' + | '2:3' + | '3:2' + | '3:4' + | '4:3' + | '9:16' + | '16:9' + | '21:9' + } + /** + * If specified, the media resolution specified will be used. + */ + mediaResolution?: MediaResolution + } & GeminiThinkingOptions & + GeminiStructuredOutputOptions +} + +export interface GeminiCachedContentOptions { + /** + * The name of the content cached to use as context to serve the prediction. Format: cachedContents/{cachedContent} + */ + cachedContent?: `cachedContents/${string}` +} + +export interface GeminiStructuredOutputOptions { + /** + * MIME type of the generated candidate text. Supported MIME types are: text/plain: (default) Text output. application/json: JSON response in the response candidates. text/x.enum: ENUM as a string response in the response candidates. + */ + responseMimeType?: string + /** + * Output schema of the generated candidate text. Schemas must be a subset of the OpenAPI schema and can be objects, primitives or arrays. + +If set, a compatible responseMimeType must also be set. Compatible MIME types: application/json: Schema for JSON response. + */ + responseSchema?: Schema + /** + * Output schema of the generated response. This is an alternative to responseSchema that accepts JSON Schema. + +If set, responseSchema must be omitted, but responseMimeType is required. + +While the full JSON Schema may be sent, not all features are supported. Specifically, only the following properties are supported: + +$id +$defs +$ref +$anchor +type +format +title +description +enum (for strings and numbers) +items +prefixItems +minItems +maxItems +minimum +maximum +anyOf +oneOf (interpreted the same as anyOf) +properties +additionalProperties +required +The non-standard propertyOrdering property may also be set. + +Cyclic references are unrolled to a limited degree and, as such, may only be used within non-required properties. (Nullable properties are not sufficient.) If $ref is set on a sub-schema, no other properties, except for than those starting as a $, may be set. + */ + responseJsonSchema?: Schema +} + +export interface GeminiThinkingOptions { + /** + * Config for thinking features. An error will be returned if this field is set for models that don't support thinking. + */ + thinkingConfig?: { + /** + * Indicates whether to include thoughts in the response. If true, thoughts are returned only when available. + */ + includeThoughts: boolean + + /** + * The number of thoughts tokens that the model should generate. + */ + thinkingBudget: number + /** + * The level of thoughts tokens that the model should generate. + */ + thinkingLevel?: ThinkingLevel + } +} + +export type ExternalTextProviderOptions = GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions +export interface InternalTextProviderOptions + extends ExternalTextProviderOptions { + // path parameter + model: GeminiChatModels + /** + * Developer set system instruction(s). + */ + systemInstruction?: string + /** + * The content of the current conversation with the model. + +For single-turn queries, this is a single instance. For multi-turn queries like chat, this is a repeated field that contains the conversation history and the latest request. + */ + contents: string | ContentListUnion + /** + * A list of Tools the Model may use to generate the next response. + * A Tool is a piece of code that enables the system to interact with external systems to perform an action, or set of actions, outside of knowledge and scope of the Model. Supported Tools are Function and codeExecution. + */ + tools?: Array + + /** + * Configuration options for model generation and outputs. + */ + generationConfig?: { + /** + * The set of character sequences (up to 5) that will stop output generation. If specified, the API will stop at the first appearance of a stop_sequence. The stop sequence will not be included as part of the response. + */ + stopSequences?: Array + /** + * MIME type of the generated candidate text. Supported MIME types are: text/plain: (default) Text output. application/json: JSON response in the response candidates. text/x.enum: ENUM as a string response in the response candidates. + */ + responseMimeType?: string + /** + * Output schema of the generated candidate text. Schemas must be a subset of the OpenAPI schema and can be objects, primitives or arrays. + +If set, a compatible responseMimeType must also be set. Compatible MIME types: application/json: Schema for JSON response. + */ + responseSchema?: Schema + /** + * Output schema of the generated response. This is an alternative to responseSchema that accepts JSON Schema. + +If set, responseSchema must be omitted, but responseMimeType is required. + +While the full JSON Schema may be sent, not all features are supported. Specifically, only the following properties are supported: + +$id +$defs +$ref +$anchor +type +format +title +description +enum (for strings and numbers) +items +prefixItems +minItems +maxItems +minimum +maximum +anyOf +oneOf (interpreted the same as anyOf) +properties +additionalProperties +required +The non-standard propertyOrdering property may also be set. + +Cyclic references are unrolled to a limited degree and, as such, may only be used within non-required properties. (Nullable properties are not sufficient.) If $ref is set on a sub-schema, no other properties, except for than those starting as a $, may be set. + */ + responseJsonSchema?: Schema + /** + * The requested modalities of the response. Represents the set of modalities that the model can return, and should be expected in the response. This is an exact match to the modalities of the response. + +A model may have multiple combinations of supported modalities. If the requested modalities do not match any of the supported combinations, an error will be returned. + */ + responseModalities?: Array< + 'MODALITY_UNSPECIFIED' | 'TEXT' | 'IMAGE' | 'AUDIO' + > + /** + * Number of generated responses to return. If unset, this will default to 1. Please note that this doesn't work for previous generation models (Gemini 1.0 family) + */ + candidateCount?: number + /** + * The maximum number of tokens to include in a response candidate. + +Note: The default value varies by model, see the Model.output_token_limit attribute of the Model returned from the getModel function. + */ + maxOutputTokens?: number + /** + * Controls the randomness of the output. + +Note: The default value varies by model, see the Model.temperature attribute of the Model returned from the getModel function. + +Values can range from [0.0, 2.0]. + */ + temperature?: number + /** + * The maximum cumulative probability of tokens to consider when sampling. + +The model uses combined Top-k and Top-p (nucleus) sampling. + +Tokens are sorted based on their assigned probabilities so that only the most likely tokens are considered. Top-k sampling directly limits the maximum number of tokens to consider, while Nucleus sampling limits the number of tokens based on the cumulative probability. + +Note: The default value varies by Model and is specified by theModel.top_p attribute returned from the getModel function. An empty topK attribute indicates that the model doesn't apply top-k sampling and doesn't allow setting topK on requests. + */ + topP?: number + /** + * The maximum number of tokens to consider when sampling. + +Gemini models use Top-p (nucleus) sampling or a combination of Top-k and nucleus sampling. Top-k sampling considers the set of topK most probable tokens. Models running with nucleus sampling don't allow topK setting. + +Note: The default value varies by Model and is specified by theModel.top_p attribute returned from the getModel function. An empty topK attribute indicates that the model doesn't apply top-k sampling and doesn't allow setting topK on requests. + */ + topK?: number + /** + * Seed used in decoding. If not set, the request uses a randomly generated seed. + */ + seed?: number + /** + * Presence penalty applied to the next token's logprobs if the token has already been seen in the response. + +This penalty is binary on/off and not dependant on the number of times the token is used (after the first). Use frequencyPenalty for a penalty that increases with each use. + +A positive penalty will discourage the use of tokens that have already been used in the response, increasing the vocabulary. + +A negative penalty will encourage the use of tokens that have already been used in the response, decreasing the vocabulary. + */ + presencePenalty?: number + /** + * Frequency penalty applied to the next token's logprobs, multiplied by the number of times each token has been seen in the respponse so far. + +A positive penalty will discourage the use of tokens that have already been used, proportional to the number of times the token has been used: The more a token is used, the more difficult it is for the model to use that token again increasing the vocabulary of responses. + +Caution: A negative penalty will encourage the model to reuse tokens proportional to the number of times the token has been used. Small negative values will reduce the vocabulary of a response. Larger negative values will cause the model to start repeating a common token until it hits the maxOutputTokens limit. + */ + frequencyPenalty?: number + /** + * If true, export the logprobs results in response. + */ + responseLogprobs?: boolean + + /** + * Only valid if responseLogprobs=True. This sets the number of top logprobs to return at each decoding step in the Candidate.logprobs_result. The number must be in the range of [0, 20]. + */ + logprobs?: number + + /** + * Enables enhanced civic answers. It may not be available for all models. + */ + enableEnhancedCivicAnswers?: boolean + + /** + * The speech generation config. + */ + speechConfig?: { + voiceConfig: { + prebuiltVoiceConfig: { + voiceName: string + } + } + + multiSpeakerVoiceConfig?: { + speakerVoiceConfigs?: Array<{ + speaker: string + voiceConfig: { + prebuiltVoiceConfig: { + voiceName: string + } + } + }> + } + /** + * Language code (in BCP 47 format, e.g. "en-US") for speech synthesis. + +Valid values are: de-DE, en-AU, en-GB, en-IN, en-US, es-US, fr-FR, hi-IN, pt-BR, ar-XA, es-ES, fr-CA, id-ID, it-IT, ja-JP, tr-TR, vi-VN, bn-IN, gu-IN, kn-IN, ml-IN, mr-IN, ta-IN, te-IN, nl-NL, ko-KR, cmn-CN, pl-PL, ru-RU, and th-TH. + */ + languageCode?: + | 'de-DE' + | 'en-AU' + | 'en-GB' + | 'en-IN' + | 'en-US' + | 'es-US' + | 'fr-FR' + | 'hi-IN' + | 'pt-BR' + | 'ar-XA' + | 'es-ES' + | 'fr-CA' + | 'id-ID' + | 'it-IT' + | 'ja-JP' + | 'tr-TR' + | 'vi-VN' + | 'bn-IN' + | 'gu-IN' + | 'kn-IN' + | 'ml-IN' + | 'mr-IN' + | 'ta-IN' + | 'te-IN' + | 'nl-NL' + | 'ko-KR' + | 'cmn-CN' + | 'pl-PL' + | 'ru-RU' + | 'th-TH' + } + /** + * Config for thinking features. An error will be returned if this field is set for models that don't support thinking. + */ + thinkingConfig?: { + /** + * Indicates whether to include thoughts in the response. If true, thoughts are returned only when available. + */ + includeThoughts: boolean + + /** + * The number of thoughts tokens that the model should generate. + */ + thinkingBudget: number + /** + * The level of thoughts tokens that the model should generate. + */ + thinkingLevel?: ThinkingLevel + } + /** + * Config for image generation. An error will be returned if this field is set for models that don't support these config options. + */ + imageConfig?: { + aspectRatio?: + | '1:1' + | '2:3' + | '3:2' + | '3:4' + | '4:3' + | '9:16' + | '16:9' + | '21:9' + } + /** + * If specified, the media resolution specified will be used. + */ + mediaResolution?: MediaResolution + } +} diff --git a/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts b/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts index c249dcfac..f7eadd93d 100644 --- a/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts @@ -1,23 +1,21 @@ -import type { Tool } from "@tanstack/ai"; - -export interface CodeExecutionTool { - -} - -export function convertCodeExecutionToolToAdapterFormat(_tool: Tool) { - return { - codeExecution: {} - }; -} - -export function codeExecutionTool(): Tool { - return { - type: "function", - function: { - name: "code_execution", - description: "", - parameters: {} - }, - metadata: {} - } -} \ No newline at end of file +import type { Tool } from '@tanstack/ai' + +export interface CodeExecutionTool {} + +export function convertCodeExecutionToolToAdapterFormat(_tool: Tool) { + return { + codeExecution: {}, + } +} + +export function codeExecutionTool(): Tool { + return { + type: 'function', + function: { + name: 'code_execution', + description: '', + parameters: {}, + }, + metadata: {}, + } +} diff --git a/packages/typescript/ai-gemini/src/tools/computer-use-tool.ts b/packages/typescript/ai-gemini/src/tools/computer-use-tool.ts index 542e128e8..9a1b65f6d 100644 --- a/packages/typescript/ai-gemini/src/tools/computer-use-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/computer-use-tool.ts @@ -1,29 +1,29 @@ -import { ComputerUse } from "@google/genai"; -import type { Tool } from "@tanstack/ai"; - -export type ComputerUseTool = ComputerUse - -export function convertComputerUseToolToAdapterFormat(tool: Tool) { - const metadata = tool.metadata as ComputerUseTool; - return { - computerUse: { - environment: metadata.environment, - excludedPredefinedFunctions: metadata.excludedPredefinedFunctions - } - }; -} - -export function computerUseTool(config: ComputerUseTool): Tool { - return { - type: "function", - function: { - name: "computer_use", - description: "", - parameters: {} - }, - metadata: { - environment: config.environment, - excludedPredefinedFunctions: config.excludedPredefinedFunctions - } - } -} \ No newline at end of file +import type { ComputerUse } from '@google/genai' +import type { Tool } from '@tanstack/ai' + +export type ComputerUseTool = ComputerUse + +export function convertComputerUseToolToAdapterFormat(tool: Tool) { + const metadata = tool.metadata as ComputerUseTool + return { + computerUse: { + environment: metadata.environment, + excludedPredefinedFunctions: metadata.excludedPredefinedFunctions, + }, + } +} + +export function computerUseTool(config: ComputerUseTool): Tool { + return { + type: 'function', + function: { + name: 'computer_use', + description: '', + parameters: {}, + }, + metadata: { + environment: config.environment, + excludedPredefinedFunctions: config.excludedPredefinedFunctions, + }, + } +} diff --git a/packages/typescript/ai-gemini/src/tools/file-search-tool.ts b/packages/typescript/ai-gemini/src/tools/file-search-tool.ts index 5f249aba6..c2dbc0153 100644 --- a/packages/typescript/ai-gemini/src/tools/file-search-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/file-search-tool.ts @@ -1,43 +1,51 @@ -import type { Tool } from "@tanstack/ai"; - -export interface FileSearchTool { - /** - * The names of the fileSearchStores to retrieve from. Example: fileSearchStores/my-file-search-store-123 - */ - fileSearchStoreNames: string[]; - /** - * Metadata filter to apply to the semantic retrieval documents and chunks. - */ - metadataFilter?: string; - /** - * The number of semantic retrieval chunks to retrieve. - */ - topK?: number; -} - -export function convertFileSearchToolToAdapterFormat(tool: Tool) { - const metadata = tool.metadata as { fileSearchStoreNames: string[]; metadataFilter?: string; topK?: number }; - return { - fileSearch: { - fileSearchStoreNames: metadata.fileSearchStoreNames, - metadataFilter: metadata.metadataFilter, - topK: metadata.topK - } - }; -} - -export function fileSearchTool(config: { fileSearchStoreNames: string[]; metadataFilter?: string; topK?: number }): Tool { - return { - type: "function", - function: { - name: "file_search", - description: "", - parameters: {} - }, - metadata: { - fileSearchStoreNames: config.fileSearchStoreNames, - metadataFilter: config.metadataFilter, - topK: config.topK - } - } -} \ No newline at end of file +import type { Tool } from '@tanstack/ai' + +export interface FileSearchTool { + /** + * The names of the fileSearchStores to retrieve from. Example: fileSearchStores/my-file-search-store-123 + */ + fileSearchStoreNames: Array + /** + * Metadata filter to apply to the semantic retrieval documents and chunks. + */ + metadataFilter?: string + /** + * The number of semantic retrieval chunks to retrieve. + */ + topK?: number +} + +export function convertFileSearchToolToAdapterFormat(tool: Tool) { + const metadata = tool.metadata as { + fileSearchStoreNames: Array + metadataFilter?: string + topK?: number + } + return { + fileSearch: { + fileSearchStoreNames: metadata.fileSearchStoreNames, + metadataFilter: metadata.metadataFilter, + topK: metadata.topK, + }, + } +} + +export function fileSearchTool(config: { + fileSearchStoreNames: Array + metadataFilter?: string + topK?: number +}): Tool { + return { + type: 'function', + function: { + name: 'file_search', + description: '', + parameters: {}, + }, + metadata: { + fileSearchStoreNames: config.fileSearchStoreNames, + metadataFilter: config.metadataFilter, + topK: config.topK, + }, + } +} diff --git a/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts b/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts index 88d3170ef..b153f8b26 100644 --- a/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts @@ -1,150 +1,166 @@ -export interface FunctionDeclarationTool { - /** - * The name of the function. Must be a-z, A-Z, 0-9, or contain underscores, colons, dots, and dashes, with a maximum length of 64. - */ - name: string; - /** - * A brief description of the function. - */ - description: string; - /** - * Defines the function behavior. - * - UNSPECIFIED: This value is unused. - * - BLOCKING: If set, the system will wait to receive the function response before continuing the conversation. - * - NON_BLOCKING: If set, the system will not wait to receive the function response. Instead, it will attempt to handle function responses as they become available while maintaining the conversation between the user and the model. - - */ - behavior?: "UNSPECIFIED" | "BLOCKING" | "NON_BLOCKING"; - - parameters?: Schema; - /** - * JSON Schema representation of the parameters. Mutually exclusive with 'parameters' field. - */ - parametersJsonSchema?: Schema; - /** - * Describes the output from this function in JSON Schema format. Reflects the Open API 3.03 Response Object. The Schema defines the type used for the response value of the function. - */ - response?: Schema; - /** - * Describes the output from this function in JSON Schema format. The value specified by the schema is the response value of the function. - -This field is mutually exclusive with response. - */ - responseJsonSchema?: Schema; -} - - -type Value = null | string | number | boolean | object | any[]; - -export interface Schema { - type: "TYPE_UNSPECIFIED" | "OBJECT" | "ARRAY" | "STRING" | "NUMBER" | "INTEGER" | "BOOLEAN" | "NULL"; - /** - * The format of the data. Any value is allowed, but most do not trigger any special functionality. - */ - format?: string; - /** - * Title of the schema - */ - title?: string; - /** - * A brief description of the parameter. This could contain examples of use. Parameter description may be formatted as Markdown. - */ - description?: string; - /** - * Indicates if the value may be null. - */ - nullable?: boolean; - /** - * Possible values of the element of Type.STRING with enum format. For example we can define an Enum Direction as : {type:STRING, format:enum, enum:["EAST", NORTH", "SOUTH", "WEST"]} - */ - enum?: any[]; - /** - * Maximum number of the elements for Type.ARRAY. - */ - maxItems?: number; - /** - * Minimum number of the elements for Type.ARRAY. - */ - minItems?: number; - /** - * An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }. - */ - properties?: Record; - /** - * Required properties of Type.OBJECT. - */ - required?: string[]; - /** - * Minimum number of the properties for Type.OBJECT. - */ - minProperties?: string; - /** - * Maximum number of the properties for Type.OBJECT. - */ - maxProperties?: string; - /** - * SCHEMA FIELDS FOR TYPE STRING Minimum length of the Type.STRING - */ - minLength?: number; - /** - * Maximum length of the Type.STRING - */ - maxLength?: number; - /** - * Pattern of the Type.STRING to restrict a string to a regular expression. - */ - pattern?: string; - /** - * Example of the object. Will only populated when the object is the root. - */ - example?: Value; - /** - * The value should be validated against any (one or more) of the subschemas in the list. - */ - anyOf?: [Schema, ...Schema[]]; - - /** - * The order of the properties. Not a standard field in open api spec. Used to determine the order of the properties in the response. - */ - propertyOrdering?: string[]; - /** - * Default value of the field. Per JSON Schema, this field is intended for documentation generators and doesn't affect validation. Thus it's included here and ignored so that developers who send schemas with a default field don't get unknown-field errors. - */ - default?: Value; - /** - * Schema of the elements of Type.ARRAY. - */ - items?: Schema; - /** - * SCHEMA FIELDS FOR TYPE INTEGER and NUMBER Minimum value of the Type.INTEGER and Type.NUMBER - */ - minimum?: number; - /** - * Maximum value of the Type.INTEGER and Type.NUMBER - */ - maximum?: number; -} - -export const validateFunctionDeclarationTool = (tool: FunctionDeclarationTool) => { - const nameRegex = /^[a-zA-Z0-9_:.-]{1,64}$/; - const valid = nameRegex.test(tool.name); - if (!valid) { - throw new Error(`Invalid function name: ${tool.name}. Must be 1-64 characters long and contain only a-z, A-Z, 0-9, underscores, colons, dots, and dashes.`); - } - - if (tool.parameters && tool.parametersJsonSchema) { - throw new Error(`FunctionDeclarationTool cannot have both 'parameters' and 'parametersJsonSchema' defined. Please use only one.`); - } - - if (tool.response && tool.responseJsonSchema) { - throw new Error(`FunctionDeclarationTool cannot have both 'response' and 'responseJsonSchema' defined. Please use only one.`); - } - -} - -export const functionDeclarationTools = (tools: FunctionDeclarationTool[]) => { - tools.forEach(validateFunctionDeclarationTool); - return { - functionDeclarations: tools - } -} \ No newline at end of file +export interface FunctionDeclarationTool { + /** + * The name of the function. Must be a-z, A-Z, 0-9, or contain underscores, colons, dots, and dashes, with a maximum length of 64. + */ + name: string + /** + * A brief description of the function. + */ + description: string + /** + * Defines the function behavior. + * - UNSPECIFIED: This value is unused. + * - BLOCKING: If set, the system will wait to receive the function response before continuing the conversation. + * - NON_BLOCKING: If set, the system will not wait to receive the function response. Instead, it will attempt to handle function responses as they become available while maintaining the conversation between the user and the model. + + */ + behavior?: 'UNSPECIFIED' | 'BLOCKING' | 'NON_BLOCKING' + + parameters?: Schema + /** + * JSON Schema representation of the parameters. Mutually exclusive with 'parameters' field. + */ + parametersJsonSchema?: Schema + /** + * Describes the output from this function in JSON Schema format. Reflects the Open API 3.03 Response Object. The Schema defines the type used for the response value of the function. + */ + response?: Schema + /** + * Describes the output from this function in JSON Schema format. The value specified by the schema is the response value of the function. + +This field is mutually exclusive with response. + */ + responseJsonSchema?: Schema +} + +type Value = null | string | number | boolean | object | Array + +export interface Schema { + type: + | 'TYPE_UNSPECIFIED' + | 'OBJECT' + | 'ARRAY' + | 'STRING' + | 'NUMBER' + | 'INTEGER' + | 'BOOLEAN' + | 'NULL' + /** + * The format of the data. Any value is allowed, but most do not trigger any special functionality. + */ + format?: string + /** + * Title of the schema + */ + title?: string + /** + * A brief description of the parameter. This could contain examples of use. Parameter description may be formatted as Markdown. + */ + description?: string + /** + * Indicates if the value may be null. + */ + nullable?: boolean + /** + * Possible values of the element of Type.STRING with enum format. For example we can define an Enum Direction as : {type:STRING, format:enum, enum:["EAST", NORTH", "SOUTH", "WEST"]} + */ + enum?: Array + /** + * Maximum number of the elements for Type.ARRAY. + */ + maxItems?: number + /** + * Minimum number of the elements for Type.ARRAY. + */ + minItems?: number + /** + * An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }. + */ + properties?: Record + /** + * Required properties of Type.OBJECT. + */ + required?: Array + /** + * Minimum number of the properties for Type.OBJECT. + */ + minProperties?: string + /** + * Maximum number of the properties for Type.OBJECT. + */ + maxProperties?: string + /** + * SCHEMA FIELDS FOR TYPE STRING Minimum length of the Type.STRING + */ + minLength?: number + /** + * Maximum length of the Type.STRING + */ + maxLength?: number + /** + * Pattern of the Type.STRING to restrict a string to a regular expression. + */ + pattern?: string + /** + * Example of the object. Will only populated when the object is the root. + */ + example?: Value + /** + * The value should be validated against any (one or more) of the subschemas in the list. + */ + anyOf?: [Schema, ...Array] + + /** + * The order of the properties. Not a standard field in open api spec. Used to determine the order of the properties in the response. + */ + propertyOrdering?: Array + /** + * Default value of the field. Per JSON Schema, this field is intended for documentation generators and doesn't affect validation. Thus it's included here and ignored so that developers who send schemas with a default field don't get unknown-field errors. + */ + default?: Value + /** + * Schema of the elements of Type.ARRAY. + */ + items?: Schema + /** + * SCHEMA FIELDS FOR TYPE INTEGER and NUMBER Minimum value of the Type.INTEGER and Type.NUMBER + */ + minimum?: number + /** + * Maximum value of the Type.INTEGER and Type.NUMBER + */ + maximum?: number +} + +export const validateFunctionDeclarationTool = ( + tool: FunctionDeclarationTool, +) => { + const nameRegex = /^[a-zA-Z0-9_:.-]{1,64}$/ + const valid = nameRegex.test(tool.name) + if (!valid) { + throw new Error( + `Invalid function name: ${tool.name}. Must be 1-64 characters long and contain only a-z, A-Z, 0-9, underscores, colons, dots, and dashes.`, + ) + } + + if (tool.parameters && tool.parametersJsonSchema) { + throw new Error( + `FunctionDeclarationTool cannot have both 'parameters' and 'parametersJsonSchema' defined. Please use only one.`, + ) + } + + if (tool.response && tool.responseJsonSchema) { + throw new Error( + `FunctionDeclarationTool cannot have both 'response' and 'responseJsonSchema' defined. Please use only one.`, + ) + } +} + +export const functionDeclarationTools = ( + tools: Array, +) => { + tools.forEach(validateFunctionDeclarationTool) + return { + functionDeclarations: tools, + } +} diff --git a/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts b/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts index 64df9fb98..730786de8 100644 --- a/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts @@ -1,30 +1,32 @@ -import type { Tool } from "@tanstack/ai"; - -export interface GoogleMapsTool { - /** - * Whether to return a widget context token in the GroundingMetadata of the response. Developers can use the widget context token to render a Google Maps widget with geospatial context related to the places that the model references in the response. - */ - enableWidget?: boolean; - -} - -export function convertGoogleMapsToolToAdapterFormat(tool: Tool) { - const metadata = tool.metadata as { enableWidget?: boolean }; - return { - googleMaps: metadata.enableWidget !== undefined ? { enableWidget: metadata.enableWidget } : {} - }; -} - -export function googleMapsTool(config?: { enableWidget?: boolean }): Tool { - return { - type: "function", - function: { - name: "google_maps", - description: "", - parameters: {} - }, - metadata: { - enableWidget: config?.enableWidget - } - } -} \ No newline at end of file +import type { Tool } from '@tanstack/ai' + +export interface GoogleMapsTool { + /** + * Whether to return a widget context token in the GroundingMetadata of the response. Developers can use the widget context token to render a Google Maps widget with geospatial context related to the places that the model references in the response. + */ + enableWidget?: boolean +} + +export function convertGoogleMapsToolToAdapterFormat(tool: Tool) { + const metadata = tool.metadata as { enableWidget?: boolean } + return { + googleMaps: + metadata.enableWidget !== undefined + ? { enableWidget: metadata.enableWidget } + : {}, + } +} + +export function googleMapsTool(config?: { enableWidget?: boolean }): Tool { + return { + type: 'function', + function: { + name: 'google_maps', + description: '', + parameters: {}, + }, + metadata: { + enableWidget: config?.enableWidget, + }, + } +} diff --git a/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts b/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts index 81de0c6a6..36911465a 100644 --- a/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts @@ -1,26 +1,29 @@ -import { GoogleSearchRetrieval } from "@google/genai"; -import type { Tool } from "@tanstack/ai"; - -export type GoogleSearchRetrievalTool = GoogleSearchRetrieval - - -export function convertGoogleSearchRetrievalToolToAdapterFormat(tool: Tool) { - const metadata = tool.metadata as GoogleSearchRetrievalTool; - return { - googleSearchRetrieval: metadata.dynamicRetrievalConfig ? { dynamicRetrievalConfig: metadata.dynamicRetrievalConfig } : {} - }; -} - -export function googleSearchRetrievalTool(config?: GoogleSearchRetrievalTool): Tool { - return { - type: "function", - function: { - name: "google_search_retrieval", - description: "", - parameters: {} - }, - metadata: { - dynamicRetrievalConfig: config?.dynamicRetrievalConfig - } - } -} \ No newline at end of file +import type { GoogleSearchRetrieval } from '@google/genai' +import type { Tool } from '@tanstack/ai' + +export type GoogleSearchRetrievalTool = GoogleSearchRetrieval + +export function convertGoogleSearchRetrievalToolToAdapterFormat(tool: Tool) { + const metadata = tool.metadata as GoogleSearchRetrievalTool + return { + googleSearchRetrieval: metadata.dynamicRetrievalConfig + ? { dynamicRetrievalConfig: metadata.dynamicRetrievalConfig } + : {}, + } +} + +export function googleSearchRetrievalTool( + config?: GoogleSearchRetrievalTool, +): Tool { + return { + type: 'function', + function: { + name: 'google_search_retrieval', + description: '', + parameters: {}, + }, + metadata: { + dynamicRetrievalConfig: config?.dynamicRetrievalConfig, + }, + } +} diff --git a/packages/typescript/ai-gemini/src/tools/google-search-tool.ts b/packages/typescript/ai-gemini/src/tools/google-search-tool.ts index 83debbe08..a53b7f13a 100644 --- a/packages/typescript/ai-gemini/src/tools/google-search-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-search-tool.ts @@ -1,29 +1,35 @@ -import type { Tool } from "@tanstack/ai"; - -export interface GoogleSearchTool { - timeRangeFilter?: { - startTime?: string; // ISO 8601 format - endTime?: string; // ISO 8601 format - } -} - -export function convertGoogleSearchToolToAdapterFormat(tool: Tool) { - const metadata = tool.metadata as { timeRangeFilter?: { startTime?: string; endTime?: string } }; - return { - googleSearch: metadata.timeRangeFilter ? { timeRangeFilter: metadata.timeRangeFilter } : {} - }; -} - -export function googleSearchTool(config?: { timeRangeFilter?: { startTime?: string; endTime?: string } }): Tool { - return { - type: "function", - function: { - name: "google_search", - description: "", - parameters: {} - }, - metadata: { - timeRangeFilter: config?.timeRangeFilter - } - } -} \ No newline at end of file +import type { Tool } from '@tanstack/ai' + +export interface GoogleSearchTool { + timeRangeFilter?: { + startTime?: string // ISO 8601 format + endTime?: string // ISO 8601 format + } +} + +export function convertGoogleSearchToolToAdapterFormat(tool: Tool) { + const metadata = tool.metadata as { + timeRangeFilter?: { startTime?: string; endTime?: string } + } + return { + googleSearch: metadata.timeRangeFilter + ? { timeRangeFilter: metadata.timeRangeFilter } + : {}, + } +} + +export function googleSearchTool(config?: { + timeRangeFilter?: { startTime?: string; endTime?: string } +}): Tool { + return { + type: 'function', + function: { + name: 'google_search', + description: '', + parameters: {}, + }, + metadata: { + timeRangeFilter: config?.timeRangeFilter, + }, + } +} diff --git a/packages/typescript/ai-gemini/src/tools/index.ts b/packages/typescript/ai-gemini/src/tools/index.ts index d5aa0b93e..442a9bd70 100644 --- a/packages/typescript/ai-gemini/src/tools/index.ts +++ b/packages/typescript/ai-gemini/src/tools/index.ts @@ -1,10 +1,18 @@ -import { CodeExecutionTool } from "./code-execution-tool"; -import { ComputerUseTool } from "./computer-use-tool"; -import { FileSearchTool } from "./file-search-tool"; -import { FunctionDeclarationTool } from "./function-declaration-tool"; -import { GoogleMapsTool } from "./google-maps-tool"; -import { GoogleSearchRetrievalTool } from "./google-search-retriveal-tool"; -import { GoogleSearchTool } from "./google-search-tool"; -import { UrlContextTool } from "./url-context-tool"; - -export type GoogleGeminiTool = CodeExecutionTool | ComputerUseTool | FileSearchTool | FunctionDeclarationTool | GoogleMapsTool | GoogleSearchRetrievalTool | GoogleSearchTool | UrlContextTool; \ No newline at end of file +import type { CodeExecutionTool } from './code-execution-tool' +import type { ComputerUseTool } from './computer-use-tool' +import type { FileSearchTool } from './file-search-tool' +import type { FunctionDeclarationTool } from './function-declaration-tool' +import type { GoogleMapsTool } from './google-maps-tool' +import type { GoogleSearchRetrievalTool } from './google-search-retriveal-tool' +import type { GoogleSearchTool } from './google-search-tool' +import type { UrlContextTool } from './url-context-tool' + +export type GoogleGeminiTool = + | CodeExecutionTool + | ComputerUseTool + | FileSearchTool + | FunctionDeclarationTool + | GoogleMapsTool + | GoogleSearchRetrievalTool + | GoogleSearchTool + | UrlContextTool diff --git a/packages/typescript/ai-gemini/src/tools/tool-converter.ts b/packages/typescript/ai-gemini/src/tools/tool-converter.ts index 0622b1a69..6f34b0cdc 100644 --- a/packages/typescript/ai-gemini/src/tools/tool-converter.ts +++ b/packages/typescript/ai-gemini/src/tools/tool-converter.ts @@ -1,101 +1,99 @@ -import type { Tool } from "@tanstack/ai"; -import { convertCodeExecutionToolToAdapterFormat } from "./code-execution-tool"; -import { convertComputerUseToolToAdapterFormat } from "./computer-use-tool"; -import { convertFileSearchToolToAdapterFormat } from "./file-search-tool"; -import { convertGoogleMapsToolToAdapterFormat } from "./google-maps-tool"; -import { convertGoogleSearchRetrievalToolToAdapterFormat } from "./google-search-retriveal-tool"; -import { convertGoogleSearchToolToAdapterFormat } from "./google-search-tool"; -import { convertUrlContextToolToAdapterFormat } from "./url-context-tool"; -import { ToolUnion } from "@google/genai"; - -/** - * Converts standard Tool format to Gemini-specific tool format - * - * @param tools - Array of standard Tool objects - * @returns Array of Gemini-specific tool definitions - * - * @example - * ```typescript - * const tools: Tool[] = [{ - * type: "function", - * function: { - * name: "get_weather", - * description: "Get weather for a location", - * parameters: { - * type: "object", - * properties: { location: { type: "string" } }, - * required: ["location"] - * } - * } - * }]; - * - * const geminiTools = convertToolsToProviderFormat(tools); - * ``` - */ -export function convertToolsToProviderFormat( - tools: TTool[] | undefined, -): ToolUnion[] { - if (!tools || tools.length === 0) { - return []; - } - const result: ToolUnion[] = []; - const functionDeclarations: Array<{ - name: string; - description?: string; - parameters?: any; - }> = []; - - // Process each tool and group function declarations together - for (const tool of tools) { - const name = tool.function.name; - - switch (name) { - case "code_execution": - result.push(convertCodeExecutionToolToAdapterFormat(tool)); - break; - case "computer_use": - result.push(convertComputerUseToolToAdapterFormat(tool)); - break; - case "file_search": - result.push(convertFileSearchToolToAdapterFormat(tool)); - break; - case "google_maps": - result.push(convertGoogleMapsToolToAdapterFormat(tool)); - break; - case "google_search_retrieval": - result.push(convertGoogleSearchRetrievalToolToAdapterFormat(tool)); - break; - case "google_search": - result.push(convertGoogleSearchToolToAdapterFormat(tool)); - break; - case "url_context": - result.push(convertUrlContextToolToAdapterFormat(tool)); - break; - default: - // Collect function declarations to group together - // Description is required for Gemini function declarations - if (!tool.function.description) { - throw new Error(`Tool ${tool.function.name} requires a description for Gemini adapter`); - } - functionDeclarations.push({ - name: tool.function.name, - description: tool.function.description, - parameters: tool.function.parameters || { - type: "object", - properties: {}, - required: [] - } - }); - break; - } - } - - // If we have function declarations, add them as a single tool - if (functionDeclarations.length > 0) { - result.push({ - functionDeclarations: functionDeclarations - }); - } - - return result; -} +import { convertCodeExecutionToolToAdapterFormat } from './code-execution-tool' +import { convertComputerUseToolToAdapterFormat } from './computer-use-tool' +import { convertFileSearchToolToAdapterFormat } from './file-search-tool' +import { convertGoogleMapsToolToAdapterFormat } from './google-maps-tool' +import { convertGoogleSearchRetrievalToolToAdapterFormat } from './google-search-retriveal-tool' +import { convertGoogleSearchToolToAdapterFormat } from './google-search-tool' +import { convertUrlContextToolToAdapterFormat } from './url-context-tool' +import type { Tool } from '@tanstack/ai' +import type { ToolUnion } from '@google/genai' + +/** + * Converts standard Tool format to Gemini-specific tool format + * + * @param tools - Array of standard Tool objects + * @returns Array of Gemini-specific tool definitions + * + * @example + * ```typescript + * const tools: Tool[] = [{ + * type: "function", + * function: { + * name: "get_weather", + * description: "Get weather for a location", + * parameters: { + * type: "object", + * properties: { location: { type: "string" } }, + * required: ["location"] + * } + * } + * }]; + * + * const geminiTools = convertToolsToProviderFormat(tools); + * ``` + */ +export function convertToolsToProviderFormat( + tools: Array | undefined, +): Array { + if (!tools || tools.length === 0) { + return [] + } + const result: Array = [] + const functionDeclarations: Array<{ + name: string + description?: string + parameters?: any + }> = [] + + // Process each tool and group function declarations together + for (const tool of tools) { + const name = tool.function.name + + switch (name) { + case 'code_execution': + result.push(convertCodeExecutionToolToAdapterFormat(tool)) + break + case 'computer_use': + result.push(convertComputerUseToolToAdapterFormat(tool)) + break + case 'file_search': + result.push(convertFileSearchToolToAdapterFormat(tool)) + break + case 'google_maps': + result.push(convertGoogleMapsToolToAdapterFormat(tool)) + break + case 'google_search_retrieval': + result.push(convertGoogleSearchRetrievalToolToAdapterFormat(tool)) + break + case 'google_search': + result.push(convertGoogleSearchToolToAdapterFormat(tool)) + break + case 'url_context': + result.push(convertUrlContextToolToAdapterFormat(tool)) + break + default: + // Collect function declarations to group together + // Description is required for Gemini function declarations + if (!tool.function.description) { + throw new Error( + `Tool ${tool.function.name} requires a description for Gemini adapter`, + ) + } + functionDeclarations.push({ + name: tool.function.name, + description: tool.function.description, + parameters: tool.function.parameters, + }) + break + } + } + + // If we have function declarations, add them as a single tool + if (functionDeclarations.length > 0) { + result.push({ + functionDeclarations: functionDeclarations, + }) + } + + return result +} diff --git a/packages/typescript/ai-gemini/src/tools/url-context-tool.ts b/packages/typescript/ai-gemini/src/tools/url-context-tool.ts index a71ee9fff..dc3d69b7f 100644 --- a/packages/typescript/ai-gemini/src/tools/url-context-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/url-context-tool.ts @@ -1,23 +1,21 @@ -import type { Tool } from "@tanstack/ai"; - -export interface UrlContextTool { - -} - -export function convertUrlContextToolToAdapterFormat(_tool: Tool) { - return { - urlContext: {} - }; -} - -export function urlContextTool(): Tool { - return { - type: "function", - function: { - name: "url_context", - description: "", - parameters: {} - }, - metadata: {} - } -} \ No newline at end of file +import type { Tool } from '@tanstack/ai' + +export interface UrlContextTool {} + +export function convertUrlContextToolToAdapterFormat(_tool: Tool) { + return { + urlContext: {}, + } +} + +export function urlContextTool(): Tool { + return { + type: 'function', + function: { + name: 'url_context', + description: '', + parameters: {}, + }, + metadata: {}, + } +} diff --git a/packages/typescript/ai-gemini/tests/gemini-adapter.test.ts b/packages/typescript/ai-gemini/tests/gemini-adapter.test.ts index 75b988241..0516401cc 100644 --- a/packages/typescript/ai-gemini/tests/gemini-adapter.test.ts +++ b/packages/typescript/ai-gemini/tests/gemini-adapter.test.ts @@ -1,368 +1,406 @@ -import { describe, it, expect, beforeEach, vi } from "vitest"; -import { chat, summarize, embedding } from "@tanstack/ai"; -import type { Tool, StreamChunk } from "@tanstack/ai"; -import type { HarmBlockThreshold, HarmCategory, SafetySetting } from "@google/genai"; -import type { Schema } from "../src/tools/function-declaration-tool"; -import { GeminiAdapter, type GeminiProviderOptions } from "../src/gemini-adapter"; - -const mocks = vi.hoisted(() => { - return { - constructorSpy: vi.fn<(options: { apiKey: string }) => void>(), - generateContentSpy: vi.fn(), - generateContentStreamSpy: vi.fn(), - embedContentSpy: vi.fn(), - getGenerativeModelSpy: vi.fn(), - }; -}); - -vi.mock("@google/genai", () => { - const { constructorSpy, generateContentSpy, generateContentStreamSpy, embedContentSpy, getGenerativeModelSpy } = mocks; - - class MockGoogleGenAI { - public models = { - generateContent: generateContentSpy, - generateContentStream: generateContentStreamSpy, - embedContent: embedContentSpy, - }; - - public getGenerativeModel = getGenerativeModelSpy; - - constructor(options: { apiKey: string }) { - constructorSpy(options); - } - } - - return { GoogleGenAI: MockGoogleGenAI }; -}); - -const createAdapter = () => new GeminiAdapter({ apiKey: "test-key" }); - -const weatherTool: Tool = { - type: "function", - function: { - name: "lookup_weather", - description: "Return the weather for a location", - parameters: { - type: "object", - properties: { - location: { type: "string" }, - }, - required: ["location"], - }, - }, -}; - -const createStream = (chunks: Array>) => { - return (async function* () { - for (const chunk of chunks) { - yield chunk; - } - })(); -}; - -describe("GeminiAdapter through AI", () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - it("maps provider options for chat streaming", async () => { - const streamChunks = [ - { - candidates: [ - { - content: { - parts: [{ text: "Sunny skies ahead" }], - }, - finishReason: "STOP", - }, - ], - usageMetadata: { - promptTokenCount: 3, - thoughtsTokenCount: 1, - totalTokenCount: 4, - }, - }, - ]; - - mocks.generateContentStreamSpy.mockResolvedValue(createStream(streamChunks)); - - const adapter = createAdapter(); - - // Consume the stream to trigger the API call - for await (const _ of chat({ - adapter, - model: "gemini-2.5-pro", - messages: [{ role: "user", content: "How is the weather in Madrid?" }], - providerOptions: { - generationConfig: { topK: 9 }, - }, - options: { - temperature: 0.4, - topP: 0.8, - maxTokens: 256, - }, - tools: [weatherTool], - })) { /* consume stream */ } - - expect(mocks.generateContentStreamSpy).toHaveBeenCalledTimes(1); - const [payload] = mocks.generateContentStreamSpy.mock.calls[0]; - expect(payload.model).toBe("gemini-2.5-pro"); - expect(payload.config).toMatchObject({ - temperature: 0.4, - topP: 0.8, - maxOutputTokens: 256, - topK: 9, - }); - expect(payload.config?.tools?.[0]?.functionDeclarations?.[0]?.name).toBe( - "lookup_weather", - ); - expect(payload.contents).toEqual([ - { - role: "user", - parts: [{ text: "How is the weather in Madrid?" }], - }, - ]); - }); - - it("maps every common and provider option into the Gemini payload", async () => { - const streamChunks = [ - { - candidates: [ - { - content: { - parts: [{ text: "" }], - }, - finishReason: "STOP", - }, - ], - usageMetadata: undefined, - }, - ]; - - mocks.generateContentStreamSpy.mockResolvedValue(createStream(streamChunks)); - - const safetySettings: SafetySetting[] = [ - { - category: "HARM_CATEGORY_HATE_SPEECH" as HarmCategory, - threshold: "BLOCK_LOW_AND_ABOVE" as HarmBlockThreshold, - }, - ]; - - const responseSchema: Schema = { - type: "OBJECT", - properties: { - summary: { type: "STRING" }, - }, - }; - - const responseJsonSchema: Schema = { - type: "OBJECT", - properties: { - ok: { type: "BOOLEAN" }, - }, - }; - - const providerOptions: GeminiProviderOptions = { - safetySettings, - generationConfig: { - stopSequences: ["", "###"], - responseMimeType: "application/json", - responseSchema, - responseJsonSchema, - responseModalities: ["TEXT"], - candidateCount: 2, - topK: 6, - seed: 7, - presencePenalty: 0.2, - frequencyPenalty: 0.4, - responseLogprobs: true, - logprobs: 3, - enableEnhancedCivicAnswers: true, - speechConfig: { - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: "Studio", - }, - }, - }, - thinkingConfig: { - includeThoughts: true, - thinkingBudget: 128, - }, - imageConfig: { - aspectRatio: "1:1", - }, - }, - cachedContent: "cachedContents/weather-context", - } as const; - - const adapter = createAdapter(); - - // Consume the stream to trigger the API call - for await (const _ of chat({ - adapter, - model: "gemini-2.5-pro", - messages: [{ role: "user", content: "Provide structured response" }], - options: { - temperature: 0.61, - topP: 0.37, - maxTokens: 512, - }, - systemPrompts: ["Stay concise", "Return JSON"], - providerOptions, - })) { /* consume stream */ } - - expect(mocks.generateContentStreamSpy).toHaveBeenCalledTimes(1); - const [payload] = mocks.generateContentStreamSpy.mock.calls[0]; - const config = payload.config; - - expect(config.temperature).toBe(0.61); - expect(config.topP).toBe(0.37); - expect(config.maxOutputTokens).toBe(512); - expect(config.cachedContent).toBe(providerOptions.cachedContent); - expect(config.safetySettings).toEqual(providerOptions.safetySettings); - expect(config.generationConfig).toEqual(providerOptions.generationConfig); - expect(config.stopSequences).toEqual(providerOptions.generationConfig?.stopSequences); - expect(config.responseMimeType).toBe(providerOptions.generationConfig?.responseMimeType); - expect(config.responseSchema).toEqual(providerOptions.generationConfig?.responseSchema); - expect(config.responseJsonSchema).toEqual(providerOptions.generationConfig?.responseJsonSchema); - expect(config.responseModalities).toEqual(providerOptions.generationConfig?.responseModalities); - expect(config.candidateCount).toBe(providerOptions.generationConfig?.candidateCount); - expect(config.topK).toBe(providerOptions.generationConfig?.topK); - expect(config.seed).toBe(providerOptions.generationConfig?.seed); - expect(config.presencePenalty).toBe(providerOptions.generationConfig?.presencePenalty); - expect(config.frequencyPenalty).toBe(providerOptions.generationConfig?.frequencyPenalty); - expect(config.responseLogprobs).toBe(providerOptions.generationConfig?.responseLogprobs); - expect(config.logprobs).toBe(providerOptions.generationConfig?.logprobs); - expect(config.enableEnhancedCivicAnswers).toBe( - providerOptions.generationConfig?.enableEnhancedCivicAnswers, - ); - expect(config.speechConfig).toEqual(providerOptions.generationConfig?.speechConfig); - expect(config.thinkingConfig).toEqual(providerOptions.generationConfig?.thinkingConfig); - expect(config.imageConfig).toEqual(providerOptions.generationConfig?.imageConfig); - }); - - it("streams chat chunks using mapped provider config", async () => { - const streamChunks = [ - { - candidates: [ - { - content: { - parts: [{ text: "Partly " }], - }, - }, - ], - }, - { - candidates: [ - { - content: { - parts: [{ text: "cloudy" }], - }, - finishReason: "STOP", - }, - ], - usageMetadata: { - promptTokenCount: 4, - thoughtsTokenCount: 2, - totalTokenCount: 6, - }, - }, - ]; - - mocks.generateContentStreamSpy.mockResolvedValue(createStream(streamChunks)); - - const adapter = createAdapter(); - const received: StreamChunk[] = []; - for await (const chunk of chat({ - adapter, - model: "gemini-2.5-pro", - messages: [{ role: "user", content: "Tell me a joke" }], - providerOptions: { - generationConfig: { topK: 3 }, - }, - options: { temperature: 0.2 }, - })) { - received.push(chunk); - } - - expect(mocks.generateContentStreamSpy).toHaveBeenCalledTimes(1); - const [streamPayload] = mocks.generateContentStreamSpy.mock.calls[0]; - expect(streamPayload.config?.topK).toBe(3); - expect(received[0]).toMatchObject({ - type: "content", - delta: "Partly ", - content: "Partly ", - }); - expect(received[1]).toMatchObject({ - type: "content", - delta: "cloudy", - content: "Partly cloudy", - }); - expect(received.at(-1)).toMatchObject({ - type: "done", - finishReason: "stop", - usage: { - promptTokens: 4, - completionTokens: 2, - totalTokens: 6, - }, - }); - }); - - it("uses summarize function with models API", async () => { - const summaryText = "Short and sweet."; - mocks.generateContentSpy.mockResolvedValueOnce({ - candidates: [ - { - content: { - parts: [{ text: summaryText }], - }, - }, - ], - }); - - const adapter = createAdapter(); - const result = await summarize({ - adapter, - model: "gemini-2.5-flash", - text: "A very long passage that needs to be shortened", - maxLength: 123, - style: "paragraph", - }); - - expect(mocks.generateContentSpy).toHaveBeenCalledTimes(1); - const [payload] = mocks.generateContentSpy.mock.calls[0]; - expect(payload.model).toBe("gemini-2.5-flash"); - expect(payload.config).toMatchObject({ - temperature: 0.3, - maxOutputTokens: 123, - }); - expect(result.summary).toBe(summaryText); - }); - - it("creates embeddings via embedding function", async () => { - mocks.embedContentSpy.mockResolvedValueOnce({ - embeddings: [ - { values: [0.1, 0.2] }, - { values: [0.3, 0.4] }, - ], - }); - - const adapter = createAdapter(); - const result = await embedding({ - adapter, - model: "gemini-embedding-001" as "gemini-2.5-pro", // type workaround for embedding model - input: ["doc one", "doc two"], - }); - - expect(mocks.embedContentSpy).toHaveBeenCalledTimes(1); - const [payload] = mocks.embedContentSpy.mock.calls[0]; - expect(payload.model).toBe("gemini-embedding-001"); - expect(payload.contents).toEqual(["doc one", "doc two"]); - expect(result.embeddings).toEqual([ - [0.1, 0.2], - [0.3, 0.4], - ]); - }); -}); +import { describe, it, expect, beforeEach, vi } from 'vitest' +import { chat, summarize, embedding } from '@tanstack/ai' +import type { Tool, StreamChunk } from '@tanstack/ai' +import type { + HarmBlockThreshold, + HarmCategory, + SafetySetting, +} from '@google/genai' +import type { Schema } from '../src/tools/function-declaration-tool' +import { + GeminiAdapter, + type GeminiProviderOptions, +} from '../src/gemini-adapter' + +const mocks = vi.hoisted(() => { + return { + constructorSpy: vi.fn<(options: { apiKey: string }) => void>(), + generateContentSpy: vi.fn(), + generateContentStreamSpy: vi.fn(), + embedContentSpy: vi.fn(), + getGenerativeModelSpy: vi.fn(), + } +}) + +vi.mock('@google/genai', () => { + const { + constructorSpy, + generateContentSpy, + generateContentStreamSpy, + embedContentSpy, + getGenerativeModelSpy, + } = mocks + + class MockGoogleGenAI { + public models = { + generateContent: generateContentSpy, + generateContentStream: generateContentStreamSpy, + embedContent: embedContentSpy, + } + + public getGenerativeModel = getGenerativeModelSpy + + constructor(options: { apiKey: string }) { + constructorSpy(options) + } + } + + return { GoogleGenAI: MockGoogleGenAI } +}) + +const createAdapter = () => new GeminiAdapter({ apiKey: 'test-key' }) + +const weatherTool: Tool = { + type: 'function', + function: { + name: 'lookup_weather', + description: 'Return the weather for a location', + parameters: { + type: 'object', + properties: { + location: { type: 'string' }, + }, + required: ['location'], + }, + }, +} + +const createStream = (chunks: Array>) => { + return (async function* () { + for (const chunk of chunks) { + yield chunk + } + })() +} + +describe('GeminiAdapter through AI', () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it('maps provider options for chat streaming', async () => { + const streamChunks = [ + { + candidates: [ + { + content: { + parts: [{ text: 'Sunny skies ahead' }], + }, + finishReason: 'STOP', + }, + ], + usageMetadata: { + promptTokenCount: 3, + thoughtsTokenCount: 1, + totalTokenCount: 4, + }, + }, + ] + + mocks.generateContentStreamSpy.mockResolvedValue(createStream(streamChunks)) + + const adapter = createAdapter() + + // Consume the stream to trigger the API call + for await (const _ of chat({ + adapter, + model: 'gemini-2.5-pro', + messages: [{ role: 'user', content: 'How is the weather in Madrid?' }], + providerOptions: { + generationConfig: { topK: 9 }, + }, + options: { + temperature: 0.4, + topP: 0.8, + maxTokens: 256, + }, + tools: [weatherTool], + })) { + /* consume stream */ + } + + expect(mocks.generateContentStreamSpy).toHaveBeenCalledTimes(1) + const [payload] = mocks.generateContentStreamSpy.mock.calls[0] + expect(payload.model).toBe('gemini-2.5-pro') + expect(payload.config).toMatchObject({ + temperature: 0.4, + topP: 0.8, + maxOutputTokens: 256, + topK: 9, + }) + expect(payload.config?.tools?.[0]?.functionDeclarations?.[0]?.name).toBe( + 'lookup_weather', + ) + expect(payload.contents).toEqual([ + { + role: 'user', + parts: [{ text: 'How is the weather in Madrid?' }], + }, + ]) + }) + + it('maps every common and provider option into the Gemini payload', async () => { + const streamChunks = [ + { + candidates: [ + { + content: { + parts: [{ text: '' }], + }, + finishReason: 'STOP', + }, + ], + usageMetadata: undefined, + }, + ] + + mocks.generateContentStreamSpy.mockResolvedValue(createStream(streamChunks)) + + const safetySettings: SafetySetting[] = [ + { + category: 'HARM_CATEGORY_HATE_SPEECH' as HarmCategory, + threshold: 'BLOCK_LOW_AND_ABOVE' as HarmBlockThreshold, + }, + ] + + const responseSchema: Schema = { + type: 'OBJECT', + properties: { + summary: { type: 'STRING' }, + }, + } + + const responseJsonSchema: Schema = { + type: 'OBJECT', + properties: { + ok: { type: 'BOOLEAN' }, + }, + } + + const providerOptions: GeminiProviderOptions = { + safetySettings, + generationConfig: { + stopSequences: ['', '###'], + responseMimeType: 'application/json', + responseSchema, + responseJsonSchema, + responseModalities: ['TEXT'], + candidateCount: 2, + topK: 6, + seed: 7, + presencePenalty: 0.2, + frequencyPenalty: 0.4, + responseLogprobs: true, + logprobs: 3, + enableEnhancedCivicAnswers: true, + speechConfig: { + voiceConfig: { + prebuiltVoiceConfig: { + voiceName: 'Studio', + }, + }, + }, + thinkingConfig: { + includeThoughts: true, + thinkingBudget: 128, + }, + imageConfig: { + aspectRatio: '1:1', + }, + }, + cachedContent: 'cachedContents/weather-context', + } as const + + const adapter = createAdapter() + + // Consume the stream to trigger the API call + for await (const _ of chat({ + adapter, + model: 'gemini-2.5-pro', + messages: [{ role: 'user', content: 'Provide structured response' }], + options: { + temperature: 0.61, + topP: 0.37, + maxTokens: 512, + }, + systemPrompts: ['Stay concise', 'Return JSON'], + providerOptions, + })) { + /* consume stream */ + } + + expect(mocks.generateContentStreamSpy).toHaveBeenCalledTimes(1) + const [payload] = mocks.generateContentStreamSpy.mock.calls[0] + const config = payload.config + + expect(config.temperature).toBe(0.61) + expect(config.topP).toBe(0.37) + expect(config.maxOutputTokens).toBe(512) + expect(config.cachedContent).toBe(providerOptions.cachedContent) + expect(config.safetySettings).toEqual(providerOptions.safetySettings) + expect(config.generationConfig).toEqual(providerOptions.generationConfig) + expect(config.stopSequences).toEqual( + providerOptions.generationConfig?.stopSequences, + ) + expect(config.responseMimeType).toBe( + providerOptions.generationConfig?.responseMimeType, + ) + expect(config.responseSchema).toEqual( + providerOptions.generationConfig?.responseSchema, + ) + expect(config.responseJsonSchema).toEqual( + providerOptions.generationConfig?.responseJsonSchema, + ) + expect(config.responseModalities).toEqual( + providerOptions.generationConfig?.responseModalities, + ) + expect(config.candidateCount).toBe( + providerOptions.generationConfig?.candidateCount, + ) + expect(config.topK).toBe(providerOptions.generationConfig?.topK) + expect(config.seed).toBe(providerOptions.generationConfig?.seed) + expect(config.presencePenalty).toBe( + providerOptions.generationConfig?.presencePenalty, + ) + expect(config.frequencyPenalty).toBe( + providerOptions.generationConfig?.frequencyPenalty, + ) + expect(config.responseLogprobs).toBe( + providerOptions.generationConfig?.responseLogprobs, + ) + expect(config.logprobs).toBe(providerOptions.generationConfig?.logprobs) + expect(config.enableEnhancedCivicAnswers).toBe( + providerOptions.generationConfig?.enableEnhancedCivicAnswers, + ) + expect(config.speechConfig).toEqual( + providerOptions.generationConfig?.speechConfig, + ) + expect(config.thinkingConfig).toEqual( + providerOptions.generationConfig?.thinkingConfig, + ) + expect(config.imageConfig).toEqual( + providerOptions.generationConfig?.imageConfig, + ) + }) + + it('streams chat chunks using mapped provider config', async () => { + const streamChunks = [ + { + candidates: [ + { + content: { + parts: [{ text: 'Partly ' }], + }, + }, + ], + }, + { + candidates: [ + { + content: { + parts: [{ text: 'cloudy' }], + }, + finishReason: 'STOP', + }, + ], + usageMetadata: { + promptTokenCount: 4, + thoughtsTokenCount: 2, + totalTokenCount: 6, + }, + }, + ] + + mocks.generateContentStreamSpy.mockResolvedValue(createStream(streamChunks)) + + const adapter = createAdapter() + const received: StreamChunk[] = [] + for await (const chunk of chat({ + adapter, + model: 'gemini-2.5-pro', + messages: [{ role: 'user', content: 'Tell me a joke' }], + providerOptions: { + generationConfig: { topK: 3 }, + }, + options: { temperature: 0.2 }, + })) { + received.push(chunk) + } + + expect(mocks.generateContentStreamSpy).toHaveBeenCalledTimes(1) + const [streamPayload] = mocks.generateContentStreamSpy.mock.calls[0] + expect(streamPayload.config?.topK).toBe(3) + expect(received[0]).toMatchObject({ + type: 'content', + delta: 'Partly ', + content: 'Partly ', + }) + expect(received[1]).toMatchObject({ + type: 'content', + delta: 'cloudy', + content: 'Partly cloudy', + }) + expect(received.at(-1)).toMatchObject({ + type: 'done', + finishReason: 'stop', + usage: { + promptTokens: 4, + completionTokens: 2, + totalTokens: 6, + }, + }) + }) + + it('uses summarize function with models API', async () => { + const summaryText = 'Short and sweet.' + mocks.generateContentSpy.mockResolvedValueOnce({ + candidates: [ + { + content: { + parts: [{ text: summaryText }], + }, + }, + ], + }) + + const adapter = createAdapter() + const result = await summarize({ + adapter, + model: 'gemini-2.5-flash', + text: 'A very long passage that needs to be shortened', + maxLength: 123, + style: 'paragraph', + }) + + expect(mocks.generateContentSpy).toHaveBeenCalledTimes(1) + const [payload] = mocks.generateContentSpy.mock.calls[0] + expect(payload.model).toBe('gemini-2.5-flash') + expect(payload.config).toMatchObject({ + temperature: 0.3, + maxOutputTokens: 123, + }) + expect(result.summary).toBe(summaryText) + }) + + it('creates embeddings via embedding function', async () => { + mocks.embedContentSpy.mockResolvedValueOnce({ + embeddings: [{ values: [0.1, 0.2] }, { values: [0.3, 0.4] }], + }) + + const adapter = createAdapter() + const result = await embedding({ + adapter, + model: 'gemini-embedding-001' as 'gemini-2.5-pro', // type workaround for embedding model + input: ['doc one', 'doc two'], + }) + + expect(mocks.embedContentSpy).toHaveBeenCalledTimes(1) + const [payload] = mocks.embedContentSpy.mock.calls[0] + expect(payload.model).toBe('gemini-embedding-001') + expect(payload.contents).toEqual(['doc one', 'doc two']) + expect(result.embeddings).toEqual([ + [0.1, 0.2], + [0.3, 0.4], + ]) + }) +}) diff --git a/packages/typescript/ai-gemini/tests/model-meta.test.ts b/packages/typescript/ai-gemini/tests/model-meta.test.ts index 23d05144a..c9cdecd59 100644 --- a/packages/typescript/ai-gemini/tests/model-meta.test.ts +++ b/packages/typescript/ai-gemini/tests/model-meta.test.ts @@ -1,257 +1,331 @@ -import { describe, it, expectTypeOf } from "vitest"; -import type { - GeminiChatModelProviderOptionsByName, -} from "../src/model-meta"; -import type { - GeminiThinkingOptions, - GeminiStructuredOutputOptions, - GeminiToolConfigOptions, - GeminiSafetyOptions, - GeminiGenerationConfigOptions, - GeminiCachedContentOptions, -} from "../src/text/text-provider-options"; - -/** - * Type assertion tests for Gemini model provider options. - * - * These tests verify that: - * 1. Models with thinking support have GeminiThinkingOptions in their provider options - * 2. Models without thinking support do NOT have GeminiThinkingOptions - * 3. Models with structured output support have GeminiStructuredOutputOptions - * 4. All models have base options (tool config, safety, generation config, cached content) - */ - -// Base options that ALL chat models should have -type BaseOptions = GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions; - -describe("Gemini Model Provider Options Type Assertions", () => { - describe("Models WITH thinking support", () => { - it("gemini-3-pro-preview should support thinking options", () => { - type Model = "gemini-3-pro-preview"; - type Options = GeminiChatModelProviderOptionsByName[Model]; - - // Should have thinking options - expectTypeOf().toExtend(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - - // Verify specific properties exist - expectTypeOf().toHaveProperty("generationConfig"); - expectTypeOf().toHaveProperty("safetySettings"); - expectTypeOf().toHaveProperty("toolConfig"); - expectTypeOf().toHaveProperty("cachedContent"); - expectTypeOf().toHaveProperty("responseMimeType"); - expectTypeOf().toHaveProperty("responseSchema"); - }); - - it("gemini-2.5-pro should support thinking options", () => { - type Model = "gemini-2.5-pro"; - type Options = GeminiChatModelProviderOptionsByName[Model]; - - // Should have thinking options - expectTypeOf().toExtend(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - }); - - it("gemini-2.5-flash should support thinking options", () => { - type Model = "gemini-2.5-flash"; - type Options = GeminiChatModelProviderOptionsByName[Model]; - - // Should have thinking options - expectTypeOf().toExtend(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - }); - - it("gemini-2.5-flash-preview-09-2025 should support thinking options", () => { - type Model = "gemini-2.5-flash-preview-09-2025"; - type Options = GeminiChatModelProviderOptionsByName[Model]; - - // Should have thinking options - expectTypeOf().toExtend(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - }); - - it("gemini-2.5-flash-lite should support thinking options", () => { - type Model = "gemini-2.5-flash-lite"; - type Options = GeminiChatModelProviderOptionsByName[Model]; - - // Should have thinking options - expectTypeOf().toExtend(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - }); - - it("gemini-2.5-flash-lite-preview-09-2025 should support thinking options", () => { - type Model = "gemini-2.5-flash-lite-preview-09-2025"; - type Options = GeminiChatModelProviderOptionsByName[Model]; - - // Should have thinking options - expectTypeOf().toExtend(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - }); - }); - - describe("Models WITHOUT thinking support", () => { - it("gemini-2.0-flash should NOT have thinking options in type definition", () => { - type Model = "gemini-2.0-flash"; - type Options = GeminiChatModelProviderOptionsByName[Model]; - - // Should NOT have thinking options - verify it's not assignable - // GeminiThinkingOptions has generationConfig.thinkingConfig which should not exist - expectTypeOf().not.toExtend< - GeminiThinkingOptions - >(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - - // Verify specific properties exist for structured output - expectTypeOf().toHaveProperty("responseMimeType"); - expectTypeOf().toHaveProperty("responseSchema"); - }); - - it("gemini-2.0-flash-lite should NOT have thinking options in type definition", () => { - type Model = "gemini-2.0-flash-lite"; - type Options = GeminiChatModelProviderOptionsByName[Model]; - - // Should NOT have thinking options - expectTypeOf().not.toExtend< - GeminiThinkingOptions - >(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - }); - }); - - describe("Provider options type completeness", () => { - it("GeminiChatModelProviderOptionsByName should have entries for all chat models", () => { - // Verify the type map has all expected model keys - type Keys = keyof GeminiChatModelProviderOptionsByName; - - expectTypeOf<"gemini-3-pro-preview">().toExtend(); - expectTypeOf<"gemini-2.5-pro">().toExtend(); - expectTypeOf<"gemini-2.5-flash">().toExtend(); - expectTypeOf<"gemini-2.5-flash-preview-09-2025">().toExtend(); - expectTypeOf<"gemini-2.5-flash-lite">().toExtend(); - expectTypeOf<"gemini-2.5-flash-lite-preview-09-2025">().toExtend(); - expectTypeOf<"gemini-2.0-flash">().toExtend(); - expectTypeOf<"gemini-2.0-flash-lite">().toExtend(); - }); - }); - - describe("Detailed property type assertions", () => { - it("thinking models should allow thinkingConfig in generationConfig", () => { - type Options = GeminiChatModelProviderOptionsByName["gemini-2.5-pro"]; - - // The generationConfig should include thinkingConfig from GeminiGenerationConfigOptions - // which intersects with GeminiThinkingOptions - expectTypeOf().toHaveProperty("generationConfig"); - }); - - it("structured output options should have responseMimeType and responseSchema", () => { - type Options = GeminiChatModelProviderOptionsByName["gemini-2.0-flash"]; - - expectTypeOf().toHaveProperty("responseMimeType"); - expectTypeOf().toHaveProperty("responseSchema"); - expectTypeOf().toHaveProperty("responseJsonSchema"); - }); - - it("all models should have safety settings", () => { - expectTypeOf().toHaveProperty("safetySettings"); - expectTypeOf().toHaveProperty("safetySettings"); - expectTypeOf().toHaveProperty("safetySettings"); - expectTypeOf().toHaveProperty("safetySettings"); - expectTypeOf().toHaveProperty("safetySettings"); - expectTypeOf().toHaveProperty("safetySettings"); - expectTypeOf().toHaveProperty("safetySettings"); - expectTypeOf().toHaveProperty("safetySettings"); - }); - - it("all models should have tool config", () => { - expectTypeOf().toHaveProperty("toolConfig"); - expectTypeOf().toHaveProperty("toolConfig"); - expectTypeOf().toHaveProperty("toolConfig"); - expectTypeOf().toHaveProperty("toolConfig"); - expectTypeOf().toHaveProperty("toolConfig"); - expectTypeOf().toHaveProperty("toolConfig"); - expectTypeOf().toHaveProperty("toolConfig"); - expectTypeOf().toHaveProperty("toolConfig"); - }); - - it("all models should have cached content option", () => { - expectTypeOf().toHaveProperty("cachedContent"); - expectTypeOf().toHaveProperty("cachedContent"); - expectTypeOf().toHaveProperty("cachedContent"); - expectTypeOf().toHaveProperty("cachedContent"); - expectTypeOf().toHaveProperty("cachedContent"); - expectTypeOf().toHaveProperty("cachedContent"); - expectTypeOf().toHaveProperty("cachedContent"); - expectTypeOf().toHaveProperty("cachedContent"); - }); - }); - - describe("Type discrimination between model categories", () => { - it("models with thinking should extend GeminiThinkingOptions", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("models without thinking should NOT extend GeminiThinkingOptions", () => { - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - }); - - it("all models should extend GeminiStructuredOutputOptions", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - }); -}); +import { describe, it, expectTypeOf } from 'vitest' +import type { GeminiChatModelProviderOptionsByName } from '../src/model-meta' +import type { + GeminiThinkingOptions, + GeminiStructuredOutputOptions, + GeminiToolConfigOptions, + GeminiSafetyOptions, + GeminiGenerationConfigOptions, + GeminiCachedContentOptions, +} from '../src/text/text-provider-options' + +/** + * Type assertion tests for Gemini model provider options. + * + * These tests verify that: + * 1. Models with thinking support have GeminiThinkingOptions in their provider options + * 2. Models without thinking support do NOT have GeminiThinkingOptions + * 3. Models with structured output support have GeminiStructuredOutputOptions + * 4. All models have base options (tool config, safety, generation config, cached content) + */ + +// Base options that ALL chat models should have +type BaseOptions = GeminiToolConfigOptions & + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions + +describe('Gemini Model Provider Options Type Assertions', () => { + describe('Models WITH thinking support', () => { + it('gemini-3-pro-preview should support thinking options', () => { + type Model = 'gemini-3-pro-preview' + type Options = GeminiChatModelProviderOptionsByName[Model] + + // Should have thinking options + expectTypeOf().toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + + // Verify specific properties exist + expectTypeOf().toHaveProperty('generationConfig') + expectTypeOf().toHaveProperty('safetySettings') + expectTypeOf().toHaveProperty('toolConfig') + expectTypeOf().toHaveProperty('cachedContent') + expectTypeOf().toHaveProperty('responseMimeType') + expectTypeOf().toHaveProperty('responseSchema') + }) + + it('gemini-2.5-pro should support thinking options', () => { + type Model = 'gemini-2.5-pro' + type Options = GeminiChatModelProviderOptionsByName[Model] + + // Should have thinking options + expectTypeOf().toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + }) + + it('gemini-2.5-flash should support thinking options', () => { + type Model = 'gemini-2.5-flash' + type Options = GeminiChatModelProviderOptionsByName[Model] + + // Should have thinking options + expectTypeOf().toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + }) + + it('gemini-2.5-flash-preview-09-2025 should support thinking options', () => { + type Model = 'gemini-2.5-flash-preview-09-2025' + type Options = GeminiChatModelProviderOptionsByName[Model] + + // Should have thinking options + expectTypeOf().toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + }) + + it('gemini-2.5-flash-lite should support thinking options', () => { + type Model = 'gemini-2.5-flash-lite' + type Options = GeminiChatModelProviderOptionsByName[Model] + + // Should have thinking options + expectTypeOf().toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + }) + + it('gemini-2.5-flash-lite-preview-09-2025 should support thinking options', () => { + type Model = 'gemini-2.5-flash-lite-preview-09-2025' + type Options = GeminiChatModelProviderOptionsByName[Model] + + // Should have thinking options + expectTypeOf().toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + }) + }) + + describe('Models WITHOUT thinking support', () => { + it('gemini-2.0-flash should NOT have thinking options in type definition', () => { + type Model = 'gemini-2.0-flash' + type Options = GeminiChatModelProviderOptionsByName[Model] + + // Should NOT have thinking options - verify it's not assignable + // GeminiThinkingOptions has generationConfig.thinkingConfig which should not exist + expectTypeOf().not.toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + + // Verify specific properties exist for structured output + expectTypeOf().toHaveProperty('responseMimeType') + expectTypeOf().toHaveProperty('responseSchema') + }) + + it('gemini-2.0-flash-lite should NOT have thinking options in type definition', () => { + type Model = 'gemini-2.0-flash-lite' + type Options = GeminiChatModelProviderOptionsByName[Model] + + // Should NOT have thinking options + expectTypeOf().not.toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + }) + }) + + describe('Provider options type completeness', () => { + it('GeminiChatModelProviderOptionsByName should have entries for all chat models', () => { + // Verify the type map has all expected model keys + type Keys = keyof GeminiChatModelProviderOptionsByName + + expectTypeOf<'gemini-3-pro-preview'>().toExtend() + expectTypeOf<'gemini-2.5-pro'>().toExtend() + expectTypeOf<'gemini-2.5-flash'>().toExtend() + expectTypeOf<'gemini-2.5-flash-preview-09-2025'>().toExtend() + expectTypeOf<'gemini-2.5-flash-lite'>().toExtend() + expectTypeOf<'gemini-2.5-flash-lite-preview-09-2025'>().toExtend() + expectTypeOf<'gemini-2.0-flash'>().toExtend() + expectTypeOf<'gemini-2.0-flash-lite'>().toExtend() + }) + }) + + describe('Detailed property type assertions', () => { + it('thinking models should allow thinkingConfig in generationConfig', () => { + type Options = GeminiChatModelProviderOptionsByName['gemini-2.5-pro'] + + // The generationConfig should include thinkingConfig from GeminiGenerationConfigOptions + // which intersects with GeminiThinkingOptions + expectTypeOf().toHaveProperty('generationConfig') + }) + + it('structured output options should have responseMimeType and responseSchema', () => { + type Options = GeminiChatModelProviderOptionsByName['gemini-2.0-flash'] + + expectTypeOf().toHaveProperty('responseMimeType') + expectTypeOf().toHaveProperty('responseSchema') + expectTypeOf().toHaveProperty('responseJsonSchema') + }) + + it('all models should have safety settings', () => { + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-3-pro-preview'] + >().toHaveProperty('safetySettings') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-pro'] + >().toHaveProperty('safetySettings') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash'] + >().toHaveProperty('safetySettings') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-preview-09-2025'] + >().toHaveProperty('safetySettings') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite'] + >().toHaveProperty('safetySettings') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025'] + >().toHaveProperty('safetySettings') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash'] + >().toHaveProperty('safetySettings') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash-lite'] + >().toHaveProperty('safetySettings') + }) + + it('all models should have tool config', () => { + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-3-pro-preview'] + >().toHaveProperty('toolConfig') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-pro'] + >().toHaveProperty('toolConfig') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash'] + >().toHaveProperty('toolConfig') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-preview-09-2025'] + >().toHaveProperty('toolConfig') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite'] + >().toHaveProperty('toolConfig') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025'] + >().toHaveProperty('toolConfig') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash'] + >().toHaveProperty('toolConfig') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash-lite'] + >().toHaveProperty('toolConfig') + }) + + it('all models should have cached content option', () => { + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-3-pro-preview'] + >().toHaveProperty('cachedContent') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-pro'] + >().toHaveProperty('cachedContent') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash'] + >().toHaveProperty('cachedContent') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-preview-09-2025'] + >().toHaveProperty('cachedContent') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite'] + >().toHaveProperty('cachedContent') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025'] + >().toHaveProperty('cachedContent') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash'] + >().toHaveProperty('cachedContent') + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash-lite'] + >().toHaveProperty('cachedContent') + }) + }) + + describe('Type discrimination between model categories', () => { + it('models with thinking should extend GeminiThinkingOptions', () => { + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-3-pro-preview'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-pro'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-preview-09-2025'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025'] + >().toExtend() + }) + + it('models without thinking should NOT extend GeminiThinkingOptions', () => { + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash'] + >().not.toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash-lite'] + >().not.toExtend() + }) + + it('all models should extend GeminiStructuredOutputOptions', () => { + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-3-pro-preview'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-pro'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-preview-09-2025'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.5-flash-lite-preview-09-2025'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash'] + >().toExtend() + expectTypeOf< + GeminiChatModelProviderOptionsByName['gemini-2.0-flash-lite'] + >().toExtend() + }) + }) +}) diff --git a/packages/typescript/ai-gemini/tsconfig.json b/packages/typescript/ai-gemini/tsconfig.json index 204ca8d3f..ea11c1096 100644 --- a/packages/typescript/ai-gemini/tsconfig.json +++ b/packages/typescript/ai-gemini/tsconfig.json @@ -5,6 +5,5 @@ "rootDir": "src" }, "include": ["src/**/*.ts", "src/**/*.tsx"], - "exclude": ["node_modules", "dist", "**/*.config.ts"], - "references": [{ "path": "../ai" }] + "exclude": ["node_modules", "dist", "**/*.config.ts"] } diff --git a/packages/typescript/ai-gemini/tsdown.config.ts b/packages/typescript/ai-gemini/tsdown.config.ts index e5d9cb35a..773c32c65 100644 --- a/packages/typescript/ai-gemini/tsdown.config.ts +++ b/packages/typescript/ai-gemini/tsdown.config.ts @@ -1,12 +1,12 @@ -import { defineConfig } from "tsdown"; +import { defineConfig } from 'tsdown' export default defineConfig({ - entry: ["./src/index.ts"], - format: ["esm"], + entry: ['./src/index.ts'], + format: ['esm'], unbundle: true, dts: true, sourcemap: true, clean: true, minify: false, - external: ["@google/generative-ai"], -}); + external: ['@google/generative-ai'], +}) diff --git a/packages/typescript/ai-gemini/vite.config.ts b/packages/typescript/ai-gemini/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/ai-gemini/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/ai-gemini/vitest.config.ts b/packages/typescript/ai-gemini/vitest.config.ts index 8fa8bfb9e..fa2531743 100644 --- a/packages/typescript/ai-gemini/vitest.config.ts +++ b/packages/typescript/ai-gemini/vitest.config.ts @@ -1,22 +1,22 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - globals: true, - environment: "node", - include: ["tests/**/*.test.ts"], - coverage: { - provider: "v8", - reporter: ["text", "json", "html", "lcov"], - exclude: [ - "node_modules/", - "dist/", - "tests/", - "**/*.test.ts", - "**/*.config.ts", - "**/types.ts", - ], - include: ["src/**/*.ts"], - }, - }, -}); +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) diff --git a/packages/typescript/ai-ollama/package.json b/packages/typescript/ai-ollama/package.json index 6079e949d..d53696d5d 100644 --- a/packages/typescript/ai-ollama/package.json +++ b/packages/typescript/ai-ollama/package.json @@ -10,12 +10,12 @@ "directory": "packages/typescript/ai-ollama" }, "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" } }, "files": [ @@ -44,7 +44,6 @@ "@tanstack/ai": "workspace:*", "ollama": "^0.6.3" }, - "devDependencies": {}, "peerDependencies": { "@tanstack/ai": "workspace:*" } diff --git a/packages/typescript/ai-ollama/src/index.ts b/packages/typescript/ai-ollama/src/index.ts index d301d2a76..47ec1a8ca 100644 --- a/packages/typescript/ai-ollama/src/index.ts +++ b/packages/typescript/ai-ollama/src/index.ts @@ -1,2 +1,6 @@ -export { Ollama, createOllama, ollama, type OllamaConfig } from "./ollama-adapter"; - +export { + Ollama, + createOllama, + ollama, + type OllamaConfig, +} from './ollama-adapter' diff --git a/packages/typescript/ai-ollama/src/ollama-adapter.ts b/packages/typescript/ai-ollama/src/ollama-adapter.ts index 0332999f8..085938c17 100644 --- a/packages/typescript/ai-ollama/src/ollama-adapter.ts +++ b/packages/typescript/ai-ollama/src/ollama-adapter.ts @@ -1,40 +1,40 @@ -import { Ollama as OllamaSDK } from "ollama"; -import { - BaseAdapter, - type ChatOptions, - type SummarizationOptions, - type SummarizationResult, - type EmbeddingOptions, - type EmbeddingResult, - type StreamChunk, -} from "@tanstack/ai"; +import { Ollama as OllamaSDK } from 'ollama' +import { BaseAdapter } from '@tanstack/ai' +import type { + ChatOptions, + EmbeddingOptions, + EmbeddingResult, + StreamChunk, + SummarizationOptions, + SummarizationResult, +} from '@tanstack/ai' export interface OllamaConfig { - host?: string; + host?: string } const OLLAMA_MODELS = [ - "llama2", - "llama3", - "codellama", - "mistral", - "mixtral", - "phi", - "neural-chat", - "starling-lm", - "orca-mini", - "vicuna", - "nous-hermes", - "nomic-embed-text", - "gpt-oss:20b", -] as const; - -const OLLAMA_IMAGE_MODELS = [] as const; -const OLLAMA_EMBEDDING_MODELS = [] as const; -const OLLAMA_AUDIO_MODELS = [] as const; -const OLLAMA_VIDEO_MODELS = [] as const; - -export type OllamaModel = (typeof OLLAMA_MODELS)[number]; + 'llama2', + 'llama3', + 'codellama', + 'mistral', + 'mixtral', + 'phi', + 'neural-chat', + 'starling-lm', + 'orca-mini', + 'vicuna', + 'nous-hermes', + 'nomic-embed-text', + 'gpt-oss:20b', +] as const + +const OLLAMA_IMAGE_MODELS = [] as const +const OLLAMA_EMBEDDING_MODELS = [] as const +const OLLAMA_AUDIO_MODELS = [] as const +const OLLAMA_VIDEO_MODELS = [] as const + +export type OllamaModel = (typeof OLLAMA_MODELS)[number] /** * Ollama-specific provider options @@ -43,87 +43,87 @@ export type OllamaModel = (typeof OLLAMA_MODELS)[number]; */ export interface OllamaProviderOptions { /** Number of tokens to keep from the prompt */ - num_keep?: number; + num_keep?: number /** Number of tokens from context to consider for next token prediction */ - top_k?: number; + top_k?: number /** Minimum probability for nucleus sampling */ - min_p?: number; + min_p?: number /** Tail-free sampling parameter */ - tfs_z?: number; + tfs_z?: number /** Typical probability sampling parameter */ - typical_p?: number; + typical_p?: number /** Number of previous tokens to consider for repetition penalty */ - repeat_last_n?: number; + repeat_last_n?: number /** Penalty for repeating tokens */ - repeat_penalty?: number; + repeat_penalty?: number /** Enable Mirostat sampling (0=disabled, 1=Mirostat, 2=Mirostat 2.0) */ - mirostat?: number; + mirostat?: number /** Target entropy for Mirostat */ - mirostat_tau?: number; + mirostat_tau?: number /** Learning rate for Mirostat */ - mirostat_eta?: number; + mirostat_eta?: number /** Enable penalize_newline */ - penalize_newline?: boolean; + penalize_newline?: boolean /** Enable NUMA support */ - numa?: boolean; + numa?: boolean /** Context window size */ - num_ctx?: number; + num_ctx?: number /** Batch size for prompt processing */ - num_batch?: number; + num_batch?: number /** Number of GQA groups (for some models) */ - num_gqa?: number; + num_gqa?: number /** Number of GPU layers to use */ - num_gpu?: number; + num_gpu?: number /** GPU to use for inference */ - main_gpu?: number; + main_gpu?: number /** Use memory-mapped model */ - use_mmap?: boolean; + use_mmap?: boolean /** Use memory-locked model */ - use_mlock?: boolean; + use_mlock?: boolean /** Number of threads to use */ - num_thread?: number; + num_thread?: number } interface ChatCompletionChunk { - id: string; - model: string; - content: string; - role?: "assistant"; - finishReason?: "stop" | "length" | "content_filter" | null; + id: string + model: string + content: string + role?: 'assistant' + finishReason?: 'stop' | 'length' | 'content_filter' | null usage?: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; + promptTokens: number + completionTokens: number + totalTokens: number + } } async function* convertChatCompletionStream( stream: AsyncIterable, - _model: string + _model: string, ): AsyncIterable { - let accumulatedContent = ""; - const timestamp = Date.now(); - let nextToolIndex = 0; + let accumulatedContent = '' + const timestamp = Date.now() + let nextToolIndex = 0 for await (const chunk of stream) { if (chunk.content) { - accumulatedContent += chunk.content; + accumulatedContent += chunk.content yield { - type: "content", + type: 'content', id: chunk.id, model: chunk.model, timestamp, delta: chunk.content, content: accumulatedContent, role: chunk.role, - }; + } } // Handle tool calls if present if (chunk.toolCalls && chunk.toolCalls.length > 0) { for (const toolCall of chunk.toolCalls) { yield { - type: "tool_call", + type: 'tool_call', id: chunk.id, model: chunk.model, timestamp, @@ -136,19 +136,19 @@ async function* convertChatCompletionStream( }, }, index: nextToolIndex++, - }; + } } } if (chunk.finishReason) { yield { - type: "done", + type: 'done', id: chunk.id, model: chunk.model, timestamp, finishReason: chunk.finishReason, usage: chunk.usage, - }; + } } } } @@ -157,19 +157,21 @@ async function* convertChatCompletionStream( * Converts standard Tool format to Ollama-specific tool format * Ollama uses OpenAI-compatible tool format */ -function convertToolsToOllamaFormat(tools?: any[]): any[] | undefined { +function convertToolsToOllamaFormat( + tools?: Array, +): Array | undefined { if (!tools || tools.length === 0) { - return undefined; + return undefined } return tools.map((tool) => ({ - type: "function", + type: 'function', function: { name: tool.function.name, description: tool.function.description, parameters: tool.function.parameters, }, - })); + })) } /** @@ -178,24 +180,24 @@ function convertToolsToOllamaFormat(tools?: any[]): any[] | undefined { */ function mapCommonOptionsToOllama( options: ChatOptions, - providerOpts?: OllamaProviderOptions + providerOpts?: OllamaProviderOptions, ): any { const ollamaOptions = { temperature: options.options?.temperature, top_p: options.options?.topP, num_predict: options.options?.maxTokens, - }; + } // Apply Ollama-specific provider options if (providerOpts) { - Object.assign(ollamaOptions, providerOpts); + Object.assign(ollamaOptions, providerOpts) } return { model: options.model, options: ollamaOptions, tools: convertToolsToOllamaFormat(options.tools), - }; + } } export class Ollama extends BaseAdapter< @@ -204,56 +206,56 @@ export class Ollama extends BaseAdapter< OllamaProviderOptions, Record > { - name = "ollama"; - models = OLLAMA_MODELS; - imageModels = OLLAMA_IMAGE_MODELS; - embeddingModels = OLLAMA_EMBEDDING_MODELS; - audioModels = OLLAMA_AUDIO_MODELS; - videoModels = OLLAMA_VIDEO_MODELS; - private client: OllamaSDK; + name = 'ollama' + models = OLLAMA_MODELS + imageModels = OLLAMA_IMAGE_MODELS + embeddingModels = OLLAMA_EMBEDDING_MODELS + audioModels = OLLAMA_AUDIO_MODELS + videoModels = OLLAMA_VIDEO_MODELS + private client: OllamaSDK constructor(config: OllamaConfig = {}) { - super({}); + super({}) this.client = new OllamaSDK({ - host: config.host || "http://localhost:11434", - }); + host: config.host || 'http://localhost:11434', + }) } async *chatCompletionStream( - options: ChatOptions + options: ChatOptions, ): AsyncIterable { const providerOpts = options.providerOptions as | OllamaProviderOptions - | undefined; + | undefined // Map common options to Ollama format - const mappedOptions = mapCommonOptionsToOllama(options, providerOpts); + const mappedOptions = mapCommonOptionsToOllama(options, providerOpts) // Format messages for Ollama (handle tool calls and tool results) const formattedMessages = options.messages.map((msg) => { const baseMessage: any = { - role: msg.role as "user" | "assistant" | "system", - content: msg.content || "", - }; + role: msg.role as 'user' | 'assistant' | 'system', + content: msg.content || '', + } // Handle tool calls (assistant messages) // Ollama expects arguments as an object, not a JSON string if ( - msg.role === "assistant" && + msg.role === 'assistant' && msg.toolCalls && msg.toolCalls.length > 0 ) { baseMessage.tool_calls = msg.toolCalls.map((toolCall) => { // Parse string arguments to object for Ollama - let parsedArguments: any = {}; - if (typeof toolCall.function.arguments === "string") { + let parsedArguments: any = {} + if (typeof toolCall.function.arguments === 'string') { try { - parsedArguments = JSON.parse(toolCall.function.arguments); + parsedArguments = JSON.parse(toolCall.function.arguments) } catch { - parsedArguments = {}; + parsedArguments = {} } } else { - parsedArguments = toolCall.function.arguments || {}; + parsedArguments = toolCall.function.arguments } return { @@ -263,22 +265,22 @@ export class Ollama extends BaseAdapter< name: toolCall.function.name, arguments: parsedArguments, }, - }; - }); + } + }) } // Handle tool results (tool messages) - if (msg.role === "tool" && msg.toolCallId) { - baseMessage.role = "tool"; - baseMessage.tool_call_id = msg.toolCallId; + if (msg.role === 'tool' && msg.toolCallId) { + baseMessage.role = 'tool' + baseMessage.tool_call_id = msg.toolCallId baseMessage.content = - typeof msg.content === "string" + typeof msg.content === 'string' ? msg.content - : JSON.stringify(msg.content); + : JSON.stringify(msg.content) } - return baseMessage; - }); + return baseMessage + }) const response = await this.client.chat({ model: mappedOptions.model, @@ -286,45 +288,45 @@ export class Ollama extends BaseAdapter< options: mappedOptions.options, tools: mappedOptions.tools, stream: true, - }); + }) - let hasToolCalls = false; + let hasToolCalls = false for await (const chunk of response) { // Check if tool calls are present in this chunk - const toolCalls = chunk.message.tool_calls || []; + const toolCalls = chunk.message.tool_calls || [] if (toolCalls.length > 0) { - hasToolCalls = true; + hasToolCalls = true } const result: ChatCompletionChunk = { id: this.generateId(), - model: chunk.model || options.model || "llama2", - content: chunk.message.content || "", - role: "assistant", + model: chunk.model || options.model || 'llama2', + content: chunk.message.content || '', + role: 'assistant', finishReason: chunk.done ? hasToolCalls - ? "tool_calls" - : "stop" + ? 'tool_calls' + : 'stop' : null, - }; + } // Handle tool calls if present if (toolCalls.length > 0) { result.toolCalls = toolCalls.map((tc: any) => ({ id: tc.id || this.generateId(), - type: tc.type || "function", + type: tc.type || 'function', function: { - name: tc.function?.name || "", + name: tc.function?.name || '', arguments: - typeof tc.function?.arguments === "string" + typeof tc.function?.arguments === 'string' ? tc.function.arguments : JSON.stringify(tc.function?.arguments || {}), }, - })); + })) } - yield result; + yield result } } @@ -333,25 +335,25 @@ export class Ollama extends BaseAdapter< // TODO: Implement native structured streaming for Ollama yield* convertChatCompletionStream( this.chatCompletionStream(options), - options.model || "llama2" - ); + options.model || 'llama2', + ) } async summarize(options: SummarizationOptions): Promise { - const prompt = this.buildSummarizationPrompt(options, options.text); + const prompt = this.buildSummarizationPrompt(options, options.text) const response = await this.client.generate({ - model: options.model || "llama2", + model: options.model || 'llama2', prompt, options: { temperature: 0.3, num_predict: options.maxLength || 500, }, stream: false, - }); + }) - const promptTokens = this.estimateTokens(prompt); - const completionTokens = this.estimateTokens(response.response); + const promptTokens = this.estimateTokens(prompt) + const completionTokens = this.estimateTokens(response.response) return { id: this.generateId(), @@ -362,71 +364,71 @@ export class Ollama extends BaseAdapter< completionTokens, totalTokens: promptTokens + completionTokens, }, - }; + } } async createEmbeddings(options: EmbeddingOptions): Promise { const inputs = Array.isArray(options.input) ? options.input - : [options.input]; - const embeddings: number[][] = []; + : [options.input] + const embeddings: Array> = [] for (const input of inputs) { const response = await this.client.embeddings({ - model: options.model || "nomic-embed-text", + model: options.model || 'nomic-embed-text', prompt: input, - }); - embeddings.push(response.embedding); + }) + embeddings.push(response.embedding) } const promptTokens = inputs.reduce( (sum, input) => sum + this.estimateTokens(input), - 0 - ); + 0, + ) return { id: this.generateId(), - model: options.model || "nomic-embed-text", + model: options.model || 'nomic-embed-text', embeddings, usage: { promptTokens, totalTokens: promptTokens, }, - }; + } } private buildSummarizationPrompt( options: SummarizationOptions, - text: string + text: string, ): string { - let prompt = "You are a professional summarizer. "; + let prompt = 'You are a professional summarizer. ' switch (options.style) { - case "bullet-points": - prompt += "Provide a summary in bullet point format. "; - break; - case "paragraph": - prompt += "Provide a summary in paragraph format. "; - break; - case "concise": - prompt += "Provide a very concise summary in 1-2 sentences. "; - break; + case 'bullet-points': + prompt += 'Provide a summary in bullet point format. ' + break + case 'paragraph': + prompt += 'Provide a summary in paragraph format. ' + break + case 'concise': + prompt += 'Provide a very concise summary in 1-2 sentences. ' + break default: - prompt += "Provide a clear and concise summary. "; + prompt += 'Provide a clear and concise summary. ' } if (options.focus && options.focus.length > 0) { - prompt += `Focus on the following aspects: ${options.focus.join(", ")}. `; + prompt += `Focus on the following aspects: ${options.focus.join(', ')}. ` } - prompt += `\n\nText to summarize:\n${text}\n\nSummary:`; + prompt += `\n\nText to summarize:\n${text}\n\nSummary:` - return prompt; + return prompt } private estimateTokens(text: string): number { // Rough approximation: 1 token ≈ 4 characters - return Math.ceil(text.length / 4); + return Math.ceil(text.length / 4) } } @@ -450,9 +452,9 @@ export class Ollama extends BaseAdapter< */ export function createOllama( host?: string, - config?: Omit + config?: Omit, ): Ollama { - return new Ollama({ host, ...config }); + return new Ollama({ host, ...config }) } /** @@ -473,14 +475,14 @@ export function createOllama( * const aiInstance = ai(ollama()); * ``` */ -export function ollama(config?: Omit): Ollama { +export function ollama(config?: Omit): Ollama { const env = - typeof globalThis !== "undefined" && (globalThis as any).window?.env + typeof globalThis !== 'undefined' && (globalThis as any).window?.env ? (globalThis as any).window.env - : typeof process !== "undefined" - ? process.env - : undefined; - const host = env?.OLLAMA_HOST; + : typeof process !== 'undefined' + ? process.env + : undefined + const host = env?.OLLAMA_HOST - return createOllama(host, config); + return createOllama(host, config) } diff --git a/packages/typescript/ai-ollama/tsconfig.json b/packages/typescript/ai-ollama/tsconfig.json index 204ca8d3f..ea11c1096 100644 --- a/packages/typescript/ai-ollama/tsconfig.json +++ b/packages/typescript/ai-ollama/tsconfig.json @@ -5,6 +5,5 @@ "rootDir": "src" }, "include": ["src/**/*.ts", "src/**/*.tsx"], - "exclude": ["node_modules", "dist", "**/*.config.ts"], - "references": [{ "path": "../ai" }] + "exclude": ["node_modules", "dist", "**/*.config.ts"] } diff --git a/packages/typescript/ai-ollama/tsdown.config.ts b/packages/typescript/ai-ollama/tsdown.config.ts index e3f56ca72..7ede38983 100644 --- a/packages/typescript/ai-ollama/tsdown.config.ts +++ b/packages/typescript/ai-ollama/tsdown.config.ts @@ -1,12 +1,12 @@ -import { defineConfig } from "tsdown"; +import { defineConfig } from 'tsdown' export default defineConfig({ - entry: ["./src/index.ts"], - format: ["esm"], + entry: ['./src/index.ts'], + format: ['esm'], unbundle: true, dts: true, sourcemap: true, clean: true, minify: false, - external: ["ollama"], -}); + external: ['ollama'], +}) diff --git a/packages/typescript/ai-ollama/vite.config.ts b/packages/typescript/ai-ollama/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/ai-ollama/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/ai-openai/live-tests/test-tool-arguments.ts b/packages/typescript/ai-openai/live-tests/test-tool-arguments.ts index eba25f042..cbf5e3b66 100644 --- a/packages/typescript/ai-openai/live-tests/test-tool-arguments.ts +++ b/packages/typescript/ai-openai/live-tests/test-tool-arguments.ts @@ -1,159 +1,159 @@ -import { chat, tool } from "@tanstack/ai"; -import { createOpenAI } from "../dist/openai-adapter.js"; -import guitars from "./example-guitars.js"; -import * as path from "path"; -import * as fs from "fs"; -import { fileURLToPath } from "url"; +import { chat, tool } from '@tanstack/ai' +import { createOpenAI } from '../dist/openai-adapter.js' +import guitars from './example-guitars.js' +import * as path from 'path' +import * as fs from 'fs' +import { fileURLToPath } from 'url' // Load .env.local file -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const envPath = path.join(__dirname, ".env.local"); +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const envPath = path.join(__dirname, '.env.local') -let apiKey = process.env.OPENAI_API_KEY; +let apiKey = process.env.OPENAI_API_KEY if (!apiKey && fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, "utf-8"); - const match = envContent.match(/^OPENAI_API_KEY=(.+)$/m); + const envContent = fs.readFileSync(envPath, 'utf-8') + const match = envContent.match(/^OPENAI_API_KEY=(.+)$/m) if (match) { - apiKey = match[1]?.trim(); + apiKey = match[1]?.trim() } } if (!apiKey) { - throw new Error("OPENAI_API_KEY is required in .env.local or environment"); + throw new Error('OPENAI_API_KEY is required in .env.local or environment') } const getGuitars = tool({ - type: "function", + type: 'function', function: { - name: "getGuitars", - description: "Get all products from the database", + name: 'getGuitars', + description: 'Get all products from the database', parameters: { - type: "object", + type: 'object', properties: {}, required: [], }, }, execute: async () => { - return JSON.stringify(guitars); + return JSON.stringify(guitars) }, -}); +}) const recommendGuitar = tool({ - type: "function", + type: 'function', function: { - name: "recommendGuitar", - description: "Use this tool to recommend a guitar to the user", + name: 'recommendGuitar', + description: 'Use this tool to recommend a guitar to the user', parameters: { - type: "object", + type: 'object', properties: { id: { - type: "string", - description: "The id of the guitar to recommend", + type: 'string', + description: 'The id of the guitar to recommend', }, }, - required: ["id"], + required: ['id'], }, }, execute: async ({ id }) => { - return JSON.stringify({ id }); + return JSON.stringify({ id }) }, -}); +}) async function testToolArguments() { - console.log("🧪 Testing tool argument parsing...\n"); + console.log('🧪 Testing tool argument parsing...\n') - const openai = createOpenAI(apiKey); - const tools = [getGuitars, recommendGuitar]; + const openai = createOpenAI(apiKey) + const tools = [getGuitars, recommendGuitar] const messages = [ { - role: "user" as const, + role: 'user' as const, content: - "please search your product catalog and recommend a good acoustic guitar", + 'please search your product catalog and recommend a good acoustic guitar', }, - ]; + ] - console.log("📤 Sending request to OpenAI...\n"); + console.log('📤 Sending request to OpenAI...\n') const toolCalls: Array<{ - id: string; - name: string; - arguments: string; - }> = []; + id: string + name: string + arguments: string + }> = [] try { for await (const chunk of chat({ adapter: openai, - model: "gpt-4o", + model: 'gpt-4o', messages, tools, })) { - if (chunk.type === "tool_call") { - const toolCall = chunk.toolCall; - const args = toolCall.function.arguments; + if (chunk.type === 'tool_call') { + const toolCall = chunk.toolCall + const args = toolCall.function.arguments toolCalls.push({ id: toolCall.id, name: toolCall.function.name, arguments: args, - }); - console.log(`🔧 Tool call: ${toolCall.function.name}`); - console.log(` ID: ${toolCall.id}`); - console.log(` Arguments: ${args}`); - console.log(` Arguments length: ${args?.length || 0}`); - console.log(); + }) + console.log(`🔧 Tool call: ${toolCall.function.name}`) + console.log(` ID: ${toolCall.id}`) + console.log(` Arguments: ${args}`) + console.log(` Arguments length: ${args?.length || 0}`) + console.log() } } - console.log("\n📊 Results:\n"); - console.log(`Total tool calls: ${toolCalls.length}\n`); + console.log('\n📊 Results:\n') + console.log(`Total tool calls: ${toolCalls.length}\n`) // Find the recommendGuitar call - const recommendCall = toolCalls.find((tc) => tc.name === "recommendGuitar"); + const recommendCall = toolCalls.find((tc) => tc.name === 'recommendGuitar') if (!recommendCall) { - console.error("❌ ERROR: recommendGuitar tool was not called"); - process.exit(1); + console.error('❌ ERROR: recommendGuitar tool was not called') + process.exit(1) } - console.log("✅ recommendGuitar was called"); - console.log(` Arguments: ${recommendCall.arguments}`); + console.log('✅ recommendGuitar was called') + console.log(` Arguments: ${recommendCall.arguments}`) // Parse and verify arguments - let parsedArgs: any; + let parsedArgs: any try { - parsedArgs = JSON.parse(recommendCall.arguments); + parsedArgs = JSON.parse(recommendCall.arguments) } catch (e) { - console.error(`❌ ERROR: Failed to parse arguments as JSON: ${e}`); - console.error(` Raw arguments: ${recommendCall.arguments}`); - process.exit(1); + console.error(`❌ ERROR: Failed to parse arguments as JSON: ${e}`) + console.error(` Raw arguments: ${recommendCall.arguments}`) + process.exit(1) } - console.log(` Parsed: ${JSON.stringify(parsedArgs, null, 2)}`); + console.log(` Parsed: ${JSON.stringify(parsedArgs, null, 2)}`) // Verify the arguments contain an id if (!parsedArgs.id) { - console.error("❌ ERROR: Arguments do not contain 'id' field"); - console.error(` Parsed args: ${JSON.stringify(parsedArgs)}`); - process.exit(1); + console.error("❌ ERROR: Arguments do not contain 'id' field") + console.error(` Parsed args: ${JSON.stringify(parsedArgs)}`) + process.exit(1) } - if (parsedArgs.id === "" || parsedArgs.id === undefined) { - console.error("❌ ERROR: 'id' field is empty or undefined"); - console.error(` Parsed args: ${JSON.stringify(parsedArgs)}`); - process.exit(1); + if (parsedArgs.id === '' || parsedArgs.id === undefined) { + console.error("❌ ERROR: 'id' field is empty or undefined") + console.error(` Parsed args: ${JSON.stringify(parsedArgs)}`) + process.exit(1) } console.log( - `\n✅ SUCCESS: recommendGuitar received correct arguments with id: "${parsedArgs.id}"` - ); - console.log("\n🎉 Test passed!"); + `\n✅ SUCCESS: recommendGuitar received correct arguments with id: "${parsedArgs.id}"`, + ) + console.log('\n🎉 Test passed!') } catch (error: any) { - console.error("\n❌ ERROR:", error.message); - console.error(error.stack); - process.exit(1); + console.error('\n❌ ERROR:', error.message) + console.error(error.stack) + process.exit(1) } } -testToolArguments(); +testToolArguments() diff --git a/packages/typescript/ai-openai/package.json b/packages/typescript/ai-openai/package.json index a9f28acde..4aab0c98f 100644 --- a/packages/typescript/ai-openai/package.json +++ b/packages/typescript/ai-openai/package.json @@ -10,12 +10,12 @@ "directory": "packages/typescript/ai-openai" }, "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" } }, "files": [ diff --git a/packages/typescript/ai-openai/src/audio/audio-provider-options.ts b/packages/typescript/ai-openai/src/audio/audio-provider-options.ts index ae316a334..69a35d3ee 100644 --- a/packages/typescript/ai-openai/src/audio/audio-provider-options.ts +++ b/packages/typescript/ai-openai/src/audio/audio-provider-options.ts @@ -1,66 +1,77 @@ -import { OpenAIAudioModel } from "../openai-adapter"; - -export interface AudioProviderOptions { - /** - * The text to generate audio for. The maximum length is 4096 characters. - */ - input: string; - /** - * The audio model to use for generation. - */ - model: OpenAIAudioModel; - /** - * The voice to use when generating audio. - * Supported voices are alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, and verse. - * Previews of the voices are available on the following url: - * https://platform.openai.com/docs/guides/text-to-speech#voice-options - */ - voice?: "alloy" | "ash" | "ballad" | "coral" | "echo" | "fable" | "onyx" | "nova" | "sage" | "shimmer" | "verse"; - /** - * Control the voice of your generated audio with additional instructions. Does not work with tts-1 or tts-1-hd. - */ - instructions?: string; - /** - * The format of the generated audio. - * @default "mp3" - */ - response_format?: "mp3" | "opus" | "aac" | "flac" | "wav" | "pcm"; - /** - * The speed of the generated audio. - * Range of values between 0.25 to 4.0, where 1.0 is the default speed. - * @default 1.0 - */ - speed?: number; - /** - * The format to stream the audio in. Supported formats are sse and audio. sse is not supported for tts-1 or tts-1-hd. - */ - stream_format?: "sse" | "audio" -} - -export const validateStreamFormat = (options: AudioProviderOptions) => { - const unsupportedModels = ["tts-1", "tts-1-hd"]; - if (options.stream_format && unsupportedModels.includes(options.model)) { - throw new Error(`The model ${options.model} does not support streaming.`); - } -}; - -export const validateSpeed = (options: AudioProviderOptions) => { - if (options.speed) { - if (options.speed < 0.25 || options.speed > 4.0) { - throw new Error("Speed must be between 0.25 and 4.0."); - } - } -}; - -export const validateInstructions = (options: AudioProviderOptions) => { - const unsupportedModels = ["tts-1", "tts-1-hd"]; - if (options.instructions && unsupportedModels.includes(options.model)) { - throw new Error(`The model ${options.model} does not support instructions.`); - } -}; - -export const validateAudioInput = (options: AudioProviderOptions) => { - if (options.input.length > 4096) { - throw new Error("Input text exceeds maximum length of 4096 characters."); - } -}; \ No newline at end of file + + +export interface AudioProviderOptions { + /** + * The text to generate audio for. The maximum length is 4096 characters. + */ + input: string + /** + * The audio model to use for generation. + */ + model: string + /** + * The voice to use when generating audio. + * Supported voices are alloy, ash, ballad, coral, echo, fable, onyx, nova, sage, shimmer, and verse. + * Previews of the voices are available on the following url: + * https://platform.openai.com/docs/guides/text-to-speech#voice-options + */ + voice?: + | 'alloy' + | 'ash' + | 'ballad' + | 'coral' + | 'echo' + | 'fable' + | 'onyx' + | 'nova' + | 'sage' + | 'shimmer' + | 'verse' + /** + * Control the voice of your generated audio with additional instructions. Does not work with tts-1 or tts-1-hd. + */ + instructions?: string + /** + * The format of the generated audio. + * @default "mp3" + */ + response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm' + /** + * The speed of the generated audio. + * Range of values between 0.25 to 4.0, where 1.0 is the default speed. + * @default 1.0 + */ + speed?: number + /** + * The format to stream the audio in. Supported formats are sse and audio. sse is not supported for tts-1 or tts-1-hd. + */ + stream_format?: 'sse' | 'audio' +} + +export const validateStreamFormat = (options: AudioProviderOptions) => { + const unsupportedModels = ['tts-1', 'tts-1-hd'] + if (options.stream_format && unsupportedModels.includes(options.model)) { + throw new Error(`The model ${options.model} does not support streaming.`) + } +} + +export const validateSpeed = (options: AudioProviderOptions) => { + if (options.speed) { + if (options.speed < 0.25 || options.speed > 4.0) { + throw new Error('Speed must be between 0.25 and 4.0.') + } + } +} + +export const validateInstructions = (options: AudioProviderOptions) => { + const unsupportedModels = ['tts-1', 'tts-1-hd'] + if (options.instructions && unsupportedModels.includes(options.model)) { + throw new Error(`The model ${options.model} does not support instructions.`) + } +} + +export const validateAudioInput = (options: AudioProviderOptions) => { + if (options.input.length > 4096) { + throw new Error('Input text exceeds maximum length of 4096 characters.') + } +} diff --git a/packages/typescript/ai-openai/src/audio/transcribe-provider-options.ts b/packages/typescript/ai-openai/src/audio/transcribe-provider-options.ts index 956d7bb5d..063e719ff 100644 --- a/packages/typescript/ai-openai/src/audio/transcribe-provider-options.ts +++ b/packages/typescript/ai-openai/src/audio/transcribe-provider-options.ts @@ -1,119 +1,128 @@ -import { OpenAITranscriptionModel } from "../openai-adapter"; - -export interface TranscribeProviderOptions { - /** - * The audio file object (not file name) to transcribe, in one of these formats: flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. - * https://platform.openai.com/docs/api-reference/audio/createTranscription#audio_createtranscription-file - */ - file: File; - /** - * The model to use for transcription. - * https://platform.openai.com/docs/api-reference/audio/createTranscription#audio_createtranscription-model - */ - model: OpenAITranscriptionModel; - - chunking_strategy: "auto" | { - type: "server_vad" - /** - * Amount of audio to include before the VAD detected speech (in milliseconds). - * @default 300 - */ - prefix_padding_ms?: number - /** - * Duration of silence to detect speech stop (in milliseconds). With shorter values the model will respond more quickly, but may jump in on short pauses from the user. - * @default 200 - */ - silence_duration_ms: number; - /** - * Sensitivity threshold (0.0 to 1.0) for voice activity detection. A higher threshold will require louder audio to activate the model, and thus might perform better in noisy environments. - * @default 0.5 - */ - threshold?: number - } - /** - * Additional information to include in the transcription response. logprobs will return the log probabilities of the tokens in the response to understand the model's confidence in the transcription. logprobs only works with response_format set to json and only with the models gpt-4o-transcribe and gpt-4o-mini-transcribe. This field is not supported when using gpt-4o-transcribe-diarize. - */ - include?: string[] - /** - * Optional list of speaker names that correspond to the audio samples provided in known_speaker_references[]. Each entry should be a short identifier (for example customer or agent). Up to 4 speakers are supported. - */ - known_speaker_names: string[]; - /** - * Optional list of audio samples (as data URLs) that contain known speaker references matching known_speaker_names[]. Each sample must be between 2 and 10 seconds, and can use any of the same input audio formats supported by file. - */ - known_speaker_references?: string[]; - /** - * The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. - */ - language?: string; - /** - * An optional prompt to guide the transcription model's style or to help with uncommon words or phrases. - */ - prompt?: string; - /** - * The format of the output, in one of these options: json, text, srt, verbose_json, vtt, or diarized_json. For gpt-4o-transcribe and gpt-4o-mini-transcribe, the only supported format is json. For gpt-4o-transcribe-diarize, the supported formats are json, text, and diarized_json, with diarized_json required to receive speaker annotations. - */ - response_format?: "json" | "text" | "srt" | "verbose_json" | "vtt" | "diarized_json" - - /** - * If set to true, the model response data will be streamed to the client as it is generated using server-sent events - * Note: Streaming is not supported for the whisper-1 model and will be ignored. - */ - stream?: boolean; - /** - * The sampling temperature, between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit. - */ - temperature?: number; - /** - * The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either or both of these options are supported: word, or segment. Note: There is no additional latency for segment timestamps, but generating word timestamps incurs additional latency. This option is not available for gpt-4o-transcribe-diarize. - */ - timestamp_granularities?: Array<"word" | "segment">; -} - -export const validateTemperature = (options: TranscribeProviderOptions) => { - if (options.temperature) { - if (options.temperature < 0 || options.temperature > 1) { - throw new Error("Temperature must be between 0 and 1."); - } - } -} - -export const validateStream = (options: TranscribeProviderOptions) => { - const unsupportedModels = ["whisper-1"]; - if (options.stream) { - if (unsupportedModels.includes(options.model)) { - throw new Error(`The model ${options.model} does not support streaming.`); - } - } -} - -export const validatePrompt = (options: TranscribeProviderOptions) => { - const unsupportedModels = ["gpt-4o-transcribe-diarize"]; - if (options.prompt) { - if (unsupportedModels.includes(options.model)) { - throw new Error(`The model ${options.model} does not support prompts.`); - } - } -} - -export const validateKnownSpeakerNames = (options: TranscribeProviderOptions) => { - if (options.known_speaker_names) { - if (options.known_speaker_names.length > 4) { - throw new Error("A maximum of 4 known speaker names are supported."); - } - } -}; - -export const validateInclude = (options: TranscribeProviderOptions) => { - const unsupportedModels = ["gpt-4o-transcribe-diarize"]; - if (options.include) { - if (unsupportedModels.includes(options.model)) { - throw new Error(`The model ${options.model} does not support the include field.`); - } - } - - if (options.include && options.response_format !== "json") { - throw new Error("The include field is only supported when response_format is set to json."); - } - -}; \ No newline at end of file +export interface TranscribeProviderOptions { + /** + * The audio file object (not file name) to transcribe, in one of these formats: flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, or webm. + * https://platform.openai.com/docs/api-reference/audio/createTranscription#audio_createtranscription-file + */ + file: File + /** + * The model to use for transcription. + * https://platform.openai.com/docs/api-reference/audio/createTranscription#audio_createtranscription-model + */ + model: string + + chunking_strategy: + | 'auto' + | { + type: 'server_vad' + /** + * Amount of audio to include before the VAD detected speech (in milliseconds). + * @default 300 + */ + prefix_padding_ms?: number + /** + * Duration of silence to detect speech stop (in milliseconds). With shorter values the model will respond more quickly, but may jump in on short pauses from the user. + * @default 200 + */ + silence_duration_ms: number + /** + * Sensitivity threshold (0.0 to 1.0) for voice activity detection. A higher threshold will require louder audio to activate the model, and thus might perform better in noisy environments. + * @default 0.5 + */ + threshold?: number + } + /** + * Additional information to include in the transcription response. logprobs will return the log probabilities of the tokens in the response to understand the model's confidence in the transcription. logprobs only works with response_format set to json and only with the models gpt-4o-transcribe and gpt-4o-mini-transcribe. This field is not supported when using gpt-4o-transcribe-diarize. + */ + include?: Array + /** + * Optional list of speaker names that correspond to the audio samples provided in known_speaker_references[]. Each entry should be a short identifier (for example customer or agent). Up to 4 speakers are supported. + */ + known_speaker_names: Array + /** + * Optional list of audio samples (as data URLs) that contain known speaker references matching known_speaker_names[]. Each sample must be between 2 and 10 seconds, and can use any of the same input audio formats supported by file. + */ + known_speaker_references?: Array + /** + * The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. + */ + language?: string + /** + * An optional prompt to guide the transcription model's style or to help with uncommon words or phrases. + */ + prompt?: string + /** + * The format of the output, in one of these options: json, text, srt, verbose_json, vtt, or diarized_json. For gpt-4o-transcribe and gpt-4o-mini-transcribe, the only supported format is json. For gpt-4o-transcribe-diarize, the supported formats are json, text, and diarized_json, with diarized_json required to receive speaker annotations. + */ + response_format?: + | 'json' + | 'text' + | 'srt' + | 'verbose_json' + | 'vtt' + | 'diarized_json' + + /** + * If set to true, the model response data will be streamed to the client as it is generated using server-sent events + * Note: Streaming is not supported for the whisper-1 model and will be ignored. + */ + stream?: boolean + /** + * The sampling temperature, between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit. + */ + temperature?: number + /** + * The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either or both of these options are supported: word, or segment. Note: There is no additional latency for segment timestamps, but generating word timestamps incurs additional latency. This option is not available for gpt-4o-transcribe-diarize. + */ + timestamp_granularities?: Array<'word' | 'segment'> +} + +export const validateTemperature = (options: TranscribeProviderOptions) => { + if (options.temperature) { + if (options.temperature < 0 || options.temperature > 1) { + throw new Error('Temperature must be between 0 and 1.') + } + } +} + +export const validateStream = (options: TranscribeProviderOptions) => { + const unsupportedModels = ['whisper-1'] + if (options.stream) { + if (unsupportedModels.includes(options.model)) { + throw new Error(`The model ${options.model} does not support streaming.`) + } + } +} + +export const validatePrompt = (options: TranscribeProviderOptions) => { + const unsupportedModels = ['gpt-4o-transcribe-diarize'] + if (options.prompt) { + if (unsupportedModels.includes(options.model)) { + throw new Error(`The model ${options.model} does not support prompts.`) + } + } +} + +export const validateKnownSpeakerNames = ( + options: TranscribeProviderOptions, +) => { + if (options.known_speaker_names.length > 4) { + throw new Error('A maximum of 4 known speaker names are supported.') + } +} + +export const validateInclude = (options: TranscribeProviderOptions) => { + const unsupportedModels = ['gpt-4o-transcribe-diarize'] + if (options.include) { + if (unsupportedModels.includes(options.model)) { + throw new Error( + `The model ${options.model} does not support the include field.`, + ) + } + } + + if (options.include && options.response_format !== 'json') { + throw new Error( + 'The include field is only supported when response_format is set to json.', + ) + } +} diff --git a/packages/typescript/ai-openai/src/image/image-provider-options.ts b/packages/typescript/ai-openai/src/image/image-provider-options.ts index 3e1d2c2f2..54230f16e 100644 --- a/packages/typescript/ai-openai/src/image/image-provider-options.ts +++ b/packages/typescript/ai-openai/src/image/image-provider-options.ts @@ -1,44 +1,49 @@ -import { OpenAIImageModel } from "../openai-adapter"; - -interface ImageProviderOptions { - /** - * A text prompt describing the desired image. The maximum length is 32000 characters for gpt-image-1, 1000 characters for dall-e-2 and 4000 characters for dall-e-3. - */ - prompt: string; - /** - * Allows to set transparency for the background of the generated image(s). This parameter is only supported for gpt-image-1. Must be one of transparent, opaque or auto (default value). When auto is used, the model will automatically determine the best background for the image. - -If transparent, the output format needs to support transparency, so it should be set to either png (default value) or webp. - */ - background?: "transparent" | "opaque" | "auto" | null; - /** - * The image model to use for generation. - */ - model: OpenAIImageModel; -} - -export const validateBackground = (options: ImageProviderOptions) => { - if (options.background) { - const supportedModels = ["gpt-image-1"]; - if (!supportedModels.includes(options.model)) { - throw new Error(`The model ${options.model} does not support background option.`); - } - } -} - -export const validatePrompt = (options: ImageProviderOptions) => { - - if (options.prompt.length === 0) { - throw new Error("Prompt cannot be empty."); - } - if (options.model === "gpt-image-1" && options.prompt.length > 32000) { - throw new Error("For gpt-image-1, prompt length must be less than or equal to 32000 characters."); - } - if (options.model === "dall-e-2" && options.prompt.length > 1000) { - throw new Error("For dall-e-2, prompt length must be less than or equal to 1000 characters."); - } - if (options.model === "dall-e-3" && options.prompt.length > 4000) { - throw new Error("For dall-e-3, prompt length must be less than or equal to 4000 characters."); - } - -} \ No newline at end of file + +interface ImageProviderOptions { + /** + * A text prompt describing the desired image. The maximum length is 32000 characters for gpt-image-1, 1000 characters for dall-e-2 and 4000 characters for dall-e-3. + */ + prompt: string + /** + * Allows to set transparency for the background of the generated image(s). This parameter is only supported for gpt-image-1. Must be one of transparent, opaque or auto (default value). When auto is used, the model will automatically determine the best background for the image. + +If transparent, the output format needs to support transparency, so it should be set to either png (default value) or webp. + */ + background?: 'transparent' | 'opaque' | 'auto' | null + /** + * The image model to use for generation. + */ + model: string +} + +export const validateBackground = (options: ImageProviderOptions) => { + if (options.background) { + const supportedModels = ['gpt-image-1'] + if (!supportedModels.includes(options.model)) { + throw new Error( + `The model ${options.model} does not support background option.`, + ) + } + } +} + +export const validatePrompt = (options: ImageProviderOptions) => { + if (options.prompt.length === 0) { + throw new Error('Prompt cannot be empty.') + } + if (options.model === 'gpt-image-1' && options.prompt.length > 32000) { + throw new Error( + 'For gpt-image-1, prompt length must be less than or equal to 32000 characters.', + ) + } + if (options.model === 'dall-e-2' && options.prompt.length > 1000) { + throw new Error( + 'For dall-e-2, prompt length must be less than or equal to 1000 characters.', + ) + } + if (options.model === 'dall-e-3' && options.prompt.length > 4000) { + throw new Error( + 'For dall-e-3, prompt length must be less than or equal to 4000 characters.', + ) + } +} diff --git a/packages/typescript/ai-openai/src/index.ts b/packages/typescript/ai-openai/src/index.ts index 439fd7e08..c62bade16 100644 --- a/packages/typescript/ai-openai/src/index.ts +++ b/packages/typescript/ai-openai/src/index.ts @@ -1,3 +1,7 @@ -export { OpenAI, createOpenAI, openai, type OpenAIConfig } from "./openai-adapter"; -export type { OpenAIChatModelProviderOptionsByName } from "./model-meta"; - +export { + OpenAI, + createOpenAI, + openai, + type OpenAIConfig, +} from './openai-adapter' +export type { OpenAIChatModelProviderOptionsByName } from './model-meta' diff --git a/packages/typescript/ai-openai/src/model-meta.ts b/packages/typescript/ai-openai/src/model-meta.ts index d30a0f87b..2a82765f3 100644 --- a/packages/typescript/ai-openai/src/model-meta.ts +++ b/packages/typescript/ai-openai/src/model-meta.ts @@ -1,1568 +1,1919 @@ -import type { - OpenAIBaseOptions, - OpenAIReasoningOptions, - OpenAIStructuredOutputOptions, - OpenAIToolsOptions, - OpenAIStreamingOptions, - OpenAIMetadataOptions, -} from "./text/text-provider-options"; - -interface ModelMeta { - name: string; - supports: { - input: ("text" | "image" | "audio" | "video")[]; - output: ("text" | "image" | "audio" | "video")[]; - endpoints: ("chat" | "chat-completions" | "assistants" | "speech_generation" | "image-generation" | "fine-tuning" | "batch" | "image-edit" | "moderation" | "translation" | "realtime" | "embedding" | "audio" | "video" | "transcription")[]; - features: ("streaming" | "function_calling" | "structured_outputs" | "predicted_outcomes" | "distillation" | "fine_tuning")[]; - tools?: ("web_search" | "file_search" | "image_generation" | "code_interpreter" | "mcp" | "computer_use")[]; - }; - context_window?: number; - max_output_tokens?: number; - knowledge_cutoff?: string; - pricing: { - input: { - normal: number; - cached?: number; - }; - output: { - normal: number; - }; - }; - /** - * Type-level description of which provider options this model supports. - */ - providerOptions?: TProviderOptions; -} - -const GPT5_1 = { - name: "gpt-5.1", - context_window: 400_000, - max_output_tokens: 128_000, - knowledge_cutoff: "2024-09-30", - supports: { - input: ["text", "image"], - output: ["text", "image"], - endpoints: ["chat", "chat-completions"], - features: ["streaming", "function_calling", "structured_outputs", "distillation"], - tools: ["web_search", "file_search", "image_generation", "code_interpreter", "mcp"] - }, - pricing: { - input: { - normal: 1.25, - cached: 0.125 - }, - output: { - normal: 10 - } - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const GPT5_1_CODEX = { - name: "gpt-5.1-codex", - context_window: 400_000, - max_output_tokens: 128_000, - knowledge_cutoff: "2024-09-30", - supports: { - input: ["text", "image"], - output: ["text", "image"], - endpoints: ["chat",], - features: ["streaming", "function_calling", "structured_outputs",], - - }, - pricing: { - input: { - normal: 1.25, - cached: 0.125 - }, - output: { - normal: 10 - } - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const GPT5 = { - name: "gpt-5", - context_window: 400_000, - max_output_tokens: 128_000, - knowledge_cutoff: "2024-09-30", - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions", "batch"], - features: ["streaming", "function_calling", "structured_outputs", "distillation"], - tools: ["web_search", "file_search", "image_generation", "code_interpreter", "mcp"] - }, - pricing: { - input: { - normal: 1.25, - cached: 0.125 - }, - output: { - normal: 10 - } - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const GPT5_MINI = { - name: "gpt-5-mini", - context_window: 400_000, - max_output_tokens: 128_000, - knowledge_cutoff: "2024-05-31", - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions", "batch"], - features: ["streaming", "structured_outputs", "function_calling"], - tools: ["web_search", "file_search", "mcp", "code_interpreter"] - }, - pricing: { - input: { - normal: 0.25, - cached: 0.025 - }, - output: { - normal: 2 - } - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const GPT5_NANO = { - name: "gpt-5-nano", - context_window: 400_000, - max_output_tokens: 128_000, - knowledge_cutoff: "2024-05-31", - pricing: { - input: { - normal: 0.05, - cached: 0.005 - }, - output: { - normal: 0.4 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions", "batch"], - features: [ - "streaming", - "structured_outputs", - "function_calling" - ], - tools: ["web_search", "file_search", "mcp", "image_generation", "code_interpreter"] - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const GPT5_PRO = { - name: "gpt-5-pro", - context_window: 400_000, - max_output_tokens: 272_000, - knowledge_cutoff: "2024-09-30", - pricing: { - input: { - normal: 15, - - }, output: { - normal: 120 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch"], - features: [ - "streaming", - "structured_outputs", - "function_calling",], - tools: ["web_search", "file_search", "image_generation", "mcp"] - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const GPT5_CODEX = { - name: "gpt-5-codex", - context_window: 400_000, - max_output_tokens: 128_000, - knowledge_cutoff: "2024-09-30", - pricing: { - input: { - normal: 1.25, - cached: 0.125 - }, - output: { - normal: 10 - } - }, - supports: { - input: ["text", "image"], - output: ["text", "image"], - endpoints: ["chat",], - features: [ - "streaming", - "structured_outputs", - "function_calling"], - - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - - -const SORA2 = { - name: "sora-2", - pricing: { - input: { - normal: 0 - }, - output: { - // per second of video - normal: 0.1 - } - }, - supports: { - input: ["text", "image"], - output: ["video", "audio"], - endpoints: ["video"], - features: [], - - } -} as const satisfies ModelMeta - -const SORA2_PRO = { - name: "sora-2-pro", - pricing: { - input: { - normal: 0 - }, - output: { - // per second of video - normal: 0.5 - } - }, - supports: { - input: ["text", "image"], - output: ["video", "audio"], - endpoints: ["video"], - features: [], - - } -} as const satisfies ModelMeta - -const GPT_IMAGE_1 = { - name: "gpt-image-1", - // todo fix for images - pricing: { - input: { - normal: 5, - cached: 1.25 - }, - output: { - normal: 0.1 - } - }, - supports: { - input: ["text", "image"], - output: ["image"], - endpoints: ["image-generation", "image-edit"], - - features: [], - } -} as const satisfies ModelMeta - -const GPT_IMAGE_1_MINI = { - name: "gpt-image-1-mini", - // todo fix for images - pricing: { - input: { - normal: 2, - cached: 0.2 - }, - output: { - normal: 0.03 - } - }, - supports: { - input: ["text", "image"], - output: ["image"], - endpoints: ["image-generation", "image-edit"], - - features: [], - } -} as const satisfies ModelMeta - -const O3_DEEP_RESEARCH = { - name: "o3-deep-research", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2024-01-01", - pricing: { - input: { - normal: 10, - cached: 2.5 - }, - output: { - normal: 40 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch"], - features: ["streaming"], - - } -} as const satisfies ModelMeta - -const O4_MINI_DEEP_RESEARCH = { - name: "o4-mini-deep-research", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2024-01-01", - pricing: { - input: { - normal: 2, - cached: 0.5 - }, - output: { - normal: 8 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch"], - features: ["streaming"], - - } -} as const satisfies ModelMeta - -const O3_PRO = { - name: "o3-pro", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2024-01-01", - pricing: { - input: { - normal: 20 - }, - output: { - normal: 80 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch"], - features: ["function_calling", "structured_outputs"], - - } -} as const satisfies ModelMeta - -const GPT_AUDIO = { - name: "gpt-audio", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2023-10-01", - pricing: { - // todo add audio tokens to input output - input: { - normal: 2.5, - - }, - output: { - normal: 10 - } - }, - supports: { - input: ["text", "audio"], - output: ["text", "audio"], - endpoints: ["chat-completions"], - features: ["function_calling"], - - } -} as const satisfies ModelMeta - - -const GPT_REALTIME = { - name: "gpt-realtime", - context_window: 32_000, - max_output_tokens: 4_096, - knowledge_cutoff: "2023-10-01", - pricing: { - // todo add audio tokens to input output - input: { - normal: 4, - cached: 0.5, - }, - output: { - normal: 16 - } - }, - supports: { - input: ["text", "audio", "image"], - output: ["text", "audio"], - endpoints: ["realtime"], - features: ["function_calling"], - - } -} as const satisfies ModelMeta - -const GPT_REALTIME_MINI = { - name: "gpt-realtime-mini", - context_window: 32_000, - max_output_tokens: 4_096, - knowledge_cutoff: "2023-10-01", - pricing: { - // todo add audio and image tokens to input output - input: { - normal: 0.6, - cached: 0.06, - }, - output: { - normal: 2.4 - } - }, - supports: { - input: ["text", "audio", "image"], - output: ["text", "audio"], - endpoints: ["realtime"], - features: ["function_calling"], - - } -} as const satisfies ModelMeta - - -const GPT_AUDIO_MINI = { - name: "gpt-audio-mini", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2023-10-01", - pricing: { - // todo add audio tokens to input output - input: { - normal: 0.6, - - }, - output: { - normal: 2.4 - } - }, - supports: { - input: ["text", "audio"], - output: ["text", "audio"], - endpoints: ["chat-completions"], - features: ["function_calling"], - - } -} as const satisfies ModelMeta - -const O3 = { - name: "o3", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2024-01-01", - pricing: { - input: { - normal: 2, - cached: 0.5 - }, - output: { - normal: 8 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch", "chat-completions"], - features: ["function_calling", "structured_outputs", "streaming"], - - } -} as const satisfies ModelMeta - -const O4_MINI = { - name: "o4-mini", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2024-01-01", - pricing: { - input: { - normal: 1.1, - cached: 0.275 - }, - output: { - normal: 4.4 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch", "chat-completions", "fine-tuning"], - features: ["function_calling", "structured_outputs", "streaming", "fine_tuning"], - - } -} as const satisfies ModelMeta - -const GPT4_1 = { - name: "gpt-4.1", - context_window: 1_047_576, - max_output_tokens: 32_768, - knowledge_cutoff: "2024-01-01", - pricing: { - input: { - normal: 2, - cached: 0.5 - }, - output: { - normal: 8 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions", "assistants", "fine-tuning", "batch"], - features: ["streaming", "function_calling", "structured_outputs", "distillation", "fine_tuning"], - tools: [ - "web_search", - "file_search", - "image_generation", - "code_interpreter", - "mcp" - ] - } -} as const satisfies ModelMeta - -const GPT4_1_MINI = { - name: "gpt-4.1-mini", - context_window: 1_047_576, - max_output_tokens: 32_768, - knowledge_cutoff: "2024-01-01", - pricing: { - input: { - normal: 0.4, - cached: 0.1 - }, - output: { - normal: 1.6 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions", "assistants", "fine-tuning", "batch"], - features: ["streaming", "function_calling", "structured_outputs", "fine_tuning"], - - } -} as const satisfies ModelMeta - -const GPT4_1_NANO = { - name: "gpt-4.1-nano", - context_window: 1_047_576, - max_output_tokens: 32_768, - knowledge_cutoff: "2024-01-01", - pricing: { - input: { - normal: 0.1, - cached: 0.025 - }, - output: { - normal: 0.4 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions", "assistants", "fine-tuning", "batch"], - features: ["streaming", "function_calling", "structured_outputs", "fine_tuning", "predicted_outcomes"], - - } -} as const satisfies ModelMeta - -const O1_PRO = { - name: "o1-pro", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2023-10-01", - pricing: { - input: { - normal: 150, - - }, - output: { - normal: 600 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch",], - features: ["function_calling", "structured_outputs",], - - } -} as const satisfies ModelMeta - -const COMPUTER_USE_PREVIEW = { - name: "computer-use-preview", - context_window: 8_192, - max_output_tokens: 1_024, - knowledge_cutoff: "2023-10-01", - pricing: { - input: { - normal: 3 - }, - output: { - normal: 12 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch"], - features: ["function_calling"], - - } -} as const satisfies ModelMeta - -const GPT_4O_MINI_SEARCH_PREVIEW = { - name: "gpt-4o-mini-search-preview", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2023-10-01", - pricing: { - input: { - normal: 0.15, - }, - output: { - normal: 0.6 - } - }, - supports: { - input: ["text",], - output: ["text"], - endpoints: ["chat-completions",], - features: ["streaming", "structured_outputs",], - } -} as const satisfies ModelMeta - -const GPT_4O_SEARCH_PREVIEW = { - name: "gpt-4o-search-preview", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2023-10-01", - pricing: { - input: { - normal: 2.5, - }, - output: { - normal: 10 - } - }, - supports: { - input: ["text",], - output: ["text"], - endpoints: ["chat-completions",], - features: ["streaming", "structured_outputs",], - } -} as const satisfies ModelMeta - -const O3_MINI = { - name: "o3-mini", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2023-10-01", - pricing: { - input: { - normal: 1.1, - cached: 0.55 - }, - output: { - normal: 4.4 - } - }, - supports: { - input: ["text"], - output: ["text"], - endpoints: ["chat", "batch", "chat-completions", "assistants"], - features: ["function_calling", "structured_outputs", "streaming"], - - } -} as const satisfies ModelMeta - -const GPT_4O_MINI_AUDIO = { - name: "gpt-4o-mini-audio", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2023-10-01", - pricing: { - // todo audio tokens - input: { - normal: 0.15, - - }, - output: { - normal: 0.6 - } - }, - supports: { - input: ["text", "audio"], - output: ["text", "audio"], - endpoints: ["chat-completions"], - features: ["function_calling", "streaming"], - } -} as const satisfies ModelMeta - -const GPT_4O_MINI_REALTIME = { - name: "gpt-4o-mini-realtime", - context_window: 16_000, - max_output_tokens: 4_096, - knowledge_cutoff: "2023-10-01", - pricing: { - // todo add audio tokens - input: { - normal: 0.6, - cached: 0.3 - }, - output: { - normal: 2.4 - } - }, - supports: { - input: ["text", "audio",], - output: ["text", "audio"], - endpoints: ["realtime"], - features: ["function_calling",], - } -} as const satisfies ModelMeta - -const O1 = { - name: "o1", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2023-10-01", - pricing: { - input: { - normal: 15, - cached: 7.5 - }, - output: { - normal: 60 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "batch", "chat-completions", "assistants"], - features: ["function_calling", "structured_outputs", "streaming"], - - } -} as const satisfies ModelMeta - -const OMNI_MODERATION = { - name: "omni-moderation", - pricing: { - input: { - normal: 0 - }, output: { - normal: 0 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["batch", "moderation"], - features: [] - }, - -} as const satisfies ModelMeta - -const GPT_4O = { - name: "gpt-4o", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2023-10-01", - pricing: { - - input: { - normal: 2.5, - cached: 1.25 - }, - output: { - normal: 10 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions", "assistants", "fine-tuning", "batch"], - features: ["streaming", "function_calling", "structured_outputs", "distillation", "fine_tuning", "predicted_outcomes"], - } -} as const satisfies ModelMeta - - -const GPT_4O_AUDIO = { - name: "gpt-4o-audio", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2023-10-01", - pricing: { - // todo audio tokens - input: { - normal: 2.5, - - }, - output: { - normal: 10 - } - }, - supports: { - input: ["text", "audio"], - output: ["text", "audio"], - endpoints: ["chat-completions",], - features: ["streaming", "function_calling",], - } -} as const satisfies ModelMeta - -const GPT_40_MINI = { - name: "gpt-4o-mini", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2023-10-01", - pricing: { - input: { - normal: 0.15, - cached: 0.075 - }, - output: { - normal: 0.6 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions", "assistants", "fine-tuning", "batch"], - features: ["streaming", "function_calling", "structured_outputs", "fine_tuning", "predicted_outcomes"], - } -} as const satisfies ModelMeta - -const GPT__4O_REALTIME = { - name: "gpt-4o-realtime", - context_window: 32_000, - max_output_tokens: 4_096, - knowledge_cutoff: "2023-10-01", - pricing: { - // todo add audio tokens to input output - input: { - normal: 5, - cached: 2.5, - }, - output: { - normal: 20 - } - }, - supports: { - input: ["text", "audio",], - output: ["text", "audio"], - endpoints: ["realtime"], - features: ["function_calling"], - - } -} as const satisfies ModelMeta - -const GPT_4_TURBO = { - name: "gpt-4-turbo", - context_window: 128_000, - max_output_tokens: 4_096, - knowledge_cutoff: "2023-12-01", - pricing: { - input: { - normal: 10 - }, - output: { - normal: 30 - } - }, - supports: { - input: ["text", "image",], - output: ["text",], - endpoints: ["chat", "chat-completions", "assistants", "batch"], - features: ["function_calling", "streaming"], - - } -} as const satisfies ModelMeta - -const CHATGPT_40 = { - name: "chatgpt-4.0", - context_window: 128_000, - max_output_tokens: 4_096, - knowledge_cutoff: "2023-10-01", - pricing: { - input: { - normal: 5 - }, - output: { - normal: 15 - } - }, - supports: { - input: ["text", "image",], - output: ["text",], - endpoints: ["chat", "chat-completions",], - features: ["predicted_outcomes", "streaming"], - } -} as const satisfies ModelMeta - -const GPT_5_1_CODEX_MINI = { - name: "gpt-5.1-codex-mini", - context_window: 400_000, - max_output_tokens: 128_000, - knowledge_cutoff: "2024-09-30", - pricing: { - input: { - normal: 0.25, - cached: 0.025 - }, - output: { - normal: 2 - } - }, - supports: { - input: ["text", "image",], - output: ["text", "image"], - endpoints: ["chat",], - features: ["streaming", "function_calling", "structured_outputs"], - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - - -const CODEX_MINI_LATEST = { - name: "codex-mini-latest", - context_window: 200_000, - max_output_tokens: 100_000, - knowledge_cutoff: "2024-06-01", - pricing: { - input: { - normal: 1.5, - cached: 0.375 - }, - output: { - normal: 6 - } - }, - supports: { - input: ["text", "image",], - output: ["text"], - endpoints: ["chat",], - features: ["streaming", "function_calling", "structured_outputs"], - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const DALL_E_2 = { - name: "dall-e-2", - pricing: { - // todo image tokens - input: { - normal: 0.016, - - }, - output: { - normal: 0.02 - } - }, - supports: { - input: ["text",], - output: ["image"], - endpoints: ["image-generation", "image-edit",], - features: [], - } -} as const satisfies ModelMeta - -const DALL_E_3 = { - name: "dall-e-3", - pricing: { - // todo image tokens - input: { - normal: 0.04, - } - , - output: { - normal: 0.08 - } - }, - supports: { - input: ["text",], - output: ["image"], - endpoints: ["image-generation", "image-edit",], - features: [], - } -} as const satisfies ModelMeta - -const GPT_3_5_TURBO = { - name: "gpt-3.5-turbo", - context_window: 16_385, - max_output_tokens: 4_096, - knowledge_cutoff: "2021-09-01", - pricing: { - input: { - normal: 0.5, - - }, - output: { - normal: 1.5 - } - }, - supports: { - input: ["text",], - output: ["text",], - endpoints: ["chat", "chat-completions", "batch", "fine-tuning"], - features: ["fine_tuning"], - } -} as const satisfies ModelMeta - -const GPT_4 = { - name: "gpt-4", - context_window: 8_192, - max_output_tokens: 8_192, - knowledge_cutoff: "2023-12-01", - pricing: { - input: { - normal: 30, - - }, - output: { - normal: 60 - } - }, - supports: { - input: ["text",], - output: ["text",], - endpoints: ["chat", "chat-completions", "batch", "fine-tuning", "assistants"], - features: ["fine_tuning", "streaming"], - } -} as const satisfies ModelMeta - -const GPT_4O_MINI_TRANSCRIBE = { - name: "gpt-4o-mini-transcribe", - context_window: 16_000, - max_output_tokens: 2_000, - knowledge_cutoff: "2024-01-01", - pricing: { - // todo audio tokens - input: { - normal: 1.25, - }, - output: { - normal: 5 - } - }, - supports: { - input: ["audio", "text"], - output: ["text"], - endpoints: ["realtime", "transcription"], - features: [] - } -} as const satisfies ModelMeta - -const GPT_4O_MINI_TTS = { - name: "gpt-4o-mini-tts", - pricing: { - // todo audio tokens - input: { - normal: 0.6, - }, - output: { - normal: 12 - } - }, - supports: { - input: ["text"], - output: ["audio"], - endpoints: ["speech_generation"], - features: [] - } -} as const satisfies ModelMeta - - -const GPT_4O_TRANSCRIBE = { - name: "gpt-4o-transcribe", - context_window: 16_000, - max_output_tokens: 2_000, - knowledge_cutoff: "2024-06-01", - pricing: { - // todo audio tokens - input: { - normal: 2.5, - }, - output: { - normal: 10 - } - }, - supports: { - input: ["audio", "text"], - output: ["text"], - endpoints: ["realtime", "transcription"], - features: [] - } -} as const satisfies ModelMeta - -const GPT_4O_TRANSCRIBE_DIARIZE = { - name: "gpt-4o-transcribe-diarize", - context_window: 16_000, - max_output_tokens: 2_000, - knowledge_cutoff: "2024-06-01", - pricing: { - // todo audio tokens - input: { - normal: 2.5, - }, - output: { - normal: 10 - } - }, - supports: { - input: ["audio", "text"], - output: ["text"], - endpoints: ["transcription"], - features: [] - } -} as const satisfies ModelMeta - -const GPT_5_1_CHAT = { - name: "gpt-5.1-chat", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2024-09-30", - pricing: { - input: { - normal: 1.25, - cached: 0.125 - }, - output: { - normal: 10 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions"], - features: ["streaming", "function_calling", "structured_outputs"], - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const GPT_5_CHAT = { - name: "gpt-5-chat", - context_window: 128_000, - max_output_tokens: 16_384, - knowledge_cutoff: "2024-09-30", - pricing: { - input: { - normal: 1.25, - cached: 0.125 - }, - output: { - normal: 10 - } - }, - supports: { - input: ["text", "image"], - output: ["text"], - endpoints: ["chat", "chat-completions"], - features: ["streaming", "function_calling", "structured_outputs"], - tools: [ - "web_search", - "file_search", - "image_generation", - "code_interpreter", - "mcp" - ] - } -} as const satisfies ModelMeta< - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions -> - -const TEXT_EMBEDDING_3_LARGE = { - name: "text-embedding-3-large", - pricing: { - // todo embedding tokens - input: { - normal: 0.13 - }, - output: { - normal: 0.13 - } - }, - supports: { - input: ["text"], - output: ["text"], - endpoints: ["embedding", "batch"], - features: [] - } -} as const satisfies ModelMeta - -const TEXT_EMBEDDING_3_SMALL = { - name: "text-embedding-3-small", - pricing: { - // todo embedding tokens - input: { - normal: 0.02 - }, - output: { - normal: 0.02 - } - }, - supports: { - input: ["text"], - output: ["text"], - endpoints: ["embedding", "batch"], - features: [] - } -} as const satisfies ModelMeta - - -const TEXT_EMBEDDING_3_ADA_002 = { - name: "text-embedding-3-ada-002", - pricing: { - // todo embedding tokens - input: { - normal: 0.1 - }, - output: { - normal: 0.1 - } - }, - supports: { - input: ["text"], - output: ["text"], - endpoints: ["embedding", "batch"], - features: [] - } -} as const satisfies ModelMeta - -const TTS_1 = { - name: "tts-1", - pricing: { - // todo figure out pricing - input: { - normal: 15 - }, - output: { - normal: 15 - } - }, - supports: { - input: ["text"], - output: ["audio"], - endpoints: ["speech_generation"], - features: [] - } -} as const satisfies ModelMeta - -const TTS_1_HD = { - name: "tts-1-hd", - pricing: { - // todo figure out pricing - input: { - normal: 30 - }, - output: { - normal: 30 - } - }, - supports: { - input: ["text"], - output: ["audio"], - endpoints: ["speech_generation"], - features: [] - } -} as const satisfies ModelMeta - -// Chat/text completion models (based on endpoints: "chat" or "chat-completions") -export const OPENAI_CHAT_MODELS = [ - // Frontier models - GPT5_1.name, - GPT5_1_CODEX.name, - GPT5.name, - GPT5_MINI.name, - GPT5_NANO.name, - GPT5_PRO.name, - GPT5_CODEX.name, - // Reasoning models - O3.name, - O3_PRO.name, - O3_MINI.name, - O4_MINI.name, - O3_DEEP_RESEARCH.name, - O4_MINI_DEEP_RESEARCH.name, - // GPT-4 series - GPT4_1.name, - GPT4_1_MINI.name, - GPT4_1_NANO.name, - GPT_4.name, - GPT_4_TURBO.name, - GPT_4O.name, - GPT_40_MINI.name, - // GPT-3.5 - GPT_3_5_TURBO.name, - // Audio-enabled chat models - GPT_AUDIO.name, - GPT_AUDIO_MINI.name, - GPT_4O_AUDIO.name, - GPT_4O_MINI_AUDIO.name, - // ChatGPT models - GPT_5_1_CHAT.name, - GPT_5_CHAT.name, - CHATGPT_40.name, - // Specialized - GPT_5_1_CODEX_MINI.name, - CODEX_MINI_LATEST.name, - // Preview models - GPT_4O_SEARCH_PREVIEW.name, - GPT_4O_MINI_SEARCH_PREVIEW.name, - COMPUTER_USE_PREVIEW.name, - // Legacy reasoning - O1.name, - O1_PRO.name, -] as const; - -// Image generation models (based on endpoints: "image-generation" or "image-edit") -export const OPENAI_IMAGE_MODELS = [ - GPT_IMAGE_1.name, - GPT_IMAGE_1_MINI.name, - DALL_E_3.name, - DALL_E_2.name, -] as const; - -// Embedding models (based on endpoints: "embedding") -export const OPENAI_EMBEDDING_MODELS = [ - TEXT_EMBEDDING_3_LARGE.name, - TEXT_EMBEDDING_3_SMALL.name, - TEXT_EMBEDDING_3_ADA_002.name, -] as const; - -// Audio models (based on endpoints: "transcription", "speech_generation", or "realtime") -export const OPENAI_AUDIO_MODELS = [ - // Transcription models - GPT_4O_TRANSCRIBE.name, - GPT_4O_TRANSCRIBE_DIARIZE.name, - GPT_4O_MINI_TRANSCRIBE.name, - // Realtime models - GPT_REALTIME.name, - GPT_REALTIME_MINI.name, - GPT__4O_REALTIME.name, - GPT_4O_MINI_REALTIME.name, - // Text-to-speech models - GPT_4O_MINI_TTS.name, - TTS_1.name, - TTS_1_HD.name, -] as const; - -// Transcription-only models (based on endpoints: "transcription") -export const OPENAI_TRANSCRIPTION_MODELS = [ - GPT_4O_TRANSCRIBE.name, - GPT_4O_TRANSCRIBE_DIARIZE.name, - GPT_4O_MINI_TRANSCRIBE.name, -] as const; - -// Video generation models (based on endpoints: "video") -export const OPENAI_VIDEO_MODELS = [ - SORA2.name, - SORA2_PRO.name, -] as const; - -export const OPENAI_MODERATION_MODELS = [ - OMNI_MODERATION.name, -] as const; - - -export type OpenAIChatModel = (typeof OPENAI_CHAT_MODELS)[number]; -export type OpenAIImageModel = (typeof OPENAI_IMAGE_MODELS)[number]; -export type OpenAIEmbeddingModel = (typeof OPENAI_EMBEDDING_MODELS)[number]; -export type OpenAIAudioModel = (typeof OPENAI_AUDIO_MODELS)[number]; -export type OpenAIVideoModel = (typeof OPENAI_VIDEO_MODELS)[number]; -export type OpenAITranscriptionModel = (typeof OPENAI_TRANSCRIPTION_MODELS)[number]; - -export const OPENAI_MODEL_META = { - [GPT5_1.name]: GPT5_1, - [GPT5_1_CODEX.name]: GPT5_1_CODEX, - [GPT5.name]: GPT5, - [GPT5_MINI.name]: GPT5_MINI, - [GPT5_NANO.name]: GPT5_NANO, - [GPT5_PRO.name]: GPT5_PRO, - [GPT5_CODEX.name]: GPT5_CODEX, - [SORA2.name]: SORA2, - [SORA2_PRO.name]: SORA2_PRO, - [GPT_IMAGE_1.name]: GPT_IMAGE_1, - [GPT_IMAGE_1_MINI.name]: GPT_IMAGE_1_MINI, - [O3_DEEP_RESEARCH.name]: O3_DEEP_RESEARCH, - [O4_MINI_DEEP_RESEARCH.name]: O4_MINI_DEEP_RESEARCH, - [O3_PRO.name]: O3_PRO, - [GPT_AUDIO.name]: GPT_AUDIO, - [GPT_REALTIME.name]: GPT_REALTIME, - [GPT_REALTIME_MINI.name]: GPT_REALTIME_MINI, - [GPT_AUDIO_MINI.name]: GPT_AUDIO_MINI, - [O3.name]: O3, - [O4_MINI.name]: O4_MINI, - [GPT4_1.name]: GPT4_1, - [GPT4_1_MINI.name]: GPT4_1_MINI, - [GPT4_1_NANO.name]: GPT4_1_NANO, - [O1_PRO.name]: O1_PRO, - [COMPUTER_USE_PREVIEW.name]: COMPUTER_USE_PREVIEW, - [GPT_4O_MINI_SEARCH_PREVIEW.name]: GPT_4O_MINI_SEARCH_PREVIEW, - [GPT_4O_SEARCH_PREVIEW.name]: GPT_4O_SEARCH_PREVIEW, - [O3_MINI.name]: O3_MINI, - [GPT_4O_MINI_AUDIO.name]: GPT_4O_MINI_AUDIO, - [GPT_4O_MINI_REALTIME.name]: GPT_4O_MINI_REALTIME, - [O1.name]: O1, - [OMNI_MODERATION.name]: OMNI_MODERATION, - [GPT_4O.name]: GPT_4O, - [GPT_4O_AUDIO.name]: GPT_4O_AUDIO, - [GPT_40_MINI.name]: GPT_40_MINI, - [GPT__4O_REALTIME.name]: GPT__4O_REALTIME, - [GPT_4_TURBO.name]: GPT_4_TURBO, - [CHATGPT_40.name]: CHATGPT_40, - [GPT_5_1_CODEX_MINI.name]: GPT_5_1_CODEX_MINI, - [CODEX_MINI_LATEST.name]: CODEX_MINI_LATEST, - [DALL_E_2.name]: DALL_E_2, - [DALL_E_3.name]: DALL_E_3, - [GPT_3_5_TURBO.name]: GPT_3_5_TURBO, - [GPT_4.name]: GPT_4, - [GPT_4O_MINI_TRANSCRIBE.name]: GPT_4O_MINI_TRANSCRIBE, - [GPT_4O_MINI_TTS.name]: GPT_4O_MINI_TTS, - [GPT_4O_TRANSCRIBE.name]: GPT_4O_TRANSCRIBE, - [GPT_4O_TRANSCRIBE_DIARIZE.name]: GPT_4O_TRANSCRIBE_DIARIZE, - [GPT_5_1_CHAT.name]: GPT_5_1_CHAT, - [GPT_5_CHAT.name]: GPT_5_CHAT, - [TEXT_EMBEDDING_3_LARGE.name]: TEXT_EMBEDDING_3_LARGE, - [TEXT_EMBEDDING_3_SMALL.name]: TEXT_EMBEDDING_3_SMALL, - [TEXT_EMBEDDING_3_ADA_002.name]: TEXT_EMBEDDING_3_ADA_002, - [TTS_1.name]: TTS_1, - [TTS_1_HD.name]: TTS_1_HD, -} as const; - -export type OpenAIModelMetaMap = typeof OPENAI_MODEL_META; - -/** - * Type-only map from chat model name to its provider options type. - * Used by the core AI types (via the adapter) to narrow - * `providerOptions` based on the selected model. - * - * Manually defined to ensure accurate type narrowing per model. - */ -export type OpenAIChatModelProviderOptionsByName = { - // Models WITH structured output support (have 'text' field) - "gpt-5.1": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-5.1-codex": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-5": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-5-mini": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-5-nano": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-5-pro": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-5-codex": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4.1": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4.1-mini": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4.1-nano": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4o": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4o-mini": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - - // Models WITHOUT structured output support (NO 'text' field) - "gpt-4": OpenAIBaseOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4-turbo": OpenAIBaseOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-3.5-turbo": OpenAIBaseOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "chatgpt-4.0": OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "o3": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions; - "o3-pro": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions; - "o3-mini": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions; - "o4-mini": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions; - "o3-deep-research": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions; - "o4-mini-deep-research": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions; - "o1": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions; - "o1-pro": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions; - - // Audio models - "gpt-audio": OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-audio-mini": OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4o-audio": OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4o-mini-audio": OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - - // Chat-only models - "gpt-5.1-chat": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIStructuredOutputOptions & OpenAIMetadataOptions; - "gpt-5-chat": OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIStructuredOutputOptions & OpenAIMetadataOptions; - - // Codex models - "gpt-5.1-codex-mini": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "codex-mini-latest": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - - // Search models - "gpt-4o-search-preview": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - "gpt-4o-mini-search-preview": OpenAIBaseOptions & OpenAIStructuredOutputOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; - - // Special models - "computer-use-preview": OpenAIBaseOptions & OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions; -}; +import type { + OpenAIBaseOptions, + OpenAIMetadataOptions, + OpenAIReasoningOptions, + OpenAIStreamingOptions, + OpenAIStructuredOutputOptions, + OpenAIToolsOptions, +} from './text/text-provider-options' + +interface ModelMeta { + name: string + supports: { + input: Array<'text' | 'image' | 'audio' | 'video'> + output: Array<'text' | 'image' | 'audio' | 'video'> + endpoints: Array< + | 'chat' + | 'chat-completions' + | 'assistants' + | 'speech_generation' + | 'image-generation' + | 'fine-tuning' + | 'batch' + | 'image-edit' + | 'moderation' + | 'translation' + | 'realtime' + | 'embedding' + | 'audio' + | 'video' + | 'transcription' + > + features: Array< + | 'streaming' + | 'function_calling' + | 'structured_outputs' + | 'predicted_outcomes' + | 'distillation' + | 'fine_tuning' + > + tools?: Array< + | 'web_search' + | 'file_search' + | 'image_generation' + | 'code_interpreter' + | 'mcp' + | 'computer_use' + > + } + context_window?: number + max_output_tokens?: number + knowledge_cutoff?: string + pricing: { + input: { + normal: number + cached?: number + } + output: { + normal: number + } + } + /** + * Type-level description of which provider options this model supports. + */ + providerOptions?: TProviderOptions +} + +const GPT5_1 = { + name: 'gpt-5.1', + context_window: 400_000, + max_output_tokens: 128_000, + knowledge_cutoff: '2024-09-30', + supports: { + input: ['text', 'image'], + output: ['text', 'image'], + endpoints: ['chat', 'chat-completions'], + features: [ + 'streaming', + 'function_calling', + 'structured_outputs', + 'distillation', + ], + tools: [ + 'web_search', + 'file_search', + 'image_generation', + 'code_interpreter', + 'mcp', + ], + }, + pricing: { + input: { + normal: 1.25, + cached: 0.125, + }, + output: { + normal: 10, + }, + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT5_1_CODEX = { + name: 'gpt-5.1-codex', + context_window: 400_000, + max_output_tokens: 128_000, + knowledge_cutoff: '2024-09-30', + supports: { + input: ['text', 'image'], + output: ['text', 'image'], + endpoints: ['chat'], + features: ['streaming', 'function_calling', 'structured_outputs'], + }, + pricing: { + input: { + normal: 1.25, + cached: 0.125, + }, + output: { + normal: 10, + }, + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT5 = { + name: 'gpt-5', + context_window: 400_000, + max_output_tokens: 128_000, + knowledge_cutoff: '2024-09-30', + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'chat-completions', 'batch'], + features: [ + 'streaming', + 'function_calling', + 'structured_outputs', + 'distillation', + ], + tools: [ + 'web_search', + 'file_search', + 'image_generation', + 'code_interpreter', + 'mcp', + ], + }, + pricing: { + input: { + normal: 1.25, + cached: 0.125, + }, + output: { + normal: 10, + }, + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT5_MINI = { + name: 'gpt-5-mini', + context_window: 400_000, + max_output_tokens: 128_000, + knowledge_cutoff: '2024-05-31', + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'chat-completions', 'batch'], + features: ['streaming', 'structured_outputs', 'function_calling'], + tools: ['web_search', 'file_search', 'mcp', 'code_interpreter'], + }, + pricing: { + input: { + normal: 0.25, + cached: 0.025, + }, + output: { + normal: 2, + }, + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT5_NANO = { + name: 'gpt-5-nano', + context_window: 400_000, + max_output_tokens: 128_000, + knowledge_cutoff: '2024-05-31', + pricing: { + input: { + normal: 0.05, + cached: 0.005, + }, + output: { + normal: 0.4, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'chat-completions', 'batch'], + features: ['streaming', 'structured_outputs', 'function_calling'], + tools: [ + 'web_search', + 'file_search', + 'mcp', + 'image_generation', + 'code_interpreter', + ], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT5_PRO = { + name: 'gpt-5-pro', + context_window: 400_000, + max_output_tokens: 272_000, + knowledge_cutoff: '2024-09-30', + pricing: { + input: { + normal: 15, + }, + output: { + normal: 120, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch'], + features: ['streaming', 'structured_outputs', 'function_calling'], + tools: ['web_search', 'file_search', 'image_generation', 'mcp'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT5_CODEX = { + name: 'gpt-5-codex', + context_window: 400_000, + max_output_tokens: 128_000, + knowledge_cutoff: '2024-09-30', + pricing: { + input: { + normal: 1.25, + cached: 0.125, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text', 'image'], + endpoints: ['chat'], + features: ['streaming', 'structured_outputs', 'function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const SORA2 = { + name: 'sora-2', + pricing: { + input: { + normal: 0, + }, + output: { + // per second of video + normal: 0.1, + }, + }, + supports: { + input: ['text', 'image'], + output: ['video', 'audio'], + endpoints: ['video'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const SORA2_PRO = { + name: 'sora-2-pro', + pricing: { + input: { + normal: 0, + }, + output: { + // per second of video + normal: 0.5, + }, + }, + supports: { + input: ['text', 'image'], + output: ['video', 'audio'], + endpoints: ['video'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_IMAGE_1 = { + name: 'gpt-image-1', + // todo fix for images + pricing: { + input: { + normal: 5, + cached: 1.25, + }, + output: { + normal: 0.1, + }, + }, + supports: { + input: ['text', 'image'], + output: ['image'], + endpoints: ['image-generation', 'image-edit'], + + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_IMAGE_1_MINI = { + name: 'gpt-image-1-mini', + // todo fix for images + pricing: { + input: { + normal: 2, + cached: 0.2, + }, + output: { + normal: 0.03, + }, + }, + supports: { + input: ['text', 'image'], + output: ['image'], + endpoints: ['image-generation', 'image-edit'], + + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const O3_DEEP_RESEARCH = { + name: 'o3-deep-research', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2024-01-01', + pricing: { + input: { + normal: 10, + cached: 2.5, + }, + output: { + normal: 40, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch'], + features: ['streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const O4_MINI_DEEP_RESEARCH = { + name: 'o4-mini-deep-research', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2024-01-01', + pricing: { + input: { + normal: 2, + cached: 0.5, + }, + output: { + normal: 8, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch'], + features: ['streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const O3_PRO = { + name: 'o3-pro', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2024-01-01', + pricing: { + input: { + normal: 20, + }, + output: { + normal: 80, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch'], + features: ['function_calling', 'structured_outputs'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_AUDIO = { + name: 'gpt-audio', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2023-10-01', + pricing: { + // todo add audio tokens to input output + input: { + normal: 2.5, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['text', 'audio'], + output: ['text', 'audio'], + endpoints: ['chat-completions'], + features: ['function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_REALTIME = { + name: 'gpt-realtime', + context_window: 32_000, + max_output_tokens: 4_096, + knowledge_cutoff: '2023-10-01', + pricing: { + // todo add audio tokens to input output + input: { + normal: 4, + cached: 0.5, + }, + output: { + normal: 16, + }, + }, + supports: { + input: ['text', 'audio', 'image'], + output: ['text', 'audio'], + endpoints: ['realtime'], + features: ['function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_REALTIME_MINI = { + name: 'gpt-realtime-mini', + context_window: 32_000, + max_output_tokens: 4_096, + knowledge_cutoff: '2023-10-01', + pricing: { + // todo add audio and image tokens to input output + input: { + normal: 0.6, + cached: 0.06, + }, + output: { + normal: 2.4, + }, + }, + supports: { + input: ['text', 'audio', 'image'], + output: ['text', 'audio'], + endpoints: ['realtime'], + features: ['function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_AUDIO_MINI = { + name: 'gpt-audio-mini', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2023-10-01', + pricing: { + // todo add audio tokens to input output + input: { + normal: 0.6, + }, + output: { + normal: 2.4, + }, + }, + supports: { + input: ['text', 'audio'], + output: ['text', 'audio'], + endpoints: ['chat-completions'], + features: ['function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const O3 = { + name: 'o3', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2024-01-01', + pricing: { + input: { + normal: 2, + cached: 0.5, + }, + output: { + normal: 8, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch', 'chat-completions'], + features: ['function_calling', 'structured_outputs', 'streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const O4_MINI = { + name: 'o4-mini', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2024-01-01', + pricing: { + input: { + normal: 1.1, + cached: 0.275, + }, + output: { + normal: 4.4, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch', 'chat-completions', 'fine-tuning'], + features: [ + 'function_calling', + 'structured_outputs', + 'streaming', + 'fine_tuning', + ], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT4_1 = { + name: 'gpt-4.1', + context_window: 1_047_576, + max_output_tokens: 32_768, + knowledge_cutoff: '2024-01-01', + pricing: { + input: { + normal: 2, + cached: 0.5, + }, + output: { + normal: 8, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: [ + 'chat', + 'chat-completions', + 'assistants', + 'fine-tuning', + 'batch', + ], + features: [ + 'streaming', + 'function_calling', + 'structured_outputs', + 'distillation', + 'fine_tuning', + ], + tools: [ + 'web_search', + 'file_search', + 'image_generation', + 'code_interpreter', + 'mcp', + ], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT4_1_MINI = { + name: 'gpt-4.1-mini', + context_window: 1_047_576, + max_output_tokens: 32_768, + knowledge_cutoff: '2024-01-01', + pricing: { + input: { + normal: 0.4, + cached: 0.1, + }, + output: { + normal: 1.6, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: [ + 'chat', + 'chat-completions', + 'assistants', + 'fine-tuning', + 'batch', + ], + features: [ + 'streaming', + 'function_calling', + 'structured_outputs', + 'fine_tuning', + ], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT4_1_NANO = { + name: 'gpt-4.1-nano', + context_window: 1_047_576, + max_output_tokens: 32_768, + knowledge_cutoff: '2024-01-01', + pricing: { + input: { + normal: 0.1, + cached: 0.025, + }, + output: { + normal: 0.4, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: [ + 'chat', + 'chat-completions', + 'assistants', + 'fine-tuning', + 'batch', + ], + features: [ + 'streaming', + 'function_calling', + 'structured_outputs', + 'fine_tuning', + 'predicted_outcomes', + ], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const O1_PRO = { + name: 'o1-pro', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 150, + }, + output: { + normal: 600, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch'], + features: ['function_calling', 'structured_outputs'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const COMPUTER_USE_PREVIEW = { + name: 'computer-use-preview', + context_window: 8_192, + max_output_tokens: 1_024, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 3, + }, + output: { + normal: 12, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch'], + features: ['function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_4O_MINI_SEARCH_PREVIEW = { + name: 'gpt-4o-mini-search-preview', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 0.15, + }, + output: { + normal: 0.6, + }, + }, + supports: { + input: ['text'], + output: ['text'], + endpoints: ['chat-completions'], + features: ['streaming', 'structured_outputs'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_4O_SEARCH_PREVIEW = { + name: 'gpt-4o-search-preview', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 2.5, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['text'], + output: ['text'], + endpoints: ['chat-completions'], + features: ['streaming', 'structured_outputs'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const O3_MINI = { + name: 'o3-mini', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 1.1, + cached: 0.55, + }, + output: { + normal: 4.4, + }, + }, + supports: { + input: ['text'], + output: ['text'], + endpoints: ['chat', 'batch', 'chat-completions', 'assistants'], + features: ['function_calling', 'structured_outputs', 'streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_4O_MINI_AUDIO = { + name: 'gpt-4o-mini-audio', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2023-10-01', + pricing: { + // todo audio tokens + input: { + normal: 0.15, + }, + output: { + normal: 0.6, + }, + }, + supports: { + input: ['text', 'audio'], + output: ['text', 'audio'], + endpoints: ['chat-completions'], + features: ['function_calling', 'streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_4O_MINI_REALTIME = { + name: 'gpt-4o-mini-realtime', + context_window: 16_000, + max_output_tokens: 4_096, + knowledge_cutoff: '2023-10-01', + pricing: { + // todo add audio tokens + input: { + normal: 0.6, + cached: 0.3, + }, + output: { + normal: 2.4, + }, + }, + supports: { + input: ['text', 'audio'], + output: ['text', 'audio'], + endpoints: ['realtime'], + features: ['function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const O1 = { + name: 'o1', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 15, + cached: 7.5, + }, + output: { + normal: 60, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'batch', 'chat-completions', 'assistants'], + features: ['function_calling', 'structured_outputs', 'streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const OMNI_MODERATION = { + name: 'omni-moderation', + pricing: { + input: { + normal: 0, + }, + output: { + normal: 0, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['batch', 'moderation'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_4O = { + name: 'gpt-4o', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 2.5, + cached: 1.25, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: [ + 'chat', + 'chat-completions', + 'assistants', + 'fine-tuning', + 'batch', + ], + features: [ + 'streaming', + 'function_calling', + 'structured_outputs', + 'distillation', + 'fine_tuning', + 'predicted_outcomes', + ], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_4O_AUDIO = { + name: 'gpt-4o-audio', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2023-10-01', + pricing: { + // todo audio tokens + input: { + normal: 2.5, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['text', 'audio'], + output: ['text', 'audio'], + endpoints: ['chat-completions'], + features: ['streaming', 'function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_40_MINI = { + name: 'gpt-4o-mini', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 0.15, + cached: 0.075, + }, + output: { + normal: 0.6, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: [ + 'chat', + 'chat-completions', + 'assistants', + 'fine-tuning', + 'batch', + ], + features: [ + 'streaming', + 'function_calling', + 'structured_outputs', + 'fine_tuning', + 'predicted_outcomes', + ], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT__4O_REALTIME = { + name: 'gpt-4o-realtime', + context_window: 32_000, + max_output_tokens: 4_096, + knowledge_cutoff: '2023-10-01', + pricing: { + // todo add audio tokens to input output + input: { + normal: 5, + cached: 2.5, + }, + output: { + normal: 20, + }, + }, + supports: { + input: ['text', 'audio'], + output: ['text', 'audio'], + endpoints: ['realtime'], + features: ['function_calling'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_4_TURBO = { + name: 'gpt-4-turbo', + context_window: 128_000, + max_output_tokens: 4_096, + knowledge_cutoff: '2023-12-01', + pricing: { + input: { + normal: 10, + }, + output: { + normal: 30, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'chat-completions', 'assistants', 'batch'], + features: ['function_calling', 'streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const CHATGPT_40 = { + name: 'chatgpt-4.0', + context_window: 128_000, + max_output_tokens: 4_096, + knowledge_cutoff: '2023-10-01', + pricing: { + input: { + normal: 5, + }, + output: { + normal: 15, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'chat-completions'], + features: ['predicted_outcomes', 'streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_5_1_CODEX_MINI = { + name: 'gpt-5.1-codex-mini', + context_window: 400_000, + max_output_tokens: 128_000, + knowledge_cutoff: '2024-09-30', + pricing: { + input: { + normal: 0.25, + cached: 0.025, + }, + output: { + normal: 2, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text', 'image'], + endpoints: ['chat'], + features: ['streaming', 'function_calling', 'structured_outputs'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const CODEX_MINI_LATEST = { + name: 'codex-mini-latest', + context_window: 200_000, + max_output_tokens: 100_000, + knowledge_cutoff: '2024-06-01', + pricing: { + input: { + normal: 1.5, + cached: 0.375, + }, + output: { + normal: 6, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat'], + features: ['streaming', 'function_calling', 'structured_outputs'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const DALL_E_2 = { + name: 'dall-e-2', + pricing: { + // todo image tokens + input: { + normal: 0.016, + }, + output: { + normal: 0.02, + }, + }, + supports: { + input: ['text'], + output: ['image'], + endpoints: ['image-generation', 'image-edit'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const DALL_E_3 = { + name: 'dall-e-3', + pricing: { + // todo image tokens + input: { + normal: 0.04, + }, + output: { + normal: 0.08, + }, + }, + supports: { + input: ['text'], + output: ['image'], + endpoints: ['image-generation', 'image-edit'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_3_5_TURBO = { + name: 'gpt-3.5-turbo', + context_window: 16_385, + max_output_tokens: 4_096, + knowledge_cutoff: '2021-09-01', + pricing: { + input: { + normal: 0.5, + }, + output: { + normal: 1.5, + }, + }, + supports: { + input: ['text'], + output: ['text'], + endpoints: ['chat', 'chat-completions', 'batch', 'fine-tuning'], + features: ['fine_tuning'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_4 = { + name: 'gpt-4', + context_window: 8_192, + max_output_tokens: 8_192, + knowledge_cutoff: '2023-12-01', + pricing: { + input: { + normal: 30, + }, + output: { + normal: 60, + }, + }, + supports: { + input: ['text'], + output: ['text'], + endpoints: [ + 'chat', + 'chat-completions', + 'batch', + 'fine-tuning', + 'assistants', + ], + features: ['fine_tuning', 'streaming'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_4O_MINI_TRANSCRIBE = { + name: 'gpt-4o-mini-transcribe', + context_window: 16_000, + max_output_tokens: 2_000, + knowledge_cutoff: '2024-01-01', + pricing: { + // todo audio tokens + input: { + normal: 1.25, + }, + output: { + normal: 5, + }, + }, + supports: { + input: ['audio', 'text'], + output: ['text'], + endpoints: ['realtime', 'transcription'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_4O_MINI_TTS = { + name: 'gpt-4o-mini-tts', + pricing: { + // todo audio tokens + input: { + normal: 0.6, + }, + output: { + normal: 12, + }, + }, + supports: { + input: ['text'], + output: ['audio'], + endpoints: ['speech_generation'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_4O_TRANSCRIBE = { + name: 'gpt-4o-transcribe', + context_window: 16_000, + max_output_tokens: 2_000, + knowledge_cutoff: '2024-06-01', + pricing: { + // todo audio tokens + input: { + normal: 2.5, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['audio', 'text'], + output: ['text'], + endpoints: ['realtime', 'transcription'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_4O_TRANSCRIBE_DIARIZE = { + name: 'gpt-4o-transcribe-diarize', + context_window: 16_000, + max_output_tokens: 2_000, + knowledge_cutoff: '2024-06-01', + pricing: { + // todo audio tokens + input: { + normal: 2.5, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['audio', 'text'], + output: ['text'], + endpoints: ['transcription'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const GPT_5_1_CHAT = { + name: 'gpt-5.1-chat', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2024-09-30', + pricing: { + input: { + normal: 1.25, + cached: 0.125, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'chat-completions'], + features: ['streaming', 'function_calling', 'structured_outputs'], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const GPT_5_CHAT = { + name: 'gpt-5-chat', + context_window: 128_000, + max_output_tokens: 16_384, + knowledge_cutoff: '2024-09-30', + pricing: { + input: { + normal: 1.25, + cached: 0.125, + }, + output: { + normal: 10, + }, + }, + supports: { + input: ['text', 'image'], + output: ['text'], + endpoints: ['chat', 'chat-completions'], + features: ['streaming', 'function_calling', 'structured_outputs'], + tools: [ + 'web_search', + 'file_search', + 'image_generation', + 'code_interpreter', + 'mcp', + ], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +> + +const TEXT_EMBEDDING_3_LARGE = { + name: 'text-embedding-3-large', + pricing: { + // todo embedding tokens + input: { + normal: 0.13, + }, + output: { + normal: 0.13, + }, + }, + supports: { + input: ['text'], + output: ['text'], + endpoints: ['embedding', 'batch'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const TEXT_EMBEDDING_3_SMALL = { + name: 'text-embedding-3-small', + pricing: { + // todo embedding tokens + input: { + normal: 0.02, + }, + output: { + normal: 0.02, + }, + }, + supports: { + input: ['text'], + output: ['text'], + endpoints: ['embedding', 'batch'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const TEXT_EMBEDDING_3_ADA_002 = { + name: 'text-embedding-3-ada-002', + pricing: { + // todo embedding tokens + input: { + normal: 0.1, + }, + output: { + normal: 0.1, + }, + }, + supports: { + input: ['text'], + output: ['text'], + endpoints: ['embedding', 'batch'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const TTS_1 = { + name: 'tts-1', + pricing: { + // todo figure out pricing + input: { + normal: 15, + }, + output: { + normal: 15, + }, + }, + supports: { + input: ['text'], + output: ['audio'], + endpoints: ['speech_generation'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +const TTS_1_HD = { + name: 'tts-1-hd', + pricing: { + // todo figure out pricing + input: { + normal: 30, + }, + output: { + normal: 30, + }, + }, + supports: { + input: ['text'], + output: ['audio'], + endpoints: ['speech_generation'], + features: [], + }, +} as const satisfies ModelMeta< + OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions +> + +// Chat/text completion models (based on endpoints: "chat" or "chat-completions") +export const OPENAI_CHAT_MODELS = [ + // Frontier models + GPT5_1.name, + GPT5_1_CODEX.name, + GPT5.name, + GPT5_MINI.name, + GPT5_NANO.name, + GPT5_PRO.name, + GPT5_CODEX.name, + // Reasoning models + O3.name, + O3_PRO.name, + O3_MINI.name, + O4_MINI.name, + O3_DEEP_RESEARCH.name, + O4_MINI_DEEP_RESEARCH.name, + // GPT-4 series + GPT4_1.name, + GPT4_1_MINI.name, + GPT4_1_NANO.name, + GPT_4.name, + GPT_4_TURBO.name, + GPT_4O.name, + GPT_40_MINI.name, + // GPT-3.5 + GPT_3_5_TURBO.name, + // Audio-enabled chat models + GPT_AUDIO.name, + GPT_AUDIO_MINI.name, + GPT_4O_AUDIO.name, + GPT_4O_MINI_AUDIO.name, + // ChatGPT models + GPT_5_1_CHAT.name, + GPT_5_CHAT.name, + CHATGPT_40.name, + // Specialized + GPT_5_1_CODEX_MINI.name, + CODEX_MINI_LATEST.name, + // Preview models + GPT_4O_SEARCH_PREVIEW.name, + GPT_4O_MINI_SEARCH_PREVIEW.name, + COMPUTER_USE_PREVIEW.name, + // Legacy reasoning + O1.name, + O1_PRO.name, +] as const + +// Image generation models (based on endpoints: "image-generation" or "image-edit") +export const OPENAI_IMAGE_MODELS = [ + GPT_IMAGE_1.name, + GPT_IMAGE_1_MINI.name, + DALL_E_3.name, + DALL_E_2.name, +] as const + +// Embedding models (based on endpoints: "embedding") +export const OPENAI_EMBEDDING_MODELS = [ + TEXT_EMBEDDING_3_LARGE.name, + TEXT_EMBEDDING_3_SMALL.name, + TEXT_EMBEDDING_3_ADA_002.name, +] as const + +// Audio models (based on endpoints: "transcription", "speech_generation", or "realtime") +export const OPENAI_AUDIO_MODELS = [ + // Transcription models + GPT_4O_TRANSCRIBE.name, + GPT_4O_TRANSCRIBE_DIARIZE.name, + GPT_4O_MINI_TRANSCRIBE.name, + // Realtime models + GPT_REALTIME.name, + GPT_REALTIME_MINI.name, + GPT__4O_REALTIME.name, + GPT_4O_MINI_REALTIME.name, + // Text-to-speech models + GPT_4O_MINI_TTS.name, + TTS_1.name, + TTS_1_HD.name, +] as const + +// Transcription-only models (based on endpoints: "transcription") +export const OPENAI_TRANSCRIPTION_MODELS = [ + GPT_4O_TRANSCRIBE.name, + GPT_4O_TRANSCRIBE_DIARIZE.name, + GPT_4O_MINI_TRANSCRIBE.name, +] as const + +// Video generation models (based on endpoints: "video") +export const OPENAI_VIDEO_MODELS = [SORA2.name, SORA2_PRO.name] as const + +export const OPENAI_MODERATION_MODELS = [OMNI_MODERATION.name] as const + +export type OpenAIChatModel = (typeof OPENAI_CHAT_MODELS)[number] +export type OpenAIImageModel = (typeof OPENAI_IMAGE_MODELS)[number] +export type OpenAIEmbeddingModel = (typeof OPENAI_EMBEDDING_MODELS)[number] +export type OpenAIAudioModel = (typeof OPENAI_AUDIO_MODELS)[number] +export type OpenAIVideoModel = (typeof OPENAI_VIDEO_MODELS)[number] +export type OpenAITranscriptionModel = + (typeof OPENAI_TRANSCRIPTION_MODELS)[number] + +export const OPENAI_MODEL_META = { + [GPT5_1.name]: GPT5_1, + [GPT5_1_CODEX.name]: GPT5_1_CODEX, + [GPT5.name]: GPT5, + [GPT5_MINI.name]: GPT5_MINI, + [GPT5_NANO.name]: GPT5_NANO, + [GPT5_PRO.name]: GPT5_PRO, + [GPT5_CODEX.name]: GPT5_CODEX, + [SORA2.name]: SORA2, + [SORA2_PRO.name]: SORA2_PRO, + [GPT_IMAGE_1.name]: GPT_IMAGE_1, + [GPT_IMAGE_1_MINI.name]: GPT_IMAGE_1_MINI, + [O3_DEEP_RESEARCH.name]: O3_DEEP_RESEARCH, + [O4_MINI_DEEP_RESEARCH.name]: O4_MINI_DEEP_RESEARCH, + [O3_PRO.name]: O3_PRO, + [GPT_AUDIO.name]: GPT_AUDIO, + [GPT_REALTIME.name]: GPT_REALTIME, + [GPT_REALTIME_MINI.name]: GPT_REALTIME_MINI, + [GPT_AUDIO_MINI.name]: GPT_AUDIO_MINI, + [O3.name]: O3, + [O4_MINI.name]: O4_MINI, + [GPT4_1.name]: GPT4_1, + [GPT4_1_MINI.name]: GPT4_1_MINI, + [GPT4_1_NANO.name]: GPT4_1_NANO, + [O1_PRO.name]: O1_PRO, + [COMPUTER_USE_PREVIEW.name]: COMPUTER_USE_PREVIEW, + [GPT_4O_MINI_SEARCH_PREVIEW.name]: GPT_4O_MINI_SEARCH_PREVIEW, + [GPT_4O_SEARCH_PREVIEW.name]: GPT_4O_SEARCH_PREVIEW, + [O3_MINI.name]: O3_MINI, + [GPT_4O_MINI_AUDIO.name]: GPT_4O_MINI_AUDIO, + [GPT_4O_MINI_REALTIME.name]: GPT_4O_MINI_REALTIME, + [O1.name]: O1, + [OMNI_MODERATION.name]: OMNI_MODERATION, + [GPT_4O.name]: GPT_4O, + [GPT_4O_AUDIO.name]: GPT_4O_AUDIO, + [GPT_40_MINI.name]: GPT_40_MINI, + [GPT__4O_REALTIME.name]: GPT__4O_REALTIME, + [GPT_4_TURBO.name]: GPT_4_TURBO, + [CHATGPT_40.name]: CHATGPT_40, + [GPT_5_1_CODEX_MINI.name]: GPT_5_1_CODEX_MINI, + [CODEX_MINI_LATEST.name]: CODEX_MINI_LATEST, + [DALL_E_2.name]: DALL_E_2, + [DALL_E_3.name]: DALL_E_3, + [GPT_3_5_TURBO.name]: GPT_3_5_TURBO, + [GPT_4.name]: GPT_4, + [GPT_4O_MINI_TRANSCRIBE.name]: GPT_4O_MINI_TRANSCRIBE, + [GPT_4O_MINI_TTS.name]: GPT_4O_MINI_TTS, + [GPT_4O_TRANSCRIBE.name]: GPT_4O_TRANSCRIBE, + [GPT_4O_TRANSCRIBE_DIARIZE.name]: GPT_4O_TRANSCRIBE_DIARIZE, + [GPT_5_1_CHAT.name]: GPT_5_1_CHAT, + [GPT_5_CHAT.name]: GPT_5_CHAT, + [TEXT_EMBEDDING_3_LARGE.name]: TEXT_EMBEDDING_3_LARGE, + [TEXT_EMBEDDING_3_SMALL.name]: TEXT_EMBEDDING_3_SMALL, + [TEXT_EMBEDDING_3_ADA_002.name]: TEXT_EMBEDDING_3_ADA_002, + [TTS_1.name]: TTS_1, + [TTS_1_HD.name]: TTS_1_HD, +} as const + +export type OpenAIModelMetaMap = typeof OPENAI_MODEL_META + +/** + * Type-only map from chat model name to its provider options type. + * Used by the core AI types (via the adapter) to narrow + * `providerOptions` based on the selected model. + * + * Manually defined to ensure accurate type narrowing per model. + */ +export type OpenAIChatModelProviderOptionsByName = { + // Models WITH structured output support (have 'text' field) + 'gpt-5.1': OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-5.1-codex': OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-5': OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-5-mini': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-5-nano': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-5-pro': OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-5-codex': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4.1': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4.1-mini': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4.1-nano': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4o': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4o-mini': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + + // Models WITHOUT structured output support (NO 'text' field) + 'gpt-4': OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4-turbo': OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-3.5-turbo': OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'chatgpt-4.0': OpenAIBaseOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + o3: OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions + 'o3-pro': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions + 'o3-mini': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions + 'o4-mini': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions + 'o3-deep-research': OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIMetadataOptions + 'o4-mini-deep-research': OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIMetadataOptions + o1: OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions + 'o1-pro': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions + + // Audio models + 'gpt-audio': OpenAIBaseOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-audio-mini': OpenAIBaseOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4o-audio': OpenAIBaseOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4o-mini-audio': OpenAIBaseOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + + // Chat-only models + 'gpt-5.1-chat': OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIMetadataOptions + 'gpt-5-chat': OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIMetadataOptions + + // Codex models + 'gpt-5.1-codex-mini': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'codex-mini-latest': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + + // Search models + 'gpt-4o-search-preview': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + 'gpt-4o-mini-search-preview': OpenAIBaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + + // Special models + 'computer-use-preview': OpenAIBaseOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions +} diff --git a/packages/typescript/ai-openai/src/openai-adapter.ts b/packages/typescript/ai-openai/src/openai-adapter.ts index a77d8d586..c78d2203e 100644 --- a/packages/typescript/ai-openai/src/openai-adapter.ts +++ b/packages/typescript/ai-openai/src/openai-adapter.ts @@ -1,38 +1,37 @@ -import OpenAI_SDK from "openai"; -import { - BaseAdapter, - type ChatCompletionOptions, - type ChatCompletionResult, - type SummarizationOptions, - type SummarizationResult, - type EmbeddingOptions, - type EmbeddingResult, - type ModelMessage, - type Tool, +import OpenAI_SDK from 'openai' +import { BaseAdapter } from '@tanstack/ai' +import { OPENAI_CHAT_MODELS, OPENAI_EMBEDDING_MODELS } from './model-meta' +import { convertMessagesToInput } from './text/text-provider-options' +import { convertToolsToProviderFormat } from './tools' +import type { + ChatCompletionOptions, + ChatCompletionResult, + EmbeddingOptions, + EmbeddingResult, + ModelMessage, StreamChunk, -} from "@tanstack/ai"; -import { - OPENAI_CHAT_MODELS, - OPENAI_EMBEDDING_MODELS, - type OpenAIChatModelProviderOptionsByName, -} from "./model-meta"; -import { - convertMessagesToInput, + SummarizationOptions, + SummarizationResult, + Tool, +} from '@tanstack/ai' +import type { OpenAIChatModelProviderOptionsByName } from './model-meta' +import type { ExternalTextProviderOptions, InternalTextProviderOptions, -} from "./text/text-provider-options"; -import { convertToolsToProviderFormat } from "./tools"; +} from './text/text-provider-options' export interface OpenAIConfig { - apiKey: string; - organization?: string; - baseURL?: string; + apiKey: string + organization?: string + baseURL?: string } /** * Alias for TextProviderOptions */ -export type OpenAIProviderOptions = ExternalTextProviderOptions; +export type OpenAIProviderOptions = ExternalTextProviderOptions + + /** * OpenAI-specific provider options for image generation @@ -41,13 +40,13 @@ export type OpenAIProviderOptions = ExternalTextProviderOptions; */ export interface OpenAIImageProviderOptions { /** Image quality: 'standard' | 'hd' (dall-e-3, gpt-image-1 only) */ - quality?: "standard" | "hd"; + quality?: 'standard' | 'hd' /** Image style: 'natural' | 'vivid' (dall-e-3 only) */ - style?: "natural" | "vivid"; + style?: 'natural' | 'vivid' /** Background: 'transparent' | 'opaque' (gpt-image-1 only) */ - background?: "transparent" | "opaque"; + background?: 'transparent' | 'opaque' /** Output format: 'png' | 'webp' | 'jpeg' (gpt-image-1 only) */ - outputFormat?: "png" | "webp" | "jpeg"; + outputFormat?: 'png' | 'webp' | 'jpeg' } /** @@ -57,9 +56,9 @@ export interface OpenAIImageProviderOptions { */ export interface OpenAIEmbeddingProviderOptions { /** Encoding format for embeddings: 'float' | 'base64' */ - encodingFormat?: "float" | "base64"; + encodingFormat?: 'float' | 'base64' /** Unique identifier for end-user (for abuse monitoring) */ - user?: string; + user?: string } /** @@ -69,24 +68,24 @@ export interface OpenAIEmbeddingProviderOptions { */ export interface OpenAIAudioTranscriptionProviderOptions { /** Timestamp granularities: 'word' | 'segment' (whisper-1 only) */ - timestampGranularities?: Array<"word" | "segment">; + timestampGranularities?: Array<'word' | 'segment'> /** Chunking strategy for long audio (gpt-4o-transcribe-diarize): 'auto' or VAD config */ chunkingStrategy?: - | "auto" - | { - type: "vad"; - threshold?: number; - prefix_padding_ms?: number; - silence_duration_ms?: number; - }; + | 'auto' + | { + type: 'vad' + threshold?: number + prefix_padding_ms?: number + silence_duration_ms?: number + } /** Known speaker names for diarization (gpt-4o-transcribe-diarize) */ - knownSpeakerNames?: string[]; + knownSpeakerNames?: Array /** Known speaker reference audio as data URLs (gpt-4o-transcribe-diarize) */ - knownSpeakerReferences?: string[]; + knownSpeakerReferences?: Array /** Whether to enable streaming (gpt-4o-transcribe, gpt-4o-mini-transcribe only) */ - stream?: boolean; + stream?: boolean /** Include log probabilities (gpt-4o-transcribe, gpt-4o-mini-transcribe only) */ - logprobs?: boolean; + logprobs?: boolean } /** @@ -102,7 +101,7 @@ export interface OpenAITextToSpeechProviderOptions { * Combined audio provider options (transcription + text-to-speech) */ export type OpenAIAudioProviderOptions = - OpenAIAudioTranscriptionProviderOptions & OpenAITextToSpeechProviderOptions; + OpenAIAudioTranscriptionProviderOptions & OpenAITextToSpeechProviderOptions /** * OpenAI-specific provider options for video generation @@ -111,9 +110,9 @@ export type OpenAIAudioProviderOptions = */ export interface OpenAIVideoProviderOptions { /** Input reference image (File, Blob, or Buffer) for first frame */ - inputReference?: File | Blob | Buffer; + inputReference?: File | Blob | Buffer /** Remix video ID to modify an existing video */ - remixVideoId?: string; + remixVideoId?: string } export class OpenAI extends BaseAdapter< @@ -123,50 +122,50 @@ export class OpenAI extends BaseAdapter< OpenAIEmbeddingProviderOptions, OpenAIChatModelProviderOptionsByName > { - name = "openai" as const; - models = OPENAI_CHAT_MODELS; - embeddingModels = OPENAI_EMBEDDING_MODELS; + name = 'openai' as const + models = OPENAI_CHAT_MODELS + embeddingModels = OPENAI_EMBEDDING_MODELS - private client: OpenAI_SDK; + private client: OpenAI_SDK // Type-only map used by core AI to infer per-model provider options. // This is never set at runtime; it exists purely for TypeScript. // Using definite assignment assertion (!) since this is type-only. // @ts-ignore - We never assign this at runtime and it's only used for types - _modelProviderOptionsByName: OpenAIChatModelProviderOptionsByName; + _modelProviderOptionsByName: OpenAIChatModelProviderOptionsByName constructor(config: OpenAIConfig) { - super({}); + super({}) this.client = new OpenAI_SDK({ apiKey: config.apiKey, organization: config.organization, baseURL: config.baseURL, - }); + }) } async *chatStream( - options: ChatCompletionOptions + options: ChatCompletionOptions, ): AsyncIterable { // Track tool call metadata by unique ID // OpenAI streams tool calls with deltas - first chunk has ID/name, subsequent chunks only have args // We assign our own indices as we encounter unique tool call IDs - const toolCallMetadata = new Map(); + const toolCallMetadata = new Map() // Use Chat Completions API (standard, well-established API with reliable tool call support) // instead of Responses API which has issues with argument parsing const messages = this.convertMessagesToChatCompletionsFormat( - options.messages - ); + options.messages, + ) const tools = options.tools ? this.convertToolsToChatCompletionsFormat([...options.tools]) - : undefined; + : undefined const response = await this.client.chat.completions.create( { model: options.model, messages, tools, - tool_choice: options.options?.toolChoice as any, + tool_choice: options.options?.toolChoice, temperature: options.options?.temperature, max_tokens: options.options?.maxTokens, top_p: options.options?.topP, @@ -175,50 +174,50 @@ export class OpenAI extends BaseAdapter< { headers: options.request?.headers, signal: options.request?.signal, - } - ); + }, + ) // Chat Completions API uses SSE format - iterate directly yield* this.processChatCompletionsStream( response, toolCallMetadata, options, - () => this.generateId() - ); + () => this.generateId(), + ) } async summarize(options: SummarizationOptions): Promise { - const systemPrompt = this.buildSummarizationPrompt(options); + const systemPrompt = this.buildSummarizationPrompt(options) const response = await this.client.chat.completions.create({ - model: options.model || "gpt-3.5-turbo", + model: options.model || 'gpt-3.5-turbo', messages: [ - { role: "system", content: systemPrompt }, - { role: "user", content: options.text }, + { role: 'system', content: systemPrompt }, + { role: 'user', content: options.text }, ], max_tokens: options.maxLength, temperature: 0.3, stream: false, - }); + }) return { id: response.id, model: response.model, - summary: response.choices[0].message.content || "", + summary: response.choices[0]?.message.content || '', usage: { promptTokens: response.usage?.prompt_tokens || 0, completionTokens: response.usage?.completion_tokens || 0, totalTokens: response.usage?.total_tokens || 0, }, - }; + } } async createEmbeddings(options: EmbeddingOptions): Promise { const response = await this.client.embeddings.create({ - model: options.model || "text-embedding-ada-002", + model: options.model || 'text-embedding-ada-002', input: options.input, dimensions: options.dimensions, - }); + }) return { id: this.generateId(), @@ -228,71 +227,71 @@ export class OpenAI extends BaseAdapter< promptTokens: response.usage.prompt_tokens, totalTokens: response.usage.total_tokens, }, - }; + } } private buildSummarizationPrompt(options: SummarizationOptions): string { - let prompt = "You are a professional summarizer. "; + let prompt = 'You are a professional summarizer. ' switch (options.style) { - case "bullet-points": - prompt += "Provide a summary in bullet point format. "; - break; - case "paragraph": - prompt += "Provide a summary in paragraph format. "; - break; - case "concise": - prompt += "Provide a very concise summary in 1-2 sentences. "; - break; + case 'bullet-points': + prompt += 'Provide a summary in bullet point format. ' + break + case 'paragraph': + prompt += 'Provide a summary in paragraph format. ' + break + case 'concise': + prompt += 'Provide a very concise summary in 1-2 sentences. ' + break default: - prompt += "Provide a clear and concise summary. "; + prompt += 'Provide a clear and concise summary. ' } if (options.focus && options.focus.length > 0) { - prompt += `Focus on the following aspects: ${options.focus.join(", ")}. `; + prompt += `Focus on the following aspects: ${options.focus.join(', ')}. ` } if (options.maxLength) { - prompt += `Keep the summary under ${options.maxLength} tokens. `; + prompt += `Keep the summary under ${options.maxLength} tokens. ` } - return prompt; + return prompt } private mapOpenAIResponseToChatResult( - response: OpenAI_SDK.Responses.Response + response: OpenAI_SDK.Responses.Response, ): ChatCompletionResult { // response.output is an array of output items - const outputItems = response.output; + const outputItems = response.output // Find the message output item - const messageItem = outputItems.find((item) => item.type === "message"); + const messageItem = outputItems.find((item) => item.type === 'message') const content = - messageItem?.content?.[0].type === "output_text" - ? messageItem?.content?.[0]?.text || "" - : ""; + messageItem?.content[0]?.type === 'output_text' + ? messageItem.content[0].text || '' + : '' // Find function call items const functionCalls = outputItems.filter( - (item) => item.type === "function_call" - ); + (item) => item.type === 'function_call', + ) const toolCalls = functionCalls.length > 0 ? functionCalls.map((fc) => ({ - id: fc.call_id, - type: "function" as const, - function: { - name: fc.name, - arguments: JSON.stringify(fc.arguments), - }, - })) - : undefined; + id: fc.call_id, + type: 'function' as const, + function: { + name: fc.name, + arguments: JSON.stringify(fc.arguments), + }, + })) + : undefined return { id: response.id, model: response.model, content, - role: "assistant", + role: 'assistant', finishReason: messageItem?.status, toolCalls, usage: { @@ -300,98 +299,99 @@ export class OpenAI extends BaseAdapter< completionTokens: response.usage?.output_tokens || 0, totalTokens: response.usage?.total_tokens || 0, }, - }; + } } /** * Convert tools to Chat Completions API format */ private convertToolsToChatCompletionsFormat( - tools: Array + tools: Array, ): Array { return tools.map((tool) => { // Chat Completions API uses simpler format: { type: "function", function: { name, description, parameters } } return { - type: "function" as const, + type: 'function' as const, function: { name: tool.function.name, - description: tool.function.description || "", - parameters: tool.function.parameters || {}, + description: tool.function.description || '', + parameters: tool.function.parameters, }, - }; - }); + } + }) } /** * Convert messages to Chat Completions API format */ private convertMessagesToChatCompletionsFormat( - messages: ModelMessage[] + messages: Array, ): Array { const result: Array = - []; + [] for (const message of messages) { // Handle tool messages - convert to tool role - if (message.role === "tool") { + if (message.role === 'tool') { result.push({ - role: "tool", - tool_call_id: message.toolCallId || "", + role: 'tool', + tool_call_id: message.toolCallId || '', content: - typeof message.content === "string" + typeof message.content === 'string' ? message.content : JSON.stringify(message.content), - }); - continue; + }) + continue } // Handle assistant messages with tool calls - if (message.role === "assistant") { + if (message.role === 'assistant') { const assistantMsg: OpenAI_SDK.Chat.Completions.ChatCompletionAssistantMessageParam = - { - role: "assistant", - content: message.content || null, - }; + { + role: 'assistant', + content: message.content || null, + } if (message.toolCalls && message.toolCalls.length > 0) { assistantMsg.tool_calls = message.toolCalls.map((tc) => ({ id: tc.id, - type: "function", + type: 'function', function: { name: tc.function.name, arguments: - typeof tc.function.arguments === "string" + typeof tc.function.arguments === 'string' ? tc.function.arguments - : JSON.stringify(tc.function.arguments || {}), + : JSON.stringify(tc.function.arguments), }, - })); + })) } - result.push(assistantMsg); - continue; + result.push(assistantMsg) + continue } // Handle user and system messages - if (message.role === "user") { + if (message.role === 'user') { result.push({ - role: "user", + role: 'user', content: - typeof message.content === "string" + typeof message.content === 'string' ? message.content : JSON.stringify(message.content), - }); - } else if (message.role === "system") { + }) + } + if (message.role === 'system') { result.push({ - role: "system", + role: 'system', content: - typeof message.content === "string" + typeof message.content === 'string' ? message.content : JSON.stringify(message.content), - }); + }) } } - return result; + return result } /** @@ -402,105 +402,105 @@ export class OpenAI extends BaseAdapter< stream: AsyncIterable, toolCallMetadata: Map, options: ChatCompletionOptions, - generateId: () => string + generateId: () => string, ): AsyncIterable { - let accumulatedContent = ""; - const timestamp = Date.now(); - let nextIndex = 0; + let accumulatedContent = '' + const timestamp = Date.now() + let nextIndex = 0 // Track accumulated function call arguments by call_id - const accumulatedFunctionCallArguments = new Map(); + const accumulatedFunctionCallArguments = new Map() - let responseId: string | null = null; - let model: string | null = null; + let responseId: string | null = null + let model: string | null = null try { for await (const chunk of stream) { // Preserve response metadata - if (chunk.id) responseId = chunk.id; - if (chunk.model) model = chunk.model; + if (chunk.id) responseId = chunk.id + if (chunk.model) model = chunk.model - const choice = chunk.choices?.[0]; - if (!choice) continue; + const choice = chunk.choices[0] + if (!choice) continue - const delta = choice.delta; - const finishReason = choice.finish_reason; + const delta = choice.delta + const finishReason = choice.finish_reason // Handle content delta - if (delta?.content) { - accumulatedContent += delta.content; + if (delta.content) { + accumulatedContent += delta.content yield { - type: "content" as const, + type: 'content' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, delta: delta.content, content: accumulatedContent, - role: "assistant" as const, - }; + role: 'assistant' as const, + } } // Handle tool calls - if (delta?.tool_calls) { + if (delta.tool_calls) { for (const toolCall of delta.tool_calls) { - let toolCallId: string; - let toolCallName: string; - let toolCallArgs: string; - let actualIndex: number; + let toolCallId: string + let toolCallName: string + let toolCallArgs: string + let actualIndex: number if (toolCall.id) { // First chunk with ID and name - toolCallId = toolCall.id; - toolCallName = toolCall.function?.name || ""; - toolCallArgs = toolCall.function?.arguments || ""; + toolCallId = toolCall.id + toolCallName = toolCall.function?.name || '' + toolCallArgs = toolCall.function?.arguments || '' // Track for index assignment if (!toolCallMetadata.has(toolCallId)) { toolCallMetadata.set(toolCallId, { index: nextIndex++, name: toolCallName, - }); - accumulatedFunctionCallArguments.set(toolCallId, ""); + }) + accumulatedFunctionCallArguments.set(toolCallId, '') } - const meta = toolCallMetadata.get(toolCallId)!; - actualIndex = meta.index; + const meta = toolCallMetadata.get(toolCallId)! + actualIndex = meta.index // Track the delta for this chunk if (toolCallArgs) { const current = - accumulatedFunctionCallArguments.get(toolCallId) || ""; + accumulatedFunctionCallArguments.get(toolCallId) || '' accumulatedFunctionCallArguments.set( toolCallId, - current + toolCallArgs - ); + current + toolCallArgs, + ) } } else { // Delta chunk - find by index const openAIIndex = - typeof toolCall.index === "number" ? toolCall.index : 0; - const entry = Array.from(toolCallMetadata.entries())[openAIIndex]; + typeof toolCall.index === 'number' ? toolCall.index : 0 + const entry = Array.from(toolCallMetadata.entries())[openAIIndex] if (entry) { - const [id, meta] = entry; - toolCallId = id; - toolCallName = meta.name; - actualIndex = meta.index; - toolCallArgs = toolCall.function?.arguments || ""; + const [id, meta] = entry + toolCallId = id + toolCallName = meta.name + actualIndex = meta.index + toolCallArgs = toolCall.function?.arguments || '' // Track the delta if (toolCallArgs) { const current = - accumulatedFunctionCallArguments.get(toolCallId) || ""; + accumulatedFunctionCallArguments.get(toolCallId) || '' accumulatedFunctionCallArguments.set( toolCallId, - current + toolCallArgs - ); + current + toolCallArgs, + ) } } else { // Fallback - toolCallId = `call_${Date.now()}`; - toolCallName = ""; - actualIndex = openAIIndex; - toolCallArgs = ""; + toolCallId = `call_${Date.now()}` + toolCallName = '' + actualIndex = openAIIndex + toolCallArgs = '' } } @@ -510,20 +510,20 @@ export class OpenAI extends BaseAdapter< // The ToolCallManager will accumulate the argument deltas for us if (toolCall.id || toolCallArgs) { yield { - type: "tool_call", + type: 'tool_call', id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, toolCall: { id: toolCallId, - type: "function", + type: 'function', function: { name: toolCallName, arguments: toolCallArgs, // Only the delta, not accumulated }, }, index: actualIndex, - }; + } } } } @@ -531,32 +531,32 @@ export class OpenAI extends BaseAdapter< // Handle completion if (finishReason) { yield { - type: "done" as const, + type: 'done' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, finishReason: finishReason as any, usage: chunk.usage ? { - promptTokens: chunk.usage.prompt_tokens || 0, - completionTokens: chunk.usage.completion_tokens || 0, - totalTokens: chunk.usage.total_tokens || 0, - } + promptTokens: chunk.usage.prompt_tokens || 0, + completionTokens: chunk.usage.completion_tokens || 0, + totalTokens: chunk.usage.total_tokens || 0, + } : undefined, - }; + } } } } catch (error: any) { yield { - type: "error", + type: 'error', id: generateId(), - model: options.model || "gpt-3.5-turbo", + model: options.model || 'gpt-3.5-turbo', timestamp, error: { - message: error.message || "Unknown error occurred", + message: error.message || 'Unknown error occurred', code: error.code, }, - }; + } } } @@ -565,58 +565,59 @@ export class OpenAI extends BaseAdapter< * Each line is a complete JSON object */ private async *parseResponsesStream( - stream: ReadableStream + stream: ReadableStream, ): AsyncIterable { - const reader = stream.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - let parsedCount = 0; + const reader = stream.getReader() + const decoder = new TextDecoder() + let buffer = '' + let parsedCount = 0 try { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition while (true) { - const { done, value } = await reader.read(); - if (done) break; + const { done, value } = await reader.read() + if (done) break // Decode the chunk and add to buffer - buffer += decoder.decode(value, { stream: true }); + buffer += decoder.decode(value, { stream: true }) // Process complete lines (newline-separated JSON objects) - const lines = buffer.split("\n"); - buffer = lines.pop() || ""; // Keep incomplete line in buffer + const lines = buffer.split('\n') + buffer = lines.pop() || '' // Keep incomplete line in buffer for (const line of lines) { - const trimmed = line.trim(); - if (!trimmed) continue; + const trimmed = line.trim() + if (!trimmed) continue try { - const parsed = JSON.parse(trimmed); - parsedCount++; + const parsed = JSON.parse(trimmed) + parsedCount++ // Debug: Log reasoning-related events at the parser level if ( parsed.type && - (parsed.type.includes("reasoning") || - parsed.type.includes("reasoning_text")) + (parsed.type.includes('reasoning') || + parsed.type.includes('reasoning_text')) ) { console.log( - "[OpenAI Adapter] Parser: Reasoning event detected:", + '[OpenAI Adapter] Parser: Reasoning event detected:', { type: parsed.type, hasDelta: !!parsed.delta, hasItem: !!parsed.item, hasPart: !!parsed.part, fullEvent: JSON.stringify(parsed).substring(0, 500), - } - ); + }, + ) } - yield parsed; + yield parsed } catch (e) { // Skip malformed JSON lines console.log( - "[OpenAI Adapter] Parser: Failed to parse line:", - trimmed.substring(0, 200) - ); + '[OpenAI Adapter] Parser: Failed to parse line:', + trimmed.substring(0, 200), + ) } } } @@ -624,15 +625,15 @@ export class OpenAI extends BaseAdapter< // Process any remaining buffer if (buffer.trim()) { try { - const parsed = JSON.parse(buffer.trim()); - parsedCount++; - yield parsed; + const parsed = JSON.parse(buffer.trim()) + parsedCount++ + yield parsed } catch (e) { // Ignore parse errors for final buffer } } } finally { - reader.releaseLock(); + reader.releaseLock() } } @@ -641,43 +642,40 @@ export class OpenAI extends BaseAdapter< stream: AsyncIterable, toolCallMetadata: Map, options: ChatCompletionOptions, - generateId: () => string + generateId: () => string, ): AsyncIterable { - let accumulatedContent = ""; - let accumulatedReasoning = ""; - const timestamp = Date.now(); - let nextIndex = 0; - let chunkCount = 0; + let accumulatedContent = '' + let accumulatedReasoning = '' + const timestamp = Date.now() + let nextIndex = 0 + let chunkCount = 0 // Track accumulated function call arguments by call_id - const accumulatedFunctionCallArguments = new Map(); + const accumulatedFunctionCallArguments = new Map() // Map item_id (from delta events) to call_id (from function_call items) - const itemIdToCallId = new Map(); + const itemIdToCallId = new Map() // Preserve response metadata across events - let responseId: string | null = null; - let model: string | null = null; - let doneChunkEmitted = false; - const eventTypeCounts = new Map(); + let responseId: string | null = null + let model: string | null = null + let doneChunkEmitted = false + const eventTypeCounts = new Map() // Track which item indices are reasoning items - const reasoningItemIndices = new Set(); + const reasoningItemIndices = new Set() try { for await (const chunk of stream) { - chunkCount++; + chunkCount++ // Track event types for debugging if (chunk.type) { - const count = eventTypeCounts.get(chunk.type) || 0; - eventTypeCounts.set(chunk.type, count + 1); + const count = eventTypeCounts.get(chunk.type) || 0 + eventTypeCounts.set(chunk.type, count + 1) // Log first occurrence of each event type if (count === 0) { - console.log( - "[OpenAI Adapter] New event type detected:", - chunk.type - ); + console.log('[OpenAI Adapter] New event type detected:', chunk.type) } } @@ -690,19 +688,19 @@ export class OpenAI extends BaseAdapter< // - response.function_call_arguments.done // - response.done - let delta: any = null; - let finishReason: string | null = null; + let delta: any = null + let finishReason: string | null = null // Handle Responses API event format if (chunk.type) { - const eventType = chunk.type; + const eventType = chunk.type // Debug: Log all event types to help diagnose reasoning events if ( - eventType.includes("reasoning") || - eventType.includes("output_reasoning") + eventType.includes('reasoning') || + eventType.includes('output_reasoning') ) { - console.log("[OpenAI Adapter] Reasoning-related event detected:", { + console.log('[OpenAI Adapter] Reasoning-related event detected:', { eventType, hasDelta: !!chunk.delta, deltaType: typeof chunk.delta, @@ -711,15 +709,15 @@ export class OpenAI extends BaseAdapter< itemType: chunk.item?.type, hasPart: !!chunk.part, partType: chunk.part?.type, - }); + }) } // Debug: Inspect content_part events - reasoning might come through here if ( - eventType === "response.content_part.added" || - eventType === "response.content_part.done" + eventType === 'response.content_part.added' || + eventType === 'response.content_part.done' ) { - console.log("[OpenAI Adapter] Content part event:", { + console.log('[OpenAI Adapter] Content part event:', { eventType, hasPart: !!chunk.part, partType: chunk.part?.type, @@ -731,24 +729,24 @@ export class OpenAI extends BaseAdapter< itemIndex: chunk.item_index, partIndex: chunk.part_index, fullPart: JSON.stringify(chunk.part).substring(0, 200), // First 200 chars - }); + }) } // Debug: Inspect ALL output_item.added events - if (eventType === "response.output_item.added" && chunk.item) { - const item = chunk.item; - const itemIndex = chunk.item_index; + if (eventType === 'response.output_item.added' && chunk.item) { + const item = chunk.item + const itemIndex = chunk.item_index // Track reasoning items by index - if (item.type === "reasoning" && itemIndex !== undefined) { - reasoningItemIndices.add(itemIndex); + if (item.type === 'reasoning' && itemIndex !== undefined) { + reasoningItemIndices.add(itemIndex) console.log( - "[OpenAI Adapter] Reasoning item detected, tracking index:", - itemIndex - ); + '[OpenAI Adapter] Reasoning item detected, tracking index:', + itemIndex, + ) } - console.log("[OpenAI Adapter] Output item added:", { + console.log('[OpenAI Adapter] Output item added:', { itemType: item.type, itemIndex, itemId: item.id, @@ -763,50 +761,50 @@ export class OpenAI extends BaseAdapter< ? item.summary.length : 0, chunkKeys: Object.keys(chunk), - }); + }) - if (item.type === "message" && item.content) { - const contentTypes = item.content.map((c: any) => c.type); + if (item.type === 'message' && item.content) { + const contentTypes = item.content.map((c: any) => c.type) console.log( - "[OpenAI Adapter] Output item added (message details):", + '[OpenAI Adapter] Output item added (message details):', { itemType: item.type, contentTypes, - hasReasoning: contentTypes.includes("output_reasoning"), + hasReasoning: contentTypes.includes('output_reasoning'), contentDetails: item.content.map((c: any) => ({ type: c.type, hasText: !!c.text, textLength: c.text?.length || 0, })), - } - ); - } else if (item.type !== "message") { + }, + ) + } else if (item.type !== 'message') { // Log non-message items - maybe reasoning comes as a different item type? - console.log("[OpenAI Adapter] Output item added (non-message):", { + console.log('[OpenAI Adapter] Output item added (non-message):', { itemType: item.type, fullItem: JSON.stringify(item).substring(0, 500), // First 500 chars - }); + }) } } // Extract and preserve response metadata from response.created or response.in_progress if (chunk.response) { - responseId = chunk.response.id; - model = chunk.response.model; + responseId = chunk.response.id + model = chunk.response.model } // Handle output text deltas (content streaming) // For response.output_text.delta, chunk.delta is an array of characters/strings - if (eventType === "response.output_text.delta" && chunk.delta) { + if (eventType === 'response.output_text.delta' && chunk.delta) { // Delta is an array of characters/strings - join them together if (Array.isArray(chunk.delta)) { - const textDelta = chunk.delta.join(""); + const textDelta = chunk.delta.join('') if (textDelta) { - delta = { content: textDelta }; + delta = { content: textDelta } } - } else if (typeof chunk.delta === "string") { + } else if (typeof chunk.delta === 'string') { // Fallback: if it's already a string - delta = { content: chunk.delta }; + delta = { content: chunk.delta } } } @@ -814,15 +812,10 @@ export class OpenAI extends BaseAdapter< // response.function_call_arguments.delta events contain incremental argument updates // Note: delta events use item_id, not call_id, and we need to map item_id to call_id if ( - eventType === "response.function_call_arguments.delta" && + eventType === 'response.function_call_arguments.delta' && chunk.delta !== undefined && chunk.item_id ) { - // Find the call_id by looking up the item_id in the output items - // We need to track item_id -> call_id mapping - // For now, we'll look it up from the item if available, or use a reverse lookup - let callId: string | undefined; - // Try to find call_id from item_id by checking if we have the item stored // The item_id corresponds to the function_call item's id // We need to maintain a mapping: item_id -> call_id @@ -834,44 +827,47 @@ export class OpenAI extends BaseAdapter< // by checking accumulated items or using a reverse lookup // Better approach: track item_id -> call_id mapping when we see output_item.added - const itemId = chunk.item_id; + const itemId = chunk.item_id + // Find the call_id by looking up the item_id in the output items + // We need to track item_id -> call_id mapping + // For now, we'll look it up from the item if available, or use a reverse lookup - callId = itemIdToCallId.get(itemId); + const callId = itemIdToCallId.get(itemId) if (callId) { const currentArgs = - accumulatedFunctionCallArguments.get(callId) || ""; + accumulatedFunctionCallArguments.get(callId) || '' // Delta is a JSON string fragment - append it to accumulate - let deltaText: string; - if (typeof chunk.delta === "string") { - deltaText = chunk.delta; + let deltaText: string + if (typeof chunk.delta === 'string') { + deltaText = chunk.delta } else if (Array.isArray(chunk.delta)) { // Delta might be an array of characters/strings - deltaText = chunk.delta.join(""); + deltaText = chunk.delta.join('') } else { - deltaText = JSON.stringify(chunk.delta); + deltaText = JSON.stringify(chunk.delta) } - const newArgs = currentArgs + deltaText; - accumulatedFunctionCallArguments.set(callId, newArgs); + const newArgs = currentArgs + deltaText + accumulatedFunctionCallArguments.set(callId, newArgs) // Debug: log delta accumulation for recommendGuitar if (process.env.DEBUG_TOOL_ARGS) { - const meta = toolCallMetadata.get(callId); - if (meta?.name === "recommendGuitar") { + const meta = toolCallMetadata.get(callId) + if (meta?.name === 'recommendGuitar') { console.log( `[DEBUG] Delta for ${callId}:`, JSON.stringify(deltaText), - "-> Accumulated:", - newArgs - ); + '-> Accumulated:', + newArgs, + ) } } // Emit updated tool call with accumulated arguments - const meta = toolCallMetadata.get(callId); + const meta = toolCallMetadata.get(callId) if (meta) { - delta = delta || {}; + delta = delta || {} delta.tool_calls = [ { id: callId, @@ -880,7 +876,7 @@ export class OpenAI extends BaseAdapter< arguments: newArgs, }, }, - ]; + ] } } } @@ -888,44 +884,44 @@ export class OpenAI extends BaseAdapter< // Handle function call arguments done (complete arguments) // response.function_call_arguments.done events contain the final complete arguments if ( - eventType === "response.function_call_arguments.done" && + eventType === 'response.function_call_arguments.done' && chunk.item_id ) { - const itemId = chunk.item_id; - const callId = itemIdToCallId.get(itemId); + const itemId = chunk.item_id + const callId = itemIdToCallId.get(itemId) if (callId) { // Prefer accumulated arguments from deltas over the done event's arguments // The done event might have incomplete or empty arguments let completeArgs: string = - accumulatedFunctionCallArguments.get(callId) || ""; + accumulatedFunctionCallArguments.get(callId) || '' // If we don't have accumulated args, try the done event's arguments - if (!completeArgs || completeArgs === "") { + if (!completeArgs || completeArgs === '') { if ( - typeof chunk.arguments === "string" && - chunk.arguments !== "{}" + typeof chunk.arguments === 'string' && + chunk.arguments !== '{}' ) { - completeArgs = chunk.arguments; + completeArgs = chunk.arguments } else if ( chunk.arguments && - typeof chunk.arguments === "object" && + typeof chunk.arguments === 'object' && Object.keys(chunk.arguments).length > 0 ) { // If it's a non-empty object, stringify it - completeArgs = JSON.stringify(chunk.arguments); + completeArgs = JSON.stringify(chunk.arguments) } else { // Fallback to empty object - completeArgs = "{}"; + completeArgs = '{}' } } - accumulatedFunctionCallArguments.set(callId, completeArgs); + accumulatedFunctionCallArguments.set(callId, completeArgs) // Emit final tool call with complete arguments - const meta = toolCallMetadata.get(callId); + const meta = toolCallMetadata.get(callId) if (meta) { - delta = delta || {}; + delta = delta || {} delta.tool_calls = [ { id: callId, @@ -934,109 +930,109 @@ export class OpenAI extends BaseAdapter< arguments: completeArgs, }, }, - ]; + ] } } } // Handle reasoning text deltas (reasoning content streaming) // OpenAI uses response.reasoning_text.delta events for reasoning content - if (eventType === "response.reasoning_text.delta" && chunk.delta) { + if (eventType === 'response.reasoning_text.delta' && chunk.delta) { // Delta is an array of characters/strings - join them together - let reasoningDelta = ""; + let reasoningDelta = '' if (Array.isArray(chunk.delta)) { - reasoningDelta = chunk.delta.join(""); - } else if (typeof chunk.delta === "string") { - reasoningDelta = chunk.delta; + reasoningDelta = chunk.delta.join('') + } else if (typeof chunk.delta === 'string') { + reasoningDelta = chunk.delta } if (reasoningDelta) { - accumulatedReasoning += reasoningDelta; + accumulatedReasoning += reasoningDelta const thinkingChunk: StreamChunk = { - type: "thinking" as const, + type: 'thinking' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, delta: reasoningDelta, content: accumulatedReasoning, - }; + } console.log( - "[OpenAI Adapter] Emitting thinking chunk (reasoning_text.delta):", + '[OpenAI Adapter] Emitting thinking chunk (reasoning_text.delta):', { eventType, deltaLength: reasoningDelta.length, accumulatedLength: accumulatedReasoning.length, chunkType: thinkingChunk.type, - } - ); - yield thinkingChunk; + }, + ) + yield thinkingChunk } } // Also handle the old format for backwards compatibility - if (eventType === "response.output_reasoning.delta" && chunk.delta) { - let reasoningDelta = ""; + if (eventType === 'response.output_reasoning.delta' && chunk.delta) { + let reasoningDelta = '' if (Array.isArray(chunk.delta)) { - reasoningDelta = chunk.delta.join(""); - } else if (typeof chunk.delta === "string") { - reasoningDelta = chunk.delta; + reasoningDelta = chunk.delta.join('') + } else if (typeof chunk.delta === 'string') { + reasoningDelta = chunk.delta } if (reasoningDelta) { - accumulatedReasoning += reasoningDelta; + accumulatedReasoning += reasoningDelta const thinkingChunk: StreamChunk = { - type: "thinking" as const, + type: 'thinking' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, delta: reasoningDelta, content: accumulatedReasoning, - }; + } console.log( - "[OpenAI Adapter] Emitting thinking chunk (output_reasoning.delta):", + '[OpenAI Adapter] Emitting thinking chunk (output_reasoning.delta):', { eventType, deltaLength: reasoningDelta.length, accumulatedLength: accumulatedReasoning.length, chunkType: thinkingChunk.type, - } - ); - yield thinkingChunk; + }, + ) + yield thinkingChunk } } // Handle content part events - reasoning might come through content parts // Note: Content parts can belong to reasoning items (check item_index) - if (eventType === "response.content_part.added" && chunk.part) { - const part = chunk.part; - const itemIndex = chunk.item_index; + if (eventType === 'response.content_part.added' && chunk.part) { + const part = chunk.part + const itemIndex = chunk.item_index // Check if this content part belongs to a reasoning item const belongsToReasoningItem = - itemIndex !== undefined && reasoningItemIndices.has(itemIndex); + itemIndex !== undefined && reasoningItemIndices.has(itemIndex) // Check if this is a reasoning content part const isReasoningPart = - part.type === "output_reasoning" || - part.content_type === "reasoning" || - part.type === "reasoning_text" || - part.type === "reasoning" || - belongsToReasoningItem; + part.type === 'output_reasoning' || + part.content_type === 'reasoning' || + part.type === 'reasoning_text' || + part.type === 'reasoning' || + belongsToReasoningItem if (isReasoningPart) { - const reasoningText = part.text || ""; + const reasoningText = part.text || '' if (reasoningText) { - accumulatedReasoning += reasoningText; + accumulatedReasoning += reasoningText const thinkingChunk: StreamChunk = { - type: "thinking" as const, + type: 'thinking' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, delta: reasoningText, content: accumulatedReasoning, - }; + } console.log( - "[OpenAI Adapter] Emitting thinking chunk (from content_part):", + '[OpenAI Adapter] Emitting thinking chunk (from content_part):', { eventType, partType: part.type, @@ -1045,42 +1041,42 @@ export class OpenAI extends BaseAdapter< belongsToReasoningItem, textLength: reasoningText.length, accumulatedLength: accumulatedReasoning.length, - } - ); - yield thinkingChunk; + }, + ) + yield thinkingChunk } } } // Handle output item added (new items like function calls or complete messages) - if (eventType === "response.output_item.added" && chunk.item) { - const item = chunk.item; - if (item.type === "function_call") { + if (eventType === 'response.output_item.added' && chunk.item) { + const item = chunk.item + if (item.type === 'function_call') { // Initialize arguments accumulator for this call - const callId = item.call_id; - const itemId = item.id; // The item's id (used in delta events) + const callId = item.call_id + const itemId = item.id // The item's id (used in delta events) // Map item_id to call_id for delta event lookups if (itemId && callId) { - itemIdToCallId.set(itemId, callId); + itemIdToCallId.set(itemId, callId) } const initialArgs = item.arguments - ? typeof item.arguments === "string" + ? typeof item.arguments === 'string' ? item.arguments : JSON.stringify(item.arguments) - : ""; - accumulatedFunctionCallArguments.set(callId, initialArgs); + : '' + accumulatedFunctionCallArguments.set(callId, initialArgs) // Track metadata immediately so delta/done events can use it if (!toolCallMetadata.has(callId)) { toolCallMetadata.set(callId, { index: nextIndex++, name: item.name, - }); + }) } - delta = delta || {}; + delta = delta || {} delta.tool_calls = [ { id: callId, @@ -1089,88 +1085,88 @@ export class OpenAI extends BaseAdapter< arguments: initialArgs, }, }, - ]; - } else if (item.type === "message") { + ] + } else if (item.type === 'message') { // Extract content from message item if (item.content && Array.isArray(item.content)) { const textContent = item.content.find( - (c: any) => c.type === "output_text" - ); + (c: any) => c.type === 'output_text', + ) if (textContent?.text) { // For message items added, the text might be incremental or complete // We'll treat it as a delta and accumulate - const newContent = textContent.text; + const newContent = textContent.text // If the new content is longer than accumulated, it's likely the full content // Otherwise, it's a delta if ( newContent.length > accumulatedContent.length || !accumulatedContent ) { - delta = { content: newContent }; + delta = { content: newContent } } else { // It's a delta - extract just the new part const deltaText = newContent.slice( - accumulatedContent.length - ); + accumulatedContent.length, + ) if (deltaText) { - delta = { content: deltaText }; + delta = { content: deltaText } } } } // Extract reasoning content from message item const reasoningContent = item.content.find( - (c: any) => c.type === "output_reasoning" - ); + (c: any) => c.type === 'output_reasoning', + ) if (reasoningContent?.text) { // Reasoning content comes as complete text in message items - accumulatedReasoning = reasoningContent.text; + accumulatedReasoning = reasoningContent.text const thinkingChunk: StreamChunk = { - type: "thinking" as const, + type: 'thinking' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, content: accumulatedReasoning, - }; + } console.log( - "[OpenAI Adapter] Emitting thinking chunk (from message item):", + '[OpenAI Adapter] Emitting thinking chunk (from message item):', { - eventType: "response.output_item.added", + eventType: 'response.output_item.added', contentLength: accumulatedReasoning.length, chunkType: thinkingChunk.type, hasDelta: false, - } - ); - yield thinkingChunk; + }, + ) + yield thinkingChunk } } // Only set finish reason if status indicates completion (not "in_progress") - if (item.status && item.status !== "in_progress") { - finishReason = item.status; + if (item.status && item.status !== 'in_progress') { + finishReason = item.status } } } // Handle output item done - check for both function calls and reasoning items - if (eventType === "response.output_item.done" && chunk.item) { - const item = chunk.item; + if (eventType === 'response.output_item.done' && chunk.item) { + const item = chunk.item // Handle function call items - check if it has final arguments - if (item.type === "function_call" && item.call_id) { - const callId = item.call_id; + if (item.type === 'function_call' && item.call_id) { + const callId = item.call_id // The item might have the final arguments as a string if ( item.arguments && - typeof item.arguments === "string" && - item.arguments !== "{}" + typeof item.arguments === 'string' && + item.arguments !== '{}' ) { - const finalArgs = item.arguments; - accumulatedFunctionCallArguments.set(callId, finalArgs); + const finalArgs = item.arguments + accumulatedFunctionCallArguments.set(callId, finalArgs) // Emit final tool call with complete arguments - const meta = toolCallMetadata.get(callId); + const meta = toolCallMetadata.get(callId) if (meta) { - delta = delta || {}; + delta = delta || {} delta.tool_calls = [ { id: callId, @@ -1179,15 +1175,15 @@ export class OpenAI extends BaseAdapter< arguments: finalArgs, }, }, - ]; + ] } } } // Handle reasoning items - reasoning content might be available when item completes - if (item.type === "reasoning") { + if (item.type === 'reasoning') { // Check if reasoning item has content/text/summary when it's done - console.log("[OpenAI Adapter] Reasoning item done:", { + console.log('[OpenAI Adapter] Reasoning item done:', { itemId: item.id, hasContent: !!item.content, contentType: typeof item.content, @@ -1203,25 +1199,25 @@ export class OpenAI extends BaseAdapter< ? item.summary : item.summary, fullItem: JSON.stringify(item).substring(0, 1000), // More chars to see summary - }); + }) // If reasoning item has text content when done, emit it if (item.text) { - accumulatedReasoning = item.text; + accumulatedReasoning = item.text const thinkingChunk: StreamChunk = { - type: "thinking" as const, + type: 'thinking' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, content: accumulatedReasoning, - }; + } console.log( - "[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - text):", + '[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - text):', { textLength: item.text.length, - } - ); - yield thinkingChunk; + }, + ) + yield thinkingChunk } // Check if summary contains reasoning text (summary might be an array of text chunks) @@ -1229,134 +1225,134 @@ export class OpenAI extends BaseAdapter< // Summary might be an array of text strings or objects with text/content const summaryText = item.summary .map((s: any) => - typeof s === "string" + typeof s === 'string' ? s - : s?.text || s?.content || JSON.stringify(s) + : s?.text || s?.content || JSON.stringify(s), ) - .join(""); + .join('') if (summaryText) { - accumulatedReasoning = summaryText; + accumulatedReasoning = summaryText const thinkingChunk: StreamChunk = { - type: "thinking" as const, + type: 'thinking' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, content: accumulatedReasoning, - }; + } console.log( - "[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - summary):", + '[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - summary):', { summaryLength: summaryText.length, - } - ); - yield thinkingChunk; + }, + ) + yield thinkingChunk } - } else if (typeof item.summary === "string" && item.summary) { - accumulatedReasoning = item.summary; + } else if (typeof item.summary === 'string' && item.summary) { + accumulatedReasoning = item.summary const thinkingChunk: StreamChunk = { - type: "thinking" as const, + type: 'thinking' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, content: accumulatedReasoning, - }; + } console.log( - "[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - summary string):", + '[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - summary string):', { summaryLength: item.summary.length, - } - ); - yield thinkingChunk; + }, + ) + yield thinkingChunk } } } // Handle response done - if (eventType === "response.done") { + if (eventType === 'response.done') { // If we have tool calls, the finish reason should be "tool_calls" // Otherwise, it's a normal completion with "stop" - finishReason = toolCallMetadata.size > 0 ? "tool_calls" : "stop"; + finishReason = toolCallMetadata.size > 0 ? 'tool_calls' : 'stop' } } else if (chunk.output && Array.isArray(chunk.output)) { // Legacy Responses API format with output array const messageItem = chunk.output.find( - (item: any) => item.type === "message" - ); + (item: any) => item.type === 'message', + ) const functionCallItems = chunk.output.filter( - (item: any) => item.type === "function_call" - ); + (item: any) => item.type === 'function_call', + ) if (messageItem?.content) { const textContent = messageItem.content.find( - (c: any) => c.type === "output_text" - ); + (c: any) => c.type === 'output_text', + ) if (textContent?.text) { - delta = { content: textContent.text }; + delta = { content: textContent.text } } // Extract reasoning content from legacy format const reasoningContent = messageItem.content.find( - (c: any) => c.type === "output_reasoning" - ); + (c: any) => c.type === 'output_reasoning', + ) if (reasoningContent?.text) { - accumulatedReasoning = reasoningContent.text; + accumulatedReasoning = reasoningContent.text const thinkingChunk: StreamChunk = { - type: "thinking" as const, + type: 'thinking' as const, id: responseId || chunk.id || generateId(), - model: model || chunk.model || options.model || "gpt-4o", + model: model || chunk.model || options.model || 'gpt-4o', timestamp, content: accumulatedReasoning, - }; + } console.log( - "[OpenAI Adapter] Emitting thinking chunk (legacy format):", + '[OpenAI Adapter] Emitting thinking chunk (legacy format):', { - format: "legacy", + format: 'legacy', contentLength: accumulatedReasoning.length, chunkType: thinkingChunk.type, - } - ); - yield thinkingChunk; + }, + ) + yield thinkingChunk } } if (functionCallItems.length > 0) { - delta = delta || {}; + delta = delta || {} delta.tool_calls = functionCallItems.map((fc: any) => ({ id: fc.call_id, function: { name: fc.name, arguments: JSON.stringify(fc.arguments || {}), }, - })); + })) } if (messageItem?.status) { // If we have tool calls, the finish reason should be "tool_calls" // Otherwise, use the status from the message item if (toolCallMetadata.size > 0) { - finishReason = "tool_calls"; + finishReason = 'tool_calls' } else { - finishReason = messageItem.status; + finishReason = messageItem.status } } } else if (chunk.choices) { // Chat Completions format (legacy) - delta = chunk.choices?.[0]?.delta; - finishReason = chunk.choices?.[0]?.finish_reason; + delta = chunk.choices?.[0]?.delta + finishReason = chunk.choices?.[0]?.finish_reason } // Handle content delta if (delta?.content) { - accumulatedContent += delta.content; + accumulatedContent += delta.content yield { - type: "content" as const, + type: 'content' as const, id: responseId || chunk.id || generateId(), - model: model || chunk.model || options.model || "gpt-4o", + model: model || chunk.model || options.model || 'gpt-4o', timestamp, delta: delta.content, content: accumulatedContent, - role: "assistant" as const, - }; + role: 'assistant' as const, + } } // Handle tool calls @@ -1364,88 +1360,88 @@ export class OpenAI extends BaseAdapter< for (const toolCall of delta.tool_calls) { // For Responses API, tool calls come as complete items, not deltas // For Chat Completions, they come as deltas that need tracking - let toolCallId: string; - let toolCallName: string; - let toolCallArgs: string; - let actualIndex: number; + let toolCallId: string + let toolCallName: string + let toolCallArgs: string + let actualIndex: number if (toolCall.id) { // Complete tool call (Responses API format) or first delta (Chat Completions) - toolCallId = toolCall.id; - toolCallName = toolCall.function?.name || ""; + toolCallId = toolCall.id + toolCallName = toolCall.function?.name || '' toolCallArgs = - typeof toolCall.function?.arguments === "string" + typeof toolCall.function?.arguments === 'string' ? toolCall.function.arguments - : JSON.stringify(toolCall.function?.arguments || {}); + : JSON.stringify(toolCall.function?.arguments || {}) // Track for index assignment if (!toolCallMetadata.has(toolCallId)) { toolCallMetadata.set(toolCallId, { index: nextIndex++, name: toolCallName, - }); + }) } - const meta = toolCallMetadata.get(toolCallId)!; - actualIndex = meta.index; + const meta = toolCallMetadata.get(toolCallId)! + actualIndex = meta.index } else { // Delta chunk (Chat Completions format) - find by index const openAIIndex = - typeof toolCall.index === "number" ? toolCall.index : 0; - const entry = Array.from(toolCallMetadata.entries())[openAIIndex]; + typeof toolCall.index === 'number' ? toolCall.index : 0 + const entry = Array.from(toolCallMetadata.entries())[openAIIndex] if (entry) { - const [id, meta] = entry; - toolCallId = id; - toolCallName = meta.name; - actualIndex = meta.index; - toolCallArgs = toolCall.function?.arguments || ""; + const [id, meta] = entry + toolCallId = id + toolCallName = meta.name + actualIndex = meta.index + toolCallArgs = toolCall.function?.arguments || '' } else { // Fallback - toolCallId = `call_${Date.now()}`; - toolCallName = ""; - actualIndex = openAIIndex; - toolCallArgs = ""; + toolCallId = `call_${Date.now()}` + toolCallName = '' + actualIndex = openAIIndex + toolCallArgs = '' } } yield { - type: "tool_call", + type: 'tool_call', id: responseId || chunk.id || generateId(), - model: model || chunk.model || options.model || "gpt-4o", + model: model || chunk.model || options.model || 'gpt-4o', timestamp, toolCall: { id: toolCallId, - type: "function", + type: 'function', function: { name: toolCallName, arguments: toolCallArgs, }, }, index: actualIndex, - }; + } } } // Handle completion - only yield "done" for actual completion statuses - if (finishReason && finishReason !== "in_progress") { + if (finishReason && finishReason !== 'in_progress') { // Get usage from chunk.response.usage (Responses API) or chunk.usage (Chat Completions) - const usage = chunk.response?.usage || chunk.usage; + const usage = chunk.response?.usage || chunk.usage yield { - type: "done" as const, + type: 'done' as const, id: responseId || chunk.id || generateId(), - model: model || chunk.model || options.model || "gpt-4o", + model: model || chunk.model || options.model || 'gpt-4o', timestamp, finishReason: finishReason as any, usage: usage ? { - promptTokens: usage.input_tokens || usage.prompt_tokens || 0, - completionTokens: - usage.output_tokens || usage.completion_tokens || 0, - totalTokens: usage.total_tokens || 0, - } + promptTokens: usage.input_tokens || usage.prompt_tokens || 0, + completionTokens: + usage.output_tokens || usage.completion_tokens || 0, + totalTokens: usage.total_tokens || 0, + } : undefined, - }; - doneChunkEmitted = true; + } + doneChunkEmitted = true } } @@ -1453,42 +1449,42 @@ export class OpenAI extends BaseAdapter< // emit a done chunk with tool_calls finish reason if (toolCallMetadata.size > 0 && !doneChunkEmitted) { yield { - type: "done" as const, + type: 'done' as const, id: responseId || generateId(), - model: model || options.model || "gpt-4o", + model: model || options.model || 'gpt-4o', timestamp, - finishReason: "tool_calls" as any, + finishReason: 'tool_calls' as any, usage: undefined, - }; + } } // Log summary of all event types encountered - console.log("[OpenAI Adapter] Stream completed. Event type summary:", { + console.log('[OpenAI Adapter] Stream completed. Event type summary:', { totalChunks: chunkCount, eventTypes: Object.fromEntries(eventTypeCounts), accumulatedReasoningLength: accumulatedReasoning.length, accumulatedContentLength: accumulatedContent.length, hasReasoning: accumulatedReasoning.length > 0, - }); + }) } catch (error: any) { console.log( - "[OpenAI Adapter] Stream ended with error. Event type summary:", + '[OpenAI Adapter] Stream ended with error. Event type summary:', { totalChunks: chunkCount, eventTypes: Object.fromEntries(eventTypeCounts), error: error.message, - } - ); + }, + ) yield { - type: "error", + type: 'error', id: generateId(), - model: options.model || "gpt-3.5-turbo", + model: options.model || 'gpt-3.5-turbo', timestamp, error: { - message: error.message || "Unknown error occurred", + message: error.message || 'Unknown error occurred', code: error.code, }, - }; + } } } @@ -1500,25 +1496,25 @@ export class OpenAI extends BaseAdapter< try { const providerOptions = options.providerOptions as | Omit< - InternalTextProviderOptions, - | "max_output_tokens" - | "tools" - | "metadata" - | "temperature" - | "input" - | "top_p" - > - | undefined; - - const input = convertMessagesToInput(options.messages); + InternalTextProviderOptions, + | 'max_output_tokens' + | 'tools' + | 'metadata' + | 'temperature' + | 'input' + | 'top_p' + > + | undefined + + const input = convertMessagesToInput(options.messages) const tools = options.tools ? convertToolsToProviderFormat([...options.tools]) - : undefined; + : undefined const requestParams: Omit< OpenAI_SDK.Responses.ResponseCreateParams, - "stream" + 'stream' > = { model: options.model, temperature: options.options?.temperature, @@ -1528,10 +1524,10 @@ export class OpenAI extends BaseAdapter< ...providerOptions, input, tools, - }; + } // Debug: Log the reasoning config being sent to OpenAI - console.log("[OpenAI Adapter] Request params (reasoning check):", { + console.log('[OpenAI Adapter] Request params (reasoning check):', { model: requestParams.model, hasReasoning: !!requestParams.reasoning, reasoning: requestParams.reasoning, @@ -1540,15 +1536,15 @@ export class OpenAI extends BaseAdapter< ? Object.keys(providerOptions) : [], fullProviderOptions: providerOptions, - }); + }) - return requestParams; + return requestParams } catch (error: any) { - console.error(">>> mapChatOptionsToOpenAI: Fatal error <<<"); - console.error(">>> Error message:", error?.message); - console.error(">>> Error stack:", error?.stack); - console.error(">>> Full error:", error); - throw error; + console.error('>>> mapChatOptionsToOpenAI: Fatal error <<<') + console.error('>>> Error message:', error?.message) + console.error('>>> Error stack:', error?.stack) + console.error('>>> Full error:', error) + throw error } } } @@ -1571,9 +1567,9 @@ export class OpenAI extends BaseAdapter< */ export function createOpenAI( apiKey: string, - config?: Omit + config?: Omit, ): OpenAI { - return new OpenAI({ apiKey, ...config }); + return new OpenAI({ apiKey, ...config }) } /** @@ -1593,20 +1589,20 @@ export function createOpenAI( * const aiInstance = ai(openai()); * ``` */ -export function openai(config?: Omit): OpenAI { +export function openai(config?: Omit): OpenAI { const env = - typeof globalThis !== "undefined" && (globalThis as any).window?.env + typeof globalThis !== 'undefined' && (globalThis as any).window?.env ? (globalThis as any).window.env - : typeof process !== "undefined" - ? process.env - : undefined; - const key = env?.OPENAI_API_KEY; + : typeof process !== 'undefined' + ? process.env + : undefined + const key = env?.OPENAI_API_KEY if (!key) { throw new Error( - "OPENAI_API_KEY is required. Please set it in your environment variables or use createOpenAI(apiKey, config) instead." - ); + 'OPENAI_API_KEY is required. Please set it in your environment variables or use createOpenAI(apiKey, config) instead.', + ) } - return createOpenAI(key, config); + return createOpenAI(key, config) } diff --git a/packages/typescript/ai-openai/src/text/text-provider-options.ts b/packages/typescript/ai-openai/src/text/text-provider-options.ts index 1b594b9a4..53aac0cf7 100644 --- a/packages/typescript/ai-openai/src/text/text-provider-options.ts +++ b/packages/typescript/ai-openai/src/text/text-provider-options.ts @@ -1,385 +1,393 @@ -import { ModelMessage } from "@tanstack/ai"; -import { ApplyPatchTool } from "../tools/apply-patch-tool"; -import { CodeInterpreterTool } from "../tools/code-interpreter-tool"; -import { ComputerUseTool } from "../tools/computer-use-tool"; -import { CustomTool } from "../tools/custom-tool"; -import { FileSearchTool } from "../tools/file-search-tool"; -import { FunctionTool } from "../tools/function-tool"; -import { ImageGenerationTool } from "../tools/image-generation-tool"; -import { LocalShellTool } from "../tools/local-shell-tool"; -import { MCPTool } from "../tools/mcp-tool"; -import { ShellTool } from "../tools/shell-tool"; -import { ToolChoice } from "../tools/tool-choice"; -import { WebSearchPreviewTool } from "../tools/web-search-preview-tool"; -import { WebSearchTool } from "../tools/web-search-tool"; -import OpenAI from "openai"; - -// Core, always-available options for Responses API -export interface OpenAIBaseOptions { - /** - -Whether to run the model response in the background. Learn more here: -https://platform.openai.com/docs/api-reference/responses/create#responses_create-background - @default false - */ - background?: boolean; - /** - * The conversation that this response belongs to. Items from this conversation are prepended to input_items for this response request. Input items and output items from this response are automatically added to this conversation after this response completes. - * - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-conversation - */ - conversation?: string | { id: string } - /** - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-include - Specify additional output data to include in the model response. Currently supported values are: - - web_search_call.action.sources: Include the sources of the web search tool call. - code_interpreter_call.outputs: Includes the outputs of python code execution in code interpreter tool call items. - computer_call_output.output.image_url: Include image urls from the computer call output. - file_search_call.results: Include the search results of the file search tool call. - message.input_image.image_url: Include image urls from the input message. - message.output_text.logprobs: Include logprobs with assistant messages. - reasoning.encrypted_content: Includes an encrypted version of reasoning tokens in reasoning item outputs. This enables reasoning items to be used in multi-turn conversations when using the Responses API statelessly (like when the store parameter is set to false, or when an organization is enrolled in the zero data retention program). - */ - include?: OpenAI.Responses.ResponseIncludable[]; - - /** - * The unique ID of the previous response to the model. Use this to create multi-turn conversations. Cannot be used in conjunction with conversation. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-previous_response_id - */ - previous_response_id?: string; - /** - * Reference to a prompt template and its variables. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-prompt - */ - prompt?: { - /** - * Unique identifier of your prompt, found in the dashboard - */ - id: string, - /** - * A specific version of your prompt (defaults to the "current" version as specified in the dashboard) - */ - version?: string, - /** - * A map of values to substitute in for variables in your prompt. The substitution values can either be strings, or other Response input message types like input_image or input_file - */ - variables?: Record; - } - /** - * Used by OpenAI to cache responses for similar requests to optimize your cache hit rates. Replaces the user field. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-prompt_cache_key - */ - prompt_cache_key?: string; - - /** - * The retention policy for the prompt cache. Set to 24h to enable extended prompt caching, which keeps cached prefixes active for longer, up to a maximum of 24 hours - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-prompt_cache_retention - */ - prompt_cache_retention?: "in-memory" | "24h"; - - /** - * A stable identifier used to help detect users of your application that may be violating OpenAI's usage policies. The IDs should be a string that uniquely identifies each user. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-safety_identifier - */ - safety_identifier?: string; - - - /** - * Specifies the processing type used for serving the request. - -If set to 'auto', then the request will be processed with the service tier configured in the Project settings. Unless otherwise configured, the Project will use 'default'. -If set to 'default', then the request will be processed with the standard pricing and performance for the selected model. -If set to 'flex' or 'priority', then the request will be processed with the corresponding service tier. -When not set, the default behavior is 'auto'. -When the service_tier parameter is set, the response body will include the service_tier value based on the processing mode actually used to serve the request. This response value may be different from the value set in the parameter. - -https://platform.openai.com/docs/api-reference/responses/create#responses_create-service_tier -@default 'auto' - */ - service_tier?: "auto" | "default" | "flex" | "priority"; - - /** - * Whether to store the generated model response for later retrieval via API. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-store - * @default true - */ - store?: boolean; - - /** - * Constrains the verbosity of the model's response. Lower values will result in more concise responses, while higher values will result in more verbose responses. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-text-verbosity - */ - verbosity?: "low" | "medium" | "high"; - /** - * An integer between 0 and 20 specifying the number of most likely tokens to return at each token position, each with an associated log probability. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-top_logprobs - */ - top_logprobs?: number; - - /** - * The truncation strategy to use for the model response. - - auto: If the input to this Response exceeds the model's context window size, the model will truncate the response to fit the context window by dropping items from the beginning of the conversation. - disabled (default): If the input size will exceed the context window size for a model, the request will fail with a 400 error. - */ - truncation?: "auto" | "disabled"; -} - -// Feature fragments that can be stitched per-model -export interface OpenAIReasoningOptions { - /** - * Reasoning controls for models that support it. - * Lets you guide how much chain-of-thought computation to spend. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-reasoning - * https://platform.openai.com/docs/guides/reasoning - */ - reasoning?: { - /** - * gpt-5.1 defaults to none, which does not perform reasoning. The supported reasoning values for gpt-5.1 are none, low, medium, and high. Tool calls are supported for all reasoning values in gpt-5.1. - * All models before gpt-5.1 default to medium reasoning effort, and do not support none. - * The gpt-5-pro model defaults to (and only supports) high reasoning effort. - */ - effort?: "none" | "minimal" | "low" | "medium" | "high"; - }; - /** - * A summary of the reasoning performed by the model. This can be useful for debugging and understanding the model's reasoning process - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-reasoning-summary - */ - summary?: "auto" | "concise" | "detailed"; -} - -export interface OpenAIStructuredOutputOptions { - /** - * Configuration options for a text response from the model. Can be plain text or structured JSON data. Learn more: - https://platform.openai.com/docs/api-reference/responses/create#responses_create-text - */ - text?: OpenAI.Responses.ResponseTextConfig; -} - -export interface OpenAIToolsOptions { - /** - * The maximum number of total calls to built-in tools that can be processed in a response. This maximum number applies across all built-in tool calls, not per individual tool. Any further attempts to call a tool by the model will be ignored. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-max_tool_calls - */ - max_tool_calls?: number; - /** - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-parallel_tool_calls - * Whether to allow the model to run tool calls in parallel. - * @default true - */ - parallel_tool_calls?: boolean; - /** - * Function/tool calling configuration. Supply tool schemas in `tools` - * and control selection here: - * - "auto" | "none" | "required" - * - { type: "tool", tool_name: string } (or model-specific shape) - * https://platform.openai.com/docs/guides/tools/tool-choice - * https://platform.openai.com/docs/api-reference/introduction (tools array) - */ - tool_choice?: - | "auto" - | "none" - | "required" - | ToolChoice; -} - -export interface OpenAIStreamingOptions { - /** - * Options for streaming responses. Only set this when you set stream: true - */ - stream_options?: { - /** - * When true, stream obfuscation will be enabled. Stream obfuscation adds random characters to an obfuscation field on streaming delta events to normalize payload sizes as a mitigation to certain side-channel attacks. These obfuscation fields are included by default, but add a small amount of overhead to the data stream. You can set include_obfuscation to false to optimize for bandwidth if you trust the network links between your application and the OpenAI API. - */ - include_obfuscation?: boolean; - }; -} - -export interface OpenAIMetadataOptions { - /** - * Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format, and querying for objects via API or the dashboard. - -Keys are strings with a maximum length of 64 characters. Values are strings with a maximum length of 512 characters. -https://platform.openai.com/docs/api-reference/responses/create#responses_create-metadata - */ - metadata?: Record; -} - -export type ExternalTextProviderOptions = - OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions; - - -/** - * Options your SDK forwards to OpenAI when doing chat/responses. - * Tip: gate these by model capability in your SDK, not just by presence. - */ -export interface InternalTextProviderOptions extends ExternalTextProviderOptions { - - - input: string | OpenAI.Responses.ResponseInput - /** - * A system (or developer) message inserted into the model's context. - -When using along with previous_response_id, the instructions from a previous response will not be carried over to the next response. This makes it simple to swap out system (or developer) messages in new responses. -https://platform.openai.com/docs/api-reference/responses/create#responses_create-instructions - */ - instructions?: string; - /** - * An upper bound for the number of tokens that can be generated for a response, including visible output tokens and reasoning tokens. - * (Responses API name: max_output_tokens) - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-max_output_tokens - */ - max_output_tokens?: number; - - /** - * The model name (e.g. "gpt-4o", "gpt-5", "gpt-4.1-mini", etc). - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-model - */ - model: string; - - /** - * If set to true, the model response data will be streamed to the client as it is generated using server-sent events. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-stream - * @default false - */ - stream?: boolean; - - /** - * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We generally recommend altering this or top_p but not both. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-temperature - */ - temperature?: number; - /** - * An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. - * https://platform.openai.com/docs/api-reference/responses/create#responses_create-top_p - */ - top_p?: number; - /** - * Tools the model may call (functions, web_search, etc). - * Function tool example: - * { type: "function", function: { name, description?, parameters: JSONSchema } } - * https://platform.openai.com/docs/guides/tools/tool-choice - * https://platform.openai.com/docs/guides/tools-web-search - */ - tools?: Array< - FunctionTool | FileSearchTool | ComputerUseTool | WebSearchTool | MCPTool | CodeInterpreterTool | ImageGenerationTool | ShellTool | LocalShellTool | CustomTool | WebSearchPreviewTool | ApplyPatchTool - >; - -} - - -export const validateConversationAndPreviousResponseId = ( - options: InternalTextProviderOptions -) => { - if (options.conversation && options.previous_response_id) { - throw new Error( - "Cannot use both 'conversation' and 'previous_response_id' in the same request." - ); - } -}; - -export const validateMetadata = (options: InternalTextProviderOptions) => { - const metadata = options.metadata; - const tooManyKeys = metadata && Object.keys(metadata).length > 16; - if (tooManyKeys) { - throw new Error("Metadata cannot have more than 16 key-value pairs."); - } - const keyTooLong = metadata && Object.keys(metadata).some(key => key.length > 64); - if (keyTooLong) { - throw new Error("Metadata keys cannot be longer than 64 characters."); - } - const valueTooLong = metadata && Object.values(metadata).some(value => value.length > 512); - if (valueTooLong) { - throw new Error("Metadata values cannot be longer than 512 characters."); - } -}; - -export function convertMessagesToInput(messages: ModelMessage[]): OpenAI.Responses.ResponseInput { - const result: OpenAI.Responses.ResponseInput = []; - - for (const message of messages) { - - // Handle tool messages - convert to FunctionToolCallOutput - if (message.role === "tool") { - result.push({ - type: "function_call_output", - call_id: message.toolCallId || "", - output: typeof message.content === "string" ? message.content : JSON.stringify(message.content) - }); - continue; - } - - // Handle assistant messages - if (message.role === "assistant") { - // If the assistant message has tool calls, add them as FunctionToolCall objects - // OpenAI Responses API expects arguments as a string (JSON string) - if (message.toolCalls && message.toolCalls.length > 0) { - for (const toolCall of message.toolCalls) { - // Keep arguments as string for Responses API - // Our internal format stores arguments as a JSON string, which is what API expects - const argumentsString = typeof toolCall.function.arguments === "string" - ? toolCall.function.arguments - : JSON.stringify(toolCall.function.arguments || {}); - - result.push({ - type: "function_call", - call_id: toolCall.id, - name: toolCall.function.name, - arguments: argumentsString - } as any); - } - } - - // Add the assistant's text message if there is content - if (message.content) { - result.push({ - type: "message", - role: "assistant", - content: [ - { - type: "input_text", - text: message.content - } - ] - }); - } - - continue; - } - - // Handle system messages - if (message.role === "system") { - result.push({ - type: "message", - role: "system", - content: [ - { - type: "input_text", - text: message.content || "" - } - ] - }); - continue; - } - - // Handle user messages (default case) - result.push({ - type: "message", - role: "user", - content: [ - { - type: "input_text", - text: message.content || "" - } - ] - }); - } - - return result; -} +import type OpenAI from 'openai' +import type { ApplyPatchTool } from '../tools/apply-patch-tool' +import type { CodeInterpreterTool } from '../tools/code-interpreter-tool' +import type { ComputerUseTool } from '../tools/computer-use-tool' +import type { CustomTool } from '../tools/custom-tool' +import type { FileSearchTool } from '../tools/file-search-tool' +import type { FunctionTool } from '../tools/function-tool' +import type { ImageGenerationTool } from '../tools/image-generation-tool' +import type { LocalShellTool } from '../tools/local-shell-tool' +import type { MCPTool } from '../tools/mcp-tool' +import type { ShellTool } from '../tools/shell-tool' +import type { ToolChoice } from '../tools/tool-choice' +import type { WebSearchPreviewTool } from '../tools/web-search-preview-tool' +import type { WebSearchTool } from '../tools/web-search-tool' +import type { ModelMessage } from '@tanstack/ai' + +// Core, always-available options for Responses API +export interface OpenAIBaseOptions { + /** + +Whether to run the model response in the background. Learn more here: +https://platform.openai.com/docs/api-reference/responses/create#responses_create-background + @default false + */ + background?: boolean + /** + * The conversation that this response belongs to. Items from this conversation are prepended to input_items for this response request. Input items and output items from this response are automatically added to this conversation after this response completes. + * + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-conversation + */ + conversation?: string | { id: string } + /** + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-include + Specify additional output data to include in the model response. Currently supported values are: + + web_search_call.action.sources: Include the sources of the web search tool call. + code_interpreter_call.outputs: Includes the outputs of python code execution in code interpreter tool call items. + computer_call_output.output.image_url: Include image urls from the computer call output. + file_search_call.results: Include the search results of the file search tool call. + message.input_image.image_url: Include image urls from the input message. + message.output_text.logprobs: Include logprobs with assistant messages. + reasoning.encrypted_content: Includes an encrypted version of reasoning tokens in reasoning item outputs. This enables reasoning items to be used in multi-turn conversations when using the Responses API statelessly (like when the store parameter is set to false, or when an organization is enrolled in the zero data retention program). + */ + include?: Array + + /** + * The unique ID of the previous response to the model. Use this to create multi-turn conversations. Cannot be used in conjunction with conversation. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-previous_response_id + */ + previous_response_id?: string + /** + * Reference to a prompt template and its variables. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-prompt + */ + prompt?: { + /** + * Unique identifier of your prompt, found in the dashboard + */ + id: string + /** + * A specific version of your prompt (defaults to the "current" version as specified in the dashboard) + */ + version?: string + /** + * A map of values to substitute in for variables in your prompt. The substitution values can either be strings, or other Response input message types like input_image or input_file + */ + variables?: Record + } + /** + * Used by OpenAI to cache responses for similar requests to optimize your cache hit rates. Replaces the user field. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-prompt_cache_key + */ + prompt_cache_key?: string + + /** + * The retention policy for the prompt cache. Set to 24h to enable extended prompt caching, which keeps cached prefixes active for longer, up to a maximum of 24 hours + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-prompt_cache_retention + */ + prompt_cache_retention?: 'in-memory' | '24h' + + /** + * A stable identifier used to help detect users of your application that may be violating OpenAI's usage policies. The IDs should be a string that uniquely identifies each user. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-safety_identifier + */ + safety_identifier?: string + + /** + * Specifies the processing type used for serving the request. + +If set to 'auto', then the request will be processed with the service tier configured in the Project settings. Unless otherwise configured, the Project will use 'default'. +If set to 'default', then the request will be processed with the standard pricing and performance for the selected model. +If set to 'flex' or 'priority', then the request will be processed with the corresponding service tier. +When not set, the default behavior is 'auto'. +When the service_tier parameter is set, the response body will include the service_tier value based on the processing mode actually used to serve the request. This response value may be different from the value set in the parameter. + +https://platform.openai.com/docs/api-reference/responses/create#responses_create-service_tier +@default 'auto' + */ + service_tier?: 'auto' | 'default' | 'flex' | 'priority' + + /** + * Whether to store the generated model response for later retrieval via API. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-store + * @default true + */ + store?: boolean + + /** + * Constrains the verbosity of the model's response. Lower values will result in more concise responses, while higher values will result in more verbose responses. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-text-verbosity + */ + verbosity?: 'low' | 'medium' | 'high' + /** + * An integer between 0 and 20 specifying the number of most likely tokens to return at each token position, each with an associated log probability. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-top_logprobs + */ + top_logprobs?: number + + /** + * The truncation strategy to use for the model response. + + auto: If the input to this Response exceeds the model's context window size, the model will truncate the response to fit the context window by dropping items from the beginning of the conversation. + disabled (default): If the input size will exceed the context window size for a model, the request will fail with a 400 error. + */ + truncation?: 'auto' | 'disabled' +} + +// Feature fragments that can be stitched per-model +export interface OpenAIReasoningOptions { + /** + * Reasoning controls for models that support it. + * Lets you guide how much chain-of-thought computation to spend. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-reasoning + * https://platform.openai.com/docs/guides/reasoning + */ + reasoning?: { + /** + * gpt-5.1 defaults to none, which does not perform reasoning. The supported reasoning values for gpt-5.1 are none, low, medium, and high. Tool calls are supported for all reasoning values in gpt-5.1. + * All models before gpt-5.1 default to medium reasoning effort, and do not support none. + * The gpt-5-pro model defaults to (and only supports) high reasoning effort. + */ + effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' + } + /** + * A summary of the reasoning performed by the model. This can be useful for debugging and understanding the model's reasoning process + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-reasoning-summary + */ + summary?: 'auto' | 'concise' | 'detailed' +} + +export interface OpenAIStructuredOutputOptions { + /** + * Configuration options for a text response from the model. Can be plain text or structured JSON data. Learn more: + https://platform.openai.com/docs/api-reference/responses/create#responses_create-text + */ + text?: OpenAI.Responses.ResponseTextConfig +} + +export interface OpenAIToolsOptions { + /** + * The maximum number of total calls to built-in tools that can be processed in a response. This maximum number applies across all built-in tool calls, not per individual tool. Any further attempts to call a tool by the model will be ignored. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-max_tool_calls + */ + max_tool_calls?: number + /** + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-parallel_tool_calls + * Whether to allow the model to run tool calls in parallel. + * @default true + */ + parallel_tool_calls?: boolean + /** + * Function/tool calling configuration. Supply tool schemas in `tools` + * and control selection here: + * - "auto" | "none" | "required" + * - { type: "tool", tool_name: string } (or model-specific shape) + * https://platform.openai.com/docs/guides/tools/tool-choice + * https://platform.openai.com/docs/api-reference/introduction (tools array) + */ + tool_choice?: 'auto' | 'none' | 'required' | ToolChoice +} + +export interface OpenAIStreamingOptions { + /** + * Options for streaming responses. Only set this when you set stream: true + */ + stream_options?: { + /** + * When true, stream obfuscation will be enabled. Stream obfuscation adds random characters to an obfuscation field on streaming delta events to normalize payload sizes as a mitigation to certain side-channel attacks. These obfuscation fields are included by default, but add a small amount of overhead to the data stream. You can set include_obfuscation to false to optimize for bandwidth if you trust the network links between your application and the OpenAI API. + */ + include_obfuscation?: boolean + } +} + +export interface OpenAIMetadataOptions { + /** + * Set of 16 key-value pairs that can be attached to an object. This can be useful for storing additional information about the object in a structured format, and querying for objects via API or the dashboard. + +Keys are strings with a maximum length of 64 characters. Values are strings with a maximum length of 512 characters. +https://platform.openai.com/docs/api-reference/responses/create#responses_create-metadata + */ + metadata?: Record +} + +export type ExternalTextProviderOptions = OpenAIBaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions + +/** + * Options your SDK forwards to OpenAI when doing chat/responses. + * Tip: gate these by model capability in your SDK, not just by presence. + */ +export interface InternalTextProviderOptions + extends ExternalTextProviderOptions { + input: string | OpenAI.Responses.ResponseInput + /** + * A system (or developer) message inserted into the model's context. + +When using along with previous_response_id, the instructions from a previous response will not be carried over to the next response. This makes it simple to swap out system (or developer) messages in new responses. +https://platform.openai.com/docs/api-reference/responses/create#responses_create-instructions + */ + instructions?: string + /** + * An upper bound for the number of tokens that can be generated for a response, including visible output tokens and reasoning tokens. + * (Responses API name: max_output_tokens) + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-max_output_tokens + */ + max_output_tokens?: number + + /** + * The model name (e.g. "gpt-4o", "gpt-5", "gpt-4.1-mini", etc). + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-model + */ + model: string + + /** + * If set to true, the model response data will be streamed to the client as it is generated using server-sent events. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-stream + * @default false + */ + stream?: boolean + + /** + * What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We generally recommend altering this or top_p but not both. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-temperature + */ + temperature?: number + /** + * An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. + * https://platform.openai.com/docs/api-reference/responses/create#responses_create-top_p + */ + top_p?: number + /** + * Tools the model may call (functions, web_search, etc). + * Function tool example: + * { type: "function", function: { name, description?, parameters: JSONSchema } } + * https://platform.openai.com/docs/guides/tools/tool-choice + * https://platform.openai.com/docs/guides/tools-web-search + */ + tools?: Array< + | FunctionTool + | FileSearchTool + | ComputerUseTool + | WebSearchTool + | MCPTool + | CodeInterpreterTool + | ImageGenerationTool + | ShellTool + | LocalShellTool + | CustomTool + | WebSearchPreviewTool + | ApplyPatchTool + > +} + +export const validateConversationAndPreviousResponseId = ( + options: InternalTextProviderOptions, +) => { + if (options.conversation && options.previous_response_id) { + throw new Error( + "Cannot use both 'conversation' and 'previous_response_id' in the same request.", + ) + } +} + +export const validateMetadata = (options: InternalTextProviderOptions) => { + const metadata = options.metadata + const tooManyKeys = metadata && Object.keys(metadata).length > 16 + if (tooManyKeys) { + throw new Error('Metadata cannot have more than 16 key-value pairs.') + } + const keyTooLong = + metadata && Object.keys(metadata).some((key) => key.length > 64) + if (keyTooLong) { + throw new Error('Metadata keys cannot be longer than 64 characters.') + } + const valueTooLong = + metadata && Object.values(metadata).some((value) => value.length > 512) + if (valueTooLong) { + throw new Error('Metadata values cannot be longer than 512 characters.') + } +} + +export function convertMessagesToInput( + messages: Array, +): OpenAI.Responses.ResponseInput { + const result: OpenAI.Responses.ResponseInput = [] + + for (const message of messages) { + // Handle tool messages - convert to FunctionToolCallOutput + if (message.role === 'tool') { + result.push({ + type: 'function_call_output', + call_id: message.toolCallId || '', + output: + typeof message.content === 'string' + ? message.content + : JSON.stringify(message.content), + }) + continue + } + + // Handle assistant messages + if (message.role === 'assistant') { + // If the assistant message has tool calls, add them as FunctionToolCall objects + // OpenAI Responses API expects arguments as a string (JSON string) + if (message.toolCalls && message.toolCalls.length > 0) { + for (const toolCall of message.toolCalls) { + // Keep arguments as string for Responses API + // Our internal format stores arguments as a JSON string, which is what API expects + const argumentsString = + typeof toolCall.function.arguments === 'string' + ? toolCall.function.arguments + : JSON.stringify(toolCall.function.arguments) + + result.push({ + type: 'function_call', + call_id: toolCall.id, + name: toolCall.function.name, + arguments: argumentsString, + } as any) + } + } + + // Add the assistant's text message if there is content + if (message.content) { + result.push({ + type: 'message', + role: 'assistant', + content: [ + { + type: 'input_text', + text: message.content, + }, + ], + }) + } + + continue + } + + // Handle system messages + if (message.role === 'system') { + result.push({ + type: 'message', + role: 'system', + content: [ + { + type: 'input_text', + text: message.content || '', + }, + ], + }) + continue + } + + // Handle user messages (default case) + result.push({ + type: 'message', + role: 'user', + content: [ + { + type: 'input_text', + text: message.content || '', + }, + ], + }) + } + + return result +} diff --git a/packages/typescript/ai-openai/src/tools/apply-patch-tool.ts b/packages/typescript/ai-openai/src/tools/apply-patch-tool.ts index 4cca2735d..08b28fa1b 100644 --- a/packages/typescript/ai-openai/src/tools/apply-patch-tool.ts +++ b/packages/typescript/ai-openai/src/tools/apply-patch-tool.ts @@ -1,30 +1,30 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - - -export type ApplyPatchTool = OpenAI.Responses.ApplyPatchTool; - - -/** - * Converts a standard Tool to OpenAI ApplyPatchTool format - */ -export function convertApplyPatchToolToAdapterFormat(_tool: Tool): ApplyPatchTool { - return { - type: "apply_patch", - }; -} - -/** - * Creates a standard Tool from ApplyPatchTool parameters - */ -export function applyPatchTool(): Tool { - return { - type: "function", - function: { - name: "apply_patch", - description: "Apply a patch to modify files", - parameters: {}, - }, - metadata: {}, - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type ApplyPatchTool = OpenAI.Responses.ApplyPatchTool + +/** + * Converts a standard Tool to OpenAI ApplyPatchTool format + */ +export function convertApplyPatchToolToAdapterFormat( + _tool: Tool, +): ApplyPatchTool { + return { + type: 'apply_patch', + } +} + +/** + * Creates a standard Tool from ApplyPatchTool parameters + */ +export function applyPatchTool(): Tool { + return { + type: 'function', + function: { + name: 'apply_patch', + description: 'Apply a patch to modify files', + parameters: {}, + }, + metadata: {}, + } +} diff --git a/packages/typescript/ai-openai/src/tools/code-interpreter-tool.ts b/packages/typescript/ai-openai/src/tools/code-interpreter-tool.ts index ce55b3569..c03e97937 100644 --- a/packages/typescript/ai-openai/src/tools/code-interpreter-tool.ts +++ b/packages/typescript/ai-openai/src/tools/code-interpreter-tool.ts @@ -1,36 +1,35 @@ -import type { Tool } from "@tanstack/ai"; -import type OpenAI from "openai" - -export type CodeInterpreterTool = OpenAI.Responses.Tool.CodeInterpreter; - - -/** - * Converts a standard Tool to OpenAI CodeInterpreterTool format - */ -export function convertCodeInterpreterToolToAdapterFormat(tool: Tool): CodeInterpreterTool { - const metadata = tool.metadata as CodeInterpreterTool; - return { - type: "code_interpreter", - container: metadata.container, - }; -} - -/** - * Creates a standard Tool from CodeInterpreterTool parameters - */ -export function codeInterpreterTool( - container: CodeInterpreterTool -): Tool { - return { - type: "function", - function: { - name: "code_interpreter", - description: "Execute code in a sandboxed environment", - parameters: {}, - }, - metadata: { - type: "code_interpreter", - container, - }, - }; -} \ No newline at end of file +import type { Tool } from '@tanstack/ai' +import type OpenAI from 'openai' + +export type CodeInterpreterTool = OpenAI.Responses.Tool.CodeInterpreter + +/** + * Converts a standard Tool to OpenAI CodeInterpreterTool format + */ +export function convertCodeInterpreterToolToAdapterFormat( + tool: Tool, +): CodeInterpreterTool { + const metadata = tool.metadata as CodeInterpreterTool + return { + type: 'code_interpreter', + container: metadata.container, + } +} + +/** + * Creates a standard Tool from CodeInterpreterTool parameters + */ +export function codeInterpreterTool(container: CodeInterpreterTool): Tool { + return { + type: 'function', + function: { + name: 'code_interpreter', + description: 'Execute code in a sandboxed environment', + parameters: {}, + }, + metadata: { + type: 'code_interpreter', + container, + }, + } +} diff --git a/packages/typescript/ai-openai/src/tools/computer-use-tool.ts b/packages/typescript/ai-openai/src/tools/computer-use-tool.ts index b64184409..0bce5ad3b 100644 --- a/packages/typescript/ai-openai/src/tools/computer-use-tool.ts +++ b/packages/typescript/ai-openai/src/tools/computer-use-tool.ts @@ -1,35 +1,35 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type ComputerUseTool = OpenAI.Responses.ComputerTool; -/** - * Converts a standard Tool to OpenAI ComputerUseTool format - */ -export function convertComputerUseToolToAdapterFormat(tool: Tool): ComputerUseTool { - const metadata = tool.metadata as ComputerUseTool; - return { - type: "computer_use_preview", - display_height: metadata.display_height, - display_width: metadata.display_width, - environment: metadata.environment, - }; -} - -/** - * Creates a standard Tool from ComputerUseTool parameters - */ -export function computerUseTool( - toolData: ComputerUseTool -): Tool { - return { - type: "function", - function: { - name: "computer_use_preview", - description: "Control a virtual computer", - parameters: {}, - }, - metadata: { - ...toolData, - }, - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type ComputerUseTool = OpenAI.Responses.ComputerTool +/** + * Converts a standard Tool to OpenAI ComputerUseTool format + */ +export function convertComputerUseToolToAdapterFormat( + tool: Tool, +): ComputerUseTool { + const metadata = tool.metadata as ComputerUseTool + return { + type: 'computer_use_preview', + display_height: metadata.display_height, + display_width: metadata.display_width, + environment: metadata.environment, + } +} + +/** + * Creates a standard Tool from ComputerUseTool parameters + */ +export function computerUseTool(toolData: ComputerUseTool): Tool { + return { + type: 'function', + function: { + name: 'computer_use_preview', + description: 'Control a virtual computer', + parameters: {}, + }, + metadata: { + ...toolData, + }, + } +} diff --git a/packages/typescript/ai-openai/src/tools/custom-tool.ts b/packages/typescript/ai-openai/src/tools/custom-tool.ts index 907af69a1..5e365d85d 100644 --- a/packages/typescript/ai-openai/src/tools/custom-tool.ts +++ b/packages/typescript/ai-openai/src/tools/custom-tool.ts @@ -1,38 +1,34 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type CustomTool = OpenAI.Responses.CustomTool - - - -/** - * Converts a standard Tool to OpenAI CustomTool format - */ -export function convertCustomToolToAdapterFormat(tool: Tool): CustomTool { - const metadata = tool.metadata as CustomTool; - return { - type: "custom", - name: metadata.name, - description: metadata.description, - format: metadata.format, - }; -} - -/** - * Creates a standard Tool from CustomTool parameters - */ -export function customTool( - toolData: CustomTool -): Tool { - return { - type: "function", - function: { - name: "custom", - description: toolData.description || "A custom tool", - parameters: {}, - }, - metadata: { - ...toolData, - }, - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type CustomTool = OpenAI.Responses.CustomTool + +/** + * Converts a standard Tool to OpenAI CustomTool format + */ +export function convertCustomToolToAdapterFormat(tool: Tool): CustomTool { + const metadata = tool.metadata as CustomTool + return { + type: 'custom', + name: metadata.name, + description: metadata.description, + format: metadata.format, + } +} + +/** + * Creates a standard Tool from CustomTool parameters + */ +export function customTool(toolData: CustomTool): Tool { + return { + type: 'function', + function: { + name: 'custom', + description: toolData.description || 'A custom tool', + parameters: {}, + }, + metadata: { + ...toolData, + }, + } +} diff --git a/packages/typescript/ai-openai/src/tools/file-search-tool.ts b/packages/typescript/ai-openai/src/tools/file-search-tool.ts index 0ab6f9ae4..407b31cdb 100644 --- a/packages/typescript/ai-openai/src/tools/file-search-tool.ts +++ b/packages/typescript/ai-openai/src/tools/file-search-tool.ts @@ -1,45 +1,46 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export const validateMaxNumResults = (maxNumResults: number | undefined) => { - if (maxNumResults && (maxNumResults < 1 || maxNumResults > 50)) { - throw new Error("max_num_results must be between 1 and 50."); - } -}; - -export type FileSearchTool = OpenAI.Responses.FileSearchTool; - - -/** - * Converts a standard Tool to OpenAI FileSearchTool format - */ -export function convertFileSearchToolToAdapterFormat(tool: Tool): OpenAI.Responses.FileSearchTool { - const metadata = tool.metadata as OpenAI.Responses.FileSearchTool; - return { - type: "file_search", - vector_store_ids: metadata.vector_store_ids, - max_num_results: metadata.max_num_results, - ranking_options: metadata.ranking_options, - filters: metadata.filters, - }; -} - -/** - * Creates a standard Tool from FileSearchTool parameters - */ -export function fileSearchTool( - toolData: OpenAI.Responses.FileSearchTool -): Tool { - validateMaxNumResults(toolData.max_num_results); - return { - type: "function", - function: { - name: "file_search", - description: "Search files in vector stores", - parameters: {}, - }, - metadata: { - ...toolData, - }, - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export const validateMaxNumResults = (maxNumResults: number | undefined) => { + if (maxNumResults && (maxNumResults < 1 || maxNumResults > 50)) { + throw new Error('max_num_results must be between 1 and 50.') + } +} + +export type FileSearchTool = OpenAI.Responses.FileSearchTool + +/** + * Converts a standard Tool to OpenAI FileSearchTool format + */ +export function convertFileSearchToolToAdapterFormat( + tool: Tool, +): OpenAI.Responses.FileSearchTool { + const metadata = tool.metadata as OpenAI.Responses.FileSearchTool + return { + type: 'file_search', + vector_store_ids: metadata.vector_store_ids, + max_num_results: metadata.max_num_results, + ranking_options: metadata.ranking_options, + filters: metadata.filters, + } +} + +/** + * Creates a standard Tool from FileSearchTool parameters + */ +export function fileSearchTool( + toolData: OpenAI.Responses.FileSearchTool, +): Tool { + validateMaxNumResults(toolData.max_num_results) + return { + type: 'function', + function: { + name: 'file_search', + description: 'Search files in vector stores', + parameters: {}, + }, + metadata: { + ...toolData, + }, + } +} diff --git a/packages/typescript/ai-openai/src/tools/function-tool.ts b/packages/typescript/ai-openai/src/tools/function-tool.ts index 5cc5de89c..bc6f79b9b 100644 --- a/packages/typescript/ai-openai/src/tools/function-tool.ts +++ b/packages/typescript/ai-openai/src/tools/function-tool.ts @@ -1,49 +1,45 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type FunctionTool = OpenAI.Responses.FunctionTool - - -/** - * Converts a standard Tool to OpenAI FunctionTool format - */ -export function convertFunctionToolToAdapterFormat(tool: Tool): FunctionTool { - // If tool has metadata (created via functionTool helper), use that - if (tool.metadata) { - const metadata = tool.metadata as Omit; - return { - type: "function", - ...metadata - }; - } - - // Otherwise, convert directly from tool.function (regular Tool structure) - // For Responses API, FunctionTool has name at top level, with function containing description and parameters - return { - type: "function", - name: tool.function.name, - function: { - description: tool.function.description, - parameters: tool.function.parameters, - }, - } as FunctionTool; -} - -/** - * Creates a standard Tool from FunctionTool parameters - */ -export function functionTool( - config: Omit -): Tool { - return { - type: "function", - function: { - name: config.name, - description: config.description ?? "", - parameters: config.parameters ?? {}, - }, - metadata: { - ...config - }, - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type FunctionTool = OpenAI.Responses.FunctionTool + +/** + * Converts a standard Tool to OpenAI FunctionTool format + */ +export function convertFunctionToolToAdapterFormat(tool: Tool): FunctionTool { + // If tool has metadata (created via functionTool helper), use that + if (tool.metadata) { + const metadata = tool.metadata as Omit + return { + type: 'function', + ...metadata, + } + } + + // Otherwise, convert directly from tool.function (regular Tool structure) + // For Responses API, FunctionTool has name at top level, with function containing description and parameters + return { + type: 'function', + name: tool.function.name, + description: tool.function.description, + parameters: tool.function.parameters, + strict: true + } satisfies FunctionTool +} + +/** + * Creates a standard Tool from FunctionTool parameters + */ +export function functionTool(config: Omit): Tool { + return { + type: 'function', + function: { + name: config.name, + description: config.description ?? '', + parameters: config.parameters ?? {}, + }, + metadata: { + ...config, + }, + } +} diff --git a/packages/typescript/ai-openai/src/tools/image-generation-tool.ts b/packages/typescript/ai-openai/src/tools/image-generation-tool.ts index 27eaab8e2..f8b58c1f9 100644 --- a/packages/typescript/ai-openai/src/tools/image-generation-tool.ts +++ b/packages/typescript/ai-openai/src/tools/image-generation-tool.ts @@ -1,42 +1,43 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type ImageGenerationTool = OpenAI.Responses.Tool.ImageGeneration; - - -export const validatePartialImages = (value: number | undefined) => { - if (value !== undefined && (value < 0 || value > 3)) { - throw new Error("partial_images must be between 0 and 3"); - } -}; - -/** - * Converts a standard Tool to OpenAI ImageGenerationTool format - */ -export function convertImageGenerationToolToAdapterFormat(tool: Tool): ImageGenerationTool { - const metadata = tool.metadata as Omit; - return { - type: "image_generation", - ...metadata - }; -} - -/** - * Creates a standard Tool from ImageGenerationTool parameters - */ -export function imageGenerationTool( - toolData: Omit -): Tool { - validatePartialImages(toolData.partial_images); - return { - type: "function", - function: { - name: "image_generation", - description: "Generate images based on text descriptions", - parameters: {}, - }, - metadata: { - ...toolData - }, - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type ImageGenerationTool = OpenAI.Responses.Tool.ImageGeneration + +export const validatePartialImages = (value: number | undefined) => { + if (value !== undefined && (value < 0 || value > 3)) { + throw new Error('partial_images must be between 0 and 3') + } +} + +/** + * Converts a standard Tool to OpenAI ImageGenerationTool format + */ +export function convertImageGenerationToolToAdapterFormat( + tool: Tool, +): ImageGenerationTool { + const metadata = tool.metadata as Omit + return { + type: 'image_generation', + ...metadata, + } +} + +/** + * Creates a standard Tool from ImageGenerationTool parameters + */ +export function imageGenerationTool( + toolData: Omit, +): Tool { + validatePartialImages(toolData.partial_images) + return { + type: 'function', + function: { + name: 'image_generation', + description: 'Generate images based on text descriptions', + parameters: {}, + }, + metadata: { + ...toolData, + }, + } +} diff --git a/packages/typescript/ai-openai/src/tools/index.ts b/packages/typescript/ai-openai/src/tools/index.ts index cf8197a93..1795d7fce 100644 --- a/packages/typescript/ai-openai/src/tools/index.ts +++ b/packages/typescript/ai-openai/src/tools/index.ts @@ -1,41 +1,41 @@ -import type { ApplyPatchTool } from "./apply-patch-tool"; -import type { CodeInterpreterTool } from "./code-interpreter-tool"; -import type { ComputerUseTool } from "./computer-use-tool"; -import type { CustomTool } from "./custom-tool"; -import type { FileSearchTool } from "./file-search-tool"; -import type { FunctionTool } from "./function-tool"; -import type { ImageGenerationTool } from "./image-generation-tool"; -import type { LocalShellTool } from "./local-shell-tool"; -import type { MCPTool } from "./mcp-tool"; -import type { ShellTool } from "./shell-tool"; -import type { WebSearchPreviewTool } from "./web-search-preview-tool"; -import type { WebSearchTool } from "./web-search-tool"; - -export type OpenAITool = - | ApplyPatchTool - | CodeInterpreterTool - | ComputerUseTool - | CustomTool - | FileSearchTool - | FunctionTool - | ImageGenerationTool - | LocalShellTool - | MCPTool - | ShellTool - | WebSearchPreviewTool - | WebSearchTool; - -export * from "./apply-patch-tool"; -export * from "./code-interpreter-tool"; -export * from "./computer-use-tool"; -export * from "./custom-tool"; -export * from "./file-search-tool"; -export * from "./function-tool"; -export * from "./image-generation-tool"; -export * from "./local-shell-tool"; -export * from "./mcp-tool"; -export * from "./shell-tool"; -export * from "./tool-choice"; -export * from "./tool-converter"; -export * from "./web-search-preview-tool"; -export * from "./web-search-tool"; +import type { ApplyPatchTool } from './apply-patch-tool' +import type { CodeInterpreterTool } from './code-interpreter-tool' +import type { ComputerUseTool } from './computer-use-tool' +import type { CustomTool } from './custom-tool' +import type { FileSearchTool } from './file-search-tool' +import type { FunctionTool } from './function-tool' +import type { ImageGenerationTool } from './image-generation-tool' +import type { LocalShellTool } from './local-shell-tool' +import type { MCPTool } from './mcp-tool' +import type { ShellTool } from './shell-tool' +import type { WebSearchPreviewTool } from './web-search-preview-tool' +import type { WebSearchTool } from './web-search-tool' + +export type OpenAITool = + | ApplyPatchTool + | CodeInterpreterTool + | ComputerUseTool + | CustomTool + | FileSearchTool + | FunctionTool + | ImageGenerationTool + | LocalShellTool + | MCPTool + | ShellTool + | WebSearchPreviewTool + | WebSearchTool + +export * from './apply-patch-tool' +export * from './code-interpreter-tool' +export * from './computer-use-tool' +export * from './custom-tool' +export * from './file-search-tool' +export * from './function-tool' +export * from './image-generation-tool' +export * from './local-shell-tool' +export * from './mcp-tool' +export * from './shell-tool' +export * from './tool-choice' +export * from './tool-converter' +export * from './web-search-preview-tool' +export * from './web-search-tool' diff --git a/packages/typescript/ai-openai/src/tools/local-shell-tool.ts b/packages/typescript/ai-openai/src/tools/local-shell-tool.ts index 8a70237b7..40c0bc3be 100644 --- a/packages/typescript/ai-openai/src/tools/local-shell-tool.ts +++ b/packages/typescript/ai-openai/src/tools/local-shell-tool.ts @@ -1,29 +1,30 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type LocalShellTool = OpenAI.Responses.Tool.LocalShell; - -/** - * Converts a standard Tool to OpenAI LocalShellTool format - */ -export function convertLocalShellToolToAdapterFormat(_tool: Tool): LocalShellTool { - return { - type: "local_shell", - }; -} - -/** - * Creates a standard Tool from LocalShellTool parameters - */ -export function localShellTool(): Tool { - return { - type: "function", - function: { - name: "local_shell", - description: "Execute local shell commands", - parameters: {}, - }, - metadata: {}, - }; -} - +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type LocalShellTool = OpenAI.Responses.Tool.LocalShell + +/** + * Converts a standard Tool to OpenAI LocalShellTool format + */ +export function convertLocalShellToolToAdapterFormat( + _tool: Tool, +): LocalShellTool { + return { + type: 'local_shell', + } +} + +/** + * Creates a standard Tool from LocalShellTool parameters + */ +export function localShellTool(): Tool { + return { + type: 'function', + function: { + name: 'local_shell', + description: 'Execute local shell commands', + parameters: {}, + }, + metadata: {}, + } +} diff --git a/packages/typescript/ai-openai/src/tools/mcp-tool.ts b/packages/typescript/ai-openai/src/tools/mcp-tool.ts index ba9965abd..f4768c7fa 100644 --- a/packages/typescript/ai-openai/src/tools/mcp-tool.ts +++ b/packages/typescript/ai-openai/src/tools/mcp-tool.ts @@ -1,47 +1,45 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type MCPTool = OpenAI.Responses.Tool.Mcp; - -export const validateMCPtool = (tool: MCPTool) => { - if (!tool.server_url && !tool.connector_id) { - throw new Error("Either server_url or connector_id must be provided."); - } - if (tool.connector_id && tool.server_url) { - throw new Error("Only one of server_url or connector_id can be provided."); - } -} - -/** -* Converts a standard Tool to OpenAI MCPTool format -*/ -export function convertMCPToolToAdapterFormat(tool: Tool): MCPTool { - const metadata = tool.metadata as Omit; - - const mcpTool: MCPTool = { - type: "mcp", - ...metadata - } - - validateMCPtool(mcpTool); - return mcpTool; -} - -/** - * Creates a standard Tool from MCPTool parameters - */ -export function mcpTool( - toolData: Omit -): Tool { - validateMCPtool({ ...toolData, type: "mcp" }); - - return { - type: "function", - function: { - name: "mcp", - description: toolData.server_description || "", - parameters: {}, - }, - metadata: toolData - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type MCPTool = OpenAI.Responses.Tool.Mcp + +export const validateMCPtool = (tool: MCPTool) => { + if (!tool.server_url && !tool.connector_id) { + throw new Error('Either server_url or connector_id must be provided.') + } + if (tool.connector_id && tool.server_url) { + throw new Error('Only one of server_url or connector_id can be provided.') + } +} + +/** + * Converts a standard Tool to OpenAI MCPTool format + */ +export function convertMCPToolToAdapterFormat(tool: Tool): MCPTool { + const metadata = tool.metadata as Omit + + const mcpTool: MCPTool = { + type: 'mcp', + ...metadata, + } + + validateMCPtool(mcpTool) + return mcpTool +} + +/** + * Creates a standard Tool from MCPTool parameters + */ +export function mcpTool(toolData: Omit): Tool { + validateMCPtool({ ...toolData, type: 'mcp' }) + + return { + type: 'function', + function: { + name: 'mcp', + description: toolData.server_description || '', + parameters: {}, + }, + metadata: toolData, + } +} diff --git a/packages/typescript/ai-openai/src/tools/shell-tool.ts b/packages/typescript/ai-openai/src/tools/shell-tool.ts index 98f76fa07..30a1b57b1 100644 --- a/packages/typescript/ai-openai/src/tools/shell-tool.ts +++ b/packages/typescript/ai-openai/src/tools/shell-tool.ts @@ -1,28 +1,28 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type ShellTool = OpenAI.Responses.FunctionShellTool - -/** - * Converts a standard Tool to OpenAI ShellTool format - */ -export function convertShellToolToAdapterFormat(_tool: Tool): ShellTool { - return { - type: "shell", - }; -} - -/** - * Creates a standard Tool from ShellTool parameters - */ -export function shellTool(): Tool { - return { - type: "function", - function: { - name: "shell", - description: "Execute shell commands", - parameters: {}, - }, - metadata: {}, - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type ShellTool = OpenAI.Responses.FunctionShellTool + +/** + * Converts a standard Tool to OpenAI ShellTool format + */ +export function convertShellToolToAdapterFormat(_tool: Tool): ShellTool { + return { + type: 'shell', + } +} + +/** + * Creates a standard Tool from ShellTool parameters + */ +export function shellTool(): Tool { + return { + type: 'function', + function: { + name: 'shell', + description: 'Execute shell commands', + parameters: {}, + }, + metadata: {}, + } +} diff --git a/packages/typescript/ai-openai/src/tools/tool-choice.ts b/packages/typescript/ai-openai/src/tools/tool-choice.ts index f648c4c40..6caccabba 100644 --- a/packages/typescript/ai-openai/src/tools/tool-choice.ts +++ b/packages/typescript/ai-openai/src/tools/tool-choice.ts @@ -1,20 +1,31 @@ -export interface MCPToolChoice { - type: "mcp" - server_label: "deepwiki" -} - -export interface FunctionToolChoice { - type: "function" - name: string; -} - -export interface CustomToolChoice { - type: "custom" - name: string; -} - -export interface HostedToolChoice { - type: "file_search" | "web_search_preview" | "computer_use_preview" | "code_interpreter" | "image_generation" | "shell" | "apply_patch" -} - -export type ToolChoice = MCPToolChoice | FunctionToolChoice | CustomToolChoice | HostedToolChoice; \ No newline at end of file +export interface MCPToolChoice { + type: 'mcp' + server_label: 'deepwiki' +} + +export interface FunctionToolChoice { + type: 'function' + name: string +} + +export interface CustomToolChoice { + type: 'custom' + name: string +} + +export interface HostedToolChoice { + type: + | 'file_search' + | 'web_search_preview' + | 'computer_use_preview' + | 'code_interpreter' + | 'image_generation' + | 'shell' + | 'apply_patch' +} + +export type ToolChoice = + | MCPToolChoice + | FunctionToolChoice + | CustomToolChoice + | HostedToolChoice diff --git a/packages/typescript/ai-openai/src/tools/tool-converter.ts b/packages/typescript/ai-openai/src/tools/tool-converter.ts index 85bae5c0c..9262789c2 100644 --- a/packages/typescript/ai-openai/src/tools/tool-converter.ts +++ b/packages/typescript/ai-openai/src/tools/tool-converter.ts @@ -1,70 +1,72 @@ -import type { Tool } from "@tanstack/ai"; -import type { OpenAITool } from "./index"; -import { convertApplyPatchToolToAdapterFormat } from "./apply-patch-tool"; -import { convertCodeInterpreterToolToAdapterFormat } from "./code-interpreter-tool"; -import { convertComputerUseToolToAdapterFormat } from "./computer-use-tool"; -import { convertCustomToolToAdapterFormat } from "./custom-tool"; -import { convertFileSearchToolToAdapterFormat } from "./file-search-tool"; -import { convertFunctionToolToAdapterFormat } from "./function-tool"; -import { convertImageGenerationToolToAdapterFormat } from "./image-generation-tool"; -import { convertLocalShellToolToAdapterFormat } from "./local-shell-tool"; -import { convertMCPToolToAdapterFormat } from "./mcp-tool"; -import { convertShellToolToAdapterFormat } from "./shell-tool"; -import { convertWebSearchPreviewToolToAdapterFormat } from "./web-search-preview-tool"; -import { convertWebSearchToolToAdapterFormat } from "./web-search-tool"; - -/** - * Converts an array of standard Tools to OpenAI-specific format - */ -export function convertToolsToProviderFormat(tools: Array): Array { - return tools.map((tool) => { - // Special tool names that map to specific OpenAI tool types - const specialToolNames = new Set([ - "apply_patch", - "code_interpreter", - "computer_use_preview", - "file_search", - "image_generation", - "local_shell", - "mcp", - "shell", - "web_search_preview", - "web_search", - "custom", - ]); - - const toolName = tool.function.name; - - // If it's a special tool name, route to the appropriate converter - if (specialToolNames.has(toolName)) { - switch (toolName) { - case "apply_patch": - return convertApplyPatchToolToAdapterFormat(tool); - case "code_interpreter": - return convertCodeInterpreterToolToAdapterFormat(tool); - case "computer_use_preview": - return convertComputerUseToolToAdapterFormat(tool); - case "file_search": - return convertFileSearchToolToAdapterFormat(tool); - case "image_generation": - return convertImageGenerationToolToAdapterFormat(tool); - case "local_shell": - return convertLocalShellToolToAdapterFormat(tool); - case "mcp": - return convertMCPToolToAdapterFormat(tool); - case "shell": - return convertShellToolToAdapterFormat(tool); - case "web_search_preview": - return convertWebSearchPreviewToolToAdapterFormat(tool); - case "web_search": - return convertWebSearchToolToAdapterFormat(tool); - case "custom": - return convertCustomToolToAdapterFormat(tool); - } - } - - // For regular function tools (not special names), convert as function tool - // This handles tools like "getGuitars", "recommendGuitar", etc. - return convertFunctionToolToAdapterFormat(tool); - }); -} +import { convertApplyPatchToolToAdapterFormat } from './apply-patch-tool' +import { convertCodeInterpreterToolToAdapterFormat } from './code-interpreter-tool' +import { convertComputerUseToolToAdapterFormat } from './computer-use-tool' +import { convertCustomToolToAdapterFormat } from './custom-tool' +import { convertFileSearchToolToAdapterFormat } from './file-search-tool' +import { convertFunctionToolToAdapterFormat } from './function-tool' +import { convertImageGenerationToolToAdapterFormat } from './image-generation-tool' +import { convertLocalShellToolToAdapterFormat } from './local-shell-tool' +import { convertMCPToolToAdapterFormat } from './mcp-tool' +import { convertShellToolToAdapterFormat } from './shell-tool' +import { convertWebSearchPreviewToolToAdapterFormat } from './web-search-preview-tool' +import { convertWebSearchToolToAdapterFormat } from './web-search-tool' +import type { OpenAITool } from './index' +import type { Tool } from '@tanstack/ai' + +/** + * Converts an array of standard Tools to OpenAI-specific format + */ +export function convertToolsToProviderFormat( + tools: Array, +): Array { + return tools.map((tool) => { + // Special tool names that map to specific OpenAI tool types + const specialToolNames = new Set([ + 'apply_patch', + 'code_interpreter', + 'computer_use_preview', + 'file_search', + 'image_generation', + 'local_shell', + 'mcp', + 'shell', + 'web_search_preview', + 'web_search', + 'custom', + ]) + + const toolName = tool.function.name + + // If it's a special tool name, route to the appropriate converter + if (specialToolNames.has(toolName)) { + switch (toolName) { + case 'apply_patch': + return convertApplyPatchToolToAdapterFormat(tool) + case 'code_interpreter': + return convertCodeInterpreterToolToAdapterFormat(tool) + case 'computer_use_preview': + return convertComputerUseToolToAdapterFormat(tool) + case 'file_search': + return convertFileSearchToolToAdapterFormat(tool) + case 'image_generation': + return convertImageGenerationToolToAdapterFormat(tool) + case 'local_shell': + return convertLocalShellToolToAdapterFormat(tool) + case 'mcp': + return convertMCPToolToAdapterFormat(tool) + case 'shell': + return convertShellToolToAdapterFormat(tool) + case 'web_search_preview': + return convertWebSearchPreviewToolToAdapterFormat(tool) + case 'web_search': + return convertWebSearchToolToAdapterFormat(tool) + case 'custom': + return convertCustomToolToAdapterFormat(tool) + } + } + + // For regular function tools (not special names), convert as function tool + // This handles tools like "getGuitars", "recommendGuitar", etc. + return convertFunctionToolToAdapterFormat(tool) + }) +} diff --git a/packages/typescript/ai-openai/src/tools/web-search-preview-tool.ts b/packages/typescript/ai-openai/src/tools/web-search-preview-tool.ts index e7d037e57..e68e21e29 100644 --- a/packages/typescript/ai-openai/src/tools/web-search-preview-tool.ts +++ b/packages/typescript/ai-openai/src/tools/web-search-preview-tool.ts @@ -1,34 +1,33 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type WebSearchPreviewTool = OpenAI.Responses.WebSearchPreviewTool - -/** - * Converts a standard Tool to OpenAI WebSearchPreviewTool format - */ -export function convertWebSearchPreviewToolToAdapterFormat(tool: Tool): WebSearchPreviewTool { - const metadata = tool.metadata as WebSearchPreviewTool; - return { - type: metadata.type, - search_context_size: metadata.search_context_size, - user_location: metadata.user_location, - }; -} - -/** - * Creates a standard Tool from WebSearchPreviewTool parameters - */ -export function webSearchPreviewTool( - toolData: WebSearchPreviewTool -): Tool { - - return { - type: "function", - function: { - name: "web_search_preview", - description: "Search the web (preview version)", - parameters: {}, - }, - metadata: toolData - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type WebSearchPreviewTool = OpenAI.Responses.WebSearchPreviewTool + +/** + * Converts a standard Tool to OpenAI WebSearchPreviewTool format + */ +export function convertWebSearchPreviewToolToAdapterFormat( + tool: Tool, +): WebSearchPreviewTool { + const metadata = tool.metadata as WebSearchPreviewTool + return { + type: metadata.type, + search_context_size: metadata.search_context_size, + user_location: metadata.user_location, + } +} + +/** + * Creates a standard Tool from WebSearchPreviewTool parameters + */ +export function webSearchPreviewTool(toolData: WebSearchPreviewTool): Tool { + return { + type: 'function', + function: { + name: 'web_search_preview', + description: 'Search the web (preview version)', + parameters: {}, + }, + metadata: toolData, + } +} diff --git a/packages/typescript/ai-openai/src/tools/web-search-tool.ts b/packages/typescript/ai-openai/src/tools/web-search-tool.ts index 90b10148d..baa0d7713 100644 --- a/packages/typescript/ai-openai/src/tools/web-search-tool.ts +++ b/packages/typescript/ai-openai/src/tools/web-search-tool.ts @@ -1,29 +1,27 @@ -import type { Tool } from "@tanstack/ai"; -import OpenAI from "openai"; - -export type WebSearchTool = OpenAI.Responses.WebSearchTool - -/** - * Converts a standard Tool to OpenAI WebSearchTool format - */ -export function convertWebSearchToolToAdapterFormat(tool: Tool): WebSearchTool { - const metadata = tool.metadata as WebSearchTool; - return metadata -} - -/** - * Creates a standard Tool from WebSearchTool parameters - */ -export function webSearchTool( - toolData: WebSearchTool -): Tool { - return { - type: "function", - function: { - name: "web_search", - description: "Search the web", - parameters: {}, - }, - metadata: toolData - }; -} \ No newline at end of file +import type OpenAI from 'openai' +import type { Tool } from '@tanstack/ai' + +export type WebSearchTool = OpenAI.Responses.WebSearchTool + +/** + * Converts a standard Tool to OpenAI WebSearchTool format + */ +export function convertWebSearchToolToAdapterFormat(tool: Tool): WebSearchTool { + const metadata = tool.metadata as WebSearchTool + return metadata +} + +/** + * Creates a standard Tool from WebSearchTool parameters + */ +export function webSearchTool(toolData: WebSearchTool): Tool { + return { + type: 'function', + function: { + name: 'web_search', + description: 'Search the web', + parameters: {}, + }, + metadata: toolData, + } +} diff --git a/packages/typescript/ai-openai/tests/model-meta.test.ts b/packages/typescript/ai-openai/tests/model-meta.test.ts index ba53c190d..a725764a6 100644 --- a/packages/typescript/ai-openai/tests/model-meta.test.ts +++ b/packages/typescript/ai-openai/tests/model-meta.test.ts @@ -1,620 +1,796 @@ -import { describe, it, expectTypeOf } from "vitest"; -import type { - OpenAIChatModelProviderOptionsByName, -} from "../src/model-meta"; -import type { - OpenAIBaseOptions, - OpenAIReasoningOptions, - OpenAIStructuredOutputOptions, - OpenAIToolsOptions, - OpenAIStreamingOptions, - OpenAIMetadataOptions, -} from "../src/text/text-provider-options"; - -/** - * Type assertion tests for OpenAI model provider options. - * - * These tests verify that: - * 1. Models with reasoning support have OpenAIReasoningOptions in their provider options - * 2. Models without reasoning support do NOT have OpenAIReasoningOptions - * 3. Models with structured output support have OpenAIStructuredOutputOptions - * 4. Models without structured output support do NOT have OpenAIStructuredOutputOptions - * 5. Models with tools support have OpenAIToolsOptions - * 6. All chat models have base options (OpenAIBaseOptions, OpenAIMetadataOptions) - */ - -// Base options that ALL chat models should have -type BaseOptions = OpenAIBaseOptions & OpenAIMetadataOptions; - -// Full featured model options (reasoning + structured output + tools + streaming) -type FullFeaturedOptions = BaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions; - -// Standard model options (structured output + tools + streaming, no reasoning) -type StandardOptions = BaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions; - -// Reasoning-only model options (reasoning but no tools/structured output streaming) -type ReasoningOnlyOptions = BaseOptions & OpenAIReasoningOptions; - -describe("OpenAI Chat Model Provider Options Type Assertions", () => { - describe("Models WITH reasoning AND structured output AND tools support (Full Featured)", () => { - it("gpt-5.1 should support all features", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5.1"]; - - // Should have reasoning options - expectTypeOf().toExtend(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have tools options - expectTypeOf().toExtend(); - - // Should have streaming options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - - // Verify specific properties exist - expectTypeOf().toHaveProperty("reasoning"); - expectTypeOf().toHaveProperty("text"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("stream_options"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("store"); - }); - - it("gpt-5.1-codex should support all features", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5.1-codex"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-5 should support all features", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-5-pro should support all features", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5-pro"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - }); - - describe("Models WITH structured output AND tools but WITHOUT reasoning (Standard)", () => { - it("gpt-5-mini should have structured output and tools but NOT reasoning", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5-mini"]; - - // Should NOT have reasoning options - expectTypeOf().not.toExtend(); - - // Should have structured output options - expectTypeOf().toExtend(); - - // Should have tools options - expectTypeOf().toExtend(); - - // Should have streaming options - expectTypeOf().toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - }); - - it("gpt-5-nano should have structured output and tools but NOT reasoning", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5-nano"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-5-codex should have structured output and tools but NOT reasoning", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5-codex"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4.1 should have structured output and tools but NOT reasoning", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4.1"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4.1-mini should have structured output and tools but NOT reasoning", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4.1-mini"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4.1-nano should have structured output and tools but NOT reasoning", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4.1-nano"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4o should have structured output and tools but NOT reasoning", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4o"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4o-mini should have structured output and tools but NOT reasoning", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4o-mini"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - }); - - describe("Models WITH reasoning but LIMITED other features (Reasoning Models)", () => { - it("o3 should have reasoning but NOT structured output or tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["o3"]; - - // Should have reasoning options - expectTypeOf().toExtend(); - - // Should NOT have structured output options - expectTypeOf().not.toExtend(); - - // Should NOT have tools options - expectTypeOf().not.toExtend(); - - // Should NOT have streaming options - expectTypeOf().not.toExtend(); - - // Should have base options - expectTypeOf().toExtend(); - }); - - it("o3-pro should have reasoning but NOT structured output or tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["o3-pro"]; - - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - - it("o3-mini should have reasoning but NOT structured output or tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["o3-mini"]; - - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - - it("o4-mini should have reasoning but NOT structured output or tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["o4-mini"]; - - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - - it("o3-deep-research should have reasoning but NOT structured output or tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["o3-deep-research"]; - - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - - it("o4-mini-deep-research should have reasoning but NOT structured output or tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["o4-mini-deep-research"]; - - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - - it("o1 should have reasoning but NOT structured output or tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["o1"]; - - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - - it("o1-pro should have reasoning but NOT structured output or tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["o1-pro"]; - - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - }); - - describe("Models WITH tools but WITHOUT structured output or reasoning (Legacy Models)", () => { - it("gpt-4 should have tools and streaming but NOT reasoning or structured output", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4-turbo should have tools and streaming but NOT reasoning or structured output", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4-turbo"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-3.5-turbo should have tools and streaming but NOT reasoning or structured output", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-3.5-turbo"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - }); - - describe("Models WITH minimal features (Basic Models)", () => { - it("chatgpt-4.0 should only have streaming and base options", () => { - type Options = OpenAIChatModelProviderOptionsByName["chatgpt-4.0"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-audio should only have streaming and base options", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-audio"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-audio-mini should only have streaming and base options", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-audio-mini"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4o-audio should only have streaming and base options", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4o-audio"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4o-mini-audio should only have streaming and base options", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4o-mini-audio"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - }); - - describe("Chat-only models WITH reasoning AND structured output but WITHOUT tools", () => { - it("gpt-5.1-chat should have reasoning and structured output but NOT tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5.1-chat"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-5-chat should have reasoning and structured output but NOT tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5-chat"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - }); - }); - - describe("Codex/Preview models", () => { - it("gpt-5.1-codex-mini should have structured output and tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-5.1-codex-mini"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("codex-mini-latest should have structured output and tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["codex-mini-latest"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4o-search-preview should have structured output and tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4o-search-preview"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("gpt-4o-mini-search-preview should have structured output and tools", () => { - type Options = OpenAIChatModelProviderOptionsByName["gpt-4o-mini-search-preview"]; - - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("computer-use-preview should have tools but NOT structured output", () => { - type Options = OpenAIChatModelProviderOptionsByName["computer-use-preview"]; - - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - }); - - describe("Provider options type completeness", () => { - it("OpenAIChatModelProviderOptionsByName should have entries for all chat models", () => { - type Keys = keyof OpenAIChatModelProviderOptionsByName; - - // Full featured models - expectTypeOf<"gpt-5.1">().toExtend(); - expectTypeOf<"gpt-5.1-codex">().toExtend(); - expectTypeOf<"gpt-5">().toExtend(); - expectTypeOf<"gpt-5-pro">().toExtend(); - - // Standard models (structured output + tools, no reasoning) - expectTypeOf<"gpt-5-mini">().toExtend(); - expectTypeOf<"gpt-5-nano">().toExtend(); - expectTypeOf<"gpt-5-codex">().toExtend(); - expectTypeOf<"gpt-4.1">().toExtend(); - expectTypeOf<"gpt-4.1-mini">().toExtend(); - expectTypeOf<"gpt-4.1-nano">().toExtend(); - expectTypeOf<"gpt-4o">().toExtend(); - expectTypeOf<"gpt-4o-mini">().toExtend(); - - // Reasoning-only models - expectTypeOf<"o3">().toExtend(); - expectTypeOf<"o3-pro">().toExtend(); - expectTypeOf<"o3-mini">().toExtend(); - expectTypeOf<"o4-mini">().toExtend(); - expectTypeOf<"o3-deep-research">().toExtend(); - expectTypeOf<"o4-mini-deep-research">().toExtend(); - expectTypeOf<"o1">().toExtend(); - expectTypeOf<"o1-pro">().toExtend(); - - // Legacy models - expectTypeOf<"gpt-4">().toExtend(); - expectTypeOf<"gpt-4-turbo">().toExtend(); - expectTypeOf<"gpt-3.5-turbo">().toExtend(); - - // Basic models - expectTypeOf<"chatgpt-4.0">().toExtend(); - expectTypeOf<"gpt-audio">().toExtend(); - expectTypeOf<"gpt-audio-mini">().toExtend(); - expectTypeOf<"gpt-4o-audio">().toExtend(); - expectTypeOf<"gpt-4o-mini-audio">().toExtend(); - - // Chat-only models - expectTypeOf<"gpt-5.1-chat">().toExtend(); - expectTypeOf<"gpt-5-chat">().toExtend(); - - // Codex/Preview models - expectTypeOf<"gpt-5.1-codex-mini">().toExtend(); - expectTypeOf<"codex-mini-latest">().toExtend(); - expectTypeOf<"gpt-4o-search-preview">().toExtend(); - expectTypeOf<"gpt-4o-mini-search-preview">().toExtend(); - expectTypeOf<"computer-use-preview">().toExtend(); - }); - }); - - describe("Detailed property type assertions", () => { - it("all models should have metadata option", () => { - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - expectTypeOf().toHaveProperty("metadata"); - }); - - it("all models should have store option", () => { - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - expectTypeOf().toHaveProperty("store"); - }); - - it("all models should have service_tier option", () => { - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - expectTypeOf().toHaveProperty("service_tier"); - }); - - it("models with tools support should have tool_choice and parallel_tool_calls", () => { - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("parallel_tool_calls"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - expectTypeOf().toHaveProperty("tool_choice"); - }); - - it("models with structured output should have text option", () => { - expectTypeOf().toHaveProperty("text"); - expectTypeOf().toHaveProperty("text"); - expectTypeOf().toHaveProperty("text"); - expectTypeOf().toHaveProperty("text"); - expectTypeOf().toHaveProperty("text"); - expectTypeOf().toHaveProperty("text"); - expectTypeOf().toHaveProperty("text"); - }); - - it("models with streaming should have stream_options", () => { - expectTypeOf().toHaveProperty("stream_options"); - expectTypeOf().toHaveProperty("stream_options"); - expectTypeOf().toHaveProperty("stream_options"); - expectTypeOf().toHaveProperty("stream_options"); - expectTypeOf().toHaveProperty("stream_options"); - expectTypeOf().toHaveProperty("stream_options"); - expectTypeOf().toHaveProperty("stream_options"); - }); - }); - - describe("Type discrimination between model categories", () => { - it("full featured models should extend all options", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - - it("standard models should NOT extend reasoning options but should extend structured output and tools", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - - // Verify these do NOT extend reasoning options (discrimination already tested above) - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - }); - - it("reasoning-only models should extend reasoning options but NOT structured output or tools", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - - // Verify these do NOT extend structured output or tools options - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - expectTypeOf().not.toExtend(); - }); - - it("all models should extend base options", () => { - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - expectTypeOf().toExtend(); - }); - }); -}); +import { describe, it, expectTypeOf } from 'vitest' +import type { OpenAIChatModelProviderOptionsByName } from '../src/model-meta' +import type { + OpenAIBaseOptions, + OpenAIReasoningOptions, + OpenAIStructuredOutputOptions, + OpenAIToolsOptions, + OpenAIStreamingOptions, + OpenAIMetadataOptions, +} from '../src/text/text-provider-options' + +/** + * Type assertion tests for OpenAI model provider options. + * + * These tests verify that: + * 1. Models with reasoning support have OpenAIReasoningOptions in their provider options + * 2. Models without reasoning support do NOT have OpenAIReasoningOptions + * 3. Models with structured output support have OpenAIStructuredOutputOptions + * 4. Models without structured output support do NOT have OpenAIStructuredOutputOptions + * 5. Models with tools support have OpenAIToolsOptions + * 6. All chat models have base options (OpenAIBaseOptions, OpenAIMetadataOptions) + */ + +// Base options that ALL chat models should have +type BaseOptions = OpenAIBaseOptions & OpenAIMetadataOptions + +// Full featured model options (reasoning + structured output + tools + streaming) +type FullFeaturedOptions = BaseOptions & + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions + +// Standard model options (structured output + tools + streaming, no reasoning) +type StandardOptions = BaseOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions + +// Reasoning-only model options (reasoning but no tools/structured output streaming) +type ReasoningOnlyOptions = BaseOptions & OpenAIReasoningOptions + +describe('OpenAI Chat Model Provider Options Type Assertions', () => { + describe('Models WITH reasoning AND structured output AND tools support (Full Featured)', () => { + it('gpt-5.1 should support all features', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5.1'] + + // Should have reasoning options + expectTypeOf().toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have tools options + expectTypeOf().toExtend() + + // Should have streaming options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + + // Verify specific properties exist + expectTypeOf().toHaveProperty('reasoning') + expectTypeOf().toHaveProperty('text') + expectTypeOf().toHaveProperty('tool_choice') + expectTypeOf().toHaveProperty('stream_options') + expectTypeOf().toHaveProperty('metadata') + expectTypeOf().toHaveProperty('store') + }) + + it('gpt-5.1-codex should support all features', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5.1-codex'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-5 should support all features', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-5-pro should support all features', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5-pro'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + }) + + describe('Models WITH structured output AND tools but WITHOUT reasoning (Standard)', () => { + it('gpt-5-mini should have structured output and tools but NOT reasoning', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + + // Should NOT have reasoning options + expectTypeOf().not.toExtend() + + // Should have structured output options + expectTypeOf().toExtend() + + // Should have tools options + expectTypeOf().toExtend() + + // Should have streaming options + expectTypeOf().toExtend() + + // Should have base options + expectTypeOf().toExtend() + }) + + it('gpt-5-nano should have structured output and tools but NOT reasoning', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5-nano'] + + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-5-codex should have structured output and tools but NOT reasoning', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5-codex'] + + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4.1 should have structured output and tools but NOT reasoning', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4.1'] + + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4.1-mini should have structured output and tools but NOT reasoning', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4.1-mini'] + + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4.1-nano should have structured output and tools but NOT reasoning', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4.1-nano'] + + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4o should have structured output and tools but NOT reasoning', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4o'] + + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4o-mini should have structured output and tools but NOT reasoning', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4o-mini'] + + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + }) + + describe('Models WITH reasoning but LIMITED other features (Reasoning Models)', () => { + it('o3 should have reasoning but NOT structured output or tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['o3'] + + // Should have reasoning options + expectTypeOf().toExtend() + + // Should NOT have structured output options + expectTypeOf().not.toExtend() + + // Should NOT have tools options + expectTypeOf().not.toExtend() + + // Should NOT have streaming options + expectTypeOf().not.toExtend() + + // Should have base options + expectTypeOf().toExtend() + }) + + it('o3-pro should have reasoning but NOT structured output or tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['o3-pro'] + + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + + it('o3-mini should have reasoning but NOT structured output or tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['o3-mini'] + + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + + it('o4-mini should have reasoning but NOT structured output or tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['o4-mini'] + + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + + it('o3-deep-research should have reasoning but NOT structured output or tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['o3-deep-research'] + + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + + it('o4-mini-deep-research should have reasoning but NOT structured output or tools', () => { + type Options = + OpenAIChatModelProviderOptionsByName['o4-mini-deep-research'] + + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + + it('o1 should have reasoning but NOT structured output or tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['o1'] + + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + + it('o1-pro should have reasoning but NOT structured output or tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['o1-pro'] + + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + }) + + describe('Models WITH tools but WITHOUT structured output or reasoning (Legacy Models)', () => { + it('gpt-4 should have tools and streaming but NOT reasoning or structured output', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4-turbo should have tools and streaming but NOT reasoning or structured output', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4-turbo'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-3.5-turbo should have tools and streaming but NOT reasoning or structured output', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-3.5-turbo'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + }) + + describe('Models WITH minimal features (Basic Models)', () => { + it('chatgpt-4.0 should only have streaming and base options', () => { + type Options = OpenAIChatModelProviderOptionsByName['chatgpt-4.0'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-audio should only have streaming and base options', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-audio'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-audio-mini should only have streaming and base options', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-audio-mini'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4o-audio should only have streaming and base options', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4o-audio'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4o-mini-audio should only have streaming and base options', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-4o-mini-audio'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + }) + + describe('Chat-only models WITH reasoning AND structured output but WITHOUT tools', () => { + it('gpt-5.1-chat should have reasoning and structured output but NOT tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5.1-chat'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-5-chat should have reasoning and structured output but NOT tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5-chat'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + }) + }) + + describe('Codex/Preview models', () => { + it('gpt-5.1-codex-mini should have structured output and tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['gpt-5.1-codex-mini'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('codex-mini-latest should have structured output and tools', () => { + type Options = OpenAIChatModelProviderOptionsByName['codex-mini-latest'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4o-search-preview should have structured output and tools', () => { + type Options = + OpenAIChatModelProviderOptionsByName['gpt-4o-search-preview'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('gpt-4o-mini-search-preview should have structured output and tools', () => { + type Options = + OpenAIChatModelProviderOptionsByName['gpt-4o-mini-search-preview'] + + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + + it('computer-use-preview should have tools but NOT structured output', () => { + type Options = + OpenAIChatModelProviderOptionsByName['computer-use-preview'] + + expectTypeOf().not.toExtend() + expectTypeOf().not.toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + expectTypeOf().toExtend() + }) + }) + + describe('Provider options type completeness', () => { + it('OpenAIChatModelProviderOptionsByName should have entries for all chat models', () => { + type Keys = keyof OpenAIChatModelProviderOptionsByName + + // Full featured models + expectTypeOf<'gpt-5.1'>().toExtend() + expectTypeOf<'gpt-5.1-codex'>().toExtend() + expectTypeOf<'gpt-5'>().toExtend() + expectTypeOf<'gpt-5-pro'>().toExtend() + + // Standard models (structured output + tools, no reasoning) + expectTypeOf<'gpt-5-mini'>().toExtend() + expectTypeOf<'gpt-5-nano'>().toExtend() + expectTypeOf<'gpt-5-codex'>().toExtend() + expectTypeOf<'gpt-4.1'>().toExtend() + expectTypeOf<'gpt-4.1-mini'>().toExtend() + expectTypeOf<'gpt-4.1-nano'>().toExtend() + expectTypeOf<'gpt-4o'>().toExtend() + expectTypeOf<'gpt-4o-mini'>().toExtend() + + // Reasoning-only models + expectTypeOf<'o3'>().toExtend() + expectTypeOf<'o3-pro'>().toExtend() + expectTypeOf<'o3-mini'>().toExtend() + expectTypeOf<'o4-mini'>().toExtend() + expectTypeOf<'o3-deep-research'>().toExtend() + expectTypeOf<'o4-mini-deep-research'>().toExtend() + expectTypeOf<'o1'>().toExtend() + expectTypeOf<'o1-pro'>().toExtend() + + // Legacy models + expectTypeOf<'gpt-4'>().toExtend() + expectTypeOf<'gpt-4-turbo'>().toExtend() + expectTypeOf<'gpt-3.5-turbo'>().toExtend() + + // Basic models + expectTypeOf<'chatgpt-4.0'>().toExtend() + expectTypeOf<'gpt-audio'>().toExtend() + expectTypeOf<'gpt-audio-mini'>().toExtend() + expectTypeOf<'gpt-4o-audio'>().toExtend() + expectTypeOf<'gpt-4o-mini-audio'>().toExtend() + + // Chat-only models + expectTypeOf<'gpt-5.1-chat'>().toExtend() + expectTypeOf<'gpt-5-chat'>().toExtend() + + // Codex/Preview models + expectTypeOf<'gpt-5.1-codex-mini'>().toExtend() + expectTypeOf<'codex-mini-latest'>().toExtend() + expectTypeOf<'gpt-4o-search-preview'>().toExtend() + expectTypeOf<'gpt-4o-mini-search-preview'>().toExtend() + expectTypeOf<'computer-use-preview'>().toExtend() + }) + }) + + describe('Detailed property type assertions', () => { + it('all models should have metadata option', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toHaveProperty('metadata') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5'] + >().toHaveProperty('metadata') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().toHaveProperty('metadata') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().toHaveProperty('metadata') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().toHaveProperty('metadata') + expectTypeOf().toHaveProperty( + 'metadata', + ) + expectTypeOf().toHaveProperty( + 'metadata', + ) + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4'] + >().toHaveProperty('metadata') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-3.5-turbo'] + >().toHaveProperty('metadata') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['chatgpt-4.0'] + >().toHaveProperty('metadata') + }) + + it('all models should have store option', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toHaveProperty('store') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5'] + >().toHaveProperty('store') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().toHaveProperty('store') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().toHaveProperty('store') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().toHaveProperty('store') + expectTypeOf().toHaveProperty( + 'store', + ) + expectTypeOf().toHaveProperty( + 'store', + ) + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4'] + >().toHaveProperty('store') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-3.5-turbo'] + >().toHaveProperty('store') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['chatgpt-4.0'] + >().toHaveProperty('store') + }) + + it('all models should have service_tier option', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toHaveProperty('service_tier') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5'] + >().toHaveProperty('service_tier') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().toHaveProperty('service_tier') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().toHaveProperty('service_tier') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().toHaveProperty('service_tier') + expectTypeOf().toHaveProperty( + 'service_tier', + ) + expectTypeOf().toHaveProperty( + 'service_tier', + ) + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4'] + >().toHaveProperty('service_tier') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-3.5-turbo'] + >().toHaveProperty('service_tier') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['chatgpt-4.0'] + >().toHaveProperty('service_tier') + }) + + it('models with tools support should have tool_choice and parallel_tool_calls', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toHaveProperty('tool_choice') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toHaveProperty('parallel_tool_calls') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5'] + >().toHaveProperty('tool_choice') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().toHaveProperty('tool_choice') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().toHaveProperty('tool_choice') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().toHaveProperty('tool_choice') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4'] + >().toHaveProperty('tool_choice') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-3.5-turbo'] + >().toHaveProperty('tool_choice') + }) + + it('models with structured output should have text option', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toHaveProperty('text') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5'] + >().toHaveProperty('text') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().toHaveProperty('text') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().toHaveProperty('text') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().toHaveProperty('text') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1-chat'] + >().toHaveProperty('text') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-chat'] + >().toHaveProperty('text') + }) + + it('models with streaming should have stream_options', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toHaveProperty('stream_options') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5'] + >().toHaveProperty('stream_options') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().toHaveProperty('stream_options') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().toHaveProperty('stream_options') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().toHaveProperty('stream_options') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4'] + >().toHaveProperty('stream_options') + expectTypeOf< + OpenAIChatModelProviderOptionsByName['chatgpt-4.0'] + >().toHaveProperty('stream_options') + }) + }) + + describe('Type discrimination between model categories', () => { + it('full featured models should extend all options', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1-codex'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-pro'] + >().toExtend() + }) + + it('standard models should NOT extend reasoning options but should extend structured output and tools', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-nano'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1-mini'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o-mini'] + >().toExtend() + + // Verify these do NOT extend reasoning options (discrimination already tested above) + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().not.toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().not.toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().not.toExtend() + }) + + it('reasoning-only models should extend reasoning options but NOT structured output or tools', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o3'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o3-pro'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o3-mini'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o4-mini'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o1'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o1-pro'] + >().toExtend() + + // Verify these do NOT extend structured output or tools options + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o3'] + >().not.toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o3'] + >().not.toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o1'] + >().not.toExtend() + }) + + it('all models should extend base options', () => { + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-mini'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4.1'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4o'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o3'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['o1'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-4'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-3.5-turbo'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['chatgpt-4.0'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5.1-chat'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['gpt-5-chat'] + >().toExtend() + expectTypeOf< + OpenAIChatModelProviderOptionsByName['computer-use-preview'] + >().toExtend() + }) + }) +}) diff --git a/packages/typescript/ai-openai/tests/openai-adapter.test.ts b/packages/typescript/ai-openai/tests/openai-adapter.test.ts index e220161b3..2799f718a 100644 --- a/packages/typescript/ai-openai/tests/openai-adapter.test.ts +++ b/packages/typescript/ai-openai/tests/openai-adapter.test.ts @@ -1,68 +1,68 @@ -import { describe, it, expect, beforeEach, vi } from "vitest"; -import { chat, type Tool, type StreamChunk } from "@tanstack/ai"; -import { OpenAI, type OpenAIProviderOptions } from "../src/openai-adapter"; +import { describe, it, expect, beforeEach, vi } from 'vitest' +import { chat, type Tool, type StreamChunk } from '@tanstack/ai' +import { OpenAI, type OpenAIProviderOptions } from '../src/openai-adapter' -const createAdapter = () => new OpenAI({ apiKey: "test-key" }); +const createAdapter = () => new OpenAI({ apiKey: 'test-key' }) -const toolArguments = JSON.stringify({ location: "Berlin" }); +const toolArguments = JSON.stringify({ location: 'Berlin' }) const weatherTool: Tool = { - type: "function", + type: 'function', function: { - name: "lookup_weather", - description: "Return the forecast for a location", + name: 'lookup_weather', + description: 'Return the forecast for a location', parameters: { - type: "object", + type: 'object', properties: { - location: { type: "string" }, + location: { type: 'string' }, }, - required: ["location"], + required: ['location'], }, }, -}; +} function createMockChatCompletionsStream( - chunks: Array> + chunks: Array>, ): AsyncIterable> { return { async *[Symbol.asyncIterator]() { for (const chunk of chunks) { - yield chunk; + yield chunk } }, - }; + } } -describe("OpenAI adapter option mapping", () => { +describe('OpenAI adapter option mapping', () => { beforeEach(() => { - vi.clearAllMocks(); - }); + vi.clearAllMocks() + }) - it("maps options into the Chat Completions payload", async () => { + it('maps options into the Chat Completions payload', async () => { const mockStream = createMockChatCompletionsStream([ { - id: "chatcmpl-123", - object: "chat.completion.chunk", + id: 'chatcmpl-123', + object: 'chat.completion.chunk', created: 1234567890, - model: "gpt-4o-mini", + model: 'gpt-4o-mini', choices: [ { index: 0, - delta: { content: "It is sunny" }, + delta: { content: 'It is sunny' }, finish_reason: null, }, ], }, { - id: "chatcmpl-123", - object: "chat.completion.chunk", + id: 'chatcmpl-123', + object: 'chat.completion.chunk', created: 1234567891, - model: "gpt-4o-mini", + model: 'gpt-4o-mini', choices: [ { index: 0, delta: {}, - finish_reason: "stop", + finish_reason: 'stop', }, ], usage: { @@ -71,110 +71,110 @@ describe("OpenAI adapter option mapping", () => { total_tokens: 16, }, }, - ]); + ]) - const chatCompletionsCreate = vi.fn().mockResolvedValueOnce(mockStream); + const chatCompletionsCreate = vi.fn().mockResolvedValueOnce(mockStream) - const adapter = createAdapter(); + const adapter = createAdapter() // Replace the internal OpenAI SDK client with our mock - (adapter as any).client = { + ;(adapter as any).client = { chat: { completions: { create: chatCompletionsCreate, }, }, - }; + } const providerOptions: OpenAIProviderOptions = { - tool_choice: "required", - }; + tool_choice: 'required', + } - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of chat({ adapter, - model: "gpt-4o-mini", + model: 'gpt-4o-mini', messages: [ - { role: "system", content: "Stay concise" }, - { role: "user", content: "How is the weather?" }, + { role: 'system', content: 'Stay concise' }, + { role: 'user', content: 'How is the weather?' }, { - role: "assistant", - content: "Let me check", + role: 'assistant', + content: 'Let me check', toolCalls: [ { - id: "call_weather", - type: "function", - function: { name: "lookup_weather", arguments: toolArguments }, + id: 'call_weather', + type: 'function', + function: { name: 'lookup_weather', arguments: toolArguments }, }, ], }, - { role: "tool", toolCallId: "call_weather", content: '{"temp":72}' }, + { role: 'tool', toolCallId: 'call_weather', content: '{"temp":72}' }, ], tools: [weatherTool], options: { temperature: 0.25, topP: 0.6, maxTokens: 1024, - metadata: { requestId: "req-42" }, + metadata: { requestId: 'req-42' }, }, providerOptions, })) { - chunks.push(chunk); + chunks.push(chunk) } - expect(chatCompletionsCreate).toHaveBeenCalledTimes(1); - const [payload] = chatCompletionsCreate.mock.calls[0]; + expect(chatCompletionsCreate).toHaveBeenCalledTimes(1) + const [payload] = chatCompletionsCreate.mock.calls[0] expect(payload).toMatchObject({ - model: "gpt-4o-mini", + model: 'gpt-4o-mini', temperature: 0.25, top_p: 0.6, max_tokens: 1024, stream: true, tools: [ { - type: "function", + type: 'function', function: { - name: "lookup_weather", + name: 'lookup_weather', parameters: { - type: "object", + type: 'object', properties: { - location: { type: "string" }, + location: { type: 'string' }, }, - required: ["location"], + required: ['location'], }, }, }, ], - }); + }) expect(payload.messages).toEqual([ { - role: "system", - content: "Stay concise", + role: 'system', + content: 'Stay concise', }, { - role: "user", - content: "How is the weather?", + role: 'user', + content: 'How is the weather?', }, { - role: "assistant", - content: "Let me check", + role: 'assistant', + content: 'Let me check', tool_calls: [ { - id: "call_weather", - type: "function", + id: 'call_weather', + type: 'function', function: { - name: "lookup_weather", + name: 'lookup_weather', arguments: toolArguments, }, }, ], }, { - role: "tool", - tool_call_id: "call_weather", + role: 'tool', + tool_call_id: 'call_weather', content: '{"temp":72}', }, - ]); - }); -}); + ]) + }) +}) diff --git a/packages/typescript/ai-openai/tsconfig.json b/packages/typescript/ai-openai/tsconfig.json index 204ca8d3f..ea11c1096 100644 --- a/packages/typescript/ai-openai/tsconfig.json +++ b/packages/typescript/ai-openai/tsconfig.json @@ -5,6 +5,5 @@ "rootDir": "src" }, "include": ["src/**/*.ts", "src/**/*.tsx"], - "exclude": ["node_modules", "dist", "**/*.config.ts"], - "references": [{ "path": "../ai" }] + "exclude": ["node_modules", "dist", "**/*.config.ts"] } diff --git a/packages/typescript/ai-openai/tsdown.config.ts b/packages/typescript/ai-openai/tsdown.config.ts index 8008558a5..a750e678c 100644 --- a/packages/typescript/ai-openai/tsdown.config.ts +++ b/packages/typescript/ai-openai/tsdown.config.ts @@ -1,12 +1,12 @@ -import { defineConfig } from "tsdown"; +import { defineConfig } from 'tsdown' export default defineConfig({ - entry: ["./src/index.ts"], - format: ["esm"], + entry: ['./src/index.ts'], + format: ['esm'], unbundle: true, dts: true, sourcemap: true, clean: true, minify: false, - external: ["openai"], -}); + external: ['openai'], +}) diff --git a/packages/typescript/ai-openai/vite.config.ts b/packages/typescript/ai-openai/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/ai-openai/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/ai-openai/vitest.config.ts b/packages/typescript/ai-openai/vitest.config.ts index 8fa8bfb9e..fa2531743 100644 --- a/packages/typescript/ai-openai/vitest.config.ts +++ b/packages/typescript/ai-openai/vitest.config.ts @@ -1,22 +1,22 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - globals: true, - environment: "node", - include: ["tests/**/*.test.ts"], - coverage: { - provider: "v8", - reporter: ["text", "json", "html", "lcov"], - exclude: [ - "node_modules/", - "dist/", - "tests/", - "**/*.test.ts", - "**/*.config.ts", - "**/types.ts", - ], - include: ["src/**/*.ts"], - }, - }, -}); +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) diff --git a/packages/typescript/ai-react-ui/README.md b/packages/typescript/ai-react-ui/README.md index 63e6c4835..a6b0be3e0 100644 --- a/packages/typescript/ai-react-ui/README.md +++ b/packages/typescript/ai-react-ui/README.md @@ -20,18 +20,18 @@ pnpm add @tanstack/ai-react-ui ## Quick Start ```tsx -import { Chat } from "@tanstack/ai-react-ui"; -import { fetchServerSentEvents } from "@tanstack/ai-react"; +import { Chat } from '@tanstack/ai-react-ui' +import { fetchServerSentEvents } from '@tanstack/ai-react' function MyChat() { return ( - + {(message) => } - ); + ) } ``` @@ -76,11 +76,11 @@ Tools can require user approval before execution: { // Client-side tool execution - if (toolName === "addToWishList") { - const wishList = JSON.parse(localStorage.getItem("wishList") || "[]"); - wishList.push(input.guitarId); - localStorage.setItem("wishList", JSON.stringify(wishList)); - return { success: true }; + if (toolName === 'addToWishList') { + const wishList = JSON.parse(localStorage.getItem('wishList') || '[]') + wishList.push(input.guitarId) + localStorage.setItem('wishList', JSON.stringify(wishList)) + return { success: true } } }} > @@ -242,11 +242,11 @@ Renders approve/deny buttons for tools requiring approval. ```tsx // Vercel: String-based messages, limited customization const { messages } = useChat({ - api: "/api/chat", -}); + api: '/api/chat', +}) // Messages are simple strings - no parts, no states -messages.map((m) =>
{m.content}
); +messages.map((m) =>
{m.content}
) ``` ### TanStack AI @@ -254,12 +254,12 @@ messages.map((m) =>
{m.content}
); ```tsx // TanStack: Parts-based with full control const { messages } = useChat({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), onToolCall: async ({ toolName, input }) => { // Client-side execution! - return executeLocally(toolName, input); + return executeLocally(toolName, input) }, -}); +}) // Messages have typed parts with states messages.map((m) => ( @@ -274,7 +274,7 @@ messages.map((m) => ( ), }} /> -)); +)) ``` ## License diff --git a/packages/typescript/ai-react-ui/src/chat-input.tsx b/packages/typescript/ai-react-ui/src/chat-input.tsx index f88d14385..d513d2c62 100644 --- a/packages/typescript/ai-react-ui/src/chat-input.tsx +++ b/packages/typescript/ai-react-ui/src/chat-input.tsx @@ -1,32 +1,32 @@ -import { useState, useRef, type ReactNode, type RefObject } from "react"; -import { useChatContext } from "./chat"; +import { useState, useRef, type ReactNode, type RefObject } from 'react' +import { useChatContext } from './chat' export interface ChatInputRenderProps { /** Current input value */ - value: string; + value: string /** Set input value */ - onChange: (value: string) => void; + onChange: (value: string) => void /** Submit the message */ - onSubmit: () => void; + onSubmit: () => void /** Is the chat currently loading */ - isLoading: boolean; + isLoading: boolean /** Is input disabled */ - disabled: boolean; + disabled: boolean /** Ref to the input element */ - inputRef: RefObject; + inputRef: RefObject } export interface ChatInputProps { /** Render prop for full control */ - children?: (props: ChatInputRenderProps) => ReactNode; + children?: (props: ChatInputRenderProps) => ReactNode /** CSS class name */ - className?: string; + className?: string /** Placeholder text */ - placeholder?: string; + placeholder?: string /** Disable input */ - disabled?: boolean; + disabled?: boolean /** Submit on Enter (Shift+Enter for new line) */ - submitOnEnter?: boolean; + submitOnEnter?: boolean } /** @@ -58,21 +58,21 @@ export interface ChatInputProps { export function ChatInput({ children, className, - placeholder = "Type a message...", + placeholder = 'Type a message...', disabled: disabledProp, submitOnEnter = true, }: ChatInputProps) { - const { sendMessage, isLoading } = useChatContext(); - const [value, setValue] = useState(""); - const inputRef = useRef(null); + const { sendMessage, isLoading } = useChatContext() + const [value, setValue] = useState('') + const inputRef = useRef(null) - const disabled = disabledProp || isLoading; + const disabled = disabledProp || isLoading const handleSubmit = () => { - if (!value.trim() || disabled) return; - sendMessage(value); - setValue(""); - }; + if (!value.trim() || disabled) return + sendMessage(value) + setValue('') + } const renderProps: ChatInputRenderProps = { value, @@ -81,11 +81,11 @@ export function ChatInput({ isLoading, disabled, inputRef, - }; + } // Render prop pattern if (children) { - return <>{children(renderProps)}; + return <>{children(renderProps)} } // Default implementation @@ -94,10 +94,10 @@ export function ChatInput({ className={className} data-chat-input style={{ - display: "flex", - gap: "0.75rem", - alignItems: "center", - width: "100%", + display: 'flex', + gap: '0.75rem', + alignItems: 'center', + width: '100%', }} > setValue((e.target as HTMLInputElement).value)} onKeyDown={(e) => { - if (submitOnEnter && e.key === "Enter") { - e.preventDefault(); - handleSubmit(); + if (submitOnEnter && e.key === 'Enter') { + e.preventDefault() + handleSubmit() } }} placeholder={placeholder} @@ -116,25 +116,25 @@ export function ChatInput({ data-chat-textarea style={{ flex: 1, - padding: "0.75rem 1rem", - fontSize: "0.875rem", - border: "1px solid rgba(255, 255, 255, 0.1)", - borderRadius: "0.75rem", - backgroundColor: "rgba(31, 41, 55, 0.5)", - color: "white", - outline: "none", - transition: "all 0.2s", + padding: '0.75rem 1rem', + fontSize: '0.875rem', + border: '1px solid rgba(255, 255, 255, 0.1)', + borderRadius: '0.75rem', + backgroundColor: 'rgba(31, 41, 55, 0.5)', + color: 'white', + outline: 'none', + transition: 'all 0.2s', }} onFocus={(e) => { - (e.target as HTMLInputElement).style.borderColor = - "rgba(249, 115, 22, 0.4)"; - (e.target as HTMLInputElement).style.boxShadow = - "0 0 0 2px rgba(249, 115, 22, 0.2)"; + ;(e.target as HTMLInputElement).style.borderColor = + 'rgba(249, 115, 22, 0.4)' + ;(e.target as HTMLInputElement).style.boxShadow = + '0 0 0 2px rgba(249, 115, 22, 0.2)' }} onBlur={(e) => { - (e.target as HTMLInputElement).style.borderColor = - "rgba(255, 255, 255, 0.1)"; - (e.target as HTMLInputElement).style.boxShadow = "none"; + ;(e.target as HTMLInputElement).style.borderColor = + 'rgba(255, 255, 255, 0.1)' + ;(e.target as HTMLInputElement).style.boxShadow = 'none' }} />
- ); + ) } diff --git a/packages/typescript/ai-react-ui/src/chat-message.tsx b/packages/typescript/ai-react-ui/src/chat-message.tsx index 147dcae44..8eea8f892 100644 --- a/packages/typescript/ai-react-ui/src/chat-message.tsx +++ b/packages/typescript/ai-react-ui/src/chat-message.tsx @@ -1,42 +1,42 @@ -import type { ReactNode } from "react"; -import type { UIMessage, MessagePart } from "@tanstack/ai-react"; -import { ThinkingPart } from "./thinking-part"; +import type { ReactNode } from 'react' +import type { UIMessage, MessagePart } from '@tanstack/ai-react' +import { ThinkingPart } from './thinking-part' export interface ToolCallRenderProps { - id: string; - name: string; - arguments: string; - state: string; - approval?: any; - output?: any; + id: string + name: string + arguments: string + state: string + approval?: any + output?: any } export interface ChatMessageProps { /** The message to render */ - message: UIMessage; + message: UIMessage /** Base CSS class name */ - className?: string; + className?: string /** Additional className for user messages */ - userClassName?: string; + userClassName?: string /** Additional className for assistant messages */ - assistantClassName?: string; + assistantClassName?: string /** Custom renderer for text parts */ - textPartRenderer?: (props: { content: string }) => ReactNode; + textPartRenderer?: (props: { content: string }) => ReactNode /** Custom renderer for thinking parts */ thinkingPartRenderer?: (props: { - content: string; - isComplete?: boolean; - }) => ReactNode; + content: string + isComplete?: boolean + }) => ReactNode /** Named tool renderers - use the tool name as the key */ - toolsRenderer?: Record ReactNode>; + toolsRenderer?: Record ReactNode> /** Default tool renderer when tool name not found in toolsRenderer */ - defaultToolRenderer?: (props: ToolCallRenderProps) => ReactNode; + defaultToolRenderer?: (props: ToolCallRenderProps) => ReactNode /** Custom renderer for tool result parts */ toolResultRenderer?: (props: { - toolCallId: string; - content: string; - state: string; - }) => ReactNode; + toolCallId: string + content: string + state: string + }) => ReactNode } /** @@ -90,9 +90,9 @@ export interface ChatMessageProps { */ export function ChatMessage({ message, - className = "", - userClassName = "", - assistantClassName = "", + className = '', + userClassName = '', + assistantClassName = '', textPartRenderer, thinkingPartRenderer, toolsRenderer, @@ -101,14 +101,12 @@ export function ChatMessage({ }: ChatMessageProps) { // Combine classes based on role const roleClassName = - message.role === "user" + message.role === 'user' ? userClassName - : message.role === "assistant" - ? assistantClassName - : ""; - const combinedClassName = [className, roleClassName] - .filter(Boolean) - .join(" "); + : message.role === 'assistant' + ? assistantClassName + : '' + const combinedClassName = [className, roleClassName].filter(Boolean).join(' ') return (
{ // Check if thinking is complete (if there's a text part after this thinking part) const isThinkingComplete = - part.type === "thinking" && - message.parts.slice(index + 1).some((p) => p.type === "text"); + part.type === 'thinking' && + message.parts.slice(index + 1).some((p) => p.type === 'text') return ( - ); + ) })}
- ); + ) } function MessagePart({ @@ -149,28 +147,28 @@ function MessagePart({ defaultToolRenderer, toolResultRenderer, }: { - part: MessagePart; - isThinkingComplete?: boolean; - textPartRenderer?: ChatMessageProps["textPartRenderer"]; - thinkingPartRenderer?: ChatMessageProps["thinkingPartRenderer"]; - toolsRenderer?: ChatMessageProps["toolsRenderer"]; - defaultToolRenderer?: ChatMessageProps["defaultToolRenderer"]; - toolResultRenderer?: ChatMessageProps["toolResultRenderer"]; + part: MessagePart + isThinkingComplete?: boolean + textPartRenderer?: ChatMessageProps['textPartRenderer'] + thinkingPartRenderer?: ChatMessageProps['thinkingPartRenderer'] + toolsRenderer?: ChatMessageProps['toolsRenderer'] + defaultToolRenderer?: ChatMessageProps['defaultToolRenderer'] + toolResultRenderer?: ChatMessageProps['toolResultRenderer'] }) { // Text part - if (part.type === "text") { + if (part.type === 'text') { if (textPartRenderer) { - return <>{textPartRenderer({ content: part.content })}; + return <>{textPartRenderer({ content: part.content })} } return (
{part.content}
- ); + ) } // Thinking part - if (part.type === "thinking") { + if (part.type === 'thinking') { if (thinkingPartRenderer) { return ( <> @@ -179,15 +177,15 @@ function MessagePart({ isComplete: isThinkingComplete, })} - ); + ) } return ( - ); + ) } // Tool call part - if (part.type === "tool-call") { + if (part.type === 'tool-call') { const toolProps: ToolCallRenderProps = { id: part.id, name: part.name, @@ -195,16 +193,16 @@ function MessagePart({ state: part.state, approval: part.approval, output: part.output, - }; + } // Check if there's a specific renderer for this tool if (toolsRenderer?.[part.name]) { - return <>{toolsRenderer[part.name](toolProps)}; + return <>{toolsRenderer[part.name](toolProps)} } // Use default tool renderer if provided if (defaultToolRenderer) { - return <>{defaultToolRenderer(toolProps)}; + return <>{defaultToolRenderer(toolProps)} } // Fallback to built-in default renderer @@ -228,9 +226,9 @@ function MessagePart({
{part.approval.approved !== undefined ? part.approval.approved - ? "✓ Approved" - : "✗ Denied" - : "⏳ Awaiting approval..."} + ? '✓ Approved' + : '✗ Denied' + : '⏳ Awaiting approval...'}
)} {part.output && ( @@ -239,11 +237,11 @@ function MessagePart({
)}
- ); + ) } // Tool result part - if (part.type === "tool-result") { + if (part.type === 'tool-result') { if (toolResultRenderer) { return ( <> @@ -253,7 +251,7 @@ function MessagePart({ state: part.state, })} - ); + ) } return ( @@ -264,8 +262,8 @@ function MessagePart({ >
{part.content}
- ); + ) } - return null; + return null } diff --git a/packages/typescript/ai-react-ui/src/chat-messages.tsx b/packages/typescript/ai-react-ui/src/chat-messages.tsx index 74f4f05a7..fbc7f7b58 100644 --- a/packages/typescript/ai-react-ui/src/chat-messages.tsx +++ b/packages/typescript/ai-react-ui/src/chat-messages.tsx @@ -1,21 +1,21 @@ -import { useEffect, useRef, type ReactNode } from "react"; -import { useChatContext } from "./chat"; -import type { UIMessage } from "@tanstack/ai-react"; -import { ChatMessage } from "./chat-message"; +import { useEffect, useRef, type ReactNode } from 'react' +import { useChatContext } from './chat' +import type { UIMessage } from '@tanstack/ai-react' +import { ChatMessage } from './chat-message' export interface ChatMessagesProps { /** Custom render function for each message */ - children?: (message: UIMessage, index: number) => ReactNode; + children?: (message: UIMessage, index: number) => ReactNode /** CSS class name */ - className?: string; + className?: string /** Element to show when there are no messages */ - emptyState?: ReactNode; + emptyState?: ReactNode /** Element to show while loading the first message */ - loadingState?: ReactNode; + loadingState?: ReactNode /** Custom error renderer */ - errorState?: (props: { error: Error; reload: () => void }) => ReactNode; + errorState?: (props: { error: Error; reload: () => void }) => ReactNode /** Auto-scroll to bottom on new messages */ - autoScroll?: boolean; + autoScroll?: boolean } /** @@ -36,29 +36,29 @@ export function ChatMessages({ errorState, autoScroll = true, }: ChatMessagesProps) { - const { messages, isLoading, error, reload } = useChatContext(); - const containerRef = useRef(null); + const { messages, isLoading, error, reload } = useChatContext() + const containerRef = useRef(null) // Auto-scroll to bottom on new messages useEffect(() => { if (autoScroll && containerRef.current) { - containerRef.current.scrollTop = containerRef.current.scrollHeight; + containerRef.current.scrollTop = containerRef.current.scrollHeight } - }, [messages, autoScroll]); + }, [messages, autoScroll]) // Error state if (error && errorState) { - return <>{errorState({ error, reload })}; + return <>{errorState({ error, reload })} } // Loading state (only show if no messages yet) if (isLoading && messages.length === 0 && loadingState) { - return <>{loadingState}; + return <>{loadingState} } // Empty state if (messages.length === 0 && emptyState) { - return <>{emptyState}; + return <>{emptyState} } return ( @@ -75,8 +75,8 @@ export function ChatMessages({
) : ( - ) + ), )}
- ); + ) } diff --git a/packages/typescript/ai-react-ui/src/chat.tsx b/packages/typescript/ai-react-ui/src/chat.tsx index b7dff66ec..9538395fd 100644 --- a/packages/typescript/ai-react-ui/src/chat.tsx +++ b/packages/typescript/ai-react-ui/src/chat.tsx @@ -1,55 +1,55 @@ -import { createContext, useContext, type ReactNode } from "react"; -import { useChat, type UseChatReturn } from "@tanstack/ai-react"; -import type { ConnectionAdapter, UIMessage } from "@tanstack/ai-react"; +import { createContext, useContext, type ReactNode } from 'react' +import { useChat, type UseChatReturn } from '@tanstack/ai-react' +import type { ConnectionAdapter, UIMessage } from '@tanstack/ai-react' /** * Chat context - provides chat state to all child components */ -const ChatContext = createContext(null); +const ChatContext = createContext(null) /** * Hook to access chat context * @throws Error if used outside of Chat component */ export function useChatContext() { - const context = useContext(ChatContext); + const context = useContext(ChatContext) if (!context) { throw new Error( - "Chat components must be wrapped in . Make sure you're using Chat.Messages, Chat.Input, etc. inside a component." - ); + "Chat components must be wrapped in . Make sure you're using Chat.Messages, Chat.Input, etc. inside a component.", + ) } - return context; + return context } export interface ChatProps { /** Child components (Chat.Messages, Chat.Input, etc.) */ - children: ReactNode; + children: ReactNode /** CSS class name for the root element */ - className?: string; + className?: string /** Connection adapter for communicating with your API */ - connection: ConnectionAdapter; + connection: ConnectionAdapter /** Initial messages to display */ - initialMessages?: UIMessage[]; + initialMessages?: UIMessage[] /** Custom message ID generator */ - id?: string; + id?: string /** Additional body data to send with requests */ - body?: any; + body?: any /** Callback when a response is received */ - onResponse?: (response?: Response) => void | Promise; + onResponse?: (response?: Response) => void | Promise /** Callback when each chunk arrives */ - onChunk?: (chunk: any) => void; + onChunk?: (chunk: any) => void /** Callback when a message is complete */ - onFinish?: (message: UIMessage) => void; + onFinish?: (message: UIMessage) => void /** Callback when an error occurs */ - onError?: (error: Error) => void; + onError?: (error: Error) => void /** Callback when client-side tool needs execution */ onToolCall?: (args: { - toolCallId: string; - toolName: string; - input: any; - }) => Promise; + toolCallId: string + toolName: string + input: any + }) => Promise /** Custom tool components registry */ - tools?: Record>; + tools?: Record> } /** @@ -86,7 +86,7 @@ export function Chat({ onFinish, onError, onToolCall, - }); + }) return ( @@ -94,5 +94,5 @@ export function Chat({ {children}
- ); + ) } diff --git a/packages/typescript/ai-react-ui/src/index.ts b/packages/typescript/ai-react-ui/src/index.ts index f06ba8dd6..98d3fddbc 100644 --- a/packages/typescript/ai-react-ui/src/index.ts +++ b/packages/typescript/ai-react-ui/src/index.ts @@ -25,28 +25,28 @@ */ // Main components -export { Chat, useChatContext, type ChatProps } from "./chat"; -export { ChatMessages, type ChatMessagesProps } from "./chat-messages"; +export { Chat, useChatContext, type ChatProps } from './chat' +export { ChatMessages, type ChatMessagesProps } from './chat-messages' export { ChatMessage, type ChatMessageProps, type ToolCallRenderProps, -} from "./chat-message"; +} from './chat-message' export { ChatInput, type ChatInputProps, type ChatInputRenderProps, -} from "./chat-input"; +} from './chat-input' export { ToolApproval, type ToolApprovalProps, type ToolApprovalRenderProps, -} from "./tool-approval"; -export { TextPart, type TextPartProps } from "./text-part"; -export { ThinkingPart, type ThinkingPartProps } from "./thinking-part"; +} from './tool-approval' +export { TextPart, type TextPartProps } from './text-part' +export { ThinkingPart, type ThinkingPartProps } from './thinking-part' // Re-export hooks from @tanstack/ai-react for convenience -export { useChat } from "@tanstack/ai-react"; +export { useChat } from '@tanstack/ai-react' // Re-export types from @tanstack/ai-react export type { @@ -57,6 +57,6 @@ export type { TextPart as TextPartType, ThinkingPart as ThinkingPartType, ConnectionAdapter, -} from "@tanstack/ai-client"; +} from '@tanstack/ai-client' -export type { UseChatOptions, UseChatReturn } from "@tanstack/ai-react"; +export type { UseChatOptions, UseChatReturn } from '@tanstack/ai-react' diff --git a/packages/typescript/ai-react-ui/src/text-part.tsx b/packages/typescript/ai-react-ui/src/text-part.tsx index c87d99619..56a09b178 100644 --- a/packages/typescript/ai-react-ui/src/text-part.tsx +++ b/packages/typescript/ai-react-ui/src/text-part.tsx @@ -1,20 +1,20 @@ -import ReactMarkdown from "react-markdown"; -import rehypeRaw from "rehype-raw"; -import rehypeSanitize from "rehype-sanitize"; -import rehypeHighlight from "rehype-highlight"; -import remarkGfm from "remark-gfm"; +import ReactMarkdown from 'react-markdown' +import rehypeRaw from 'rehype-raw' +import rehypeSanitize from 'rehype-sanitize' +import rehypeHighlight from 'rehype-highlight' +import remarkGfm from 'remark-gfm' export interface TextPartProps { /** The text content to render */ - content: string; + content: string /** The role of the message (user, assistant, or system) - optional for standalone use */ - role?: "user" | "assistant" | "system"; + role?: 'user' | 'assistant' | 'system' /** Base className applied to all text parts */ - className?: string; + className?: string /** Additional className for user messages */ - userClassName?: string; + userClassName?: string /** Additional className for assistant messages (also used for system messages) */ - assistantClassName?: string; + assistantClassName?: string } /** @@ -58,13 +58,18 @@ export interface TextPartProps { export function TextPart({ content, role, - className = "", - userClassName = "", - assistantClassName = "", + className = '', + userClassName = '', + assistantClassName = '', }: TextPartProps) { // Combine classes based on role - const roleClassName = role === "user" ? userClassName : role === "assistant" ? assistantClassName : ""; - const combinedClassName = [className, roleClassName].filter(Boolean).join(" "); + const roleClassName = + role === 'user' + ? userClassName + : role === 'assistant' + ? assistantClassName + : '' + const combinedClassName = [className, roleClassName].filter(Boolean).join(' ') return (
@@ -74,6 +79,5 @@ export function TextPart({ {content}
- ); + ) } - diff --git a/packages/typescript/ai-react-ui/src/thinking-part.tsx b/packages/typescript/ai-react-ui/src/thinking-part.tsx index e6210c954..e381d75e7 100644 --- a/packages/typescript/ai-react-ui/src/thinking-part.tsx +++ b/packages/typescript/ai-react-ui/src/thinking-part.tsx @@ -1,12 +1,12 @@ -import { useState, useEffect } from "react"; +import { useState, useEffect } from 'react' export interface ThinkingPartProps { /** The thinking content to render */ - content: string; + content: string /** Base className applied to thinking parts */ - className?: string; + className?: string /** Whether thinking is complete (has text content after) */ - isComplete?: boolean; + isComplete?: boolean } /** @@ -43,17 +43,17 @@ export interface ThinkingPartProps { */ export function ThinkingPart({ content, - className = "", + className = '', isComplete = false, }: ThinkingPartProps) { - const [isCollapsed, setIsCollapsed] = useState(false); + const [isCollapsed, setIsCollapsed] = useState(false) // Auto-collapse when thinking completes useEffect(() => { if (isComplete) { - setIsCollapsed(true); + setIsCollapsed(true) } - }, [isComplete]); + }, [isComplete]) return (
setIsCollapsed(!isCollapsed)} className="flex items-center gap-2 text-sm text-gray-400 hover:text-gray-300 transition-colors mb-2" aria-expanded={!isCollapsed} - aria-label={isCollapsed ? "Expand thinking" : "Collapse thinking"} + aria-label={isCollapsed ? 'Expand thinking' : 'Collapse thinking'} > - {isCollapsed ? "▶" : "▼"} + {isCollapsed ? '▶' : '▼'} 💭 Thinking... {isComplete && ( (complete) @@ -79,5 +79,5 @@ export function ThinkingPart({
)}
- ); + ) } diff --git a/packages/typescript/ai-react-ui/src/tool-approval.tsx b/packages/typescript/ai-react-ui/src/tool-approval.tsx index 6fc1f9ea4..9fdb51a3b 100644 --- a/packages/typescript/ai-react-ui/src/tool-approval.tsx +++ b/packages/typescript/ai-react-ui/src/tool-approval.tsx @@ -1,38 +1,38 @@ -import type { ReactNode } from "react"; -import { useChatContext } from "./chat"; +import type { ReactNode } from 'react' +import { useChatContext } from './chat' export interface ToolApprovalProps { /** Tool call ID */ - toolCallId: string; + toolCallId: string /** Tool name */ - toolName: string; + toolName: string /** Parsed tool arguments/input */ - input: any; + input: any /** Approval metadata */ approval: { - id: string; - needsApproval: boolean; - approved?: boolean; - }; + id: string + needsApproval: boolean + approved?: boolean + } /** CSS class name */ - className?: string; + className?: string /** Custom render prop */ - children?: (props: ToolApprovalRenderProps) => ReactNode; + children?: (props: ToolApprovalRenderProps) => ReactNode } export interface ToolApprovalRenderProps { /** Tool name */ - toolName: string; + toolName: string /** Parsed input */ - input: any; + input: any /** Approve the tool call */ - onApprove: () => void; + onApprove: () => void /** Deny the tool call */ - onDeny: () => void; + onDeny: () => void /** Whether user has responded */ - hasResponded: boolean; + hasResponded: boolean /** User's decision (if responded) */ - approved?: boolean; + approved?: boolean } /** @@ -58,23 +58,23 @@ export function ToolApproval({ className, children, }: ToolApprovalProps) { - const { addToolApprovalResponse } = useChatContext(); + const { addToolApprovalResponse } = useChatContext() const handleApprove = () => { addToolApprovalResponse({ id: approval.id, approved: true, - }); - }; + }) + } const handleDeny = () => { addToolApprovalResponse({ id: approval.id, approved: false, - }); - }; + }) + } - const hasResponded = approval.approved !== undefined; + const hasResponded = approval.approved !== undefined const renderProps: ToolApprovalRenderProps = { toolName, @@ -83,11 +83,11 @@ export function ToolApproval({ onDeny: handleDeny, hasResponded, approved: approval.approved, - }; + } // Render prop pattern if (children) { - return <>{children(renderProps)}; + return <>{children(renderProps)} } // Already responded - show decision @@ -96,11 +96,11 @@ export function ToolApproval({
- {approval.approved ? "✓ Approved" : "✗ Denied"} + {approval.approved ? '✓ Approved' : '✗ Denied'}
- ); + ) } // Default approval UI @@ -125,6 +125,5 @@ export function ToolApproval({ - ); + ) } - diff --git a/packages/typescript/ai-react-ui/tsconfig.json b/packages/typescript/ai-react-ui/tsconfig.json index 97683a710..ed5723d43 100644 --- a/packages/typescript/ai-react-ui/tsconfig.json +++ b/packages/typescript/ai-react-ui/tsconfig.json @@ -12,4 +12,3 @@ "include": ["src/**/*"], "exclude": ["node_modules", "dist"] } - diff --git a/packages/typescript/ai-react-ui/tsdown.config.ts b/packages/typescript/ai-react-ui/tsdown.config.ts index 558875e97..f10314eda 100644 --- a/packages/typescript/ai-react-ui/tsdown.config.ts +++ b/packages/typescript/ai-react-ui/tsdown.config.ts @@ -1,10 +1,9 @@ -import { defineConfig } from "tsdown"; +import { defineConfig } from 'tsdown' export default defineConfig({ - entry: ["src/index.ts"], - format: ["cjs", "esm"], + entry: ['src/index.ts'], + format: ['cjs', 'esm'], clean: true, dts: true, - external: ["react", "react-dom", "@tanstack/ai-react"], -}); - + external: ['react', 'react-dom', '@tanstack/ai-react'], +}) diff --git a/packages/typescript/ai-react/README.md b/packages/typescript/ai-react/README.md index 753d21a84..119e23a2f 100644 --- a/packages/typescript/ai-react/README.md +++ b/packages/typescript/ai-react/README.md @@ -66,18 +66,18 @@ function ChatComponent() { ```typescript interface UseChatOptions { // Connection adapter (required) - connection: ConnectionAdapter; - + connection: ConnectionAdapter + // Configuration - initialMessages?: UIMessage[]; // Starting messages - id?: string; // Unique chat ID - body?: Record; // Extra data to send - + initialMessages?: UIMessage[] // Starting messages + id?: string // Unique chat ID + body?: Record // Extra data to send + // Callbacks - onResponse?: (response?: Response) => void; - onChunk?: (chunk: StreamChunk) => void; - onFinish?: (message: UIMessage) => void; - onError?: (error: Error) => void; + onResponse?: (response?: Response) => void + onChunk?: (chunk: StreamChunk) => void + onFinish?: (message: UIMessage) => void + onError?: (error: Error) => void } ``` @@ -85,15 +85,15 @@ interface UseChatOptions { ```typescript interface UseChatReturn { - messages: UIMessage[]; // Current conversation - sendMessage: (content: string) => Promise; // Send a message - append: (message) => Promise; // Add message programmatically - reload: () => Promise; // Reload last response - stop: () => void; // Stop current generation - isLoading: boolean; // Is generating a response - error: Error | undefined; // Current error - setMessages: (messages) => void; // Set messages manually - clear: () => void; // Clear all messages + messages: UIMessage[] // Current conversation + sendMessage: (content: string) => Promise // Send a message + append: (message) => Promise // Add message programmatically + reload: () => Promise // Reload last response + stop: () => void // Stop current generation + isLoading: boolean // Is generating a response + error: Error | undefined // Current error + setMessages: (messages) => void // Set messages manually + clear: () => void // Clear all messages } ``` @@ -107,35 +107,38 @@ Connection adapters provide flexible streaming for different scenarios. See the ### Quick Examples **SSE (Most Common):** + ```typescript -import { useChat, fetchServerSentEvents } from "@tanstack/ai-react"; +import { useChat, fetchServerSentEvents } from '@tanstack/ai-react' const chat = useChat({ - connection: fetchServerSentEvents("/api/chat"), -}); + connection: fetchServerSentEvents('/api/chat'), +}) ``` **Server Functions:** + ```typescript -import { useChat, stream } from "@tanstack/ai-react"; +import { useChat, stream } from '@tanstack/ai-react' const chat = useChat({ connection: stream((messages) => serverChatFunction({ messages })), -}); +}) ``` **Custom (e.g., WebSockets):** + ```typescript -import { useChat } from "@tanstack/ai-react"; -import type { ConnectionAdapter } from "@tanstack/ai-client"; +import { useChat } from '@tanstack/ai-react' +import type { ConnectionAdapter } from '@tanstack/ai-client' const wsAdapter: ConnectionAdapter = { async *connect(messages) { // Your WebSocket logic }, -}; +} -const chat = useChat({ connection: wsAdapter }); +const chat = useChat({ connection: wsAdapter }) ``` ### Backend Endpoint @@ -154,22 +157,22 @@ Your backend should use the `chat()` method which **automatically handles tool e 2. Use `chat()` to stream responses (with automatic tool execution): ```typescript -import { chat, toStreamResponse } from "@tanstack/ai"; -import { openai } from "@tanstack/ai-openai"; +import { chat, toStreamResponse } from '@tanstack/ai' +import { openai } from '@tanstack/ai-openai' export async function POST(request: Request) { - const { messages } = await request.json(); + const { messages } = await request.json() const stream = chat({ adapter: openai(), - model: "gpt-4o", + model: 'gpt-4o', messages, tools: [weatherTool], // Optional: auto-executed in loop agentLoopStrategy: maxIterations(5), // Optional: control loop - }); + }) // Convert to HTTP streaming response with SSE headers - return toStreamResponse(stream); + return toStreamResponse(stream) } ``` @@ -190,27 +193,27 @@ data: {"type":"done","finishReason":"stop","usage":{...}} #### With Callbacks ```typescript -import { useChat, fetchServerSentEvents } from "@tanstack/ai-react"; +import { useChat, fetchServerSentEvents } from '@tanstack/ai-react' const { messages, sendMessage } = useChat({ - connection: fetchServerSentEvents("/api/chat"), + connection: fetchServerSentEvents('/api/chat'), onChunk: (chunk) => { - if (chunk.type === "content") { - console.log("New token:", chunk.delta); + if (chunk.type === 'content') { + console.log('New token:', chunk.delta) } }, onFinish: (message) => { - console.log("Final message:", message); + console.log('Final message:', message) // Save to database, log analytics, etc. }, onError: (error) => { - console.error("Chat error:", error); + console.error('Chat error:', error) // Show toast notification, log error, etc. }, -}); +}) // Send messages programmatically -await sendMessage("Tell me a joke"); +await sendMessage('Tell me a joke') ``` #### Flexible Triggering @@ -218,8 +221,8 @@ await sendMessage("Tell me a joke"); ```typescript import { useChat, fetchServerSentEvents } from "@tanstack/ai-react"; -const { sendMessage, isLoading } = useChat({ - connection: fetchServerSentEvents("/api/chat") +const { sendMessage, isLoading } = useChat({ + connection: fetchServerSentEvents("/api/chat") }); const [input, setInput] = useState(""); @@ -244,61 +247,61 @@ const [input, setInput] = useState(""); #### With Custom Headers ```typescript -import { useChat, fetchServerSentEvents } from "@tanstack/ai-react"; +import { useChat, fetchServerSentEvents } from '@tanstack/ai-react' const chat = useChat({ - connection: fetchServerSentEvents("/api/chat", { + connection: fetchServerSentEvents('/api/chat', { headers: { Authorization: `Bearer ${token}`, - "X-Custom-Header": "value", + 'X-Custom-Header': 'value', }, }), body: { - userId: "123", - sessionId: "abc", + userId: '123', + sessionId: 'abc', }, -}); +}) ``` #### Programmatic Control ```typescript -const { messages, sendMessage, append, reload, stop, clear } = useChat(); +const { messages, sendMessage, append, reload, stop, clear } = useChat() // Send a simple message -await sendMessage("Hello!"); +await sendMessage('Hello!') // Add a message with more control await append({ - role: "user", - content: "Hello!", - id: "custom-id", -}); + role: 'user', + content: 'Hello!', + id: 'custom-id', +}) // Reload the last AI response -await reload(); +await reload() // Stop the current generation -stop(); +stop() // Clear all messages -clear(); +clear() ``` #### Multiple Chats ```typescript -import { useChat, fetchServerSentEvents } from "@tanstack/ai-react"; +import { useChat, fetchServerSentEvents } from '@tanstack/ai-react' function App() { - const chat1 = useChat({ - id: "chat-1", - connection: fetchServerSentEvents("/api/chat") - }); - const chat2 = useChat({ - id: "chat-2", - connection: fetchServerSentEvents("/api/chat") - }); + const chat1 = useChat({ + id: 'chat-1', + connection: fetchServerSentEvents('/api/chat'), + }) + const chat2 = useChat({ + id: 'chat-2', + connection: fetchServerSentEvents('/api/chat'), + }) // Each hook manages independent state } @@ -307,98 +310,98 @@ function App() { ## Example Backend (Node.js/Express) ```typescript -import express from "express"; -import { AI, toStreamResponse } from "@tanstack/ai"; -import { OpenAIAdapter } from "@tanstack/ai-openai"; +import express from 'express' +import { AI, toStreamResponse } from '@tanstack/ai' +import { OpenAIAdapter } from '@tanstack/ai-openai' -const app = express(); -app.use(express.json()); +const app = express() +app.use(express.json()) -const ai = new AI(new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY })); +const ai = new AI(new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY })) -app.post("/api/chat", async (req, res) => { - const { messages } = req.body; +app.post('/api/chat', async (req, res) => { + const { messages } = req.body // One line to create streaming response! const stream = ai.streamChat({ - model: "gpt-3.5-turbo", + model: 'gpt-3.5-turbo', messages, - }); + }) - const response = toStreamResponse(stream); + const response = toStreamResponse(stream) // Copy headers and stream to Express response response.headers.forEach((value, key) => { - res.setHeader(key, value); - }); + res.setHeader(key, value) + }) - const reader = response.body?.getReader(); + const reader = response.body?.getReader() if (reader) { while (true) { - const { done, value } = await reader.read(); - if (done) break; - res.write(value); + const { done, value } = await reader.read() + if (done) break + res.write(value) } } - res.end(); -}); + res.end() +}) -app.listen(3000); +app.listen(3000) ``` ## Example Backend (Next.js App Router) ```typescript // app/api/chat/route.ts -import { AI, toStreamResponse } from "@tanstack/ai"; -import { OpenAIAdapter } from "@tanstack/ai-openai"; +import { AI, toStreamResponse } from '@tanstack/ai' +import { OpenAIAdapter } from '@tanstack/ai-openai' -export const runtime = "edge"; +export const runtime = 'edge' -const ai = new AI(new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY })); +const ai = new AI(new OpenAIAdapter({ apiKey: process.env.OPENAI_API_KEY })) export async function POST(req: Request) { - const { messages } = await req.json(); + const { messages } = await req.json() // One line! return toStreamResponse( ai.streamChat({ - model: "gpt-3.5-turbo", + model: 'gpt-3.5-turbo', messages, - }) - ); + }), + ) } ``` ## Example Backend (TanStack Start) ```typescript -import { createFileRoute } from "@tanstack/react-router"; -import { AI, toStreamResponse } from "@tanstack/ai"; -import { AnthropicAdapter } from "@tanstack/ai-anthropic"; +import { createFileRoute } from '@tanstack/react-router' +import { AI, toStreamResponse } from '@tanstack/ai' +import { AnthropicAdapter } from '@tanstack/ai-anthropic' const ai = new AI( - new AnthropicAdapter({ apiKey: process.env.ANTHROPIC_API_KEY }) -); + new AnthropicAdapter({ apiKey: process.env.ANTHROPIC_API_KEY }), +) -export const Route = createFileRoute("/api/chat")({ +export const Route = createFileRoute('/api/chat')({ server: { handlers: { POST: async ({ request }) => { - const { messages } = await request.json(); + const { messages } = await request.json() // One line with automatic tool execution! return toStreamResponse( ai.streamChat({ - model: "claude-3-5-sonnet-20241022", + model: 'claude-3-5-sonnet-20241022', messages, tools, // Tools with execute functions - }) - ); + }), + ) }, }, }, -}); +}) ``` ## TypeScript Types @@ -411,7 +414,7 @@ import type { UseChatOptions, UseChatReturn, ChatRequestBody, -} from "@tanstack/ai-react"; +} from '@tanstack/ai-react' ``` ## Features diff --git a/packages/typescript/ai-react/package.json b/packages/typescript/ai-react/package.json index c3fa58934..1b2e7df8c 100644 --- a/packages/typescript/ai-react/package.json +++ b/packages/typescript/ai-react/package.json @@ -10,12 +10,12 @@ "directory": "packages/typescript/ai-react" }, "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" } }, "files": [ @@ -26,7 +26,7 @@ "clean": "premove ./build ./dist", "lint:fix": "eslint ./src --fix", "test:eslint": "eslint ./src", - "test:lib": "vitest", + "test:lib": "vitest ", "test:lib:dev": "pnpm test:lib --watch", "test:types": "tsc", "test:build": "publint --strict", @@ -58,4 +58,4 @@ "@tanstack/ai-client": "workspace:*", "react": ">=18.0.0" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-react/src/index.ts b/packages/typescript/ai-react/src/index.ts index b8c2e777f..231c18251 100644 --- a/packages/typescript/ai-react/src/index.ts +++ b/packages/typescript/ai-react/src/index.ts @@ -1,10 +1,10 @@ -export { useChat } from "./use-chat"; +export { useChat } from './use-chat' export type { UseChatOptions, UseChatReturn, UIMessage, ChatRequestBody, -} from "./types"; +} from './types' // Re-export connection adapters from ai-client for convenience export { @@ -13,4 +13,4 @@ export { stream, type ConnectionAdapter, type FetchConnectionOptions, -} from "@tanstack/ai-client"; +} from '@tanstack/ai-client' diff --git a/packages/typescript/ai-react/src/types.ts b/packages/typescript/ai-react/src/types.ts index f2ce4d01f..dd6802f69 100644 --- a/packages/typescript/ai-react/src/types.ts +++ b/packages/typescript/ai-react/src/types.ts @@ -1,95 +1,95 @@ -import type { ModelMessage } from "@tanstack/ai"; +import type { ModelMessage } from '@tanstack/ai' import type { ChatClientOptions, - UIMessage, ChatRequestBody, -} from "@tanstack/ai-client"; + UIMessage, +} from '@tanstack/ai-client' // Re-export types from ai-client -export type { UIMessage, ChatRequestBody }; +export type { UIMessage, ChatRequestBody } /** * Options for the useChat hook. - * + * * This extends ChatClientOptions but omits the state change callbacks that are * managed internally by React state: * - `onMessagesChange` - Managed by React state (exposed as `messages`) * - `onLoadingChange` - Managed by React state (exposed as `isLoading`) * - `onErrorChange` - Managed by React state (exposed as `error`) - * + * * All other callbacks (onResponse, onChunk, onFinish, onError, onToolCall) are * passed through to the underlying ChatClient and can be used for side effects. - * + * * Note: Connection and body changes will recreate the ChatClient instance. * To update these options, remount the component or use a key prop. */ export type UseChatOptions = Omit< ChatClientOptions, - "onMessagesChange" | "onLoadingChange" | "onErrorChange" ->; + 'onMessagesChange' | 'onLoadingChange' | 'onErrorChange' +> export interface UseChatReturn { /** * Current messages in the conversation */ - messages: UIMessage[]; + messages: Array /** * Send a message and get a response */ - sendMessage: (content: string) => Promise; + sendMessage: (content: string) => Promise /** * Append a message to the conversation */ - append: (message: ModelMessage | UIMessage) => Promise; + append: (message: ModelMessage | UIMessage) => Promise /** * Add the result of a client-side tool execution */ addToolResult: (result: { - toolCallId: string; - tool: string; - output: any; - state?: "output-available" | "output-error"; - errorText?: string; - }) => Promise; + toolCallId: string + tool: string + output: any + state?: 'output-available' | 'output-error' + errorText?: string + }) => Promise /** * Respond to a tool approval request */ addToolApprovalResponse: (response: { - id: string; // approval.id, not toolCallId - approved: boolean; - }) => Promise; + id: string // approval.id, not toolCallId + approved: boolean + }) => Promise /** * Reload the last assistant message */ - reload: () => Promise; + reload: () => Promise /** * Stop the current response generation */ - stop: () => void; + stop: () => void /** * Whether a response is currently being generated */ - isLoading: boolean; + isLoading: boolean /** * Current error, if any */ - error: Error | undefined; + error: Error | undefined /** * Set messages manually */ - setMessages: (messages: UIMessage[]) => void; + setMessages: (messages: Array) => void /** * Clear all messages */ - clear: () => void; + clear: () => void } diff --git a/packages/typescript/ai-react/src/use-chat.ts b/packages/typescript/ai-react/src/use-chat.ts index 04924a029..7ba56d3a3 100644 --- a/packages/typescript/ai-react/src/use-chat.ts +++ b/packages/typescript/ai-react/src/use-chat.ts @@ -1,33 +1,26 @@ -import { - useState, - useCallback, - useMemo, - useEffect, - useId, - useRef, -} from "react"; -import { ChatClient } from "@tanstack/ai-client"; -import type { ModelMessage } from "@tanstack/ai"; -import type { UseChatOptions, UseChatReturn, UIMessage } from "./types"; - -export function useChat(options: UseChatOptions = {}): UseChatReturn { - const hookId = useId(); - const clientId = options.id || hookId; - - const [messages, setMessages] = useState( - options.initialMessages || [] - ); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(undefined); +import { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react' +import { ChatClient, } from '@tanstack/ai-client' +import type { ModelMessage } from '@tanstack/ai' +import type { UIMessage, UseChatOptions, UseChatReturn } from './types' + +export function useChat(options: UseChatOptions): UseChatReturn { + const hookId = useId() + const clientId = options.id || hookId + + const [messages, setMessages] = useState>( + options.initialMessages || [], + ) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(undefined) // Track current messages in a ref to preserve them when client is recreated - const messagesRef = useRef(options.initialMessages || []); - const isFirstMountRef = useRef(true); + const messagesRef = useRef>(options.initialMessages || []) + const isFirstMountRef = useRef(true) // Update ref whenever messages change useEffect(() => { - messagesRef.current = messages; - }, [messages]); + messagesRef.current = messages + }, [messages]) // Create ChatClient instance with callbacks to sync state // Note: Connection changes will recreate the client and reset state. @@ -37,9 +30,9 @@ export function useChat(options: UseChatOptions = {}): UseChatReturn { // On first mount, use initialMessages. On subsequent recreations, preserve existing messages. const messagesToUse = isFirstMountRef.current ? options.initialMessages || [] - : messagesRef.current; + : messagesRef.current - isFirstMountRef.current = false; + isFirstMountRef.current = false return new ChatClient({ connection: options.connection, @@ -52,20 +45,19 @@ export function useChat(options: UseChatOptions = {}): UseChatReturn { onError: options.onError, onToolCall: options.onToolCall, streamProcessor: options.streamProcessor, - onMessagesChange: (newMessages: UIMessage[]) => { - setMessages(newMessages); + onMessagesChange: (newMessages: Array) => { + setMessages(newMessages) }, onLoadingChange: (newIsLoading: boolean) => { - setIsLoading(newIsLoading); + setIsLoading(newIsLoading) }, onErrorChange: (newError: Error | undefined) => { - setError(newError); + setError(newError) }, - }); + }) // Only recreate when connection changes (most critical option) // Other options are captured at creation time - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [clientId, options.connection]); + }, [clientId, options.connection]) // Sync initial messages on mount only // Note: initialMessages are passed to ChatClient constructor, but we also @@ -74,20 +66,20 @@ export function useChat(options: UseChatOptions = {}): UseChatReturn { if (options.initialMessages && options.initialMessages.length > 0) { // Only set if current messages are empty (initial state) if (messages.length === 0) { - client.setMessagesManually(options.initialMessages); + client.setMessagesManually(options.initialMessages) } } - }, []); // Only run on mount - initialMessages are handled by ChatClient constructor + }, []) // Only run on mount - initialMessages are handled by ChatClient constructor // Cleanup on unmount: stop any in-flight requests useEffect(() => { return () => { // Stop any active generation when component unmounts if (isLoading) { - client.stop(); + client.stop() } - }; - }, [client, isLoading]); + } + }, [client, isLoading]) // Note: Callback options (onResponse, onChunk, onFinish, onError, onToolCall) // are captured at client creation time. Changes to these callbacks require @@ -95,56 +87,56 @@ export function useChat(options: UseChatOptions = {}): UseChatReturn { const sendMessage = useCallback( async (content: string) => { - await client.sendMessage(content); + await client.sendMessage(content) }, - [client] - ); + [client], + ) const append = useCallback( async (message: ModelMessage | UIMessage) => { - await client.append(message); + await client.append(message) }, - [client] - ); + [client], + ) const reload = useCallback(async () => { - await client.reload(); - }, [client]); + await client.reload() + }, [client]) const stop = useCallback(() => { - client.stop(); - }, [client]); + client.stop() + }, [client]) const clear = useCallback(() => { - client.clear(); - }, [client]); + client.clear() + }, [client]) const setMessagesManually = useCallback( - (newMessages: UIMessage[]) => { - client.setMessagesManually(newMessages); + (newMessages: Array) => { + client.setMessagesManually(newMessages) }, - [client] - ); + [client], + ) const addToolResult = useCallback( async (result: { - toolCallId: string; - tool: string; - output: any; - state?: "output-available" | "output-error"; - errorText?: string; + toolCallId: string + tool: string + output: any + state?: 'output-available' | 'output-error' + errorText?: string }) => { - await client.addToolResult(result); + await client.addToolResult(result) }, - [client] - ); + [client], + ) const addToolApprovalResponse = useCallback( async (response: { id: string; approved: boolean }) => { - await client.addToolApprovalResponse(response); + await client.addToolApprovalResponse(response) }, - [client] - ); + [client], + ) return { messages, @@ -158,5 +150,5 @@ export function useChat(options: UseChatOptions = {}): UseChatReturn { clear, addToolResult, addToolApprovalResponse, - }; + } } diff --git a/packages/typescript/ai-react/tests/test-utils.ts b/packages/typescript/ai-react/tests/test-utils.ts index 37a13f2e7..2c6e0aa43 100644 --- a/packages/typescript/ai-react/tests/test-utils.ts +++ b/packages/typescript/ai-react/tests/test-utils.ts @@ -4,27 +4,26 @@ export { createTextChunks, createToolCallChunks, type MockConnectionAdapterOptions, -} from "../../ai-client/tests/test-utils"; +} from '../../ai-client/tests/test-utils' -import { renderHook, type RenderHookResult } from "@testing-library/react"; -import type { UseChatOptions, UseChatReturn } from "../src/types"; -import { useChat } from "../src/use-chat"; +import { renderHook, type RenderHookResult } from '@testing-library/react' +import type { UseChatOptions, UseChatReturn } from '../src/types' +import { useChat } from '../src/use-chat' /** * Render the useChat hook with testing utilities - * + * * @example * ```typescript * const { result } = renderUseChat({ * connection: createMockConnectionAdapter({ chunks: [...] }) * }); - * + * * await result.current.sendMessage("Hello"); * ``` */ export function renderUseChat( - options?: UseChatOptions + options?: UseChatOptions, ): RenderHookResult { - return renderHook(() => useChat(options)); + return renderHook(() => useChat(options)) } - diff --git a/packages/typescript/ai-react/tests/use-chat.test.ts b/packages/typescript/ai-react/tests/use-chat.test.ts index a335d0318..e5a009a34 100644 --- a/packages/typescript/ai-react/tests/use-chat.test.ts +++ b/packages/typescript/ai-react/tests/use-chat.test.ts @@ -1,1177 +1,1185 @@ -import { describe, it, expect, vi, beforeEach } from "vitest"; -import { waitFor } from "@testing-library/react"; -import { useChat } from "../src/use-chat"; +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { waitFor } from '@testing-library/react' +import { useChat } from '../src/use-chat' import { renderUseChat, createMockConnectionAdapter, createTextChunks, createToolCallChunks, -} from "./test-utils"; -import type { UIMessage } from "../src/types"; -import type { ModelMessage } from "@tanstack/ai"; - -describe("useChat", () => { - describe("initialization", () => { - it("should initialize with default state", () => { - const adapter = createMockConnectionAdapter(); - const { result } = renderUseChat({ connection: adapter }); - - expect(result.current.messages).toEqual([]); - expect(result.current.isLoading).toBe(false); - expect(result.current.error).toBeUndefined(); - }); - - it("should initialize with provided messages", () => { - const adapter = createMockConnectionAdapter(); +} from './test-utils' +import type { UIMessage } from '../src/types' +import type { ModelMessage } from '@tanstack/ai' + +describe('useChat', () => { + describe('initialization', () => { + it('should initialize with default state', () => { + const adapter = createMockConnectionAdapter() + const { result } = renderUseChat({ connection: adapter }) + + expect(result.current.messages).toEqual([]) + expect(result.current.isLoading).toBe(false) + expect(result.current.error).toBeUndefined() + }) + + it('should initialize with provided messages', () => { + const adapter = createMockConnectionAdapter() const initialMessages: UIMessage[] = [ { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), }, - ]; + ] const { result } = renderUseChat({ connection: adapter, initialMessages, - }); + }) - expect(result.current.messages).toEqual(initialMessages); - }); + expect(result.current.messages).toEqual(initialMessages) + }) - it("should use provided id", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); + it('should use provided id', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) const { result } = renderUseChat({ connection: adapter, - id: "custom-id", - }); + id: 'custom-id', + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) // Message IDs should start with the custom ID - const messageId = result.current.messages[0].id; - expect(messageId).toMatch(/^custom-id-/); - }); + const messageId = result.current.messages[0].id + expect(messageId).toMatch(/^custom-id-/) + }) - it("should generate id if not provided", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); + it('should generate id if not provided', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) - const { result } = renderUseChat({ connection: adapter }); + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) // Message IDs should have a generated prefix (not "custom-id-") - const messageId = result.current.messages[0].id; - expect(messageId).toBeTruthy(); - expect(messageId).not.toMatch(/^custom-id-/); - }); + const messageId = result.current.messages[0].id + expect(messageId).toBeTruthy() + expect(messageId).not.toMatch(/^custom-id-/) + }) - it("should maintain client instance across re-renders", () => { - const adapter = createMockConnectionAdapter(); - const { result, rerender } = renderUseChat({ connection: adapter }); + it('should maintain client instance across re-renders', () => { + const adapter = createMockConnectionAdapter() + const { result, rerender } = renderUseChat({ connection: adapter }) - const initialMessages = result.current.messages; + const initialMessages = result.current.messages - rerender(); + rerender() // Client should be the same instance, state should persist - expect(result.current.messages).toBe(initialMessages); - }); - }); + expect(result.current.messages).toBe(initialMessages) + }) + }) - describe("state synchronization", () => { - it("should update messages via onMessagesChange callback", async () => { - const chunks = createTextChunks("Hello, world!"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + describe('state synchronization', () => { + it('should update messages via onMessagesChange callback', async () => { + const chunks = createTextChunks('Hello, world!') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThanOrEqual(2); - }); + expect(result.current.messages.length).toBeGreaterThanOrEqual(2) + }) - const userMessage = result.current.messages.find( - (m) => m.role === "user" - ); - expect(userMessage).toBeDefined(); + const userMessage = result.current.messages.find((m) => m.role === 'user') + expect(userMessage).toBeDefined() if (userMessage) { expect(userMessage.parts[0]).toEqual({ - type: "text", - content: "Hello", - }); + type: 'text', + content: 'Hello', + }) } - }); + }) - it("should update loading state via onLoadingChange callback", async () => { - const chunks = createTextChunks("Response"); + it('should update loading state via onLoadingChange callback', async () => { + const chunks = createTextChunks('Response') const adapter = createMockConnectionAdapter({ chunks, chunkDelay: 50, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - expect(result.current.isLoading).toBe(false); + expect(result.current.isLoading).toBe(false) - const sendPromise = result.current.sendMessage("Test"); + const sendPromise = result.current.sendMessage('Test') // Should be loading during send await waitFor(() => { - expect(result.current.isLoading).toBe(true); - }); + expect(result.current.isLoading).toBe(true) + }) - await sendPromise; + await sendPromise // Should not be loading after completion await waitFor(() => { - expect(result.current.isLoading).toBe(false); - }); - }); + expect(result.current.isLoading).toBe(false) + }) + }) - it("should update error state via onErrorChange callback", async () => { - const error = new Error("Connection failed"); + it('should update error state via onErrorChange callback', async () => { + const error = new Error('Connection failed') const adapter = createMockConnectionAdapter({ shouldError: true, error, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.error).toBeDefined(); - }); + expect(result.current.error).toBeDefined() + }) - expect(result.current.error?.message).toBe("Connection failed"); - }); + expect(result.current.error?.message).toBe('Connection failed') + }) - it("should persist state across re-renders", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result, rerender } = renderUseChat({ connection: adapter }); + it('should persist state across re-renders', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const { result, rerender } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) - const messageCount = result.current.messages.length; + const messageCount = result.current.messages.length - rerender(); + rerender() // State should persist after re-render - expect(result.current.messages.length).toBe(messageCount); - }); - }); + expect(result.current.messages.length).toBe(messageCount) + }) + }) - describe("sendMessage", () => { - it("should send a message and append it", async () => { - const chunks = createTextChunks("Hello, world!"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + describe('sendMessage', () => { + it('should send a message and append it', async () => { + const chunks = createTextChunks('Hello, world!') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) - const userMessage = result.current.messages.find( - (m) => m.role === "user" - ); - expect(userMessage).toBeDefined(); + const userMessage = result.current.messages.find((m) => m.role === 'user') + expect(userMessage).toBeDefined() if (userMessage) { expect(userMessage.parts[0]).toEqual({ - type: "text", - content: "Hello", - }); + type: 'text', + content: 'Hello', + }) } - }); + }) - it("should create assistant message from stream chunks", async () => { - const chunks = createTextChunks("Hello, world!"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + it('should create assistant message from stream chunks', async () => { + const chunks = createTextChunks('Hello, world!') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { const assistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); - expect(assistantMessage).toBeDefined(); - }); + (m) => m.role === 'assistant', + ) + expect(assistantMessage).toBeDefined() + }) const assistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); - expect(assistantMessage).toBeDefined(); + (m) => m.role === 'assistant', + ) + expect(assistantMessage).toBeDefined() if (assistantMessage) { - const textPart = assistantMessage.parts.find((p) => p.type === "text"); - expect(textPart).toBeDefined(); - if (textPart && textPart.type === "text") { - expect(textPart.content).toBe("Hello, world!"); + const textPart = assistantMessage.parts.find((p) => p.type === 'text') + expect(textPart).toBeDefined() + if (textPart && textPart.type === 'text') { + expect(textPart.content).toBe('Hello, world!') } } - }); + }) - it("should not send empty messages", async () => { - const adapter = createMockConnectionAdapter(); - const { result } = renderUseChat({ connection: adapter }); + it('should not send empty messages', async () => { + const adapter = createMockConnectionAdapter() + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage(""); - await result.current.sendMessage(" "); + await result.current.sendMessage('') + await result.current.sendMessage(' ') - expect(result.current.messages.length).toBe(0); - }); + expect(result.current.messages.length).toBe(0) + }) - it("should not send message while loading", async () => { + it('should not send message while loading', async () => { const adapter = createMockConnectionAdapter({ - chunks: createTextChunks("Response"), + chunks: createTextChunks('Response'), chunkDelay: 100, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - const promise1 = result.current.sendMessage("First"); - const promise2 = result.current.sendMessage("Second"); + const promise1 = result.current.sendMessage('First') + const promise2 = result.current.sendMessage('Second') - await Promise.all([promise1, promise2]); + await Promise.all([promise1, promise2]) // Should only have one user message since second was blocked const userMessages = result.current.messages.filter( - (m) => m.role === "user" - ); - expect(userMessages.length).toBe(1); - }); + (m) => m.role === 'user', + ) + expect(userMessages.length).toBe(1) + }) - it("should handle errors during sendMessage", async () => { - const error = new Error("Network error"); + it('should handle errors during sendMessage', async () => { + const error = new Error('Network error') const adapter = createMockConnectionAdapter({ shouldError: true, error, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.error).toBeDefined(); - }); + expect(result.current.error).toBeDefined() + }) - expect(result.current.error?.message).toBe("Network error"); - expect(result.current.isLoading).toBe(false); - }); - }); + expect(result.current.error?.message).toBe('Network error') + expect(result.current.isLoading).toBe(false) + }) + }) - describe("append", () => { - it("should append a UIMessage", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + describe('append', () => { + it('should append a UIMessage', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) const message: UIMessage = { - id: "user-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'user-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }; + } - await result.current.append(message); + await result.current.append(message) await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) - expect(result.current.messages[0].id).toBe("user-1"); - }); + expect(result.current.messages[0].id).toBe('user-1') + }) - it("should convert and append a ModelMessage", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + it('should convert and append a ModelMessage', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) const modelMessage: ModelMessage = { - role: "user", - content: "Hello from model", - }; + role: 'user', + content: 'Hello from model', + } - await result.current.append(modelMessage); + await result.current.append(modelMessage) await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) - expect(result.current.messages[0].role).toBe("user"); + expect(result.current.messages[0].role).toBe('user') expect(result.current.messages[0].parts[0]).toEqual({ - type: "text", - content: "Hello from model", - }); - }); + type: 'text', + content: 'Hello from model', + }) + }) - it("should handle errors during append", async () => { - const error = new Error("Append failed"); + it('should handle errors during append', async () => { + const error = new Error('Append failed') const adapter = createMockConnectionAdapter({ shouldError: true, error, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) const message: UIMessage = { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Hello" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Hello' }], createdAt: new Date(), - }; + } - await result.current.append(message); + await result.current.append(message) await waitFor(() => { - expect(result.current.error).toBeDefined(); - }); + expect(result.current.error).toBeDefined() + }) - expect(result.current.error?.message).toBe("Append failed"); - }); - }); + expect(result.current.error?.message).toBe('Append failed') + }) + }) - describe("reload", () => { - it("should reload the last assistant message", async () => { - const chunks1 = createTextChunks("First response"); - const chunks2 = createTextChunks("Second response"); - let callCount = 0; + describe('reload', () => { + it('should reload the last assistant message', async () => { + const chunks1 = createTextChunks('First response') + const chunks2 = createTextChunks('Second response') + let callCount = 0 const adapter = createMockConnectionAdapter({ chunks: chunks1, onConnect: () => { - callCount++; + callCount++ // Return different chunks on second call if (callCount === 2) { - return chunks2; + return chunks2 } }, - }); + }) // Create a new adapter for the second call - const adapter2 = createMockConnectionAdapter({ chunks: chunks2 }); - const { result, rerender } = renderUseChat({ connection: adapter }); + const adapter2 = createMockConnectionAdapter({ chunks: chunks2 }) + const { result, rerender } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { const assistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); - expect(assistantMessage).toBeDefined(); - }); + (m) => m.role === 'assistant', + ) + expect(assistantMessage).toBeDefined() + }) const firstAssistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); + (m) => m.role === 'assistant', + ) const firstContent = - firstAssistantMessage?.parts.find((p) => p.type === "text")?.type === - "text" - ? (firstAssistantMessage.parts.find((p) => p.type === "text") as any) + firstAssistantMessage?.parts.find((p) => p.type === 'text')?.type === + 'text' + ? (firstAssistantMessage.parts.find((p) => p.type === 'text') as any) .content - : ""; + : '' // Reload with new adapter - rerender({ connection: adapter2 }); - await result.current.reload(); + rerender({ connection: adapter2 }) + await result.current.reload() await waitFor(() => { const assistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); - expect(assistantMessage).toBeDefined(); - }); + (m) => m.role === 'assistant', + ) + expect(assistantMessage).toBeDefined() + }) // Should have reloaded (though content might be same if adapter doesn't change) - const messagesAfterReload = result.current.messages; - expect(messagesAfterReload.length).toBeGreaterThan(0); - }); + const messagesAfterReload = result.current.messages + expect(messagesAfterReload.length).toBeGreaterThan(0) + }) - it("should maintain conversation history after reload", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + it('should maintain conversation history after reload', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("First"); + await result.current.sendMessage('First') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThanOrEqual(2); - }); + expect(result.current.messages.length).toBeGreaterThanOrEqual(2) + }) - const messageCountBeforeReload = result.current.messages.length; + const messageCountBeforeReload = result.current.messages.length - await result.current.reload(); + await result.current.reload() await waitFor(() => { // Should still have the same number of messages (user + assistant) - expect(result.current.messages.length).toBeGreaterThanOrEqual(2); - }); + expect(result.current.messages.length).toBeGreaterThanOrEqual(2) + }) // History should be maintained expect(result.current.messages.length).toBeGreaterThanOrEqual( - messageCountBeforeReload - ); - }); + messageCountBeforeReload, + ) + }) - it("should handle errors during reload", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + it('should handle errors during reload', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThanOrEqual(2); - }); + expect(result.current.messages.length).toBeGreaterThanOrEqual(2) + }) // Create error adapter for reload const errorAdapter = createMockConnectionAdapter({ shouldError: true, - error: new Error("Reload failed"), - }); + error: new Error('Reload failed'), + }) // Note: We can't easily change the adapter after creation, // so this test verifies error handling in general // The actual error would come from the connection adapter - expect(result.current.reload).toBeDefined(); - }); - }); + expect(result.current.reload).toBeDefined() + }) + }) - describe("stop", () => { - it("should stop current generation", async () => { - const chunks = createTextChunks("Long response that will be stopped"); + describe('stop', () => { + it('should stop current generation', async () => { + const chunks = createTextChunks('Long response that will be stopped') const adapter = createMockConnectionAdapter({ chunks, chunkDelay: 50, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - const sendPromise = result.current.sendMessage("Test"); + const sendPromise = result.current.sendMessage('Test') // Wait for loading to start await waitFor(() => { - expect(result.current.isLoading).toBe(true); - }); + expect(result.current.isLoading).toBe(true) + }) // Stop the generation - result.current.stop(); + result.current.stop() - await sendPromise; + await sendPromise // Should eventually stop loading - await waitFor(() => { - expect(result.current.isLoading).toBe(false); - }, { timeout: 1000 }); - }); + await waitFor( + () => { + expect(result.current.isLoading).toBe(false) + }, + { timeout: 1000 }, + ) + }) - it("should be safe to call multiple times", () => { - const adapter = createMockConnectionAdapter(); - const { result } = renderUseChat({ connection: adapter }); + it('should be safe to call multiple times', () => { + const adapter = createMockConnectionAdapter() + const { result } = renderUseChat({ connection: adapter }) // Should not throw - result.current.stop(); - result.current.stop(); - result.current.stop(); + result.current.stop() + result.current.stop() + result.current.stop() - expect(result.current.isLoading).toBe(false); - }); + expect(result.current.isLoading).toBe(false) + }) - it("should clear loading state when stopped", async () => { - const chunks = createTextChunks("Response"); + it('should clear loading state when stopped', async () => { + const chunks = createTextChunks('Response') const adapter = createMockConnectionAdapter({ chunks, chunkDelay: 50, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - const sendPromise = result.current.sendMessage("Test"); + const sendPromise = result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.isLoading).toBe(true); - }); + expect(result.current.isLoading).toBe(true) + }) - result.current.stop(); + result.current.stop() - await waitFor(() => { - expect(result.current.isLoading).toBe(false); - }, { timeout: 1000 }); + await waitFor( + () => { + expect(result.current.isLoading).toBe(false) + }, + { timeout: 1000 }, + ) await sendPromise.catch(() => { // Ignore errors from stopped request - }); - }); - }); + }) + }) + }) - describe("clear", () => { - it("should clear all messages", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + describe('clear', () => { + it('should clear all messages', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) - result.current.clear(); + result.current.clear() - expect(result.current.messages).toEqual([]); - }); + expect(result.current.messages).toEqual([]) + }) - it("should reset to initial state", async () => { + it('should reset to initial state', async () => { const initialMessages: UIMessage[] = [ { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Initial" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Initial' }], createdAt: new Date(), }, - ]; + ] - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) const { result } = renderUseChat({ connection: adapter, initialMessages, - }); + }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { expect(result.current.messages.length).toBeGreaterThan( - initialMessages.length - ); - }); + initialMessages.length, + ) + }) - result.current.clear(); + result.current.clear() // Should clear all messages, not reset to initial - expect(result.current.messages).toEqual([]); - }); + expect(result.current.messages).toEqual([]) + }) - it("should maintain client instance after clear", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + it('should maintain client instance after clear', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) - result.current.clear(); + result.current.clear() // Should still be able to send messages - await result.current.sendMessage("New message"); + await result.current.sendMessage('New message') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); - }); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) + }) + }) - describe("setMessages", () => { - it("should manually set messages", () => { - const adapter = createMockConnectionAdapter(); - const { result } = renderUseChat({ connection: adapter }); + describe('setMessages', () => { + it('should manually set messages', () => { + const adapter = createMockConnectionAdapter() + const { result } = renderUseChat({ connection: adapter }) const newMessages: UIMessage[] = [ { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Manual" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Manual' }], createdAt: new Date(), }, - ]; + ] - result.current.setMessages(newMessages); + result.current.setMessages(newMessages) - expect(result.current.messages).toEqual(newMessages); - }); + expect(result.current.messages).toEqual(newMessages) + }) - it("should update state immediately", () => { - const adapter = createMockConnectionAdapter(); - const { result } = renderUseChat({ connection: adapter }); + it('should update state immediately', () => { + const adapter = createMockConnectionAdapter() + const { result } = renderUseChat({ connection: adapter }) - expect(result.current.messages).toEqual([]); + expect(result.current.messages).toEqual([]) const newMessages: UIMessage[] = [ { - id: "msg-1", - role: "user", - parts: [{ type: "text", content: "Immediate" }], + id: 'msg-1', + role: 'user', + parts: [{ type: 'text', content: 'Immediate' }], createdAt: new Date(), }, - ]; + ] - result.current.setMessages(newMessages); + result.current.setMessages(newMessages) // Should be updated synchronously - expect(result.current.messages).toEqual(newMessages); - }); + expect(result.current.messages).toEqual(newMessages) + }) - it("should replace all existing messages", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const { result } = renderUseChat({ connection: adapter }); + it('should replace all existing messages', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Hello"); + await result.current.sendMessage('Hello') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) - const originalCount = result.current.messages.length; + const originalCount = result.current.messages.length const newMessages: UIMessage[] = [ { - id: "msg-new", - role: "user", - parts: [{ type: "text", content: "Replaced" }], + id: 'msg-new', + role: 'user', + parts: [{ type: 'text', content: 'Replaced' }], createdAt: new Date(), }, - ]; + ] - result.current.setMessages(newMessages); + result.current.setMessages(newMessages) - expect(result.current.messages).toEqual(newMessages); - expect(result.current.messages.length).toBe(1); - expect(result.current.messages.length).not.toBe(originalCount); - }); - }); + expect(result.current.messages).toEqual(newMessages) + expect(result.current.messages.length).toBe(1) + expect(result.current.messages.length).not.toBe(originalCount) + }) + }) - describe("callbacks", () => { - it("should call onChunk callback when chunks are received", async () => { - const chunks = createTextChunks("Hello"); - const adapter = createMockConnectionAdapter({ chunks }); - const onChunk = vi.fn(); + describe('callbacks', () => { + it('should call onChunk callback when chunks are received', async () => { + const chunks = createTextChunks('Hello') + const adapter = createMockConnectionAdapter({ chunks }) + const onChunk = vi.fn() const { result } = renderUseChat({ connection: adapter, onChunk, - }); + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(onChunk).toHaveBeenCalled(); - }); + expect(onChunk).toHaveBeenCalled() + }) // Should have been called for each chunk - expect(onChunk.mock.calls.length).toBeGreaterThan(0); - }); + expect(onChunk.mock.calls.length).toBeGreaterThan(0) + }) - it("should call onFinish callback when response finishes", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const onFinish = vi.fn(); + it('should call onFinish callback when response finishes', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const onFinish = vi.fn() const { result } = renderUseChat({ connection: adapter, onFinish, - }); + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(onFinish).toHaveBeenCalled(); - }); + expect(onFinish).toHaveBeenCalled() + }) - const finishedMessage = onFinish.mock.calls[0][0]; - expect(finishedMessage).toBeDefined(); - expect(finishedMessage.role).toBe("assistant"); - }); + const finishedMessage = onFinish.mock.calls[0][0] + expect(finishedMessage).toBeDefined() + expect(finishedMessage.role).toBe('assistant') + }) - it("should call onError callback when error occurs", async () => { - const error = new Error("Test error"); + it('should call onError callback when error occurs', async () => { + const error = new Error('Test error') const adapter = createMockConnectionAdapter({ shouldError: true, error, - }); - const onError = vi.fn(); + }) + const onError = vi.fn() const { result } = renderUseChat({ connection: adapter, onError, - }); + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(onError).toHaveBeenCalled(); - }); + expect(onError).toHaveBeenCalled() + }) - expect(onError.mock.calls[0][0].message).toBe("Test error"); - }); + expect(onError.mock.calls[0][0].message).toBe('Test error') + }) - it("should call onResponse callback when response is received", async () => { - const chunks = createTextChunks("Response"); - const adapter = createMockConnectionAdapter({ chunks }); - const onResponse = vi.fn(); + it('should call onResponse callback when response is received', async () => { + const chunks = createTextChunks('Response') + const adapter = createMockConnectionAdapter({ chunks }) + const onResponse = vi.fn() const { result } = renderUseChat({ connection: adapter, onResponse, - }); + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') // onResponse may or may not be called depending on adapter implementation // This test verifies the callback is passed through await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); - }); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) + }) + }) - describe("edge cases and error handling", () => { - describe("options changes", () => { - it("should maintain client instance when options change", () => { - const adapter1 = createMockConnectionAdapter(); - const { result, rerender } = renderUseChat({ connection: adapter1 }); + describe('edge cases and error handling', () => { + describe('options changes', () => { + it('should maintain client instance when options change', () => { + const adapter1 = createMockConnectionAdapter() + const { result, rerender } = renderUseChat({ connection: adapter1 }) - const initialMessages = result.current.messages; + const initialMessages = result.current.messages - const adapter2 = createMockConnectionAdapter(); - rerender({ connection: adapter2 }); + const adapter2 = createMockConnectionAdapter() + rerender({ connection: adapter2 }) // Client instance should persist (current implementation doesn't update) // This documents current behavior - options changes don't update client - expect(result.current.messages).toBe(initialMessages); - }); + expect(result.current.messages).toBe(initialMessages) + }) - it("should handle body changes", () => { - const adapter = createMockConnectionAdapter(); + it('should handle body changes', () => { + const adapter = createMockConnectionAdapter() const { result, rerender } = renderUseChat({ connection: adapter, - body: { userId: "123" }, - }); + body: { userId: '123' }, + }) rerender({ connection: adapter, - body: { userId: "456" }, - }); + body: { userId: '456' }, + }) // Should not throw - expect(result.current).toBeDefined(); - }); + expect(result.current).toBeDefined() + }) - it("should handle callback changes", () => { - const adapter = createMockConnectionAdapter(); - const onChunk1 = vi.fn(); + it('should handle callback changes', () => { + const adapter = createMockConnectionAdapter() + const onChunk1 = vi.fn() const { result, rerender } = renderUseChat({ connection: adapter, onChunk: onChunk1, - }); + }) - const onChunk2 = vi.fn(); + const onChunk2 = vi.fn() rerender({ connection: adapter, onChunk: onChunk2, - }); + }) // Should not throw - expect(result.current).toBeDefined(); - }); - }); + expect(result.current).toBeDefined() + }) + }) - describe("unmount behavior", () => { - it("should not update state after unmount", async () => { - const chunks = createTextChunks("Response"); + describe('unmount behavior', () => { + it('should not update state after unmount', async () => { + const chunks = createTextChunks('Response') const adapter = createMockConnectionAdapter({ chunks, chunkDelay: 100, - }); - const { result, unmount } = renderUseChat({ connection: adapter }); + }) + const { result, unmount } = renderUseChat({ connection: adapter }) - const sendPromise = result.current.sendMessage("Test"); + const sendPromise = result.current.sendMessage('Test') // Unmount before completion - unmount(); + unmount() await sendPromise.catch(() => { // Ignore errors - }); + }) // State updates after unmount should be ignored (React handles this) // This test documents the expected behavior - expect(result.current).toBeDefined(); - }); + expect(result.current).toBeDefined() + }) - it("should stop loading on unmount if active", async () => { - const chunks = createTextChunks("Response"); + it('should stop loading on unmount if active', async () => { + const chunks = createTextChunks('Response') const adapter = createMockConnectionAdapter({ chunks, chunkDelay: 100, - }); - const { result, unmount } = renderUseChat({ connection: adapter }); + }) + const { result, unmount } = renderUseChat({ connection: adapter }) - result.current.sendMessage("Test"); + result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.isLoading).toBe(true); - }); + expect(result.current.isLoading).toBe(true) + }) - unmount(); + unmount() // After unmount, React will clean up // The actual cleanup is handled by React's lifecycle - expect(result.current.isLoading).toBe(true); // Still true in test, but component is unmounted - }); - }); + expect(result.current.isLoading).toBe(true) // Still true in test, but component is unmounted + }) + }) - describe("concurrent operations", () => { - it("should handle multiple sendMessage calls", async () => { + describe('concurrent operations', () => { + it('should handle multiple sendMessage calls', async () => { const adapter = createMockConnectionAdapter({ - chunks: createTextChunks("Response"), + chunks: createTextChunks('Response'), chunkDelay: 50, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - const promise1 = result.current.sendMessage("First"); - const promise2 = result.current.sendMessage("Second"); + const promise1 = result.current.sendMessage('First') + const promise2 = result.current.sendMessage('Second') - await Promise.all([promise1, promise2]); + await Promise.all([promise1, promise2]) // Should only have one user message (second should be blocked) const userMessages = result.current.messages.filter( - (m) => m.role === "user" - ); - expect(userMessages.length).toBe(1); - }); + (m) => m.role === 'user', + ) + expect(userMessages.length).toBe(1) + }) - it("should handle stop during sendMessage", async () => { - const chunks = createTextChunks("Long response"); + it('should handle stop during sendMessage', async () => { + const chunks = createTextChunks('Long response') const adapter = createMockConnectionAdapter({ chunks, chunkDelay: 50, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - const sendPromise = result.current.sendMessage("Test"); + const sendPromise = result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.isLoading).toBe(true); - }); + expect(result.current.isLoading).toBe(true) + }) - result.current.stop(); + result.current.stop() - await waitFor(() => { - expect(result.current.isLoading).toBe(false); - }, { timeout: 1000 }); + await waitFor( + () => { + expect(result.current.isLoading).toBe(false) + }, + { timeout: 1000 }, + ) await sendPromise.catch(() => { // Ignore errors from stopped request - }); - }); + }) + }) - it("should handle reload during active stream", async () => { - const chunks = createTextChunks("Response"); + it('should handle reload during active stream', async () => { + const chunks = createTextChunks('Response') const adapter = createMockConnectionAdapter({ chunks, chunkDelay: 50, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - const sendPromise = result.current.sendMessage("Test"); + const sendPromise = result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.isLoading).toBe(true); - }); + expect(result.current.isLoading).toBe(true) + }) // Try to reload while sending - const reloadPromise = result.current.reload(); + const reloadPromise = result.current.reload() - await Promise.allSettled([sendPromise, reloadPromise]); + await Promise.allSettled([sendPromise, reloadPromise]) // Should eventually complete await waitFor(() => { - expect(result.current.isLoading).toBe(false); - }); - }); - }); - - describe("error scenarios", () => { - it("should handle network errors", async () => { - const error = new Error("Network request failed"); + expect(result.current.isLoading).toBe(false) + }) + }) + }) + + describe('error scenarios', () => { + it('should handle network errors', async () => { + const error = new Error('Network request failed') const adapter = createMockConnectionAdapter({ shouldError: true, error, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.error).toBeDefined(); - }); + expect(result.current.error).toBeDefined() + }) - expect(result.current.error?.message).toBe("Network request failed"); - expect(result.current.isLoading).toBe(false); - }); + expect(result.current.error?.message).toBe('Network request failed') + expect(result.current.isLoading).toBe(false) + }) - it("should handle stream errors", async () => { - const error = new Error("Stream error"); + it('should handle stream errors', async () => { + const error = new Error('Stream error') const adapter = createMockConnectionAdapter({ shouldError: true, error, - }); - const { result } = renderUseChat({ connection: adapter }); + }) + const { result } = renderUseChat({ connection: adapter }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.error).toBeDefined(); - }); + expect(result.current.error).toBeDefined() + }) - expect(result.current.error?.message).toBe("Stream error"); - }); + expect(result.current.error?.message).toBe('Stream error') + }) - it("should clear error on successful operation", async () => { + it('should clear error on successful operation', async () => { const errorAdapter = createMockConnectionAdapter({ shouldError: true, - error: new Error("Initial error"), - }); + error: new Error('Initial error'), + }) const { result, rerender } = renderUseChat({ connection: errorAdapter, - }); + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.error).toBeDefined(); - }); + expect(result.current.error).toBeDefined() + }) // Switch to working adapter const workingAdapter = createMockConnectionAdapter({ - chunks: createTextChunks("Success"), - }); - rerender({ connection: workingAdapter }); + chunks: createTextChunks('Success'), + }) + rerender({ connection: workingAdapter }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { // Error should be cleared on success - expect(result.current.messages.length).toBeGreaterThan(0); - }); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) + }) - it("should handle tool execution errors", async () => { + it('should handle tool execution errors', async () => { const toolCalls = createToolCallChunks([ - { id: "tool-1", name: "testTool", arguments: '{"param": "value"}' }, - ]); - const adapter = createMockConnectionAdapter({ chunks: toolCalls }); + { id: 'tool-1', name: 'testTool', arguments: '{"param": "value"}' }, + ]) + const adapter = createMockConnectionAdapter({ chunks: toolCalls }) const { result } = renderUseChat({ connection: adapter, onToolCall: async () => { - throw new Error("Tool execution failed"); + throw new Error('Tool execution failed') }, - }); + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { - expect(result.current.messages.length).toBeGreaterThan(0); - }); + expect(result.current.messages.length).toBeGreaterThan(0) + }) // Tool error should be handled - expect(result.current.error).toBeDefined(); - }); - }); + expect(result.current.error).toBeDefined() + }) + }) - describe("multiple hook instances", () => { - it("should maintain independent state per instance", async () => { + describe('multiple hook instances', () => { + it('should maintain independent state per instance', async () => { const adapter1 = createMockConnectionAdapter({ - chunks: createTextChunks("Response 1"), - }); + chunks: createTextChunks('Response 1'), + }) const adapter2 = createMockConnectionAdapter({ - chunks: createTextChunks("Response 2"), - }); + chunks: createTextChunks('Response 2'), + }) const { result: result1 } = renderUseChat({ connection: adapter1, - id: "chat-1", - }); + id: 'chat-1', + }) const { result: result2 } = renderUseChat({ connection: adapter2, - id: "chat-2", - }); + id: 'chat-2', + }) - await result1.current.sendMessage("Hello 1"); - await result2.current.sendMessage("Hello 2"); + await result1.current.sendMessage('Hello 1') + await result2.current.sendMessage('Hello 2') await waitFor(() => { - expect(result1.current.messages.length).toBeGreaterThan(0); - expect(result2.current.messages.length).toBeGreaterThan(0); - }); + expect(result1.current.messages.length).toBeGreaterThan(0) + expect(result2.current.messages.length).toBeGreaterThan(0) + }) // Each instance should have its own messages expect(result1.current.messages.length).toBe( - result2.current.messages.length - ); + result2.current.messages.length, + ) expect(result1.current.messages[0].parts[0]).not.toEqual( - result2.current.messages[0].parts[0] - ); - }); + result2.current.messages[0].parts[0], + ) + }) - it("should handle different IDs correctly", () => { - const adapter = createMockConnectionAdapter(); + it('should handle different IDs correctly', () => { + const adapter = createMockConnectionAdapter() const { result: result1 } = renderUseChat({ connection: adapter, - id: "chat-1", - }); + id: 'chat-1', + }) const { result: result2 } = renderUseChat({ connection: adapter, - id: "chat-2", - }); + id: 'chat-2', + }) // Should not interfere with each other - expect(result1.current.messages).toEqual([]); - expect(result2.current.messages).toEqual([]); - }); + expect(result1.current.messages).toEqual([]) + expect(result2.current.messages).toEqual([]) + }) - it("should not have cross-contamination", async () => { + it('should not have cross-contamination', async () => { const adapter1 = createMockConnectionAdapter({ - chunks: createTextChunks("One"), - }); + chunks: createTextChunks('One'), + }) const adapter2 = createMockConnectionAdapter({ - chunks: createTextChunks("Two"), - }); + chunks: createTextChunks('Two'), + }) const { result: result1 } = renderUseChat({ connection: adapter1, - }); + }) const { result: result2 } = renderUseChat({ connection: adapter2, - }); + }) - await result1.current.sendMessage("Message 1"); + await result1.current.sendMessage('Message 1') await waitFor(() => { - expect(result1.current.messages.length).toBeGreaterThan(0); - }); + expect(result1.current.messages.length).toBeGreaterThan(0) + }) // Second instance should still be empty - expect(result2.current.messages.length).toBe(0); + expect(result2.current.messages.length).toBe(0) - await result2.current.sendMessage("Message 2"); + await result2.current.sendMessage('Message 2') await waitFor(() => { - expect(result2.current.messages.length).toBeGreaterThan(0); - }); + expect(result2.current.messages.length).toBeGreaterThan(0) + }) // Both should have messages, but different ones - expect(result1.current.messages.length).toBeGreaterThan(0); - expect(result2.current.messages.length).toBeGreaterThan(0); + expect(result1.current.messages.length).toBeGreaterThan(0) + expect(result2.current.messages.length).toBeGreaterThan(0) expect(result1.current.messages[0].parts[0]).not.toEqual( - result2.current.messages[0].parts[0] - ); - }); - }); + result2.current.messages[0].parts[0], + ) + }) + }) - describe("tool operations", () => { - it("should handle addToolResult", async () => { + describe('tool operations', () => { + it('should handle addToolResult', async () => { const toolCalls = createToolCallChunks([ - { id: "tool-1", name: "testTool", arguments: '{"param": "value"}' }, - ]); - const adapter = createMockConnectionAdapter({ chunks: toolCalls }); + { id: 'tool-1', name: 'testTool', arguments: '{"param": "value"}' }, + ]) + const adapter = createMockConnectionAdapter({ chunks: toolCalls }) const { result } = renderUseChat({ connection: adapter, - onToolCall: async () => ({ result: "success" }), - }); + onToolCall: async () => ({ result: 'success' }), + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { const assistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); - expect(assistantMessage).toBeDefined(); - }); + (m) => m.role === 'assistant', + ) + expect(assistantMessage).toBeDefined() + }) // Find tool call const assistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); + (m) => m.role === 'assistant', + ) const toolCallPart = assistantMessage?.parts.find( - (p) => p.type === "tool-call" - ); + (p) => p.type === 'tool-call', + ) - if (toolCallPart && toolCallPart.type === "tool-call") { + if (toolCallPart && toolCallPart.type === 'tool-call') { await result.current.addToolResult({ toolCallId: toolCallPart.id, tool: toolCallPart.name, - output: { result: "manual" }, - }); + output: { result: 'manual' }, + }) // Should update the tool call await waitFor(() => { const updatedMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); + (m) => m.role === 'assistant', + ) const updatedToolCall = updatedMessage?.parts.find( - (p) => p.type === "tool-call" && p.id === toolCallPart.id - ); - expect(updatedToolCall).toBeDefined(); - }); + (p) => p.type === 'tool-call' && p.id === toolCallPart.id, + ) + expect(updatedToolCall).toBeDefined() + }) } - }); + }) - it("should handle addToolApprovalResponse", async () => { + it('should handle addToolApprovalResponse', async () => { const toolCalls = createToolCallChunks([ - { id: "tool-1", name: "testTool", arguments: '{"param": "value"}' }, - ]); - const adapter = createMockConnectionAdapter({ chunks: toolCalls }); + { id: 'tool-1', name: 'testTool', arguments: '{"param": "value"}' }, + ]) + const adapter = createMockConnectionAdapter({ chunks: toolCalls }) const { result } = renderUseChat({ connection: adapter, - }); + }) - await result.current.sendMessage("Test"); + await result.current.sendMessage('Test') await waitFor(() => { const assistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); - expect(assistantMessage).toBeDefined(); - }); + (m) => m.role === 'assistant', + ) + expect(assistantMessage).toBeDefined() + }) // Find tool call with approval const assistantMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); + (m) => m.role === 'assistant', + ) const toolCallPart = assistantMessage?.parts.find( - (p) => p.type === "tool-call" && p.approval - ); - - if (toolCallPart && toolCallPart.type === "tool-call" && toolCallPart.approval) { + (p) => p.type === 'tool-call' && p.approval, + ) + + if ( + toolCallPart && + toolCallPart.type === 'tool-call' && + toolCallPart.approval + ) { await result.current.addToolApprovalResponse({ id: toolCallPart.approval.id, approved: true, - }); + }) // Should update approval state await waitFor(() => { const updatedMessage = result.current.messages.find( - (m) => m.role === "assistant" - ); + (m) => m.role === 'assistant', + ) const updatedToolCall = updatedMessage?.parts.find( - (p) => p.type === "tool-call" && p.id === toolCallPart.id - ); - if (updatedToolCall && updatedToolCall.type === "tool-call") { - expect(updatedToolCall.approval?.approved).toBe(true); + (p) => p.type === 'tool-call' && p.id === toolCallPart.id, + ) + if (updatedToolCall && updatedToolCall.type === 'tool-call') { + expect(updatedToolCall.approval?.approved).toBe(true) } - }); + }) } - }); - }); - }); -}); - + }) + }) + }) +}) diff --git a/packages/typescript/ai-react/tsconfig.json b/packages/typescript/ai-react/tsconfig.json index e8b948011..3bbc679df 100644 --- a/packages/typescript/ai-react/tsconfig.json +++ b/packages/typescript/ai-react/tsconfig.json @@ -7,6 +7,5 @@ "lib": ["ES2022", "DOM"] }, "include": ["src/**/*.ts", "src/**/*.tsx"], - "exclude": ["node_modules", "dist", "**/*.config.ts"], - "references": [{ "path": "../ai" }, { "path": "../ai-client" }] + "exclude": ["node_modules", "dist", "**/*.config.ts"] } diff --git a/packages/typescript/ai-react/tsdown.config.ts b/packages/typescript/ai-react/tsdown.config.ts index 3d6711d9d..6d458495b 100644 --- a/packages/typescript/ai-react/tsdown.config.ts +++ b/packages/typescript/ai-react/tsdown.config.ts @@ -1,12 +1,12 @@ -import { defineConfig } from "tsdown"; +import { defineConfig } from 'tsdown' export default defineConfig({ - entry: ["./src/index.ts"], - format: ["esm"], + entry: ['./src/index.ts'], + format: ['esm'], unbundle: true, dts: true, sourcemap: true, clean: true, minify: false, - external: ["react"], -}); + external: ['react'], +}) diff --git a/packages/typescript/ai-react/vite.config.ts b/packages/typescript/ai-react/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/ai-react/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/ai-react/vitest.config.ts b/packages/typescript/ai-react/vitest.config.ts index 5e2b99d25..6733c18ab 100644 --- a/packages/typescript/ai-react/vitest.config.ts +++ b/packages/typescript/ai-react/vitest.config.ts @@ -1,33 +1,35 @@ -import { defineConfig } from "vitest/config"; -import { resolve } from "path"; -import { fileURLToPath } from "url"; +import { defineConfig } from 'vitest/config' +import { resolve } from 'path' +import { fileURLToPath } from 'url' -const __dirname = fileURLToPath(new URL(".", import.meta.url)); +const __dirname = fileURLToPath(new URL('.', import.meta.url)) export default defineConfig({ test: { globals: true, - environment: "jsdom", - include: ["tests/**/*.test.ts", "tests/**/*.test.tsx"], + environment: 'jsdom', + include: ['tests/**/*.test.ts', 'tests/**/*.test.tsx'], coverage: { - provider: "v8", - reporter: ["text", "json", "html", "lcov"], + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], exclude: [ - "node_modules/", - "dist/", - "tests/", - "**/*.test.ts", - "**/*.test.tsx", - "**/*.config.ts", - "**/types.ts", + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.test.tsx', + '**/*.config.ts', + '**/types.ts', ], - include: ["src/**/*.ts"], + include: ['src/**/*.ts'], }, }, resolve: { alias: { - "@tanstack/ai/event-client": resolve(__dirname, "../ai/src/event-client.ts"), + '@tanstack/ai/event-client': resolve( + __dirname, + '../ai/src/event-client.ts', + ), }, }, -}); - +}) diff --git a/packages/typescript/ai/package.json b/packages/typescript/ai/package.json index 0d1668cd9..fd56454de 100644 --- a/packages/typescript/ai/package.json +++ b/packages/typescript/ai/package.json @@ -10,16 +10,16 @@ "directory": "packages/typescript/ai" }, "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" }, "./event-client": { - "types": "./dist/event-client.d.ts", - "import": "./dist/event-client.js" + "types": "./dist/esm/event-client.d.ts", + "import": "./dist/esm/event-client.js" } }, "sideEffects": false, @@ -50,6 +50,5 @@ ], "dependencies": { "@tanstack/devtools-event-client": "^0.3.5" - }, - "devDependencies": {} -} \ No newline at end of file + } +} diff --git a/packages/typescript/ai/src/base-adapter.ts b/packages/typescript/ai/src/base-adapter.ts index 11c3b729a..a863ef810 100644 --- a/packages/typescript/ai/src/base-adapter.ts +++ b/packages/typescript/ai/src/base-adapter.ts @@ -2,12 +2,12 @@ import type { AIAdapter, AIAdapterConfig, ChatOptions, + EmbeddingOptions, + EmbeddingResult, StreamChunk, SummarizationOptions, SummarizationResult, - EmbeddingOptions, - EmbeddingResult, -} from "./types"; +} from './types' /** * Base adapter class with support for endpoint-specific models and provider options. @@ -20,11 +20,11 @@ import type { * - TModelProviderOptionsByName: Provider-specific options for model by name */ export abstract class BaseAdapter< - TChatModels extends readonly string[] = readonly string[], - TEmbeddingModels extends readonly string[] = readonly string[], + TChatModels extends ReadonlyArray = ReadonlyArray, + TEmbeddingModels extends ReadonlyArray = ReadonlyArray, TChatProviderOptions extends Record = Record, TEmbeddingProviderOptions extends Record = Record, - TModelProviderOptionsByName extends Record = Record + TModelProviderOptionsByName extends Record = Record, > implements AIAdapter< TChatModels, @@ -34,34 +34,32 @@ export abstract class BaseAdapter< TModelProviderOptionsByName > { - abstract name: string; - abstract models: TChatModels; - embeddingModels?: TEmbeddingModels; - protected config: AIAdapterConfig; + abstract name: string + abstract models: TChatModels + embeddingModels?: TEmbeddingModels + protected config: AIAdapterConfig // These properties are used for type inference only, never assigned at runtime - _providerOptions?: TChatProviderOptions; - _chatProviderOptions?: TChatProviderOptions; - _embeddingProviderOptions?: TEmbeddingProviderOptions; + _providerOptions?: TChatProviderOptions + _chatProviderOptions?: TChatProviderOptions + _embeddingProviderOptions?: TEmbeddingProviderOptions // Type-only map; concrete adapters should override this with a precise type - _modelProviderOptionsByName!: TModelProviderOptionsByName; + _modelProviderOptionsByName!: TModelProviderOptionsByName constructor(config: AIAdapterConfig = {}) { - this.config = config; + this.config = config } - abstract chatStream(options: ChatOptions): AsyncIterable; + abstract chatStream(options: ChatOptions): AsyncIterable abstract summarize( - options: SummarizationOptions - ): Promise; - abstract createEmbeddings( - options: EmbeddingOptions - ): Promise; + options: SummarizationOptions, + ): Promise + abstract createEmbeddings(options: EmbeddingOptions): Promise protected generateId(): string { return `${this.name}-${Date.now()}-${Math.random() .toString(36) - .substring(7)}`; + .substring(7)}` } } diff --git a/packages/typescript/ai/src/core/chat-common-options.ts b/packages/typescript/ai/src/core/chat-common-options.ts index 4bd06d2b0..c457335eb 100644 --- a/packages/typescript/ai/src/core/chat-common-options.ts +++ b/packages/typescript/ai/src/core/chat-common-options.ts @@ -1,55 +1,55 @@ -/** - * Common options shared across different AI provider implementations. - * These options represent the standard parameters that work across OpenAI, Anthropic, and Gemini. - */ -export interface CommonOptions { - /** - * Controls the randomness of the output. - * Higher values (e.g., 0.8) make output more random, lower values (e.g., 0.2) make it more focused and deterministic. - * Range: [0.0, 2.0] - * - * Note: Generally recommended to use either temperature or topP, but not both. - * - * Provider usage: - * - OpenAI: `temperature` (number) - in text.top_p field - * - Anthropic: `temperature` (number) - ranges from 0.0 to 1.0, default 1.0 - * - Gemini: `generationConfig.temperature` (number) - ranges from 0.0 to 2.0 - */ - temperature?: number; - - /** - * Nucleus sampling parameter. An alternative to temperature sampling. - * The model considers the results of tokens with topP probability mass. - * For example, 0.1 means only tokens comprising the top 10% probability mass are considered. - * - * Note: Generally recommended to use either temperature or topP, but not both. - * - * Provider usage: - * - OpenAI: `text.top_p` (number) - * - Anthropic: `top_p` (number | null) - * - Gemini: `generationConfig.topP` (number) - */ - topP?: number; - - /** - * The maximum number of tokens to generate in the response. - * - * Provider usage: - * - OpenAI: `max_output_tokens` (number) - includes visible output and reasoning tokens - * - Anthropic: `max_tokens` (number, required) - range x >= 1 - * - Gemini: `generationConfig.maxOutputTokens` (number) - */ - maxTokens?: number; - - /** - * Additional metadata to attach to the request. - * Can be used for tracking, debugging, or passing custom information. - * Structure and constraints vary by provider. - * - * Provider usage: - * - OpenAI: `metadata` (Record) - max 16 key-value pairs, keys max 64 chars, values max 512 chars - * - Anthropic: `metadata` (Record) - includes optional user_id (max 256 chars) - * - Gemini: Not directly available in TextProviderOptions - */ - metadata?: Record; -} +/** + * Common options shared across different AI provider implementations. + * These options represent the standard parameters that work across OpenAI, Anthropic, and Gemini. + */ +export interface CommonOptions { + /** + * Controls the randomness of the output. + * Higher values (e.g., 0.8) make output more random, lower values (e.g., 0.2) make it more focused and deterministic. + * Range: [0.0, 2.0] + * + * Note: Generally recommended to use either temperature or topP, but not both. + * + * Provider usage: + * - OpenAI: `temperature` (number) - in text.top_p field + * - Anthropic: `temperature` (number) - ranges from 0.0 to 1.0, default 1.0 + * - Gemini: `generationConfig.temperature` (number) - ranges from 0.0 to 2.0 + */ + temperature?: number + + /** + * Nucleus sampling parameter. An alternative to temperature sampling. + * The model considers the results of tokens with topP probability mass. + * For example, 0.1 means only tokens comprising the top 10% probability mass are considered. + * + * Note: Generally recommended to use either temperature or topP, but not both. + * + * Provider usage: + * - OpenAI: `text.top_p` (number) + * - Anthropic: `top_p` (number | null) + * - Gemini: `generationConfig.topP` (number) + */ + topP?: number + + /** + * The maximum number of tokens to generate in the response. + * + * Provider usage: + * - OpenAI: `max_output_tokens` (number) - includes visible output and reasoning tokens + * - Anthropic: `max_tokens` (number, required) - range x >= 1 + * - Gemini: `generationConfig.maxOutputTokens` (number) + */ + maxTokens?: number + + /** + * Additional metadata to attach to the request. + * Can be used for tracking, debugging, or passing custom information. + * Structure and constraints vary by provider. + * + * Provider usage: + * - OpenAI: `metadata` (Record) - max 16 key-value pairs, keys max 64 chars, values max 512 chars + * - Anthropic: `metadata` (Record) - includes optional user_id (max 256 chars) + * - Gemini: Not directly available in TextProviderOptions + */ + metadata?: Record +} diff --git a/packages/typescript/ai/src/core/chat.ts b/packages/typescript/ai/src/core/chat.ts index b8748f8bb..c6f57ec15 100644 --- a/packages/typescript/ai/src/core/chat.ts +++ b/packages/typescript/ai/src/core/chat.ts @@ -1,141 +1,140 @@ +import { aiEventClient } from '../event-client.js' +import { ToolCallManager, executeToolCalls } from '../tools/tool-calls' +import { maxIterations as maxIterationsStrategy } from '../utilities/agent-loop-strategies' +import type { + ApprovalRequest, + ClientToolRequest, + ToolResult, +} from '../tools/tool-calls' import type { AIAdapter, + AgentLoopStrategy, ChatOptions, - StreamChunk, + ChatStreamOptionsUnion, + DoneStreamChunk, ModelMessage, + StreamChunk, Tool, ToolCall, - DoneStreamChunk, - AgentLoopStrategy, - ChatStreamOptionsUnion, -} from "../types"; -import { aiEventClient } from "../event-client.js"; -import { - executeToolCalls, - type ApprovalRequest, - type ClientToolRequest, - type ToolResult, - ToolCallManager, -} from "../tools/tool-calls"; -import { maxIterations as maxIterationsStrategy } from "../utilities/agent-loop-strategies"; +} from '../types' function prependSystemPrompts( - messages: ModelMessage[], - systemPrompts?: string[], - defaultPrompts: string[] = [] -): ModelMessage[] { + messages: Array, + systemPrompts?: Array, + defaultPrompts: Array = [], +): Array { const prompts = - systemPrompts && systemPrompts.length > 0 ? systemPrompts : defaultPrompts; + systemPrompts && systemPrompts.length > 0 ? systemPrompts : defaultPrompts - if (!prompts || prompts.length === 0) { - return messages; + if (prompts.length === 0) { + return messages } const systemMessages = prompts.map((content) => ({ - role: "system" as const, + role: 'system' as const, content, - })); + })) - return [...systemMessages, ...messages]; + return [...systemMessages, ...messages] } interface ChatEngineConfig< TAdapter extends AIAdapter, - TParams extends ChatOptions = ChatOptions + TParams extends ChatOptions = ChatOptions, > { - adapter: TAdapter; - systemPrompts?: string[]; - params: TParams; + adapter: TAdapter + systemPrompts?: Array + params: TParams } -type ToolPhaseResult = "continue" | "stop" | "wait"; -type CyclePhase = "processChat" | "executeToolCalls"; +type ToolPhaseResult = 'continue' | 'stop' | 'wait' +type CyclePhase = 'processChat' | 'executeToolCalls' class ChatEngine< TAdapter extends AIAdapter, - TParams extends ChatOptions = ChatOptions + TParams extends ChatOptions = ChatOptions, > { - private readonly adapter: TAdapter; - private readonly params: TParams; - private readonly systemPrompts: string[]; - private readonly tools: ReadonlyArray; - private readonly loopStrategy: AgentLoopStrategy; - private readonly toolCallManager: ToolCallManager; - private readonly initialMessageCount: number; - private readonly requestId: string; - private readonly streamId: string; - private readonly effectiveRequest?: Request | RequestInit; - private readonly effectiveSignal?: AbortSignal; - - private messages: ModelMessage[]; - private iterationCount = 0; - private lastFinishReason: string | null = null; - private streamStartTime = 0; - private totalChunkCount = 0; - private currentMessageId: string | null = null; - private accumulatedContent = ""; - private doneChunk: DoneStreamChunk | null = null; - private shouldEmitStreamEnd = true; - private earlyTermination = false; - private toolPhase: ToolPhaseResult = "continue"; - private cyclePhase: CyclePhase = "processChat"; + private readonly adapter: TAdapter + private readonly params: TParams + private readonly systemPrompts: Array + private readonly tools: ReadonlyArray + private readonly loopStrategy: AgentLoopStrategy + private readonly toolCallManager: ToolCallManager + private readonly initialMessageCount: number + private readonly requestId: string + private readonly streamId: string + private readonly effectiveRequest?: Request | RequestInit + private readonly effectiveSignal?: AbortSignal + + private messages: Array + private iterationCount = 0 + private lastFinishReason: string | null = null + private streamStartTime = 0 + private totalChunkCount = 0 + private currentMessageId: string | null = null + private accumulatedContent = '' + private doneChunk: DoneStreamChunk | null = null + private shouldEmitStreamEnd = true + private earlyTermination = false + private toolPhase: ToolPhaseResult = 'continue' + private cyclePhase: CyclePhase = 'processChat' constructor(config: ChatEngineConfig) { - this.adapter = config.adapter; - this.params = config.params; - this.systemPrompts = config.systemPrompts || []; - this.tools = config.params.tools || []; + this.adapter = config.adapter + this.params = config.params + this.systemPrompts = config.systemPrompts || [] + this.tools = config.params.tools || [] this.loopStrategy = - config.params.agentLoopStrategy || maxIterationsStrategy(5); - this.toolCallManager = new ToolCallManager(this.tools); - this.initialMessageCount = config.params.messages.length; + config.params.agentLoopStrategy || maxIterationsStrategy(5) + this.toolCallManager = new ToolCallManager(this.tools) + this.initialMessageCount = config.params.messages.length this.messages = prependSystemPrompts( config.params.messages, config.params.systemPrompts, - this.systemPrompts - ); - this.requestId = this.createId("chat"); - this.streamId = this.createId("stream"); + this.systemPrompts, + ) + this.requestId = this.createId('chat') + this.streamId = this.createId('stream') this.effectiveRequest = config.params.abortController ? { signal: config.params.abortController.signal } - : undefined; - this.effectiveSignal = config.params.abortController?.signal; + : undefined + this.effectiveSignal = config.params.abortController?.signal } async *chat(): AsyncGenerator { - this.beforeChat(); + this.beforeChat() try { - const pendingPhase = yield* this.checkForPendingToolCalls(); - if (pendingPhase === "wait") { - return; + const pendingPhase = yield* this.checkForPendingToolCalls() + if (pendingPhase === 'wait') { + return } do { if (this.earlyTermination || this.isAborted()) { - return; + return } - this.beginCycle(); + this.beginCycle() - if (this.cyclePhase === "processChat") { - yield* this.streamModelResponse(); + if (this.cyclePhase === 'processChat') { + yield* this.streamModelResponse() } else { - yield* this.processToolCalls(); + yield* this.processToolCalls() } - this.endCycle(); - } while (this.shouldContinue()); + this.endCycle() + } while (this.shouldContinue()) } finally { - this.afterChat(); + this.afterChat() } } private beforeChat(): void { - this.streamStartTime = Date.now(); - const { model, tools, options, providerOptions } = this.params; + this.streamStartTime = Date.now() + const { model, tools, options, providerOptions } = this.params - aiEventClient.emit("chat:started", { + aiEventClient.emit('chat:started', { requestId: this.requestId, model: model, messageCount: this.initialMessageCount, @@ -145,55 +144,55 @@ class ChatEngine< toolNames: tools?.map((t) => t.function.name), options: options as Record | undefined, providerOptions: providerOptions as Record | undefined, - }); + }) - aiEventClient.emit("stream:started", { + aiEventClient.emit('stream:started', { streamId: this.streamId, model, provider: this.adapter.name, timestamp: Date.now(), - }); + }) } private afterChat(): void { if (!this.shouldEmitStreamEnd) { - return; + return } - aiEventClient.emit("stream:ended", { + aiEventClient.emit('stream:ended', { streamId: this.streamId, totalChunks: this.totalChunkCount, duration: Date.now() - this.streamStartTime, timestamp: Date.now(), - }); + }) } private beginCycle(): void { - if (this.cyclePhase === "processChat") { - this.beginIteration(); + if (this.cyclePhase === 'processChat') { + this.beginIteration() } } private endCycle(): void { - if (this.cyclePhase === "processChat") { - this.cyclePhase = "executeToolCalls"; - return; + if (this.cyclePhase === 'processChat') { + this.cyclePhase = 'executeToolCalls' + return } - this.cyclePhase = "processChat"; - this.iterationCount++; + this.cyclePhase = 'processChat' + this.iterationCount++ } private beginIteration(): void { - this.currentMessageId = this.createId("msg"); - this.accumulatedContent = ""; - this.doneChunk = null; + this.currentMessageId = this.createId('msg') + this.accumulatedContent = '' + this.doneChunk = null } private async *streamModelResponse(): AsyncGenerator { - const adapterOptions = this.params.options || {}; - const providerOptions = this.params.providerOptions; - const tools = this.params.tools; + const adapterOptions = this.params.options || {} + const providerOptions = this.params.providerOptions + const tools = this.params.tools for await (const chunk of this.adapter.chatStream({ model: this.params.model, @@ -204,61 +203,61 @@ class ChatEngine< providerOptions, })) { if (this.isAborted()) { - break; + break } - this.totalChunkCount++; + this.totalChunkCount++ - yield chunk; - this.handleStreamChunk(chunk); + yield chunk + this.handleStreamChunk(chunk) if (this.earlyTermination) { - break; + break } } } private handleStreamChunk(chunk: StreamChunk): void { switch (chunk.type) { - case "content": - this.handleContentChunk(chunk); - break; - case "tool_call": - this.handleToolCallChunk(chunk); - break; - case "tool_result": - this.handleToolResultChunk(chunk); - break; - case "done": - this.handleDoneChunk(chunk); - break; - case "error": - this.handleErrorChunk(chunk); - break; - case "thinking": - this.handleThinkingChunk(chunk); - break; + case 'content': + this.handleContentChunk(chunk) + break + case 'tool_call': + this.handleToolCallChunk(chunk) + break + case 'tool_result': + this.handleToolResultChunk(chunk) + break + case 'done': + this.handleDoneChunk(chunk) + break + case 'error': + this.handleErrorChunk(chunk) + break + case 'thinking': + this.handleThinkingChunk(chunk) + break default: - break; + break } } - private handleContentChunk(chunk: Extract) { - this.accumulatedContent = chunk.content; - aiEventClient.emit("stream:chunk:content", { + private handleContentChunk(chunk: Extract) { + this.accumulatedContent = chunk.content + aiEventClient.emit('stream:chunk:content', { streamId: this.streamId, messageId: this.currentMessageId || undefined, content: chunk.content, delta: chunk.delta, timestamp: Date.now(), - }); + }) } private handleToolCallChunk( - chunk: Extract + chunk: Extract, ): void { - this.toolCallManager.addToolCallChunk(chunk); - aiEventClient.emit("stream:chunk:tool-call", { + this.toolCallManager.addToolCallChunk(chunk) + aiEventClient.emit('stream:chunk:tool-call', { streamId: this.streamId, messageId: this.currentMessageId || undefined, toolCallId: chunk.toolCall.id, @@ -266,94 +265,94 @@ class ChatEngine< index: chunk.index, arguments: chunk.toolCall.function.arguments, timestamp: Date.now(), - }); + }) } private handleToolResultChunk( - chunk: Extract + chunk: Extract, ): void { - aiEventClient.emit("stream:chunk:tool-result", { + aiEventClient.emit('stream:chunk:tool-result', { streamId: this.streamId, messageId: this.currentMessageId || undefined, toolCallId: chunk.toolCallId, result: chunk.content, timestamp: Date.now(), - }); + }) } private handleDoneChunk(chunk: DoneStreamChunk): void { // Don't overwrite a tool_calls finishReason with a stop finishReason // This can happen when adapters send multiple done chunks if ( - this.doneChunk?.finishReason === "tool_calls" && - chunk.finishReason === "stop" + this.doneChunk?.finishReason === 'tool_calls' && + chunk.finishReason === 'stop' ) { // Still emit the event and update lastFinishReason, but don't overwrite doneChunk - this.lastFinishReason = chunk.finishReason; - aiEventClient.emit("stream:chunk:done", { + this.lastFinishReason = chunk.finishReason + aiEventClient.emit('stream:chunk:done', { streamId: this.streamId, messageId: this.currentMessageId || undefined, finishReason: chunk.finishReason, usage: chunk.usage, timestamp: Date.now(), - }); + }) if (chunk.usage) { - aiEventClient.emit("usage:tokens", { + aiEventClient.emit('usage:tokens', { requestId: this.requestId, messageId: this.currentMessageId || undefined, model: this.params.model, usage: chunk.usage, timestamp: Date.now(), - }); + }) } - return; + return } - this.doneChunk = chunk; - this.lastFinishReason = chunk.finishReason; - aiEventClient.emit("stream:chunk:done", { + this.doneChunk = chunk + this.lastFinishReason = chunk.finishReason + aiEventClient.emit('stream:chunk:done', { streamId: this.streamId, messageId: this.currentMessageId || undefined, finishReason: chunk.finishReason, usage: chunk.usage, timestamp: Date.now(), - }); + }) if (chunk.usage) { - aiEventClient.emit("usage:tokens", { + aiEventClient.emit('usage:tokens', { requestId: this.requestId, messageId: this.currentMessageId || undefined, model: this.params.model, usage: chunk.usage, timestamp: Date.now(), - }); + }) } } private handleErrorChunk( - chunk: Extract + chunk: Extract, ): void { - aiEventClient.emit("stream:chunk:error", { + aiEventClient.emit('stream:chunk:error', { streamId: this.streamId, messageId: this.currentMessageId || undefined, error: chunk.error.message, timestamp: Date.now(), - }); - this.earlyTermination = true; - this.shouldEmitStreamEnd = false; + }) + this.earlyTermination = true + this.shouldEmitStreamEnd = false } private handleThinkingChunk( - chunk: Extract + chunk: Extract, ): void { - aiEventClient.emit("stream:chunk:thinking", { + aiEventClient.emit('stream:chunk:thinking', { streamId: this.streamId, messageId: this.currentMessageId || undefined, content: chunk.content, delta: chunk.delta, timestamp: Date.now(), - }); + }) } private async *checkForPendingToolCalls(): AsyncGenerator< @@ -361,29 +360,29 @@ class ChatEngine< ToolPhaseResult, void > { - const pendingToolCalls = this.getPendingToolCallsFromMessages(); + const pendingToolCalls = this.getPendingToolCallsFromMessages() if (pendingToolCalls.length === 0) { - return "continue"; + return 'continue' } - const doneChunk = this.createSyntheticDoneChunk(); + const doneChunk = this.createSyntheticDoneChunk() - aiEventClient.emit("chat:iteration", { + aiEventClient.emit('chat:iteration', { requestId: this.requestId, iterationNumber: this.iterationCount + 1, messageCount: this.messages.length, toolCallCount: pendingToolCalls.length, timestamp: Date.now(), - }); + }) - const { approvals, clientToolResults } = this.collectClientState(); + const { approvals, clientToolResults } = this.collectClientState() const executionResult = await executeToolCalls( pendingToolCalls, this.tools, approvals, - clientToolResults - ); + clientToolResults, + ) if ( executionResult.needsApproval.length > 0 || @@ -391,66 +390,66 @@ class ChatEngine< ) { for (const chunk of this.emitApprovalRequests( executionResult.needsApproval, - doneChunk + doneChunk, )) { - yield chunk; + yield chunk } for (const chunk of this.emitClientToolInputs( executionResult.needsClientExecution, - doneChunk + doneChunk, )) { - yield chunk; + yield chunk } - this.shouldEmitStreamEnd = false; - return "wait"; + this.shouldEmitStreamEnd = false + return 'wait' } const toolResultChunks = this.emitToolResults( executionResult.results, - doneChunk - ); + doneChunk, + ) for (const chunk of toolResultChunks) { - yield chunk; + yield chunk } - return "continue"; + return 'continue' } private async *processToolCalls(): AsyncGenerator { if (!this.shouldExecuteToolPhase()) { - this.setToolPhase("stop"); - return; + this.setToolPhase('stop') + return } - const toolCalls = this.toolCallManager.getToolCalls(); - const doneChunk = this.doneChunk; + const toolCalls = this.toolCallManager.getToolCalls() + const doneChunk = this.doneChunk if (!doneChunk || toolCalls.length === 0) { - this.setToolPhase("stop"); - return; + this.setToolPhase('stop') + return } - aiEventClient.emit("chat:iteration", { + aiEventClient.emit('chat:iteration', { requestId: this.requestId, iterationNumber: this.iterationCount + 1, messageCount: this.messages.length, toolCallCount: toolCalls.length, timestamp: Date.now(), - }); + }) - this.addAssistantToolCallMessage(toolCalls); + this.addAssistantToolCallMessage(toolCalls) - const { approvals, clientToolResults } = this.collectClientState(); + const { approvals, clientToolResults } = this.collectClientState() const executionResult = await executeToolCalls( toolCalls, this.tools, approvals, - clientToolResults - ); + clientToolResults, + ) if ( executionResult.needsApproval.length > 0 || @@ -458,97 +457,97 @@ class ChatEngine< ) { for (const chunk of this.emitApprovalRequests( executionResult.needsApproval, - doneChunk + doneChunk, )) { - yield chunk; + yield chunk } for (const chunk of this.emitClientToolInputs( executionResult.needsClientExecution, - doneChunk + doneChunk, )) { - yield chunk; + yield chunk } - this.setToolPhase("wait"); - return; + this.setToolPhase('wait') + return } const toolResultChunks = this.emitToolResults( executionResult.results, - doneChunk - ); + doneChunk, + ) for (const chunk of toolResultChunks) { - yield chunk; + yield chunk } - this.toolCallManager.clear(); + this.toolCallManager.clear() - this.setToolPhase("continue"); + this.setToolPhase('continue') } private shouldExecuteToolPhase(): boolean { return ( - this.doneChunk?.finishReason === "tool_calls" && + this.doneChunk?.finishReason === 'tool_calls' && this.tools.length > 0 && this.toolCallManager.hasToolCalls() - ); + ) } - private addAssistantToolCallMessage(toolCalls: ToolCall[]): void { + private addAssistantToolCallMessage(toolCalls: Array): void { this.messages = [ ...this.messages, { - role: "assistant", + role: 'assistant', content: this.accumulatedContent || null, toolCalls, }, - ]; + ] } private collectClientState(): { - approvals: Map; - clientToolResults: Map; + approvals: Map + clientToolResults: Map } { - const approvals = new Map(); - const clientToolResults = new Map(); + const approvals = new Map() + const clientToolResults = new Map() for (const message of this.messages) { // todo remove any and fix this - if (message.role === "assistant" && (message as any).parts) { - const parts = (message as any).parts; + if (message.role === 'assistant' && (message as any).parts) { + const parts = (message as any).parts for (const part of parts) { if ( - part.type === "tool-call" && - part.state === "approval-responded" && + part.type === 'tool-call' && + part.state === 'approval-responded' && part.approval ) { - approvals.set(part.approval.id, part.approval.approved); + approvals.set(part.approval.id, part.approval.approved) } if ( - part.type === "tool-call" && + part.type === 'tool-call' && part.output !== undefined && !part.approval ) { - clientToolResults.set(part.id, part.output); + clientToolResults.set(part.id, part.output) } } } } - return { approvals, clientToolResults }; + return { approvals, clientToolResults } } private emitApprovalRequests( - approvals: ApprovalRequest[], - doneChunk: DoneStreamChunk - ): StreamChunk[] { - const chunks: StreamChunk[] = []; + approvals: Array, + doneChunk: DoneStreamChunk, + ): Array { + const chunks: Array = [] for (const approval of approvals) { - aiEventClient.emit("stream:approval-requested", { + aiEventClient.emit('stream:approval-requested', { streamId: this.streamId, messageId: this.currentMessageId || undefined, toolCallId: approval.toolCallId, @@ -556,10 +555,10 @@ class ChatEngine< input: approval.input, approvalId: approval.approvalId, timestamp: Date.now(), - }); + }) chunks.push({ - type: "approval-requested", + type: 'approval-requested', id: doneChunk.id, model: doneChunk.model, timestamp: Date.now(), @@ -570,117 +569,117 @@ class ChatEngine< id: approval.approvalId, needsApproval: true, }, - }); + }) } - return chunks; + return chunks } private emitClientToolInputs( - clientRequests: ClientToolRequest[], - doneChunk: DoneStreamChunk - ): StreamChunk[] { - const chunks: StreamChunk[] = []; + clientRequests: Array, + doneChunk: DoneStreamChunk, + ): Array { + const chunks: Array = [] for (const clientTool of clientRequests) { - aiEventClient.emit("stream:tool-input-available", { + aiEventClient.emit('stream:tool-input-available', { streamId: this.streamId, toolCallId: clientTool.toolCallId, toolName: clientTool.toolName, input: clientTool.input, timestamp: Date.now(), - }); + }) chunks.push({ - type: "tool-input-available", + type: 'tool-input-available', id: doneChunk.id, model: doneChunk.model, timestamp: Date.now(), toolCallId: clientTool.toolCallId, toolName: clientTool.toolName, input: clientTool.input, - }); + }) } - return chunks; + return chunks } private emitToolResults( - results: ToolResult[], - doneChunk: DoneStreamChunk - ): StreamChunk[] { - const chunks: StreamChunk[] = []; + results: Array, + doneChunk: DoneStreamChunk, + ): Array { + const chunks: Array = [] for (const result of results) { - aiEventClient.emit("tool:call-completed", { + aiEventClient.emit('tool:call-completed', { streamId: this.streamId, toolCallId: result.toolCallId, toolName: result.toolCallId, result: result.result, duration: 0, timestamp: Date.now(), - }); + }) - const content = JSON.stringify(result.result); - const chunk: Extract = { - type: "tool_result", + const content = JSON.stringify(result.result) + const chunk: Extract = { + type: 'tool_result', id: doneChunk.id, model: doneChunk.model, timestamp: Date.now(), toolCallId: result.toolCallId, content, - }; + } - chunks.push(chunk); + chunks.push(chunk) this.messages = [ ...this.messages, { - role: "tool", + role: 'tool', content, toolCallId: result.toolCallId, }, - ]; + ] } - return chunks; + return chunks } - private getPendingToolCallsFromMessages(): ToolCall[] { + private getPendingToolCallsFromMessages(): Array { const completedToolIds = new Set( this.messages - .filter((message) => message.role === "tool" && message.toolCallId) - .map((message) => message.toolCallId!) // toolCallId exists due to filter - ); + .filter((message) => message.role === 'tool' && message.toolCallId) + .map((message) => message.toolCallId!), // toolCallId exists due to filter + ) - const pending: ToolCall[] = []; + const pending: Array = [] for (const message of this.messages) { - if (message.role === "assistant" && message.toolCalls) { + if (message.role === 'assistant' && message.toolCalls) { for (const toolCall of message.toolCalls) { if (!completedToolIds.has(toolCall.id)) { - pending.push(toolCall); + pending.push(toolCall) } } } } - return pending; + return pending } private createSyntheticDoneChunk(): DoneStreamChunk { return { - type: "done", - id: this.createId("pending"), + type: 'done', + id: this.createId('pending'), model: this.params.model, timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } private shouldContinue(): boolean { - if (this.cyclePhase === "executeToolCalls") { - return true; + if (this.cyclePhase === 'executeToolCalls') { + return true } return ( @@ -688,23 +687,23 @@ class ChatEngine< iterationCount: this.iterationCount, messages: this.messages, finishReason: this.lastFinishReason, - }) && this.toolPhase === "continue" - ); + }) && this.toolPhase === 'continue' + ) } private isAborted(): boolean { - return !!this.effectiveSignal?.aborted; + return !!this.effectiveSignal?.aborted } private setToolPhase(phase: ToolPhaseResult): void { - this.toolPhase = phase; - if (phase === "wait") { - this.shouldEmitStreamEnd = false; + this.toolPhase = phase + if (phase === 'wait') { + this.shouldEmitStreamEnd = false } } private createId(prefix: string): string { - return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`; + return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}` } } @@ -727,7 +726,7 @@ class ChatEngine< * model: 'gpt-4o', * messages: [{ role: 'user', content: 'Hello!' }], * tools: [weatherTool], // Optional: auto-executed when called - * }); + * }); * * for await (const chunk of stream) { * if (chunk.type === 'content') { @@ -745,15 +744,15 @@ export async function* chat< any, any > - ? Models[number] - : string + ? Models[number] + : string, >( options: Omit< ChatStreamOptionsUnion, - "providerOptions" | "model" + 'providerOptions' | 'model' > & { - adapter: TAdapter; - model: TModel; + adapter: TAdapter + model: TModel providerOptions?: TAdapter extends AIAdapter< any, any, @@ -761,13 +760,13 @@ export async function* chat< any, infer ModelProviderOptions > - ? TModel extends keyof ModelProviderOptions - ? ModelProviderOptions[TModel] - : never - : never; - } + ? TModel extends keyof ModelProviderOptions + ? ModelProviderOptions[TModel] + : never + : never + }, ): AsyncIterable { - const { adapter, ...chatOptions } = options; + const { adapter, ...chatOptions } = options const engine = new ChatEngine({ adapter, @@ -777,9 +776,9 @@ export async function* chat< undefined, Record >, - }); + }) for await (const chunk of engine.chat()) { - yield chunk; + yield chunk } } diff --git a/packages/typescript/ai/src/core/embedding.ts b/packages/typescript/ai/src/core/embedding.ts index 6b37fd26e..648526005 100644 --- a/packages/typescript/ai/src/core/embedding.ts +++ b/packages/typescript/ai/src/core/embedding.ts @@ -3,22 +3,22 @@ import type { EmbeddingOptions, EmbeddingResult, ExtractModelsFromAdapter, -} from "../types"; +} from '../types' /** * Standalone embedding function with type inference from adapter */ export async function embedding< - TAdapter extends AIAdapter + TAdapter extends AIAdapter, >( - options: Omit & { - adapter: TAdapter; - model: ExtractModelsFromAdapter; - } + options: Omit & { + adapter: TAdapter + model: ExtractModelsFromAdapter + }, ): Promise { - const { adapter, model, ...restOptions } = options; + const { adapter, model, ...restOptions } = options return adapter.createEmbeddings({ ...restOptions, model: model as string, - }); + }) } diff --git a/packages/typescript/ai/src/core/summarize.ts b/packages/typescript/ai/src/core/summarize.ts index 1dc159c2b..7213e0a09 100644 --- a/packages/typescript/ai/src/core/summarize.ts +++ b/packages/typescript/ai/src/core/summarize.ts @@ -1,26 +1,26 @@ import type { AIAdapter, + ExtractModelsFromAdapter, SummarizationOptions, SummarizationResult, - ExtractModelsFromAdapter, -} from "../types"; +} from '../types' /** * Standalone summarize function with type inference from adapter */ export async function summarize< - TAdapter extends AIAdapter + TAdapter extends AIAdapter, >( - options: Omit & { - adapter: TAdapter; - model: ExtractModelsFromAdapter; - text: string; - } + options: Omit & { + adapter: TAdapter + model: ExtractModelsFromAdapter + text: string + }, ): Promise { - const { adapter, model, ...restOptions } = options; + const { adapter, model, ...restOptions } = options return adapter.summarize({ ...restOptions, model: model as string, - }); + }) } diff --git a/packages/typescript/ai/src/event-client.ts b/packages/typescript/ai/src/event-client.ts index cd619e3e5..a82f40f6a 100644 --- a/packages/typescript/ai/src/event-client.ts +++ b/packages/typescript/ai/src/event-client.ts @@ -1,359 +1,359 @@ -import { EventClient } from "@tanstack/devtools-event-client"; - -/** - * Tool call states - track the lifecycle of a tool call - * Must match @tanstack/ai-client ToolCallState - */ -export type ToolCallState = - | "awaiting-input" // Received start but no arguments yet - | "input-streaming" // Partial arguments received - | "input-complete" // All arguments received - | "approval-requested" // Waiting for user approval - | "approval-responded"; // User has approved/denied - -/** - * Tool result states - track the lifecycle of a tool result - * Must match @tanstack/ai-client ToolResultState - */ -export type ToolResultState = - | "streaming" // Placeholder for future streamed output - | "complete" // Result is complete - | "error"; // Error occurred - -export interface AIDevtoolsEventMap { - // AI Stream events - from @tanstack/ai package - "tanstack-ai-devtools:stream:started": { - streamId: string; - model: string; - provider: string; - timestamp: number; - clientId?: string; - }; - "tanstack-ai-devtools:stream:chunk:content": { - streamId: string; - messageId?: string; - content: string; - delta?: string; - timestamp: number; - }; - "tanstack-ai-devtools:stream:chunk:tool-call": { - streamId: string; - messageId?: string; - toolCallId: string; - toolName: string; - index: number; - arguments: string; - timestamp: number; - }; - "tanstack-ai-devtools:stream:chunk:tool-result": { - streamId: string; - messageId?: string; - toolCallId: string; - result: string; - timestamp: number; - }; - "tanstack-ai-devtools:stream:chunk:done": { - streamId: string; - messageId?: string; - finishReason: string | null; - usage?: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; - timestamp: number; - }; - "tanstack-ai-devtools:stream:chunk:error": { - streamId: string; - messageId?: string; - error: string; - timestamp: number; - }; - "tanstack-ai-devtools:stream:chunk:thinking": { - streamId: string; - messageId?: string; - content: string; - delta?: string; - timestamp: number; - }; - "tanstack-ai-devtools:stream:approval-requested": { - streamId: string; - messageId?: string; - toolCallId: string; - toolName: string; - input: any; - approvalId: string; - timestamp: number; - }; - "tanstack-ai-devtools:stream:tool-input-available": { - streamId: string; - toolCallId: string; - toolName: string; - input: any; - timestamp: number; - }; - "tanstack-ai-devtools:tool:call-completed": { - streamId: string; - toolCallId: string; - toolName: string; - result: any; - duration: number; - timestamp: number; - }; - "tanstack-ai-devtools:stream:ended": { - streamId: string; - totalChunks: number; - duration: number; - timestamp: number; - }; - "tanstack-ai-devtools:chat:started": { - requestId: string; - model: string; - messageCount: number; - hasTools: boolean; - streaming: boolean; - timestamp: number; - clientId?: string; - toolNames?: string[]; - options?: Record; - providerOptions?: Record; - }; - "tanstack-ai-devtools:chat:completed": { - requestId: string; - model: string; - content: string; - messageId?: string; - finishReason?: string; - usage?: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; - timestamp: number; - }; - "tanstack-ai-devtools:chat:iteration": { - requestId: string; - iterationNumber: number; - messageCount: number; - toolCallCount: number; - timestamp: number; - }; - "tanstack-ai-devtools:usage:tokens": { - requestId: string; - model: string; - messageId?: string; - usage: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; - timestamp: number; - }; - "tanstack-ai-devtools:standalone:chat-started": { - adapterName: string; - model: string; - streaming: boolean; - timestamp: number; - }; - "tanstack-ai-devtools:standalone:chat-completion-started": { - adapterName: string; - model: string; - hasOutput: boolean; - timestamp: number; - }; - - // Chat Client events - from @tanstack/ai-client package - "tanstack-ai-devtools:client:created": { - clientId: string; - initialMessageCount: number; - timestamp: number; - }; - "tanstack-ai-devtools:client:message-appended": { - clientId: string; - messageId: string; - role: "user" | "assistant" | "system" | "tool"; - contentPreview: string; - timestamp: number; - }; - "tanstack-ai-devtools:client:message-sent": { - clientId: string; - messageId: string; - content: string; - timestamp: number; - }; - "tanstack-ai-devtools:client:loading-changed": { - clientId: string; - isLoading: boolean; - timestamp: number; - }; - "tanstack-ai-devtools:client:error-changed": { - clientId: string; - error: string | null; - timestamp: number; - }; - "tanstack-ai-devtools:client:messages-cleared": { - clientId: string; - timestamp: number; - }; - "tanstack-ai-devtools:client:reloaded": { - clientId: string; - fromMessageIndex: number; - timestamp: number; - }; - "tanstack-ai-devtools:client:stopped": { - clientId: string; - timestamp: number; - }; - "tanstack-ai-devtools:tool:result-added": { - clientId: string; - toolCallId: string; - toolName: string; - output: any; - state: "output-available" | "output-error"; - timestamp: number; - }; - "tanstack-ai-devtools:tool:approval-responded": { - clientId: string; - approvalId: string; - toolCallId: string; - approved: boolean; - timestamp: number; - }; - "tanstack-ai-devtools:processor:text-updated": { - streamId: string; - content: string; - timestamp: number; - }; - "tanstack-ai-devtools:processor:tool-call-state-changed": { - streamId: string; - toolCallId: string; - toolName: string; - state: ToolCallState; - arguments: any; - timestamp: number; - }; - "tanstack-ai-devtools:processor:tool-result-state-changed": { - streamId: string; - toolCallId: string; - content: any; - state: ToolResultState; - error?: string; - timestamp: number; - }; - "tanstack-ai-devtools:client:assistant-message-updated": { - clientId: string; - messageId: string; - content: string; - timestamp: number; - }; - "tanstack-ai-devtools:client:tool-call-updated": { - clientId: string; - messageId: string; - toolCallId: string; - toolName: string; - state: ToolCallState; - arguments: any; - timestamp: number; - }; - "tanstack-ai-devtools:client:approval-requested": { - clientId: string; - messageId: string; - toolCallId: string; - toolName: string; - input: any; - approvalId: string; - timestamp: number; - }; -} - -// Helper type to strip the prefix at the type level -type StripPrefix = - T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never; - -// Get all event names without the prefix -type EventSuffix = StripPrefix; - -export class AiEventClient extends EventClient { - private eventTarget: EventTarget; - - constructor() { - super({ - pluginId: "tanstack-ai-devtools", - }); - this.eventTarget = new EventTarget(); - } - - /** - * Subscribe to events using both the parent EventClient and EventTarget API - * @param eventSuffix - The event name without the prefix (e.g., "stream:started") - * @param handler - The event handler function - * @param options - Optional configuration for event subscription - * @returns A function to unsubscribe from the event - */ - override on( - eventSuffix: K, - handler: (event: { - type: `tanstack-ai-devtools:${K}`; - payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${K}`]; - }) => void, - options?: { withEventTarget?: boolean } - ): () => void { - const parentUnsubscribe = super.on(eventSuffix, handler); - - const withEventTarget = options?.withEventTarget ?? true; - let eventListener: ((event: Event) => void) | undefined; - - if (withEventTarget) { - // Create a wrapper to handle CustomEvent for EventTarget - eventListener = (event: Event) => { - if (event instanceof CustomEvent) { - handler({ - type: `${eventSuffix}` as `tanstack-ai-devtools:${K}`, - payload: event.detail, - }); - } - }; - - // Add listener to EventTarget - this.eventTarget.addEventListener(eventSuffix, eventListener); - } - - // Return unsubscribe function that cleans up both subscriptions - return () => { - parentUnsubscribe(); - if (withEventTarget && eventListener) { - this.eventTarget.removeEventListener(eventSuffix, eventListener); - } - }; - } - - /** - * Emit an event to both the parent EventClient and the EventTarget - * @param eventSuffix - The event name without the prefix (e.g., "stream:started") - * @param data - The event data - */ - override emit( - eventSuffix: K, - data: AIDevtoolsEventMap[`tanstack-ai-devtools:${K}`] - ): void { - super.emit(eventSuffix, data); - - // Always dispatch to EventTarget (for local listeners) - const customEvent = new CustomEvent(eventSuffix, { - detail: data, - }); - this.eventTarget.dispatchEvent(customEvent); - } - - /** - * Get the underlying EventTarget for advanced use cases - * @returns The EventTarget instance - */ - getEventTarget(): EventTarget { - return this.eventTarget; - } -} - -const aiEventClient = new AiEventClient(); - -export { aiEventClient }; +import { EventClient } from '@tanstack/devtools-event-client' + +/** + * Tool call states - track the lifecycle of a tool call + * Must match @tanstack/ai-client ToolCallState + */ +export type ToolCallState = + | 'awaiting-input' // Received start but no arguments yet + | 'input-streaming' // Partial arguments received + | 'input-complete' // All arguments received + | 'approval-requested' // Waiting for user approval + | 'approval-responded' // User has approved/denied + +/** + * Tool result states - track the lifecycle of a tool result + * Must match @tanstack/ai-client ToolResultState + */ +export type ToolResultState = + | 'streaming' // Placeholder for future streamed output + | 'complete' // Result is complete + | 'error' // Error occurred + +export interface AIDevtoolsEventMap { + // AI Stream events - from @tanstack/ai package + 'tanstack-ai-devtools:stream:started': { + streamId: string + model: string + provider: string + timestamp: number + clientId?: string + } + 'tanstack-ai-devtools:stream:chunk:content': { + streamId: string + messageId?: string + content: string + delta?: string + timestamp: number + } + 'tanstack-ai-devtools:stream:chunk:tool-call': { + streamId: string + messageId?: string + toolCallId: string + toolName: string + index: number + arguments: string + timestamp: number + } + 'tanstack-ai-devtools:stream:chunk:tool-result': { + streamId: string + messageId?: string + toolCallId: string + result: string + timestamp: number + } + 'tanstack-ai-devtools:stream:chunk:done': { + streamId: string + messageId?: string + finishReason: string | null + usage?: { + promptTokens: number + completionTokens: number + totalTokens: number + } + timestamp: number + } + 'tanstack-ai-devtools:stream:chunk:error': { + streamId: string + messageId?: string + error: string + timestamp: number + } + 'tanstack-ai-devtools:stream:chunk:thinking': { + streamId: string + messageId?: string + content: string + delta?: string + timestamp: number + } + 'tanstack-ai-devtools:stream:approval-requested': { + streamId: string + messageId?: string + toolCallId: string + toolName: string + input: any + approvalId: string + timestamp: number + } + 'tanstack-ai-devtools:stream:tool-input-available': { + streamId: string + toolCallId: string + toolName: string + input: any + timestamp: number + } + 'tanstack-ai-devtools:tool:call-completed': { + streamId: string + toolCallId: string + toolName: string + result: any + duration: number + timestamp: number + } + 'tanstack-ai-devtools:stream:ended': { + streamId: string + totalChunks: number + duration: number + timestamp: number + } + 'tanstack-ai-devtools:chat:started': { + requestId: string + model: string + messageCount: number + hasTools: boolean + streaming: boolean + timestamp: number + clientId?: string + toolNames?: Array + options?: Record + providerOptions?: Record + } + 'tanstack-ai-devtools:chat:completed': { + requestId: string + model: string + content: string + messageId?: string + finishReason?: string + usage?: { + promptTokens: number + completionTokens: number + totalTokens: number + } + timestamp: number + } + 'tanstack-ai-devtools:chat:iteration': { + requestId: string + iterationNumber: number + messageCount: number + toolCallCount: number + timestamp: number + } + 'tanstack-ai-devtools:usage:tokens': { + requestId: string + model: string + messageId?: string + usage: { + promptTokens: number + completionTokens: number + totalTokens: number + } + timestamp: number + } + 'tanstack-ai-devtools:standalone:chat-started': { + adapterName: string + model: string + streaming: boolean + timestamp: number + } + 'tanstack-ai-devtools:standalone:chat-completion-started': { + adapterName: string + model: string + hasOutput: boolean + timestamp: number + } + + // Chat Client events - from @tanstack/ai-client package + 'tanstack-ai-devtools:client:created': { + clientId: string + initialMessageCount: number + timestamp: number + } + 'tanstack-ai-devtools:client:message-appended': { + clientId: string + messageId: string + role: 'user' | 'assistant' | 'system' | 'tool' + contentPreview: string + timestamp: number + } + 'tanstack-ai-devtools:client:message-sent': { + clientId: string + messageId: string + content: string + timestamp: number + } + 'tanstack-ai-devtools:client:loading-changed': { + clientId: string + isLoading: boolean + timestamp: number + } + 'tanstack-ai-devtools:client:error-changed': { + clientId: string + error: string | null + timestamp: number + } + 'tanstack-ai-devtools:client:messages-cleared': { + clientId: string + timestamp: number + } + 'tanstack-ai-devtools:client:reloaded': { + clientId: string + fromMessageIndex: number + timestamp: number + } + 'tanstack-ai-devtools:client:stopped': { + clientId: string + timestamp: number + } + 'tanstack-ai-devtools:tool:result-added': { + clientId: string + toolCallId: string + toolName: string + output: any + state: 'output-available' | 'output-error' + timestamp: number + } + 'tanstack-ai-devtools:tool:approval-responded': { + clientId: string + approvalId: string + toolCallId: string + approved: boolean + timestamp: number + } + 'tanstack-ai-devtools:processor:text-updated': { + streamId: string + content: string + timestamp: number + } + 'tanstack-ai-devtools:processor:tool-call-state-changed': { + streamId: string + toolCallId: string + toolName: string + state: ToolCallState + arguments: any + timestamp: number + } + 'tanstack-ai-devtools:processor:tool-result-state-changed': { + streamId: string + toolCallId: string + content: any + state: ToolResultState + error?: string + timestamp: number + } + 'tanstack-ai-devtools:client:assistant-message-updated': { + clientId: string + messageId: string + content: string + timestamp: number + } + 'tanstack-ai-devtools:client:tool-call-updated': { + clientId: string + messageId: string + toolCallId: string + toolName: string + state: ToolCallState + arguments: any + timestamp: number + } + 'tanstack-ai-devtools:client:approval-requested': { + clientId: string + messageId: string + toolCallId: string + toolName: string + input: any + approvalId: string + timestamp: number + } +} + +// Helper type to strip the prefix at the type level +type StripPrefix = + T extends `tanstack-ai-devtools:${infer Suffix}` ? Suffix : never + +// Get all event names without the prefix +type EventSuffix = StripPrefix + +export class AiEventClient extends EventClient { + private eventTarget: EventTarget + + constructor() { + super({ + pluginId: 'tanstack-ai-devtools', + }) + this.eventTarget = new EventTarget() + } + + /** + * Subscribe to events using both the parent EventClient and EventTarget API + * @param eventSuffix - The event name without the prefix (e.g., "stream:started") + * @param handler - The event handler function + * @param options - Optional configuration for event subscription + * @returns A function to unsubscribe from the event + */ + override on( + eventSuffix: TSuffix, + handler: (event: { + type: `tanstack-ai-devtools:${TSuffix}` + payload: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`] + }) => void, + options?: { withEventTarget?: boolean }, + ): () => void { + const parentUnsubscribe = super.on(eventSuffix, handler) + + const withEventTarget = options?.withEventTarget ?? true + let eventListener: ((event: Event) => void) | undefined + + if (withEventTarget) { + // Create a wrapper to handle CustomEvent for EventTarget + eventListener = (event: Event) => { + if (event instanceof CustomEvent) { + handler({ + type: `${eventSuffix}` as `tanstack-ai-devtools:${TSuffix}`, + payload: event.detail, + }) + } + } + + // Add listener to EventTarget + this.eventTarget.addEventListener(eventSuffix, eventListener) + } + + // Return unsubscribe function that cleans up both subscriptions + return () => { + parentUnsubscribe() + if (withEventTarget && eventListener) { + this.eventTarget.removeEventListener(eventSuffix, eventListener) + } + } + } + + /** + * Emit an event to both the parent EventClient and the EventTarget + * @param eventSuffix - The event name without the prefix (e.g., "stream:started") + * @param data - The event data + */ + override emit( + eventSuffix: TSuffix, + data: AIDevtoolsEventMap[`tanstack-ai-devtools:${TSuffix}`], + ): void { + super.emit(eventSuffix, data) + + // Always dispatch to EventTarget (for local listeners) + const customEvent = new CustomEvent(eventSuffix, { + detail: data, + }) + this.eventTarget.dispatchEvent(customEvent) + } + + /** + * Get the underlying EventTarget for advanced use cases + * @returns The EventTarget instance + */ + getEventTarget(): EventTarget { + return this.eventTarget + } +} + +const aiEventClient = new AiEventClient() + +export { aiEventClient } diff --git a/packages/typescript/ai/src/index.ts b/packages/typescript/ai/src/index.ts index a87da647b..941c14506 100644 --- a/packages/typescript/ai/src/index.ts +++ b/packages/typescript/ai/src/index.ts @@ -1,18 +1,18 @@ -export { chat } from "./core/chat"; -export { summarize } from "./core/summarize"; -export { embedding } from "./core/embedding"; -export { tool } from "./tools/tool-utils"; +export { chat } from './core/chat' +export { summarize } from './core/summarize' +export { embedding } from './core/embedding' +export { tool } from './tools/tool-utils' export { toServerSentEventsStream, toStreamResponse, -} from "./utilities/stream-to-response"; -export { BaseAdapter } from "./base-adapter"; -export { ToolCallManager } from "./tools/tool-calls"; +} from './utilities/stream-to-response' +export { BaseAdapter } from './base-adapter' +export { ToolCallManager } from './tools/tool-calls' export { maxIterations, untilFinishReason, combineStrategies, -} from "./utilities/agent-loop-strategies"; -export * from "./types"; -export { chatOptions } from "./utilities/chat-options"; -export { aiEventClient } from "./event-client"; \ No newline at end of file +} from './utilities/agent-loop-strategies' +export * from './types' +export { chatOptions } from './utilities/chat-options' +export { aiEventClient } from './event-client' diff --git a/packages/typescript/ai/src/tools/tool-calls.ts b/packages/typescript/ai/src/tools/tool-calls.ts index 66d4f85db..1753e06e5 100644 --- a/packages/typescript/ai/src/tools/tool-calls.ts +++ b/packages/typescript/ai/src/tools/tool-calls.ts @@ -1,10 +1,10 @@ import type { + DoneStreamChunk, + ModelMessage, Tool, ToolCall, - ModelMessage, - DoneStreamChunk, ToolResultStreamChunk, -} from "../types"; +} from '../types' /** * Manages tool call accumulation and execution for the chat() method's automatic tool execution loop. @@ -39,11 +39,11 @@ import type { * ``` */ export class ToolCallManager { - private toolCallsMap = new Map(); - private tools: ReadonlyArray; + private toolCallsMap = new Map() + private tools: ReadonlyArray constructor(tools: ReadonlyArray) { - this.tools = tools; + this.tools = tools } /** @@ -52,38 +52,38 @@ export class ToolCallManager { */ addToolCallChunk(chunk: { toolCall: { - id: string; - type: "function"; + id: string + type: 'function' function: { - name: string; - arguments: string; - }; - }; - index: number; + name: string + arguments: string + } + } + index: number }): void { - const index = chunk.index ?? 0; - const existing = this.toolCallsMap.get(index); + const index = chunk.index + const existing = this.toolCallsMap.get(index) if (!existing) { // Only create entry if we have a tool call ID and name if (chunk.toolCall.id && chunk.toolCall.function.name) { this.toolCallsMap.set(index, { id: chunk.toolCall.id, - type: "function", + type: 'function', function: { name: chunk.toolCall.function.name, - arguments: chunk.toolCall.function.arguments || "", + arguments: chunk.toolCall.function.arguments || '', }, - }); + }) } } else { // Update name if it wasn't set before if (chunk.toolCall.function.name && !existing.function.name) { - existing.function.name = chunk.toolCall.function.name; + existing.function.name = chunk.toolCall.function.name } // Accumulate arguments for streaming tool calls if (chunk.toolCall.function.arguments) { - existing.function.arguments += chunk.toolCall.function.arguments; + existing.function.arguments += chunk.toolCall.function.arguments } } } @@ -92,16 +92,16 @@ export class ToolCallManager { * Check if there are any complete tool calls to execute */ hasToolCalls(): boolean { - return this.getToolCalls().length > 0; + return this.getToolCalls().length > 0 } /** * Get all complete tool calls (filtered for valid ID and name) */ - getToolCalls(): ToolCall[] { + getToolCalls(): Array { return Array.from(this.toolCallsMap.values()).filter( - (tc) => tc.id && tc.function.name && tc.function.name.trim().length > 0 - ); + (tc) => tc.id && tc.function.name && tc.function.name.trim().length > 0, + ) } /** @@ -109,96 +109,96 @@ export class ToolCallManager { * Also yields tool_result chunks for streaming */ async *executeTools( - doneChunk: DoneStreamChunk - ): AsyncGenerator { - const toolCallsArray = this.getToolCalls(); - const toolResults: ModelMessage[] = []; + doneChunk: DoneStreamChunk, + ): AsyncGenerator, void> { + const toolCallsArray = this.getToolCalls() + const toolResults: Array = [] for (const toolCall of toolCallsArray) { const tool = this.tools.find( - (t) => t.function.name === toolCall.function.name - ); + (t) => t.function.name === toolCall.function.name, + ) - let toolResultContent: string; + let toolResultContent: string if (tool?.execute) { try { // Parse arguments - let args: any; + let args: any try { - args = JSON.parse(toolCall.function.arguments); + args = JSON.parse(toolCall.function.arguments) } catch (parseError) { throw new Error( - `Failed to parse tool arguments as JSON: ${toolCall.function.arguments}` - ); + `Failed to parse tool arguments as JSON: ${toolCall.function.arguments}`, + ) } - const result = await tool.execute(args); + const result = await tool.execute(args) toolResultContent = - typeof result === "string" ? result : JSON.stringify(result); + typeof result === 'string' ? result : JSON.stringify(result) } catch (error: any) { // If tool execution fails, add error message - toolResultContent = `Error executing tool: ${error.message}`; + toolResultContent = `Error executing tool: ${error.message}` } } else { // Tool doesn't have execute function, add placeholder - toolResultContent = `Tool ${toolCall.function.name} does not have an execute function`; + toolResultContent = `Tool ${toolCall.function.name} does not have an execute function` } // Emit tool_result chunk so callers can track tool execution yield { - type: "tool_result", + type: 'tool_result', id: doneChunk.id, model: doneChunk.model, timestamp: Date.now(), toolCallId: toolCall.id, content: toolResultContent, - }; + } // Add tool result message toolResults.push({ - role: "tool", + role: 'tool', content: toolResultContent, toolCallId: toolCall.id, - }); + }) } - return toolResults; + return toolResults } /** * Clear the tool calls map for the next iteration */ clear(): void { - this.toolCallsMap.clear(); + this.toolCallsMap.clear() } } export interface ToolResult { - toolCallId: string; - result: any; - state?: "output-available" | "output-error"; + toolCallId: string + result: any + state?: 'output-available' | 'output-error' } export interface ApprovalRequest { - toolCallId: string; - toolName: string; - input: any; - approvalId: string; + toolCallId: string + toolName: string + input: any + approvalId: string } export interface ClientToolRequest { - toolCallId: string; - toolName: string; - input: any; + toolCallId: string + toolName: string + input: any } export interface ExecuteToolCallsResult { /** Tool results ready to send to LLM */ - results: ToolResult[]; + results: Array /** Tools that need user approval before execution */ - needsApproval: ApprovalRequest[]; + needsApproval: Array /** Tools that need client-side execution */ - needsClientExecution: ClientToolRequest[]; + needsClientExecution: Array } /** @@ -215,43 +215,43 @@ export interface ExecuteToolCallsResult { * @param clientResults - Map of client-side execution results (toolCallId -> result) */ export async function executeToolCalls( - toolCalls: ToolCall[], + toolCalls: Array, tools: ReadonlyArray, approvals: Map = new Map(), - clientResults: Map = new Map() + clientResults: Map = new Map(), ): Promise { - const results: ToolResult[] = []; - const needsApproval: ApprovalRequest[] = []; - const needsClientExecution: ClientToolRequest[] = []; + const results: Array = [] + const needsApproval: Array = [] + const needsClientExecution: Array = [] // Create tool lookup map - const toolMap = new Map(); + const toolMap = new Map() for (const tool of tools) { - toolMap.set(tool.function.name, tool); + toolMap.set(tool.function.name, tool) } for (const toolCall of toolCalls) { - const tool = toolMap.get(toolCall.function.name); + const tool = toolMap.get(toolCall.function.name) if (!tool) { // Unknown tool - return error results.push({ toolCallId: toolCall.id, result: { error: `Unknown tool: ${toolCall.function.name}` }, - state: "output-error", - }); - continue; + state: 'output-error', + }) + continue } // Parse arguments, throwing error if invalid JSON - let input: any = {}; - const argsStr = toolCall.function.arguments?.trim() || "{}"; + let input: any = {} + const argsStr = toolCall.function.arguments.trim() || '{}' if (argsStr) { try { - input = JSON.parse(argsStr); + input = JSON.parse(argsStr) } catch (parseError) { // If parsing fails, throw error to fail fast - throw new Error(`Failed to parse tool arguments as JSON: ${argsStr}`); + throw new Error(`Failed to parse tool arguments as JSON: ${argsStr}`) } } @@ -259,11 +259,11 @@ export async function executeToolCalls( if (!tool.execute) { // Check if tool needs approval if (tool.needsApproval) { - const approvalId = `approval_${toolCall.id}`; + const approvalId = `approval_${toolCall.id}` // Check if approval decision exists if (approvals.has(approvalId)) { - const approved = approvals.get(approvalId); + const approved = approvals.get(approvalId) if (approved) { // Approved - check if client has executed @@ -271,22 +271,22 @@ export async function executeToolCalls( results.push({ toolCallId: toolCall.id, result: clientResults.get(toolCall.id), - }); + }) } else { // Approved but not executed yet - request client execution needsClientExecution.push({ toolCallId: toolCall.id, toolName: toolCall.function.name, input, - }); + }) } } else { // User declined results.push({ toolCallId: toolCall.id, - result: { error: "User declined tool execution" }, - state: "output-error", - }); + result: { error: 'User declined tool execution' }, + state: 'output-error', + }) } } else { // Need approval first @@ -295,7 +295,7 @@ export async function executeToolCalls( toolName: toolCall.function.name, input, approvalId, - }); + }) } } else { // No approval needed - check if client has executed @@ -303,49 +303,49 @@ export async function executeToolCalls( results.push({ toolCallId: toolCall.id, result: clientResults.get(toolCall.id), - }); + }) } else { // Request client execution needsClientExecution.push({ toolCallId: toolCall.id, toolName: toolCall.function.name, input, - }); + }) } } - continue; + continue } // CASE 2: Server tool with approval required if (tool.needsApproval) { - const approvalId = `approval_${toolCall.id}`; + const approvalId = `approval_${toolCall.id}` // Check if approval decision exists if (approvals.has(approvalId)) { - const approved = approvals.get(approvalId); + const approved = approvals.get(approvalId) if (approved) { // Execute after approval try { - const result = await tool.execute(input); + const result = await tool.execute(input) results.push({ toolCallId: toolCall.id, result: result ? JSON.parse(result) : null, - }); + }) } catch (error: any) { results.push({ toolCallId: toolCall.id, result: { error: error.message }, - state: "output-error", - }); + state: 'output-error', + }) } } else { // User declined results.push({ toolCallId: toolCall.id, - result: { error: "User declined tool execution" }, - state: "output-error", - }); + result: { error: 'User declined tool execution' }, + state: 'output-error', + }) } } else { // Need approval @@ -354,26 +354,26 @@ export async function executeToolCalls( toolName: toolCall.function.name, input, approvalId, - }); + }) } - continue; + continue } // CASE 3: Normal server tool - execute immediately try { - const result = await tool.execute(input); + const result = await tool.execute(input) results.push({ toolCallId: toolCall.id, result: result ? JSON.parse(result) : null, - }); + }) } catch (error: any) { results.push({ toolCallId: toolCall.id, result: { error: error.message }, - state: "output-error", - }); + state: 'output-error', + }) } } - return { results, needsApproval, needsClientExecution }; + return { results, needsApproval, needsClientExecution } } diff --git a/packages/typescript/ai/src/tools/tool-utils.ts b/packages/typescript/ai/src/tools/tool-utils.ts index 8b421c677..695913561 100644 --- a/packages/typescript/ai/src/tools/tool-utils.ts +++ b/packages/typescript/ai/src/tools/tool-utils.ts @@ -1,94 +1,102 @@ -import type { Tool } from "../types"; - -/** - * Infer TypeScript type from JSON Schema property type - */ -type InferPropertyType = - T extends { type: "string" } ? string : - T extends { type: "number" } ? number : - T extends { type: "boolean" } ? boolean : - T extends { type: "array" } ? any[] : - T extends { type: "object" } ? Record : - any; - -/** - * Infer argument types from parameters schema - * Makes properties optional unless they're in the required array - */ -type InferArgs< - TProps extends Record, - TRequired extends readonly string[] | undefined -> = TRequired extends readonly string[] - ? { - [K in keyof TProps as K extends TRequired[number] ? K : never]: InferPropertyType - } & { - [K in keyof TProps as K extends TRequired[number] ? never : K]?: InferPropertyType - } - : { - [K in keyof TProps]?: InferPropertyType - }; - -/** - * Helper to define a tool with enforced type safety. - * Automatically infers the execute function argument types from the parameters schema. - * User must provide the full Tool structure with type: "function" and function: {...} - * - * @example - * ```typescript - * const tools = { - * myTool: tool({ - * type: "function", - * function: { - * name: "myTool", - * description: "My tool description", - * parameters: { - * type: "object", - * properties: { - * id: { type: "string", description: "The ID" }, - * optional: { type: "number", description: "Optional param" }, - * }, - * required: ["id"], - * }, - * }, - * execute: async (args) => { - * // ✅ args is automatically typed as { id: string; optional?: number } - * return args.id; - * }, - * }), - * }; - * ``` - */ -export function tool< - const TProps extends Record, - const TRequired extends readonly string[] | undefined ->(config: { - type: "function"; - function: { - name: string; - description: string; - parameters: { - type: "object"; - properties: TProps; - required?: TRequired; - }; - }; - execute: (args: InferArgs) => Promise | string; -}): Tool { - return config as Tool; -} - -/** - * Type helper to extract tool names from a tools object - */ -export type ToolNames = T extends Record - ? N - : never; - -/** - * Type helper to extract a specific tool's argument type - */ -export type ToolArgs = T extends { - execute: (args: infer A) => any; -} - ? A - : never; +import type { Tool } from '../types' + +/** + * Infer TypeScript type from JSON Schema property type + */ +type InferPropertyType = T extends { type: 'string' } + ? string + : T extends { type: 'number' } + ? number + : T extends { type: 'boolean' } + ? boolean + : T extends { type: 'array' } + ? Array + : T extends { type: 'object' } + ? Record + : any + +/** + * Infer argument types from parameters schema + * Makes properties optional unless they're in the required array + */ +type InferArgs< + TProps extends Record, + TRequired extends ReadonlyArray | undefined, +> = + TRequired extends ReadonlyArray + ? { + [K in keyof TProps as K extends TRequired[number] + ? K + : never]: InferPropertyType + } & { + [K in keyof TProps as K extends TRequired[number] + ? never + : K]?: InferPropertyType + } + : { + [K in keyof TProps]?: InferPropertyType + } + +/** + * Helper to define a tool with enforced type safety. + * Automatically infers the execute function argument types from the parameters schema. + * User must provide the full Tool structure with type: "function" and function: {...} + * + * @example + * ```typescript + * const tools = { + * myTool: tool({ + * type: "function", + * function: { + * name: "myTool", + * description: "My tool description", + * parameters: { + * type: "object", + * properties: { + * id: { type: "string", description: "The ID" }, + * optional: { type: "number", description: "Optional param" }, + * }, + * required: ["id"], + * }, + * }, + * execute: async (args) => { + * // ✅ args is automatically typed as { id: string; optional?: number } + * return args.id; + * }, + * }), + * }; + * ``` + */ +export function tool< + const TProps extends Record, + const TRequired extends ReadonlyArray | undefined, +>(config: { + type: 'function' + function: { + name: string + description: string + parameters: { + type: 'object' + properties: TProps + required?: TRequired + } + } + execute: (args: InferArgs) => Promise | string +}): Tool { + return config as Tool +} + +/** + * Type helper to extract tool names from a tools object + */ +export type ToolNames = + T extends Record ? N : never + +/** + * Type helper to extract a specific tool's argument type + */ +export type ToolArgs = T extends { + execute: (args: infer A) => any +} + ? A + : never diff --git a/packages/typescript/ai/src/types.ts b/packages/typescript/ai/src/types.ts index 0851529a0..d929c9d42 100644 --- a/packages/typescript/ai/src/types.ts +++ b/packages/typescript/ai/src/types.ts @@ -1,20 +1,20 @@ -import { CommonOptions } from "./core/chat-common-options"; +import type { CommonOptions } from './core/chat-common-options' export interface ToolCall { - id: string; - type: "function"; + id: string + type: 'function' function: { - name: string; - arguments: string; // JSON string - }; + name: string + arguments: string // JSON string + } } export interface ModelMessage { - role: "system" | "user" | "assistant" | "tool"; - content: string | null; - name?: string; - toolCalls?: ToolCall[]; - toolCallId?: string; + role: 'system' | 'user' | 'assistant' | 'tool' + content: string | null + name?: string + toolCalls?: Array + toolCallId?: string } /** @@ -32,7 +32,7 @@ export interface Tool { * * Future versions may support additional tool types. */ - type: "function"; + type: 'function' /** * Function definition and metadata. @@ -46,7 +46,7 @@ export interface Tool { * * @example "get_weather", "search_database", "sendEmail" */ - name: string; + name: string /** * Clear description of what the function does. @@ -56,7 +56,7 @@ export interface Tool { * * @example "Get the current weather in a given location. Returns temperature, conditions, and forecast." */ - description: string; + description: string /** * JSON Schema describing the function's parameters. @@ -76,8 +76,8 @@ export interface Tool { * required: ["location"] * } */ - parameters: Record; - }; + parameters: Record + } /** * Optional function to execute when the model calls this tool. @@ -96,15 +96,15 @@ export interface Tool { * return JSON.stringify(weather); * } */ - execute?: (args: any) => Promise | string; + execute?: (args: any) => Promise | string /** If true, tool execution requires user approval before running. Works with both server and client tools. */ - needsApproval?: boolean; + needsApproval?: boolean - metadata?: Record; + metadata?: Record } export interface ToolConfig { - [key: string]: Tool; + [key: string]: Tool } /** @@ -127,7 +127,7 @@ export interface ResponseFormat { * * @see https://platform.openai.com/docs/api-reference/chat/create#chat-create-response_format */ - type: "json_object" | "json_schema"; + type: 'json_object' | 'json_schema' /** * JSON schema specification (required when type is "json_schema"). @@ -142,7 +142,7 @@ export interface ResponseFormat { * Used to identify the schema in logs and debugging. * Should be descriptive (e.g., "user_profile", "search_results"). */ - name: string; + name: string /** * Optional description of what the schema represents. @@ -151,7 +151,7 @@ export interface ResponseFormat { * * @example "User profile information including name, email, and preferences" */ - description?: string; + description?: string /** * JSON Schema definition for the expected output structure. @@ -173,7 +173,7 @@ export interface ResponseFormat { * additionalProperties: false * } */ - schema: Record; + schema: Record /** * Whether to enforce strict schema validation. @@ -185,8 +185,8 @@ export interface ResponseFormat { * * @see https://platform.openai.com/docs/guides/structured-outputs#strict-mode */ - strict?: boolean; - }; + strict?: boolean + } /** * Type-only property to carry the inferred data type. @@ -196,7 +196,7 @@ export interface ResponseFormat { * * @internal */ - __data?: TData; + __data?: TData } /** @@ -204,11 +204,11 @@ export interface ResponseFormat { */ export interface AgentLoopState { /** Current iteration count (0-indexed) */ - iterationCount: number; + iterationCount: number /** Current messages array */ - messages: ModelMessage[]; + messages: Array /** Finish reason from the last response */ - finishReason: string | null; + finishReason: string | null } /** @@ -223,7 +223,7 @@ export interface AgentLoopState { * const strategy: AgentLoopStrategy = ({ iterationCount }) => iterationCount < 5; * ``` */ -export type AgentLoopStrategy = (state: AgentLoopState) => boolean; +export type AgentLoopStrategy = (state: AgentLoopState) => boolean /** * Options passed into the SDK and further piped to the AI provider. @@ -232,17 +232,17 @@ export interface ChatOptions< TModel extends string = string, TProviderOptionsSuperset extends Record = Record, TOutput extends ResponseFormat | undefined = undefined, - TProviderOptionsForModel = TProviderOptionsSuperset + TProviderOptionsForModel = TProviderOptionsSuperset, > { - model: TModel; - messages: ModelMessage[]; - tools?: Array; - systemPrompts?: string[]; - agentLoopStrategy?: AgentLoopStrategy; - options?: CommonOptions; - providerOptions?: TProviderOptionsForModel; - request?: Request | RequestInit; - output?: TOutput; + model: TModel + messages: Array + tools?: Array + systemPrompts?: Array + agentLoopStrategy?: AgentLoopStrategy + options?: CommonOptions + providerOptions?: TProviderOptionsForModel + request?: Request | RequestInit + output?: TOutput /** * AbortController for request cancellation. * @@ -256,92 +256,92 @@ export interface ChatOptions< * * @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController */ - abortController?: AbortController; + abortController?: AbortController } export type StreamChunkType = - | "content" - | "tool_call" - | "tool_result" - | "done" - | "error" - | "approval-requested" - | "tool-input-available" - | "thinking"; + | 'content' + | 'tool_call' + | 'tool_result' + | 'done' + | 'error' + | 'approval-requested' + | 'tool-input-available' + | 'thinking' export interface BaseStreamChunk { - type: StreamChunkType; - id: string; - model: string; - timestamp: number; + type: StreamChunkType + id: string + model: string + timestamp: number } export interface ContentStreamChunk extends BaseStreamChunk { - type: "content"; - delta: string; // The incremental content token - content: string; // Full accumulated content so far - role?: "assistant"; + type: 'content' + delta: string // The incremental content token + content: string // Full accumulated content so far + role?: 'assistant' } export interface ToolCallStreamChunk extends BaseStreamChunk { - type: "tool_call"; + type: 'tool_call' toolCall: { - id: string; - type: "function"; + id: string + type: 'function' function: { - name: string; - arguments: string; // Incremental JSON arguments - }; - }; - index: number; + name: string + arguments: string // Incremental JSON arguments + } + } + index: number } export interface ToolResultStreamChunk extends BaseStreamChunk { - type: "tool_result"; - toolCallId: string; - content: string; + type: 'tool_result' + toolCallId: string + content: string } export interface DoneStreamChunk extends BaseStreamChunk { - type: "done"; - finishReason: "stop" | "length" | "content_filter" | "tool_calls" | null; + type: 'done' + finishReason: 'stop' | 'length' | 'content_filter' | 'tool_calls' | null usage?: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; + promptTokens: number + completionTokens: number + totalTokens: number + } } export interface ErrorStreamChunk extends BaseStreamChunk { - type: "error"; + type: 'error' error: { - message: string; - code?: string; - }; + message: string + code?: string + } } export interface ApprovalRequestedStreamChunk extends BaseStreamChunk { - type: "approval-requested"; - toolCallId: string; - toolName: string; - input: any; + type: 'approval-requested' + toolCallId: string + toolName: string + input: any approval: { - id: string; - needsApproval: true; - }; + id: string + needsApproval: true + } } export interface ToolInputAvailableStreamChunk extends BaseStreamChunk { - type: "tool-input-available"; - toolCallId: string; - toolName: string; - input: any; + type: 'tool-input-available' + toolCallId: string + toolName: string + input: any } export interface ThinkingStreamChunk extends BaseStreamChunk { - type: "thinking"; - delta?: string; // The incremental thinking token - content: string; // Full accumulated thinking content so far + type: 'thinking' + delta?: string // The incremental thinking token + content: string // Full accumulated thinking content so far } /** @@ -355,62 +355,58 @@ export type StreamChunk = | ErrorStreamChunk | ApprovalRequestedStreamChunk | ToolInputAvailableStreamChunk - | ThinkingStreamChunk; + | ThinkingStreamChunk // Simple streaming format for basic chat completions // Converted to StreamChunk format by convertChatCompletionStream() export interface ChatCompletionChunk { - id: string; - model: string; - content: string; - role?: "assistant"; - finishReason?: "stop" | "length" | "content_filter" | null; + id: string + model: string + content: string + role?: 'assistant' + finishReason?: 'stop' | 'length' | 'content_filter' | null usage?: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; + promptTokens: number + completionTokens: number + totalTokens: number + } } - - - export interface SummarizationOptions { - model: string; - text: string; - maxLength?: number; - style?: "bullet-points" | "paragraph" | "concise"; - focus?: string[]; + model: string + text: string + maxLength?: number + style?: 'bullet-points' | 'paragraph' | 'concise' + focus?: Array } export interface SummarizationResult { - id: string; - model: string; - summary: string; + id: string + model: string + summary: string usage: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; + promptTokens: number + completionTokens: number + totalTokens: number + } } export interface EmbeddingOptions { - model: string; - input: string | string[]; - dimensions?: number; + model: string + input: string | Array + dimensions?: number } export interface EmbeddingResult { - id: string; - model: string; - embeddings: number[][]; + id: string + model: string + embeddings: Array> usage: { - promptTokens: number; - totalTokens: number; - }; + promptTokens: number + totalTokens: number + } } - /** * AI adapter interface with support for endpoint-specific models and provider options. * @@ -427,80 +423,73 @@ export interface EmbeddingResult { * - TVideoProviderOptions: Provider-specific options for video endpoint */ export interface AIAdapter< - TChatModels extends readonly string[] = readonly string[], - TEmbeddingModels extends readonly string[] = readonly string[], + TChatModels extends ReadonlyArray = ReadonlyArray, + TEmbeddingModels extends ReadonlyArray = ReadonlyArray, TChatProviderOptions extends Record = Record, TEmbeddingProviderOptions extends Record = Record, - TModelProviderOptionsByName extends Record = Record + TModelProviderOptionsByName extends Record = Record, > { - name: string; + name: string /** Models that support chat/text completion */ - models: TChatModels; + models: TChatModels /** Models that support embeddings */ - embeddingModels?: TEmbeddingModels; + embeddingModels?: TEmbeddingModels // Type-only properties for provider options inference - _providerOptions?: TChatProviderOptions; // Alias for _chatProviderOptions - _chatProviderOptions?: TChatProviderOptions; - _embeddingProviderOptions?: TEmbeddingProviderOptions; + _providerOptions?: TChatProviderOptions // Alias for _chatProviderOptions + _chatProviderOptions?: TChatProviderOptions + _embeddingProviderOptions?: TEmbeddingProviderOptions /** * Type-only map from model name to its specific provider options. * Used by the core AI types to narrow providerOptions based on the selected model. * Must be provided by all adapters. */ - _modelProviderOptionsByName: TModelProviderOptionsByName; + _modelProviderOptionsByName: TModelProviderOptionsByName // Structured streaming with JSON chunks (supports tool calls and rich content) - chatStream( - options: ChatOptions - ): AsyncIterable; + chatStream: ( + options: ChatOptions, + ) => AsyncIterable // Summarization - summarize(options: SummarizationOptions): Promise; + summarize: (options: SummarizationOptions) => Promise // Embeddings - createEmbeddings(options: EmbeddingOptions): Promise; + createEmbeddings: (options: EmbeddingOptions) => Promise } export interface AIAdapterConfig { - apiKey?: string; - baseUrl?: string; - timeout?: number; - maxRetries?: number; - headers?: Record; + apiKey?: string + baseUrl?: string + timeout?: number + maxRetries?: number + headers?: Record } - export type ChatStreamOptionsUnion< - TAdapter extends AIAdapter -> = TAdapter extends AIAdapter< - infer Models, - any, - any, - any, - infer ModelProviderOptions -> - ? Models[number] extends infer TModel - ? TModel extends string - ? Omit & { - adapter: TAdapter; - model: TModel; - providerOptions?: TModel extends keyof ModelProviderOptions - ? ModelProviderOptions[TModel] - : never; - } - : never - : never - : never; + TAdapter extends AIAdapter, +> = + TAdapter extends AIAdapter< + infer Models, + any, + any, + any, + infer ModelProviderOptions + > + ? Models[number] extends infer TModel + ? TModel extends string + ? Omit & { + adapter: TAdapter + model: TModel + providerOptions?: TModel extends keyof ModelProviderOptions + ? ModelProviderOptions[TModel] + : never + } + : never + : never + : never // Extract types from adapter (updated to 5 generics) -export type ExtractModelsFromAdapter = T extends AIAdapter< - infer M, - any, - any, - any, - any -> - ? M[number] - : never; +export type ExtractModelsFromAdapter = + T extends AIAdapter ? M[number] : never diff --git a/packages/typescript/ai/src/utilities/agent-loop-strategies.ts b/packages/typescript/ai/src/utilities/agent-loop-strategies.ts index 65d1faa19..2f45fab5c 100644 --- a/packages/typescript/ai/src/utilities/agent-loop-strategies.ts +++ b/packages/typescript/ai/src/utilities/agent-loop-strategies.ts @@ -1,4 +1,4 @@ -import type { AgentLoopStrategy } from "../types"; +import type { AgentLoopStrategy } from '../types' /** * Creates a strategy that continues for a maximum number of iterations @@ -18,7 +18,7 @@ import type { AgentLoopStrategy } from "../types"; * ``` */ export function maxIterations(max: number): AgentLoopStrategy { - return ({ iterationCount }) => iterationCount < max; + return ({ iterationCount }) => iterationCount < max } /** @@ -38,19 +38,21 @@ export function maxIterations(max: number): AgentLoopStrategy { * }); * ``` */ -export function untilFinishReason(stopReasons: string[]): AgentLoopStrategy { +export function untilFinishReason( + stopReasons: Array, +): AgentLoopStrategy { return ({ finishReason, iterationCount }) => { // Always allow at least one iteration - if (iterationCount === 0) return true; + if (iterationCount === 0) return true // Stop if we hit a stop reason if (finishReason && stopReasons.includes(finishReason)) { - return false; + return false } // Otherwise continue - return true; - }; + return true + } } /** @@ -75,9 +77,9 @@ export function untilFinishReason(stopReasons: string[]): AgentLoopStrategy { * ``` */ export function combineStrategies( - strategies: AgentLoopStrategy[] + strategies: Array, ): AgentLoopStrategy { return (state) => { - return strategies.every((strategy) => strategy(state)); - }; + return strategies.every((strategy) => strategy(state)) + } } diff --git a/packages/typescript/ai/src/utilities/chat-options.ts b/packages/typescript/ai/src/utilities/chat-options.ts index 2916cc085..39d3045cc 100644 --- a/packages/typescript/ai/src/utilities/chat-options.ts +++ b/packages/typescript/ai/src/utilities/chat-options.ts @@ -1,27 +1,35 @@ -import { AIAdapter, ChatStreamOptionsUnion } from "../types"; - -export function chatOptions< - TAdapter extends AIAdapter, - const TModel extends TAdapter extends AIAdapter - ? Models[number] - : string ->( - options: Omit, "providerOptions" | "model" | "messages" | "abortController"> & { - adapter: TAdapter; - model: TModel; - providerOptions?: TAdapter extends AIAdapter< - any, - any, - any, - any, - infer ModelProviderOptions - > - ? TModel extends keyof ModelProviderOptions - ? ModelProviderOptions[TModel] - : never - : never; - } -): typeof options { - return options; -} - +import type { AIAdapter, ChatStreamOptionsUnion } from '../types' + +export function chatOptions< + TAdapter extends AIAdapter, + const TModel extends TAdapter extends AIAdapter< + infer Models, + any, + any, + any, + any + > + ? Models[number] + : string, +>( + options: Omit< + ChatStreamOptionsUnion, + 'providerOptions' | 'model' | 'messages' | 'abortController' + > & { + adapter: TAdapter + model: TModel + providerOptions?: TAdapter extends AIAdapter< + any, + any, + any, + any, + infer ModelProviderOptions + > + ? TModel extends keyof ModelProviderOptions + ? ModelProviderOptions[TModel] + : never + : never + }, +): typeof options { + return options +} diff --git a/packages/typescript/ai/src/utilities/stream-to-response.ts b/packages/typescript/ai/src/utilities/stream-to-response.ts index 721d1532e..19069204e 100644 --- a/packages/typescript/ai/src/utilities/stream-to-response.ts +++ b/packages/typescript/ai/src/utilities/stream-to-response.ts @@ -1,4 +1,4 @@ -import type { StreamChunk } from "../types"; +import type { StreamChunk } from '../types' /** * Convert a StreamChunk async iterable to a ReadableStream in Server-Sent Events format @@ -21,9 +21,9 @@ import type { StreamChunk } from "../types"; */ export function toServerSentEventsStream( stream: AsyncIterable, - abortController?: AbortController + abortController?: AbortController, ): ReadableStream { - const encoder = new TextEncoder(); + const encoder = new TextEncoder() return new ReadableStream({ async start(controller) { @@ -31,48 +31,48 @@ export function toServerSentEventsStream( for await (const chunk of stream) { // Check if stream was cancelled/aborted if (abortController?.signal.aborted) { - break; + break } // Send each chunk as Server-Sent Events format controller.enqueue( - encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`) - ); + encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`), + ) } // Send completion marker - controller.enqueue(encoder.encode("data: [DONE]\n\n")); - controller.close(); + controller.enqueue(encoder.encode('data: [DONE]\n\n')) + controller.close() } catch (error: any) { // Don't send error if aborted if (abortController?.signal.aborted) { - controller.close(); - return; + controller.close() + return } // Send error chunk controller.enqueue( encoder.encode( `data: ${JSON.stringify({ - type: "error", + type: 'error', error: { - message: error.message || "Unknown error occurred", + message: error.message || 'Unknown error occurred', code: error.code, }, - })}\n\n` - ) - ); - controller.close(); + })}\n\n`, + ), + ) + controller.close() } }, cancel() { // When the ReadableStream is cancelled (e.g., client disconnects), // abort the underlying stream if (abortController) { - abortController.abort(); + abortController.abort() } }, - }); + }) } /** @@ -107,10 +107,10 @@ export function toStreamResponse( return new Response(toServerSentEventsStream(stream, abortController), { ...responseInit, headers: { - "Content-Type": "text/event-stream", - "Cache-Control": "no-cache", - Connection: "keep-alive", + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + Connection: 'keep-alive', ...(headers || {}), }, - }); + }) } diff --git a/packages/typescript/ai/tests/agent-loop-strategies.test.ts b/packages/typescript/ai/tests/agent-loop-strategies.test.ts index 58b214d4d..b41ef3932 100644 --- a/packages/typescript/ai/tests/agent-loop-strategies.test.ts +++ b/packages/typescript/ai/tests/agent-loop-strategies.test.ts @@ -1,188 +1,192 @@ -import { describe, it, expect } from "vitest"; +import { describe, it, expect } from 'vitest' import { maxIterations, untilFinishReason, combineStrategies, -} from "../src/utilities/agent-loop-strategies"; -import type { AgentLoopState } from "../src/types"; +} from '../src/utilities/agent-loop-strategies' +import type { AgentLoopState } from '../src/types' -describe("Agent Loop Strategies", () => { +describe('Agent Loop Strategies', () => { const createState = ( - overrides: Partial = {} + overrides: Partial = {}, ): AgentLoopState => ({ iterationCount: 0, messages: [], finishReason: null, ...overrides, - }); + }) - describe("maxIterations", () => { - it("should continue when below max iterations", () => { - const strategy = maxIterations(5); + describe('maxIterations', () => { + it('should continue when below max iterations', () => { + const strategy = maxIterations(5) - expect(strategy(createState({ iterationCount: 0 }))).toBe(true); - expect(strategy(createState({ iterationCount: 2 }))).toBe(true); - expect(strategy(createState({ iterationCount: 4 }))).toBe(true); - }); + expect(strategy(createState({ iterationCount: 0 }))).toBe(true) + expect(strategy(createState({ iterationCount: 2 }))).toBe(true) + expect(strategy(createState({ iterationCount: 4 }))).toBe(true) + }) - it("should stop when reaching max iterations", () => { - const strategy = maxIterations(5); + it('should stop when reaching max iterations', () => { + const strategy = maxIterations(5) - expect(strategy(createState({ iterationCount: 5 }))).toBe(false); - expect(strategy(createState({ iterationCount: 6 }))).toBe(false); - }); + expect(strategy(createState({ iterationCount: 5 }))).toBe(false) + expect(strategy(createState({ iterationCount: 6 }))).toBe(false) + }) - it("should work with iteration count 0", () => { - const strategy = maxIterations(1); + it('should work with iteration count 0', () => { + const strategy = maxIterations(1) - expect(strategy(createState({ iterationCount: 0 }))).toBe(true); - expect(strategy(createState({ iterationCount: 1 }))).toBe(false); - }); + expect(strategy(createState({ iterationCount: 0 }))).toBe(true) + expect(strategy(createState({ iterationCount: 1 }))).toBe(false) + }) - it("should work with max = 0 (never iterate)", () => { - const strategy = maxIterations(0); + it('should work with max = 0 (never iterate)', () => { + const strategy = maxIterations(0) - expect(strategy(createState({ iterationCount: 0 }))).toBe(false); - }); - }); + expect(strategy(createState({ iterationCount: 0 }))).toBe(false) + }) + }) - describe("untilFinishReason", () => { - it("should continue on first iteration even with matching finish reason", () => { - const strategy = untilFinishReason(["stop"]); + describe('untilFinishReason', () => { + it('should continue on first iteration even with matching finish reason', () => { + const strategy = untilFinishReason(['stop']) // First iteration always continues expect( - strategy(createState({ iterationCount: 0, finishReason: "stop" })) - ).toBe(true); - }); + strategy(createState({ iterationCount: 0, finishReason: 'stop' })), + ).toBe(true) + }) - it("should stop when finish reason matches", () => { - const strategy = untilFinishReason(["stop", "length"]); + it('should stop when finish reason matches', () => { + const strategy = untilFinishReason(['stop', 'length']) expect( - strategy(createState({ iterationCount: 1, finishReason: "stop" })) - ).toBe(false); + strategy(createState({ iterationCount: 1, finishReason: 'stop' })), + ).toBe(false) expect( - strategy(createState({ iterationCount: 1, finishReason: "length" })) - ).toBe(false); - }); + strategy(createState({ iterationCount: 1, finishReason: 'length' })), + ).toBe(false) + }) - it("should continue when finish reason does not match", () => { - const strategy = untilFinishReason(["stop"]); + it('should continue when finish reason does not match', () => { + const strategy = untilFinishReason(['stop']) expect( - strategy(createState({ iterationCount: 1, finishReason: "tool_calls" })) - ).toBe(true); + strategy( + createState({ iterationCount: 1, finishReason: 'tool_calls' }), + ), + ).toBe(true) expect( - strategy(createState({ iterationCount: 1, finishReason: null })) - ).toBe(true); - }); + strategy(createState({ iterationCount: 1, finishReason: null })), + ).toBe(true) + }) - it("should handle null finish reason", () => { - const strategy = untilFinishReason(["stop"]); + it('should handle null finish reason', () => { + const strategy = untilFinishReason(['stop']) expect( - strategy(createState({ iterationCount: 1, finishReason: null })) - ).toBe(true); - }); + strategy(createState({ iterationCount: 1, finishReason: null })), + ).toBe(true) + }) - it("should work with empty stop reasons array", () => { - const strategy = untilFinishReason([]); + it('should work with empty stop reasons array', () => { + const strategy = untilFinishReason([]) expect( - strategy(createState({ iterationCount: 1, finishReason: "stop" })) - ).toBe(true); + strategy(createState({ iterationCount: 1, finishReason: 'stop' })), + ).toBe(true) expect( - strategy(createState({ iterationCount: 1, finishReason: "length" })) - ).toBe(true); - }); - }); + strategy(createState({ iterationCount: 1, finishReason: 'length' })), + ).toBe(true) + }) + }) - describe("combineStrategies", () => { - it("should return true when all strategies return true", () => { + describe('combineStrategies', () => { + it('should return true when all strategies return true', () => { const strategy = combineStrategies([ maxIterations(5), ({ messages }) => messages.length < 10, - ({ finishReason }) => finishReason !== "stop", - ]); + ({ finishReason }) => finishReason !== 'stop', + ]) expect( - strategy(createState({ iterationCount: 2, messages: [], finishReason: null })) - ).toBe(true); - }); + strategy( + createState({ iterationCount: 2, messages: [], finishReason: null }), + ), + ).toBe(true) + }) - it("should return false if any strategy returns false", () => { + it('should return false if any strategy returns false', () => { const strategy = combineStrategies([ maxIterations(5), ({ messages }) => messages.length < 10, - ]); + ]) // First strategy fails (iterationCount >= 5) - expect( - strategy(createState({ iterationCount: 5, messages: [] })) - ).toBe(false); + expect(strategy(createState({ iterationCount: 5, messages: [] }))).toBe( + false, + ) // Second strategy fails (messages.length >= 10) expect( strategy( createState({ iterationCount: 2, - messages: Array(10).fill({ role: "user", content: "test" }), - }) - ) - ).toBe(false); - }); + messages: Array(10).fill({ role: 'user', content: 'test' }), + }), + ), + ).toBe(false) + }) - it("should work with single strategy", () => { - const strategy = combineStrategies([maxIterations(3)]); + it('should work with single strategy', () => { + const strategy = combineStrategies([maxIterations(3)]) - expect(strategy(createState({ iterationCount: 0 }))).toBe(true); - expect(strategy(createState({ iterationCount: 3 }))).toBe(false); - }); + expect(strategy(createState({ iterationCount: 0 }))).toBe(true) + expect(strategy(createState({ iterationCount: 3 }))).toBe(false) + }) - it("should work with empty strategies array", () => { - const strategy = combineStrategies([]); + it('should work with empty strategies array', () => { + const strategy = combineStrategies([]) // With no strategies, should return true (all strategies passed) - expect(strategy(createState({ iterationCount: 0 }))).toBe(true); - }); + expect(strategy(createState({ iterationCount: 0 }))).toBe(true) + }) - it("should short-circuit on first false", () => { - let secondCalled = false; + it('should short-circuit on first false', () => { + let secondCalled = false const strategy = combineStrategies([ () => false, // Always false () => { - secondCalled = true; - return true; + secondCalled = true + return true }, - ]); + ]) - strategy(createState()); + strategy(createState()) // Second strategy should not be called due to short-circuit - expect(secondCalled).toBe(false); - }); - }); + expect(secondCalled).toBe(false) + }) + }) - describe("Integration scenarios", () => { - it("should combine maxIterations with custom logic", () => { + describe('Integration scenarios', () => { + it('should combine maxIterations with custom logic', () => { const strategy = combineStrategies([ maxIterations(10), ({ messages }) => messages.length < 50, - ({ finishReason }) => finishReason !== "length", - ]); + ({ finishReason }) => finishReason !== 'length', + ]) // All conditions pass expect( strategy( createState({ iterationCount: 5, - messages: Array(20).fill({ role: "user", content: "test" }), - finishReason: "tool_calls", - }) - ) - ).toBe(true); + messages: Array(20).fill({ role: 'user', content: 'test' }), + finishReason: 'tool_calls', + }), + ), + ).toBe(true) // Iteration limit exceeded expect( @@ -191,20 +195,20 @@ describe("Agent Loop Strategies", () => { iterationCount: 10, messages: [], finishReason: null, - }) - ) - ).toBe(false); + }), + ), + ).toBe(false) // Too many messages expect( strategy( createState({ iterationCount: 5, - messages: Array(50).fill({ role: "user", content: "test" }), + messages: Array(50).fill({ role: 'user', content: 'test' }), finishReason: null, - }) - ) - ).toBe(false); + }), + ), + ).toBe(false) // Length finish reason expect( @@ -212,43 +216,47 @@ describe("Agent Loop Strategies", () => { createState({ iterationCount: 5, messages: [], - finishReason: "length", - }) - ) - ).toBe(false); - }); - - it("should handle complex custom strategy", () => { - const customStrategy = ({ iterationCount, messages, finishReason }: AgentLoopState) => { + finishReason: 'length', + }), + ), + ).toBe(false) + }) + + it('should handle complex custom strategy', () => { + const customStrategy = ({ + iterationCount, + messages, + finishReason, + }: AgentLoopState) => { // Allow more iterations if tools are being used const hasToolCalls = messages.some( - (m) => m.toolCalls && m.toolCalls.length > 0 - ); - const maxIters = hasToolCalls ? 10 : 3; + (m) => m.toolCalls && m.toolCalls.length > 0, + ) + const maxIters = hasToolCalls ? 10 : 3 - if (iterationCount >= maxIters) return false; - if (finishReason === "content_filter") return false; + if (iterationCount >= maxIters) return false + if (finishReason === 'content_filter') return false - return true; - }; + return true + } // No tool calls - lower limit expect( customStrategy( createState({ iterationCount: 2, - messages: [{ role: "user", content: "test" }], - }) - ) - ).toBe(true); + messages: [{ role: 'user', content: 'test' }], + }), + ), + ).toBe(true) expect( customStrategy( createState({ iterationCount: 3, - messages: [{ role: "user", content: "test" }], - }) - ) - ).toBe(false); + messages: [{ role: 'user', content: 'test' }], + }), + ), + ).toBe(false) // With tool calls - higher limit expect( @@ -257,40 +265,40 @@ describe("Agent Loop Strategies", () => { iterationCount: 5, messages: [ { - role: "assistant", + role: 'assistant', content: null, toolCalls: [ { - id: "123", - type: "function", - function: { name: "test", arguments: "{}" }, + id: '123', + type: 'function', + function: { name: 'test', arguments: '{}' }, }, ], }, ], - }) - ) - ).toBe(true); + }), + ), + ).toBe(true) expect( customStrategy( createState({ iterationCount: 10, messages: [ { - role: "assistant", + role: 'assistant', content: null, toolCalls: [ { - id: "123", - type: "function", - function: { name: "test", arguments: "{}" }, + id: '123', + type: 'function', + function: { name: 'test', arguments: '{}' }, }, ], }, ], - }) - ) - ).toBe(false); + }), + ), + ).toBe(false) // Content filter always stops expect( @@ -298,11 +306,10 @@ describe("Agent Loop Strategies", () => { createState({ iterationCount: 1, messages: [], - finishReason: "content_filter", - }) - ) - ).toBe(false); - }); - }); -}); - + finishReason: 'content_filter', + }), + ), + ).toBe(false) + }) + }) +}) diff --git a/packages/typescript/ai/tests/ai-abort.test.ts b/packages/typescript/ai/tests/ai-abort.test.ts index 4bf71b4b6..c624909dc 100644 --- a/packages/typescript/ai/tests/ai-abort.test.ts +++ b/packages/typescript/ai/tests/ai-abort.test.ts @@ -1,236 +1,236 @@ -import { describe, it, expect } from "vitest"; -import { chat } from "../src/core/chat"; -import type { ChatOptions, StreamChunk } from "../src/types"; -import { BaseAdapter } from "../src/base-adapter"; +import { describe, it, expect } from 'vitest' +import { chat } from '../src/core/chat' +import type { ChatOptions, StreamChunk } from '../src/types' +import { BaseAdapter } from '../src/base-adapter' // Mock adapter that tracks abort signal usage class MockAdapter extends BaseAdapter< - readonly ["test-model"], + readonly ['test-model'], readonly [], Record, Record, Record > { - public receivedAbortSignals: (AbortSignal | undefined)[] = []; - public chatStreamCallCount = 0; + public receivedAbortSignals: (AbortSignal | undefined)[] = [] + public chatStreamCallCount = 0 - name = "mock"; - models = ["test-model"] as const; + name = 'mock' + models = ['test-model'] as const private getAbortSignal(options: ChatOptions): AbortSignal | undefined { - const signal = (options.request as RequestInit | undefined)?.signal; - return signal ?? undefined; + const signal = (options.request as RequestInit | undefined)?.signal + return signal ?? undefined } async *chatStream(options: ChatOptions): AsyncIterable { - this.chatStreamCallCount++; - const abortSignal = this.getAbortSignal(options); - this.receivedAbortSignals.push(abortSignal); + this.chatStreamCallCount++ + const abortSignal = this.getAbortSignal(options) + this.receivedAbortSignals.push(abortSignal) // Yield some chunks yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Hello", - content: "Hello", - role: "assistant", - }; + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } // Check abort signal during streaming if (abortSignal?.aborted) { - return; + return } yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: " World", - content: "Hello World", - role: "assistant", - }; + delta: ' World', + content: 'Hello World', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } async summarize(_options: any): Promise { - return { summary: "test" }; + return { summary: 'test' } } async createEmbeddings(_options: any): Promise { - return { embeddings: [] }; + return { embeddings: [] } } } -describe("chat() - Abort Signal Handling", () => { - it("should propagate abortSignal to adapter.chatStream()", async () => { - const mockAdapter = new MockAdapter(); +describe('chat() - Abort Signal Handling', () => { + it('should propagate abortSignal to adapter.chatStream()', async () => { + const mockAdapter = new MockAdapter() - const abortController = new AbortController(); - const abortSignal = abortController.signal; + const abortController = new AbortController() + const abortSignal = abortController.signal const stream = chat({ adapter: mockAdapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], abortController, - }); + }) - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of stream) { - chunks.push(chunk); + chunks.push(chunk) } - expect(mockAdapter.chatStreamCallCount).toBe(1); - expect(mockAdapter.receivedAbortSignals[0]).toBe(abortSignal); - }); + expect(mockAdapter.chatStreamCallCount).toBe(1) + expect(mockAdapter.receivedAbortSignals[0]).toBe(abortSignal) + }) - it("should stop streaming when abortSignal is aborted", async () => { - const mockAdapter = new MockAdapter(); + it('should stop streaming when abortSignal is aborted', async () => { + const mockAdapter = new MockAdapter() - const abortController = new AbortController(); + const abortController = new AbortController() const stream = chat({ adapter: mockAdapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], abortController, - }); + }) - const chunks: StreamChunk[] = []; - let chunkCount = 0; + const chunks: StreamChunk[] = [] + let chunkCount = 0 for await (const chunk of stream) { - chunks.push(chunk); - chunkCount++; + chunks.push(chunk) + chunkCount++ // Abort after first chunk if (chunkCount === 1) { - abortController.abort(); + abortController.abort() } } // Should have received at least one chunk before abort - expect(chunks.length).toBeGreaterThan(0); - }); + expect(chunks.length).toBeGreaterThan(0) + }) - it("should check abortSignal before each iteration", async () => { - const mockAdapter = new MockAdapter(); + it('should check abortSignal before each iteration', async () => { + const mockAdapter = new MockAdapter() - const abortController = new AbortController(); + const abortController = new AbortController() // Abort before starting - abortController.abort(); + abortController.abort() const stream = chat({ adapter: mockAdapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], abortController, - }); + }) - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of stream) { - chunks.push(chunk); + chunks.push(chunk) } // Should not yield any chunks if aborted before start - expect(chunks.length).toBe(0); - expect(mockAdapter.chatStreamCallCount).toBe(0); - }); + expect(chunks.length).toBe(0) + expect(mockAdapter.chatStreamCallCount).toBe(0) + }) - it("should check abortSignal before tool execution", async () => { - const abortController = new AbortController(); + it('should check abortSignal before tool execution', async () => { + const abortController = new AbortController() // Create adapter that yields tool_calls class ToolCallAdapter extends MockAdapter { async *chatStream(_options: ChatOptions): AsyncIterable { yield { - type: "tool_call", - id: "test-id", - model: "test-model", + type: 'tool_call', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "test_tool", - arguments: "{}", + name: 'test_tool', + arguments: '{}', }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const toolAdapter = new ToolCallAdapter(); + const toolAdapter = new ToolCallAdapter() const stream = chat({ adapter: toolAdapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], tools: [ { - type: "function", + type: 'function', function: { - name: "test_tool", - description: "Test tool", + name: 'test_tool', + description: 'Test tool', parameters: {}, }, }, ], abortController, - }); + }) - const chunks: StreamChunk[] = []; - let chunkCount = 0; + const chunks: StreamChunk[] = [] + let chunkCount = 0 for await (const chunk of stream) { - chunks.push(chunk); - chunkCount++; + chunks.push(chunk) + chunkCount++ // Abort after receiving tool_call chunk - if (chunk.type === "tool_call") { - abortController.abort(); + if (chunk.type === 'tool_call') { + abortController.abort() } } // Should have received tool_call chunk but stopped before tool execution - expect(chunks.length).toBeGreaterThan(0); - }); + expect(chunks.length).toBeGreaterThan(0) + }) - it("should handle undefined abortSignal gracefully", async () => { - const mockAdapter = new MockAdapter(); + it('should handle undefined abortSignal gracefully', async () => { + const mockAdapter = new MockAdapter() const stream = chat({ adapter: mockAdapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - }); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + }) - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of stream) { - chunks.push(chunk); + chunks.push(chunk) } - expect(mockAdapter.chatStreamCallCount).toBe(1); - expect(mockAdapter.receivedAbortSignals[0]).toBeUndefined(); - expect(chunks.length).toBeGreaterThan(0); - }); -}); + expect(mockAdapter.chatStreamCallCount).toBe(1) + expect(mockAdapter.receivedAbortSignals[0]).toBeUndefined() + expect(chunks.length).toBeGreaterThan(0) + }) +}) diff --git a/packages/typescript/ai/tests/ai-chat.test.ts b/packages/typescript/ai/tests/ai-chat.test.ts index fd84e027f..65686c798 100644 --- a/packages/typescript/ai/tests/ai-chat.test.ts +++ b/packages/typescript/ai/tests/ai-chat.test.ts @@ -1,2372 +1,2363 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; -import { chat } from "../src/core/chat"; -import type { - ChatOptions, - StreamChunk, - Tool, - ModelMessage, -} from "../src/types"; -import { BaseAdapter } from "../src/base-adapter"; -import { aiEventClient } from "../src/event-client.js"; -import { maxIterations } from "../src/utilities/agent-loop-strategies"; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { chat } from '../src/core/chat' +import type { ChatOptions, StreamChunk, Tool, ModelMessage } from '../src/types' +import { BaseAdapter } from '../src/base-adapter' +import { aiEventClient } from '../src/event-client.js' +import { maxIterations } from '../src/utilities/agent-loop-strategies' // Mock event client to track events -const eventListeners = new Map>(); -const capturedEvents: Array<{ type: string; data: any }> = []; +const eventListeners = new Map>() +const capturedEvents: Array<{ type: string; data: any }> = [] beforeEach(() => { - eventListeners.clear(); - capturedEvents.length = 0; + eventListeners.clear() + capturedEvents.length = 0 // Mock event client emit - vi.spyOn(aiEventClient, "emit").mockImplementation((event, data) => { - capturedEvents.push({ type: event as string, data }); - const listeners = eventListeners.get(event as string); + vi.spyOn(aiEventClient, 'emit').mockImplementation((event, data) => { + capturedEvents.push({ type: event as string, data }) + const listeners = eventListeners.get(event as string) if (listeners) { - listeners.forEach((listener) => listener(data)); + listeners.forEach((listener) => listener(data)) } - return true; - }); -}); + return true + }) +}) afterEach(() => { - vi.restoreAllMocks(); -}); + vi.restoreAllMocks() +}) // Mock adapter base class with consistent tracking helper class MockAdapter extends BaseAdapter< - readonly ["test-model"], + readonly ['test-model'], readonly [], Record, Record, Record > { - public chatStreamCallCount = 0; + public chatStreamCallCount = 0 public chatStreamCalls: Array<{ - model: string; - messages: ModelMessage[]; - tools?: Tool[]; - request?: ChatOptions["request"]; - providerOptions?: any; - }> = []; + model: string + messages: ModelMessage[] + tools?: Tool[] + request?: ChatOptions['request'] + providerOptions?: any + }> = [] - name = "mock"; - models = ["test-model"] as const; + name = 'mock' + models = ['test-model'] as const // Helper method for consistent tracking when subclasses override chatStream protected trackStreamCall(options: ChatOptions): void { - this.chatStreamCallCount++; + this.chatStreamCallCount++ this.chatStreamCalls.push({ model: options.model, messages: options.messages, tools: options.tools, request: options.request, providerOptions: options.providerOptions, - }); + }) } // Default implementation - will be overridden in tests async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Hello", - content: "Hello", - role: "assistant", - }; + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } async summarize(_options: any): Promise { - return { summary: "test" }; + return { summary: 'test' } } async createEmbeddings(_options: any): Promise { - return { embeddings: [] }; + return { embeddings: [] } } } // Helper to collect all chunks from a stream async function collectChunks(stream: AsyncIterable): Promise { - const chunks: T[] = []; + const chunks: T[] = [] for await (const chunk of stream) { - chunks.push(chunk); + chunks.push(chunk) } - return chunks; + return chunks } -describe("chat() - Comprehensive Logic Path Coverage", () => { - describe("Initialization & Setup", () => { - it("should generate unique request and stream IDs", async () => { - const adapter = new MockAdapter(); +describe('chat() - Comprehensive Logic Path Coverage', () => { + describe('Initialization & Setup', () => { + it('should generate unique request and stream IDs', async () => { + const adapter = new MockAdapter() const stream1 = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - }); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + }) const stream2 = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hi" }], - }); + model: 'test-model', + messages: [{ role: 'user', content: 'Hi' }], + }) const [chunks1, chunks2] = await Promise.all([ collectChunks(stream1), collectChunks(stream2), - ]); + ]) - const event1 = capturedEvents.find((e) => e.type === "chat:started"); + const event1 = capturedEvents.find((e) => e.type === 'chat:started') const event2 = capturedEvents .slice() .reverse() - .find((e) => e.type === "chat:started"); + .find((e) => e.type === 'chat:started') - expect(event1).toBeDefined(); - expect(event2).toBeDefined(); - expect(event1?.data.requestId).not.toBe(event2?.data.requestId); - expect(chunks1.length).toBeGreaterThan(0); - expect(chunks2.length).toBeGreaterThan(0); - }); + expect(event1).toBeDefined() + expect(event2).toBeDefined() + expect(event1?.data.requestId).not.toBe(event2?.data.requestId) + expect(chunks1.length).toBeGreaterThan(0) + expect(chunks2.length).toBeGreaterThan(0) + }) - it("should emit chat:started event with correct data", async () => { - const adapter = new MockAdapter(); + it('should emit chat:started event with correct data', async () => { + const adapter = new MockAdapter() await collectChunks( chat({ adapter, - model: "test-model", + model: 'test-model', messages: [ - { role: "user", content: "Hello" }, - { role: "user", content: "Hi" }, + { role: 'user', content: 'Hello' }, + { role: 'user', content: 'Hi' }, ], tools: [ { - type: "function", - function: { name: "test", description: "test", parameters: {} }, + type: 'function', + function: { name: 'test', description: 'test', parameters: {} }, }, ], - }) - ); + }), + ) - const event = capturedEvents.find((e) => e.type === "chat:started"); - expect(event).toBeDefined(); - expect(event?.data.model).toBe("test-model"); - expect(event?.data.messageCount).toBe(2); - expect(event?.data.hasTools).toBe(true); - expect(event?.data.streaming).toBe(true); - }); + const event = capturedEvents.find((e) => e.type === 'chat:started') + expect(event).toBeDefined() + expect(event?.data.model).toBe('test-model') + expect(event?.data.messageCount).toBe(2) + expect(event?.data.hasTools).toBe(true) + expect(event?.data.streaming).toBe(true) + }) - it("should emit stream:started event with correct data", async () => { - const adapter = new MockAdapter(); + it('should emit stream:started event with correct data', async () => { + const adapter = new MockAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + }), + ) - const event = capturedEvents.find((e) => e.type === "stream:started"); - expect(event).toBeDefined(); - expect(event?.data.model).toBe("test-model"); - expect(event?.data.provider).toBe("mock"); - }); + const event = capturedEvents.find((e) => e.type === 'stream:started') + expect(event).toBeDefined() + expect(event?.data.model).toBe('test-model') + expect(event?.data.provider).toBe('mock') + }) - it("should prepend system prompts correctly", async () => { - const adapter = new MockAdapter(); + it('should prepend system prompts correctly', async () => { + const adapter = new MockAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - systemPrompts: ["You are concise"], - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + systemPrompts: ['You are concise'], + }), + ) - const call = adapter.chatStreamCalls[0]; - expect(call.messages[0].role).toBe("system"); - expect(call.messages[0].content).toBe("You are concise"); - expect(call.messages.length).toBe(2); - }); + const call = adapter.chatStreamCalls[0] + expect(call.messages[0].role).toBe('system') + expect(call.messages[0].content).toBe('You are concise') + expect(call.messages.length).toBe(2) + }) - it("should prepend system prompts when provided", async () => { - const adapter = new MockAdapter(); + it('should prepend system prompts when provided', async () => { + const adapter = new MockAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - systemPrompts: ["You are helpful", "You are concise"], - }) - ); - - const call = adapter.chatStreamCalls[0]; - expect(call.messages).toHaveLength(3); - expect(call.messages[0].role).toBe("system"); - expect(call.messages[0].content).toBe("You are helpful"); - expect(call.messages[1].role).toBe("system"); - expect(call.messages[1].content).toBe("You are concise"); - expect(call.messages[2].role).toBe("user"); - }); - - it("should pass providerOptions to adapter", async () => { - const adapter = new MockAdapter(); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + systemPrompts: ['You are helpful', 'You are concise'], + }), + ) + + const call = adapter.chatStreamCalls[0] + expect(call.messages).toHaveLength(3) + expect(call.messages[0].role).toBe('system') + expect(call.messages[0].content).toBe('You are helpful') + expect(call.messages[1].role).toBe('system') + expect(call.messages[1].content).toBe('You are concise') + expect(call.messages[2].role).toBe('user') + }) + + it('should pass providerOptions to adapter', async () => { + const adapter = new MockAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - providerOptions: { customOption: "value" }, - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + providerOptions: { customOption: 'value' }, + }), + ) expect(adapter.chatStreamCalls[0].providerOptions).toEqual({ - customOption: "value", - }); - }); - }); + customOption: 'value', + }) + }) + }) - describe("Content Streaming Paths", () => { - it("should stream simple content without tools", async () => { - const adapter = new MockAdapter(); + describe('Content Streaming Paths', () => { + it('should stream simple content without tools', async () => { + const adapter = new MockAdapter() const stream = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - }); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + }) - const chunks = await collectChunks(stream); + const chunks = await collectChunks(stream) - expect(adapter.chatStreamCallCount).toBe(1); - expect(chunks).toHaveLength(2); - expect(chunks[0].type).toBe("content"); - expect(chunks[1].type).toBe("done"); + expect(adapter.chatStreamCallCount).toBe(1) + expect(chunks).toHaveLength(2) + expect(chunks[0].type).toBe('content') + expect(chunks[1].type).toBe('done') // Check events - expect(capturedEvents.some((e) => e.type === "chat:started")).toBe(true); - expect(capturedEvents.some((e) => e.type === "stream:started")).toBe( - true - ); + expect(capturedEvents.some((e) => e.type === 'chat:started')).toBe(true) + expect(capturedEvents.some((e) => e.type === 'stream:started')).toBe(true) expect( - capturedEvents.some((e) => e.type === "stream:chunk:content") - ).toBe(true); - expect(capturedEvents.some((e) => e.type === "stream:chunk:done")).toBe( - true - ); - expect(capturedEvents.some((e) => e.type === "stream:ended")).toBe(true); - }); - - it("should accumulate content across multiple chunks", async () => { + capturedEvents.some((e) => e.type === 'stream:chunk:content'), + ).toBe(true) + expect(capturedEvents.some((e) => e.type === 'stream:chunk:done')).toBe( + true, + ) + expect(capturedEvents.some((e) => e.type === 'stream:ended')).toBe(true) + }) + + it('should accumulate content across multiple chunks', async () => { class ContentAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Hello", - content: "Hello", - role: "assistant", - }; + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: " World", - content: "Hello World", - role: "assistant", - }; + delta: ' World', + content: 'Hello World', + role: 'assistant', + } yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "!", - content: "Hello World!", - role: "assistant", - }; + delta: '!', + content: 'Hello World!', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } - const adapter = new ContentAdapter(); + const adapter = new ContentAdapter() const stream = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Say hello" }], - }); + model: 'test-model', + messages: [{ role: 'user', content: 'Say hello' }], + }) - const chunks = await collectChunks(stream); - const contentChunks = chunks.filter((c) => c.type === "content"); + const chunks = await collectChunks(stream) + const contentChunks = chunks.filter((c) => c.type === 'content') - expect(contentChunks).toHaveLength(3); - expect((contentChunks[0] as any).content).toBe("Hello"); - expect((contentChunks[1] as any).content).toBe("Hello World"); - expect((contentChunks[2] as any).content).toBe("Hello World!"); + expect(contentChunks).toHaveLength(3) + expect((contentChunks[0] as any).content).toBe('Hello') + expect((contentChunks[1] as any).content).toBe('Hello World') + expect((contentChunks[2] as any).content).toBe('Hello World!') // Check content events const contentEvents = capturedEvents.filter( - (e) => e.type === "stream:chunk:content" - ); - expect(contentEvents).toHaveLength(3); - }); + (e) => e.type === 'stream:chunk:content', + ) + expect(contentEvents).toHaveLength(3) + }) - it("should handle empty content chunks", async () => { + it('should handle empty content chunks', async () => { class EmptyContentAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "", - content: "", - role: "assistant", - }; + delta: '', + content: '', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } - const adapter = new EmptyContentAdapter(); + const adapter = new EmptyContentAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], - }) - ); - - expect(chunks[0].type).toBe("content"); - expect((chunks[0] as any).content).toBe(""); - }); - }); - - describe("Tool Call Paths", () => { - it("should handle single tool call and execute it", async () => { + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], + }), + ) + + expect(chunks[0].type).toBe('content') + expect((chunks[0] as any).content).toBe('') + }) + }) + + describe('Tool Call Paths', () => { + it('should handle single tool call and execute it', async () => { const tool: Tool = { - type: "function", + type: 'function', function: { - name: "get_weather", - description: "Get weather", + name: 'get_weather', + description: 'Get weather', parameters: {}, }, execute: vi.fn(async (args: any) => - JSON.stringify({ temp: 72, location: args.location }) + JSON.stringify({ temp: 72, location: args.location }), ), - }; + } class ToolAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "get_weather", + name: 'get_weather', arguments: '{"location":"Paris"}', }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new ToolAdapter(); + const adapter = new ToolAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Weather?" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Weather?' }], tools: [tool], - }) - ); + }), + ) - expect(tool.execute).toHaveBeenCalledWith({ location: "Paris" }); - expect(adapter.chatStreamCallCount).toBeGreaterThanOrEqual(2); + expect(tool.execute).toHaveBeenCalledWith({ location: 'Paris' }) + expect(adapter.chatStreamCallCount).toBeGreaterThanOrEqual(2) - const toolResultChunks = chunks.filter((c) => c.type === "tool_result"); - expect(toolResultChunks).toHaveLength(1); + const toolResultChunks = chunks.filter((c) => c.type === 'tool_result') + expect(toolResultChunks).toHaveLength(1) // Check events expect( - capturedEvents.some((e) => e.type === "stream:chunk:tool-call") - ).toBe(true); - expect(capturedEvents.some((e) => e.type === "chat:iteration")).toBe( - true - ); - expect(capturedEvents.some((e) => e.type === "tool:call-completed")).toBe( - true - ); - }); - - it("should handle streaming tool call arguments (incremental JSON)", async () => { + capturedEvents.some((e) => e.type === 'stream:chunk:tool-call'), + ).toBe(true) + expect(capturedEvents.some((e) => e.type === 'chat:iteration')).toBe(true) + expect(capturedEvents.some((e) => e.type === 'tool:call-completed')).toBe( + true, + ) + }) + + it('should handle streaming tool call arguments (incremental JSON)', async () => { const tool: Tool = { - type: "function", + type: 'function', function: { - name: "calculate", - description: "Calculate", + name: 'calculate', + description: 'Calculate', parameters: {}, }, execute: vi.fn(async (args: any) => - JSON.stringify({ result: args.a + args.b }) + JSON.stringify({ result: args.a + args.b }), ), - }; + } class StreamingToolAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ // Simulate streaming tool arguments yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "calculate", + name: 'calculate', arguments: '{"a":10,', }, }, index: 0, - }; + } yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "calculate", + name: 'calculate', arguments: '"b":20}', }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Result", - content: "Result", - role: "assistant", - }; + delta: 'Result', + content: 'Result', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new StreamingToolAdapter(); + const adapter = new StreamingToolAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Calculate" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Calculate' }], tools: [tool], - }) - ); + }), + ) // Tool should be executed with complete arguments - expect(tool.execute).toHaveBeenCalledWith({ a: 10, b: 20 }); - const toolResultChunks = chunks.filter((c) => c.type === "tool_result"); - expect(toolResultChunks.length).toBeGreaterThan(0); - }); + expect(tool.execute).toHaveBeenCalledWith({ a: 10, b: 20 }) + const toolResultChunks = chunks.filter((c) => c.type === 'tool_result') + expect(toolResultChunks.length).toBeGreaterThan(0) + }) - it("should handle multiple tool calls in same iteration", async () => { + it('should handle multiple tool calls in same iteration', async () => { const tool1: Tool = { - type: "function", - function: { name: "tool1", description: "Tool 1", parameters: {} }, + type: 'function', + function: { name: 'tool1', description: 'Tool 1', parameters: {} }, execute: vi.fn(async () => JSON.stringify({ result: 1 })), - }; + } const tool2: Tool = { - type: "function", - function: { name: "tool2", description: "Tool 2", parameters: {} }, + type: 'function', + function: { name: 'tool2', description: 'Tool 2', parameters: {} }, execute: vi.fn(async () => JSON.stringify({ result: 2 })), - }; + } class MultipleToolsAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "tool1", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'tool1', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-2", - type: "function", - function: { name: "tool2", arguments: "{}" }, + id: 'call-2', + type: 'function', + function: { name: 'tool2', arguments: '{}' }, }, index: 1, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new MultipleToolsAdapter(); + const adapter = new MultipleToolsAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Use both tools" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Use both tools' }], tools: [tool1, tool2], - }) - ); + }), + ) - expect(tool1.execute).toHaveBeenCalled(); - expect(tool2.execute).toHaveBeenCalled(); + expect(tool1.execute).toHaveBeenCalled() + expect(tool2.execute).toHaveBeenCalled() - const toolResultChunks = chunks.filter((c) => c.type === "tool_result"); - expect(toolResultChunks).toHaveLength(2); + const toolResultChunks = chunks.filter((c) => c.type === 'tool_result') + expect(toolResultChunks).toHaveLength(2) // Check iteration event const iterationEvents = capturedEvents.filter( - (e) => e.type === "chat:iteration" - ); - expect(iterationEvents.length).toBeGreaterThan(0); - expect(iterationEvents[0].data.toolCallCount).toBe(2); - }); + (e) => e.type === 'chat:iteration', + ) + expect(iterationEvents.length).toBeGreaterThan(0) + expect(iterationEvents[0].data.toolCallCount).toBe(2) + }) - it("should handle tool calls with accumulated content", async () => { + it('should handle tool calls with accumulated content', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "ok" })), - }; + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'ok' })), + } class ContentWithToolsAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "content", - id: "test-id-1", - model: "test-model", + type: 'content', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - delta: "Let me", - content: "Let me", - role: "assistant", - }; + delta: 'Let me', + content: 'Let me', + role: 'assistant', + } yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "test_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { // Second iteration should have assistant message with content and tool calls - const messages = options.messages; + const messages = options.messages const assistantMsg = messages.find( - (m) => m.role === "assistant" && m.toolCalls - ); - expect(assistantMsg).toBeDefined(); - expect(assistantMsg?.content).toBe("Let me"); + (m) => m.role === 'assistant' && m.toolCalls, + ) + expect(assistantMsg).toBeDefined() + expect(assistantMsg?.content).toBe('Let me') yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new ContentWithToolsAdapter(); + const adapter = new ContentWithToolsAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); + }), + ) - expect(adapter.chatStreamCallCount).toBe(2); - }); + expect(adapter.chatStreamCallCount).toBe(2) + }) - it("should handle tool calls without accumulated content", async () => { + it('should handle tool calls without accumulated content', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "ok" })), - }; + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'ok' })), + } class NoContentToolsAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ // Only tool call, no content yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "test_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { // Second iteration should have assistant message with null content - const messages = options.messages; + const messages = options.messages const assistantMsg = messages.find( - (m) => m.role === "assistant" && m.toolCalls - ); - expect(assistantMsg?.content).toBeNull(); + (m) => m.role === 'assistant' && m.toolCalls, + ) + expect(assistantMsg?.content).toBeNull() yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new NoContentToolsAdapter(); + const adapter = new NoContentToolsAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); + }), + ) - expect(adapter.chatStreamCallCount).toBe(2); - }); + expect(adapter.chatStreamCallCount).toBe(2) + }) - it("should handle incomplete tool calls (empty name)", async () => { + it('should handle incomplete tool calls (empty name)', async () => { const tool: Tool = { - type: "function", + type: 'function', function: { - name: "test_tool", - description: "Test", + name: 'test_tool', + description: 'Test', parameters: {}, }, execute: vi.fn(), - }; + } class IncompleteToolAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) // Incomplete tool call (empty name) yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "", - arguments: "{}", + name: '', + arguments: '{}', }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new IncompleteToolAdapter(); + const adapter = new IncompleteToolAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); + }), + ) // Should not execute tool (incomplete) - expect(tool.execute).not.toHaveBeenCalled(); + expect(tool.execute).not.toHaveBeenCalled() // Should exit loop since no valid tool calls - expect(adapter.chatStreamCallCount).toBe(1); - }); - }); + expect(adapter.chatStreamCallCount).toBe(1) + }) + }) - describe("Tool Execution Result Paths", () => { - it("should emit tool_result chunks after execution", async () => { + describe('Tool Execution Result Paths', () => { + it('should emit tool_result chunks after execution', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "success" })), - }; + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'success' })), + } class ToolResultAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "test_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new ToolResultAdapter(); + const adapter = new ToolResultAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); + }), + ) - const toolResultChunks = chunks.filter((c) => c.type === "tool_result"); - expect(toolResultChunks).toHaveLength(1); + const toolResultChunks = chunks.filter((c) => c.type === 'tool_result') + expect(toolResultChunks).toHaveLength(1) - const resultChunk = toolResultChunks[0] as any; - const result = JSON.parse(resultChunk.content); - expect(result.result).toBe("success"); + const resultChunk = toolResultChunks[0] as any + const result = JSON.parse(resultChunk.content) + expect(result.result).toBe('success') // Check tool:call-completed event const completedEvents = capturedEvents.filter( - (e) => e.type === "tool:call-completed" - ); - expect(completedEvents.length).toBeGreaterThan(0); - }); + (e) => e.type === 'tool:call-completed', + ) + expect(completedEvents.length).toBeGreaterThan(0) + }) - it("should add tool result messages to conversation", async () => { + it('should add tool result messages to conversation', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "ok" })), - }; + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'ok' })), + } class MessageHistoryAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "test_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { // Second iteration should have tool result message - const messages = options.messages; - const toolMessages = messages.filter((m) => m.role === "tool"); - expect(toolMessages.length).toBeGreaterThan(0); - expect(toolMessages[0].toolCallId).toBe("call-1"); + const messages = options.messages + const toolMessages = messages.filter((m) => m.role === 'tool') + expect(toolMessages.length).toBeGreaterThan(0) + expect(toolMessages[0].toolCallId).toBe('call-1') yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new MessageHistoryAdapter(); + const adapter = new MessageHistoryAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); - }); + }), + ) + }) - it("should handle tool execution errors gracefully", async () => { + it('should handle tool execution errors gracefully', async () => { const tool: Tool = { - type: "function", - function: { name: "error_tool", description: "Error", parameters: {} }, + type: 'function', + function: { name: 'error_tool', description: 'Error', parameters: {} }, execute: vi.fn(async () => { - throw new Error("Tool execution failed"); + throw new Error('Tool execution failed') }), - }; + } class ErrorToolAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "error_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'error_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Error occurred", - content: "Error occurred", - role: "assistant", - }; + delta: 'Error occurred', + content: 'Error occurred', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new ErrorToolAdapter(); + const adapter = new ErrorToolAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Call error tool" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Call error tool' }], tools: [tool], - }) - ); + }), + ) - const toolResultChunks = chunks.filter((c) => c.type === "tool_result"); - expect(toolResultChunks).toHaveLength(1); + const toolResultChunks = chunks.filter((c) => c.type === 'tool_result') + expect(toolResultChunks).toHaveLength(1) - const resultChunk = toolResultChunks[0] as any; - const result = JSON.parse(resultChunk.content); - expect(result.error).toBe("Tool execution failed"); - }); + const resultChunk = toolResultChunks[0] as any + const result = JSON.parse(resultChunk.content) + expect(result.error).toBe('Tool execution failed') + }) - it("should handle unknown tool calls", async () => { + it('should handle unknown tool calls', async () => { class UnknownToolAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "unknown_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'unknown_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new UnknownToolAdapter(); + const adapter = new UnknownToolAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [ { - type: "function", + type: 'function', function: { - name: "known_tool", - description: "Known", + name: 'known_tool', + description: 'Known', parameters: {}, }, }, ], - }) - ); + }), + ) // Should still produce a tool_result with error - const toolResultChunks = chunks.filter((c) => c.type === "tool_result"); - expect(toolResultChunks.length).toBeGreaterThan(0); + const toolResultChunks = chunks.filter((c) => c.type === 'tool_result') + expect(toolResultChunks.length).toBeGreaterThan(0) - const resultChunk = toolResultChunks[0] as any; - const result = JSON.parse(resultChunk.content); - expect(result.error).toContain("Unknown tool"); - }); - }); + const resultChunk = toolResultChunks[0] as any + const result = JSON.parse(resultChunk.content) + expect(result.error).toContain('Unknown tool') + }) + }) - describe("Approval & Client Tool Paths", () => { - it("should handle approval-required tools", async () => { + describe('Approval & Client Tool Paths', () => { + it('should handle approval-required tools', async () => { const tool: Tool = { - type: "function", + type: 'function', function: { - name: "delete_file", - description: "Delete", + name: 'delete_file', + description: 'Delete', parameters: {}, }, needsApproval: true, execute: vi.fn(async () => JSON.stringify({ success: true })), - }; + } class ApprovalAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "delete_file", + name: 'delete_file', arguments: '{"path":"/tmp/test.txt"}', }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new ApprovalAdapter(); + const adapter = new ApprovalAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Delete file" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Delete file' }], tools: [tool], - }) - ); + }), + ) const approvalChunks = chunks.filter( - (c) => c.type === "approval-requested" - ); - expect(approvalChunks).toHaveLength(1); + (c) => c.type === 'approval-requested', + ) + expect(approvalChunks).toHaveLength(1) - const approvalChunk = approvalChunks[0] as any; - expect(approvalChunk.toolName).toBe("delete_file"); - expect(approvalChunk.approval.needsApproval).toBe(true); + const approvalChunk = approvalChunks[0] as any + expect(approvalChunk.toolName).toBe('delete_file') + expect(approvalChunk.approval.needsApproval).toBe(true) // Tool should NOT be executed yet - expect(tool.execute).not.toHaveBeenCalled(); + expect(tool.execute).not.toHaveBeenCalled() // Should emit approval-requested event expect( - capturedEvents.some((e) => e.type === "stream:approval-requested") - ).toBe(true); - }); + capturedEvents.some((e) => e.type === 'stream:approval-requested'), + ).toBe(true) + }) - it("should handle client-side tools (no execute)", async () => { + it('should handle client-side tools (no execute)', async () => { const tool: Tool = { - type: "function", + type: 'function', function: { - name: "client_tool", - description: "Client", + name: 'client_tool', + description: 'Client', parameters: {}, }, // No execute function - }; + } class ClientToolAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "client_tool", arguments: '{"input":"test"}' }, + id: 'call-1', + type: 'function', + function: { name: 'client_tool', arguments: '{"input":"test"}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new ClientToolAdapter(); + const adapter = new ClientToolAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Use client tool" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Use client tool' }], tools: [tool], - }) - ); + }), + ) const inputChunks = chunks.filter( - (c) => c.type === "tool-input-available" - ); - expect(inputChunks).toHaveLength(1); + (c) => c.type === 'tool-input-available', + ) + expect(inputChunks).toHaveLength(1) - const inputChunk = inputChunks[0] as any; - expect(inputChunk.toolName).toBe("client_tool"); - expect(inputChunk.input).toEqual({ input: "test" }); + const inputChunk = inputChunks[0] as any + expect(inputChunk.toolName).toBe('client_tool') + expect(inputChunk.input).toEqual({ input: 'test' }) // Should emit tool-input-available event expect( - capturedEvents.some((e) => e.type === "stream:tool-input-available") - ).toBe(true); - }); + capturedEvents.some((e) => e.type === 'stream:tool-input-available'), + ).toBe(true) + }) - it("should handle mixed tools (approval + client + normal)", async () => { + it('should handle mixed tools (approval + client + normal)', async () => { const normalTool: Tool = { - type: "function", - function: { name: "normal", description: "Normal", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "ok" })), - }; + type: 'function', + function: { name: 'normal', description: 'Normal', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'ok' })), + } const approvalTool: Tool = { - type: "function", - function: { name: "approval", description: "Approval", parameters: {} }, + type: 'function', + function: { name: 'approval', description: 'Approval', parameters: {} }, needsApproval: true, execute: vi.fn(async () => JSON.stringify({ success: true })), - }; + } const clientTool: Tool = { - type: "function", - function: { name: "client", description: "Client", parameters: {} }, + type: 'function', + function: { name: 'client', description: 'Client', parameters: {} }, // No execute - }; + } class MixedToolsAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "normal", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'normal', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-2", - type: "function", - function: { name: "approval", arguments: "{}" }, + id: 'call-2', + type: 'function', + function: { name: 'approval', arguments: '{}' }, }, index: 1, - }; + } yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-3", - type: "function", - function: { name: "client", arguments: "{}" }, + id: 'call-3', + type: 'function', + function: { name: 'client', arguments: '{}' }, }, index: 2, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new MixedToolsAdapter(); + const adapter = new MixedToolsAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Use all tools" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Use all tools' }], tools: [normalTool, approvalTool, clientTool], - }) - ); + }), + ) // Normal tool should be executed - expect(normalTool.execute).toHaveBeenCalled(); + expect(normalTool.execute).toHaveBeenCalled() // Approval and client tools should request intervention const approvalChunks = chunks.filter( - (c) => c.type === "approval-requested" - ); + (c) => c.type === 'approval-requested', + ) const inputChunks = chunks.filter( - (c) => c.type === "tool-input-available" - ); + (c) => c.type === 'tool-input-available', + ) - expect(approvalChunks.length + inputChunks.length).toBeGreaterThan(0); + expect(approvalChunks.length + inputChunks.length).toBeGreaterThan(0) // Should stop after emitting approval/client chunks - expect(approvalTool.execute).not.toHaveBeenCalled(); - }); + expect(approvalTool.execute).not.toHaveBeenCalled() + }) - it("should execute pending tool calls before streaming when approvals already exist", async () => { + it('should execute pending tool calls before streaming when approvals already exist', async () => { const toolExecute = vi .fn() - .mockResolvedValue(JSON.stringify({ success: true })); + .mockResolvedValue(JSON.stringify({ success: true })) const approvalTool: Tool = { - type: "function", + type: 'function', function: { - name: "approval_tool", - description: "Needs approval", + name: 'approval_tool', + description: 'Needs approval', parameters: {}, }, needsApproval: true, execute: toolExecute, - }; + } class PendingToolAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) const toolMessage = options.messages.find( - (msg) => msg.role === "tool" - ); - expect(toolMessage).toBeDefined(); - expect(toolMessage?.toolCallId).toBe("call-1"); - expect(toolMessage?.content).toBe(JSON.stringify({ success: true })); + (msg) => msg.role === 'tool', + ) + expect(toolMessage).toBeDefined() + expect(toolMessage?.toolCallId).toBe('call-1') + expect(toolMessage?.content).toBe(JSON.stringify({ success: true })) yield { - type: "content", - id: "done-id", - model: "test-model", + type: 'content', + id: 'done-id', + model: 'test-model', timestamp: Date.now(), - delta: "Finished", - content: "Finished", - role: "assistant", - }; + delta: 'Finished', + content: 'Finished', + role: 'assistant', + } yield { - type: "done", - id: "done-id", - model: "test-model", + type: 'done', + id: 'done-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } - const adapter = new PendingToolAdapter(); + const adapter = new PendingToolAdapter() const messages: ModelMessage[] = [ - { role: "user", content: "Delete file" }, + { role: 'user', content: 'Delete file' }, { - role: "assistant", + role: 'assistant', content: null, toolCalls: [ { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "approval_tool", + name: 'approval_tool', arguments: '{"path":"/tmp/test.txt"}', }, }, ], parts: [ { - type: "tool-call", - id: "call-1", - name: "approval_tool", + type: 'tool-call', + id: 'call-1', + name: 'approval_tool', arguments: '{"path":"/tmp/test.txt"}', - state: "approval-responded", + state: 'approval-responded', approval: { - id: "approval_call-1", + id: 'approval_call-1', needsApproval: true, approved: true, }, }, ], } as any, - ]; + ] const stream = chat({ adapter, - model: "test-model", + model: 'test-model', messages, tools: [approvalTool], - }); + }) - const chunks = await collectChunks(stream); - expect(chunks[0]?.type).toBe("tool_result"); - expect(toolExecute).toHaveBeenCalledWith({ path: "/tmp/test.txt" }); - expect(adapter.chatStreamCallCount).toBe(1); - }); - }); + const chunks = await collectChunks(stream) + expect(chunks[0]?.type).toBe('tool_result') + expect(toolExecute).toHaveBeenCalledWith({ path: '/tmp/test.txt' }) + expect(adapter.chatStreamCallCount).toBe(1) + }) + }) - describe("Agent Loop Strategy Paths", () => { - it("should respect custom agent loop strategy", async () => { + describe('Agent Loop Strategy Paths', () => { + it('should respect custom agent loop strategy', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "ok" })), - }; + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'ok' })), + } class LoopAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration < 3) { - this.iteration++; + this.iteration++ yield { - type: "tool_call", + type: 'tool_call', id: `test-id-${this.iteration}`, - model: "test-model", + model: 'test-model', timestamp: Date.now(), toolCall: { id: `call-${this.iteration}`, - type: "function", - function: { name: "test_tool", arguments: "{}" }, + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", + type: 'done', id: `test-id-${this.iteration}`, - model: "test-model", + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", + type: 'content', id: `test-id-${this.iteration}`, - model: "test-model", + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", + type: 'done', id: `test-id-${this.iteration}`, - model: "test-model", + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new LoopAdapter(); + const adapter = new LoopAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Loop" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Loop' }], tools: [tool], agentLoopStrategy: ({ iterationCount }) => iterationCount < 2, // Max 2 iterations - }) - ); + }), + ) // Should stop after max iterations - expect(adapter.chatStreamCallCount).toBeLessThanOrEqual(3); - }); + expect(adapter.chatStreamCallCount).toBeLessThanOrEqual(3) + }) - it("should use default max iterations strategy (5)", async () => { + it('should use default max iterations strategy (5)', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "ok" })), - }; + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'ok' })), + } class InfiniteLoopAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", + type: 'tool_call', id: `test-id-${this.iteration}`, - model: "test-model", + model: 'test-model', timestamp: Date.now(), toolCall: { id: `call-${this.iteration}`, - type: "function", - function: { name: "test_tool", arguments: "{}" }, + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", + type: 'done', id: `test-id-${this.iteration}`, - model: "test-model", + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; - this.iteration++; + finishReason: 'tool_calls', + } + this.iteration++ } } - const adapter = new InfiniteLoopAdapter(); + const adapter = new InfiniteLoopAdapter() // Consume stream - should stop after 5 iterations (default) - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Loop" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Loop' }], tools: [tool], // No custom strategy - should use default maxIterations(5) })) { - chunks.push(chunk); + chunks.push(chunk) // Safety break - if (chunks.length > 100) break; + if (chunks.length > 100) break } // Should stop at max iterations (5) + 1 initial = 6 calls max - expect(adapter.chatStreamCallCount).toBeLessThanOrEqual(6); - }); + expect(adapter.chatStreamCallCount).toBeLessThanOrEqual(6) + }) it("should exit loop when finishReason is not 'tool_calls'", async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, execute: vi.fn(), - }; + } class StopAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Hello", - content: "Hello", - role: "assistant", - }; + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", // Not tool_calls - }; + finishReason: 'stop', // Not tool_calls + } } } - const adapter = new StopAdapter(); + const adapter = new StopAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], tools: [tool], - }) - ); + }), + ) - expect(tool.execute).not.toHaveBeenCalled(); - expect(adapter.chatStreamCallCount).toBe(1); - }); + expect(tool.execute).not.toHaveBeenCalled() + expect(adapter.chatStreamCallCount).toBe(1) + }) - it("should exit loop when no tools provided", async () => { + it('should exit loop when no tools provided', async () => { class NoToolsAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", - id: "test-id", - model: "test-model", + type: 'tool_call', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "unknown_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'unknown_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new NoToolsAdapter(); + const adapter = new NoToolsAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], // No tools provided - }) - ); + }), + ) // Should exit loop since no tools to execute - expect(adapter.chatStreamCallCount).toBe(1); - }); + expect(adapter.chatStreamCallCount).toBe(1) + }) - it("should exit loop when toolCallManager has no tool calls", async () => { + it('should exit loop when toolCallManager has no tool calls', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, execute: vi.fn(), - }; + } class NoToolCallsAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) // Tool call with empty name (invalid) yield { - type: "tool_call", - id: "test-id", - model: "test-model", + type: 'tool_call', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "", arguments: "{}" }, // Empty name + id: 'call-1', + type: 'function', + function: { name: '', arguments: '{}' }, // Empty name }, index: 0, - }; + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new NoToolCallsAdapter(); + const adapter = new NoToolCallsAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); + }), + ) // Should exit loop since no valid tool calls - expect(tool.execute).not.toHaveBeenCalled(); - expect(adapter.chatStreamCallCount).toBe(1); - }); - }); + expect(tool.execute).not.toHaveBeenCalled() + expect(adapter.chatStreamCallCount).toBe(1) + }) + }) - describe("Abort Signal Paths", () => { - it("should check abort signal before starting iteration", async () => { - const adapter = new MockAdapter(); + describe('Abort Signal Paths', () => { + it('should check abort signal before starting iteration', async () => { + const adapter = new MockAdapter() - const abortController = new AbortController(); - abortController.abort(); // Abort before starting + const abortController = new AbortController() + abortController.abort() // Abort before starting const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], abortController, - }) - ); + }), + ) // Should not yield any chunks if aborted before start - expect(chunks.length).toBe(0); - expect(adapter.chatStreamCallCount).toBe(0); - }); + expect(chunks.length).toBe(0) + expect(adapter.chatStreamCallCount).toBe(0) + }) - it("should check abort signal during streaming", async () => { + it('should check abort signal during streaming', async () => { class StreamingAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Chunk 1", - content: "Chunk 1", - role: "assistant", - }; + delta: 'Chunk 1', + content: 'Chunk 1', + role: 'assistant', + } // Abort check happens in chat method between chunks yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Chunk 2", - content: "Chunk 2", - role: "assistant", - }; + delta: 'Chunk 2', + content: 'Chunk 2', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } - const adapter = new StreamingAdapter(); + const adapter = new StreamingAdapter() - const abortController = new AbortController(); + const abortController = new AbortController() const stream = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], abortController, - }); + }) - const chunks: StreamChunk[] = []; - let count = 0; + const chunks: StreamChunk[] = [] + let count = 0 for await (const chunk of stream) { - chunks.push(chunk); - count++; + chunks.push(chunk) + count++ if (count === 1) { - abortController.abort(); + abortController.abort() } } // Should have at least one chunk before abort - expect(chunks.length).toBeGreaterThan(0); - }); + expect(chunks.length).toBeGreaterThan(0) + }) - it("should check abort signal before tool execution", async () => { + it('should check abort signal before tool execution', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, execute: vi.fn(), - }; + } class ToolCallAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", - id: "test-id", - model: "test-model", + type: 'tool_call', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "test_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new ToolCallAdapter(); + const adapter = new ToolCallAdapter() - const abortController = new AbortController(); + const abortController = new AbortController() const stream = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], abortController, - }); + }) - const chunks: StreamChunk[] = []; + const chunks: StreamChunk[] = [] for await (const chunk of stream) { - chunks.push(chunk); - if (chunk.type === "tool_call") { - abortController.abort(); + chunks.push(chunk) + if (chunk.type === 'tool_call') { + abortController.abort() } } // Should not execute tool if aborted - expect(tool.execute).not.toHaveBeenCalled(); - }); - }); + expect(tool.execute).not.toHaveBeenCalled() + }) + }) - describe("Error Handling Paths", () => { - it("should stop on error chunk and return early", async () => { + describe('Error Handling Paths', () => { + it('should stop on error chunk and return early', async () => { class ErrorAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Hello", - content: "Hello", - role: "assistant", - }; + delta: 'Hello', + content: 'Hello', + role: 'assistant', + } yield { - type: "error", - id: "test-id", - model: "test-model", + type: 'error', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), error: { - message: "API error occurred", - code: "API_ERROR", + message: 'API error occurred', + code: 'API_ERROR', }, - }; + } // These should never be yielded yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - } as any; + finishReason: 'stop', + } as any } } - const adapter = new ErrorAdapter(); + const adapter = new ErrorAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + }), + ) // Should stop at error chunk - expect(chunks).toHaveLength(2); - expect(chunks[0].type).toBe("content"); - expect(chunks[1].type).toBe("error"); - expect((chunks[1] as any).error.message).toBe("API error occurred"); + expect(chunks).toHaveLength(2) + expect(chunks[0].type).toBe('content') + expect(chunks[1].type).toBe('error') + expect((chunks[1] as any).error.message).toBe('API error occurred') // Should emit error event - expect(capturedEvents.some((e) => e.type === "stream:chunk:error")).toBe( - true - ); + expect(capturedEvents.some((e) => e.type === 'stream:chunk:error')).toBe( + true, + ) // Should NOT emit stream:ended after error const endedEvents = capturedEvents.filter( - (e) => e.type === "stream:ended" - ); - expect(endedEvents).toHaveLength(0); - }); - }); + (e) => e.type === 'stream:ended', + ) + expect(endedEvents).toHaveLength(0) + }) + }) - describe("Finish Reason Paths", () => { + describe('Finish Reason Paths', () => { it("should handle finish reason 'stop'", async () => { class StopFinishAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } - const adapter = new StopFinishAdapter(); + const adapter = new StopFinishAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], + }), + ) - expect((chunks[1] as any).finishReason).toBe("stop"); - expect(adapter.chatStreamCallCount).toBe(1); - }); + expect((chunks[1] as any).finishReason).toBe('stop') + expect(adapter.chatStreamCallCount).toBe(1) + }) it("should handle finish reason 'length'", async () => { class LengthAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Very long", - content: "Very long", - role: "assistant", - }; + delta: 'Very long', + content: 'Very long', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "length", - }; + finishReason: 'length', + } } } - const adapter = new LengthAdapter(); + const adapter = new LengthAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], + }), + ) - expect((chunks[1] as any).finishReason).toBe("length"); - expect(adapter.chatStreamCallCount).toBe(1); - }); + expect((chunks[1] as any).finishReason).toBe('length') + expect(adapter.chatStreamCallCount).toBe(1) + }) - it("should handle finish reason null", async () => { + it('should handle finish reason null', async () => { class NullFinishAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Test", - content: "Test", - role: "assistant", - }; + delta: 'Test', + content: 'Test', + role: 'assistant', + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), finishReason: null, - }; + } } } - const adapter = new NullFinishAdapter(); + const adapter = new NullFinishAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], + }), + ) - expect(chunks.length).toBe(2); - expect((chunks[1] as any).finishReason).toBeNull(); - expect(adapter.chatStreamCallCount).toBe(1); - }); - }); + expect(chunks.length).toBe(2) + expect((chunks[1] as any).finishReason).toBeNull() + expect(adapter.chatStreamCallCount).toBe(1) + }) + }) - describe("Event Emission", () => { - it("should emit all required events in correct order", async () => { - const adapter = new MockAdapter(); + describe('Event Emission', () => { + it('should emit all required events in correct order', async () => { + const adapter = new MockAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + }), + ) - const eventTypes = capturedEvents.map((e) => e.type); + const eventTypes = capturedEvents.map((e) => e.type) // Check event order and presence - expect(eventTypes.includes("chat:started")).toBe(true); - expect(eventTypes.includes("stream:started")).toBe(true); - expect(eventTypes.includes("stream:chunk:content")).toBe(true); - expect(eventTypes.includes("stream:chunk:done")).toBe(true); - expect(eventTypes.includes("stream:ended")).toBe(true); + expect(eventTypes.includes('chat:started')).toBe(true) + expect(eventTypes.includes('stream:started')).toBe(true) + expect(eventTypes.includes('stream:chunk:content')).toBe(true) + expect(eventTypes.includes('stream:chunk:done')).toBe(true) + expect(eventTypes.includes('stream:ended')).toBe(true) // chat:started should come before stream:started - const chatStartedIndex = eventTypes.indexOf("chat:started"); - const streamStartedIndex = eventTypes.indexOf("stream:started"); - expect(chatStartedIndex).toBeLessThan(streamStartedIndex); + const chatStartedIndex = eventTypes.indexOf('chat:started') + const streamStartedIndex = eventTypes.indexOf('stream:started') + expect(chatStartedIndex).toBeLessThan(streamStartedIndex) // stream:ended should come last - const streamEndedIndex = eventTypes.indexOf("stream:ended"); - expect(streamEndedIndex).toBe(eventTypes.length - 1); - }); + const streamEndedIndex = eventTypes.indexOf('stream:ended') + expect(streamEndedIndex).toBe(eventTypes.length - 1) + }) - it("should emit iteration events for tool calls", async () => { + it('should emit iteration events for tool calls', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "ok" })), - }; + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'ok' })), + } class ToolAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "test_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new ToolAdapter(); + const adapter = new ToolAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); + }), + ) // Should emit chat:iteration event const iterationEvents = capturedEvents.filter( - (e) => e.type === "chat:iteration" - ); - expect(iterationEvents.length).toBeGreaterThan(0); - expect(iterationEvents[0].data.iterationNumber).toBe(1); - }); + (e) => e.type === 'chat:iteration', + ) + expect(iterationEvents.length).toBeGreaterThan(0) + expect(iterationEvents[0].data.iterationNumber).toBe(1) + }) - it("should emit stream:ended event after successful completion", async () => { - const adapter = new MockAdapter(); + it('should emit stream:ended event after successful completion', async () => { + const adapter = new MockAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], - }) - ); - - const endedEvent = capturedEvents.find((e) => e.type === "stream:ended"); - expect(endedEvent).toBeDefined(); - expect(endedEvent?.data.totalChunks).toBeGreaterThan(0); - expect(endedEvent?.data.duration).toBeGreaterThanOrEqual(0); - }); - - it("should track total chunk count across iterations", async () => { + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], + }), + ) + + const endedEvent = capturedEvents.find((e) => e.type === 'stream:ended') + expect(endedEvent).toBeDefined() + expect(endedEvent?.data.totalChunks).toBeGreaterThan(0) + expect(endedEvent?.data.duration).toBeGreaterThanOrEqual(0) + }) + + it('should track total chunk count across iterations', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, - execute: vi.fn(async () => JSON.stringify({ result: "ok" })), - }; + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, + execute: vi.fn(async () => JSON.stringify({ result: 'ok' })), + } class MultiIterationAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "content", - id: "test-id-1", - model: "test-model", + type: 'content', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - delta: "Let me", - content: "Let me", - role: "assistant", - }; + delta: 'Let me', + content: 'Let me', + role: 'assistant', + } yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "test_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new MultiIterationAdapter(); + const adapter = new MultiIterationAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); + }), + ) - const endedEvent = capturedEvents.find((e) => e.type === "stream:ended"); - expect(endedEvent).toBeDefined(); + const endedEvent = capturedEvents.find((e) => e.type === 'stream:ended') + expect(endedEvent).toBeDefined() // Should count: 3 chunks from iteration 1 + 2 chunks from iteration 2 + 1 tool_result = 6 - expect(endedEvent?.data.totalChunks).toBeGreaterThanOrEqual(4); - }); - }); + expect(endedEvent?.data.totalChunks).toBeGreaterThanOrEqual(4) + }) + }) - describe("Edge Cases", () => { - it("should handle empty messages array", async () => { - const adapter = new MockAdapter(); + describe('Edge Cases', () => { + it('should handle empty messages array', async () => { + const adapter = new MockAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", + model: 'test-model', messages: [], - }) - ); + }), + ) - expect(chunks.length).toBeGreaterThan(0); - expect(adapter.chatStreamCalls[0].messages).toHaveLength(0); - }); + expect(chunks.length).toBeGreaterThan(0) + expect(adapter.chatStreamCalls[0].messages).toHaveLength(0) + }) - it("should handle empty tools array", async () => { - const adapter = new MockAdapter(); + it('should handle empty tools array', async () => { + const adapter = new MockAdapter() const chunks = await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Hello" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Hello' }], tools: [], - }) - ); + }), + ) - expect(chunks.length).toBeGreaterThan(0); - }); + expect(chunks.length).toBeGreaterThan(0) + }) - it("should handle tool calls with missing ID", async () => { + it('should handle tool calls with missing ID', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, execute: vi.fn(), - }; + } class MissingIdAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", - id: "test-id", - model: "test-model", + type: 'tool_call', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "", // Empty ID - type: "function", - function: { name: "test_tool", arguments: "{}" }, + id: '', // Empty ID + type: 'function', + function: { name: 'test_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new MissingIdAdapter(); + const adapter = new MissingIdAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ); + }), + ) // Tool should not be executed (invalid tool call) - expect(tool.execute).not.toHaveBeenCalled(); - }); + expect(tool.execute).not.toHaveBeenCalled() + }) - it("should handle tool call with invalid JSON arguments", async () => { + it('should handle tool call with invalid JSON arguments', async () => { const tool: Tool = { - type: "function", - function: { name: "test_tool", description: "Test", parameters: {} }, + type: 'function', + function: { name: 'test_tool', description: 'Test', parameters: {} }, execute: vi.fn(), - }; + } class InvalidJsonAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "tool_call", - id: "test-id", - model: "test-model", + type: 'tool_call', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "test_tool", arguments: "invalid json{" }, + id: 'call-1', + type: 'function', + function: { name: 'test_tool', arguments: 'invalid json{' }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } - const adapter = new InvalidJsonAdapter(); + const adapter = new InvalidJsonAdapter() // The executor will throw when parsing invalid JSON // This will cause an unhandled error, but we can test that it throws @@ -2374,620 +2365,618 @@ describe("chat() - Comprehensive Logic Path Coverage", () => { collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Test" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Test' }], tools: [tool], - }) - ) - ).rejects.toThrow(); // Should throw due to JSON parse error in executor - }); - }); + }), + ), + ).rejects.toThrow() // Should throw due to JSON parse error in executor + }) + }) - describe("Tool Result Chunk Events from Adapter", () => { - it("should emit stream:chunk:tool-result event when adapter sends tool_result chunk", async () => { + describe('Tool Result Chunk Events from Adapter', () => { + it('should emit stream:chunk:tool-result event when adapter sends tool_result chunk', async () => { class ToolResultChunkAdapter extends MockAdapter { async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) yield { - type: "content", - id: "test-id", - model: "test-model", + type: 'content', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - delta: "Using tool", - content: "Using tool", - role: "assistant", - }; + delta: 'Using tool', + content: 'Using tool', + role: 'assistant', + } // Adapter sends tool_result chunk directly (from previous execution) yield { - type: "tool_result", - id: "test-id", - model: "test-model", + type: 'tool_result', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - toolCallId: "call-previous", - content: JSON.stringify({ result: "previous result" }), - }; + toolCallId: 'call-previous', + content: JSON.stringify({ result: 'previous result' }), + } yield { - type: "done", - id: "test-id", - model: "test-model", + type: 'done', + id: 'test-id', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } - const adapter = new ToolResultChunkAdapter(); + const adapter = new ToolResultChunkAdapter() await collectChunks( chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Continue" }], - }) - ); + model: 'test-model', + messages: [{ role: 'user', content: 'Continue' }], + }), + ) // Should emit tool-result event for the tool_result chunk from adapter const toolResultEvents = capturedEvents.filter( - (e) => e.type === "stream:chunk:tool-result" - ); - expect(toolResultEvents.length).toBeGreaterThan(0); - expect(toolResultEvents[0].data.toolCallId).toBe("call-previous"); + (e) => e.type === 'stream:chunk:tool-result', + ) + expect(toolResultEvents.length).toBeGreaterThan(0) + expect(toolResultEvents[0].data.toolCallId).toBe('call-previous') expect(toolResultEvents[0].data.result).toBe( - JSON.stringify({ result: "previous result" }) - ); - }); - }); + JSON.stringify({ result: 'previous result' }), + ) + }) + }) - describe("Extract Approvals and Client Tool Results from Messages", () => { - it("should extract approval responses from messages with parts", async () => { + describe('Extract Approvals and Client Tool Results from Messages', () => { + it('should extract approval responses from messages with parts', async () => { const tool: Tool = { - type: "function", + type: 'function', function: { - name: "delete_file", - description: "Delete file", + name: 'delete_file', + description: 'Delete file', parameters: {}, }, needsApproval: true, execute: vi.fn(async () => JSON.stringify({ success: true })), - }; + } class ApprovalResponseAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) // Check if messages have approval response in parts const hasApprovalResponse = options.messages.some((msg) => { - if (msg.role === "assistant" && (msg as any).parts) { - const parts = (msg as any).parts; + if (msg.role === 'assistant' && (msg as any).parts) { + const parts = (msg as any).parts return parts.some( (p: any) => - p.type === "tool-call" && - p.state === "approval-responded" && - p.approval?.approved === true - ); + p.type === 'tool-call' && + p.state === 'approval-responded' && + p.approval?.approved === true, + ) } - return false; - }); + return false + }) if (hasApprovalResponse) { // Messages have approval response - yield tool_calls again to trigger execution // The approval will be extracted from parts and tool will be executed yield { - type: "tool_call", - id: "test-id-2", - model: "test-model", + type: 'tool_call', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "delete_file", + name: 'delete_file', arguments: '{"path":"/tmp/test.txt"}', }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { // First iteration: request approval yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "delete_file", + name: 'delete_file', arguments: '{"path":"/tmp/test.txt"}', }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } } } - const adapter = new ApprovalResponseAdapter(); + const adapter = new ApprovalResponseAdapter() // First call - should request approval const stream1 = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Delete file" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Delete file' }], tools: [tool], - }); + }) - const chunks1 = await collectChunks(stream1); - const approvalChunk = chunks1.find( - (c) => c.type === "approval-requested" - ); - expect(approvalChunk).toBeDefined(); + const chunks1 = await collectChunks(stream1) + const approvalChunk = chunks1.find((c) => c.type === 'approval-requested') + expect(approvalChunk).toBeDefined() // Second call - with approval response in message parts // The approval ID should match the format: approval_${toolCall.id} const messagesWithApproval: ModelMessage[] = [ - { role: "user", content: "Delete file" }, + { role: 'user', content: 'Delete file' }, { - role: "assistant", + role: 'assistant', content: null, toolCalls: [ { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "delete_file", + name: 'delete_file', arguments: '{"path":"/tmp/test.txt"}', }, }, ], parts: [ { - type: "tool-call", - id: "call-1", - name: "delete_file", + type: 'tool-call', + id: 'call-1', + name: 'delete_file', arguments: '{"path":"/tmp/test.txt"}', - state: "approval-responded", + state: 'approval-responded', approval: { - id: "approval_call-1", // Format: approval_${toolCall.id} + id: 'approval_call-1', // Format: approval_${toolCall.id} needsApproval: true, approved: true, // User approved }, }, ], } as any, - ]; + ] const stream2 = chat({ adapter, - model: "test-model", + model: 'test-model', messages: messagesWithApproval, tools: [tool], - }); + }) - await collectChunks(stream2); + await collectChunks(stream2) // Tool should have been executed because approval was provided - expect(tool.execute).toHaveBeenCalledWith({ path: "/tmp/test.txt" }); - }); + expect(tool.execute).toHaveBeenCalledWith({ path: '/tmp/test.txt' }) + }) - it("should extract client tool outputs from messages with parts", async () => { + it('should extract client tool outputs from messages with parts', async () => { const tool: Tool = { - type: "function", + type: 'function', function: { - name: "client_tool", - description: "Client tool", + name: 'client_tool', + description: 'Client tool', parameters: {}, }, // No execute - client-side tool - }; + } class ClientOutputAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ // First iteration: request client execution yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "client_tool", + name: 'client_tool', arguments: '{"input":"test"}', }, }, index: 0, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { // Second iteration: should have client tool output in parts yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Received result", - content: "Received result", - role: "assistant", - }; + delta: 'Received result', + content: 'Received result', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new ClientOutputAdapter(); + const adapter = new ClientOutputAdapter() // First call - should request client execution const stream1 = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "Use client tool" }], + model: 'test-model', + messages: [{ role: 'user', content: 'Use client tool' }], tools: [tool], - }); + }) - const chunks1 = await collectChunks(stream1); - const inputChunk = chunks1.find((c) => c.type === "tool-input-available"); - expect(inputChunk).toBeDefined(); + const chunks1 = await collectChunks(stream1) + const inputChunk = chunks1.find((c) => c.type === 'tool-input-available') + expect(inputChunk).toBeDefined() // Second call - with client tool output in message parts const messagesWithOutput: ModelMessage[] = [ - { role: "user", content: "Use client tool" }, + { role: 'user', content: 'Use client tool' }, { - role: "assistant", + role: 'assistant', content: null, toolCalls: [ { - id: "call-1", - type: "function", + id: 'call-1', + type: 'function', function: { - name: "client_tool", + name: 'client_tool', arguments: '{"input":"test"}', }, }, ], parts: [ { - type: "tool-call", - id: "call-1", - name: "client_tool", + type: 'tool-call', + id: 'call-1', + name: 'client_tool', arguments: '{"input":"test"}', - state: "complete", - output: { result: "client executed", value: 42 }, // Client tool output + state: 'complete', + output: { result: 'client executed', value: 42 }, // Client tool output }, ], } as any, - ]; + ] const stream2 = chat({ adapter, - model: "test-model", + model: 'test-model', messages: messagesWithOutput, tools: [tool], - }); + }) - await collectChunks(stream2); + await collectChunks(stream2) // Should continue to next iteration (tool result extracted from parts) - expect(adapter.chatStreamCallCount).toBeGreaterThan(1); - }); + expect(adapter.chatStreamCallCount).toBeGreaterThan(1) + }) - it("should handle messages with both approval and client tool parts", async () => { + it('should handle messages with both approval and client tool parts', async () => { const approvalTool: Tool = { - type: "function", + type: 'function', function: { - name: "approval_tool", - description: "Approval", + name: 'approval_tool', + description: 'Approval', parameters: {}, }, needsApproval: true, execute: vi.fn(async () => JSON.stringify({ success: true })), - }; + } const clientTool: Tool = { - type: "function", + type: 'function', function: { - name: "client_tool", - description: "Client", + name: 'client_tool', + description: 'Client', parameters: {}, }, // No execute - }; + } class MixedPartsAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) if (this.iteration === 0) { - this.iteration++; + this.iteration++ yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-1", - type: "function", - function: { name: "approval_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'approval_tool', arguments: '{}' }, }, index: 0, - }; + } yield { - type: "tool_call", - id: "test-id-1", - model: "test-model", + type: 'tool_call', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "call-2", - type: "function", - function: { name: "client_tool", arguments: '{"x":1}' }, + id: 'call-2', + type: 'function', + function: { name: 'client_tool', arguments: '{"x":1}' }, }, index: 1, - }; + } yield { - type: "done", - id: "test-id-1", - model: "test-model", + type: 'done', + id: 'test-id-1', + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } } else { yield { - type: "content", - id: "test-id-2", - model: "test-model", + type: 'content', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - delta: "Done", - content: "Done", - role: "assistant", - }; + delta: 'Done', + content: 'Done', + role: 'assistant', + } yield { - type: "done", - id: "test-id-2", - model: "test-model", + type: 'done', + id: 'test-id-2', + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; + finishReason: 'stop', + } } } } - const adapter = new MixedPartsAdapter(); + const adapter = new MixedPartsAdapter() // Call with messages containing both approval response and client tool output in parts const messagesWithBoth: ModelMessage[] = [ - { role: "user", content: "Use both tools" }, + { role: 'user', content: 'Use both tools' }, { - role: "assistant", + role: 'assistant', content: null, toolCalls: [ { - id: "call-1", - type: "function", - function: { name: "approval_tool", arguments: "{}" }, + id: 'call-1', + type: 'function', + function: { name: 'approval_tool', arguments: '{}' }, }, { - id: "call-2", - type: "function", - function: { name: "client_tool", arguments: '{"x":1}' }, + id: 'call-2', + type: 'function', + function: { name: 'client_tool', arguments: '{"x":1}' }, }, ], parts: [ { - type: "tool-call", - id: "call-1", - name: "approval_tool", - arguments: "{}", - state: "approval-responded", + type: 'tool-call', + id: 'call-1', + name: 'approval_tool', + arguments: '{}', + state: 'approval-responded', approval: { - id: "approval_call-1", + id: 'approval_call-1', needsApproval: true, approved: true, }, }, { - type: "tool-call", - id: "call-2", - name: "client_tool", + type: 'tool-call', + id: 'call-2', + name: 'client_tool', arguments: '{"x":1}', - state: "complete", - output: { result: "client result" }, + state: 'complete', + output: { result: 'client result' }, }, ], } as any, - ]; + ] const stream = chat({ adapter, - model: "test-model", + model: 'test-model', messages: messagesWithBoth, tools: [approvalTool, clientTool], - }); + }) - await collectChunks(stream); + await collectChunks(stream) // Approval tool should be executed (approval was provided) - expect(approvalTool.execute).toHaveBeenCalled(); + expect(approvalTool.execute).toHaveBeenCalled() // Should continue with tool results from parts - expect(adapter.chatStreamCallCount).toBeGreaterThan(1); - }); - }); + expect(adapter.chatStreamCallCount).toBeGreaterThan(1) + }) + }) - describe("Temperature Tool Test - Debugging Tool Execution", () => { - it("should execute tool and continue loop when receiving tool_calls finishReason with maxIterations(20)", async () => { + describe('Temperature Tool Test - Debugging Tool Execution', () => { + it('should execute tool and continue loop when receiving tool_calls finishReason with maxIterations(20)', async () => { // Create a tool that returns "70" like the failing test const temperatureTool: Tool = { - type: "function", + type: 'function', function: { - name: "get_temperature", - description: "Get the current temperature in degrees", + name: 'get_temperature', + description: 'Get the current temperature in degrees', parameters: { - type: "object", + type: 'object', properties: {}, required: [], }, }, execute: vi.fn(async (args: any) => { - return "70"; + return '70' }), - }; + } // Create adapter that mimics the failing test output class TemperatureToolAdapter extends MockAdapter { - iteration = 0; + iteration = 0 async *chatStream(options: ChatOptions): AsyncIterable { - this.trackStreamCall(options); + this.trackStreamCall(options) const baseId = `test-${Date.now()}-${Math.random() .toString(36) - .substring(7)}`; + .substring(7)}` if (this.iteration === 0) { // First iteration: emit content chunks, tool_call, then done with tool_calls yield { - type: "content", + type: 'content', id: baseId, - model: "test-model", + model: 'test-model', timestamp: Date.now(), - delta: "I", - content: "I", - role: "assistant", - }; + delta: 'I', + content: 'I', + role: 'assistant', + } yield { - type: "content", + type: 'content', id: baseId, - model: "test-model", + model: 'test-model', timestamp: Date.now(), delta: "'ll help you check the current temperature right away.", content: "I'll help you check the current temperature right away.", - role: "assistant", - }; + role: 'assistant', + } yield { - type: "tool_call", + type: 'tool_call', id: baseId, - model: "test-model", + model: 'test-model', timestamp: Date.now(), toolCall: { - id: "toolu_01D28jUnxcHQ5qqewJ7X6p1K", - type: "function", + id: 'toolu_01D28jUnxcHQ5qqewJ7X6p1K', + type: 'function', function: { - name: "get_temperature", + name: 'get_temperature', // Empty string like in the actual failing test - should be handled gracefully - arguments: "", + arguments: '', }, }, index: 0, - }; + } yield { - type: "done", + type: 'done', id: baseId, - model: "test-model", + model: 'test-model', timestamp: Date.now(), - finishReason: "tool_calls", + finishReason: 'tool_calls', usage: { promptTokens: 0, completionTokens: 48, totalTokens: 48, }, - }; - this.iteration++; + } + this.iteration++ } else { // Second iteration: should receive tool result and respond with "70" // This simulates what should happen after tool execution const toolResults = options.messages.filter( - (m) => m.role === "tool" - ); - expect(toolResults.length).toBeGreaterThan(0); - expect(toolResults[0].content).toBe("70"); + (m) => m.role === 'tool', + ) + expect(toolResults.length).toBeGreaterThan(0) + expect(toolResults[0].content).toBe('70') yield { - type: "content", + type: 'content', id: `${baseId}-2`, - model: "test-model", + model: 'test-model', timestamp: Date.now(), - delta: "The current temperature is 70 degrees.", - content: "The current temperature is 70 degrees.", - role: "assistant", - }; + delta: 'The current temperature is 70 degrees.', + content: 'The current temperature is 70 degrees.', + role: 'assistant', + } yield { - type: "done", + type: 'done', id: `${baseId}-2`, - model: "test-model", + model: 'test-model', timestamp: Date.now(), - finishReason: "stop", - }; - this.iteration++; + finishReason: 'stop', + } + this.iteration++ } } } - const adapter = new TemperatureToolAdapter(); + const adapter = new TemperatureToolAdapter() const stream = chat({ adapter, - model: "test-model", - messages: [{ role: "user", content: "what is the temperature?" }], + model: 'test-model', + messages: [{ role: 'user', content: 'what is the temperature?' }], tools: [temperatureTool], agentLoopStrategy: maxIterations(20), - }); + }) - const chunks = await collectChunks(stream); + const chunks = await collectChunks(stream) - const toolCallChunks = chunks.filter((c) => c.type === "tool_call"); - const toolResultChunks = chunks.filter((c) => c.type === "tool_result"); + const toolCallChunks = chunks.filter((c) => c.type === 'tool_call') + const toolResultChunks = chunks.filter((c) => c.type === 'tool_result') // We should have received tool_call chunks - expect(toolCallChunks.length).toBeGreaterThan(0); + expect(toolCallChunks.length).toBeGreaterThan(0) // The tool should have been executed - expect(temperatureTool.execute).toHaveBeenCalled(); + expect(temperatureTool.execute).toHaveBeenCalled() // We should have tool_result chunks - expect(toolResultChunks.length).toBeGreaterThan(0); + expect(toolResultChunks.length).toBeGreaterThan(0) // The adapter should have been called multiple times (at least 2: initial + after tool execution) - expect(adapter.chatStreamCallCount).toBeGreaterThanOrEqual(2); + expect(adapter.chatStreamCallCount).toBeGreaterThanOrEqual(2) // We should have at least one content chunk with "70" in it - const contentChunks = chunks.filter((c) => c.type === "content"); + const contentChunks = chunks.filter((c) => c.type === 'content') const hasSeventy = contentChunks.some((c) => - (c as any).content?.toLowerCase().includes("70") - ); - expect(hasSeventy).toBe(true); - }); - }); -}); + (c as any).content?.toLowerCase().includes('70'), + ) + expect(hasSeventy).toBe(true) + }) + }) +}) diff --git a/packages/typescript/ai/tests/tool-call-manager.test.ts b/packages/typescript/ai/tests/tool-call-manager.test.ts index 229a0d42e..ac6359f71 100644 --- a/packages/typescript/ai/tests/tool-call-manager.test.ts +++ b/packages/typescript/ai/tests/tool-call-manager.test.ts @@ -1,268 +1,268 @@ -import { describe, it, expect, vi } from "vitest"; -import { ToolCallManager } from "../src/tools/tool-calls"; -import type { Tool, DoneStreamChunk } from "../src/types"; +import { describe, it, expect, vi } from 'vitest' +import { ToolCallManager } from '../src/tools/tool-calls' +import type { Tool, DoneStreamChunk } from '../src/types' -describe("ToolCallManager", () => { +describe('ToolCallManager', () => { const mockDoneChunk: DoneStreamChunk = { - type: "done", - id: "test-id", - model: "gpt-4", + type: 'done', + id: 'test-id', + model: 'gpt-4', timestamp: Date.now(), - finishReason: "tool_calls", - }; + finishReason: 'tool_calls', + } const mockWeatherTool: Tool = { - type: "function", + type: 'function', function: { - name: "get_weather", - description: "Get weather", + name: 'get_weather', + description: 'Get weather', parameters: {}, }, execute: vi.fn(async (args: any) => { - return JSON.stringify({ temp: 72, location: args.location }); + return JSON.stringify({ temp: 72, location: args.location }) }), - }; + } async function collectGeneratorOutput( - generator: AsyncGenerator + generator: AsyncGenerator, ): Promise<{ - chunks: TChunk[]; - result: TResult; + chunks: TChunk[] + result: TResult }> { - const chunks: TChunk[] = []; - let next = await generator.next(); + const chunks: TChunk[] = [] + let next = await generator.next() while (!next.done) { - chunks.push(next.value); - next = await generator.next(); + chunks.push(next.value) + next = await generator.next() } - return { chunks, result: next.value }; + return { chunks, result: next.value } } - it("should accumulate tool call chunks", () => { - const manager = new ToolCallManager([mockWeatherTool]); + it('should accumulate tool call chunks', () => { + const manager = new ToolCallManager([mockWeatherTool]) manager.addToolCallChunk({ toolCall: { - id: "call_123", - type: "function", - function: { name: "get_weather", arguments: '{"loc' }, + id: 'call_123', + type: 'function', + function: { name: 'get_weather', arguments: '{"loc' }, }, index: 0, - }); + }) manager.addToolCallChunk({ toolCall: { - id: "call_123", - type: "function", - function: { name: "", arguments: 'ation":"Paris"}' }, + id: 'call_123', + type: 'function', + function: { name: '', arguments: 'ation":"Paris"}' }, }, index: 0, - }); + }) - const toolCalls = manager.getToolCalls(); - expect(toolCalls).toHaveLength(1); - expect(toolCalls[0].id).toBe("call_123"); - expect(toolCalls[0].function.name).toBe("get_weather"); - expect(toolCalls[0].function.arguments).toBe('{"location":"Paris"}'); - }); + const toolCalls = manager.getToolCalls() + expect(toolCalls).toHaveLength(1) + expect(toolCalls[0].id).toBe('call_123') + expect(toolCalls[0].function.name).toBe('get_weather') + expect(toolCalls[0].function.arguments).toBe('{"location":"Paris"}') + }) - it("should filter out incomplete tool calls", () => { - const manager = new ToolCallManager([mockWeatherTool]); + it('should filter out incomplete tool calls', () => { + const manager = new ToolCallManager([mockWeatherTool]) // Add complete tool call manager.addToolCallChunk({ toolCall: { - id: "call_123", - type: "function", - function: { name: "get_weather", arguments: "{}" }, + id: 'call_123', + type: 'function', + function: { name: 'get_weather', arguments: '{}' }, }, index: 0, - }); + }) // Add incomplete tool call (no name) manager.addToolCallChunk({ toolCall: { - id: "call_456", - type: "function", - function: { name: "", arguments: "{}" }, + id: 'call_456', + type: 'function', + function: { name: '', arguments: '{}' }, }, index: 1, - }); + }) - const toolCalls = manager.getToolCalls(); - expect(toolCalls).toHaveLength(1); - expect(toolCalls[0].id).toBe("call_123"); - }); + const toolCalls = manager.getToolCalls() + expect(toolCalls).toHaveLength(1) + expect(toolCalls[0].id).toBe('call_123') + }) - it("should execute tools and emit tool_result chunks", async () => { - const manager = new ToolCallManager([mockWeatherTool]); + it('should execute tools and emit tool_result chunks', async () => { + const manager = new ToolCallManager([mockWeatherTool]) manager.addToolCallChunk({ toolCall: { - id: "call_123", - type: "function", - function: { name: "get_weather", arguments: '{"location":"Paris"}' }, + id: 'call_123', + type: 'function', + function: { name: 'get_weather', arguments: '{"location":"Paris"}' }, }, index: 0, - }); + }) const { chunks: emittedChunks, result: finalResult } = - await collectGeneratorOutput(manager.executeTools(mockDoneChunk)); + await collectGeneratorOutput(manager.executeTools(mockDoneChunk)) // Should emit one tool_result chunk - expect(emittedChunks).toHaveLength(1); - expect(emittedChunks[0].type).toBe("tool_result"); - expect(emittedChunks[0].toolCallId).toBe("call_123"); - expect(emittedChunks[0].content).toContain("temp"); + expect(emittedChunks).toHaveLength(1) + expect(emittedChunks[0].type).toBe('tool_result') + expect(emittedChunks[0].toolCallId).toBe('call_123') + expect(emittedChunks[0].content).toContain('temp') // Should return one tool result message - expect(finalResult).toHaveLength(1); - expect(finalResult[0].role).toBe("tool"); - expect(finalResult[0].toolCallId).toBe("call_123"); + expect(finalResult).toHaveLength(1) + expect(finalResult[0].role).toBe('tool') + expect(finalResult[0].toolCallId).toBe('call_123') // Tool execute should have been called - expect(mockWeatherTool.execute).toHaveBeenCalledWith({ location: "Paris" }); - }); + expect(mockWeatherTool.execute).toHaveBeenCalledWith({ location: 'Paris' }) + }) - it("should handle tool execution errors gracefully", async () => { + it('should handle tool execution errors gracefully', async () => { const errorTool: Tool = { - type: "function", + type: 'function', function: { - name: "error_tool", - description: "Throws error", + name: 'error_tool', + description: 'Throws error', parameters: {}, }, execute: vi.fn(async () => { - throw new Error("Tool failed"); + throw new Error('Tool failed') }), - }; + } - const manager = new ToolCallManager([errorTool]); + const manager = new ToolCallManager([errorTool]) manager.addToolCallChunk({ toolCall: { - id: "call_123", - type: "function", - function: { name: "error_tool", arguments: "{}" }, + id: 'call_123', + type: 'function', + function: { name: 'error_tool', arguments: '{}' }, }, index: 0, - }); + }) // Properly consume the generator const { chunks, result: toolResults } = await collectGeneratorOutput( - manager.executeTools(mockDoneChunk) - ); + manager.executeTools(mockDoneChunk), + ) // Should still emit chunk with error message - expect(chunks).toHaveLength(1); - expect(chunks[0].content).toContain("Error executing tool: Tool failed"); + expect(chunks).toHaveLength(1) + expect(chunks[0].content).toContain('Error executing tool: Tool failed') // Should still return tool result message - expect(toolResults).toHaveLength(1); - expect(toolResults[0].content).toContain("Error executing tool"); - }); + expect(toolResults).toHaveLength(1) + expect(toolResults[0].content).toContain('Error executing tool') + }) - it("should handle tools without execute function", async () => { + it('should handle tools without execute function', async () => { const noExecuteTool: Tool = { - type: "function", + type: 'function', function: { - name: "no_execute", - description: "No execute function", + name: 'no_execute', + description: 'No execute function', parameters: {}, }, // No execute function - }; + } - const manager = new ToolCallManager([noExecuteTool]); + const manager = new ToolCallManager([noExecuteTool]) manager.addToolCallChunk({ toolCall: { - id: "call_123", - type: "function", - function: { name: "no_execute", arguments: "{}" }, + id: 'call_123', + type: 'function', + function: { name: 'no_execute', arguments: '{}' }, }, index: 0, - }); + }) const { chunks, result: toolResults } = await collectGeneratorOutput( - manager.executeTools(mockDoneChunk) - ); + manager.executeTools(mockDoneChunk), + ) - expect(chunks[0].content).toContain("does not have an execute function"); + expect(chunks[0].content).toContain('does not have an execute function') expect(toolResults[0].content).toContain( - "does not have an execute function" - ); - }); + 'does not have an execute function', + ) + }) - it("should clear tool calls", () => { - const manager = new ToolCallManager([mockWeatherTool]); + it('should clear tool calls', () => { + const manager = new ToolCallManager([mockWeatherTool]) manager.addToolCallChunk({ toolCall: { - id: "call_123", - type: "function", - function: { name: "get_weather", arguments: "{}" }, + id: 'call_123', + type: 'function', + function: { name: 'get_weather', arguments: '{}' }, }, index: 0, - }); + }) - expect(manager.hasToolCalls()).toBe(true); + expect(manager.hasToolCalls()).toBe(true) - manager.clear(); + manager.clear() - expect(manager.hasToolCalls()).toBe(false); - expect(manager.getToolCalls()).toHaveLength(0); - }); + expect(manager.hasToolCalls()).toBe(false) + expect(manager.getToolCalls()).toHaveLength(0) + }) - it("should handle multiple tool calls in same iteration", async () => { + it('should handle multiple tool calls in same iteration', async () => { const calculateTool: Tool = { - type: "function", + type: 'function', function: { - name: "calculate", - description: "Calculate", + name: 'calculate', + description: 'Calculate', parameters: {}, }, execute: vi.fn(async (args: any) => { - return JSON.stringify({ result: eval(args.expression) }); + return JSON.stringify({ result: eval(args.expression) }) }), - }; + } - const manager = new ToolCallManager([mockWeatherTool, calculateTool]); + const manager = new ToolCallManager([mockWeatherTool, calculateTool]) // Add two different tool calls manager.addToolCallChunk({ toolCall: { - id: "call_weather", - type: "function", - function: { name: "get_weather", arguments: '{"location":"Paris"}' }, + id: 'call_weather', + type: 'function', + function: { name: 'get_weather', arguments: '{"location":"Paris"}' }, }, index: 0, - }); + }) manager.addToolCallChunk({ toolCall: { - id: "call_calc", - type: "function", - function: { name: "calculate", arguments: '{"expression":"5+3"}' }, + id: 'call_calc', + type: 'function', + function: { name: 'calculate', arguments: '{"expression":"5+3"}' }, }, index: 1, - }); + }) - const toolCalls = manager.getToolCalls(); - expect(toolCalls).toHaveLength(2); + const toolCalls = manager.getToolCalls() + expect(toolCalls).toHaveLength(2) const { chunks, result: toolResults } = await collectGeneratorOutput( - manager.executeTools(mockDoneChunk) - ); + manager.executeTools(mockDoneChunk), + ) // Should emit two tool_result chunks - expect(chunks).toHaveLength(2); - expect(chunks[0].toolCallId).toBe("call_weather"); - expect(chunks[1].toolCallId).toBe("call_calc"); + expect(chunks).toHaveLength(2) + expect(chunks[0].toolCallId).toBe('call_weather') + expect(chunks[1].toolCallId).toBe('call_calc') // Should return two tool result messages - expect(toolResults).toHaveLength(2); - expect(toolResults[0].toolCallId).toBe("call_weather"); - expect(toolResults[1].toolCallId).toBe("call_calc"); - }); -}); + expect(toolResults).toHaveLength(2) + expect(toolResults[0].toolCallId).toBe('call_weather') + expect(toolResults[1].toolCallId).toBe('call_calc') + }) +}) diff --git a/packages/typescript/react-ai-devtools/package.json b/packages/typescript/react-ai-devtools/package.json index 4c542867e..aa750d8bd 100644 --- a/packages/typescript/react-ai-devtools/package.json +++ b/packages/typescript/react-ai-devtools/package.json @@ -18,7 +18,7 @@ "clean": "premove ./build ./dist", "lint:fix": "eslint ./src --fix", "test:eslint": "eslint ./src", - "test:lib": "vitest", + "test:lib": "vitest --passWithNoTests", "test:lib:dev": "pnpm test:lib --watch", "test:types": "tsc", "test:build": "publint --strict", @@ -48,8 +48,8 @@ "src" ], "dependencies": { - "@tanstack/devtools-utils": "^0.0.8", - "@tanstack/ai-devtools-core": "workspace:*" + "@tanstack/ai-devtools-core": "workspace:*", + "@tanstack/devtools-utils": "^0.0.8" }, "devDependencies": { "@types/react": "^19.2.7", @@ -58,4 +58,4 @@ "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } -} +} \ No newline at end of file diff --git a/packages/typescript/react-ai-devtools/src/AiDevtools.tsx b/packages/typescript/react-ai-devtools/src/AiDevtools.tsx index 448d9e6de..e11948443 100644 --- a/packages/typescript/react-ai-devtools/src/AiDevtools.tsx +++ b/packages/typescript/react-ai-devtools/src/AiDevtools.tsx @@ -1,9 +1,9 @@ -import { createReactPanel } from "@tanstack/devtools-utils/react"; -import { AiDevtoolsCore } from "@tanstack/ai-devtools-core"; -import type { DevtoolsPanelProps } from "@tanstack/devtools-utils/react"; +import { createReactPanel } from '@tanstack/devtools-utils/react' +import { AiDevtoolsCore } from '@tanstack/ai-devtools-core' +import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/react' export interface AiDevtoolsReactInit extends DevtoolsPanelProps {} -const [AiDevtoolsPanel, AiDevtoolsPanelNoOp] = createReactPanel(AiDevtoolsCore); +const [AiDevtoolsPanel, AiDevtoolsPanelNoOp] = createReactPanel(AiDevtoolsCore) -export { AiDevtoolsPanel, AiDevtoolsPanelNoOp }; +export { AiDevtoolsPanel, AiDevtoolsPanelNoOp } diff --git a/packages/typescript/react-ai-devtools/src/plugin.tsx b/packages/typescript/react-ai-devtools/src/plugin.tsx index 3067774f2..2881e6f0d 100644 --- a/packages/typescript/react-ai-devtools/src/plugin.tsx +++ b/packages/typescript/react-ai-devtools/src/plugin.tsx @@ -1,11 +1,11 @@ -import { createReactPlugin } from "@tanstack/devtools-utils/react"; -import { AiDevtoolsPanel } from "./AiDevtools"; +import { createReactPlugin } from '@tanstack/devtools-utils/react' +import { AiDevtoolsPanel } from './AiDevtools' const [aiDevtoolsPlugin, aiDevtoolsNoOpPlugin] = createReactPlugin({ Component: AiDevtoolsPanel, - name: "TanStack AI", - id: "tanstack-ai", + name: 'TanStack AI', + id: 'tanstack-ai', defaultOpen: true, -}); +}) -export { aiDevtoolsPlugin, aiDevtoolsNoOpPlugin }; +export { aiDevtoolsPlugin, aiDevtoolsNoOpPlugin } diff --git a/packages/typescript/react-ai-devtools/tsconfig.json b/packages/typescript/react-ai-devtools/tsconfig.json index 5e0433471..275835b24 100644 --- a/packages/typescript/react-ai-devtools/tsconfig.json +++ b/packages/typescript/react-ai-devtools/tsconfig.json @@ -1,13 +1,9 @@ { + "extends": "../../../tsconfig.json", "compilerOptions": { "jsx": "preserve", "jsxFactory": "solid", - "lib": ["DOM", "DOM.Iterable", "ES2022"], - "module": "ES2022", - "moduleResolution": "Bundler", - "noEmit": true, - "noImplicitReturns": true, - "noUncheckedIndexedAccess": true + "strictNullChecks": true }, "include": ["eslint.config.js", "prettier.config.js", "src"] } diff --git a/packages/typescript/react-ai-devtools/tsdown.config.ts b/packages/typescript/react-ai-devtools/tsdown.config.ts index 24031b5c5..8d48d611b 100644 --- a/packages/typescript/react-ai-devtools/tsdown.config.ts +++ b/packages/typescript/react-ai-devtools/tsdown.config.ts @@ -1,11 +1,11 @@ -import { defineConfig } from "tsdown"; +import { defineConfig } from 'tsdown' export default defineConfig({ - entry: ["./src/index.ts", "./src/production.ts"], - format: ["esm"], + entry: ['./src/index.ts', './src/production.ts'], + format: ['esm'], unbundle: true, dts: true, sourcemap: true, clean: true, minify: false, -}); +}) diff --git a/packages/typescript/react-ai-devtools/vitest.config.ts b/packages/typescript/react-ai-devtools/vitest.config.ts index 68ef5ebfb..57223ef4f 100644 --- a/packages/typescript/react-ai-devtools/vitest.config.ts +++ b/packages/typescript/react-ai-devtools/vitest.config.ts @@ -1,10 +1,9 @@ -import { defineConfig } from "vitest/config"; +import { defineConfig } from 'vitest/config' export default defineConfig({ test: { globals: true, - environment: "node", - include: ["tests/**/*.test.ts"], + environment: 'node', + include: ['tests/**/*.test.ts'], }, -}); - +}) diff --git a/packages/typescript/solid-ai-devtools/package.json b/packages/typescript/solid-ai-devtools/package.json index 67f79e981..ac7dee1c6 100644 --- a/packages/typescript/solid-ai-devtools/package.json +++ b/packages/typescript/solid-ai-devtools/package.json @@ -34,7 +34,7 @@ "lint:fix": "eslint ./src --fix", "test:build": "publint --strict", "test:eslint": "eslint ./src", - "test:lib": "vitest", + "test:lib": "vitest --passWithNoTests", "test:lib:dev": "pnpm test:lib --watch", "test:types": "tsc" }, @@ -56,4 +56,4 @@ "peerDependencies": { "solid-js": ">=1.9.7" } -} +} \ No newline at end of file diff --git a/packages/typescript/solid-ai-devtools/src/AiDevtools.tsx b/packages/typescript/solid-ai-devtools/src/AiDevtools.tsx index f3ad97bab..06a6b09a9 100644 --- a/packages/typescript/solid-ai-devtools/src/AiDevtools.tsx +++ b/packages/typescript/solid-ai-devtools/src/AiDevtools.tsx @@ -1,9 +1,9 @@ -import { createSolidPanel } from "@tanstack/devtools-utils/solid"; -import { AiDevtoolsCore } from "@tanstack/ai-devtools-core"; -import type { DevtoolsPanelProps } from "@tanstack/devtools-utils/solid"; +import { createSolidPanel } from '@tanstack/devtools-utils/solid' +import { AiDevtoolsCore } from '@tanstack/ai-devtools-core' +import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/solid' -const [AiDevtoolsPanel, AiDevtoolsPanelNoOp] = createSolidPanel(AiDevtoolsCore); +const [AiDevtoolsPanel, AiDevtoolsPanelNoOp] = createSolidPanel(AiDevtoolsCore) export interface AiDevtoolsSolidInit extends DevtoolsPanelProps {} -export { AiDevtoolsPanel, AiDevtoolsPanelNoOp }; +export { AiDevtoolsPanel, AiDevtoolsPanelNoOp } diff --git a/packages/typescript/solid-ai-devtools/src/plugin.tsx b/packages/typescript/solid-ai-devtools/src/plugin.tsx index 1af7016a2..a09613b51 100644 --- a/packages/typescript/solid-ai-devtools/src/plugin.tsx +++ b/packages/typescript/solid-ai-devtools/src/plugin.tsx @@ -1,11 +1,11 @@ -import { createSolidPlugin } from "@tanstack/devtools-utils/solid"; -import { AiDevtoolsPanel } from "./AiDevtools"; +import { createSolidPlugin } from '@tanstack/devtools-utils/solid' +import { AiDevtoolsPanel } from './AiDevtools' const [aiDevtoolsPlugin, aiDevtoolsNoOpPlugin] = createSolidPlugin({ Component: AiDevtoolsPanel, - name: "TanStack AI", - id: "tanstack-ai", + name: 'TanStack AI', + id: 'tanstack-ai', defaultOpen: true, -}); +}) -export { aiDevtoolsPlugin, aiDevtoolsNoOpPlugin }; +export { aiDevtoolsPlugin, aiDevtoolsNoOpPlugin } diff --git a/packages/typescript/solid-ai-devtools/tsconfig.json b/packages/typescript/solid-ai-devtools/tsconfig.json index 5e0433471..275835b24 100644 --- a/packages/typescript/solid-ai-devtools/tsconfig.json +++ b/packages/typescript/solid-ai-devtools/tsconfig.json @@ -1,13 +1,9 @@ { + "extends": "../../../tsconfig.json", "compilerOptions": { "jsx": "preserve", "jsxFactory": "solid", - "lib": ["DOM", "DOM.Iterable", "ES2022"], - "module": "ES2022", - "moduleResolution": "Bundler", - "noEmit": true, - "noImplicitReturns": true, - "noUncheckedIndexedAccess": true + "strictNullChecks": true }, "include": ["eslint.config.js", "prettier.config.js", "src"] } diff --git a/packages/typescript/solid-ai-devtools/tsdown.config.ts b/packages/typescript/solid-ai-devtools/tsdown.config.ts index 24031b5c5..8d48d611b 100644 --- a/packages/typescript/solid-ai-devtools/tsdown.config.ts +++ b/packages/typescript/solid-ai-devtools/tsdown.config.ts @@ -1,11 +1,11 @@ -import { defineConfig } from "tsdown"; +import { defineConfig } from 'tsdown' export default defineConfig({ - entry: ["./src/index.ts", "./src/production.ts"], - format: ["esm"], + entry: ['./src/index.ts', './src/production.ts'], + format: ['esm'], unbundle: true, dts: true, sourcemap: true, clean: true, minify: false, -}); +}) diff --git a/packages/typescript/solid-ai-devtools/vitest.config.ts b/packages/typescript/solid-ai-devtools/vitest.config.ts index 68ef5ebfb..57223ef4f 100644 --- a/packages/typescript/solid-ai-devtools/vitest.config.ts +++ b/packages/typescript/solid-ai-devtools/vitest.config.ts @@ -1,10 +1,9 @@ -import { defineConfig } from "vitest/config"; +import { defineConfig } from 'vitest/config' export default defineConfig({ test: { globals: true, - environment: "node", - include: ["tests/**/*.test.ts"], + environment: 'node', + include: ['tests/**/*.test.ts'], }, -}); - +}) diff --git a/packages/typescript/tests-adapters/README.md b/packages/typescript/tests-adapters/README.md index 3dda374c4..00564d4cc 100644 --- a/packages/typescript/tests-adapters/README.md +++ b/packages/typescript/tests-adapters/README.md @@ -18,7 +18,6 @@ This package contains simple tests for the four AI adapter libraries: ## Usage 1. Set up environment variables. You can either: - - Create a `.env` or `.env.local` file (see `env.example`): ```bash ANTHROPIC_API_KEY=your_key diff --git a/packages/typescript/tests-adapters/package.json b/packages/typescript/tests-adapters/package.json index ddd4d10f6..d37810b25 100644 --- a/packages/typescript/tests-adapters/package.json +++ b/packages/typescript/tests-adapters/package.json @@ -20,7 +20,6 @@ "@types/node": "^24.10.1", "dotenv": "^17.2.3", "tsx": "^4.20.6", - "typescript": "^5.9.3" + "typescript": "5.9.3" } } - diff --git a/packages/typescript/tests-adapters/src/harness.ts b/packages/typescript/tests-adapters/src/harness.ts index 8416bdb13..9d4bf80ad 100644 --- a/packages/typescript/tests-adapters/src/harness.ts +++ b/packages/typescript/tests-adapters/src/harness.ts @@ -1,66 +1,66 @@ -import { chat, type Tool } from "@tanstack/ai"; -import { mkdir, writeFile } from "fs/promises"; -import { join } from "path"; +import { chat, type Tool } from '@tanstack/ai' +import { mkdir, writeFile } from 'fs/promises' +import { join } from 'path' -export const OUTPUT_DIR = join(process.cwd(), "output"); +export const OUTPUT_DIR = join(process.cwd(), 'output') export interface ToolCallCapture { - id: string; - name: string; - arguments: string; + id: string + name: string + arguments: string } export interface ToolResultCapture { - toolCallId: string; - content: string; + toolCallId: string + content: string } export interface ApprovalCapture { - toolCallId: string; - toolName: string; - input: any; - approval: any; + toolCallId: string + toolName: string + input: any + approval: any } export interface StreamCapture { - phase: string; - chunks: any[]; - fullResponse: string; - responseLength: number; - totalChunks: number; - toolCalls: ToolCallCapture[]; - toolResults: ToolResultCapture[]; - approvalRequests: ApprovalCapture[]; - reconstructedMessages: any[]; - lastAssistantMessage: any | null; + phase: string + chunks: any[] + fullResponse: string + responseLength: number + totalChunks: number + toolCalls: ToolCallCapture[] + toolResults: ToolResultCapture[] + approvalRequests: ApprovalCapture[] + reconstructedMessages: any[] + lastAssistantMessage: any | null } export interface AdapterContext { - adapterName: string; - adapter: any; - model: string; - summarizeModel?: string; - embeddingModel?: string; + adapterName: string + adapter: any + model: string + summarizeModel?: string + embeddingModel?: string } export interface DebugEnvelope { - adapter: string; - test: string; - model: string; - timestamp: string; + adapter: string + test: string + model: string + timestamp: string input: { - messages: any[]; - tools?: any[]; - }; - chunks: any[]; - summary: Record; - result?: { passed: boolean; error?: string }; - finalMessages?: any[]; + messages: any[] + tools?: any[] + } + chunks: any[] + summary: Record + result?: { passed: boolean; error?: string } + finalMessages?: any[] } async function ensureOutputDir() { try { - await mkdir(OUTPUT_DIR, { recursive: true }); + await mkdir(OUTPUT_DIR, { recursive: true }) } catch { // Directory might already exist, that's fine } @@ -69,12 +69,12 @@ async function ensureOutputDir() { export async function writeDebugFile( adapterName: string, testName: string, - debugData: any + debugData: any, ) { - await ensureOutputDir(); - const filename = `${adapterName.toLowerCase()}-${testName.toLowerCase()}.json`; - const filepath = join(OUTPUT_DIR, filename); - await writeFile(filepath, JSON.stringify(debugData, null, 2), "utf-8"); + await ensureOutputDir() + const filename = `${adapterName.toLowerCase()}-${testName.toLowerCase()}.json` + const filepath = join(OUTPUT_DIR, filename) + await writeFile(filepath, JSON.stringify(debugData, null, 2), 'utf-8') } function formatToolsForDebug(tools: Tool[] = []) { @@ -89,7 +89,7 @@ function formatToolsForDebug(tools: Tool[] = []) { : undefined, needsApproval: (t as any).needsApproval, hasExecute: Boolean((t as any).execute), - })); + })) } export function createDebugEnvelope( @@ -97,7 +97,7 @@ export function createDebugEnvelope( testName: string, model: string, messages: any[], - tools?: Tool[] + tools?: Tool[], ): DebugEnvelope { return { adapter: adapterName, @@ -107,7 +107,7 @@ export function createDebugEnvelope( input: { messages, tools: formatToolsForDebug(tools) }, chunks: [] as any[], summary: {}, - }; + } } export function summarizeRun(run: StreamCapture) { @@ -118,18 +118,18 @@ export function summarizeRun(run: StreamCapture) { toolCalls: run.toolCalls, toolResults: run.toolResults, approvalRequests: run.approvalRequests, - }; + } } export async function captureStream(opts: { - adapterName: string; - testName: string; - phase: string; - adapter: any; - model: string; - messages: any[]; - tools?: Tool[]; - agentLoopStrategy?: any; + adapterName: string + testName: string + phase: string + adapter: any + model: string + messages: any[] + tools?: Tool[] + agentLoopStrategy?: any }): Promise { const { adapterName: _adapterName, @@ -140,7 +140,7 @@ export async function captureStream(opts: { messages, tools, agentLoopStrategy, - } = opts; + } = opts const stream = chat({ adapter, @@ -148,20 +148,20 @@ export async function captureStream(opts: { messages, tools, agentLoopStrategy, - }); - - let chunkIndex = 0; - let fullResponse = ""; - const chunks: any[] = []; - const toolCallMap = new Map(); - const toolResults: ToolResultCapture[] = []; - const approvalRequests: ApprovalCapture[] = []; - const reconstructedMessages: any[] = [...messages]; - let assistantDraft: any | null = null; - let lastAssistantMessage: any | null = null; + }) + + let chunkIndex = 0 + let fullResponse = '' + const chunks: any[] = [] + const toolCallMap = new Map() + const toolResults: ToolResultCapture[] = [] + const approvalRequests: ApprovalCapture[] = [] + const reconstructedMessages: any[] = [...messages] + let assistantDraft: any | null = null + let lastAssistantMessage: any | null = null for await (const chunk of stream) { - chunkIndex++; + chunkIndex++ const chunkData: any = { phase, index: chunkIndex, @@ -169,46 +169,46 @@ export async function captureStream(opts: { timestamp: chunk.timestamp, id: chunk.id, model: chunk.model, - }; + } - if (chunk.type === "content") { - chunkData.delta = chunk.delta; - chunkData.content = chunk.content; - chunkData.role = chunk.role; - const delta = chunk.delta || chunk.content || ""; - fullResponse += delta; + if (chunk.type === 'content') { + chunkData.delta = chunk.delta + chunkData.content = chunk.content + chunkData.role = chunk.role + const delta = chunk.delta || chunk.content || '' + fullResponse += delta - if (chunk.role === "assistant") { + if (chunk.role === 'assistant') { if (!assistantDraft) { assistantDraft = { - role: "assistant", - content: chunk.content || "", + role: 'assistant', + content: chunk.content || '', toolCalls: [], - }; + } } else { - assistantDraft.content = (assistantDraft.content || "") + delta; + assistantDraft.content = (assistantDraft.content || '') + delta } } - } else if (chunk.type === "tool_call") { - const id = chunk.toolCall.id; + } else if (chunk.type === 'tool_call') { + const id = chunk.toolCall.id const existing = toolCallMap.get(id) || { id, name: chunk.toolCall.function.name, - arguments: "", - }; - existing.arguments += chunk.toolCall.function.arguments || ""; - toolCallMap.set(id, existing); + arguments: '', + } + existing.arguments += chunk.toolCall.function.arguments || '' + toolCallMap.set(id, existing) - chunkData.toolCall = chunk.toolCall; + chunkData.toolCall = chunk.toolCall if (!assistantDraft) { - assistantDraft = { role: "assistant", content: null, toolCalls: [] }; + assistantDraft = { role: 'assistant', content: null, toolCalls: [] } } const existingToolCall = assistantDraft.toolCalls?.find( - (tc: any) => tc.id === id - ); + (tc: any) => tc.id === id, + ) if (existingToolCall) { - existingToolCall.function.arguments = existing.arguments; + existingToolCall.function.arguments = existing.arguments } else { assistantDraft.toolCalls?.push({ ...chunk.toolCall, @@ -216,51 +216,51 @@ export async function captureStream(opts: { ...chunk.toolCall.function, arguments: existing.arguments, }, - }); + }) } - } else if (chunk.type === "tool_result") { - chunkData.toolCallId = chunk.toolCallId; - chunkData.content = chunk.content; + } else if (chunk.type === 'tool_result') { + chunkData.toolCallId = chunk.toolCallId + chunkData.content = chunk.content toolResults.push({ toolCallId: chunk.toolCallId, content: chunk.content, - }); + }) reconstructedMessages.push({ - role: "tool", + role: 'tool', toolCallId: chunk.toolCallId, content: chunk.content, - }); - } else if (chunk.type === "approval-requested") { + }) + } else if (chunk.type === 'approval-requested') { const approval: ApprovalCapture = { toolCallId: chunk.toolCallId, toolName: chunk.toolName, input: chunk.input, approval: chunk.approval, - }; - chunkData.toolCallId = chunk.toolCallId; - chunkData.toolName = chunk.toolName; - chunkData.input = chunk.input; - chunkData.approval = chunk.approval; - approvalRequests.push(approval); - } else if (chunk.type === "done") { - chunkData.finishReason = chunk.finishReason; - chunkData.usage = chunk.usage; - if (chunk.finishReason === "stop" && assistantDraft) { - reconstructedMessages.push(assistantDraft); - lastAssistantMessage = assistantDraft; - assistantDraft = null; + } + chunkData.toolCallId = chunk.toolCallId + chunkData.toolName = chunk.toolName + chunkData.input = chunk.input + chunkData.approval = chunk.approval + approvalRequests.push(approval) + } else if (chunk.type === 'done') { + chunkData.finishReason = chunk.finishReason + chunkData.usage = chunk.usage + if (chunk.finishReason === 'stop' && assistantDraft) { + reconstructedMessages.push(assistantDraft) + lastAssistantMessage = assistantDraft + assistantDraft = null } } - chunks.push(chunkData); + chunks.push(chunkData) } if (assistantDraft) { - reconstructedMessages.push(assistantDraft); - lastAssistantMessage = assistantDraft; + reconstructedMessages.push(assistantDraft) + lastAssistantMessage = assistantDraft } - const toolCalls = Array.from(toolCallMap.values()); + const toolCalls = Array.from(toolCallMap.values()) return { phase, @@ -273,21 +273,21 @@ export async function captureStream(opts: { approvalRequests, reconstructedMessages, lastAssistantMessage, - }; + } } export async function runTestCase(opts: { - adapterContext: AdapterContext; - testName: string; - description: string; - messages: any[]; - tools?: Tool[]; - agentLoopStrategy?: any; + adapterContext: AdapterContext + testName: string + description: string + messages: any[] + tools?: Tool[] + agentLoopStrategy?: any validate: (run: StreamCapture) => { - passed: boolean; - error?: string; - meta?: Record; - }; + passed: boolean + error?: string + meta?: Record + } }) { const { adapterContext, @@ -297,95 +297,95 @@ export async function runTestCase(opts: { tools, agentLoopStrategy, validate, - } = opts; + } = opts const debugData = createDebugEnvelope( adapterContext.adapterName, testName, adapterContext.model, messages, - tools - ); + tools, + ) const run = await captureStream({ adapterName: adapterContext.adapterName, testName, - phase: "main", + phase: 'main', adapter: adapterContext.adapter, model: adapterContext.model, messages, tools, agentLoopStrategy, - }); + }) - const validation = validate(run); - debugData.chunks = run.chunks; - debugData.finalMessages = run.reconstructedMessages; + const validation = validate(run) + debugData.chunks = run.chunks + debugData.finalMessages = run.reconstructedMessages debugData.summary = { ...summarizeRun(run), fullResponse: run.fullResponse, ...validation.meta, - }; + } debugData.result = { passed: validation.passed, error: validation.error, - }; + } - await writeDebugFile(adapterContext.adapterName, testName, debugData); + await writeDebugFile(adapterContext.adapterName, testName, debugData) if (validation.passed) { - console.log(`[${adapterContext.adapterName}] ✅ ${testName}`); + console.log(`[${adapterContext.adapterName}] ✅ ${testName}`) } else { console.log( `[${adapterContext.adapterName}] ❌ ${testName}: ${ - validation.error || "Unknown error" - }` - ); + validation.error || 'Unknown error' + }`, + ) } - return { passed: validation.passed, error: validation.error }; + return { passed: validation.passed, error: validation.error } } export function buildApprovalMessages( originalMessages: any[], firstRun: StreamCapture, - approval: ApprovalCapture + approval: ApprovalCapture, ) { const toolCall = firstRun.toolCalls.find( - (call) => call.id === approval.toolCallId - ); + (call) => call.id === approval.toolCallId, + ) const assistantMessage = firstRun.lastAssistantMessage || - firstRun.reconstructedMessages.find((m) => m.role === "assistant"); + firstRun.reconstructedMessages.find((m) => m.role === 'assistant') const toolCallsWithArgs = assistantMessage?.toolCalls?.map((tc: any) => { - const aggregated = firstRun.toolCalls.find((call) => call.id === tc.id); + const aggregated = firstRun.toolCalls.find((call) => call.id === tc.id) return aggregated ? { ...tc, function: { ...tc.function, arguments: aggregated.arguments }, } - : tc; - }) || []; + : tc + }) || [] return [ ...originalMessages, { - role: "assistant", + role: 'assistant', content: assistantMessage?.content ?? null, toolCalls: toolCallsWithArgs, parts: [ { - type: "tool-call", + type: 'tool-call', id: toolCall?.id ?? approval.toolCallId, name: toolCall?.name ?? approval.toolName, - arguments: toolCall?.arguments ?? "", - state: "approval-responded", + arguments: toolCall?.arguments ?? '', + state: 'approval-responded', approval: { ...approval.approval, approved: true }, }, ], }, - ]; + ] } diff --git a/packages/typescript/tests-adapters/src/index.ts b/packages/typescript/tests-adapters/src/index.ts index 2fc54262a..1298ce89c 100644 --- a/packages/typescript/tests-adapters/src/index.ts +++ b/packages/typescript/tests-adapters/src/index.ts @@ -1,4 +1,4 @@ -import { config } from "dotenv"; +import { config } from 'dotenv' import { chat, embedding, @@ -6,11 +6,11 @@ import { tool, maxIterations, type Tool, -} from "@tanstack/ai"; -import { createAnthropic } from "@tanstack/ai-anthropic"; -import { createGemini } from "@tanstack/ai-gemini"; -import { ollama } from "@tanstack/ai-ollama"; -import { createOpenAI } from "@tanstack/ai-openai"; +} from '@tanstack/ai' +import { createAnthropic } from '@tanstack/ai-anthropic' +import { createGemini } from '@tanstack/ai-gemini' +import { ollama } from '@tanstack/ai-ollama' +import { createOpenAI } from '@tanstack/ai-openai' import { AdapterContext, buildApprovalMessages, @@ -19,169 +19,169 @@ import { runTestCase, summarizeRun, writeDebugFile, -} from "./harness"; +} from './harness' // Load .env.local first (higher priority), then .env -config({ path: ".env.local" }); -config({ path: ".env" }); +config({ path: '.env.local' }) +config({ path: '.env' }) const ANTHROPIC_MODEL = - process.env.ANTHROPIC_MODEL || "claude-3-5-haiku-20241022"; + process.env.ANTHROPIC_MODEL || 'claude-3-5-haiku-20241022' const ANTHROPIC_SUMMARY_MODEL = - process.env.ANTHROPIC_SUMMARY_MODEL || ANTHROPIC_MODEL; + process.env.ANTHROPIC_SUMMARY_MODEL || ANTHROPIC_MODEL const ANTHROPIC_EMBEDDING_MODEL = - process.env.ANTHROPIC_EMBEDDING_MODEL || ANTHROPIC_MODEL; + process.env.ANTHROPIC_EMBEDDING_MODEL || ANTHROPIC_MODEL -const OPENAI_MODEL = process.env.OPENAI_MODEL || "gpt-4o-mini"; -const OPENAI_SUMMARY_MODEL = process.env.OPENAI_SUMMARY_MODEL || OPENAI_MODEL; +const OPENAI_MODEL = process.env.OPENAI_MODEL || 'gpt-4o-mini' +const OPENAI_SUMMARY_MODEL = process.env.OPENAI_SUMMARY_MODEL || OPENAI_MODEL const OPENAI_EMBEDDING_MODEL = - process.env.OPENAI_EMBEDDING_MODEL || "text-embedding-3-small"; + process.env.OPENAI_EMBEDDING_MODEL || 'text-embedding-3-small' -const GEMINI_MODEL = process.env.GEMINI_MODEL || "gemini-2.0-flash-lite"; -const GEMINI_SUMMARY_MODEL = process.env.GEMINI_SUMMARY_MODEL || GEMINI_MODEL; +const GEMINI_MODEL = process.env.GEMINI_MODEL || 'gemini-2.0-flash-lite' +const GEMINI_SUMMARY_MODEL = process.env.GEMINI_SUMMARY_MODEL || GEMINI_MODEL const GEMINI_EMBEDDING_MODEL = - process.env.GEMINI_EMBEDDING_MODEL || "gemini-embedding-001"; + process.env.GEMINI_EMBEDDING_MODEL || 'gemini-embedding-001' // Using llama3.2:3b for better stability with approval flows // granite4:3b was flaky with approval-required tools // Can override via OLLAMA_MODEL env var if needed -const OLLAMA_MODEL = process.env.OLLAMA_MODEL || "mistral:7b"; -const OLLAMA_SUMMARY_MODEL = process.env.OLLAMA_SUMMARY_MODEL || OLLAMA_MODEL; +const OLLAMA_MODEL = process.env.OLLAMA_MODEL || 'mistral:7b' +const OLLAMA_SUMMARY_MODEL = process.env.OLLAMA_SUMMARY_MODEL || OLLAMA_MODEL const OLLAMA_EMBEDDING_MODEL = - process.env.OLLAMA_EMBEDDING_MODEL || "nomic-embed-text"; + process.env.OLLAMA_EMBEDDING_MODEL || 'nomic-embed-text' -type TestOutcome = { passed: boolean; error?: string; ignored?: boolean }; +type TestOutcome = { passed: boolean; error?: string; ignored?: boolean } interface AdapterResult { - adapter: string; - model: string; - summarizeModel: string; - embeddingModel: string; - tests: Record; + adapter: string + model: string + summarizeModel: string + embeddingModel: string + tests: Record } interface AdapterConfig { - name: string; - chatModel: string; - summarizeModel: string; - embeddingModel: string; - adapter: any; + name: string + chatModel: string + summarizeModel: string + embeddingModel: string + adapter: any } interface TestDefinition { - id: string; - label: string; - run: (ctx: AdapterContext) => Promise; + id: string + label: string + run: (ctx: AdapterContext) => Promise } async function testCapitalOfFrance( - adapterContext: AdapterContext + adapterContext: AdapterContext, ): Promise { return runTestCase({ adapterContext, - testName: "test1-chat-stream", - description: "chat stream returns Paris for capital of France", + testName: 'test1-chat-stream', + description: 'chat stream returns Paris for capital of France', messages: [ - { role: "user" as const, content: "what is the capital of france" }, + { role: 'user' as const, content: 'what is the capital of france' }, ], validate: (run) => { - const hasParis = run.fullResponse.toLowerCase().includes("paris"); + const hasParis = run.fullResponse.toLowerCase().includes('paris') return { passed: hasParis, error: hasParis ? undefined : "Response does not contain 'Paris'", meta: { hasParis }, - }; + } }, - }); + }) } async function testTemperatureTool( - adapterContext: AdapterContext + adapterContext: AdapterContext, ): Promise { - let toolExecuteCalled = false; - let toolExecuteCallCount = 0; + let toolExecuteCalled = false + let toolExecuteCallCount = 0 const toolExecuteCalls: Array<{ - timestamp: string; - arguments: any; - result?: string; - error?: string; - }> = []; + timestamp: string + arguments: any + result?: string + error?: string + }> = [] - const expectedLocation = "San Francisco"; + const expectedLocation = 'San Francisco' const temperatureTool = tool({ - type: "function", + type: 'function', function: { - name: "get_temperature", + name: 'get_temperature', description: - "Get the current temperature in degrees for a specific location", + 'Get the current temperature in degrees for a specific location', parameters: { - type: "object", + type: 'object', properties: { location: { - type: "string", - description: "The city or location to get the temperature for", + type: 'string', + description: 'The city or location to get the temperature for', }, }, - required: ["location"], + required: ['location'], }, }, execute: async (args: any) => { - toolExecuteCalled = true; - toolExecuteCallCount++; + toolExecuteCalled = true + toolExecuteCallCount++ const callInfo: any = { timestamp: new Date().toISOString(), arguments: args, - }; + } try { // Verify location was passed correctly - if (!args || typeof args !== "object") { - throw new Error("Arguments must be an object"); + if (!args || typeof args !== 'object') { + throw new Error('Arguments must be an object') } - if (!args.location || typeof args.location !== "string") { - throw new Error("Location argument is missing or invalid"); + if (!args.location || typeof args.location !== 'string') { + throw new Error('Location argument is missing or invalid') } - const result = "70"; - callInfo.result = result; - toolExecuteCalls.push(callInfo); - return result; + const result = '70' + callInfo.result = result + toolExecuteCalls.push(callInfo) + return result } catch (error: any) { - callInfo.error = error.message; - toolExecuteCalls.push(callInfo); - throw error; + callInfo.error = error.message + toolExecuteCalls.push(callInfo) + throw error } }, - }); + }) return runTestCase({ adapterContext, - testName: "test2-temperature-tool", + testName: 'test2-temperature-tool', description: - "tool call with location parameter returns a temperature value", + 'tool call with location parameter returns a temperature value', messages: [ { - role: "user" as const, + role: 'user' as const, content: `use the get_temperature tool to get the temperature for ${expectedLocation} and report the answer as a number`, }, ], tools: [temperatureTool], agentLoopStrategy: maxIterations(20), validate: (run) => { - const responseLower = run.fullResponse.toLowerCase(); + const responseLower = run.fullResponse.toLowerCase() const hasSeventy = - responseLower.includes("70") || responseLower.includes("seventy"); - const toolCallFound = run.toolCalls.length > 0; - const toolResultFound = run.toolResults.length > 0; + responseLower.includes('70') || responseLower.includes('seventy') + const toolCallFound = run.toolCalls.length > 0 + const toolResultFound = run.toolResults.length > 0 // Check that location was passed correctly const locationPassedCorrectly = toolExecuteCalls.some( (call) => call.arguments && call.arguments.location && - typeof call.arguments.location === "string" && - call.arguments.location.length > 0 - ); + typeof call.arguments.location === 'string' && + call.arguments.location.length > 0, + ) // Check if the location matches what was requested (case-insensitive) const locationMatches = toolExecuteCalls.some( @@ -190,21 +190,21 @@ async function testTemperatureTool( call.arguments.location && call.arguments.location .toLowerCase() - .includes(expectedLocation.toLowerCase()) - ); + .includes(expectedLocation.toLowerCase()), + ) - const issues: string[] = []; - if (!toolCallFound) issues.push("no tool call"); - if (!toolResultFound) issues.push("no tool result"); - if (!hasSeventy) issues.push("no '70' or 'seventy' in response"); + const issues: string[] = [] + if (!toolCallFound) issues.push('no tool call') + if (!toolResultFound) issues.push('no tool result') + if (!hasSeventy) issues.push("no '70' or 'seventy' in response") if (!locationPassedCorrectly) - issues.push("location argument not passed or invalid"); + issues.push('location argument not passed or invalid') if (!locationMatches) { issues.push( `location argument '${ - toolExecuteCalls[0]?.arguments?.location || "missing" - }' does not match expected '${expectedLocation}'` - ); + toolExecuteCalls[0]?.arguments?.location || 'missing' + }' does not match expected '${expectedLocation}'`, + ) } return { @@ -214,7 +214,7 @@ async function testTemperatureTool( hasSeventy && locationPassedCorrectly && locationMatches, - error: issues.length ? issues.join(", ") : undefined, + error: issues.length ? issues.join(', ') : undefined, meta: { hasSeventy, toolCallFound, @@ -227,134 +227,130 @@ async function testTemperatureTool( expectedLocation, actualLocation: toolExecuteCalls[0]?.arguments?.location, }, - }; + } }, - }); + }) } async function testApprovalToolFlow( - adapterContext: AdapterContext + adapterContext: AdapterContext, ): Promise { - const testName = "test3-approval-tool-flow"; + const testName = 'test3-approval-tool-flow' - let toolExecuteCalled = false; - let toolExecuteCallCount = 0; + let toolExecuteCalled = false + let toolExecuteCallCount = 0 const toolExecuteCalls: Array<{ - timestamp: string; - arguments: any; - result?: string; - error?: string; - }> = []; + timestamp: string + arguments: any + result?: string + error?: string + }> = [] const addToCartTool: Tool = { - type: "function", + type: 'function', function: { - name: "addToCart", - description: "Add an item to the shopping cart", + name: 'addToCart', + description: 'Add an item to the shopping cart', parameters: { - type: "object", + type: 'object', properties: { item: { - type: "string", - description: "The name of the item to add to the cart", + type: 'string', + description: 'The name of the item to add to the cart', }, }, - required: ["item"], + required: ['item'], }, }, needsApproval: true, execute: async (args: any) => { - toolExecuteCalled = true; - toolExecuteCallCount++; + toolExecuteCalled = true + toolExecuteCallCount++ const callInfo: any = { timestamp: new Date().toISOString(), arguments: args, - }; + } try { - const result = JSON.stringify({ success: true, item: args.item }); - callInfo.result = result; - toolExecuteCalls.push(callInfo); - return result; + const result = JSON.stringify({ success: true, item: args.item }) + callInfo.result = result + toolExecuteCalls.push(callInfo) + return result } catch (error: any) { - callInfo.error = error.message; - toolExecuteCalls.push(callInfo); - throw error; + callInfo.error = error.message + toolExecuteCalls.push(callInfo) + throw error } }, - }; + } const messages = [ { - role: "user" as const, - content: "add a hammer to the cart", + role: 'user' as const, + content: 'add a hammer to the cart', }, - ]; + ] const debugData = createDebugEnvelope( adapterContext.adapterName, testName, adapterContext.model, messages, - [addToCartTool] - ); + [addToCartTool], + ) const requestRun = await captureStream({ adapterName: adapterContext.adapterName, testName, - phase: "request", + phase: 'request', adapter: adapterContext.adapter, model: adapterContext.model, messages, tools: [addToCartTool], agentLoopStrategy: maxIterations(20), - }); + }) - const approval = requestRun.approvalRequests[0]; - const toolCall = requestRun.toolCalls[0]; + const approval = requestRun.approvalRequests[0] + const toolCall = requestRun.toolCalls[0] if (!approval || !toolCall) { - const error = `No approval request found. toolCalls: ${requestRun.toolCalls.length}, approvals: ${requestRun.approvalRequests.length}`; + const error = `No approval request found. toolCalls: ${requestRun.toolCalls.length}, approvals: ${requestRun.approvalRequests.length}` debugData.summary = { request: summarizeRun(requestRun), toolExecuteCalled, toolExecuteCallCount, toolExecuteCalls, - }; - debugData.chunks = requestRun.chunks; - debugData.result = { passed: false, error }; - await writeDebugFile(adapterContext.adapterName, testName, debugData); - console.log(`[${adapterContext.adapterName}] ❌ ${testName}: ${error}`); - return { passed: false, error }; + } + debugData.chunks = requestRun.chunks + debugData.result = { passed: false, error } + await writeDebugFile(adapterContext.adapterName, testName, debugData) + console.log(`[${adapterContext.adapterName}] ❌ ${testName}: ${error}`) + return { passed: false, error } } - const approvalMessages = buildApprovalMessages( - messages, - requestRun, - approval - ); + const approvalMessages = buildApprovalMessages(messages, requestRun, approval) const approvedRun = await captureStream({ adapterName: adapterContext.adapterName, testName, - phase: "approved", + phase: 'approved', adapter: adapterContext.adapter, model: adapterContext.model, messages: approvalMessages, tools: [addToCartTool], agentLoopStrategy: maxIterations(20), - }); + }) - const fullResponse = requestRun.fullResponse + " " + approvedRun.fullResponse; - const hasHammerInResponse = fullResponse.toLowerCase().includes("hammer"); + const fullResponse = requestRun.fullResponse + ' ' + approvedRun.fullResponse + const hasHammerInResponse = fullResponse.toLowerCase().includes('hammer') const passed = requestRun.toolCalls.length > 0 && requestRun.approvalRequests.length > 0 && toolExecuteCalled && toolExecuteCallCount === 1 && - hasHammerInResponse; + hasHammerInResponse - debugData.chunks = [...requestRun.chunks, ...approvedRun.chunks]; - debugData.finalMessages = approvedRun.reconstructedMessages; + debugData.chunks = [...requestRun.chunks, ...approvedRun.chunks] + debugData.finalMessages = approvedRun.reconstructedMessages debugData.summary = { request: summarizeRun(requestRun), approved: summarizeRun(approvedRun), @@ -362,7 +358,7 @@ async function testApprovalToolFlow( toolExecuteCalled, toolExecuteCallCount, toolExecuteCalls, - }; + } debugData.result = { passed, error: passed @@ -372,34 +368,34 @@ async function testApprovalToolFlow( }, approvalRequestFound: ${ requestRun.approvalRequests.length > 0 }, toolExecuteCalled: ${toolExecuteCalled}, toolExecuteCallCount: ${toolExecuteCallCount}, hasHammerInResponse: ${hasHammerInResponse}`, - }; + } - await writeDebugFile(adapterContext.adapterName, testName, debugData); + await writeDebugFile(adapterContext.adapterName, testName, debugData) console.log( - `[${adapterContext.adapterName}] ${passed ? "✅" : "❌"} ${testName}${ - passed ? "" : `: ${debugData.result.error}` - }` - ); + `[${adapterContext.adapterName}] ${passed ? '✅' : '❌'} ${testName}${ + passed ? '' : `: ${debugData.result.error}` + }`, + ) - return { passed, error: debugData.result.error }; + return { passed, error: debugData.result.error } } async function testSummarize( - adapterContext: AdapterContext + adapterContext: AdapterContext, ): Promise { - const testName = "test5-summarize"; - const adapterName = adapterContext.adapterName; - const model = adapterContext.summarizeModel || adapterContext.model; + const testName = 'test5-summarize' + const adapterName = adapterContext.adapterName + const model = adapterContext.summarizeModel || adapterContext.model const text = - "Paris is the capital and most populous city of France, known for landmarks like the Eiffel Tower and the Louvre. It is a major center for art, fashion, gastronomy, and culture."; + 'Paris is the capital and most populous city of France, known for landmarks like the Eiffel Tower and the Louvre. It is a major center for art, fashion, gastronomy, and culture.' const debugData: Record = { adapter: adapterName, test: testName, model, timestamp: new Date().toISOString(), - input: { text, maxLength: 80, style: "concise" as const }, - }; + input: { text, maxLength: 80, style: 'concise' as const }, + } try { const result = await summarize({ @@ -407,59 +403,59 @@ async function testSummarize( model, text, maxLength: 80, - style: "concise", - }); + style: 'concise', + }) - const summary = result.summary || ""; - const summaryLower = summary.toLowerCase(); - const passed = summary.length > 0 && summaryLower.includes("paris"); + const summary = result.summary || '' + const summaryLower = summary.toLowerCase() + const passed = summary.length > 0 && summaryLower.includes('paris') debugData.summary = { summary, usage: result.usage, summaryLength: summary.length, - }; + } debugData.result = { passed, error: passed ? undefined : "Summary missing 'Paris'", - }; + } - await writeDebugFile(adapterName, testName, debugData); + await writeDebugFile(adapterName, testName, debugData) console.log( - `[${adapterName}] ${passed ? "✅" : "❌"} ${testName}${ - passed ? "" : `: ${debugData.result.error}` - }` - ); + `[${adapterName}] ${passed ? '✅' : '❌'} ${testName}${ + passed ? '' : `: ${debugData.result.error}` + }`, + ) - return { passed, error: debugData.result.error }; + return { passed, error: debugData.result.error } } catch (error: any) { - const message = error?.message || String(error); - debugData.summary = { error: message }; - debugData.result = { passed: false, error: message }; - await writeDebugFile(adapterName, testName, debugData); - console.log(`[${adapterName}] ❌ ${testName}: ${message}`); - return { passed: false, error: message }; + const message = error?.message || String(error) + debugData.summary = { error: message } + debugData.result = { passed: false, error: message } + await writeDebugFile(adapterName, testName, debugData) + console.log(`[${adapterName}] ❌ ${testName}: ${message}`) + return { passed: false, error: message } } } async function testEmbedding( - adapterContext: AdapterContext + adapterContext: AdapterContext, ): Promise { - const testName = "test6-embedding"; - const adapterName = adapterContext.adapterName; + const testName = 'test6-embedding' + const adapterName = adapterContext.adapterName // Anthropic embedding is not supported, mark as ignored - if (adapterName === "Anthropic") { - console.log(`[${adapterName}] ⋯ ${testName}: Ignored (not supported)`); - return { passed: true, ignored: true }; + if (adapterName === 'Anthropic') { + console.log(`[${adapterName}] ⋯ ${testName}: Ignored (not supported)`) + return { passed: true, ignored: true } } - const model = adapterContext.embeddingModel || adapterContext.model; + const model = adapterContext.embeddingModel || adapterContext.model const inputs = [ - "The Eiffel Tower is located in Paris.", - "The Colosseum is located in Rome.", - ]; + 'The Eiffel Tower is located in Paris.', + 'The Colosseum is located in Rome.', + ] const debugData: Record = { adapter: adapterName, @@ -467,103 +463,103 @@ async function testEmbedding( model, timestamp: new Date().toISOString(), input: { inputs }, - }; + } try { const result = await embedding({ adapter: adapterContext.adapter, model, input: inputs, - }); + }) - const embeddings = result.embeddings || []; - const lengths = embeddings.map((e) => e?.length || 0); + const embeddings = result.embeddings || [] + const lengths = embeddings.map((e) => e?.length || 0) const vectorsAreNumeric = embeddings.every( - (vec) => Array.isArray(vec) && vec.every((n) => typeof n === "number") - ); + (vec) => Array.isArray(vec) && vec.every((n) => typeof n === 'number'), + ) const passed = embeddings.length === inputs.length && vectorsAreNumeric && - lengths.every((len) => len > 0); + lengths.every((len) => len > 0) debugData.summary = { embeddingLengths: lengths, firstEmbeddingPreview: embeddings[0]?.slice(0, 8), usage: result.usage, - }; + } debugData.result = { passed, - error: passed ? undefined : "Embeddings missing, empty, or invalid", - }; + error: passed ? undefined : 'Embeddings missing, empty, or invalid', + } - await writeDebugFile(adapterName, testName, debugData); + await writeDebugFile(adapterName, testName, debugData) console.log( - `[${adapterName}] ${passed ? "✅" : "❌"} ${testName}${ - passed ? "" : `: ${debugData.result.error}` - }` - ); + `[${adapterName}] ${passed ? '✅' : '❌'} ${testName}${ + passed ? '' : `: ${debugData.result.error}` + }`, + ) - return { passed, error: debugData.result.error }; + return { passed, error: debugData.result.error } } catch (error: any) { - const message = error?.message || String(error); - debugData.summary = { error: message }; - debugData.result = { passed: false, error: message }; - await writeDebugFile(adapterName, testName, debugData); - console.log(`[${adapterName}] ❌ ${testName}: ${message}`); - return { passed: false, error: message }; + const message = error?.message || String(error) + debugData.summary = { error: message } + debugData.result = { passed: false, error: message } + await writeDebugFile(adapterName, testName, debugData) + console.log(`[${adapterName}] ❌ ${testName}: ${message}`) + return { passed: false, error: message } } } const TEST_DEFINITIONS: TestDefinition[] = [ - { id: "chat-stream", label: "chat (stream)", run: testCapitalOfFrance }, - { id: "tools", label: "tools", run: testTemperatureTool }, - { id: "approval", label: "approval", run: testApprovalToolFlow }, - { id: "summarize", label: "summarize", run: testSummarize }, - { id: "embedding", label: "embedding", run: testEmbedding }, -]; + { id: 'chat-stream', label: 'chat (stream)', run: testCapitalOfFrance }, + { id: 'tools', label: 'tools', run: testTemperatureTool }, + { id: 'approval', label: 'approval', run: testApprovalToolFlow }, + { id: 'summarize', label: 'summarize', run: testSummarize }, + { id: 'embedding', label: 'embedding', run: testEmbedding }, +] function shouldTestAdapter(adapterName: string, filter?: string): boolean { - if (!filter) return true; - return adapterName.toLowerCase() === filter.toLowerCase(); + if (!filter) return true + return adapterName.toLowerCase() === filter.toLowerCase() } function formatGrid(results: AdapterResult[]) { - const headers = ["Adapter", ...TEST_DEFINITIONS.map((t) => t.label)]; + const headers = ['Adapter', ...TEST_DEFINITIONS.map((t) => t.label)] const rows = results.map((result) => [ `${result.adapter} (chat: ${result.model})`, ...TEST_DEFINITIONS.map((test) => { - const outcome = result.tests[test.id]; - if (!outcome) return "—"; - if (outcome.ignored) return "⋯"; - return outcome.passed ? "✅" : "❌"; + const outcome = result.tests[test.id] + if (!outcome) return '—' + if (outcome.ignored) return '⋯' + return outcome.passed ? '✅' : '❌' }), - ]); + ]) const colWidths = headers.map((header, index) => Math.max( header.length, - ...rows.map((row) => (row[index] ? row[index].length : 0)) - ) - ); + ...rows.map((row) => (row[index] ? row[index].length : 0)), + ), + ) - const separator = colWidths.map((w) => "-".repeat(w)).join("-+-"); + const separator = colWidths.map((w) => '-'.repeat(w)).join('-+-') const formatRow = (row: string[]) => - row.map((cell, idx) => cell.padEnd(colWidths[idx])).join(" | "); + row.map((cell, idx) => cell.padEnd(colWidths[idx])).join(' | ') - console.log(formatRow(headers)); - console.log(separator); - rows.forEach((row) => console.log(formatRow(row))); + console.log(formatRow(headers)) + console.log(separator) + rows.forEach((row) => console.log(formatRow(row))) } async function runTests(filterAdapter?: string) { if (filterAdapter) { - console.log(`🚀 Starting adapter tests for: ${filterAdapter}`); + console.log(`🚀 Starting adapter tests for: ${filterAdapter}`) } else { - console.log("🚀 Starting adapter tests for all adapters"); + console.log('🚀 Starting adapter tests for all adapters') } - const results: AdapterResult[] = []; + const results: AdapterResult[] = [] const runAdapterSuite = async (config: AdapterConfig) => { const ctx: AdapterContext = { @@ -572,7 +568,7 @@ async function runTests(filterAdapter?: string) { model: config.chatModel, summarizeModel: config.summarizeModel, embeddingModel: config.embeddingModel, - }; + } const adapterResult: AdapterResult = { adapter: config.name, @@ -580,130 +576,130 @@ async function runTests(filterAdapter?: string) { summarizeModel: config.summarizeModel, embeddingModel: config.embeddingModel, tests: {}, - }; + } console.log( - `\n${config.name} (chat: ${config.chatModel}, summarize: ${config.summarizeModel}, embedding: ${config.embeddingModel})` - ); + `\n${config.name} (chat: ${config.chatModel}, summarize: ${config.summarizeModel}, embedding: ${config.embeddingModel})`, + ) for (const test of TEST_DEFINITIONS) { - adapterResult.tests[test.id] = await test.run(ctx); + adapterResult.tests[test.id] = await test.run(ctx) } - results.push(adapterResult); - }; + results.push(adapterResult) + } // Anthropic - if (shouldTestAdapter("Anthropic", filterAdapter)) { - const anthropicApiKey = process.env.ANTHROPIC_API_KEY; + if (shouldTestAdapter('Anthropic', filterAdapter)) { + const anthropicApiKey = process.env.ANTHROPIC_API_KEY if (anthropicApiKey) { await runAdapterSuite({ - name: "Anthropic", + name: 'Anthropic', chatModel: ANTHROPIC_MODEL, summarizeModel: ANTHROPIC_SUMMARY_MODEL, embeddingModel: ANTHROPIC_EMBEDDING_MODEL, adapter: createAnthropic(anthropicApiKey), - }); + }) } else { - console.log("⚠️ Skipping Anthropic tests: ANTHROPIC_API_KEY not set"); + console.log('⚠️ Skipping Anthropic tests: ANTHROPIC_API_KEY not set') } } // OpenAI - if (shouldTestAdapter("OpenAI", filterAdapter)) { - const openaiApiKey = process.env.OPENAI_API_KEY; + if (shouldTestAdapter('OpenAI', filterAdapter)) { + const openaiApiKey = process.env.OPENAI_API_KEY if (openaiApiKey) { await runAdapterSuite({ - name: "OpenAI", + name: 'OpenAI', chatModel: OPENAI_MODEL, summarizeModel: OPENAI_SUMMARY_MODEL, embeddingModel: OPENAI_EMBEDDING_MODEL, adapter: createOpenAI(openaiApiKey), - }); + }) } else { - console.log("⚠️ Skipping OpenAI tests: OPENAI_API_KEY not set"); + console.log('⚠️ Skipping OpenAI tests: OPENAI_API_KEY not set') } } // Gemini - if (shouldTestAdapter("Gemini", filterAdapter)) { + if (shouldTestAdapter('Gemini', filterAdapter)) { const geminiApiKey = - process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY; + process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY if (geminiApiKey) { await runAdapterSuite({ - name: "Gemini", + name: 'Gemini', chatModel: GEMINI_MODEL, summarizeModel: GEMINI_SUMMARY_MODEL, embeddingModel: GEMINI_EMBEDDING_MODEL, adapter: createGemini(geminiApiKey), - }); + }) } else { console.log( - "⚠️ Skipping Gemini tests: GEMINI_API_KEY or GOOGLE_API_KEY not set" - ); + '⚠️ Skipping Gemini tests: GEMINI_API_KEY or GOOGLE_API_KEY not set', + ) } } // Ollama - if (shouldTestAdapter("Ollama", filterAdapter)) { + if (shouldTestAdapter('Ollama', filterAdapter)) { await runAdapterSuite({ - name: "Ollama", + name: 'Ollama', chatModel: OLLAMA_MODEL, summarizeModel: OLLAMA_SUMMARY_MODEL, embeddingModel: OLLAMA_EMBEDDING_MODEL, adapter: ollama(), - }); + }) } - console.log("\n"); + console.log('\n') if (results.length === 0) { - console.log("\n⚠️ No tests were run."); + console.log('\n⚠️ No tests were run.') if (filterAdapter) { console.log( - ` The adapter "${filterAdapter}" may not be configured or available.` - ); + ` The adapter "${filterAdapter}" may not be configured or available.`, + ) } - process.exit(1); + process.exit(1) } - formatGrid(results); + formatGrid(results) const allPassed = results.every((result) => TEST_DEFINITIONS.every((test) => { - const outcome = result.tests[test.id]; + const outcome = result.tests[test.id] // Ignored tests don't count as failures - return !outcome || outcome.ignored || outcome.passed; - }) - ); + return !outcome || outcome.ignored || outcome.passed + }), + ) - console.log("\n" + "=".repeat(60)); + console.log('\n' + '='.repeat(60)) if (allPassed) { - console.log("✅ All tests passed!"); - process.exit(0); + console.log('✅ All tests passed!') + process.exit(0) } else { - console.log("❌ Some tests failed"); - process.exit(1); + console.log('❌ Some tests failed') + process.exit(1) } } // Get adapter name from command line arguments (e.g., "pnpm start ollama") -const filterAdapter = process.argv[2]; +const filterAdapter = process.argv[2] // Validate adapter name if provided if (filterAdapter) { - const validAdapters = ["anthropic", "openai", "gemini", "ollama"]; - const normalizedFilter = filterAdapter.toLowerCase(); + const validAdapters = ['anthropic', 'openai', 'gemini', 'ollama'] + const normalizedFilter = filterAdapter.toLowerCase() if (!validAdapters.includes(normalizedFilter)) { console.error( `❌ Invalid adapter name: "${filterAdapter}"\n` + - `Valid adapters: ${validAdapters.join(", ")}` - ); - process.exit(1); + `Valid adapters: ${validAdapters.join(', ')}`, + ) + process.exit(1) } } runTests(filterAdapter).catch((error) => { - console.error("Fatal error:", error); - process.exit(1); -}); + console.error('Fatal error:', error) + process.exit(1) +}) diff --git a/packages/typescript/tests-adapters/tsconfig.json b/packages/typescript/tests-adapters/tsconfig.json index ae0a72d3b..f2a382384 100644 --- a/packages/typescript/tests-adapters/tsconfig.json +++ b/packages/typescript/tests-adapters/tsconfig.json @@ -7,4 +7,3 @@ "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist"] } - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a54a85611..0ada80708 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,6 +78,12 @@ importers: specifier: ^4.0.14 version: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + examples/cli: {} + + examples/php-slim: {} + + examples/python-fastapi: {} + examples/ts-chat: dependencies: '@ai-sdk/openai': @@ -202,7 +208,7 @@ importers: specifier: ^27.2.0 version: 27.2.0(postcss@8.5.6) typescript: - specifier: ^5.9.3 + specifier: 5.9.3 version: 5.9.3 vite: specifier: ^7.2.4 @@ -273,12 +279,6 @@ importers: specifier: ^2.11.10 version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - packages/typescript/ai-fallback: - dependencies: - '@tanstack/ai': - specifier: workspace:* - version: link:../ai - packages/typescript/ai-gemini: dependencies: '@google/genai': @@ -438,7 +438,7 @@ importers: specifier: ^4.20.6 version: 4.20.6 typescript: - specifier: ^5.9.3 + specifier: 5.9.3 version: 5.9.3 packages: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ac208b8b5..169e54ac0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,3 @@ packages: - - "packages/typescript/*" - - "examples/*" + - 'packages/typescript/*' + - 'examples/*' diff --git a/tsconfig.json b/tsconfig.json index 533d8b6ba..4bc4b2318 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, - "lib": ["DOM", "DOM.Iterable", "ES2022"], + "lib": ["DOM", "DOM.Iterable", "ES2023"], "module": "ES2022", "moduleResolution": "Bundler", "noEmit": true, From d712f95fe5157f85c2258d9be73fc49bedbc8c87 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 12:29:24 +0100 Subject: [PATCH 04/24] fix --- .gitignore | 2 +- packages/typescript/ai-react-ui/package.json | 14 ++++---- .../typescript/ai-react-ui/vite.config.ts | 36 +++++++++++++++++++ .../typescript/react-ai-devtools/package.json | 12 +++---- .../react-ai-devtools/tsconfig.json | 1 + .../react-ai-devtools/vite.config.ts | 36 +++++++++++++++++++ .../solid-ai-devtools/tsconfig.json | 1 + 7 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 packages/typescript/ai-react-ui/vite.config.ts create mode 100644 packages/typescript/react-ai-devtools/vite.config.ts diff --git a/.gitignore b/.gitignore index 8e5f0188c..490c6930d 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,4 @@ output/ # My TODOs. Feel free to ignore this. *-TODO.md -.nx + \ No newline at end of file diff --git a/packages/typescript/ai-react-ui/package.json b/packages/typescript/ai-react-ui/package.json index f6a65231e..adb793030 100644 --- a/packages/typescript/ai-react-ui/package.json +++ b/packages/typescript/ai-react-ui/package.json @@ -2,14 +2,14 @@ "name": "@tanstack/ai-react-ui", "version": "0.0.1", "description": "Headless React components for building AI chat interfaces", - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "main": "./dist/esm/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "import": "./dist/index.mjs", - "require": "./dist/index.js", - "types": "./dist/index.d.ts" + "import": "./dist/esm/index.mjs", + "require": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts" } }, "scripts": { @@ -51,4 +51,4 @@ "files": [ "dist" ] -} +} \ No newline at end of file diff --git a/packages/typescript/ai-react-ui/vite.config.ts b/packages/typescript/ai-react-ui/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/ai-react-ui/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/react-ai-devtools/package.json b/packages/typescript/react-ai-devtools/package.json index aa750d8bd..700249eec 100644 --- a/packages/typescript/react-ai-devtools/package.json +++ b/packages/typescript/react-ai-devtools/package.json @@ -25,19 +25,19 @@ "build": "vite build" }, "type": "module", - "types": "dist/index.d.ts", - "module": "dist/index.js", + "types": "./dist/esm/index.d.ts", + "module": "./dist/esm/index.js", "exports": { ".": { "import": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" } }, "./production": { "import": { - "types": "./dist/production.d.ts", - "default": "./dist/production.js" + "types": "./dist/esm/production.d.ts", + "default": "./dist/esm/production.js" } }, "./package.json": "./package.json" diff --git a/packages/typescript/react-ai-devtools/tsconfig.json b/packages/typescript/react-ai-devtools/tsconfig.json index 275835b24..0600e4996 100644 --- a/packages/typescript/react-ai-devtools/tsconfig.json +++ b/packages/typescript/react-ai-devtools/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "jsx": "preserve", "jsxFactory": "solid", + "moduleResolution": "bundler", "strictNullChecks": true }, "include": ["eslint.config.js", "prettier.config.js", "src"] diff --git a/packages/typescript/react-ai-devtools/vite.config.ts b/packages/typescript/react-ai-devtools/vite.config.ts new file mode 100644 index 000000000..a938cb71a --- /dev/null +++ b/packages/typescript/react-ai-devtools/vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' + +const config = defineConfig({ + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/typescript/solid-ai-devtools/tsconfig.json b/packages/typescript/solid-ai-devtools/tsconfig.json index 275835b24..0600e4996 100644 --- a/packages/typescript/solid-ai-devtools/tsconfig.json +++ b/packages/typescript/solid-ai-devtools/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "jsx": "preserve", "jsxFactory": "solid", + "moduleResolution": "bundler", "strictNullChecks": true }, "include": ["eslint.config.js", "prettier.config.js", "src"] From afa5a0b65fc011bdddb1191fcfcdf21d6a2a8034 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 12:30:01 +0100 Subject: [PATCH 05/24] fix --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 490c6930d..1dea6473a 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,4 @@ output/ # My TODOs. Feel free to ignore this. *-TODO.md - \ No newline at end of file +.nx \ No newline at end of file From 55858b0bfc336da8c1c828ad34a55fb30025d969 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 12:45:19 +0100 Subject: [PATCH 06/24] fix builds for all projects --- packages/typescript/ai-client/package.json | 5 +- .../ai-client/src/stream/processor.ts | 2 +- packages/typescript/ai-devtools/package.json | 5 +- packages/typescript/ai-gemini/package.json | 5 +- packages/typescript/ai-ollama/package.json | 5 +- packages/typescript/ai-openai/package.json | 5 +- packages/typescript/ai-react-ui/package.json | 4 +- .../typescript/ai-react-ui/src/chat-input.tsx | 5 +- .../ai-react-ui/src/chat-message.tsx | 11 ++-- .../ai-react-ui/src/chat-messages.tsx | 5 +- packages/typescript/ai-react-ui/src/chat.tsx | 13 +++-- packages/typescript/ai-react-ui/src/index.ts | 2 +- .../ai-react-ui/src/thinking-part.tsx | 2 +- .../ai-react-ui/src/tool-approval.tsx | 4 +- .../typescript/ai-react-ui/vite.config.ts | 1 + packages/typescript/ai-react/package.json | 5 +- .../typescript/react-ai-devtools/package.json | 6 +-- .../react-ai-devtools/vite.config.ts | 1 + .../typescript/solid-ai-devtools/package.json | 3 +- .../solid-ai-devtools/vite.config.ts | 39 ++++++++++++++ pnpm-lock.yaml | 51 ++++++++++++++----- 21 files changed, 134 insertions(+), 45 deletions(-) create mode 100644 packages/typescript/solid-ai-devtools/vite.config.ts diff --git a/packages/typescript/ai-client/package.json b/packages/typescript/ai-client/package.json index aaade9d65..1626c0946 100644 --- a/packages/typescript/ai-client/package.json +++ b/packages/typescript/ai-client/package.json @@ -43,5 +43,8 @@ "dependencies": { "@tanstack/ai": "workspace:*", "partial-json": "^0.1.7" + }, + "devDependencies": { + "vite": "^7.2.4" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-client/src/stream/processor.ts b/packages/typescript/ai-client/src/stream/processor.ts index 8cf3eadc7..e9adc8d39 100644 --- a/packages/typescript/ai-client/src/stream/processor.ts +++ b/packages/typescript/ai-client/src/stream/processor.ts @@ -260,7 +260,7 @@ export class StreamProcessor { * Handle a tool call delta chunk */ private handleToolCallDelta( - index: number, + _index: number, toolCall: { id: string; function: { name: string; arguments: string } }, ): void { const toolCallId = toolCall.id diff --git a/packages/typescript/ai-devtools/package.json b/packages/typescript/ai-devtools/package.json index f7a159300..19470d8f3 100644 --- a/packages/typescript/ai-devtools/package.json +++ b/packages/typescript/ai-devtools/package.json @@ -54,6 +54,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "vite-plugin-solid": "^2.11.10" + "vite-plugin-solid": "^2.11.10", + "vite": "^7.2.4" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-gemini/package.json b/packages/typescript/ai-gemini/package.json index 9eab3e267..9e4a0afe0 100644 --- a/packages/typescript/ai-gemini/package.json +++ b/packages/typescript/ai-gemini/package.json @@ -43,7 +43,10 @@ "@google/genai": "^1.30.0", "@tanstack/ai": "workspace:*" }, + "devDependencies": { + "vite": "^7.2.4" + }, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-ollama/package.json b/packages/typescript/ai-ollama/package.json index d53696d5d..929bc2414 100644 --- a/packages/typescript/ai-ollama/package.json +++ b/packages/typescript/ai-ollama/package.json @@ -44,7 +44,10 @@ "@tanstack/ai": "workspace:*", "ollama": "^0.6.3" }, + "devDependencies": { + "vite": "^7.2.4" + }, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-openai/package.json b/packages/typescript/ai-openai/package.json index 4aab0c98f..d2c7164b9 100644 --- a/packages/typescript/ai-openai/package.json +++ b/packages/typescript/ai-openai/package.json @@ -44,9 +44,10 @@ "openai": "^6.9.1" }, "devDependencies": { - "zod": "^4.1.13" + "zod": "^4.1.13", + "vite": "^7.2.4" }, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-react-ui/package.json b/packages/typescript/ai-react-ui/package.json index adb793030..4998a441d 100644 --- a/packages/typescript/ai-react-ui/package.json +++ b/packages/typescript/ai-react-ui/package.json @@ -5,6 +5,7 @@ "main": "./dist/esm/index.js", "module": "./dist/esm/index.mjs", "types": "./dist/esm/index.d.ts", + "type": "module", "exports": { ".": { "import": "./dist/esm/index.mjs", @@ -45,8 +46,7 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { - "@types/react": "^19.2.7", - "react": "^19.2.0" + "vite": "^7.2.4" }, "files": [ "dist" diff --git a/packages/typescript/ai-react-ui/src/chat-input.tsx b/packages/typescript/ai-react-ui/src/chat-input.tsx index d513d2c62..0a1aa0fb6 100644 --- a/packages/typescript/ai-react-ui/src/chat-input.tsx +++ b/packages/typescript/ai-react-ui/src/chat-input.tsx @@ -1,5 +1,6 @@ -import { useState, useRef, type ReactNode, type RefObject } from 'react' +import { useRef, useState } from 'react' import { useChatContext } from './chat' +import type { ReactNode, RefObject } from 'react' export interface ChatInputRenderProps { /** Current input value */ @@ -13,7 +14,7 @@ export interface ChatInputRenderProps { /** Is input disabled */ disabled: boolean /** Ref to the input element */ - inputRef: RefObject + inputRef: RefObject } export interface ChatInputProps { diff --git a/packages/typescript/ai-react-ui/src/chat-message.tsx b/packages/typescript/ai-react-ui/src/chat-message.tsx index 8eea8f892..bda859885 100644 --- a/packages/typescript/ai-react-ui/src/chat-message.tsx +++ b/packages/typescript/ai-react-ui/src/chat-message.tsx @@ -1,6 +1,6 @@ -import type { ReactNode } from 'react' -import type { UIMessage, MessagePart } from '@tanstack/ai-react' import { ThinkingPart } from './thinking-part' +import type { ReactNode } from 'react' +import type { UIMessage } from '@tanstack/ai-react' export interface ToolCallRenderProps { id: string @@ -113,7 +113,7 @@ export function ChatMessage({ className={combinedClassName || undefined} data-message-id={message.id} data-message-role={message.role} - data-message-created={message.createdAt.toISOString()} + data-message-created={message.createdAt?.toISOString()} > {message.parts.map((part, index) => { // Check if thinking is complete (if there's a text part after this thinking part) @@ -147,7 +147,8 @@ function MessagePart({ defaultToolRenderer, toolResultRenderer, }: { - part: MessagePart + // TODO Fix me + part: any isThinkingComplete?: boolean textPartRenderer?: ChatMessageProps['textPartRenderer'] thinkingPartRenderer?: ChatMessageProps['thinkingPartRenderer'] @@ -197,7 +198,7 @@ function MessagePart({ // Check if there's a specific renderer for this tool if (toolsRenderer?.[part.name]) { - return <>{toolsRenderer[part.name](toolProps)} + return <>{toolsRenderer[part.name]?.(toolProps)} } // Use default tool renderer if provided diff --git a/packages/typescript/ai-react-ui/src/chat-messages.tsx b/packages/typescript/ai-react-ui/src/chat-messages.tsx index fbc7f7b58..b9264bb2b 100644 --- a/packages/typescript/ai-react-ui/src/chat-messages.tsx +++ b/packages/typescript/ai-react-ui/src/chat-messages.tsx @@ -1,7 +1,8 @@ -import { useEffect, useRef, type ReactNode } from 'react' +import { useEffect, useRef } from 'react' import { useChatContext } from './chat' -import type { UIMessage } from '@tanstack/ai-react' import { ChatMessage } from './chat-message' +import type { ReactNode } from 'react' +import type { UIMessage } from '@tanstack/ai-react' export interface ChatMessagesProps { /** Custom render function for each message */ diff --git a/packages/typescript/ai-react-ui/src/chat.tsx b/packages/typescript/ai-react-ui/src/chat.tsx index 9538395fd..bc90f006f 100644 --- a/packages/typescript/ai-react-ui/src/chat.tsx +++ b/packages/typescript/ai-react-ui/src/chat.tsx @@ -1,6 +1,11 @@ -import { createContext, useContext, type ReactNode } from 'react' -import { useChat, type UseChatReturn } from '@tanstack/ai-react' -import type { ConnectionAdapter, UIMessage } from '@tanstack/ai-react' +import { createContext, useContext } from 'react' +import { useChat } from '@tanstack/ai-react' +import type { ReactNode } from 'react' +import type { + ConnectionAdapter, + UIMessage, + UseChatReturn, +} from '@tanstack/ai-react' /** * Chat context - provides chat state to all child components @@ -29,7 +34,7 @@ export interface ChatProps { /** Connection adapter for communicating with your API */ connection: ConnectionAdapter /** Initial messages to display */ - initialMessages?: UIMessage[] + initialMessages?: Array /** Custom message ID generator */ id?: string /** Additional body data to send with requests */ diff --git a/packages/typescript/ai-react-ui/src/index.ts b/packages/typescript/ai-react-ui/src/index.ts index 98d3fddbc..512e37d34 100644 --- a/packages/typescript/ai-react-ui/src/index.ts +++ b/packages/typescript/ai-react-ui/src/index.ts @@ -55,7 +55,7 @@ export type { ToolCallPart, ToolResultPart, TextPart as TextPartType, - ThinkingPart as ThinkingPartType, + ConnectionAdapter, } from '@tanstack/ai-client' diff --git a/packages/typescript/ai-react-ui/src/thinking-part.tsx b/packages/typescript/ai-react-ui/src/thinking-part.tsx index e381d75e7..4a3caca2c 100644 --- a/packages/typescript/ai-react-ui/src/thinking-part.tsx +++ b/packages/typescript/ai-react-ui/src/thinking-part.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react' +import { useEffect, useState } from 'react' export interface ThinkingPartProps { /** The thinking content to render */ diff --git a/packages/typescript/ai-react-ui/src/tool-approval.tsx b/packages/typescript/ai-react-ui/src/tool-approval.tsx index 9fdb51a3b..9f2d4efe0 100644 --- a/packages/typescript/ai-react-ui/src/tool-approval.tsx +++ b/packages/typescript/ai-react-ui/src/tool-approval.tsx @@ -1,5 +1,5 @@ -import type { ReactNode } from 'react' import { useChatContext } from './chat' +import type { ReactNode } from 'react' export interface ToolApprovalProps { /** Tool call ID */ @@ -51,7 +51,7 @@ export interface ToolApprovalRenderProps { * ``` */ export function ToolApproval({ - toolCallId, + toolCallId: _, toolName, input, approval, diff --git a/packages/typescript/ai-react-ui/vite.config.ts b/packages/typescript/ai-react-ui/vite.config.ts index a938cb71a..edfcce5da 100644 --- a/packages/typescript/ai-react-ui/vite.config.ts +++ b/packages/typescript/ai-react-ui/vite.config.ts @@ -32,5 +32,6 @@ export default mergeConfig( tanstackViteConfig({ entry: ['./src/index.ts'], srcDir: './src', + cjs: false }), ) diff --git a/packages/typescript/ai-react/package.json b/packages/typescript/ai-react/package.json index 1b2e7df8c..aa1602ed8 100644 --- a/packages/typescript/ai-react/package.json +++ b/packages/typescript/ai-react/package.json @@ -51,11 +51,12 @@ "@vitejs/plugin-react": "^5.1.1", "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "^7.0.1", - "react": "^19.2.0" + "vite": "^7.2.4" }, "peerDependencies": { "@tanstack/ai": "workspace:*", "@tanstack/ai-client": "workspace:*", - "react": ">=18.0.0" + "react": ">=18.0.0", + "@types/react": ">=18.0.0" } } \ No newline at end of file diff --git a/packages/typescript/react-ai-devtools/package.json b/packages/typescript/react-ai-devtools/package.json index 700249eec..bdd840709 100644 --- a/packages/typescript/react-ai-devtools/package.json +++ b/packages/typescript/react-ai-devtools/package.json @@ -52,10 +52,10 @@ "@tanstack/devtools-utils": "^0.0.8" }, "devDependencies": { - "@types/react": "^19.2.7", - "react": "^19.2.0" + "vite": "^7.2.4" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" } } \ No newline at end of file diff --git a/packages/typescript/react-ai-devtools/vite.config.ts b/packages/typescript/react-ai-devtools/vite.config.ts index a938cb71a..a3fdc4153 100644 --- a/packages/typescript/react-ai-devtools/vite.config.ts +++ b/packages/typescript/react-ai-devtools/vite.config.ts @@ -32,5 +32,6 @@ export default mergeConfig( tanstackViteConfig({ entry: ['./src/index.ts'], srcDir: './src', + cjs: false, }), ) diff --git a/packages/typescript/solid-ai-devtools/package.json b/packages/typescript/solid-ai-devtools/package.json index ac7dee1c6..583786dbd 100644 --- a/packages/typescript/solid-ai-devtools/package.json +++ b/packages/typescript/solid-ai-devtools/package.json @@ -51,7 +51,8 @@ "@tanstack/devtools-utils": "^0.0.8" }, "devDependencies": { - "vite-plugin-solid": "^2.11.10" + "vite-plugin-solid": "^2.11.10", + "vite": "^7.2.4" }, "peerDependencies": { "solid-js": ">=1.9.7" diff --git a/packages/typescript/solid-ai-devtools/vite.config.ts b/packages/typescript/solid-ai-devtools/vite.config.ts new file mode 100644 index 000000000..739e9750d --- /dev/null +++ b/packages/typescript/solid-ai-devtools/vite.config.ts @@ -0,0 +1,39 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import packageJson from './package.json' +import solid from "vite-plugin-solid"; + +const config = defineConfig({ + plugins: [solid()], + test: { + name: packageJson.name, + dir: './', + watch: false, + setupFiles: ['./tests/test-setup.ts'], + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html', 'lcov'], + exclude: [ + 'node_modules/', + 'dist/', + 'tests/', + '**/*.test.ts', + '**/*.config.ts', + '**/types.ts', + ], + include: ['src/**/*.ts'], + }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + cjs: false, + }), +) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ada80708..37e785dab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -253,6 +253,10 @@ importers: partial-json: specifier: ^0.1.7 version: 0.1.7 + devDependencies: + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai-devtools: dependencies: @@ -275,6 +279,9 @@ importers: specifier: ^1.9.10 version: 1.9.10 devDependencies: + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) @@ -287,6 +294,10 @@ importers: '@tanstack/ai': specifier: workspace:* version: link:../ai + devDependencies: + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai-ollama: dependencies: @@ -296,6 +307,10 @@ importers: ollama: specifier: ^0.6.3 version: 0.6.3 + devDependencies: + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai-openai: dependencies: @@ -306,6 +321,9 @@ importers: specifier: ^6.9.1 version: 6.9.1(ws@8.18.3)(zod@4.1.13) devDependencies: + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) zod: specifier: ^4.1.13 version: 4.1.13 @@ -318,6 +336,9 @@ importers: '@tanstack/ai-client': specifier: workspace:* version: link:../ai-client + react: + specifier: '>=18.0.0' + version: 19.2.0 devDependencies: '@eslint-react/eslint-plugin': specifier: ^2.3.9 @@ -337,9 +358,9 @@ importers: eslint-plugin-react-hooks: specifier: ^7.0.1 version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) - react: - specifier: ^19.2.0 - version: 19.2.0 + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/ai-react-ui: dependencies: @@ -352,6 +373,9 @@ importers: highlight.js: specifier: ^11.11.1 version: 11.11.1 + react: + specifier: ^18.0.0 || ^19.0.0 + version: 19.2.0 react-dom: specifier: ^18.0.0 || ^19.0.0 version: 19.2.0(react@19.2.0) @@ -371,12 +395,9 @@ importers: specifier: ^4.0.1 version: 4.0.1 devDependencies: - '@types/react': - specifier: ^19.2.7 - version: 19.2.7 - react: - specifier: ^19.2.0 - version: 19.2.0 + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/react-ai-devtools: dependencies: @@ -386,13 +407,16 @@ importers: '@tanstack/devtools-utils': specifier: ^0.0.8 version: 0.0.8(@types/react@19.2.7)(csstype@3.2.3)(react@19.2.0)(solid-js@1.9.10) - devDependencies: '@types/react': - specifier: ^19.2.7 + specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 version: 19.2.7 react: - specifier: ^19.2.0 + specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 version: 19.2.0 + devDependencies: + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/typescript/solid-ai-devtools: dependencies: @@ -406,6 +430,9 @@ importers: specifier: '>=1.9.7' version: 1.9.10 devDependencies: + vite: + specifier: ^7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.11.10 version: 2.11.10(@testing-library/jest-dom@6.9.1)(solid-js@1.9.10)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) From 58ababff0606fba56d461a6374a9266ba8e8db8a Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 12:53:22 +0100 Subject: [PATCH 07/24] fix package json exports --- packages/typescript/ai-devtools/package.json | 12 ++++++------ packages/typescript/ai-openai/package.json | 6 +++--- packages/typescript/ai-react-ui/package.json | 11 +++++------ packages/typescript/ai-react/package.json | 6 +++--- .../typescript/react-ai-devtools/package.json | 9 ++------- .../typescript/react-ai-devtools/vite.config.ts | 2 +- .../typescript/solid-ai-devtools/package.json | 16 ++++++++-------- .../typescript/solid-ai-devtools/vite.config.ts | 2 +- pnpm-lock.yaml | 3 +++ 9 files changed, 32 insertions(+), 35 deletions(-) diff --git a/packages/typescript/ai-devtools/package.json b/packages/typescript/ai-devtools/package.json index 19470d8f3..00d3ba55b 100644 --- a/packages/typescript/ai-devtools/package.json +++ b/packages/typescript/ai-devtools/package.json @@ -14,12 +14,12 @@ "module": "./dist/esm/index.js", "exports": { ".": { - "import": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" }, "./production": { - "import": "./dist/esm/production.js", - "types": "./dist/esm/production.d.ts" + "types": "./dist/esm/production.d.ts", + "import": "./dist/esm/production.js" }, "./package.json": "./package.json" }, @@ -54,7 +54,7 @@ "solid-js": "^1.9.10" }, "devDependencies": { - "vite-plugin-solid": "^2.11.10", - "vite": "^7.2.4" + "vite": "^7.2.4", + "vite-plugin-solid": "^2.11.10" } } \ No newline at end of file diff --git a/packages/typescript/ai-openai/package.json b/packages/typescript/ai-openai/package.json index d2c7164b9..22e781cae 100644 --- a/packages/typescript/ai-openai/package.json +++ b/packages/typescript/ai-openai/package.json @@ -44,10 +44,10 @@ "openai": "^6.9.1" }, "devDependencies": { - "zod": "^4.1.13", - "vite": "^7.2.4" + "vite": "^7.2.4", + "zod": "^4.1.13" }, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-react-ui/package.json b/packages/typescript/ai-react-ui/package.json index 4998a441d..84a030274 100644 --- a/packages/typescript/ai-react-ui/package.json +++ b/packages/typescript/ai-react-ui/package.json @@ -2,15 +2,13 @@ "name": "@tanstack/ai-react-ui", "version": "0.0.1", "description": "Headless React components for building AI chat interfaces", - "main": "./dist/esm/index.js", - "module": "./dist/esm/index.mjs", + "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", "type": "module", "exports": { ".": { - "import": "./dist/esm/index.mjs", - "require": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" } }, "scripts": { @@ -43,7 +41,8 @@ "@tanstack/ai-client": "workspace:*", "@tanstack/ai-react": "workspace:*", "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react-dom": "^18.0.0 || ^19.0.0", + "@types/react": ">=18.0.0" }, "devDependencies": { "vite": "^7.2.4" diff --git a/packages/typescript/ai-react/package.json b/packages/typescript/ai-react/package.json index aa1602ed8..48926469f 100644 --- a/packages/typescript/ai-react/package.json +++ b/packages/typescript/ai-react/package.json @@ -56,7 +56,7 @@ "peerDependencies": { "@tanstack/ai": "workspace:*", "@tanstack/ai-client": "workspace:*", - "react": ">=18.0.0", - "@types/react": ">=18.0.0" + "@types/react": ">=18.0.0", + "react": ">=18.0.0" } -} \ No newline at end of file +} diff --git a/packages/typescript/react-ai-devtools/package.json b/packages/typescript/react-ai-devtools/package.json index bdd840709..de5bb13da 100644 --- a/packages/typescript/react-ai-devtools/package.json +++ b/packages/typescript/react-ai-devtools/package.json @@ -4,11 +4,6 @@ "description": "React Devtools for TanStack AI.", "author": "tannerlinsley", "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/ai.git", - "directory": "packages/react-ai-devtools" - }, "homepage": "https://tanstack.com/ai", "funding": { "type": "github", @@ -55,7 +50,7 @@ "vite": "^7.2.4" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } } \ No newline at end of file diff --git a/packages/typescript/react-ai-devtools/vite.config.ts b/packages/typescript/react-ai-devtools/vite.config.ts index a3fdc4153..ed92e2ac9 100644 --- a/packages/typescript/react-ai-devtools/vite.config.ts +++ b/packages/typescript/react-ai-devtools/vite.config.ts @@ -30,7 +30,7 @@ const config = defineConfig({ export default mergeConfig( config, tanstackViteConfig({ - entry: ['./src/index.ts'], + entry: ['./src/index.ts', "./src/production.ts"], srcDir: './src', cjs: false, }), diff --git a/packages/typescript/solid-ai-devtools/package.json b/packages/typescript/solid-ai-devtools/package.json index 583786dbd..6caeda85c 100644 --- a/packages/typescript/solid-ai-devtools/package.json +++ b/packages/typescript/solid-ai-devtools/package.json @@ -10,17 +10,17 @@ "directory": "packages/typescript/ai" }, "type": "module", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "types": "./dist/esm/index.d.ts", "exports": { ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" + "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js" }, "./production": { "import": { - "types": "./dist/production.d.ts", - "default": "./dist/production.js" + "types": "./dist/esm/production.d.ts", + "default": "./dist/esm/production.js" } } }, @@ -51,8 +51,8 @@ "@tanstack/devtools-utils": "^0.0.8" }, "devDependencies": { - "vite-plugin-solid": "^2.11.10", - "vite": "^7.2.4" + "vite": "^7.2.4", + "vite-plugin-solid": "^2.11.10" }, "peerDependencies": { "solid-js": ">=1.9.7" diff --git a/packages/typescript/solid-ai-devtools/vite.config.ts b/packages/typescript/solid-ai-devtools/vite.config.ts index 739e9750d..14d0e0ae8 100644 --- a/packages/typescript/solid-ai-devtools/vite.config.ts +++ b/packages/typescript/solid-ai-devtools/vite.config.ts @@ -32,7 +32,7 @@ const config = defineConfig({ export default mergeConfig( config, tanstackViteConfig({ - entry: ['./src/index.ts'], + entry: ['./src/index.ts', "./src/production.ts"], srcDir: './src', cjs: false, }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 37e785dab..807f3ad78 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -370,6 +370,9 @@ importers: '@tanstack/ai-react': specifier: workspace:* version: link:../ai-react + '@types/react': + specifier: '>=18.0.0' + version: 19.2.7 highlight.js: specifier: ^11.11.1 version: 11.11.1 From 195b35af27f384344106144704ca69a0e87ff780 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 13:42:48 +0100 Subject: [PATCH 08/24] fix most of the bundling and failing test issues --- package.json | 5 +- .../typescript/ai-anthropic/eslint.config.js | 9 - .../ai-anthropic/src/anthropic-adapter.ts | 23 +- .../typescript/ai-anthropic/src/model-meta.ts | 268 +++++----- .../src/text/text-provider-options.ts | 28 +- .../ai-anthropic/src/tools/web-search-tool.ts | 31 +- .../typescript/ai-anthropic/tsconfig.json | 2 +- .../typescript/ai-anthropic/vite.config.ts | 2 +- .../ai-client/src/message-converters.ts | 30 +- .../ai-client/tests/chat-client-abort.test.ts | 26 +- .../ai-client/tests/chat-client.test.ts | 42 +- .../tests/connection-adapters-abort.test.ts | 29 +- .../tests/connection-adapters.test.ts | 33 +- .../typescript/ai-client/tests/events.test.ts | 5 +- .../tests/message-converters.test.ts | 70 +-- .../ai-client/tests/message-updaters.test.ts | 170 +++--- .../ai-client/tests/stream-processor.test.ts | 5 +- .../typescript/ai-client/tests/test-utils.ts | 37 +- packages/typescript/ai-client/vite.config.ts | 1 - packages/typescript/ai-devtools/package.json | 3 +- .../typescript/ai-devtools/vite.config.ts | 3 +- .../typescript/ai-gemini/src/model-meta.ts | 256 ++++----- .../typescript/ai-gemini/tsdown.config.ts | 12 - packages/typescript/ai-gemini/vite.config.ts | 1 - packages/typescript/ai-ollama/package.json | 2 +- .../typescript/ai-ollama/tsdown.config.ts | 12 - packages/typescript/ai-ollama/vite.config.ts | 1 - .../ai-openai/live-tests/example-guitars.ts | 83 --- .../live-tests/test-tool-arguments.ts | 159 ------ .../typescript/ai-openai/src/model-meta.ts | 490 +++++++++--------- .../src/text/text-provider-options.ts | 5 + .../ai-openai/src/tools/file-search-tool.ts | 2 +- .../src/tools/image-generation-tool.ts | 2 +- .../typescript/ai-openai/tsdown.config.ts | 12 - packages/typescript/ai-openai/vite.config.ts | 1 - packages/typescript/ai-react-ui/package.json | 5 +- .../typescript/ai-react-ui/tsdown.config.ts | 9 - .../typescript/ai-react-ui/vite.config.ts | 1 - packages/typescript/ai-react/package.json | 6 +- packages/typescript/ai-react/tsdown.config.ts | 12 - packages/typescript/ai-react/vite.config.ts | 1 - packages/typescript/ai/src/event-client.ts | 2 +- packages/typescript/ai/tests/ai-chat.test.ts | 77 +-- .../ai/tests/tool-call-manager.test.ts | 48 +- packages/typescript/ai/vite.config.ts | 1 - .../react-ai-devtools/tsdown.config.ts | 11 - .../react-ai-devtools/vite.config.ts | 1 - .../solid-ai-devtools/tsdown.config.ts | 11 - .../solid-ai-devtools/vite.config.ts | 1 - .../typescript/tests-adapters/src/harness.ts | 70 +-- 50 files changed, 891 insertions(+), 1225 deletions(-) delete mode 100644 packages/typescript/ai-anthropic/eslint.config.js delete mode 100644 packages/typescript/ai-gemini/tsdown.config.ts delete mode 100644 packages/typescript/ai-ollama/tsdown.config.ts delete mode 100644 packages/typescript/ai-openai/live-tests/example-guitars.ts delete mode 100644 packages/typescript/ai-openai/live-tests/test-tool-arguments.ts delete mode 100644 packages/typescript/ai-openai/tsdown.config.ts delete mode 100644 packages/typescript/ai-react-ui/tsdown.config.ts delete mode 100644 packages/typescript/ai-react/tsdown.config.ts delete mode 100644 packages/typescript/react-ai-devtools/tsdown.config.ts delete mode 100644 packages/typescript/solid-ai-devtools/tsdown.config.ts diff --git a/package.json b/package.json index 443e8a7fc..0e6014706 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "lint": "pnpm run -r lint", "cli": "cd examples/cli && pnpm dev", "cli:build": "cd examples/cli && pnpm build && pnpm start", - "demo:tools": "cd examples/cli && pnpm tools", + "demo:tools": "cd examples/cli && pnpm run tools", "build": "nx affected --skip-nx-cache --targets=build --exclude=examples/** && size-limit", "build:all": "nx run-many --targets=build --exclude=examples/** && size-limit", "build:core": "nx run-many --targets=build --projects=packages/ai && size-limit", @@ -65,7 +65,6 @@ "@size-limit/preset-small-lib": "^11.2.0", "@svitejs/changesets-changelog-github-compact": "^1.2.0", "@tanstack/config": "0.22.1", - "@testing-library/jest-dom": "^6.9.1", "@types/node": "^24.10.1", "eslint": "^9.39.1", "eslint-plugin-unused-imports": "^4.3.0", @@ -99,4 +98,4 @@ "@tanstack/solid-ai-devtools": "workspace:*", "@tanstack/tests-adapters": "workspace:*" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-anthropic/eslint.config.js b/packages/typescript/ai-anthropic/eslint.config.js deleted file mode 100644 index c3d273991..000000000 --- a/packages/typescript/ai-anthropic/eslint.config.js +++ /dev/null @@ -1,9 +0,0 @@ -import rootConfig from '../../../eslint.config.js' - -/** @type {import('eslint').Linter.Config[]} */ -export default [ - ...rootConfig, - { - rules: {}, - }, -] diff --git a/packages/typescript/ai-anthropic/src/anthropic-adapter.ts b/packages/typescript/ai-anthropic/src/anthropic-adapter.ts index d4ee34452..ca3c09dc1 100644 --- a/packages/typescript/ai-anthropic/src/anthropic-adapter.ts +++ b/packages/typescript/ai-anthropic/src/anthropic-adapter.ts @@ -1,7 +1,10 @@ import Anthropic_SDK from '@anthropic-ai/sdk' import { BaseAdapter } from '@tanstack/ai' -import { ANTHROPIC_EMBEDDING_MODELS, ANTHROPIC_MODELS } from './model-meta' +import { ANTHROPIC_MODELS } from './model-meta' import { convertToolsToProviderFormat } from './tools/tool-converter' +import { + validateTextProviderOptions +} from './text/text-provider-options' import type { ChatStreamOptionsUnion, EmbeddingOptions, @@ -15,6 +18,7 @@ import type { AnthropicChatModelProviderOptionsByName } from './model-meta' import type { ExternalTextProviderOptions, InternalTextProviderOptions, + } from './text/text-provider-options' import type { MessageParam } from '@anthropic-ai/sdk/resources/messages' @@ -30,15 +34,15 @@ export type AnthropicProviderOptions = ExternalTextProviderOptions type AnthropicContentBlocks = Extract> extends Array - ? Array - : never + ? Array + : never type AnthropicContentBlock = AnthropicContentBlocks extends Array ? Block : never type AnthropicChatOptions = ChatStreamOptionsUnion< BaseAdapter< typeof ANTHROPIC_MODELS, - typeof ANTHROPIC_EMBEDDING_MODELS, + [], AnthropicProviderOptions, Record, AnthropicChatModelProviderOptionsByName @@ -47,14 +51,14 @@ type AnthropicChatOptions = ChatStreamOptionsUnion< export class Anthropic extends BaseAdapter< typeof ANTHROPIC_MODELS, - typeof ANTHROPIC_EMBEDDING_MODELS, + [], AnthropicProviderOptions, Record, AnthropicChatModelProviderOptionsByName > { name = 'anthropic' as const models = ANTHROPIC_MODELS - embeddingModels = ANTHROPIC_EMBEDDING_MODELS + declare _modelProviderOptionsByName: AnthropicChatModelProviderOptionsByName private client: Anthropic_SDK @@ -204,9 +208,9 @@ export class Anthropic extends BaseAdapter< const value = providerOptions[key] // Anthropic expects tool_choice to be an object, not a string if (key === 'tool_choice' && typeof value === 'string') { - ;(validProviderOptions as any)[key] = { type: value } + ; (validProviderOptions as any)[key] = { type: value } } else { - ;(validProviderOptions as any)[key] = value + ; (validProviderOptions as any)[key] = value } } } @@ -232,6 +236,7 @@ export class Anthropic extends BaseAdapter< tools: tools, ...validProviderOptions, } + validateTextProviderOptions(requestParams) return requestParams } @@ -403,7 +408,7 @@ export class Anthropic extends BaseAdapter< event.delta.stop_reason === 'tool_use' ? 'tool_calls' : // TODO Fix the any and map the responses properly - (event.delta.stop_reason as any), + (event.delta.stop_reason as any), usage: { promptTokens: event.usage.input_tokens || 0, diff --git a/packages/typescript/ai-anthropic/src/model-meta.ts b/packages/typescript/ai-anthropic/src/model-meta.ts index 2b85e0e5a..9603d00b8 100644 --- a/packages/typescript/ai-anthropic/src/model-meta.ts +++ b/packages/typescript/ai-anthropic/src/model-meta.ts @@ -65,13 +65,13 @@ const CLAUDE_SONNET_4_5 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_HAIKU_4_5 = { @@ -94,13 +94,13 @@ const CLAUDE_HAIKU_4_5 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_OPUS_4_1 = { @@ -123,13 +123,13 @@ const CLAUDE_OPUS_4_1 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_OPUS_4_5 = { @@ -152,13 +152,13 @@ const CLAUDE_OPUS_4_5 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_SONNET_4 = { @@ -181,13 +181,13 @@ const CLAUDE_SONNET_4 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_SONNET_3_7 = { @@ -209,13 +209,13 @@ const CLAUDE_SONNET_3_7 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_OPUS_4 = { @@ -238,13 +238,13 @@ const CLAUDE_OPUS_4 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_HAIKU_3_5 = { @@ -267,13 +267,13 @@ const CLAUDE_HAIKU_3_5 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_HAIKU_3 = { @@ -296,16 +296,16 @@ const CLAUDE_HAIKU_3 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > -export const ANTHROPIC_MODEL_META = { +const ANTHROPIC_MODEL_META = { [CLAUDE_OPUS_4_5.name]: CLAUDE_OPUS_4_5, [CLAUDE_SONNET_4_5.name]: CLAUDE_SONNET_4_5, [CLAUDE_HAIKU_4_5.name]: CLAUDE_HAIKU_4_5, @@ -327,8 +327,8 @@ export type AnthropicModelProviderOptions< any, any > - ? TProviderOptions - : unknown + ? TProviderOptions + : unknown export type AnthropicModelToolCapabilities< TModel extends keyof AnthropicModelMetaMap, @@ -338,8 +338,8 @@ export type AnthropicModelToolCapabilities< infer TToolCapabilities, any > - ? TToolCapabilities - : unknown + ? TToolCapabilities + : unknown export type AnthropicModelMessageCapabilities< TModel extends keyof AnthropicModelMetaMap, @@ -349,8 +349,8 @@ export type AnthropicModelMessageCapabilities< any, infer TMessageCapabilities > - ? TMessageCapabilities - : unknown + ? TMessageCapabilities + : unknown export const ANTHROPIC_MODELS = [ CLAUDE_OPUS_4_5.id, @@ -364,10 +364,10 @@ export const ANTHROPIC_MODELS = [ CLAUDE_HAIKU_3.id, ] as const -export const ANTHROPIC_IMAGE_MODELS = [] as const -export const ANTHROPIC_EMBEDDING_MODELS = [] as const -export const ANTHROPIC_AUDIO_MODELS = [] as const -export const ANTHROPIC_VIDEO_MODELS = [] as const +// const ANTHROPIC_IMAGE_MODELS = [] as const +// const ANTHROPIC_EMBEDDING_MODELS = [] as const +// const ANTHROPIC_AUDIO_MODELS = [] as const +// const ANTHROPIC_VIDEO_MODELS = [] as const export type AnthropicModel = (typeof ANTHROPIC_MODELS)[number] @@ -376,76 +376,76 @@ export type AnthropicModel = (typeof ANTHROPIC_MODELS)[number] export type AnthropicChatModelProviderOptionsByName = { // Models with both extended_thinking and priority_tier [CLAUDE_OPUS_4_5.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_SONNET_4_5.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_HAIKU_4_5.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_OPUS_4_1.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_SONNET_4.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_SONNET_3_7.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_OPUS_4.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions // Model with priority_tier but NO extended_thinking [CLAUDE_HAIKU_3_5.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions // Model with neither extended_thinking nor priority_tier [CLAUDE_HAIKU_3.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicStopSequencesOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicStopSequencesOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions } diff --git a/packages/typescript/ai-anthropic/src/text/text-provider-options.ts b/packages/typescript/ai-anthropic/src/text/text-provider-options.ts index 11054b99b..c51c1f806 100644 --- a/packages/typescript/ai-anthropic/src/text/text-provider-options.ts +++ b/packages/typescript/ai-anthropic/src/text/text-provider-options.ts @@ -77,19 +77,19 @@ export interface AnthropicThinkingOptions { When enabled, responses include thinking content blocks showing Claude's thinking process before the final answer. Requires a minimum budget of 1,024 tokens and counts towards your max_tokens limit. */ thinking?: - | { - /** - * Determines how many tokens Claude can use for its internal reasoning process. Larger budgets can enable more thorough analysis for complex problems, improving response quality. + | { + /** +* Determines how many tokens Claude can use for its internal reasoning process. Larger budgets can enable more thorough analysis for complex problems, improving response quality. Must be ≥1024 and less than max_tokens - */ - budget_tokens: number - - type: 'enabled' - } - | { - type: 'disabled' - } +*/ + budget_tokens: number + + type: 'enabled' + } + | { + type: 'disabled' + } } export interface AnthropicToolChoiceOptions { @@ -298,3 +298,9 @@ export const validateMaxTokens = (options: InternalTextProviderOptions) => { throw new Error('max_tokens must be at least 1.') } } + +export const validateTextProviderOptions = (options: InternalTextProviderOptions) => { + validateTopPandTemperature(options) + validateThinking(options) + validateMaxTokens(options) +} \ No newline at end of file diff --git a/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts b/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts index 75f3ba963..cb4e0ddda 100644 --- a/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts @@ -4,7 +4,7 @@ import type { Tool } from '@tanstack/ai' export type WebSearchTool = WebSearchTool20250305 -export const validateDomains = (tool: WebSearchTool) => { +const validateDomains = (tool: WebSearchTool) => { if (tool.allowed_domains && tool.blocked_domains) { throw new Error( 'allowed_domains and blocked_domains cannot be used together.', @@ -12,9 +12,10 @@ export const validateDomains = (tool: WebSearchTool) => { } } -export const validateUserLocation = ( - userLocation: WebSearchTool['user_location'], +const validateUserLocation = ( + tool: WebSearchTool, ) => { + const userLocation = tool.user_location; if (userLocation) { if ( userLocation.city && @@ -71,19 +72,9 @@ export function convertWebSearchToolToAdapterFormat(tool: Tool): WebSearchTool { } } -export function webSearchTool(config?: { - allowedDomains?: Array | null - blockedDomains?: Array | null - maxUses?: number | null - userLocation?: { - type: 'approximate' - city?: string | null - country?: string | null - region?: string | null - timezone?: string | null - } | null - cacheControl?: CacheControl | null -}): Tool { +export function webSearchTool(config: WebSearchTool): Tool { + validateDomains(config) + validateUserLocation(config) return { type: 'function', function: { @@ -91,12 +82,6 @@ export function webSearchTool(config?: { description: '', parameters: {}, }, - metadata: { - allowedDomains: config?.allowedDomains, - blockedDomains: config?.blockedDomains, - maxUses: config?.maxUses, - userLocation: config?.userLocation, - cacheControl: config?.cacheControl, - }, + metadata: config } } diff --git a/packages/typescript/ai-anthropic/tsconfig.json b/packages/typescript/ai-anthropic/tsconfig.json index eabeb01ea..e5e872741 100644 --- a/packages/typescript/ai-anthropic/tsconfig.json +++ b/packages/typescript/ai-anthropic/tsconfig.json @@ -3,6 +3,6 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["vite.config.ts", "eslint.config.js", "./src"], + "include": ["vite.config.ts", "./src"], "exclude": ["node_modules", "dist", "**/*.config.ts"] } diff --git a/packages/typescript/ai-anthropic/vite.config.ts b/packages/typescript/ai-anthropic/vite.config.ts index a938cb71a..5f9b720cb 100644 --- a/packages/typescript/ai-anthropic/vite.config.ts +++ b/packages/typescript/ai-anthropic/vite.config.ts @@ -7,7 +7,7 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], + globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/ai-client/src/message-converters.ts b/packages/typescript/ai-client/src/message-converters.ts index 3a7cdb721..e9f4cbbce 100644 --- a/packages/typescript/ai-client/src/message-converters.ts +++ b/packages/typescript/ai-client/src/message-converters.ts @@ -11,7 +11,7 @@ import type { * Convert UIMessages or ModelMessages to ModelMessages */ export function convertMessagesToModelMessages( - messages: Array | Array, + messages: Array, ): Array { const modelMessages: Array = [] for (const msg of messages) { @@ -64,20 +64,20 @@ export function uiMessageToModelMessages( const toolCalls = toolCallParts.length > 0 ? toolCallParts - .filter( - (p) => - p.state === 'input-complete' || - p.state === 'approval-responded' || - p.output !== undefined, // Include if has output (client tool result) - ) - .map((p) => ({ - id: p.id, - type: 'function' as const, - function: { - name: p.name, - arguments: p.arguments, - }, - })) + .filter( + (p) => + p.state === 'input-complete' || + p.state === 'approval-responded' || + p.output !== undefined, // Include if has output (client tool result) + ) + .map((p) => ({ + id: p.id, + type: 'function' as const, + function: { + name: p.name, + arguments: p.arguments, + }, + })) : undefined // Create the main message diff --git a/packages/typescript/ai-client/tests/chat-client-abort.test.ts b/packages/typescript/ai-client/tests/chat-client-abort.test.ts index f44058f1c..d7f7e8b61 100644 --- a/packages/typescript/ai-client/tests/chat-client-abort.test.ts +++ b/packages/typescript/ai-client/tests/chat-client-abort.test.ts @@ -1,7 +1,7 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest' +import { beforeEach, describe, expect, it, vi } from 'vitest' import { ChatClient } from '../src/chat-client' -import type { ConnectionAdapter, StreamChunk } from '../src/connection-adapters' -import type { UIMessage } from '../src/types' +import type { ConnectionAdapter, } from '../src/connection-adapters' +import type { StreamChunk } from "@tanstack/ai" describe('ChatClient - Abort Signal Handling', () => { let mockAdapter: ConnectionAdapter @@ -11,7 +11,8 @@ describe('ChatClient - Abort Signal Handling', () => { receivedAbortSignal = undefined mockAdapter = { - async *connect(messages, data, abortSignal) { + // eslint-disable-next-line @typescript-eslint/require-await + async *connect(_messages, _data, abortSignal) { receivedAbortSignal = abortSignal // Simulate streaming chunks @@ -70,7 +71,7 @@ describe('ChatClient - Abort Signal Handling', () => { let abortControllerRef: AbortController | null = null const adapterWithAbort: ConnectionAdapter = { - async *connect(messages, data, abortSignal) { + async *connect(_messages, _data, abortSignal) { abortControllerRef = new AbortController() if (abortSignal) { abortSignal.addEventListener('abort', () => { @@ -130,11 +131,12 @@ describe('ChatClient - Abort Signal Handling', () => { }) it('should preserve partial content when aborted', async () => { - const chunks: StreamChunk[] = [] + const chunks: Array = [] let yieldedChunks = 0 const adapterWithPartial: ConnectionAdapter = { - async *connect(messages, data, abortSignal) { + // eslint-disable-next-line @typescript-eslint/require-await + async *connect(_messages, _data, abortSignal) { yield { type: 'content', id: '1', @@ -192,7 +194,8 @@ describe('ChatClient - Abort Signal Handling', () => { const errorSpy = vi.fn() const adapterWithAbort: ConnectionAdapter = { - async *connect(messages, data, abortSignal) { + // eslint-disable-next-line @typescript-eslint/require-await + async *connect(_messages, _data, abortSignal) { yield { type: 'content', id: '1', @@ -233,7 +236,7 @@ describe('ChatClient - Abort Signal Handling', () => { it('should set isLoading to false after abort', async () => { const adapterWithAbort: ConnectionAdapter = { - async *connect(messages, data, abortSignal) { + async *connect(_messages, _data, _abortSignal) { yield { type: 'content', id: '1', @@ -269,10 +272,11 @@ describe('ChatClient - Abort Signal Handling', () => { }) it('should create new AbortController for each request', async () => { - const abortSignals: AbortSignal[] = [] + const abortSignals: Array = [] const adapter: ConnectionAdapter = { - async *connect(messages, data, abortSignal) { + // eslint-disable-next-line @typescript-eslint/require-await + async *connect(_messages, _data, abortSignal) { if (abortSignal) { abortSignals.push(abortSignal) } diff --git a/packages/typescript/ai-client/tests/chat-client.test.ts b/packages/typescript/ai-client/tests/chat-client.test.ts index bd986c71a..db8afba75 100644 --- a/packages/typescript/ai-client/tests/chat-client.test.ts +++ b/packages/typescript/ai-client/tests/chat-client.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, vi } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import { ChatClient } from '../src/chat-client' import { createMockConnectionAdapter, @@ -20,7 +20,7 @@ describe('ChatClient', () => { it('should initialize with provided messages', () => { const adapter = createMockConnectionAdapter() - const initialMessages: UIMessage[] = [ + const initialMessages: Array = [ { id: 'msg-1', role: 'user', @@ -65,12 +65,12 @@ describe('ChatClient', () => { expect(messages2.length).toBeGreaterThan(0) // Message IDs from client1 should start with "custom-id-" - const client1MessageId = messages1[0].id + const client1MessageId = messages1[0]?.id expect(client1MessageId).toMatch(/^custom-id-/) // Message IDs from client2 should NOT start with "custom-id-" // (they'll have a generated ID like "chat-...") - const client2MessageId = messages2[0].id + const client2MessageId = messages2[0]?.id expect(client2MessageId).not.toMatch(/^custom-id-/) expect(client2MessageId).toMatch(/^chat-/) }) @@ -87,8 +87,8 @@ describe('ChatClient', () => { const messages = client.getMessages() expect(messages.length).toBeGreaterThan(0) - expect(messages[0].role).toBe('user') - expect(messages[0].parts[0]).toEqual({ + expect(messages[0]?.role).toBe('user') + expect(messages[0]?.parts[0]).toEqual({ type: 'text', content: 'Hello', }) @@ -120,7 +120,7 @@ describe('ChatClient', () => { // Verify it has text content from the chunks const textPart = assistantMessage.parts.find((p) => p.type === 'text') expect(textPart).toBeDefined() - if (textPart && textPart.type === 'text') { + if (textPart) { expect(textPart.content).toBe('Hello, world!') } } @@ -171,7 +171,7 @@ describe('ChatClient', () => { const messages = client.getMessages() expect(messages.length).toBeGreaterThan(0) - expect(messages[0].id).toBe('user-1') + expect(messages[0]?.id).toBe('user-1') }) it('should convert and append a ModelMessage', async () => { @@ -186,8 +186,8 @@ describe('ChatClient', () => { const messages = client.getMessages() expect(messages.length).toBeGreaterThan(0) - expect(messages[0].role).toBe('user') - expect(messages[0].parts[0]).toEqual({ + expect(messages[0]?.role).toBe('user') + expect(messages[0]?.parts[0]).toEqual({ type: 'text', content: 'Hello from model', }) @@ -207,8 +207,8 @@ describe('ChatClient', () => { await client.append(message) const messages = client.getMessages() - expect(messages[0].id).toBeTruthy() - expect(messages[0].createdAt).toBeInstanceOf(Date) + expect(messages[0]?.id).toBeTruthy() + expect(messages[0]?.createdAt).toBeInstanceOf(Date) }) }) @@ -234,7 +234,7 @@ describe('ChatClient', () => { // The last user message should match what was resent const lastUserMessageAfter = userMessagesAfter[userMessagesAfter.length - 1] - expect(lastUserMessageAfter.parts[0]).toEqual({ + expect(lastUserMessageAfter?.parts[0]).toEqual({ type: 'text', content: 'Second', }) @@ -367,8 +367,8 @@ describe('ChatClient', () => { await client.sendMessage('Hello') expect(onFinish).toHaveBeenCalled() - const finishCall = onFinish.mock.calls[0][0] - expect(finishCall.role).toBe('assistant') + const finishCall = onFinish.mock.calls[0]?.[0] + expect(finishCall?.role).toBe('assistant') }) it('should call onError when error occurs', async () => { @@ -410,7 +410,7 @@ describe('ChatClient', () => { (p) => p.type === 'tool-call', ) expect(toolCallPart).toBeDefined() - if (toolCallPart && toolCallPart.type === 'tool-call') { + if (toolCallPart) { expect(toolCallPart.name).toBe('get_weather') } } @@ -431,7 +431,7 @@ describe('ChatClient', () => { await client.sendMessage('Test') expect(onToolCall).toHaveBeenCalled() - const call = onToolCall.mock.calls[0][0] + const call = onToolCall.mock.calls[0]?.[0] expect(call.toolName).toBe('test_tool') expect(call.input).toEqual({ x: 1 }) }) @@ -445,7 +445,7 @@ describe('ChatClient', () => { // Capture the tool call ID from the callback let capturedToolCallId: string | undefined - const onToolCall = vi.fn().mockImplementation(async (args) => { + const onToolCall = vi.fn().mockImplementation((args) => { capturedToolCallId = args.toolCallId throw new Error('Tool execution failed') }) @@ -478,13 +478,13 @@ describe('ChatClient', () => { // Find the tool call part by the captured ID const toolCallPart = allToolCalls.find( - (p) => p.type === 'tool-call' && p.id === capturedToolCallId, + (p) => p.id === capturedToolCallId, ) // The tool call part should exist expect(toolCallPart).toBeDefined() - if (toolCallPart && toolCallPart.type === 'tool-call') { + if (toolCallPart) { // After error, output should be set with error object // Note: The output might be set asynchronously, so we check if it exists // If it doesn't exist yet, the error handling still worked (onToolCall was called) @@ -519,7 +519,7 @@ describe('ChatClient', () => { (p) => p.type === 'tool-call', ) - if (toolCallPart && toolCallPart.type === 'tool-call') { + if (toolCallPart) { await client.addToolResult({ toolCallId: toolCallPart.id, tool: toolCallPart.name, diff --git a/packages/typescript/ai-client/tests/connection-adapters-abort.test.ts b/packages/typescript/ai-client/tests/connection-adapters-abort.test.ts index 3f2a34c82..6ff18355a 100644 --- a/packages/typescript/ai-client/tests/connection-adapters-abort.test.ts +++ b/packages/typescript/ai-client/tests/connection-adapters-abort.test.ts @@ -1,7 +1,7 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { - fetchServerSentEvents, fetchHttpStream, + fetchServerSentEvents, } from '../src/connection-adapters' import type { StreamChunk } from '@tanstack/ai' @@ -12,6 +12,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { beforeEach(() => { originalFetch = global.fetch fetchMock = vi.fn() + // @ts-ignore - we're mocking fetch here global.fetch = fetchMock }) @@ -29,7 +30,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { ok: true, body: { getReader: () => ({ - read: async () => ({ done: true, value: undefined }), + read: () => ({ done: true, value: undefined }), releaseLock: vi.fn(), }), }, @@ -51,7 +52,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { expect(fetchMock).toHaveBeenCalled() const fetchCall = fetchMock.mock.calls[0] - expect(fetchCall[1]?.signal).toBe(abortSignal) + expect(fetchCall?.[1]?.signal).toBe(abortSignal) }) it('should use provided abortSignal over options.signal', async () => { @@ -62,7 +63,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { ok: true, body: { getReader: () => ({ - read: async () => ({ done: true, value: undefined }), + read: () => ({ done: true, value: undefined }), releaseLock: vi.fn(), }), }, @@ -84,7 +85,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { } const fetchCall = fetchMock.mock.calls[0] - expect(fetchCall[1]?.signal).toBe(providedSignal) + expect(fetchCall?.[1]?.signal).toBe(providedSignal) }) it('should stop reading stream when aborted', async () => { @@ -93,7 +94,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { let readCount = 0 const mockReader = { - read: async () => { + read: () => { readCount++ if (readCount === 1) { // Abort after first read @@ -126,7 +127,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { abortSignal, ) - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of generator) { chunks.push(chunk) } @@ -142,7 +143,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { let readCount = 0 const mockReader = { - read: async () => { + read: () => { readCount++ if (readCount === 1) { abortController.abort() @@ -173,7 +174,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { abortSignal, ) - const chunks: StreamChunk[] = [] + const chunks: Array = [] try { for await (const chunk of generator) { chunks.push(chunk) @@ -196,7 +197,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { ok: true, body: { getReader: () => ({ - read: async () => ({ done: true, value: undefined }), + read: () => ({ done: true, value: undefined }), releaseLock: vi.fn(), }), }, @@ -217,7 +218,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { expect(fetchMock).toHaveBeenCalled() const fetchCall = fetchMock.mock.calls[0] - expect(fetchCall[1]?.signal).toBe(abortSignal) + expect(fetchCall?.[1]?.signal).toBe(abortSignal) }) it('should stop reading stream when aborted', async () => { @@ -226,7 +227,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { let readCount = 0 const mockReader = { - read: async () => { + read: () => { readCount++ if (readCount === 1) { abortController.abort() @@ -258,7 +259,7 @@ describe('Connection Adapters - Abort Signal Handling', () => { abortSignal, ) - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of generator) { chunks.push(chunk) } diff --git a/packages/typescript/ai-client/tests/connection-adapters.test.ts b/packages/typescript/ai-client/tests/connection-adapters.test.ts index a3a64ef97..59ff68af9 100644 --- a/packages/typescript/ai-client/tests/connection-adapters.test.ts +++ b/packages/typescript/ai-client/tests/connection-adapters.test.ts @@ -1,7 +1,7 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { - fetchServerSentEvents, fetchHttpStream, + fetchServerSentEvents, stream, } from '../src/connection-adapters' import type { StreamChunk } from '@tanstack/ai' @@ -13,6 +13,7 @@ describe('connection-adapters', () => { beforeEach(() => { originalFetch = global.fetch fetchMock = vi.fn() + // @ts-ignore - we mock global fetch global.fetch = fetchMock }) @@ -46,7 +47,7 @@ describe('connection-adapters', () => { fetchMock.mockResolvedValue(mockResponse as any) const adapter = fetchServerSentEvents('/api/chat') - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of adapter.connect([ { role: 'user', content: 'Hello' }, @@ -85,7 +86,7 @@ describe('connection-adapters', () => { fetchMock.mockResolvedValue(mockResponse as any) const adapter = fetchServerSentEvents('/api/chat') - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of adapter.connect([ { role: 'user', content: 'Hello' }, @@ -118,7 +119,7 @@ describe('connection-adapters', () => { fetchMock.mockResolvedValue(mockResponse as any) const adapter = fetchServerSentEvents('/api/chat') - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of adapter.connect([ { role: 'user', content: 'Hello' }, @@ -132,7 +133,7 @@ describe('connection-adapters', () => { it('should handle malformed JSON gracefully', async () => { const consoleWarnSpy = vi .spyOn(console, 'warn') - .mockImplementation(() => {}) + .mockImplementation(() => { }) const mockReader = { read: vi @@ -155,7 +156,7 @@ describe('connection-adapters', () => { fetchMock.mockResolvedValue(mockResponse as any) const adapter = fetchServerSentEvents('/api/chat') - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of adapter.connect([ { role: 'user', content: 'Hello' }, @@ -238,7 +239,7 @@ describe('connection-adapters', () => { expect(fetchMock).toHaveBeenCalled() const call = fetchMock.mock.calls[0] - expect(call[1]?.headers).toMatchObject({ + expect(call?.[1]?.headers).toMatchObject({ 'Content-Type': 'application/json', Authorization: 'Bearer token', }) @@ -272,7 +273,7 @@ describe('connection-adapters', () => { expect(fetchMock).toHaveBeenCalled() const call = fetchMock.mock.calls[0] - const requestHeaders = call[1]?.headers + const requestHeaders = call?.[1]?.headers // mergeHeaders converts Headers to plain object, then spread into new object // The headers should be a plain object with both Content-Type and Authorization @@ -313,7 +314,7 @@ describe('connection-adapters', () => { expect(fetchMock).toHaveBeenCalled() const call = fetchMock.mock.calls[0] - const body = JSON.parse(call[1]?.body as string) + const body = JSON.parse(call?.[1]?.body as string) expect(body.data).toEqual({ key: 'value' }) }) }) @@ -343,7 +344,7 @@ describe('connection-adapters', () => { fetchMock.mockResolvedValue(mockResponse as any) const adapter = fetchHttpStream('/api/chat') - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of adapter.connect([ { role: 'user', content: 'Hello' }, @@ -357,7 +358,7 @@ describe('connection-adapters', () => { it('should handle malformed JSON gracefully', async () => { const consoleWarnSpy = vi .spyOn(console, 'warn') - .mockImplementation(() => {}) + .mockImplementation(() => { }) const mockReader = { read: vi @@ -380,7 +381,7 @@ describe('connection-adapters', () => { fetchMock.mockResolvedValue(mockResponse as any) const adapter = fetchHttpStream('/api/chat') - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of adapter.connect([ { role: 'user', content: 'Hello' }, @@ -418,7 +419,7 @@ describe('connection-adapters', () => { describe('stream', () => { it('should delegate to stream factory', async () => { - const streamFactory = vi.fn().mockImplementation(async function* () { + const streamFactory = vi.fn().mockImplementation(function* () { yield { type: 'content', id: '1', @@ -431,7 +432,7 @@ describe('connection-adapters', () => { }) const adapter = stream(streamFactory) - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of adapter.connect([ { role: 'user', content: 'Hello' }, @@ -444,7 +445,7 @@ describe('connection-adapters', () => { }) it('should pass data to stream factory', async () => { - const streamFactory = vi.fn().mockImplementation(async function* () { + const streamFactory = vi.fn().mockImplementation(function* () { yield { type: 'done', id: '1', diff --git a/packages/typescript/ai-client/tests/events.test.ts b/packages/typescript/ai-client/tests/events.test.ts index 28606b083..ea4245020 100644 --- a/packages/typescript/ai-client/tests/events.test.ts +++ b/packages/typescript/ai-client/tests/events.test.ts @@ -1,9 +1,8 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +import { beforeEach, describe, expect, it, vi, } from 'vitest' +import { aiEventClient } from '@tanstack/ai/event-client' import { - ChatClientEventEmitter, DefaultChatClientEventEmitter, } from '../src/events' -import { aiEventClient } from '@tanstack/ai/event-client' import type { UIMessage } from '../src/types' // Mock the event client diff --git a/packages/typescript/ai-client/tests/message-converters.test.ts b/packages/typescript/ai-client/tests/message-converters.test.ts index 760ab4101..cf657bc94 100644 --- a/packages/typescript/ai-client/tests/message-converters.test.ts +++ b/packages/typescript/ai-client/tests/message-converters.test.ts @@ -1,17 +1,18 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' import { convertMessagesToModelMessages, - uiMessageToModelMessages, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, + uiMessageToModelMessages, } from '../src/message-converters' -import type { UIMessage, ModelMessage } from '../src/types' +import type { UIMessage } from '../src/types' +import type { ModelMessage } from '@tanstack/ai' describe('message-converters', () => { describe('convertMessagesToModelMessages', () => { it('should convert UIMessages to ModelMessages', () => { - const uiMessages: UIMessage[] = [ + const uiMessages: Array = [ { id: 'msg-1', role: 'user', @@ -29,7 +30,7 @@ describe('message-converters', () => { }) it('should pass through ModelMessages', () => { - const modelMessages: ModelMessage[] = [ + const modelMessages: Array = [ { role: 'user', content: 'Hello', @@ -41,7 +42,7 @@ describe('message-converters', () => { }) it('should handle mixed UIMessages and ModelMessages', () => { - const messages: (UIMessage | ModelMessage)[] = [ + const messages: Array = [ { id: 'msg-1', role: 'user', @@ -95,7 +96,7 @@ describe('message-converters', () => { } const result = uiMessageToModelMessages(uiMessage) - expect(result[0].content).toBe('Hello World') + expect(result[0]?.content).toBe('Hello World') }) it('should convert message with tool calls', () => { @@ -116,8 +117,8 @@ describe('message-converters', () => { const result = uiMessageToModelMessages(uiMessage) expect(result).toHaveLength(1) - expect(result[0].toolCalls).toBeDefined() - expect(result[0].toolCalls?.[0]).toEqual({ + expect(result[0]?.toolCalls).toBeDefined() + expect(result[0]?.toolCalls?.[0]).toEqual({ id: 'call-1', type: 'function', function: { @@ -158,8 +159,8 @@ describe('message-converters', () => { } const result = uiMessageToModelMessages(uiMessage) - expect(result[0].toolCalls).toHaveLength(2) // call-1 and call-3 - expect(result[0].toolCalls?.map((tc) => tc.id)).toEqual([ + expect(result[0]?.toolCalls).toHaveLength(2) // call-1 and call-3 + expect(result[0]?.toolCalls?.map((tc) => tc.id)).toEqual([ 'call-1', 'call-3', ]) @@ -183,7 +184,7 @@ describe('message-converters', () => { } const result = uiMessageToModelMessages(uiMessage) - expect(result[0].toolCalls).toHaveLength(1) + expect(result[0]?.toolCalls).toHaveLength(1) }) it('should convert tool result parts to separate messages', () => { @@ -260,8 +261,8 @@ describe('message-converters', () => { const result = uiMessageToModelMessages(uiMessage) expect(result).toHaveLength(1) - expect(result[0].toolCalls).toBeDefined() - expect(result[0].content).toBeNull() + expect(result[0]?.toolCalls).toBeDefined() + expect(result[0]?.content).toBeNull() }) it('should handle message with text and tool calls', () => { @@ -282,8 +283,8 @@ describe('message-converters', () => { } const result = uiMessageToModelMessages(uiMessage) - expect(result[0].content).toBe('Let me check') - expect(result[0].toolCalls).toBeDefined() + expect(result[0]?.content).toBe('Let me check') + expect(result[0]?.toolCalls).toBeDefined() }) it('should handle empty content', () => { @@ -295,7 +296,7 @@ describe('message-converters', () => { } const result = uiMessageToModelMessages(uiMessage) - expect(result[0].content).toBeNull() + expect(result[0]?.content).toBeNull() }) }) @@ -330,6 +331,7 @@ describe('message-converters', () => { it('should convert message with tool calls', () => { const modelMessage: ModelMessage = { role: 'assistant', + content: 'Here is the info', toolCalls: [ { id: 'call-1', @@ -376,6 +378,7 @@ describe('message-converters', () => { it('should handle message without content', () => { const modelMessage: ModelMessage = { role: 'assistant', + content: null, toolCalls: [ { id: 'call-1', @@ -390,7 +393,7 @@ describe('message-converters', () => { const result = modelMessageToUIMessage(modelMessage) expect(result.parts).toHaveLength(1) - expect(result.parts[0].type).toBe('tool-call') + expect(result.parts[0]?.type).toBe('tool-call') }) it('should handle empty tool result content', () => { @@ -412,21 +415,22 @@ describe('message-converters', () => { describe('modelMessagesToUIMessages', () => { it('should convert simple messages', () => { - const modelMessages: ModelMessage[] = [ + const modelMessages: Array = [ { role: 'user', content: 'Hello' }, { role: 'assistant', content: 'Hi' }, ] const result = modelMessagesToUIMessages(modelMessages) expect(result).toHaveLength(2) - expect(result[0].role).toBe('user') - expect(result[1].role).toBe('assistant') + expect(result[0]?.role).toBe('user') + expect(result[1]?.role).toBe('assistant') }) it('should merge tool results into assistant messages', () => { - const modelMessages: ModelMessage[] = [ + const modelMessages: Array = [ { role: 'assistant', + content: null, toolCalls: [ { id: 'call-1', @@ -444,8 +448,8 @@ describe('message-converters', () => { const result = modelMessagesToUIMessages(modelMessages) expect(result).toHaveLength(1) - expect(result[0].parts).toHaveLength(2) // tool-call + tool-result - expect(result[0].parts[1]).toEqual({ + expect(result[0]?.parts).toHaveLength(2) // tool-call + tool-result + expect(result[0]?.parts[1]).toEqual({ type: 'tool-result', toolCallId: 'call-1', content: 'Result', @@ -454,7 +458,7 @@ describe('message-converters', () => { }) it('should create standalone tool result if no assistant message', () => { - const modelMessages: ModelMessage[] = [ + const modelMessages: Array = [ { role: 'user', content: 'Hello' }, { role: 'tool', @@ -465,9 +469,9 @@ describe('message-converters', () => { const result = modelMessagesToUIMessages(modelMessages) expect(result).toHaveLength(2) - expect(result[1].role).toBe('assistant') + expect(result[1]?.role).toBe('assistant') // Tool messages with content create both text and tool-result parts - const toolResultPart = result[1].parts.find( + const toolResultPart = result[1]?.parts.find( (p) => p.type === 'tool-result', ) expect(toolResultPart).toBeDefined() @@ -480,7 +484,7 @@ describe('message-converters', () => { }) it('should reset assistant tracking on non-assistant message', () => { - const modelMessages: ModelMessage[] = [ + const modelMessages: Array = [ { role: 'assistant', content: 'First', @@ -497,7 +501,7 @@ describe('message-converters', () => { expect(result).toHaveLength(3) // Tool result should be standalone since user message reset tracking // Tool messages with content create both text and tool-result parts - const toolResultPart = result[2].parts.find( + const toolResultPart = result[2]?.parts.find( (p) => p.type === 'tool-result', ) expect(toolResultPart).toBeDefined() @@ -510,9 +514,10 @@ describe('message-converters', () => { }) it('should handle multiple tool results for same assistant', () => { - const modelMessages: ModelMessage[] = [ + const modelMessages: Array = [ { role: 'assistant', + content: null, toolCalls: [ { id: 'call-1', @@ -540,7 +545,7 @@ describe('message-converters', () => { const result = modelMessagesToUIMessages(modelMessages) expect(result).toHaveLength(1) - expect(result[0].parts).toHaveLength(4) // 2 tool-calls + 2 tool-results + expect(result[0]?.parts).toHaveLength(4) // 2 tool-calls + 2 tool-results }) }) @@ -607,6 +612,7 @@ describe('message-converters', () => { it('should convert ModelMessage with tool calls', () => { const modelMessage: ModelMessage = { role: 'assistant', + content: null, toolCalls: [ { id: 'call-1', @@ -620,7 +626,7 @@ describe('message-converters', () => { const result = normalizeToUIMessage(modelMessage, generateId) expect(result.parts).toHaveLength(1) - expect(result.parts[0].type).toBe('tool-call') + expect(result.parts[0]?.type).toBe('tool-call') }) }) }) diff --git a/packages/typescript/ai-client/tests/message-updaters.test.ts b/packages/typescript/ai-client/tests/message-updaters.test.ts index 0da5c6849..99b4d27cc 100644 --- a/packages/typescript/ai-client/tests/message-updaters.test.ts +++ b/packages/typescript/ai-client/tests/message-updaters.test.ts @@ -1,19 +1,19 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' import { updateTextPart, - updateToolCallPart, - updateToolResultPart, updateToolCallApproval, + updateToolCallApprovalResponse, + updateToolCallPart, updateToolCallState, updateToolCallWithOutput, - updateToolCallApprovalResponse, + updateToolResultPart, } from '../src/message-updaters' import type { UIMessage } from '../src/types' describe('message-updaters', () => { describe('updateTextPart', () => { it('should add text part to empty message', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -23,12 +23,12 @@ describe('message-updaters', () => { const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result[0].parts).toHaveLength(1) - expect(result[0].parts[0]).toEqual({ type: 'text', content: 'Hello' }) + expect(result[0]?.parts).toHaveLength(1) + expect(result[0]?.parts[0]).toEqual({ type: 'text', content: 'Hello' }) }) it('should update existing text part', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -38,15 +38,15 @@ describe('message-updaters', () => { const result = updateTextPart(messages, 'msg-1', 'Hello world') - expect(result[0].parts).toHaveLength(1) - expect(result[0].parts[0]).toEqual({ + expect(result[0]?.parts).toHaveLength(1) + expect(result[0]?.parts[0]).toEqual({ type: 'text', content: 'Hello world', }) }) it('should place text part after tool calls', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -64,13 +64,13 @@ describe('message-updaters', () => { const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result[0].parts).toHaveLength(2) - expect(result[0].parts[0].type).toBe('tool-call') - expect(result[0].parts[1]).toEqual({ type: 'text', content: 'Hello' }) + expect(result[0]?.parts).toHaveLength(2) + expect(result[0]?.parts[0]?.type).toBe('tool-call') + expect(result[0]?.parts[1]).toEqual({ type: 'text', content: 'Hello' }) }) it('should maintain order: tool calls, other parts, text', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -94,14 +94,14 @@ describe('message-updaters', () => { const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result[0].parts).toHaveLength(3) - expect(result[0].parts[0].type).toBe('tool-call') - expect(result[0].parts[1].type).toBe('tool-result') - expect(result[0].parts[2]).toEqual({ type: 'text', content: 'Hello' }) + expect(result[0]?.parts).toHaveLength(3) + expect(result[0]?.parts[0]?.type).toBe('tool-call') + expect(result[0]?.parts[1]?.type).toBe('tool-result') + expect(result[0]?.parts[2]).toEqual({ type: 'text', content: 'Hello' }) }) it('should not modify other messages', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -116,16 +116,16 @@ describe('message-updaters', () => { const result = updateTextPart(messages, 'msg-1', 'Hello') - expect(result[0].parts).toHaveLength(1) - expect(result[1].parts).toHaveLength(1) - expect(result[1].parts[0]).toEqual({ + expect(result[0]?.parts).toHaveLength(1) + expect(result[1]?.parts).toHaveLength(1) + expect(result[1]?.parts[0]).toEqual({ type: 'text', content: 'User message', }) }) it('should return new array (immutability)', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -136,13 +136,13 @@ describe('message-updaters', () => { const result = updateTextPart(messages, 'msg-1', 'Hello') expect(result).not.toBe(messages) - expect(messages[0].parts).toHaveLength(0) + expect(messages[0]?.parts).toHaveLength(0) }) }) describe('updateToolCallPart', () => { it('should add tool call part to empty message', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -157,8 +157,8 @@ describe('message-updaters', () => { state: 'input-complete', }) - expect(result[0].parts).toHaveLength(1) - expect(result[0].parts[0]).toEqual({ + expect(result[0]?.parts).toHaveLength(1) + expect(result[0]?.parts[0]).toEqual({ type: 'tool-call', id: 'tool-1', name: 'test', @@ -168,7 +168,7 @@ describe('message-updaters', () => { }) it('should update existing tool call part', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -191,8 +191,8 @@ describe('message-updaters', () => { state: 'input-complete', }) - expect(result[0].parts).toHaveLength(1) - expect(result[0].parts[0]).toEqual({ + expect(result[0]?.parts).toHaveLength(1) + expect(result[0]?.parts[0]).toEqual({ type: 'tool-call', id: 'tool-1', name: 'test', @@ -202,7 +202,7 @@ describe('message-updaters', () => { }) it('should insert tool call before text parts', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -217,13 +217,13 @@ describe('message-updaters', () => { state: 'input-complete', }) - expect(result[0].parts).toHaveLength(2) - expect(result[0].parts[0].type).toBe('tool-call') - expect(result[0].parts[1].type).toBe('text') + expect(result[0]?.parts).toHaveLength(2) + expect(result[0]?.parts[0]?.type).toBe('tool-call') + expect(result[0]?.parts[1]?.type).toBe('text') }) it('should not modify other messages', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -243,14 +243,14 @@ describe('message-updaters', () => { state: 'input-complete', }) - expect(result[0].parts).toHaveLength(1) - expect(result[1].parts).toHaveLength(1) + expect(result[0]?.parts).toHaveLength(1) + expect(result[1]?.parts).toHaveLength(1) }) }) describe('updateToolResultPart', () => { it('should add tool result part to message', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -266,8 +266,8 @@ describe('message-updaters', () => { 'complete', ) - expect(result[0].parts).toHaveLength(1) - expect(result[0].parts[0]).toEqual({ + expect(result[0]?.parts).toHaveLength(1) + expect(result[0]?.parts[0]).toEqual({ type: 'tool-result', toolCallId: 'tool-1', content: 'result content', @@ -276,7 +276,7 @@ describe('message-updaters', () => { }) it('should update existing tool result part', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -299,8 +299,8 @@ describe('message-updaters', () => { 'complete', ) - expect(result[0].parts).toHaveLength(1) - expect(result[0].parts[0]).toEqual({ + expect(result[0]?.parts).toHaveLength(1) + expect(result[0]?.parts[0]).toEqual({ type: 'tool-result', toolCallId: 'tool-1', content: 'new content', @@ -309,7 +309,7 @@ describe('message-updaters', () => { }) it('should include error when provided', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -326,7 +326,7 @@ describe('message-updaters', () => { 'Something went wrong', ) - expect(result[0].parts[0]).toEqual({ + expect(result[0]?.parts[0]).toEqual({ type: 'tool-result', toolCallId: 'tool-1', content: 'error content', @@ -338,7 +338,7 @@ describe('message-updaters', () => { describe('updateToolCallApproval', () => { it('should add approval metadata to tool call', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -361,9 +361,9 @@ describe('message-updaters', () => { 'approval-123', ) - const toolCall = result[0].parts[0] - expect(toolCall.type).toBe('tool-call') - if (toolCall.type === 'tool-call') { + const toolCall = result[0]?.parts[0] + expect(toolCall?.type).toBe('tool-call') + if (toolCall?.type === 'tool-call') { expect(toolCall.state).toBe('approval-requested') expect(toolCall.approval).toEqual({ id: 'approval-123', @@ -373,7 +373,7 @@ describe('message-updaters', () => { }) it('should not modify tool call if not found', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -396,8 +396,8 @@ describe('message-updaters', () => { 'approval-123', ) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call') { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call') { expect(toolCall.state).toBe('input-complete') expect(toolCall.approval).toBeUndefined() } @@ -406,7 +406,7 @@ describe('message-updaters', () => { describe('updateToolCallState', () => { it('should update tool call state', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -429,14 +429,14 @@ describe('message-updaters', () => { 'input-complete', ) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call') { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call') { expect(toolCall.state).toBe('input-complete') } }) it('should not modify tool call if not found', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -459,8 +459,8 @@ describe('message-updaters', () => { 'input-complete', ) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call') { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call') { expect(toolCall.state).toBe('input-streaming') } }) @@ -468,7 +468,7 @@ describe('message-updaters', () => { describe('updateToolCallWithOutput', () => { it('should update tool call with output', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -488,15 +488,15 @@ describe('message-updaters', () => { result: 'success', }) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call') { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call') { expect(toolCall.output).toEqual({ result: 'success' }) expect(toolCall.state).toBe('input-complete') } }) it('should update state when provided', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -519,14 +519,14 @@ describe('message-updaters', () => { 'approval-requested', ) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call') { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call') { expect(toolCall.state).toBe('approval-requested') } }) it('should handle error text', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -550,14 +550,14 @@ describe('message-updaters', () => { 'Error occurred', ) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call') { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call') { expect(toolCall.output).toEqual({ error: 'Error occurred' }) } }) it('should search across all messages', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -582,9 +582,9 @@ describe('message-updaters', () => { result: 'success', }) - expect(result[0].parts).toHaveLength(0) - const toolCall = result[1].parts[0] - if (toolCall.type === 'tool-call') { + expect(result[0]?.parts).toHaveLength(0) + const toolCall = result[1]?.parts[0] + if (toolCall?.type === 'tool-call') { expect(toolCall.output).toEqual({ result: 'success' }) } }) @@ -592,7 +592,7 @@ describe('message-updaters', () => { describe('updateToolCallApprovalResponse', () => { it('should update approval response', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -618,15 +618,15 @@ describe('message-updaters', () => { true, ) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call' && toolCall.approval) { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call' && toolCall.approval) { expect(toolCall.approval.approved).toBe(true) expect(toolCall.state).toBe('approval-responded') } }) it('should handle denied approval', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -652,15 +652,15 @@ describe('message-updaters', () => { false, ) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call' && toolCall.approval) { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call' && toolCall.approval) { expect(toolCall.approval.approved).toBe(false) expect(toolCall.state).toBe('approval-responded') } }) it('should search across all messages', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -691,15 +691,15 @@ describe('message-updaters', () => { true, ) - expect(result[0].parts).toHaveLength(0) - const toolCall = result[1].parts[0] - if (toolCall.type === 'tool-call' && toolCall.approval) { + expect(result[0]?.parts).toHaveLength(0) + const toolCall = result[1]?.parts[0] + if (toolCall?.type === 'tool-call' && toolCall.approval) { expect(toolCall.approval.approved).toBe(true) } }) it('should not modify if approval not found', () => { - const messages: UIMessage[] = [ + const messages: Array = [ { id: 'msg-1', role: 'assistant', @@ -725,8 +725,8 @@ describe('message-updaters', () => { true, ) - const toolCall = result[0].parts[0] - if (toolCall.type === 'tool-call' && toolCall.approval) { + const toolCall = result[0]?.parts[0] + if (toolCall?.type === 'tool-call' && toolCall.approval) { expect(toolCall.approval.approved).toBeUndefined() expect(toolCall.state).toBe('approval-requested') } diff --git a/packages/typescript/ai-client/tests/stream-processor.test.ts b/packages/typescript/ai-client/tests/stream-processor.test.ts index 0361ce965..1a152da5a 100644 --- a/packages/typescript/ai-client/tests/stream-processor.test.ts +++ b/packages/typescript/ai-client/tests/stream-processor.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { StreamProcessor } from '../src/stream/processor' describe('StreamProcessor - Tool Call Handling', () => { @@ -287,7 +287,7 @@ describe('StreamProcessor - Tool Call Handling', () => { ] // Track what handlers are called - const events: any[] = [] + const events: Array = [] const processor = new StreamProcessor({ handlers: { @@ -301,6 +301,7 @@ describe('StreamProcessor - Tool Call Handling', () => { }) // Convert chunks to async iterable + // eslint-disable-next-line @typescript-eslint/require-await async function* createStream() { for (const chunk of rawChunks) { yield chunk diff --git a/packages/typescript/ai-client/tests/test-utils.ts b/packages/typescript/ai-client/tests/test-utils.ts index 2377be1c0..6bfef05ed 100644 --- a/packages/typescript/ai-client/tests/test-utils.ts +++ b/packages/typescript/ai-client/tests/test-utils.ts @@ -1,7 +1,6 @@ import type { ConnectionAdapter } from '../src/connection-adapters' -import type { StreamChunk } from '@tanstack/ai' -import type { ModelMessage, UIMessage } from '../src/types' - +import type { ModelMessage, StreamChunk } from '@tanstack/ai' +import type { UIMessage } from '../src/types' /** * Options for creating a mock connection adapter */ @@ -9,7 +8,7 @@ export interface MockConnectionAdapterOptions { /** * Chunks to yield from the stream */ - chunks?: StreamChunk[] + chunks?: Array /** * Delay between chunks (in ms) @@ -30,7 +29,7 @@ export interface MockConnectionAdapterOptions { * Callback when connect is called */ onConnect?: ( - messages: ModelMessage[] | UIMessage[], + messages: Array | Array, data?: Record, abortSignal?: AbortSignal, ) => void @@ -110,18 +109,18 @@ export function createTextChunks( text: string, messageId: string = 'msg-1', model: string = 'test', -): StreamChunk[] { - const chunks: StreamChunk[] = [] +): Array { + const chunks: Array = [] let accumulated = '' - for (let i = 0; i < text.length; i++) { - accumulated += text[i] + for (const chunk of text) { + accumulated += chunk chunks.push({ type: 'content', id: messageId, model, timestamp: Date.now(), - delta: text[i], + delta: chunk, content: accumulated, role: 'assistant', } as StreamChunk) @@ -147,8 +146,8 @@ export function createToolCallChunks( messageId: string = 'msg-1', model: string = 'test', includeToolInputAvailable: boolean = true, -): StreamChunk[] { - const chunks: StreamChunk[] = [] +): Array { + const chunks: Array = [] for (let i = 0; i < toolCalls.length; i++) { const toolCall = toolCalls[i] @@ -159,11 +158,11 @@ export function createToolCallChunks( timestamp: Date.now(), index: i, toolCall: { - id: toolCall.id, + id: toolCall?.id, type: 'function', function: { - name: toolCall.name, - arguments: toolCall.arguments, + name: toolCall?.name, + arguments: toolCall?.arguments, }, }, } as StreamChunk) @@ -172,9 +171,9 @@ export function createToolCallChunks( if (includeToolInputAvailable) { let parsedInput: any try { - parsedInput = JSON.parse(toolCall.arguments) + parsedInput = JSON.parse(toolCall?.arguments ?? "") } catch { - parsedInput = toolCall.arguments + parsedInput = toolCall?.arguments } chunks.push({ @@ -182,8 +181,8 @@ export function createToolCallChunks( id: messageId, model, timestamp: Date.now(), - toolCallId: toolCall.id, - toolName: toolCall.name, + toolCallId: toolCall?.id, + toolName: toolCall?.name, input: parsedInput, } as StreamChunk) } diff --git a/packages/typescript/ai-client/vite.config.ts b/packages/typescript/ai-client/vite.config.ts index a938cb71a..e83c13eb9 100644 --- a/packages/typescript/ai-client/vite.config.ts +++ b/packages/typescript/ai-client/vite.config.ts @@ -7,7 +7,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/ai-devtools/package.json b/packages/typescript/ai-devtools/package.json index 00d3ba55b..6368355cc 100644 --- a/packages/typescript/ai-devtools/package.json +++ b/packages/typescript/ai-devtools/package.json @@ -33,7 +33,7 @@ "lint:fix": "eslint ./src --fix", "test:build": "publint --strict", "test:eslint": "eslint ./src", - "test:lib": "vitest", + "test:lib": "vitest --passWithNoTests", "test:lib:dev": "pnpm test:lib --watch", "test:types": "tsc" }, @@ -49,7 +49,6 @@ "@tanstack/ai": "workspace:*", "@tanstack/devtools-ui": "^0.4.4", "@tanstack/devtools-utils": "^0.0.8", - "clsx": "^2.1.1", "goober": "^2.1.18", "solid-js": "^1.9.10" }, diff --git a/packages/typescript/ai-devtools/vite.config.ts b/packages/typescript/ai-devtools/vite.config.ts index ef245a3aa..c3fff9d83 100644 --- a/packages/typescript/ai-devtools/vite.config.ts +++ b/packages/typescript/ai-devtools/vite.config.ts @@ -10,8 +10,7 @@ const config = defineConfig({ dir: './tests', watch: false, environment: 'jsdom', - setupFiles: ['./tests/test-setup.ts'], - coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, + coverage: { enabled: true, include: ['src/**/*'] }, typecheck: { enabled: true }, }, }) diff --git a/packages/typescript/ai-gemini/src/model-meta.ts b/packages/typescript/ai-gemini/src/model-meta.ts index 6be8f79b8..812387c00 100644 --- a/packages/typescript/ai-gemini/src/model-meta.ts +++ b/packages/typescript/ai-gemini/src/model-meta.ts @@ -76,11 +76,11 @@ const GEMINI_3_PRO = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_5_PRO = { @@ -114,11 +114,11 @@ const GEMINI_2_5_PRO = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_5_PRO_TTS = { @@ -141,9 +141,9 @@ const GEMINI_2_5_PRO_TTS = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const GEMINI_2_5_FLASH = { @@ -177,11 +177,11 @@ const GEMINI_2_5_FLASH = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_5_FLASH_PREVIEW = { @@ -214,11 +214,11 @@ const GEMINI_2_5_FLASH_PREVIEW = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_5_FLASH_IMAGE = { @@ -247,9 +247,9 @@ const GEMINI_2_5_FLASH_IMAGE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const GEMINI_2_5_FLASH_LIVE = { @@ -280,10 +280,10 @@ const GEMINI_2_5_FLASH_LIVE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiThinkingOptions > const GEMINI_2_5_FLASH_TTS = { @@ -306,9 +306,9 @@ const GEMINI_2_5_FLASH_TTS = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const GEMINI_2_5_FLASH_LITE = { @@ -341,11 +341,11 @@ const GEMINI_2_5_FLASH_LITE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_5_FLASH_LITE_PREVIEW = { @@ -377,11 +377,11 @@ const GEMINI_2_5_FLASH_LITE_PREVIEW = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_FLASH = { @@ -413,10 +413,10 @@ const GEMINI_2_FLASH = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions > const GEMINI_2_FLASH_IMAGE = { @@ -444,9 +444,9 @@ const GEMINI_2_FLASH_IMAGE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const GEMINI_2_FLASH_LIVE = { @@ -478,9 +478,9 @@ const GEMINI_2_FLASH_LIVE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const GEMINI_2_FLASH_LITE = { @@ -508,10 +508,10 @@ const GEMINI_2_FLASH_LITE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions > const IMAGEN_4_GENERATE = { @@ -532,9 +532,9 @@ const IMAGEN_4_GENERATE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const IMAGEN_4_GENERATE_ULTRA = { @@ -555,9 +555,9 @@ const IMAGEN_4_GENERATE_ULTRA = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const IMAGEN_4_GENERATE_FAST = { @@ -578,9 +578,9 @@ const IMAGEN_4_GENERATE_FAST = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const IMAGEN_3 = { @@ -600,9 +600,9 @@ const IMAGEN_3 = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const VEO_3_1_PREVIEW = { @@ -623,9 +623,9 @@ const VEO_3_1_PREVIEW = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const VEO_3_1_FAST_PREVIEW = { @@ -646,9 +646,9 @@ const VEO_3_1_FAST_PREVIEW = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const VEO_3 = { @@ -669,9 +669,9 @@ const VEO_3 = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const VEO_3_FAST = { @@ -692,9 +692,9 @@ const VEO_3_FAST = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const VEO_2 = { @@ -714,9 +714,9 @@ const VEO_2 = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > const GEMINI_EMBEDDING = { @@ -736,12 +736,12 @@ const GEMINI_EMBEDDING = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > -export const GEMINI_MODEL_META = { +const GEMINI_MODEL_META = { [GEMINI_3_PRO.name]: GEMINI_3_PRO, [GEMINI_2_5_PRO.name]: GEMINI_2_5_PRO, [GEMINI_2_5_PRO_TTS.name]: GEMINI_2_5_PRO_TTS, @@ -774,8 +774,8 @@ export type GeminiModelProviderOptions< TModel extends keyof GeminiModelMetaMap, > = GeminiModelMetaMap[TModel] extends ModelMeta - ? TProviderOptions - : unknown + ? TProviderOptions + : unknown export const GEMINI_MODELS = [ GEMINI_3_PRO.name, @@ -820,50 +820,50 @@ export type GeminiChatModels = (typeof GEMINI_MODELS)[number] export type GeminiChatModelProviderOptionsByName = { // Models with thinking and structured output support [GEMINI_3_PRO.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_PRO.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_FLASH.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_FLASH_PREVIEW.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_FLASH_LITE.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_FLASH_LITE_PREVIEW.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions // Models with structured output but no thinking support [GEMINI_2_FLASH.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions [GEMINI_2_FLASH_LITE.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions } diff --git a/packages/typescript/ai-gemini/tsdown.config.ts b/packages/typescript/ai-gemini/tsdown.config.ts deleted file mode 100644 index 773c32c65..000000000 --- a/packages/typescript/ai-gemini/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'tsdown' - -export default defineConfig({ - entry: ['./src/index.ts'], - format: ['esm'], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, - external: ['@google/generative-ai'], -}) diff --git a/packages/typescript/ai-gemini/vite.config.ts b/packages/typescript/ai-gemini/vite.config.ts index a938cb71a..e83c13eb9 100644 --- a/packages/typescript/ai-gemini/vite.config.ts +++ b/packages/typescript/ai-gemini/vite.config.ts @@ -7,7 +7,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/ai-ollama/package.json b/packages/typescript/ai-ollama/package.json index 929bc2414..ee2063d05 100644 --- a/packages/typescript/ai-ollama/package.json +++ b/packages/typescript/ai-ollama/package.json @@ -28,7 +28,7 @@ "lint:fix": "eslint ./src --fix", "test:build": "publint --strict", "test:eslint": "eslint ./src", - "test:lib": "vitest", + "test:lib": "vitest --passWithNoTests", "test:lib:dev": "pnpm test:lib --watch", "test:types": "tsc" }, diff --git a/packages/typescript/ai-ollama/tsdown.config.ts b/packages/typescript/ai-ollama/tsdown.config.ts deleted file mode 100644 index 7ede38983..000000000 --- a/packages/typescript/ai-ollama/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'tsdown' - -export default defineConfig({ - entry: ['./src/index.ts'], - format: ['esm'], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, - external: ['ollama'], -}) diff --git a/packages/typescript/ai-ollama/vite.config.ts b/packages/typescript/ai-ollama/vite.config.ts index a938cb71a..e83c13eb9 100644 --- a/packages/typescript/ai-ollama/vite.config.ts +++ b/packages/typescript/ai-ollama/vite.config.ts @@ -7,7 +7,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/ai-openai/live-tests/example-guitars.ts b/packages/typescript/ai-openai/live-tests/example-guitars.ts deleted file mode 100644 index 16b6764f7..000000000 --- a/packages/typescript/ai-openai/live-tests/example-guitars.ts +++ /dev/null @@ -1,83 +0,0 @@ -export interface Guitar { - id: number - name: string - image: string - description: string - shortDescription: string - price: number -} - -const guitars: Array = [ - { - id: 1, - name: 'Video Game Guitar', - image: '/example-guitar-video-games.jpg', - description: - "The Video Game Guitar is a unique acoustic guitar that features a design inspired by video games. It has a sleek, high-gloss finish and a comfortable playability. The guitar's ergonomic body and fast neck profile ensure comfortable playability for hours on end.", - shortDescription: - 'A unique electric guitar with a video game design, high-gloss finish, and comfortable playability.', - price: 699, - }, - { - id: 2, - name: 'Superhero Guitar', - image: '/example-guitar-superhero.jpg', - description: - "The Superhero Guitar is a bold black electric guitar that stands out with its unique superhero logo design. Its sleek, high-gloss finish and powerful pickups make it perfect for high-energy performances. The guitar's ergonomic body and fast neck profile ensure comfortable playability for hours on end.", - shortDescription: - 'A bold black electric guitar with a unique superhero logo, high-gloss finish, and powerful pickups.', - price: 699, - }, - { - id: 3, - name: 'Motherboard Guitar', - image: '/example-guitar-motherboard.jpg', - description: - "This guitar is a tribute to the motherboard of a computer. It's a unique and stylish instrument that will make you feel like a hacker. The intricate circuit-inspired design features actual LED lights that pulse with your playing intensity, while the neck is inlaid with binary code patterns that glow under stage lights. Each pickup has been custom-wound to produce tones ranging from clean digital precision to glitched-out distortion, perfect for electronic music fusion. The Motherboard Guitar seamlessly bridges the gap between traditional craftsmanship and cutting-edge technology, making it the ultimate instrument for the digital age musician.", - shortDescription: - 'A tech-inspired electric guitar featuring LED lights and binary code inlays that glow under stage lights.', - price: 649, - }, - { - id: 4, - name: 'Racing Guitar', - image: '/example-guitar-racing.jpg', - description: - "Engineered for speed and precision, the Racing Guitar embodies the spirit of motorsport in every curve and contour. Its aerodynamic body, painted in classic racing stripes and high-gloss finish, is crafted from lightweight materials that allow for effortless play during extended performances. The custom low-action setup and streamlined neck profile enable lightning-fast fretwork, while specially designed pickups deliver a high-octane tone that cuts through any mix. Built with performance-grade hardware including racing-inspired control knobs and checkered flag inlays, this guitar isn't just played—it's driven to the limits of musical possibility.", - shortDescription: - 'A lightweight, aerodynamic guitar with racing stripes and a low-action setup designed for speed and precision.', - price: 679, - }, - { - id: 5, - name: 'Steamer Trunk Guitar', - image: '/example-guitar-steamer-trunk.jpg', - description: - 'The Steamer Trunk Guitar is a semi-hollow body instrument that exudes vintage charm and character. Crafted from reclaimed antique luggage wood, it features brass hardware that adds a touch of elegance and durability. The fretboard is adorned with a world map inlay, making it a unique piece that tells a story of travel and adventure.', - shortDescription: - 'A semi-hollow body guitar with brass hardware and a world map inlay, crafted from reclaimed antique luggage wood.', - price: 629, - }, - { - id: 6, - name: "Travelin' Man Guitar", - image: '/example-guitar-traveling.jpg', - description: - "The Travelin' Man Guitar is an acoustic masterpiece adorned with vintage postcards from around the world. Each postcard tells a story of adventure and wanderlust, making this guitar a unique piece of art. Its rich, resonant tones and comfortable playability make it perfect for musicians who love to travel and perform.", - shortDescription: - 'An acoustic guitar with vintage postcards, rich tones, and comfortable playability.', - price: 499, - }, - { - id: 7, - name: 'Flowerly Love Guitar', - image: '/example-guitar-flowers.jpg', - description: - "The Flowerly Love Guitar is an acoustic masterpiece adorned with intricate floral designs on its body. Each flower is hand-painted, adding a touch of nature's beauty to the instrument. Its warm, resonant tones make it perfect for both intimate performances and larger gatherings.", - shortDescription: - 'An acoustic guitar with hand-painted floral designs and warm, resonant tones.', - price: 599, - }, -] - -export default guitars diff --git a/packages/typescript/ai-openai/live-tests/test-tool-arguments.ts b/packages/typescript/ai-openai/live-tests/test-tool-arguments.ts deleted file mode 100644 index cbf5e3b66..000000000 --- a/packages/typescript/ai-openai/live-tests/test-tool-arguments.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { chat, tool } from '@tanstack/ai' -import { createOpenAI } from '../dist/openai-adapter.js' -import guitars from './example-guitars.js' -import * as path from 'path' -import * as fs from 'fs' -import { fileURLToPath } from 'url' - -// Load .env.local file -const __filename = fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) -const envPath = path.join(__dirname, '.env.local') - -let apiKey = process.env.OPENAI_API_KEY - -if (!apiKey && fs.existsSync(envPath)) { - const envContent = fs.readFileSync(envPath, 'utf-8') - const match = envContent.match(/^OPENAI_API_KEY=(.+)$/m) - if (match) { - apiKey = match[1]?.trim() - } -} - -if (!apiKey) { - throw new Error('OPENAI_API_KEY is required in .env.local or environment') -} - -const getGuitars = tool({ - type: 'function', - function: { - name: 'getGuitars', - description: 'Get all products from the database', - parameters: { - type: 'object', - properties: {}, - required: [], - }, - }, - execute: async () => { - return JSON.stringify(guitars) - }, -}) - -const recommendGuitar = tool({ - type: 'function', - function: { - name: 'recommendGuitar', - description: 'Use this tool to recommend a guitar to the user', - parameters: { - type: 'object', - properties: { - id: { - type: 'string', - description: 'The id of the guitar to recommend', - }, - }, - required: ['id'], - }, - }, - execute: async ({ id }) => { - return JSON.stringify({ id }) - }, -}) - -async function testToolArguments() { - console.log('🧪 Testing tool argument parsing...\n') - - const openai = createOpenAI(apiKey) - const tools = [getGuitars, recommendGuitar] - - const messages = [ - { - role: 'user' as const, - content: - 'please search your product catalog and recommend a good acoustic guitar', - }, - ] - - console.log('📤 Sending request to OpenAI...\n') - - const toolCalls: Array<{ - id: string - name: string - arguments: string - }> = [] - - try { - for await (const chunk of chat({ - adapter: openai, - model: 'gpt-4o', - messages, - tools, - })) { - if (chunk.type === 'tool_call') { - const toolCall = chunk.toolCall - const args = toolCall.function.arguments - toolCalls.push({ - id: toolCall.id, - name: toolCall.function.name, - arguments: args, - }) - console.log(`🔧 Tool call: ${toolCall.function.name}`) - console.log(` ID: ${toolCall.id}`) - console.log(` Arguments: ${args}`) - console.log(` Arguments length: ${args?.length || 0}`) - console.log() - } - } - - console.log('\n📊 Results:\n') - console.log(`Total tool calls: ${toolCalls.length}\n`) - - // Find the recommendGuitar call - const recommendCall = toolCalls.find((tc) => tc.name === 'recommendGuitar') - - if (!recommendCall) { - console.error('❌ ERROR: recommendGuitar tool was not called') - process.exit(1) - } - - console.log('✅ recommendGuitar was called') - console.log(` Arguments: ${recommendCall.arguments}`) - - // Parse and verify arguments - let parsedArgs: any - try { - parsedArgs = JSON.parse(recommendCall.arguments) - } catch (e) { - console.error(`❌ ERROR: Failed to parse arguments as JSON: ${e}`) - console.error(` Raw arguments: ${recommendCall.arguments}`) - process.exit(1) - } - - console.log(` Parsed: ${JSON.stringify(parsedArgs, null, 2)}`) - - // Verify the arguments contain an id - if (!parsedArgs.id) { - console.error("❌ ERROR: Arguments do not contain 'id' field") - console.error(` Parsed args: ${JSON.stringify(parsedArgs)}`) - process.exit(1) - } - - if (parsedArgs.id === '' || parsedArgs.id === undefined) { - console.error("❌ ERROR: 'id' field is empty or undefined") - console.error(` Parsed args: ${JSON.stringify(parsedArgs)}`) - process.exit(1) - } - - console.log( - `\n✅ SUCCESS: recommendGuitar received correct arguments with id: "${parsedArgs.id}"`, - ) - console.log('\n🎉 Test passed!') - } catch (error: any) { - console.error('\n❌ ERROR:', error.message) - console.error(error.stack) - process.exit(1) - } -} - -testToolArguments() diff --git a/packages/typescript/ai-openai/src/model-meta.ts b/packages/typescript/ai-openai/src/model-meta.ts index 2a82765f3..1adac42df 100644 --- a/packages/typescript/ai-openai/src/model-meta.ts +++ b/packages/typescript/ai-openai/src/model-meta.ts @@ -98,11 +98,11 @@ const GPT5_1 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_1_CODEX = { @@ -127,11 +127,11 @@ const GPT5_1_CODEX = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5 = { @@ -168,11 +168,11 @@ const GPT5 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_MINI = { @@ -198,10 +198,10 @@ const GPT5_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_NANO = { @@ -233,10 +233,10 @@ const GPT5_NANO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_PRO = { @@ -261,11 +261,11 @@ const GPT5_PRO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_CODEX = { @@ -290,11 +290,11 @@ const GPT5_CODEX = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const SORA2 = { @@ -407,9 +407,9 @@ const O3_DEEP_RESEARCH = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O4_MINI_DEEP_RESEARCH = { @@ -434,9 +434,9 @@ const O4_MINI_DEEP_RESEARCH = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O3_PRO = { @@ -460,11 +460,11 @@ const O3_PRO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_AUDIO = { @@ -489,9 +489,9 @@ const GPT_AUDIO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_REALTIME = { @@ -517,9 +517,9 @@ const GPT_REALTIME = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_REALTIME_MINI = { @@ -545,9 +545,9 @@ const GPT_REALTIME_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_AUDIO_MINI = { @@ -572,9 +572,9 @@ const GPT_AUDIO_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O3 = { @@ -599,11 +599,11 @@ const O3 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O4_MINI = { @@ -633,10 +633,10 @@ const O4_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT4_1 = { @@ -680,11 +680,11 @@ const GPT4_1 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT4_1_MINI = { @@ -720,10 +720,10 @@ const GPT4_1_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT4_1_NANO = { @@ -760,10 +760,10 @@ const GPT4_1_NANO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O1_PRO = { @@ -787,11 +787,11 @@ const O1_PRO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const COMPUTER_USE_PREVIEW = { @@ -815,9 +815,9 @@ const COMPUTER_USE_PREVIEW = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_4O_MINI_SEARCH_PREVIEW = { @@ -888,11 +888,11 @@ const O3_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_4O_MINI_AUDIO = { @@ -917,9 +917,9 @@ const GPT_4O_MINI_AUDIO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_4O_MINI_REALTIME = { @@ -945,9 +945,9 @@ const GPT_4O_MINI_REALTIME = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O1 = { @@ -972,11 +972,11 @@ const O1 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const OMNI_MODERATION = { @@ -1034,11 +1034,11 @@ const GPT_4O = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_4O_AUDIO = { @@ -1063,9 +1063,9 @@ const GPT_4O_AUDIO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_40_MINI = { @@ -1102,10 +1102,10 @@ const GPT_40_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT__4O_REALTIME = { @@ -1131,9 +1131,9 @@ const GPT__4O_REALTIME = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_4_TURBO = { @@ -1157,9 +1157,9 @@ const GPT_4_TURBO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const CHATGPT_40 = { @@ -1207,11 +1207,11 @@ const GPT_5_1_CODEX_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const CODEX_MINI_LATEST = { @@ -1236,11 +1236,11 @@ const CODEX_MINI_LATEST = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const DALL_E_2 = { @@ -1452,11 +1452,11 @@ const GPT_5_1_CHAT = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_5_CHAT = { @@ -1488,11 +1488,11 @@ const GPT_5_CHAT = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const TEXT_EMBEDDING_3_LARGE = { @@ -1649,7 +1649,7 @@ export const OPENAI_CHAT_MODELS = [ ] as const // Image generation models (based on endpoints: "image-generation" or "image-edit") -export const OPENAI_IMAGE_MODELS = [ +const OPENAI_IMAGE_MODELS = [ GPT_IMAGE_1.name, GPT_IMAGE_1_MINI.name, DALL_E_3.name, @@ -1664,7 +1664,7 @@ export const OPENAI_EMBEDDING_MODELS = [ ] as const // Audio models (based on endpoints: "transcription", "speech_generation", or "realtime") -export const OPENAI_AUDIO_MODELS = [ +const OPENAI_AUDIO_MODELS = [ // Transcription models GPT_4O_TRANSCRIBE.name, GPT_4O_TRANSCRIBE_DIARIZE.name, @@ -1681,16 +1681,16 @@ export const OPENAI_AUDIO_MODELS = [ ] as const // Transcription-only models (based on endpoints: "transcription") -export const OPENAI_TRANSCRIPTION_MODELS = [ +const OPENAI_TRANSCRIPTION_MODELS = [ GPT_4O_TRANSCRIBE.name, GPT_4O_TRANSCRIBE_DIARIZE.name, GPT_4O_MINI_TRANSCRIBE.name, ] as const // Video generation models (based on endpoints: "video") -export const OPENAI_VIDEO_MODELS = [SORA2.name, SORA2_PRO.name] as const +const OPENAI_VIDEO_MODELS = [SORA2.name, SORA2_PRO.name] as const -export const OPENAI_MODERATION_MODELS = [OMNI_MODERATION.name] as const +// const OPENAI_MODERATION_MODELS = [OMNI_MODERATION.name] as const export type OpenAIChatModel = (typeof OPENAI_CHAT_MODELS)[number] export type OpenAIImageModel = (typeof OPENAI_IMAGE_MODELS)[number] @@ -1770,150 +1770,150 @@ export type OpenAIModelMetaMap = typeof OPENAI_MODEL_META export type OpenAIChatModelProviderOptionsByName = { // Models WITH structured output support (have 'text' field) 'gpt-5.1': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5.1-codex': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5-mini': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5-nano': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5-pro': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5-codex': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4.1': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4.1-mini': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4.1-nano': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o-mini': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions // Models WITHOUT structured output support (NO 'text' field) 'gpt-4': OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4-turbo': OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-3.5-turbo': OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'chatgpt-4.0': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions o3: OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o3-pro': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o3-mini': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o4-mini': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o3-deep-research': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIMetadataOptions 'o4-mini-deep-research': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIMetadataOptions o1: OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o1-pro': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions // Audio models 'gpt-audio': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-audio-mini': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o-audio': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o-mini-audio': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions // Chat-only models 'gpt-5.1-chat': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIMetadataOptions 'gpt-5-chat': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIMetadataOptions // Codex models 'gpt-5.1-codex-mini': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'codex-mini-latest': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions // Search models 'gpt-4o-search-preview': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o-mini-search-preview': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions // Special models 'computer-use-preview': OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions } diff --git a/packages/typescript/ai-openai/src/text/text-provider-options.ts b/packages/typescript/ai-openai/src/text/text-provider-options.ts index 53aac0cf7..bc52271f8 100644 --- a/packages/typescript/ai-openai/src/text/text-provider-options.ts +++ b/packages/typescript/ai-openai/src/text/text-provider-options.ts @@ -285,6 +285,11 @@ export const validateConversationAndPreviousResponseId = ( } } +export const validateTextProviderOptions = (options: InternalTextProviderOptions) => { + validateMetadata(options) + validateConversationAndPreviousResponseId(options) +} + export const validateMetadata = (options: InternalTextProviderOptions) => { const metadata = options.metadata const tooManyKeys = metadata && Object.keys(metadata).length > 16 diff --git a/packages/typescript/ai-openai/src/tools/file-search-tool.ts b/packages/typescript/ai-openai/src/tools/file-search-tool.ts index 407b31cdb..0aae36710 100644 --- a/packages/typescript/ai-openai/src/tools/file-search-tool.ts +++ b/packages/typescript/ai-openai/src/tools/file-search-tool.ts @@ -1,7 +1,7 @@ import type OpenAI from 'openai' import type { Tool } from '@tanstack/ai' -export const validateMaxNumResults = (maxNumResults: number | undefined) => { +const validateMaxNumResults = (maxNumResults: number | undefined) => { if (maxNumResults && (maxNumResults < 1 || maxNumResults > 50)) { throw new Error('max_num_results must be between 1 and 50.') } diff --git a/packages/typescript/ai-openai/src/tools/image-generation-tool.ts b/packages/typescript/ai-openai/src/tools/image-generation-tool.ts index f8b58c1f9..3ed45c922 100644 --- a/packages/typescript/ai-openai/src/tools/image-generation-tool.ts +++ b/packages/typescript/ai-openai/src/tools/image-generation-tool.ts @@ -3,7 +3,7 @@ import type { Tool } from '@tanstack/ai' export type ImageGenerationTool = OpenAI.Responses.Tool.ImageGeneration -export const validatePartialImages = (value: number | undefined) => { +const validatePartialImages = (value: number | undefined) => { if (value !== undefined && (value < 0 || value > 3)) { throw new Error('partial_images must be between 0 and 3') } diff --git a/packages/typescript/ai-openai/tsdown.config.ts b/packages/typescript/ai-openai/tsdown.config.ts deleted file mode 100644 index a750e678c..000000000 --- a/packages/typescript/ai-openai/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'tsdown' - -export default defineConfig({ - entry: ['./src/index.ts'], - format: ['esm'], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, - external: ['openai'], -}) diff --git a/packages/typescript/ai-openai/vite.config.ts b/packages/typescript/ai-openai/vite.config.ts index a938cb71a..e83c13eb9 100644 --- a/packages/typescript/ai-openai/vite.config.ts +++ b/packages/typescript/ai-openai/vite.config.ts @@ -7,7 +7,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/ai-react-ui/package.json b/packages/typescript/ai-react-ui/package.json index 84a030274..2020ea3b1 100644 --- a/packages/typescript/ai-react-ui/package.json +++ b/packages/typescript/ai-react-ui/package.json @@ -30,7 +30,6 @@ "components" ], "dependencies": { - "highlight.js": "^11.11.1", "react-markdown": "^10.1.0", "rehype-highlight": "^7.0.2", "rehype-raw": "^7.0.0", @@ -40,9 +39,9 @@ "peerDependencies": { "@tanstack/ai-client": "workspace:*", "@tanstack/ai-react": "workspace:*", + "@types/react": ">=18.0.0", "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0", - "@types/react": ">=18.0.0" + "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { "vite": "^7.2.4" diff --git a/packages/typescript/ai-react-ui/tsdown.config.ts b/packages/typescript/ai-react-ui/tsdown.config.ts deleted file mode 100644 index f10314eda..000000000 --- a/packages/typescript/ai-react-ui/tsdown.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from 'tsdown' - -export default defineConfig({ - entry: ['src/index.ts'], - format: ['cjs', 'esm'], - clean: true, - dts: true, - external: ['react', 'react-dom', '@tanstack/ai-react'], -}) diff --git a/packages/typescript/ai-react-ui/vite.config.ts b/packages/typescript/ai-react-ui/vite.config.ts index edfcce5da..6a08c0d36 100644 --- a/packages/typescript/ai-react-ui/vite.config.ts +++ b/packages/typescript/ai-react-ui/vite.config.ts @@ -7,7 +7,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/ai-react/package.json b/packages/typescript/ai-react/package.json index 48926469f..c2504229b 100644 --- a/packages/typescript/ai-react/package.json +++ b/packages/typescript/ai-react/package.json @@ -45,12 +45,8 @@ "@tanstack/ai-client": "workspace:*" }, "devDependencies": { - "@eslint-react/eslint-plugin": "^2.3.9", "@testing-library/react": "^16.3.0", "@types/react": "^19.2.7", - "@vitejs/plugin-react": "^5.1.1", - "eslint-plugin-react-compiler": "19.1.0-rc.2", - "eslint-plugin-react-hooks": "^7.0.1", "vite": "^7.2.4" }, "peerDependencies": { @@ -59,4 +55,4 @@ "@types/react": ">=18.0.0", "react": ">=18.0.0" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-react/tsdown.config.ts b/packages/typescript/ai-react/tsdown.config.ts deleted file mode 100644 index 6d458495b..000000000 --- a/packages/typescript/ai-react/tsdown.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from 'tsdown' - -export default defineConfig({ - entry: ['./src/index.ts'], - format: ['esm'], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, - external: ['react'], -}) diff --git a/packages/typescript/ai-react/vite.config.ts b/packages/typescript/ai-react/vite.config.ts index a938cb71a..e83c13eb9 100644 --- a/packages/typescript/ai-react/vite.config.ts +++ b/packages/typescript/ai-react/vite.config.ts @@ -7,7 +7,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/ai/src/event-client.ts b/packages/typescript/ai/src/event-client.ts index a82f40f6a..f4561a72f 100644 --- a/packages/typescript/ai/src/event-client.ts +++ b/packages/typescript/ai/src/event-client.ts @@ -273,7 +273,7 @@ type StripPrefix = // Get all event names without the prefix type EventSuffix = StripPrefix -export class AiEventClient extends EventClient { +class AiEventClient extends EventClient { private eventTarget: EventTarget constructor() { diff --git a/packages/typescript/ai/tests/ai-chat.test.ts b/packages/typescript/ai/tests/ai-chat.test.ts index 65686c798..213f835ab 100644 --- a/packages/typescript/ai/tests/ai-chat.test.ts +++ b/packages/typescript/ai/tests/ai-chat.test.ts @@ -1,12 +1,13 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' +/* eslint-disable @typescript-eslint/require-await */ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { chat } from '../src/core/chat' -import type { ChatOptions, StreamChunk, Tool, ModelMessage } from '../src/types' import { BaseAdapter } from '../src/base-adapter' import { aiEventClient } from '../src/event-client.js' import { maxIterations } from '../src/utilities/agent-loop-strategies' +import type { ChatOptions, ModelMessage, StreamChunk, Tool } from '../src/types' // Mock event client to track events -const eventListeners = new Map>() +const eventListeners = new Map) => void>>() const capturedEvents: Array<{ type: string; data: any }> = [] beforeEach(() => { @@ -39,8 +40,8 @@ class MockAdapter extends BaseAdapter< public chatStreamCallCount = 0 public chatStreamCalls: Array<{ model: string - messages: ModelMessage[] - tools?: Tool[] + messages: Array + tools?: Array request?: ChatOptions['request'] providerOptions?: any }> = [] @@ -60,7 +61,7 @@ class MockAdapter extends BaseAdapter< }) } - // Default implementation - will be overridden in tests + // Default implementation - will be overridden in tests async *chatStream(options: ChatOptions): AsyncIterable { this.trackStreamCall(options) yield { @@ -91,8 +92,8 @@ class MockAdapter extends BaseAdapter< } // Helper to collect all chunks from a stream -async function collectChunks(stream: AsyncIterable): Promise { - const chunks: T[] = [] +async function collectChunks(stream: AsyncIterable): Promise> { + const chunks: Array = [] for await (const chunk of stream) { chunks.push(chunk) } @@ -192,9 +193,9 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { ) const call = adapter.chatStreamCalls[0] - expect(call.messages[0].role).toBe('system') - expect(call.messages[0].content).toBe('You are concise') - expect(call.messages.length).toBe(2) + expect(call?.messages[0]?.role).toBe('system') + expect(call?.messages[0]?.content).toBe('You are concise') + expect(call?.messages.length).toBe(2) }) it('should prepend system prompts when provided', async () => { @@ -210,12 +211,12 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { ) const call = adapter.chatStreamCalls[0] - expect(call.messages).toHaveLength(3) - expect(call.messages[0].role).toBe('system') - expect(call.messages[0].content).toBe('You are helpful') - expect(call.messages[1].role).toBe('system') - expect(call.messages[1].content).toBe('You are concise') - expect(call.messages[2].role).toBe('user') + expect(call?.messages).toHaveLength(3) + expect(call?.messages[0]?.role).toBe('system') + expect(call?.messages[0]?.content).toBe('You are helpful') + expect(call?.messages[1]?.role).toBe('system') + expect(call?.messages[1]?.content).toBe('You are concise') + expect(call?.messages[2]?.role).toBe('user') }) it('should pass providerOptions to adapter', async () => { @@ -230,7 +231,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { }), ) - expect(adapter.chatStreamCalls[0].providerOptions).toEqual({ + expect(adapter.chatStreamCalls[0]?.providerOptions).toEqual({ customOption: 'value', }) }) @@ -250,8 +251,8 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { expect(adapter.chatStreamCallCount).toBe(1) expect(chunks).toHaveLength(2) - expect(chunks[0].type).toBe('content') - expect(chunks[1].type).toBe('done') + expect(chunks[0]?.type).toBe('content') + expect(chunks[1]?.type).toBe('done') // Check events expect(capturedEvents.some((e) => e.type === 'chat:started')).toBe(true) @@ -362,7 +363,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { }), ) - expect(chunks[0].type).toBe('content') + expect(chunks[0]?.type).toBe('content') expect((chunks[0] as any).content).toBe('') }) }) @@ -648,7 +649,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { (e) => e.type === 'chat:iteration', ) expect(iterationEvents.length).toBeGreaterThan(0) - expect(iterationEvents[0].data.toolCallCount).toBe(2) + expect(iterationEvents[0]?.data.toolCallCount).toBe(2) }) it('should handle tool calls with accumulated content', async () => { @@ -988,7 +989,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { const messages = options.messages const toolMessages = messages.filter((m) => m.role === 'tool') expect(toolMessages.length).toBeGreaterThan(0) - expect(toolMessages[0].toolCallId).toBe('call-1') + expect(toolMessages[0]?.toolCallId).toBe('call-1') yield { type: 'content', @@ -1429,7 +1430,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { const adapter = new PendingToolAdapter() - const messages: ModelMessage[] = [ + const messages: Array = [ { role: 'user', content: 'Delete file' }, { role: 'assistant', @@ -1582,7 +1583,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { const adapter = new InfiniteLoopAdapter() // Consume stream - should stop after 5 iterations (default) - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of chat({ adapter, model: 'test-model', @@ -1798,7 +1799,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { abortController, }) - const chunks: StreamChunk[] = [] + const chunks: Array = [] let count = 0 for await (const chunk of stream) { @@ -1856,7 +1857,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { abortController, }) - const chunks: StreamChunk[] = [] + const chunks: Array = [] for await (const chunk of stream) { chunks.push(chunk) if (chunk.type === 'tool_call') { @@ -1916,8 +1917,8 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { // Should stop at error chunk expect(chunks).toHaveLength(2) - expect(chunks[0].type).toBe('content') - expect(chunks[1].type).toBe('error') + expect(chunks[0]?.type).toBe('content') + expect(chunks[1]?.type).toBe('error') expect((chunks[1] as any).error.message).toBe('API error occurred') // Should emit error event @@ -2147,7 +2148,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { (e) => e.type === 'chat:iteration', ) expect(iterationEvents.length).toBeGreaterThan(0) - expect(iterationEvents[0].data.iterationNumber).toBe(1) + expect(iterationEvents[0]?.data.iterationNumber).toBe(1) }) it('should emit stream:ended event after successful completion', async () => { @@ -2260,7 +2261,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { ) expect(chunks.length).toBeGreaterThan(0) - expect(adapter.chatStreamCalls[0].messages).toHaveLength(0) + expect(adapter.chatStreamCalls[0]?.messages).toHaveLength(0) }) it('should handle empty tools array', async () => { @@ -2422,8 +2423,8 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { (e) => e.type === 'stream:chunk:tool-result', ) expect(toolResultEvents.length).toBeGreaterThan(0) - expect(toolResultEvents[0].data.toolCallId).toBe('call-previous') - expect(toolResultEvents[0].data.result).toBe( + expect(toolResultEvents[0]?.data.toolCallId).toBe('call-previous') + expect(toolResultEvents[0]?.data.result).toBe( JSON.stringify({ result: 'previous result' }), ) }) @@ -2530,7 +2531,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { // Second call - with approval response in message parts // The approval ID should match the format: approval_${toolCall.id} - const messagesWithApproval: ModelMessage[] = [ + const messagesWithApproval: Array = [ { role: 'user', content: 'Delete file' }, { role: 'assistant', @@ -2653,7 +2654,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { expect(inputChunk).toBeDefined() // Second call - with client tool output in message parts - const messagesWithOutput: ModelMessage[] = [ + const messagesWithOutput: Array = [ { role: 'user', content: 'Use client tool' }, { role: 'assistant', @@ -2777,7 +2778,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { const adapter = new MixedPartsAdapter() // Call with messages containing both approval response and client tool output in parts - const messagesWithBoth: ModelMessage[] = [ + const messagesWithBoth: Array = [ { role: 'user', content: 'Use both tools' }, { role: 'assistant', @@ -2849,7 +2850,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { required: [], }, }, - execute: vi.fn(async (args: any) => { + execute: vi.fn(async (_args: any) => { return '70' }), } @@ -2921,7 +2922,7 @@ describe('chat() - Comprehensive Logic Path Coverage', () => { (m) => m.role === 'tool', ) expect(toolResults.length).toBeGreaterThan(0) - expect(toolResults[0].content).toBe('70') + expect(toolResults[0]?.content).toBe('70') yield { type: 'content', diff --git a/packages/typescript/ai/tests/tool-call-manager.test.ts b/packages/typescript/ai/tests/tool-call-manager.test.ts index ac6359f71..e4781dedc 100644 --- a/packages/typescript/ai/tests/tool-call-manager.test.ts +++ b/packages/typescript/ai/tests/tool-call-manager.test.ts @@ -1,6 +1,6 @@ -import { describe, it, expect, vi } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import { ToolCallManager } from '../src/tools/tool-calls' -import type { Tool, DoneStreamChunk } from '../src/types' +import type { DoneStreamChunk, Tool } from '../src/types' describe('ToolCallManager', () => { const mockDoneChunk: DoneStreamChunk = { @@ -18,7 +18,7 @@ describe('ToolCallManager', () => { description: 'Get weather', parameters: {}, }, - execute: vi.fn(async (args: any) => { + execute: vi.fn((args: any) => { return JSON.stringify({ temp: 72, location: args.location }) }), } @@ -26,10 +26,10 @@ describe('ToolCallManager', () => { async function collectGeneratorOutput( generator: AsyncGenerator, ): Promise<{ - chunks: TChunk[] + chunks: Array result: TResult }> { - const chunks: TChunk[] = [] + const chunks: Array = [] let next = await generator.next() while (!next.done) { chunks.push(next.value) @@ -61,9 +61,9 @@ describe('ToolCallManager', () => { const toolCalls = manager.getToolCalls() expect(toolCalls).toHaveLength(1) - expect(toolCalls[0].id).toBe('call_123') - expect(toolCalls[0].function.name).toBe('get_weather') - expect(toolCalls[0].function.arguments).toBe('{"location":"Paris"}') + expect(toolCalls[0]?.id).toBe('call_123') + expect(toolCalls[0]?.function.name).toBe('get_weather') + expect(toolCalls[0]?.function.arguments).toBe('{"location":"Paris"}') }) it('should filter out incomplete tool calls', () => { @@ -91,7 +91,7 @@ describe('ToolCallManager', () => { const toolCalls = manager.getToolCalls() expect(toolCalls).toHaveLength(1) - expect(toolCalls[0].id).toBe('call_123') + expect(toolCalls[0]?.id).toBe('call_123') }) it('should execute tools and emit tool_result chunks', async () => { @@ -111,14 +111,14 @@ describe('ToolCallManager', () => { // Should emit one tool_result chunk expect(emittedChunks).toHaveLength(1) - expect(emittedChunks[0].type).toBe('tool_result') - expect(emittedChunks[0].toolCallId).toBe('call_123') - expect(emittedChunks[0].content).toContain('temp') + expect(emittedChunks[0]?.type).toBe('tool_result') + expect(emittedChunks[0]?.toolCallId).toBe('call_123') + expect(emittedChunks[0]?.content).toContain('temp') // Should return one tool result message expect(finalResult).toHaveLength(1) - expect(finalResult[0].role).toBe('tool') - expect(finalResult[0].toolCallId).toBe('call_123') + expect(finalResult[0]?.role).toBe('tool') + expect(finalResult[0]?.toolCallId).toBe('call_123') // Tool execute should have been called expect(mockWeatherTool.execute).toHaveBeenCalledWith({ location: 'Paris' }) @@ -132,7 +132,7 @@ describe('ToolCallManager', () => { description: 'Throws error', parameters: {}, }, - execute: vi.fn(async () => { + execute: vi.fn(() => { throw new Error('Tool failed') }), } @@ -155,11 +155,11 @@ describe('ToolCallManager', () => { // Should still emit chunk with error message expect(chunks).toHaveLength(1) - expect(chunks[0].content).toContain('Error executing tool: Tool failed') + expect(chunks[0]?.content).toContain('Error executing tool: Tool failed') // Should still return tool result message expect(toolResults).toHaveLength(1) - expect(toolResults[0].content).toContain('Error executing tool') + expect(toolResults[0]?.content).toContain('Error executing tool') }) it('should handle tools without execute function', async () => { @@ -188,8 +188,8 @@ describe('ToolCallManager', () => { manager.executeTools(mockDoneChunk), ) - expect(chunks[0].content).toContain('does not have an execute function') - expect(toolResults[0].content).toContain( + expect(chunks[0]?.content).toContain('does not have an execute function') + expect(toolResults[0]?.content).toContain( 'does not have an execute function', ) }) @@ -222,7 +222,7 @@ describe('ToolCallManager', () => { description: 'Calculate', parameters: {}, }, - execute: vi.fn(async (args: any) => { + execute: vi.fn((args: any) => { return JSON.stringify({ result: eval(args.expression) }) }), } @@ -257,12 +257,12 @@ describe('ToolCallManager', () => { // Should emit two tool_result chunks expect(chunks).toHaveLength(2) - expect(chunks[0].toolCallId).toBe('call_weather') - expect(chunks[1].toolCallId).toBe('call_calc') + expect(chunks[0]?.toolCallId).toBe('call_weather') + expect(chunks[1]?.toolCallId).toBe('call_calc') // Should return two tool result messages expect(toolResults).toHaveLength(2) - expect(toolResults[0].toolCallId).toBe('call_weather') - expect(toolResults[1].toolCallId).toBe('call_calc') + expect(toolResults[0]?.toolCallId).toBe('call_weather') + expect(toolResults[1]?.toolCallId).toBe('call_calc') }) }) diff --git a/packages/typescript/ai/vite.config.ts b/packages/typescript/ai/vite.config.ts index a938cb71a..e83c13eb9 100644 --- a/packages/typescript/ai/vite.config.ts +++ b/packages/typescript/ai/vite.config.ts @@ -7,7 +7,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/react-ai-devtools/tsdown.config.ts b/packages/typescript/react-ai-devtools/tsdown.config.ts deleted file mode 100644 index 8d48d611b..000000000 --- a/packages/typescript/react-ai-devtools/tsdown.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'tsdown' - -export default defineConfig({ - entry: ['./src/index.ts', './src/production.ts'], - format: ['esm'], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, -}) diff --git a/packages/typescript/react-ai-devtools/vite.config.ts b/packages/typescript/react-ai-devtools/vite.config.ts index ed92e2ac9..4c5b81369 100644 --- a/packages/typescript/react-ai-devtools/vite.config.ts +++ b/packages/typescript/react-ai-devtools/vite.config.ts @@ -7,7 +7,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/solid-ai-devtools/tsdown.config.ts b/packages/typescript/solid-ai-devtools/tsdown.config.ts deleted file mode 100644 index 8d48d611b..000000000 --- a/packages/typescript/solid-ai-devtools/tsdown.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'tsdown' - -export default defineConfig({ - entry: ['./src/index.ts', './src/production.ts'], - format: ['esm'], - unbundle: true, - dts: true, - sourcemap: true, - clean: true, - minify: false, -}) diff --git a/packages/typescript/solid-ai-devtools/vite.config.ts b/packages/typescript/solid-ai-devtools/vite.config.ts index 14d0e0ae8..0bedef2fe 100644 --- a/packages/typescript/solid-ai-devtools/vite.config.ts +++ b/packages/typescript/solid-ai-devtools/vite.config.ts @@ -9,7 +9,6 @@ const config = defineConfig({ name: packageJson.name, dir: './', watch: false, - setupFiles: ['./tests/test-setup.ts'], globals: true, environment: 'node', include: ['tests/**/*.test.ts'], diff --git a/packages/typescript/tests-adapters/src/harness.ts b/packages/typescript/tests-adapters/src/harness.ts index 9d4bf80ad..884faed6f 100644 --- a/packages/typescript/tests-adapters/src/harness.ts +++ b/packages/typescript/tests-adapters/src/harness.ts @@ -1,8 +1,9 @@ -import { chat, type Tool } from '@tanstack/ai' -import { mkdir, writeFile } from 'fs/promises' -import { join } from 'path' +import { mkdir, writeFile } from 'node:fs/promises' +import { join } from 'node:path' +import { chat } from '@tanstack/ai' +import type { Tool } from '@tanstack/ai'; -export const OUTPUT_DIR = join(process.cwd(), 'output') +const OUTPUT_DIR = join(process.cwd(), 'output') export interface ToolCallCapture { id: string @@ -24,14 +25,14 @@ export interface ApprovalCapture { export interface StreamCapture { phase: string - chunks: any[] + chunks: Array fullResponse: string responseLength: number totalChunks: number - toolCalls: ToolCallCapture[] - toolResults: ToolResultCapture[] - approvalRequests: ApprovalCapture[] - reconstructedMessages: any[] + toolCalls: Array + toolResults: Array + approvalRequests: Array + reconstructedMessages: Array lastAssistantMessage: any | null } @@ -49,13 +50,13 @@ export interface DebugEnvelope { model: string timestamp: string input: { - messages: any[] - tools?: any[] + messages: Array + tools?: Array } - chunks: any[] + chunks: Array summary: Record result?: { passed: boolean; error?: string } - finalMessages?: any[] + finalMessages?: Array } async function ensureOutputDir() { @@ -77,15 +78,15 @@ export async function writeDebugFile( await writeFile(filepath, JSON.stringify(debugData, null, 2), 'utf-8') } -function formatToolsForDebug(tools: Tool[] = []) { +function formatToolsForDebug(tools: Array = []) { return tools.map((t) => ({ type: t.type, function: t.function ? { - name: t.function.name, - description: t.function.description, - parameters: t.function.parameters, - } + name: t.function.name, + description: t.function.description, + parameters: t.function.parameters, + } : undefined, needsApproval: (t as any).needsApproval, hasExecute: Boolean((t as any).execute), @@ -96,8 +97,8 @@ export function createDebugEnvelope( adapterName: string, testName: string, model: string, - messages: any[], - tools?: Tool[], + messages: Array, + tools?: Array, ): DebugEnvelope { return { adapter: adapterName, @@ -105,7 +106,7 @@ export function createDebugEnvelope( model, timestamp: new Date().toISOString(), input: { messages, tools: formatToolsForDebug(tools) }, - chunks: [] as any[], + chunks: [] as Array, summary: {}, } } @@ -127,8 +128,8 @@ export async function captureStream(opts: { phase: string adapter: any model: string - messages: any[] - tools?: Tool[] + messages: Array + tools?: Array agentLoopStrategy?: any }): Promise { const { @@ -152,11 +153,11 @@ export async function captureStream(opts: { let chunkIndex = 0 let fullResponse = '' - const chunks: any[] = [] + const chunks: Array = [] const toolCallMap = new Map() - const toolResults: ToolResultCapture[] = [] - const approvalRequests: ApprovalCapture[] = [] - const reconstructedMessages: any[] = [...messages] + const toolResults: Array = [] + const approvalRequests: Array = [] + const reconstructedMessages: Array = [...messages] let assistantDraft: any | null = null let lastAssistantMessage: any | null = null @@ -280,8 +281,8 @@ export async function runTestCase(opts: { adapterContext: AdapterContext testName: string description: string - messages: any[] - tools?: Tool[] + messages: Array + tools?: Array agentLoopStrategy?: any validate: (run: StreamCapture) => { passed: boolean @@ -337,8 +338,7 @@ export async function runTestCase(opts: { console.log(`[${adapterContext.adapterName}] ✅ ${testName}`) } else { console.log( - `[${adapterContext.adapterName}] ❌ ${testName}: ${ - validation.error || 'Unknown error' + `[${adapterContext.adapterName}] ❌ ${testName}: ${validation.error || 'Unknown error' }`, ) } @@ -347,7 +347,7 @@ export async function runTestCase(opts: { } export function buildApprovalMessages( - originalMessages: any[], + originalMessages: Array, firstRun: StreamCapture, approval: ApprovalCapture, ) { @@ -364,9 +364,9 @@ export function buildApprovalMessages( const aggregated = firstRun.toolCalls.find((call) => call.id === tc.id) return aggregated ? { - ...tc, - function: { ...tc.function, arguments: aggregated.arguments }, - } + ...tc, + function: { ...tc.function, arguments: aggregated.arguments }, + } : tc }) || [] From 10b775379e172b54b29e98c0dcbe5dace0ffc0cf Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 14:16:21 +0100 Subject: [PATCH 09/24] fix knip --- package.json | 2 +- packages/typescript/ai-anthropic/package.json | 5 +- .../typescript/ai-anthropic/src/model-meta.ts | 16 +- .../src/text/text-provider-options.ts | 106 +--- .../ai-anthropic/src/tools/bash-tool.ts | 4 +- .../src/tools/code-execution-tool.ts | 5 - .../src/tools/computer-use-tool.ts | 6 +- .../ai-anthropic/src/tools/index.ts | 14 +- .../src/tools/text-editor-tool.ts | 10 +- packages/typescript/ai-client/package.json | 1 + .../typescript/ai-client/tests/test-utils.ts | 2 +- packages/typescript/ai-devtools/package.json | 4 +- .../src/components/conversation/index.ts | 7 +- .../ai-devtools/src/store/ai-context.tsx | 6 +- .../ai-devtools/src/store/ai-store.ts | 5 - packages/typescript/ai-gemini/package.json | 1 + .../ai-gemini/src/gemini-adapter.ts | 1 - packages/typescript/ai-gemini/src/index.ts | 1 + .../typescript/ai-gemini/src/model-meta.ts | 20 +- .../src/text/text-provider-options.ts | 327 ++--------- .../src/tools/code-execution-tool.ts | 2 +- .../ai-gemini/src/tools/file-search-tool.ts | 40 +- .../src/tools/function-declaration-tool.ts | 142 +---- .../ai-gemini/src/tools/google-maps-tool.ts | 21 +- .../src/tools/google-search-retriveal-tool.ts | 8 +- .../ai-gemini/src/tools/google-search-tool.ts | 24 +- .../ai-gemini/src/tools/url-context-tool.ts | 2 +- packages/typescript/ai-ollama/package.json | 1 + .../ai-ollama/src/ollama-adapter.ts | 4 +- packages/typescript/ai-openai/package.json | 1 + .../src/image/image-provider-options.ts | 1 + .../typescript/ai-openai/src/model-meta.ts | 19 +- .../src/text/text-provider-options.ts | 4 +- .../ai-openai/src/tools/mcp-tool.ts | 2 +- .../ai-openai/src/tools/tool-choice.ts | 22 +- packages/typescript/ai-react-ui/package.json | 3 +- packages/typescript/ai-react/package.json | 4 +- .../typescript/ai-react/tests/test-utils.ts | 2 +- packages/typescript/ai/package.json | 5 +- packages/typescript/ai/src/event-client.ts | 4 +- .../typescript/ai/src/tools/tool-calls.ts | 2 +- .../typescript/ai/src/tools/tool-utils.ts | 54 +- packages/typescript/ai/vite.config.ts | 2 +- .../typescript/react-ai-devtools/package.json | 1 + .../typescript/solid-ai-devtools/package.json | 1 + .../typescript/tests-adapters/src/harness.ts | 10 +- pnpm-lock.yaml | 553 +++++------------- 47 files changed, 333 insertions(+), 1144 deletions(-) diff --git a/package.json b/package.json index 0e6014706..a7e36f230 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "test:ci": "nx run-many --targets=test:format,test:eslint,test:sherif,test:knip,test:lib,test:types,test:build,test:verify-links", "test:eslint": "nx affected --target=test:eslint --exclude=examples/**", "test:format": "pnpm run prettier --check", - "test:knip": "knip", + "test:knip": "knip --max-issues=33", "test:lib": "nx affected --targets=test:lib --exclude=examples/**", "test:lib:dev": "pnpm test:lib && nx watch --all -- pnpm test:lib", "test:pr": "nx affected --targets=test:format,test:eslint,test:sherif,test:knip,test:lib,test:types,test:build,build", diff --git a/packages/typescript/ai-anthropic/package.json b/packages/typescript/ai-anthropic/package.json index 5578bacd9..e8a375615 100644 --- a/packages/typescript/ai-anthropic/package.json +++ b/packages/typescript/ai-anthropic/package.json @@ -43,7 +43,10 @@ "@anthropic-ai/sdk": "^0.71.0", "@tanstack/ai": "workspace:*" }, + "devDependencies": { + "@vitest/coverage-v8": "4.0.14" + }, "peerDependencies": { "@tanstack/ai": "workspace:*" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai-anthropic/src/model-meta.ts b/packages/typescript/ai-anthropic/src/model-meta.ts index 9603d00b8..08b17bf12 100644 --- a/packages/typescript/ai-anthropic/src/model-meta.ts +++ b/packages/typescript/ai-anthropic/src/model-meta.ts @@ -317,9 +317,9 @@ const ANTHROPIC_MODEL_META = { [CLAUDE_HAIKU_3.name]: CLAUDE_HAIKU_3, } as const -export type AnthropicModelMetaMap = typeof ANTHROPIC_MODEL_META +type AnthropicModelMetaMap = typeof ANTHROPIC_MODEL_META -export type AnthropicModelProviderOptions< +/* export type AnthropicModelProviderOptions< TModel extends keyof AnthropicModelMetaMap, > = AnthropicModelMetaMap[TModel] extends ModelMeta< @@ -328,9 +328,9 @@ export type AnthropicModelProviderOptions< any > ? TProviderOptions - : unknown + : unknown */ -export type AnthropicModelToolCapabilities< +/* export type AnthropicModelToolCapabilities< TModel extends keyof AnthropicModelMetaMap, > = AnthropicModelMetaMap[TModel] extends ModelMeta< @@ -340,8 +340,8 @@ export type AnthropicModelToolCapabilities< > ? TToolCapabilities : unknown - -export type AnthropicModelMessageCapabilities< + */ +/* export type AnthropicModelMessageCapabilities< TModel extends keyof AnthropicModelMetaMap, > = AnthropicModelMetaMap[TModel] extends ModelMeta< @@ -350,7 +350,7 @@ export type AnthropicModelMessageCapabilities< infer TMessageCapabilities > ? TMessageCapabilities - : unknown + : unknown */ export const ANTHROPIC_MODELS = [ CLAUDE_OPUS_4_5.id, @@ -369,7 +369,7 @@ export const ANTHROPIC_MODELS = [ // const ANTHROPIC_AUDIO_MODELS = [] as const // const ANTHROPIC_VIDEO_MODELS = [] as const -export type AnthropicModel = (typeof ANTHROPIC_MODELS)[number] +/* type AnthropicModel = (typeof ANTHROPIC_MODELS)[number] */ // Manual type map for per-model provider options // Models are differentiated by extended_thinking and priority_tier support diff --git a/packages/typescript/ai-anthropic/src/text/text-provider-options.ts b/packages/typescript/ai-anthropic/src/text/text-provider-options.ts index c51c1f806..34429d91e 100644 --- a/packages/typescript/ai-anthropic/src/text/text-provider-options.ts +++ b/packages/typescript/ai-anthropic/src/text/text-provider-options.ts @@ -156,7 +156,7 @@ In nucleus sampling, we compute the cumulative distribution over all the options top_p?: number } -export const validateTopPandTemperature = ( +const validateTopPandTemperature = ( options: InternalTextProviderOptions, ) => { if (options.top_p !== undefined && options.temperature !== undefined) { @@ -169,7 +169,7 @@ export interface CacheControl { ttl: '5m' | '1h' } -export const validateThinking = (options: InternalTextProviderOptions) => { +const validateThinking = (options: InternalTextProviderOptions) => { const thinking = options.thinking if (thinking && thinking.type === 'enabled') { if (thinking.budget_tokens < 1024) { @@ -180,107 +180,7 @@ export const validateThinking = (options: InternalTextProviderOptions) => { } } } -export type Citation = - | CharacterLocationCitation - | PageCitation - | ContentBlockCitation - | WebSearchResultCitation - | RequestSearchResultLocation -interface CharacterLocationCitation { - cited_text: string - /** - * Bigger than 0 - */ - document_index: number - /** - * Between 1-255 characters - */ - document_title: string | null - - end_char_index: number - - start_char_index: number - - type: 'char_location' -} - -interface PageCitation { - cited_text: string - /** - * Bigger than 0 - */ - document_index: number - /** - * Between 1-255 characters - */ - document_title: string | null - - end_page_number: number - /** - * Has to be bigger than 0 - */ - start_page_number: number - - type: 'page_location' -} - -interface ContentBlockCitation { - cited_text: string - /** - * Bigger than 0 - */ - document_index: number - /** - * Between 1-255 characters - */ - document_title: string | null - - end_block_index: number - /** - * Has to be bigger than 0 - */ - start_block_index: number - - type: 'content_block_location' -} - -interface WebSearchResultCitation { - cited_text: string - - encrypted_index: number - /** - * Between 1-512 characters - */ - title: string | null - /** - * Required length between 1-2048 characters - */ - url: string - type: 'web_search_result_location' -} - -interface RequestSearchResultLocation { - cited_text: string - - end_block_index: number - /** - * Has to be bigger than 0 - */ - start_block_index: number - /** - * Bigger than 0 - */ - search_result_index: number - - source: string - /** - * Between 1-512 characters - */ - title: string | null - - type: 'search_result_location' -} interface MCPServer { name: string @@ -293,7 +193,7 @@ interface MCPServer { } | null } -export const validateMaxTokens = (options: InternalTextProviderOptions) => { +const validateMaxTokens = (options: InternalTextProviderOptions) => { if (options.max_tokens < 1) { throw new Error('max_tokens must be at least 1.') } diff --git a/packages/typescript/ai-anthropic/src/tools/bash-tool.ts b/packages/typescript/ai-anthropic/src/tools/bash-tool.ts index 0cd3d6f9d..896f912d3 100644 --- a/packages/typescript/ai-anthropic/src/tools/bash-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/bash-tool.ts @@ -6,9 +6,7 @@ import type { Tool } from '@tanstack/ai' export type BashTool = BetaToolBash20241022 | BetaToolBash20250124 -export function createBashTool(config: BashTool): BashTool { - return config -} + export function convertBashToolToAdapterFormat(tool: Tool): BashTool { const metadata = tool.metadata as BashTool diff --git a/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts b/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts index 0b8a0bc3d..1c7c18d24 100644 --- a/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts @@ -8,11 +8,6 @@ export type CodeExecutionTool = | BetaCodeExecutionTool20250522 | BetaCodeExecutionTool20250825 -export function createCodeExecutionTool( - config: CodeExecutionTool, -): CodeExecutionTool { - return config -} export function convertCodeExecutionToolToAdapterFormat( tool: Tool, diff --git a/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts b/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts index 63e09d7bf..586f05f22 100644 --- a/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts @@ -8,11 +8,7 @@ export type ComputerUseTool = | BetaToolComputerUse20241022 | BetaToolComputerUse20250124 -export function createComputerUseTool( - config: ComputerUseTool, -): ComputerUseTool { - return config -} + export function convertComputerUseToolToAdapterFormat( tool: Tool, diff --git a/packages/typescript/ai-anthropic/src/tools/index.ts b/packages/typescript/ai-anthropic/src/tools/index.ts index 67b1c7647..5012b2b5f 100644 --- a/packages/typescript/ai-anthropic/src/tools/index.ts +++ b/packages/typescript/ai-anthropic/src/tools/index.ts @@ -19,12 +19,12 @@ export type AnthropicTool = // Export individual tool types export type { - BashTool, - CodeExecutionTool, - ComputerUseTool, + // BashTool, + // CodeExecutionTool, + // ComputerUseTool, CustomTool, - MemoryTool, - TextEditorTool, - WebFetchTool, - WebSearchTool, + // MemoryTool, + // TextEditorTool, + // WebFetchTool, + // WebSearchTool, } diff --git a/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts b/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts index c15437603..9db9bf9c4 100644 --- a/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts @@ -11,9 +11,7 @@ export type TextEditorTool = | ToolTextEditor20250429 | ToolTextEditor20250728 -export function createTextEditorTool(config: T): T { - return config -} + export function convertTextEditorToolToAdapterFormat( tool: Tool, @@ -36,9 +34,3 @@ export function textEditorTool(config: T): Tool { } } -export interface TextEditor { - name: 'str_replace_based_edit_tool' - type: 'text_editor_20250728' - cache_control?: CacheControl | null - max_characters?: number | null -} diff --git a/packages/typescript/ai-client/package.json b/packages/typescript/ai-client/package.json index 1626c0946..aaa6bac23 100644 --- a/packages/typescript/ai-client/package.json +++ b/packages/typescript/ai-client/package.json @@ -45,6 +45,7 @@ "partial-json": "^0.1.7" }, "devDependencies": { + "@vitest/coverage-v8": "4.0.14", "vite": "^7.2.4" } } \ No newline at end of file diff --git a/packages/typescript/ai-client/tests/test-utils.ts b/packages/typescript/ai-client/tests/test-utils.ts index 6bfef05ed..464eed88f 100644 --- a/packages/typescript/ai-client/tests/test-utils.ts +++ b/packages/typescript/ai-client/tests/test-utils.ts @@ -4,7 +4,7 @@ import type { UIMessage } from '../src/types' /** * Options for creating a mock connection adapter */ -export interface MockConnectionAdapterOptions { +interface MockConnectionAdapterOptions { /** * Chunks to yield from the stream */ diff --git a/packages/typescript/ai-devtools/package.json b/packages/typescript/ai-devtools/package.json index 6368355cc..e023d5320 100644 --- a/packages/typescript/ai-devtools/package.json +++ b/packages/typescript/ai-devtools/package.json @@ -53,7 +53,9 @@ "solid-js": "^1.9.10" }, "devDependencies": { + "@vitest/coverage-v8": "4.0.14", + "jsdom": "^27.2.0", "vite": "^7.2.4", "vite-plugin-solid": "^2.11.10" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-devtools/src/components/conversation/index.ts b/packages/typescript/ai-devtools/src/components/conversation/index.ts index a78156fe0..e8d528051 100644 --- a/packages/typescript/ai-devtools/src/components/conversation/index.ts +++ b/packages/typescript/ai-devtools/src/components/conversation/index.ts @@ -1,10 +1,5 @@ export { ConversationHeader } from './ConversationHeader' export { ConversationTabs } from './ConversationTabs' -export { MessageCard } from './MessageCard' -export { ToolCallDisplay } from './ToolCallDisplay' -export { ChunkBadges } from './ChunkBadges' -export { ChunkItem } from './ChunkItem' -export { ChunksCollapsible } from './ChunksCollapsible' -export { MessageGroup } from './MessageGroup' + export { MessagesTab } from './MessagesTab' export { ChunksTab } from './ChunksTab' diff --git a/packages/typescript/ai-devtools/src/store/ai-context.tsx b/packages/typescript/ai-devtools/src/store/ai-context.tsx index 543a9f307..30f84d822 100644 --- a/packages/typescript/ai-devtools/src/store/ai-context.tsx +++ b/packages/typescript/ai-devtools/src/store/ai-context.tsx @@ -3,7 +3,7 @@ import { createStore, produce } from 'solid-js/store' import { aiEventClient } from '@tanstack/ai/event-client' import type { ParentComponent } from 'solid-js' -export interface MessagePart { +interface MessagePart { type: 'text' | 'tool-call' | 'tool-result' content?: string toolCallId?: string @@ -24,7 +24,7 @@ export interface ToolCall { approvalId?: string } -export interface TokenUsage { +interface TokenUsage { promptTokens: number completionTokens: number totalTokens: number @@ -94,7 +94,7 @@ export interface Conversation { providerOptions?: Record } -export interface AIStoreState { +interface AIStoreState { conversations: Record activeConversationId: string | null } diff --git a/packages/typescript/ai-devtools/src/store/ai-store.ts b/packages/typescript/ai-devtools/src/store/ai-store.ts index 29fdaf9c2..984f95a3e 100644 --- a/packages/typescript/ai-devtools/src/store/ai-store.ts +++ b/packages/typescript/ai-devtools/src/store/ai-store.ts @@ -1,13 +1,8 @@ // Re-export types from ai-context for backward compatibility export type { - MessagePart, ToolCall, - TokenUsage, Message, Chunk, Conversation, - AIStoreState, } from './ai-context' -// Re-export the context and provider for components that need the full store -export { AIProvider, useAIStore } from './ai-context' diff --git a/packages/typescript/ai-gemini/package.json b/packages/typescript/ai-gemini/package.json index 9e4a0afe0..1cb3d648f 100644 --- a/packages/typescript/ai-gemini/package.json +++ b/packages/typescript/ai-gemini/package.json @@ -44,6 +44,7 @@ "@tanstack/ai": "workspace:*" }, "devDependencies": { + "@vitest/coverage-v8": "4.0.14", "vite": "^7.2.4" }, "peerDependencies": { diff --git a/packages/typescript/ai-gemini/src/gemini-adapter.ts b/packages/typescript/ai-gemini/src/gemini-adapter.ts index 794deaa2f..fdd0685f7 100644 --- a/packages/typescript/ai-gemini/src/gemini-adapter.ts +++ b/packages/typescript/ai-gemini/src/gemini-adapter.ts @@ -20,7 +20,6 @@ export interface GeminiAdapterConfig extends AIAdapterConfig { apiKey: string } -export type GeminiModel = (typeof GEMINI_MODELS)[number] /** * Gemini-specific provider options * Based on Google Generative AI SDK diff --git a/packages/typescript/ai-gemini/src/index.ts b/packages/typescript/ai-gemini/src/index.ts index 07d6392c1..80c85152d 100644 --- a/packages/typescript/ai-gemini/src/index.ts +++ b/packages/typescript/ai-gemini/src/index.ts @@ -5,3 +5,4 @@ export type { GeminiStructuredOutputOptions, GeminiThinkingOptions, } from './text/text-provider-options' +export type { GoogleGeminiTool } from "./tools/index"; \ No newline at end of file diff --git a/packages/typescript/ai-gemini/src/model-meta.ts b/packages/typescript/ai-gemini/src/model-meta.ts index 812387c00..56382a7c9 100644 --- a/packages/typescript/ai-gemini/src/model-meta.ts +++ b/packages/typescript/ai-gemini/src/model-meta.ts @@ -768,14 +768,6 @@ const GEMINI_MODEL_META = { [GEMINI_EMBEDDING.name]: GEMINI_EMBEDDING, } as const -export type GeminiModelMetaMap = typeof GEMINI_MODEL_META - -export type GeminiModelProviderOptions< - TModel extends keyof GeminiModelMetaMap, -> = - GeminiModelMetaMap[TModel] extends ModelMeta - ? TProviderOptions - : unknown export const GEMINI_MODELS = [ GEMINI_3_PRO.name, @@ -788,33 +780,33 @@ export const GEMINI_MODELS = [ GEMINI_2_FLASH_LITE.name, ] as const -export const GEMINI_IMAGE_MODELS = [ +/* const GEMINI_IMAGE_MODELS = [ GEMINI_2_5_FLASH_IMAGE.name, GEMINI_2_FLASH_IMAGE.name, IMAGEN_3.name, IMAGEN_4_GENERATE.name, IMAGEN_4_GENERATE_FAST.name, IMAGEN_4_GENERATE_ULTRA.name, -] as const +] as const */ export const GEMINI_EMBEDDING_MODELS = [GEMINI_EMBEDDING.name] as const -export const GEMINI_AUDIO_MODELS = [ +/* const GEMINI_AUDIO_MODELS = [ GEMINI_2_5_PRO_TTS.name, GEMINI_2_5_FLASH_TTS.name, GEMINI_2_5_FLASH_LIVE.name, GEMINI_2_FLASH_LIVE.name, ] as const -export const GEMINI_VIDEO_MODELS = [ + const GEMINI_VIDEO_MODELS = [ VEO_3_1_PREVIEW.name, VEO_3_1_FAST_PREVIEW.name, VEO_3.name, VEO_3_FAST.name, VEO_2.name, -] as const +] as const */ -export type GeminiChatModels = (typeof GEMINI_MODELS)[number] +// export type GeminiChatModels = (typeof GEMINI_MODELS)[number] // Manual type map for per-model provider options export type GeminiChatModelProviderOptionsByName = { diff --git a/packages/typescript/ai-gemini/src/text/text-provider-options.ts b/packages/typescript/ai-gemini/src/text/text-provider-options.ts index 49c6fd1f5..54ff55b92 100644 --- a/packages/typescript/ai-gemini/src/text/text-provider-options.ts +++ b/packages/typescript/ai-gemini/src/text/text-provider-options.ts @@ -1,13 +1,10 @@ import type { - ContentListUnion, MediaResolution, SafetySetting, ThinkingLevel, ToolConfig, } from '@google/genai' -import type { GeminiChatModels } from '../model-meta' import type { Schema } from '../tools/function-declaration-tool' -import type { GoogleGeminiTool } from '../tools' export interface GeminiToolConfigOptions { /** @@ -117,57 +114,57 @@ Caution: A negative penalty will encourage the model to reuse tokens proportiona Valid values are: de-DE, en-AU, en-GB, en-IN, en-US, es-US, fr-FR, hi-IN, pt-BR, ar-XA, es-ES, fr-CA, id-ID, it-IT, ja-JP, tr-TR, vi-VN, bn-IN, gu-IN, kn-IN, ml-IN, mr-IN, ta-IN, te-IN, nl-NL, ko-KR, cmn-CN, pl-PL, ru-RU, and th-TH. */ languageCode?: - | 'de-DE' - | 'en-AU' - | 'en-GB' - | 'en-IN' - | 'en-US' - | 'es-US' - | 'fr-FR' - | 'hi-IN' - | 'pt-BR' - | 'ar-XA' - | 'es-ES' - | 'fr-CA' - | 'id-ID' - | 'it-IT' - | 'ja-JP' - | 'tr-TR' - | 'vi-VN' - | 'bn-IN' - | 'gu-IN' - | 'kn-IN' - | 'ml-IN' - | 'mr-IN' - | 'ta-IN' - | 'te-IN' - | 'nl-NL' - | 'ko-KR' - | 'cmn-CN' - | 'pl-PL' - | 'ru-RU' - | 'th-TH' + | 'de-DE' + | 'en-AU' + | 'en-GB' + | 'en-IN' + | 'en-US' + | 'es-US' + | 'fr-FR' + | 'hi-IN' + | 'pt-BR' + | 'ar-XA' + | 'es-ES' + | 'fr-CA' + | 'id-ID' + | 'it-IT' + | 'ja-JP' + | 'tr-TR' + | 'vi-VN' + | 'bn-IN' + | 'gu-IN' + | 'kn-IN' + | 'ml-IN' + | 'mr-IN' + | 'ta-IN' + | 'te-IN' + | 'nl-NL' + | 'ko-KR' + | 'cmn-CN' + | 'pl-PL' + | 'ru-RU' + | 'th-TH' } /** * Config for image generation. An error will be returned if this field is set for models that don't support these config options. */ imageConfig?: { aspectRatio?: - | '1:1' - | '2:3' - | '3:2' - | '3:4' - | '4:3' - | '9:16' - | '16:9' - | '21:9' + | '1:1' + | '2:3' + | '3:2' + | '3:4' + | '4:3' + | '9:16' + | '16:9' + | '21:9' } /** * If specified, the media resolution specified will be used. */ mediaResolution?: MediaResolution } & GeminiThinkingOptions & - GeminiStructuredOutputOptions + GeminiStructuredOutputOptions } export interface GeminiCachedContentOptions { @@ -247,249 +244,3 @@ export type ExternalTextProviderOptions = GeminiToolConfigOptions & GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions -export interface InternalTextProviderOptions - extends ExternalTextProviderOptions { - // path parameter - model: GeminiChatModels - /** - * Developer set system instruction(s). - */ - systemInstruction?: string - /** - * The content of the current conversation with the model. - -For single-turn queries, this is a single instance. For multi-turn queries like chat, this is a repeated field that contains the conversation history and the latest request. - */ - contents: string | ContentListUnion - /** - * A list of Tools the Model may use to generate the next response. - * A Tool is a piece of code that enables the system to interact with external systems to perform an action, or set of actions, outside of knowledge and scope of the Model. Supported Tools are Function and codeExecution. - */ - tools?: Array - - /** - * Configuration options for model generation and outputs. - */ - generationConfig?: { - /** - * The set of character sequences (up to 5) that will stop output generation. If specified, the API will stop at the first appearance of a stop_sequence. The stop sequence will not be included as part of the response. - */ - stopSequences?: Array - /** - * MIME type of the generated candidate text. Supported MIME types are: text/plain: (default) Text output. application/json: JSON response in the response candidates. text/x.enum: ENUM as a string response in the response candidates. - */ - responseMimeType?: string - /** - * Output schema of the generated candidate text. Schemas must be a subset of the OpenAPI schema and can be objects, primitives or arrays. - -If set, a compatible responseMimeType must also be set. Compatible MIME types: application/json: Schema for JSON response. - */ - responseSchema?: Schema - /** - * Output schema of the generated response. This is an alternative to responseSchema that accepts JSON Schema. - -If set, responseSchema must be omitted, but responseMimeType is required. - -While the full JSON Schema may be sent, not all features are supported. Specifically, only the following properties are supported: - -$id -$defs -$ref -$anchor -type -format -title -description -enum (for strings and numbers) -items -prefixItems -minItems -maxItems -minimum -maximum -anyOf -oneOf (interpreted the same as anyOf) -properties -additionalProperties -required -The non-standard propertyOrdering property may also be set. - -Cyclic references are unrolled to a limited degree and, as such, may only be used within non-required properties. (Nullable properties are not sufficient.) If $ref is set on a sub-schema, no other properties, except for than those starting as a $, may be set. - */ - responseJsonSchema?: Schema - /** - * The requested modalities of the response. Represents the set of modalities that the model can return, and should be expected in the response. This is an exact match to the modalities of the response. - -A model may have multiple combinations of supported modalities. If the requested modalities do not match any of the supported combinations, an error will be returned. - */ - responseModalities?: Array< - 'MODALITY_UNSPECIFIED' | 'TEXT' | 'IMAGE' | 'AUDIO' - > - /** - * Number of generated responses to return. If unset, this will default to 1. Please note that this doesn't work for previous generation models (Gemini 1.0 family) - */ - candidateCount?: number - /** - * The maximum number of tokens to include in a response candidate. - -Note: The default value varies by model, see the Model.output_token_limit attribute of the Model returned from the getModel function. - */ - maxOutputTokens?: number - /** - * Controls the randomness of the output. - -Note: The default value varies by model, see the Model.temperature attribute of the Model returned from the getModel function. - -Values can range from [0.0, 2.0]. - */ - temperature?: number - /** - * The maximum cumulative probability of tokens to consider when sampling. - -The model uses combined Top-k and Top-p (nucleus) sampling. - -Tokens are sorted based on their assigned probabilities so that only the most likely tokens are considered. Top-k sampling directly limits the maximum number of tokens to consider, while Nucleus sampling limits the number of tokens based on the cumulative probability. - -Note: The default value varies by Model and is specified by theModel.top_p attribute returned from the getModel function. An empty topK attribute indicates that the model doesn't apply top-k sampling and doesn't allow setting topK on requests. - */ - topP?: number - /** - * The maximum number of tokens to consider when sampling. - -Gemini models use Top-p (nucleus) sampling or a combination of Top-k and nucleus sampling. Top-k sampling considers the set of topK most probable tokens. Models running with nucleus sampling don't allow topK setting. - -Note: The default value varies by Model and is specified by theModel.top_p attribute returned from the getModel function. An empty topK attribute indicates that the model doesn't apply top-k sampling and doesn't allow setting topK on requests. - */ - topK?: number - /** - * Seed used in decoding. If not set, the request uses a randomly generated seed. - */ - seed?: number - /** - * Presence penalty applied to the next token's logprobs if the token has already been seen in the response. - -This penalty is binary on/off and not dependant on the number of times the token is used (after the first). Use frequencyPenalty for a penalty that increases with each use. - -A positive penalty will discourage the use of tokens that have already been used in the response, increasing the vocabulary. - -A negative penalty will encourage the use of tokens that have already been used in the response, decreasing the vocabulary. - */ - presencePenalty?: number - /** - * Frequency penalty applied to the next token's logprobs, multiplied by the number of times each token has been seen in the respponse so far. - -A positive penalty will discourage the use of tokens that have already been used, proportional to the number of times the token has been used: The more a token is used, the more difficult it is for the model to use that token again increasing the vocabulary of responses. - -Caution: A negative penalty will encourage the model to reuse tokens proportional to the number of times the token has been used. Small negative values will reduce the vocabulary of a response. Larger negative values will cause the model to start repeating a common token until it hits the maxOutputTokens limit. - */ - frequencyPenalty?: number - /** - * If true, export the logprobs results in response. - */ - responseLogprobs?: boolean - - /** - * Only valid if responseLogprobs=True. This sets the number of top logprobs to return at each decoding step in the Candidate.logprobs_result. The number must be in the range of [0, 20]. - */ - logprobs?: number - - /** - * Enables enhanced civic answers. It may not be available for all models. - */ - enableEnhancedCivicAnswers?: boolean - - /** - * The speech generation config. - */ - speechConfig?: { - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: string - } - } - - multiSpeakerVoiceConfig?: { - speakerVoiceConfigs?: Array<{ - speaker: string - voiceConfig: { - prebuiltVoiceConfig: { - voiceName: string - } - } - }> - } - /** - * Language code (in BCP 47 format, e.g. "en-US") for speech synthesis. - -Valid values are: de-DE, en-AU, en-GB, en-IN, en-US, es-US, fr-FR, hi-IN, pt-BR, ar-XA, es-ES, fr-CA, id-ID, it-IT, ja-JP, tr-TR, vi-VN, bn-IN, gu-IN, kn-IN, ml-IN, mr-IN, ta-IN, te-IN, nl-NL, ko-KR, cmn-CN, pl-PL, ru-RU, and th-TH. - */ - languageCode?: - | 'de-DE' - | 'en-AU' - | 'en-GB' - | 'en-IN' - | 'en-US' - | 'es-US' - | 'fr-FR' - | 'hi-IN' - | 'pt-BR' - | 'ar-XA' - | 'es-ES' - | 'fr-CA' - | 'id-ID' - | 'it-IT' - | 'ja-JP' - | 'tr-TR' - | 'vi-VN' - | 'bn-IN' - | 'gu-IN' - | 'kn-IN' - | 'ml-IN' - | 'mr-IN' - | 'ta-IN' - | 'te-IN' - | 'nl-NL' - | 'ko-KR' - | 'cmn-CN' - | 'pl-PL' - | 'ru-RU' - | 'th-TH' - } - /** - * Config for thinking features. An error will be returned if this field is set for models that don't support thinking. - */ - thinkingConfig?: { - /** - * Indicates whether to include thoughts in the response. If true, thoughts are returned only when available. - */ - includeThoughts: boolean - - /** - * The number of thoughts tokens that the model should generate. - */ - thinkingBudget: number - /** - * The level of thoughts tokens that the model should generate. - */ - thinkingLevel?: ThinkingLevel - } - /** - * Config for image generation. An error will be returned if this field is set for models that don't support these config options. - */ - imageConfig?: { - aspectRatio?: - | '1:1' - | '2:3' - | '3:2' - | '3:4' - | '4:3' - | '9:16' - | '16:9' - | '21:9' - } - /** - * If specified, the media resolution specified will be used. - */ - mediaResolution?: MediaResolution - } -} diff --git a/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts b/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts index f7eadd93d..a525829fd 100644 --- a/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts @@ -1,6 +1,6 @@ import type { Tool } from '@tanstack/ai' -export interface CodeExecutionTool {} +export interface CodeExecutionTool { } export function convertCodeExecutionToolToAdapterFormat(_tool: Tool) { return { diff --git a/packages/typescript/ai-gemini/src/tools/file-search-tool.ts b/packages/typescript/ai-gemini/src/tools/file-search-tool.ts index c2dbc0153..f77f5f4cc 100644 --- a/packages/typescript/ai-gemini/src/tools/file-search-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/file-search-tool.ts @@ -1,40 +1,16 @@ import type { Tool } from '@tanstack/ai' +import type { FileSearch } from '@google/genai' -export interface FileSearchTool { - /** - * The names of the fileSearchStores to retrieve from. Example: fileSearchStores/my-file-search-store-123 - */ - fileSearchStoreNames: Array - /** - * Metadata filter to apply to the semantic retrieval documents and chunks. - */ - metadataFilter?: string - /** - * The number of semantic retrieval chunks to retrieve. - */ - topK?: number -} +export type FileSearchTool = FileSearch export function convertFileSearchToolToAdapterFormat(tool: Tool) { - const metadata = tool.metadata as { - fileSearchStoreNames: Array - metadataFilter?: string - topK?: number - } + const metadata = tool.metadata as FileSearchTool return { - fileSearch: { - fileSearchStoreNames: metadata.fileSearchStoreNames, - metadataFilter: metadata.metadataFilter, - topK: metadata.topK, - }, + fileSearch: metadata } } -export function fileSearchTool(config: { - fileSearchStoreNames: Array - metadataFilter?: string - topK?: number -}): Tool { +export function fileSearchTool(config: FileSearchTool): Tool { return { type: 'function', function: { @@ -42,10 +18,6 @@ export function fileSearchTool(config: { description: '', parameters: {}, }, - metadata: { - fileSearchStoreNames: config.fileSearchStoreNames, - metadataFilter: config.metadataFilter, - topK: config.topK, - }, + metadata: config } } diff --git a/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts b/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts index b153f8b26..35cdc3dfc 100644 --- a/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts @@ -1,142 +1,12 @@ -export interface FunctionDeclarationTool { - /** - * The name of the function. Must be a-z, A-Z, 0-9, or contain underscores, colons, dots, and dashes, with a maximum length of 64. - */ - name: string - /** - * A brief description of the function. - */ - description: string - /** - * Defines the function behavior. - * - UNSPECIFIED: This value is unused. - * - BLOCKING: If set, the system will wait to receive the function response before continuing the conversation. - * - NON_BLOCKING: If set, the system will not wait to receive the function response. Instead, it will attempt to handle function responses as they become available while maintaining the conversation between the user and the model. +import type { FunctionDeclaration } from "@google/genai" - */ - behavior?: 'UNSPECIFIED' | 'BLOCKING' | 'NON_BLOCKING' +export type FunctionDeclarationTool = FunctionDeclaration - parameters?: Schema - /** - * JSON Schema representation of the parameters. Mutually exclusive with 'parameters' field. - */ - parametersJsonSchema?: Schema - /** - * Describes the output from this function in JSON Schema format. Reflects the Open API 3.03 Response Object. The Schema defines the type used for the response value of the function. - */ - response?: Schema - /** - * Describes the output from this function in JSON Schema format. The value specified by the schema is the response value of the function. - -This field is mutually exclusive with response. - */ - responseJsonSchema?: Schema -} - -type Value = null | string | number | boolean | object | Array - -export interface Schema { - type: - | 'TYPE_UNSPECIFIED' - | 'OBJECT' - | 'ARRAY' - | 'STRING' - | 'NUMBER' - | 'INTEGER' - | 'BOOLEAN' - | 'NULL' - /** - * The format of the data. Any value is allowed, but most do not trigger any special functionality. - */ - format?: string - /** - * Title of the schema - */ - title?: string - /** - * A brief description of the parameter. This could contain examples of use. Parameter description may be formatted as Markdown. - */ - description?: string - /** - * Indicates if the value may be null. - */ - nullable?: boolean - /** - * Possible values of the element of Type.STRING with enum format. For example we can define an Enum Direction as : {type:STRING, format:enum, enum:["EAST", NORTH", "SOUTH", "WEST"]} - */ - enum?: Array - /** - * Maximum number of the elements for Type.ARRAY. - */ - maxItems?: number - /** - * Minimum number of the elements for Type.ARRAY. - */ - minItems?: number - /** - * An object containing a list of "key": value pairs. Example: { "name": "wrench", "mass": "1.3kg", "count": "3" }. - */ - properties?: Record - /** - * Required properties of Type.OBJECT. - */ - required?: Array - /** - * Minimum number of the properties for Type.OBJECT. - */ - minProperties?: string - /** - * Maximum number of the properties for Type.OBJECT. - */ - maxProperties?: string - /** - * SCHEMA FIELDS FOR TYPE STRING Minimum length of the Type.STRING - */ - minLength?: number - /** - * Maximum length of the Type.STRING - */ - maxLength?: number - /** - * Pattern of the Type.STRING to restrict a string to a regular expression. - */ - pattern?: string - /** - * Example of the object. Will only populated when the object is the root. - */ - example?: Value - /** - * The value should be validated against any (one or more) of the subschemas in the list. - */ - anyOf?: [Schema, ...Array] - - /** - * The order of the properties. Not a standard field in open api spec. Used to determine the order of the properties in the response. - */ - propertyOrdering?: Array - /** - * Default value of the field. Per JSON Schema, this field is intended for documentation generators and doesn't affect validation. Thus it's included here and ignored so that developers who send schemas with a default field don't get unknown-field errors. - */ - default?: Value - /** - * Schema of the elements of Type.ARRAY. - */ - items?: Schema - /** - * SCHEMA FIELDS FOR TYPE INTEGER and NUMBER Minimum value of the Type.INTEGER and Type.NUMBER - */ - minimum?: number - /** - * Maximum value of the Type.INTEGER and Type.NUMBER - */ - maximum?: number -} - -export const validateFunctionDeclarationTool = ( +const validateFunctionDeclarationTool = ( tool: FunctionDeclarationTool, ) => { const nameRegex = /^[a-zA-Z0-9_:.-]{1,64}$/ - const valid = nameRegex.test(tool.name) + const valid = nameRegex.test(tool.name!) if (!valid) { throw new Error( `Invalid function name: ${tool.name}. Must be 1-64 characters long and contain only a-z, A-Z, 0-9, underscores, colons, dots, and dashes.`, @@ -156,9 +26,9 @@ export const validateFunctionDeclarationTool = ( } } -export const functionDeclarationTools = ( +export function functionDeclarationTools( tools: Array, -) => { +) { tools.forEach(validateFunctionDeclarationTool) return { functionDeclarations: tools, diff --git a/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts b/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts index 730786de8..bd70a5423 100644 --- a/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts @@ -1,23 +1,16 @@ +import type { GoogleMaps } from '@google/genai' import type { Tool } from '@tanstack/ai' -export interface GoogleMapsTool { - /** - * Whether to return a widget context token in the GroundingMetadata of the response. Developers can use the widget context token to render a Google Maps widget with geospatial context related to the places that the model references in the response. - */ - enableWidget?: boolean -} +export type GoogleMapsTool = GoogleMaps export function convertGoogleMapsToolToAdapterFormat(tool: Tool) { - const metadata = tool.metadata as { enableWidget?: boolean } + const metadata = tool.metadata as GoogleMapsTool return { - googleMaps: - metadata.enableWidget !== undefined - ? { enableWidget: metadata.enableWidget } - : {}, + googleMaps: metadata } } -export function googleMapsTool(config?: { enableWidget?: boolean }): Tool { +export function googleMapsTool(config?: GoogleMapsTool): Tool { return { type: 'function', function: { @@ -25,8 +18,6 @@ export function googleMapsTool(config?: { enableWidget?: boolean }): Tool { description: '', parameters: {}, }, - metadata: { - enableWidget: config?.enableWidget, - }, + metadata: config } } diff --git a/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts b/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts index 36911465a..be8f3443a 100644 --- a/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts @@ -6,9 +6,7 @@ export type GoogleSearchRetrievalTool = GoogleSearchRetrieval export function convertGoogleSearchRetrievalToolToAdapterFormat(tool: Tool) { const metadata = tool.metadata as GoogleSearchRetrievalTool return { - googleSearchRetrieval: metadata.dynamicRetrievalConfig - ? { dynamicRetrievalConfig: metadata.dynamicRetrievalConfig } - : {}, + googleSearchRetrieval: metadata } } @@ -22,8 +20,6 @@ export function googleSearchRetrievalTool( description: '', parameters: {}, }, - metadata: { - dynamicRetrievalConfig: config?.dynamicRetrievalConfig, - }, + metadata: config } } diff --git a/packages/typescript/ai-gemini/src/tools/google-search-tool.ts b/packages/typescript/ai-gemini/src/tools/google-search-tool.ts index a53b7f13a..65fbef0bd 100644 --- a/packages/typescript/ai-gemini/src/tools/google-search-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-search-tool.ts @@ -1,26 +1,16 @@ +import type { GoogleSearch } from '@google/genai' import type { Tool } from '@tanstack/ai' -export interface GoogleSearchTool { - timeRangeFilter?: { - startTime?: string // ISO 8601 format - endTime?: string // ISO 8601 format - } -} +export type GoogleSearchTool = GoogleSearch export function convertGoogleSearchToolToAdapterFormat(tool: Tool) { - const metadata = tool.metadata as { - timeRangeFilter?: { startTime?: string; endTime?: string } - } + const metadata = tool.metadata as GoogleSearchTool return { - googleSearch: metadata.timeRangeFilter - ? { timeRangeFilter: metadata.timeRangeFilter } - : {}, + googleSearch: metadata } } -export function googleSearchTool(config?: { - timeRangeFilter?: { startTime?: string; endTime?: string } -}): Tool { +export function googleSearchTool(config?: GoogleSearchTool): Tool { return { type: 'function', function: { @@ -28,8 +18,6 @@ export function googleSearchTool(config?: { description: '', parameters: {}, }, - metadata: { - timeRangeFilter: config?.timeRangeFilter, - }, + metadata: config } } diff --git a/packages/typescript/ai-gemini/src/tools/url-context-tool.ts b/packages/typescript/ai-gemini/src/tools/url-context-tool.ts index dc3d69b7f..c71bfa32d 100644 --- a/packages/typescript/ai-gemini/src/tools/url-context-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/url-context-tool.ts @@ -1,6 +1,6 @@ import type { Tool } from '@tanstack/ai' -export interface UrlContextTool {} +export interface UrlContextTool { } export function convertUrlContextToolToAdapterFormat(_tool: Tool) { return { diff --git a/packages/typescript/ai-ollama/package.json b/packages/typescript/ai-ollama/package.json index ee2063d05..9e0f5feb1 100644 --- a/packages/typescript/ai-ollama/package.json +++ b/packages/typescript/ai-ollama/package.json @@ -45,6 +45,7 @@ "ollama": "^0.6.3" }, "devDependencies": { + "@vitest/coverage-v8": "4.0.14", "vite": "^7.2.4" }, "peerDependencies": { diff --git a/packages/typescript/ai-ollama/src/ollama-adapter.ts b/packages/typescript/ai-ollama/src/ollama-adapter.ts index 085938c17..ded5e2766 100644 --- a/packages/typescript/ai-ollama/src/ollama-adapter.ts +++ b/packages/typescript/ai-ollama/src/ollama-adapter.ts @@ -34,14 +34,14 @@ const OLLAMA_EMBEDDING_MODELS = [] as const const OLLAMA_AUDIO_MODELS = [] as const const OLLAMA_VIDEO_MODELS = [] as const -export type OllamaModel = (typeof OLLAMA_MODELS)[number] +// type OllamaModel = (typeof OLLAMA_MODELS)[number] /** * Ollama-specific provider options * Based on Ollama API options * @see https://github.com/ollama/ollama/blob/main/docs/api.md */ -export interface OllamaProviderOptions { +interface OllamaProviderOptions { /** Number of tokens to keep from the prompt */ num_keep?: number /** Number of tokens from context to consider for next token prediction */ diff --git a/packages/typescript/ai-openai/package.json b/packages/typescript/ai-openai/package.json index 22e781cae..92bd05b68 100644 --- a/packages/typescript/ai-openai/package.json +++ b/packages/typescript/ai-openai/package.json @@ -44,6 +44,7 @@ "openai": "^6.9.1" }, "devDependencies": { + "@vitest/coverage-v8": "4.0.14", "vite": "^7.2.4", "zod": "^4.1.13" }, diff --git a/packages/typescript/ai-openai/src/image/image-provider-options.ts b/packages/typescript/ai-openai/src/image/image-provider-options.ts index 54230f16e..e129542f2 100644 --- a/packages/typescript/ai-openai/src/image/image-provider-options.ts +++ b/packages/typescript/ai-openai/src/image/image-provider-options.ts @@ -1,4 +1,5 @@ + interface ImageProviderOptions { /** * A text prompt describing the desired image. The maximum length is 32000 characters for gpt-image-1, 1000 characters for dall-e-2 and 4000 characters for dall-e-3. diff --git a/packages/typescript/ai-openai/src/model-meta.ts b/packages/typescript/ai-openai/src/model-meta.ts index 1adac42df..fc141f09c 100644 --- a/packages/typescript/ai-openai/src/model-meta.ts +++ b/packages/typescript/ai-openai/src/model-meta.ts @@ -1692,15 +1692,15 @@ const OPENAI_VIDEO_MODELS = [SORA2.name, SORA2_PRO.name] as const // const OPENAI_MODERATION_MODELS = [OMNI_MODERATION.name] as const -export type OpenAIChatModel = (typeof OPENAI_CHAT_MODELS)[number] -export type OpenAIImageModel = (typeof OPENAI_IMAGE_MODELS)[number] -export type OpenAIEmbeddingModel = (typeof OPENAI_EMBEDDING_MODELS)[number] -export type OpenAIAudioModel = (typeof OPENAI_AUDIO_MODELS)[number] -export type OpenAIVideoModel = (typeof OPENAI_VIDEO_MODELS)[number] -export type OpenAITranscriptionModel = - (typeof OPENAI_TRANSCRIPTION_MODELS)[number] - -export const OPENAI_MODEL_META = { +// export type OpenAIChatModel = (typeof OPENAI_CHAT_MODELS)[number] +// type OpenAIImageModel = (typeof OPENAI_IMAGE_MODELS)[number] +// export type OpenAIEmbeddingModel = (typeof OPENAI_EMBEDDING_MODELS)[number] +// type OpenAIAudioModel = (typeof OPENAI_AUDIO_MODELS)[number] +// type OpenAIVideoModel = (typeof OPENAI_VIDEO_MODELS)[number] +// type OpenAITranscriptionModel = +// (typeof OPENAI_TRANSCRIPTION_MODELS)[number] + +const OPENAI_MODEL_META = { [GPT5_1.name]: GPT5_1, [GPT5_1_CODEX.name]: GPT5_1_CODEX, [GPT5.name]: GPT5, @@ -1758,7 +1758,6 @@ export const OPENAI_MODEL_META = { [TTS_1_HD.name]: TTS_1_HD, } as const -export type OpenAIModelMetaMap = typeof OPENAI_MODEL_META /** * Type-only map from chat model name to its provider options type. diff --git a/packages/typescript/ai-openai/src/text/text-provider-options.ts b/packages/typescript/ai-openai/src/text/text-provider-options.ts index bc52271f8..d7e9f6c07 100644 --- a/packages/typescript/ai-openai/src/text/text-provider-options.ts +++ b/packages/typescript/ai-openai/src/text/text-provider-options.ts @@ -275,7 +275,7 @@ https://platform.openai.com/docs/api-reference/responses/create#responses_create > } -export const validateConversationAndPreviousResponseId = ( +const validateConversationAndPreviousResponseId = ( options: InternalTextProviderOptions, ) => { if (options.conversation && options.previous_response_id) { @@ -290,7 +290,7 @@ export const validateTextProviderOptions = (options: InternalTextProviderOptions validateConversationAndPreviousResponseId(options) } -export const validateMetadata = (options: InternalTextProviderOptions) => { +const validateMetadata = (options: InternalTextProviderOptions) => { const metadata = options.metadata const tooManyKeys = metadata && Object.keys(metadata).length > 16 if (tooManyKeys) { diff --git a/packages/typescript/ai-openai/src/tools/mcp-tool.ts b/packages/typescript/ai-openai/src/tools/mcp-tool.ts index f4768c7fa..0792a099f 100644 --- a/packages/typescript/ai-openai/src/tools/mcp-tool.ts +++ b/packages/typescript/ai-openai/src/tools/mcp-tool.ts @@ -3,7 +3,7 @@ import type { Tool } from '@tanstack/ai' export type MCPTool = OpenAI.Responses.Tool.Mcp -export const validateMCPtool = (tool: MCPTool) => { +export function validateMCPtool(tool: MCPTool) { if (!tool.server_url && !tool.connector_id) { throw new Error('Either server_url or connector_id must be provided.') } diff --git a/packages/typescript/ai-openai/src/tools/tool-choice.ts b/packages/typescript/ai-openai/src/tools/tool-choice.ts index 6caccabba..b51ba1eca 100644 --- a/packages/typescript/ai-openai/src/tools/tool-choice.ts +++ b/packages/typescript/ai-openai/src/tools/tool-choice.ts @@ -1,27 +1,27 @@ -export interface MCPToolChoice { +interface MCPToolChoice { type: 'mcp' server_label: 'deepwiki' } -export interface FunctionToolChoice { +interface FunctionToolChoice { type: 'function' name: string } -export interface CustomToolChoice { +interface CustomToolChoice { type: 'custom' name: string } -export interface HostedToolChoice { +interface HostedToolChoice { type: - | 'file_search' - | 'web_search_preview' - | 'computer_use_preview' - | 'code_interpreter' - | 'image_generation' - | 'shell' - | 'apply_patch' + | 'file_search' + | 'web_search_preview' + | 'computer_use_preview' + | 'code_interpreter' + | 'image_generation' + | 'shell' + | 'apply_patch' } export type ToolChoice = diff --git a/packages/typescript/ai-react-ui/package.json b/packages/typescript/ai-react-ui/package.json index 2020ea3b1..e4fbce571 100644 --- a/packages/typescript/ai-react-ui/package.json +++ b/packages/typescript/ai-react-ui/package.json @@ -44,9 +44,10 @@ "react-dom": "^18.0.0 || ^19.0.0" }, "devDependencies": { + "@vitest/coverage-v8": "4.0.14", "vite": "^7.2.4" }, "files": [ "dist" ] -} \ No newline at end of file +} diff --git a/packages/typescript/ai-react/package.json b/packages/typescript/ai-react/package.json index c2504229b..9990d965e 100644 --- a/packages/typescript/ai-react/package.json +++ b/packages/typescript/ai-react/package.json @@ -47,6 +47,8 @@ "devDependencies": { "@testing-library/react": "^16.3.0", "@types/react": "^19.2.7", + "@vitest/coverage-v8": "4.0.14", + "jsdom": "^27.2.0", "vite": "^7.2.4" }, "peerDependencies": { @@ -55,4 +57,4 @@ "@types/react": ">=18.0.0", "react": ">=18.0.0" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-react/tests/test-utils.ts b/packages/typescript/ai-react/tests/test-utils.ts index 2c6e0aa43..6765eafe7 100644 --- a/packages/typescript/ai-react/tests/test-utils.ts +++ b/packages/typescript/ai-react/tests/test-utils.ts @@ -3,7 +3,7 @@ export { createMockConnectionAdapter, createTextChunks, createToolCallChunks, - type MockConnectionAdapterOptions, + } from '../../ai-client/tests/test-utils' import { renderHook, type RenderHookResult } from '@testing-library/react' diff --git a/packages/typescript/ai/package.json b/packages/typescript/ai/package.json index fd56454de..03c37233d 100644 --- a/packages/typescript/ai/package.json +++ b/packages/typescript/ai/package.json @@ -50,5 +50,8 @@ ], "dependencies": { "@tanstack/devtools-event-client": "^0.3.5" + }, + "devDependencies": { + "@vitest/coverage-v8": "4.0.14" } -} +} \ No newline at end of file diff --git a/packages/typescript/ai/src/event-client.ts b/packages/typescript/ai/src/event-client.ts index f4561a72f..ac451d0d2 100644 --- a/packages/typescript/ai/src/event-client.ts +++ b/packages/typescript/ai/src/event-client.ts @@ -4,7 +4,7 @@ import { EventClient } from '@tanstack/devtools-event-client' * Tool call states - track the lifecycle of a tool call * Must match @tanstack/ai-client ToolCallState */ -export type ToolCallState = +type ToolCallState = | 'awaiting-input' // Received start but no arguments yet | 'input-streaming' // Partial arguments received | 'input-complete' // All arguments received @@ -15,7 +15,7 @@ export type ToolCallState = * Tool result states - track the lifecycle of a tool result * Must match @tanstack/ai-client ToolResultState */ -export type ToolResultState = +type ToolResultState = | 'streaming' // Placeholder for future streamed output | 'complete' // Result is complete | 'error' // Error occurred diff --git a/packages/typescript/ai/src/tools/tool-calls.ts b/packages/typescript/ai/src/tools/tool-calls.ts index 1753e06e5..a7adad3c5 100644 --- a/packages/typescript/ai/src/tools/tool-calls.ts +++ b/packages/typescript/ai/src/tools/tool-calls.ts @@ -192,7 +192,7 @@ export interface ClientToolRequest { input: any } -export interface ExecuteToolCallsResult { +interface ExecuteToolCallsResult { /** Tool results ready to send to LLM */ results: Array /** Tools that need user approval before execution */ diff --git a/packages/typescript/ai/src/tools/tool-utils.ts b/packages/typescript/ai/src/tools/tool-utils.ts index 695913561..3837a3c99 100644 --- a/packages/typescript/ai/src/tools/tool-utils.ts +++ b/packages/typescript/ai/src/tools/tool-utils.ts @@ -6,14 +6,14 @@ import type { Tool } from '../types' type InferPropertyType = T extends { type: 'string' } ? string : T extends { type: 'number' } - ? number - : T extends { type: 'boolean' } - ? boolean - : T extends { type: 'array' } - ? Array - : T extends { type: 'object' } - ? Record - : any + ? number + : T extends { type: 'boolean' } + ? boolean + : T extends { type: 'array' } + ? Array + : T extends { type: 'object' } + ? Record + : any /** * Infer argument types from parameters schema @@ -24,18 +24,18 @@ type InferArgs< TRequired extends ReadonlyArray | undefined, > = TRequired extends ReadonlyArray - ? { - [K in keyof TProps as K extends TRequired[number] - ? K - : never]: InferPropertyType - } & { - [K in keyof TProps as K extends TRequired[number] - ? never - : K]?: InferPropertyType - } - : { - [K in keyof TProps]?: InferPropertyType - } + ? { + [K in keyof TProps as K extends TRequired[number] + ? K + : never]: InferPropertyType + } & { + [K in keyof TProps as K extends TRequired[number] + ? never + : K]?: InferPropertyType + } + : { + [K in keyof TProps]?: InferPropertyType + } /** * Helper to define a tool with enforced type safety. @@ -86,17 +86,3 @@ export function tool< return config as Tool } -/** - * Type helper to extract tool names from a tools object - */ -export type ToolNames = - T extends Record ? N : never - -/** - * Type helper to extract a specific tool's argument type - */ -export type ToolArgs = T extends { - execute: (args: infer A) => any -} - ? A - : never diff --git a/packages/typescript/ai/vite.config.ts b/packages/typescript/ai/vite.config.ts index e83c13eb9..cb65adf88 100644 --- a/packages/typescript/ai/vite.config.ts +++ b/packages/typescript/ai/vite.config.ts @@ -29,7 +29,7 @@ const config = defineConfig({ export default mergeConfig( config, tanstackViteConfig({ - entry: ['./src/index.ts'], + entry: ['./src/index.ts', "./src/event-client.ts"], srcDir: './src', }), ) diff --git a/packages/typescript/react-ai-devtools/package.json b/packages/typescript/react-ai-devtools/package.json index de5bb13da..f5e406edd 100644 --- a/packages/typescript/react-ai-devtools/package.json +++ b/packages/typescript/react-ai-devtools/package.json @@ -47,6 +47,7 @@ "@tanstack/devtools-utils": "^0.0.8" }, "devDependencies": { + "@vitest/coverage-v8": "4.0.14", "vite": "^7.2.4" }, "peerDependencies": { diff --git a/packages/typescript/solid-ai-devtools/package.json b/packages/typescript/solid-ai-devtools/package.json index 6caeda85c..f0784ba93 100644 --- a/packages/typescript/solid-ai-devtools/package.json +++ b/packages/typescript/solid-ai-devtools/package.json @@ -51,6 +51,7 @@ "@tanstack/devtools-utils": "^0.0.8" }, "devDependencies": { + "@vitest/coverage-v8": "4.0.14", "vite": "^7.2.4", "vite-plugin-solid": "^2.11.10" }, diff --git a/packages/typescript/tests-adapters/src/harness.ts b/packages/typescript/tests-adapters/src/harness.ts index 884faed6f..c194ed509 100644 --- a/packages/typescript/tests-adapters/src/harness.ts +++ b/packages/typescript/tests-adapters/src/harness.ts @@ -5,25 +5,25 @@ import type { Tool } from '@tanstack/ai'; const OUTPUT_DIR = join(process.cwd(), 'output') -export interface ToolCallCapture { +interface ToolCallCapture { id: string name: string arguments: string } -export interface ToolResultCapture { +interface ToolResultCapture { toolCallId: string content: string } -export interface ApprovalCapture { +interface ApprovalCapture { toolCallId: string toolName: string input: any approval: any } -export interface StreamCapture { +interface StreamCapture { phase: string chunks: Array fullResponse: string @@ -44,7 +44,7 @@ export interface AdapterContext { embeddingModel?: string } -export interface DebugEnvelope { +interface DebugEnvelope { adapter: string test: string model: string diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 807f3ad78..31b3636bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,9 +23,6 @@ importers: '@tanstack/config': specifier: 0.22.1 version: 0.22.1(@types/node@24.10.1)(@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(rollup@4.53.3)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@testing-library/jest-dom': - specifier: ^6.9.1 - version: 6.9.1 '@types/node': specifier: ^24.10.1 version: 24.10.1 @@ -235,6 +232,10 @@ importers: '@tanstack/devtools-event-client': specifier: ^0.3.5 version: 0.3.5 + devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/typescript/ai-anthropic: dependencies: @@ -244,6 +245,10 @@ importers: '@tanstack/ai': specifier: workspace:* version: link:../ai + devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) packages/typescript/ai-client: dependencies: @@ -254,6 +259,9 @@ importers: specifier: ^0.1.7 version: 0.1.7 devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -269,9 +277,6 @@ importers: '@tanstack/devtools-utils': specifier: ^0.0.8 version: 0.0.8(@types/react@19.2.7)(csstype@3.2.3)(react@19.2.0)(solid-js@1.9.10) - clsx: - specifier: ^2.1.1 - version: 2.1.1 goober: specifier: ^2.1.18 version: 2.1.18(csstype@3.2.3) @@ -279,6 +284,12 @@ importers: specifier: ^1.9.10 version: 1.9.10 devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + jsdom: + specifier: ^27.2.0 + version: 27.2.0(postcss@8.5.6) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -295,6 +306,9 @@ importers: specifier: workspace:* version: link:../ai devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -308,6 +322,9 @@ importers: specifier: ^0.6.3 version: 0.6.3 devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -321,6 +338,9 @@ importers: specifier: ^6.9.1 version: 6.9.1(ws@8.18.3)(zod@4.1.13) devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -340,24 +360,18 @@ importers: specifier: '>=18.0.0' version: 19.2.0 devDependencies: - '@eslint-react/eslint-plugin': - specifier: ^2.3.9 - version: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@testing-library/react': specifier: ^16.3.0 version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/react': specifier: ^19.2.7 version: 19.2.7 - '@vitejs/plugin-react': - specifier: ^5.1.1 - version: 5.1.1(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - eslint-plugin-react-compiler: - specifier: 19.1.0-rc.2 - version: 19.1.0-rc.2(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-react-hooks: - specifier: ^7.0.1 - version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + jsdom: + specifier: ^27.2.0 + version: 27.2.0(postcss@8.5.6) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -373,9 +387,6 @@ importers: '@types/react': specifier: '>=18.0.0' version: 19.2.7 - highlight.js: - specifier: ^11.11.1 - version: 11.11.1 react: specifier: ^18.0.0 || ^19.0.0 version: 19.2.0 @@ -398,6 +409,9 @@ importers: specifier: ^4.0.1 version: 4.0.1 devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -417,6 +431,9 @@ importers: specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 version: 19.2.0 devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -433,6 +450,9 @@ importers: specifier: '>=1.9.7' version: 1.9.10 devDependencies: + '@vitest/coverage-v8': + specifier: 4.0.14 + version: 4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: ^7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -617,13 +637,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-proposal-private-methods@7.18.6': - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} @@ -686,6 +699,10 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + '@changesets/apply-release-plan@7.0.13': resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} @@ -965,45 +982,6 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@2.3.9': - resolution: {integrity: sha512-/RiruPxlQs6CMLJ8tiNT1jV8Zq4u80MTWYkNFz2PP9pht23bdcpngDKFoz8RQYDPt71dwiRURHiQAF75v8bIIw==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@eslint-react/core@2.3.9': - resolution: {integrity: sha512-pIkrGuQWyW/GgrAp0kC7nv/Jn53Xjs1/rbBqUcUYvEZnVKuUifnlXQtnmioOEj9PYsuWuOxAPijExrnNavm73w==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@eslint-react/eff@2.3.9': - resolution: {integrity: sha512-pkRWIPnH/jedRn5ZMEA0nDPn5BFuUHKOORbR+hfrAMFp4c3o+1/P1G/eB0vSQvAHAZdPwLZXdgxydz+2rbb8nQ==} - engines: {node: '>=20.19.0'} - - '@eslint-react/eslint-plugin@2.3.9': - resolution: {integrity: sha512-wKeXNa0vc8ACmvBoZPnRZ+s/z0KEmMKRxpOfRthcBvd0TPMIprohT/uwBXd8k15/j3CmaYe74pJFVVagJY3U3g==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@eslint-react/shared@2.3.9': - resolution: {integrity: sha512-LVtD76ycDC7D4OFKDQ8jyATTVxz986J+e9nzydyEUtEf1l+WYiOivPBeJUAs6JEySBl24nO76oEHDABw6l4hig==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@eslint-react/var@2.3.9': - resolution: {integrity: sha512-Bc36K8Lw6KV/5NMaEaFS7as4kgSgZ1wElFejgUEBPZnhUVmq2mITV1BsnMoMYM4jojnkMN80WNALyhONjOx9Jw==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@eslint/config-array@0.21.1': resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2307,13 +2285,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.48.0': - resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.3': resolution: {integrity: sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2465,6 +2436,15 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/coverage-v8@4.0.14': + resolution: {integrity: sha512-EYHLqN/BY6b47qHH7gtMxAg++saoGmsjWmAq9MlXxAz4M0NcHh9iOyKhBZyU4yxZqOd8Xnqp80/5saeitz4Cng==} + peerDependencies: + '@vitest/browser': 4.0.14 + vitest: 4.0.14 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/expect@4.0.14': resolution: {integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==} @@ -2658,6 +2638,9 @@ packages: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} + ast-v8-to-istanbul@0.3.8: + resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} + async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -2737,9 +2720,6 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - birecord@0.1.1: - resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3305,53 +3285,6 @@ packages: peerDependencies: eslint: '>=8.23.0' - eslint-plugin-react-compiler@19.1.0-rc.2: - resolution: {integrity: sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} - peerDependencies: - eslint: '>=7' - - eslint-plugin-react-dom@2.3.9: - resolution: {integrity: sha512-xflcmWONib2KN54bJ25AvrYSPrp0qDWwWoG+tZJWD7xe0OcvC42zpERKyMuqTMuXfKPJNUOs2ZB1z6e3HNRviw==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - eslint-plugin-react-hooks-extra@2.3.9: - resolution: {integrity: sha512-ImANssr1gfBNMahqCufe2nhb1CZpqMBjKYgwtYF6u0pV11UXnGj181MW+YBEPEB+qIN4NK3hKxSsQngQJPBfQQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - eslint-plugin-react-hooks@7.0.1: - resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react-naming-convention@2.3.9: - resolution: {integrity: sha512-3cxHcn6oA29awTQr20LCw9XBhms65giuHHclU3KyLtFVoHSX/LUJtXUpv/KezkhRiaavT8PmxGTGMZiGGY9vHw==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - eslint-plugin-react-web-api@2.3.9: - resolution: {integrity: sha512-AlSBt0ITf1nT1I6U4Kyj9GoFEpfLh8sR62sl+6uYSladmhPAKXMOSB7Ban7VX6jZcA7LHp+acKAJCv18fKxaUg==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - eslint-plugin-react-x@2.3.9: - resolution: {integrity: sha512-G0Aqk7oHMVmMNnulpQ2nb/Iq2o9JNkk3WQT70zBVQJYIz6NUrXp/1ujL2+cXb5A8ZapEN53F0pP9ZoQRIzNhsA==} - engines: {node: '>=20.19.0'} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - eslint-plugin-unused-imports@4.3.0: resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} peerDependencies: @@ -3753,12 +3686,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} @@ -3773,6 +3700,9 @@ packages: html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-link-extractor@1.0.5: resolution: {integrity: sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==} @@ -3902,12 +3832,6 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-immutable-type@5.0.1: - resolution: {integrity: sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==} - peerDependencies: - eslint: '*' - typescript: '>=4.7.4' - is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -3991,6 +3915,22 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -4273,6 +4213,10 @@ packages: magicast@0.5.1: resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -5294,9 +5238,6 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - string-ts@2.2.1: - resolution: {integrity: sha512-Q2u0gko67PLLhbte5HmPfdOjNvUKbKQM+mCNQae6jE91DmoFHY6HH9GcdqCeNx87DZ2KKjiFxmA0R/42OneGWw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5496,9 +5437,6 @@ packages: peerDependencies: typescript: '>=4.0.0' - ts-pattern@5.9.0: - resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==} - tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -6011,18 +5949,6 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} - zod-validation-error@3.5.4: - resolution: {integrity: sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.24.4 - - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -6036,7 +5962,8 @@ snapshots: '@acemir/cssom@0.9.24': {} - '@adobe/css-tools@4.4.4': {} + '@adobe/css-tools@4.4.4': + optional: true '@ai-sdk/openai@2.0.73(zod@4.1.13)': dependencies: @@ -6218,14 +6145,6 @@ snapshots: dependencies: '@babel/types': 7.28.5 - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -6306,6 +6225,8 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@1.0.2': {} + '@changesets/apply-release-plan@7.0.13': dependencies: '@changesets/config': 3.1.1 @@ -6594,79 +6515,6 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-react/eff': 2.3.9 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - string-ts: 2.2.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@eslint-react/core@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - birecord: 0.1.1 - eslint: 9.39.1(jiti@2.6.1) - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@eslint-react/eff@2.3.9': {} - - '@eslint-react/eslint-plugin@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react-dom: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-hooks-extra: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-naming-convention: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-web-api: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-x: 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@eslint-react/shared@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-react/eff': 2.3.9 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - ts-pattern: 5.9.0 - typescript: 5.9.3 - zod: 4.1.13 - transitivePeerDependencies: - - supports-color - - '@eslint-react/var@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 @@ -7921,11 +7769,12 @@ snapshots: '@testing-library/jest-dom@6.9.1': dependencies: '@adobe/css-tools': 4.4.4 - aria-query: 5.3.0 + aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 picocolors: 1.1.1 redent: 3.0.0 + optional: true '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: @@ -8076,6 +7925,7 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - supports-color + optional: true '@typescript-eslint/scope-manager@8.46.3': dependencies: @@ -8086,6 +7936,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.48.0 '@typescript-eslint/visitor-keys': 8.48.0 + optional: true '@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)': dependencies: @@ -8094,6 +7945,7 @@ snapshots: '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 + optional: true '@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: @@ -8107,21 +7959,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@8.46.3': {} - '@typescript-eslint/types@8.48.0': {} + '@typescript-eslint/types@8.48.0': + optional: true '@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)': dependencies: @@ -8153,6 +7994,7 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - supports-color + optional: true '@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: @@ -8175,6 +8017,7 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - supports-color + optional: true '@typescript-eslint/visitor-keys@8.46.3': dependencies: @@ -8185,6 +8028,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.48.0 eslint-visitor-keys: 4.2.1 + optional: true '@ungap/structured-clone@1.3.0': {} @@ -8278,6 +8122,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/coverage-v8@4.0.14(vitest@4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.14 + ast-v8-to-istanbul: 0.3.8 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.14(@types/node@24.10.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.2.0(postcss@8.5.6))(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + '@vitest/expect@4.0.14': dependencies: '@standard-schema/spec': 1.0.0 @@ -8491,6 +8352,12 @@ snapshots: dependencies: tslib: 2.8.1 + ast-v8-to-istanbul@0.3.8: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + async-sema@3.1.1: {} async@3.2.6: {} @@ -8560,8 +8427,6 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 - birecord@0.1.1: {} - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -8827,7 +8692,8 @@ snapshots: css-what@6.2.2: {} - css.escape@1.5.1: {} + css.escape@1.5.1: + optional: true cssstyle@5.3.3(postcss@8.5.6): dependencies: @@ -8906,7 +8772,8 @@ snapshots: dom-accessibility-api@0.5.16: {} - dom-accessibility-api@0.6.3: {} + dom-accessibility-api@0.6.3: + optional: true dom-serializer@2.0.0: dependencies: @@ -9104,121 +8971,6 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-react-compiler@19.1.0-rc.2(eslint@9.39.1(jiti@2.6.1)): - dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.5) - eslint: 9.39.1(jiti@2.6.1) - hermes-parser: 0.25.1 - zod: 3.25.76 - zod-validation-error: 3.5.4(zod@3.25.76) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-dom@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - compare-versions: 6.1.1 - eslint: 9.39.1(jiti@2.6.1) - string-ts: 2.2.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-hooks-extra@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - string-ts: 2.2.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)): - dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - eslint: 9.39.1(jiti@2.6.1) - hermes-parser: 0.25.1 - zod: 4.1.13 - zod-validation-error: 4.0.2(zod@4.1.13) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-naming-convention@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - string-ts: 2.2.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-web-api@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - string-ts: 2.2.1 - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-x@2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.9 - '@eslint-react/shared': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.9(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - compare-versions: 6.1.1 - eslint: 9.39.1(jiti@2.6.1) - is-immutable-type: 5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - string-ts: 2.2.1 - ts-api-utils: 2.1.0(typescript@5.9.3) - ts-pattern: 5.9.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1)): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -9722,12 +9474,6 @@ snapshots: he@1.2.0: {} - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - highlight.js@11.11.1: {} hookable@5.5.3: {} @@ -9738,6 +9484,8 @@ snapshots: html-entities@2.3.3: {} + html-escaper@2.0.2: {} + html-link-extractor@1.0.5: dependencies: cheerio: 1.1.2 @@ -9806,7 +9554,8 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@4.0.0: {} + indent-string@4.0.0: + optional: true inherits@2.0.4: {} @@ -9859,16 +9608,6 @@ snapshots: is-hexadecimal@2.0.1: {} - is-immutable-type@5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.9.3) - ts-declaration-location: 1.0.7(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -9929,6 +9668,27 @@ snapshots: isexe@2.0.0: {} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -10225,6 +9985,10 @@ snapshots: '@babel/types': 7.28.5 source-map-js: 1.2.1 + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -10628,7 +10392,8 @@ snapshots: mimic-fn@4.0.0: {} - min-indent@1.0.1: {} + min-indent@1.0.1: + optional: true minimatch@3.0.8: dependencies: @@ -11240,6 +11005,7 @@ snapshots: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 + optional: true redis-errors@1.2.0: {} @@ -11608,8 +11374,6 @@ snapshots: string-argv@0.3.2: {} - string-ts@2.2.1: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -11650,6 +11414,7 @@ snapshots: strip-indent@3.0.0: dependencies: min-indent: 1.0.1 + optional: true strip-json-comments@3.1.1: {} @@ -11809,8 +11574,6 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.3 - ts-pattern@5.9.0: {} - tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -12311,14 +12074,6 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.7.0 - zod-validation-error@3.5.4(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod-validation-error@4.0.2(zod@4.1.13): - dependencies: - zod: 4.1.13 - zod@3.25.76: {} zod@4.1.13: {} From ae5bf02c9f325d62eb3276a623f124822bdd11f7 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 14:29:54 +0100 Subject: [PATCH 10/24] fix additional issues --- .../typescript/ai-anthropic/src/model-meta.ts | 6 +-- .../src/tools/text-editor-tool.ts | 1 - .../typescript/ai-gemini/src/model-meta.ts | 24 ++++----- .../src/text/text-provider-options.ts | 2 +- packages/typescript/ai-ollama/package.json | 3 +- .../typescript/ai-openai/src/model-meta.ts | 52 +++++++++---------- 6 files changed, 43 insertions(+), 45 deletions(-) diff --git a/packages/typescript/ai-anthropic/src/model-meta.ts b/packages/typescript/ai-anthropic/src/model-meta.ts index 08b17bf12..00b005e8a 100644 --- a/packages/typescript/ai-anthropic/src/model-meta.ts +++ b/packages/typescript/ai-anthropic/src/model-meta.ts @@ -305,7 +305,7 @@ const CLAUDE_HAIKU_3 = { AnthropicSamplingOptions > -const ANTHROPIC_MODEL_META = { +/* const ANTHROPIC_MODEL_META = { [CLAUDE_OPUS_4_5.name]: CLAUDE_OPUS_4_5, [CLAUDE_SONNET_4_5.name]: CLAUDE_SONNET_4_5, [CLAUDE_HAIKU_4_5.name]: CLAUDE_HAIKU_4_5, @@ -315,9 +315,7 @@ const ANTHROPIC_MODEL_META = { [CLAUDE_OPUS_4.name]: CLAUDE_OPUS_4, [CLAUDE_HAIKU_3_5.name]: CLAUDE_HAIKU_3_5, [CLAUDE_HAIKU_3.name]: CLAUDE_HAIKU_3, -} as const - -type AnthropicModelMetaMap = typeof ANTHROPIC_MODEL_META +} as const */ /* export type AnthropicModelProviderOptions< TModel extends keyof AnthropicModelMetaMap, diff --git a/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts b/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts index 9db9bf9c4..753a8055d 100644 --- a/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts @@ -3,7 +3,6 @@ import type { ToolTextEditor20250429, ToolTextEditor20250728, } from '@anthropic-ai/sdk/resources/messages' -import type { CacheControl } from '../text/text-provider-options' import type { Tool } from '@tanstack/ai' export type TextEditorTool = diff --git a/packages/typescript/ai-gemini/src/model-meta.ts b/packages/typescript/ai-gemini/src/model-meta.ts index 56382a7c9..7d40303a2 100644 --- a/packages/typescript/ai-gemini/src/model-meta.ts +++ b/packages/typescript/ai-gemini/src/model-meta.ts @@ -121,7 +121,7 @@ const GEMINI_2_5_PRO = { GeminiThinkingOptions > -const GEMINI_2_5_PRO_TTS = { +/* const GEMINI_2_5_PRO_TTS = { name: 'gemini-2.5-pro-preview-tts', max_input_tokens: 8_192, max_output_tokens: 16_384, @@ -144,7 +144,7 @@ const GEMINI_2_5_PRO_TTS = { GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions -> +> */ const GEMINI_2_5_FLASH = { name: 'gemini-2.5-flash', @@ -220,7 +220,7 @@ const GEMINI_2_5_FLASH_PREVIEW = { GeminiStructuredOutputOptions & GeminiThinkingOptions > - +/* const GEMINI_2_5_FLASH_IMAGE = { name: 'gemini-2.5-flash-image', max_input_tokens: 1_048_576, @@ -309,7 +309,7 @@ const GEMINI_2_5_FLASH_TTS = { GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions -> +> */ const GEMINI_2_5_FLASH_LITE = { name: 'gemini-2.5-flash-lite', @@ -418,7 +418,7 @@ const GEMINI_2_FLASH = { GeminiCachedContentOptions & GeminiStructuredOutputOptions > - +/* const GEMINI_2_FLASH_IMAGE = { name: 'gemini-2.0-flash-preview-image-generation', max_input_tokens: 32_768, @@ -447,8 +447,8 @@ const GEMINI_2_FLASH_IMAGE = { GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions -> - +> */ +/* const GEMINI_2_FLASH_LIVE = { name: 'gemini-2.0-flash-live-001', max_input_tokens: 1_048_576, @@ -481,7 +481,7 @@ const GEMINI_2_FLASH_LIVE = { GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions -> +> */ const GEMINI_2_FLASH_LITE = { name: 'gemini-2.0-flash-lite', @@ -514,7 +514,7 @@ const GEMINI_2_FLASH_LITE = { GeminiStructuredOutputOptions > -const IMAGEN_4_GENERATE = { +/* const IMAGEN_4_GENERATE = { name: 'imagen-4.0-generate-001', max_input_tokens: 480, max_output_tokens: 4, @@ -717,7 +717,7 @@ const VEO_2 = { GeminiSafetyOptions & GeminiGenerationConfigOptions & GeminiCachedContentOptions -> +> */ const GEMINI_EMBEDDING = { name: 'gemini-embedding-001', @@ -741,7 +741,7 @@ const GEMINI_EMBEDDING = { GeminiCachedContentOptions > -const GEMINI_MODEL_META = { +/* const GEMINI_MODEL_META = { [GEMINI_3_PRO.name]: GEMINI_3_PRO, [GEMINI_2_5_PRO.name]: GEMINI_2_5_PRO, [GEMINI_2_5_PRO_TTS.name]: GEMINI_2_5_PRO_TTS, @@ -766,7 +766,7 @@ const GEMINI_MODEL_META = { [VEO_3_FAST.name]: VEO_3_FAST, [VEO_2.name]: VEO_2, [GEMINI_EMBEDDING.name]: GEMINI_EMBEDDING, -} as const +} as const */ export const GEMINI_MODELS = [ diff --git a/packages/typescript/ai-gemini/src/text/text-provider-options.ts b/packages/typescript/ai-gemini/src/text/text-provider-options.ts index 54ff55b92..708075c0d 100644 --- a/packages/typescript/ai-gemini/src/text/text-provider-options.ts +++ b/packages/typescript/ai-gemini/src/text/text-provider-options.ts @@ -1,10 +1,10 @@ import type { MediaResolution, SafetySetting, + Schema, ThinkingLevel, ToolConfig, } from '@google/genai' -import type { Schema } from '../tools/function-declaration-tool' export interface GeminiToolConfigOptions { /** diff --git a/packages/typescript/ai-ollama/package.json b/packages/typescript/ai-ollama/package.json index 9e0f5feb1..c00d87fd4 100644 --- a/packages/typescript/ai-ollama/package.json +++ b/packages/typescript/ai-ollama/package.json @@ -23,7 +23,8 @@ "src" ], "scripts": { - "build": "vite build", + "build": "exit 0", + "vite": "vite build", "clean": "premove ./build ./dist", "lint:fix": "eslint ./src --fix", "test:build": "publint --strict", diff --git a/packages/typescript/ai-openai/src/model-meta.ts b/packages/typescript/ai-openai/src/model-meta.ts index fc141f09c..8e4053242 100644 --- a/packages/typescript/ai-openai/src/model-meta.ts +++ b/packages/typescript/ai-openai/src/model-meta.ts @@ -297,7 +297,7 @@ const GPT5_CODEX = { OpenAIMetadataOptions > -const SORA2 = { +/* const SORA2 = { name: 'sora-2', pricing: { input: { @@ -383,7 +383,7 @@ const GPT_IMAGE_1_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions -> +> */ const O3_DEEP_RESEARCH = { name: 'o3-deep-research', @@ -494,7 +494,7 @@ const GPT_AUDIO = { OpenAIMetadataOptions > -const GPT_REALTIME = { +/* const GPT_REALTIME = { name: 'gpt-realtime', context_window: 32_000, max_output_tokens: 4_096, @@ -548,7 +548,7 @@ const GPT_REALTIME_MINI = { OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions -> +> */ const GPT_AUDIO_MINI = { name: 'gpt-audio-mini', @@ -922,7 +922,7 @@ const GPT_4O_MINI_AUDIO = { OpenAIMetadataOptions > -const GPT_4O_MINI_REALTIME = { +/* const GPT_4O_MINI_REALTIME = { name: 'gpt-4o-mini-realtime', context_window: 16_000, max_output_tokens: 4_096, @@ -949,7 +949,7 @@ const GPT_4O_MINI_REALTIME = { OpenAIStreamingOptions & OpenAIMetadataOptions > - + */ const O1 = { name: 'o1', context_window: 200_000, @@ -979,7 +979,7 @@ const O1 = { OpenAIMetadataOptions > -const OMNI_MODERATION = { +/* const OMNI_MODERATION = { name: 'omni-moderation', pricing: { input: { @@ -997,7 +997,7 @@ const OMNI_MODERATION = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions -> +> */ const GPT_4O = { name: 'gpt-4o', @@ -1108,7 +1108,7 @@ const GPT_40_MINI = { OpenAIMetadataOptions > -const GPT__4O_REALTIME = { +/* const GPT__4O_REALTIME = { name: 'gpt-4o-realtime', context_window: 32_000, max_output_tokens: 4_096, @@ -1134,7 +1134,7 @@ const GPT__4O_REALTIME = { OpenAIToolsOptions & OpenAIStreamingOptions & OpenAIMetadataOptions -> +> */ const GPT_4_TURBO = { name: 'gpt-4-turbo', @@ -1242,7 +1242,7 @@ const CODEX_MINI_LATEST = { OpenAIStreamingOptions & OpenAIMetadataOptions > - +/* const DALL_E_2 = { name: 'dall-e-2', pricing: { @@ -1283,7 +1283,7 @@ const DALL_E_3 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions -> +> */ const GPT_3_5_TURBO = { name: 'gpt-3.5-turbo', @@ -1336,7 +1336,7 @@ const GPT_4 = { } as const satisfies ModelMeta< OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions > - +/* const GPT_4O_MINI_TRANSCRIBE = { name: 'gpt-4o-mini-transcribe', context_window: 16_000, @@ -1404,8 +1404,8 @@ const GPT_4O_TRANSCRIBE = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions -> - +> */ +/* const GPT_4O_TRANSCRIBE_DIARIZE = { name: 'gpt-4o-transcribe-diarize', context_window: 16_000, @@ -1428,7 +1428,7 @@ const GPT_4O_TRANSCRIBE_DIARIZE = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions -> +> */ const GPT_5_1_CHAT = { name: 'gpt-5.1-chat', @@ -1558,7 +1558,7 @@ const TEXT_EMBEDDING_3_ADA_002 = { OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions > -const TTS_1 = { +/* const TTS_1 = { name: 'tts-1', pricing: { // todo figure out pricing @@ -1598,7 +1598,7 @@ const TTS_1_HD = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & OpenAIStreamingOptions & OpenAIMetadataOptions -> +> */ // Chat/text completion models (based on endpoints: "chat" or "chat-completions") export const OPENAI_CHAT_MODELS = [ @@ -1649,12 +1649,12 @@ export const OPENAI_CHAT_MODELS = [ ] as const // Image generation models (based on endpoints: "image-generation" or "image-edit") -const OPENAI_IMAGE_MODELS = [ +/* const OPENAI_IMAGE_MODELS = [ GPT_IMAGE_1.name, GPT_IMAGE_1_MINI.name, DALL_E_3.name, DALL_E_2.name, -] as const +] as const */ // Embedding models (based on endpoints: "embedding") export const OPENAI_EMBEDDING_MODELS = [ @@ -1664,7 +1664,7 @@ export const OPENAI_EMBEDDING_MODELS = [ ] as const // Audio models (based on endpoints: "transcription", "speech_generation", or "realtime") -const OPENAI_AUDIO_MODELS = [ +/* const OPENAI_AUDIO_MODELS = [ // Transcription models GPT_4O_TRANSCRIBE.name, GPT_4O_TRANSCRIBE_DIARIZE.name, @@ -1678,10 +1678,10 @@ const OPENAI_AUDIO_MODELS = [ GPT_4O_MINI_TTS.name, TTS_1.name, TTS_1_HD.name, -] as const +] as const */ // Transcription-only models (based on endpoints: "transcription") -const OPENAI_TRANSCRIPTION_MODELS = [ +/* const OPENAI_TRANSCRIPTION_MODELS = [ GPT_4O_TRANSCRIBE.name, GPT_4O_TRANSCRIBE_DIARIZE.name, GPT_4O_MINI_TRANSCRIBE.name, @@ -1689,7 +1689,7 @@ const OPENAI_TRANSCRIPTION_MODELS = [ // Video generation models (based on endpoints: "video") const OPENAI_VIDEO_MODELS = [SORA2.name, SORA2_PRO.name] as const - + */ // const OPENAI_MODERATION_MODELS = [OMNI_MODERATION.name] as const // export type OpenAIChatModel = (typeof OPENAI_CHAT_MODELS)[number] @@ -1700,7 +1700,7 @@ const OPENAI_VIDEO_MODELS = [SORA2.name, SORA2_PRO.name] as const // type OpenAITranscriptionModel = // (typeof OPENAI_TRANSCRIPTION_MODELS)[number] -const OPENAI_MODEL_META = { +/* const OPENAI_MODEL_META = { [GPT5_1.name]: GPT5_1, [GPT5_1_CODEX.name]: GPT5_1_CODEX, [GPT5.name]: GPT5, @@ -1757,7 +1757,7 @@ const OPENAI_MODEL_META = { [TTS_1.name]: TTS_1, [TTS_1_HD.name]: TTS_1_HD, } as const - + */ /** * Type-only map from chat model name to its provider options type. From a66bef309afa2eb00fcccb7d646ffa64c6e33a7b Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 15:22:55 +0100 Subject: [PATCH 11/24] revert openai to use responses api --- examples/ts-chat/package.json | 4 +- examples/ts-chat/src/routes/__root.tsx | 2 + examples/ts-chat/src/routes/api.tanchat.ts | 5 +- examples/ts-chat/vite.config.ts | 3 + .../ai-openai/src/openai-adapter.ts | 1471 ++--------------- .../src/text/text-provider-options.ts | 11 +- .../ai-openai/src/tools/function-tool.ts | 6 +- packages/typescript/ai/src/core/chat.ts | 2 +- pnpm-lock.yaml | 66 +- 9 files changed, 238 insertions(+), 1332 deletions(-) diff --git a/examples/ts-chat/package.json b/examples/ts-chat/package.json index 153ab45a8..dbbbfd2df 100644 --- a/examples/ts-chat/package.json +++ b/examples/ts-chat/package.json @@ -44,6 +44,8 @@ "zod": "^4.1.13" }, "devDependencies": { + "@tanstack/devtools-vite": "^0.3.11", + "@tanstack/react-ai-devtools": "workspace:*", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/node": "^24.10.1", @@ -56,4 +58,4 @@ "vitest": "^4.0.14", "web-vitals": "^5.1.0" } -} +} \ No newline at end of file diff --git a/examples/ts-chat/src/routes/__root.tsx b/examples/ts-chat/src/routes/__root.tsx index a68d0bea9..f7ceb4813 100644 --- a/examples/ts-chat/src/routes/__root.tsx +++ b/examples/ts-chat/src/routes/__root.tsx @@ -1,6 +1,7 @@ import { HeadContent, Scripts, createRootRoute } from '@tanstack/react-router' import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools' import { TanStackDevtools } from '@tanstack/react-devtools' +import { aiDevtoolsPlugin } from '@tanstack/react-ai-devtools' import Header from '../components/Header' import appCss from '../styles.css?url' @@ -47,6 +48,7 @@ function RootDocument({ children }: { children: React.ReactNode }) { name: 'Tanstack Router', render: , }, + aiDevtoolsPlugin(), ]} eventBusConfig={{ connectToServerBus: true, diff --git a/examples/ts-chat/src/routes/api.tanchat.ts b/examples/ts-chat/src/routes/api.tanchat.ts index ce09f3044..855a563da 100644 --- a/examples/ts-chat/src/routes/api.tanchat.ts +++ b/examples/ts-chat/src/routes/api.tanchat.ts @@ -1,5 +1,5 @@ import { createFileRoute } from '@tanstack/react-router' -import { chat, toStreamResponse, maxIterations } from '@tanstack/ai' +import { chat, maxIterations, toStreamResponse } from '@tanstack/ai' import { openai } from '@tanstack/ai-openai' // import { ollama } from "@tanstack/ai-ollama"; // import { anthropic } from "@tanstack/ai-anthropic"; @@ -37,7 +37,7 @@ export const Route = createFileRoute('/api/tanchat')({ const requestSignal = request.signal // If request is already aborted, return early - if (requestSignal?.aborted) { + if (requestSignal.aborted) { return new Response(null, { status: 499 }) // 499 = Client Closed Request } @@ -61,6 +61,7 @@ export const Route = createFileRoute('/api/tanchat')({ agentLoopStrategy: maxIterations(20), messages, providerOptions: { + // Enable reasoning for OpenAI (gpt-5, o3 models): // reasoning: { // effort: "medium", // or "low", "high", "minimal", "none" (for gpt-5.1) diff --git a/examples/ts-chat/vite.config.ts b/examples/ts-chat/vite.config.ts index 634654ef0..68b6bb4c7 100644 --- a/examples/ts-chat/vite.config.ts +++ b/examples/ts-chat/vite.config.ts @@ -4,8 +4,11 @@ import viteReact from '@vitejs/plugin-react' import viteTsConfigPaths from 'vite-tsconfig-paths' import tailwindcss from '@tailwindcss/vite' import { nitroV2Plugin } from '@tanstack/nitro-v2-vite-plugin' +import { devtools } from "@tanstack/devtools-vite"; + const config = defineConfig({ plugins: [ + devtools(), nitroV2Plugin(), // this is the plugin that enables path aliases viteTsConfigPaths({ diff --git a/packages/typescript/ai-openai/src/openai-adapter.ts b/packages/typescript/ai-openai/src/openai-adapter.ts index c78d2203e..1c0b194a0 100644 --- a/packages/typescript/ai-openai/src/openai-adapter.ts +++ b/packages/typescript/ai-openai/src/openai-adapter.ts @@ -1,18 +1,15 @@ import OpenAI_SDK from 'openai' import { BaseAdapter } from '@tanstack/ai' -import { OPENAI_CHAT_MODELS, OPENAI_EMBEDDING_MODELS } from './model-meta' -import { convertMessagesToInput } from './text/text-provider-options' +import { OPENAI_CHAT_MODELS, OPENAI_EMBEDDING_MODELS, } from './model-meta' +import { convertMessagesToInput, validateTextProviderOptions } from './text/text-provider-options' import { convertToolsToProviderFormat } from './tools' import type { - ChatCompletionOptions, - ChatCompletionResult, + ChatOptions, EmbeddingOptions, EmbeddingResult, - ModelMessage, StreamChunk, SummarizationOptions, - SummarizationResult, - Tool, + SummarizationResult } from '@tanstack/ai' import type { OpenAIChatModelProviderOptionsByName } from './model-meta' import type { @@ -32,88 +29,19 @@ export interface OpenAIConfig { export type OpenAIProviderOptions = ExternalTextProviderOptions - -/** - * OpenAI-specific provider options for image generation - * Based on OpenAI Images API documentation - * @see https://platform.openai.com/docs/api-reference/images/create - */ -export interface OpenAIImageProviderOptions { - /** Image quality: 'standard' | 'hd' (dall-e-3, gpt-image-1 only) */ - quality?: 'standard' | 'hd' - /** Image style: 'natural' | 'vivid' (dall-e-3 only) */ - style?: 'natural' | 'vivid' - /** Background: 'transparent' | 'opaque' (gpt-image-1 only) */ - background?: 'transparent' | 'opaque' - /** Output format: 'png' | 'webp' | 'jpeg' (gpt-image-1 only) */ - outputFormat?: 'png' | 'webp' | 'jpeg' -} - /** * OpenAI-specific provider options for embeddings * Based on OpenAI Embeddings API documentation * @see https://platform.openai.com/docs/api-reference/embeddings/create */ -export interface OpenAIEmbeddingProviderOptions { +interface OpenAIEmbeddingProviderOptions { /** Encoding format for embeddings: 'float' | 'base64' */ encodingFormat?: 'float' | 'base64' /** Unique identifier for end-user (for abuse monitoring) */ user?: string } -/** - * OpenAI-specific provider options for audio transcription - * Based on OpenAI Audio API documentation - * @see https://platform.openai.com/docs/api-reference/audio/createTranscription - */ -export interface OpenAIAudioTranscriptionProviderOptions { - /** Timestamp granularities: 'word' | 'segment' (whisper-1 only) */ - timestampGranularities?: Array<'word' | 'segment'> - /** Chunking strategy for long audio (gpt-4o-transcribe-diarize): 'auto' or VAD config */ - chunkingStrategy?: - | 'auto' - | { - type: 'vad' - threshold?: number - prefix_padding_ms?: number - silence_duration_ms?: number - } - /** Known speaker names for diarization (gpt-4o-transcribe-diarize) */ - knownSpeakerNames?: Array - /** Known speaker reference audio as data URLs (gpt-4o-transcribe-diarize) */ - knownSpeakerReferences?: Array - /** Whether to enable streaming (gpt-4o-transcribe, gpt-4o-mini-transcribe only) */ - stream?: boolean - /** Include log probabilities (gpt-4o-transcribe, gpt-4o-mini-transcribe only) */ - logprobs?: boolean -} -/** - * OpenAI-specific provider options for text-to-speech - * Based on OpenAI Audio API documentation - * @see https://platform.openai.com/docs/api-reference/audio/createSpeech - */ -export interface OpenAITextToSpeechProviderOptions { - // Currently no OpenAI-specific text-to-speech options beyond the common SDK surface. -} - -/** - * Combined audio provider options (transcription + text-to-speech) - */ -export type OpenAIAudioProviderOptions = - OpenAIAudioTranscriptionProviderOptions & OpenAITextToSpeechProviderOptions - -/** - * OpenAI-specific provider options for video generation - * Based on OpenAI Video API documentation - * @see https://platform.openai.com/docs/guides/video-generation - */ -export interface OpenAIVideoProviderOptions { - /** Input reference image (File, Blob, or Buffer) for first frame */ - inputReference?: File | Blob | Buffer - /** Remix video ID to modify an existing video */ - remixVideoId?: string -} export class OpenAI extends BaseAdapter< typeof OPENAI_CHAT_MODELS, @@ -144,46 +72,41 @@ export class OpenAI extends BaseAdapter< } async *chatStream( - options: ChatCompletionOptions, + options: ChatOptions, ): AsyncIterable { // Track tool call metadata by unique ID // OpenAI streams tool calls with deltas - first chunk has ID/name, subsequent chunks only have args // We assign our own indices as we encounter unique tool call IDs const toolCallMetadata = new Map() + const requestArguments = this.mapChatOptionsToOpenAI(options); - // Use Chat Completions API (standard, well-established API with reliable tool call support) - // instead of Responses API which has issues with argument parsing - const messages = this.convertMessagesToChatCompletionsFormat( - options.messages, - ) - const tools = options.tools - ? this.convertToolsToChatCompletionsFormat([...options.tools]) - : undefined + try { + const response = await this.client.responses.create( + { + ...requestArguments, + stream: true, + }, + { + headers: options.request?.headers, + signal: options.request?.signal, + }, + ) - const response = await this.client.chat.completions.create( - { - model: options.model, - messages, - tools, - tool_choice: options.options?.toolChoice, - temperature: options.options?.temperature, - max_tokens: options.options?.maxTokens, - top_p: options.options?.topP, - stream: true, - }, - { - headers: options.request?.headers, - signal: options.request?.signal, - }, - ) + // Chat Completions API uses SSE format - iterate directly + yield* this.processOpenAIStreamChunks( + response, + toolCallMetadata, + options, + () => this.generateId(), + ) + } catch (error: any) { + console.error('>>> chatStream: Fatal error during response creation <<<') + console.error('>>> Error message:', error?.message) + console.error('>>> Error stack:', error?.stack) + console.error('>>> Full error:', error) + throw error + } - // Chat Completions API uses SSE format - iterate directly - yield* this.processChatCompletionsStream( - response, - toolCallMetadata, - options, - () => this.generateId(), - ) } async summarize(options: SummarizationOptions): Promise { @@ -258,1214 +181,179 @@ export class OpenAI extends BaseAdapter< return prompt } - private mapOpenAIResponseToChatResult( - response: OpenAI_SDK.Responses.Response, - ): ChatCompletionResult { - // response.output is an array of output items - const outputItems = response.output - - // Find the message output item - const messageItem = outputItems.find((item) => item.type === 'message') - const content = - messageItem?.content[0]?.type === 'output_text' - ? messageItem.content[0].text || '' - : '' - - // Find function call items - const functionCalls = outputItems.filter( - (item) => item.type === 'function_call', - ) - const toolCalls = - functionCalls.length > 0 - ? functionCalls.map((fc) => ({ - id: fc.call_id, - type: 'function' as const, - function: { - name: fc.name, - arguments: JSON.stringify(fc.arguments), - }, - })) - : undefined - - return { - id: response.id, - model: response.model, - content, - role: 'assistant', - finishReason: messageItem?.status, - toolCalls, - usage: { - promptTokens: response.usage?.input_tokens || 0, - completionTokens: response.usage?.output_tokens || 0, - totalTokens: response.usage?.total_tokens || 0, - }, - } - } - - /** - * Convert tools to Chat Completions API format - */ - private convertToolsToChatCompletionsFormat( - tools: Array, - ): Array { - return tools.map((tool) => { - // Chat Completions API uses simpler format: { type: "function", function: { name, description, parameters } } - return { - type: 'function' as const, - function: { - name: tool.function.name, - description: tool.function.description || '', - parameters: tool.function.parameters, - }, - } - }) - } - - /** - * Convert messages to Chat Completions API format - */ - private convertMessagesToChatCompletionsFormat( - messages: Array, - ): Array { - const result: Array = - [] - - for (const message of messages) { - // Handle tool messages - convert to tool role - if (message.role === 'tool') { - result.push({ - role: 'tool', - tool_call_id: message.toolCallId || '', - content: - typeof message.content === 'string' - ? message.content - : JSON.stringify(message.content), - }) - continue - } - - // Handle assistant messages with tool calls - if (message.role === 'assistant') { - const assistantMsg: OpenAI_SDK.Chat.Completions.ChatCompletionAssistantMessageParam = - { - role: 'assistant', - content: message.content || null, - } - - if (message.toolCalls && message.toolCalls.length > 0) { - assistantMsg.tool_calls = message.toolCalls.map((tc) => ({ - id: tc.id, - type: 'function', - function: { - name: tc.function.name, - arguments: - typeof tc.function.arguments === 'string' - ? tc.function.arguments - : JSON.stringify(tc.function.arguments), - }, - })) - } - - result.push(assistantMsg) - continue - } - - // Handle user and system messages - if (message.role === 'user') { - result.push({ - role: 'user', - content: - typeof message.content === 'string' - ? message.content - : JSON.stringify(message.content), - }) - } - if (message.role === 'system') { - result.push({ - role: 'system', - content: - typeof message.content === 'string' - ? message.content - : JSON.stringify(message.content), - }) - } - } - - return result - } - - /** - * Process Chat Completions API stream (SSE format) - * This is the standard, well-established API with reliable tool call support - */ - private async *processChatCompletionsStream( - stream: AsyncIterable, - toolCallMetadata: Map, - options: ChatCompletionOptions, - generateId: () => string, - ): AsyncIterable { - let accumulatedContent = '' - const timestamp = Date.now() - let nextIndex = 0 - - // Track accumulated function call arguments by call_id - const accumulatedFunctionCallArguments = new Map() - - let responseId: string | null = null - let model: string | null = null - - try { - for await (const chunk of stream) { - // Preserve response metadata - if (chunk.id) responseId = chunk.id - if (chunk.model) model = chunk.model - - const choice = chunk.choices[0] - if (!choice) continue - - const delta = choice.delta - const finishReason = choice.finish_reason - - // Handle content delta - if (delta.content) { - accumulatedContent += delta.content - yield { - type: 'content' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - delta: delta.content, - content: accumulatedContent, - role: 'assistant' as const, - } - } - - // Handle tool calls - if (delta.tool_calls) { - for (const toolCall of delta.tool_calls) { - let toolCallId: string - let toolCallName: string - let toolCallArgs: string - let actualIndex: number - - if (toolCall.id) { - // First chunk with ID and name - toolCallId = toolCall.id - toolCallName = toolCall.function?.name || '' - toolCallArgs = toolCall.function?.arguments || '' - - // Track for index assignment - if (!toolCallMetadata.has(toolCallId)) { - toolCallMetadata.set(toolCallId, { - index: nextIndex++, - name: toolCallName, - }) - accumulatedFunctionCallArguments.set(toolCallId, '') - } - const meta = toolCallMetadata.get(toolCallId)! - actualIndex = meta.index - - // Track the delta for this chunk - if (toolCallArgs) { - const current = - accumulatedFunctionCallArguments.get(toolCallId) || '' - accumulatedFunctionCallArguments.set( - toolCallId, - current + toolCallArgs, - ) - } - } else { - // Delta chunk - find by index - const openAIIndex = - typeof toolCall.index === 'number' ? toolCall.index : 0 - const entry = Array.from(toolCallMetadata.entries())[openAIIndex] - if (entry) { - const [id, meta] = entry - toolCallId = id - toolCallName = meta.name - actualIndex = meta.index - toolCallArgs = toolCall.function?.arguments || '' - - // Track the delta - if (toolCallArgs) { - const current = - accumulatedFunctionCallArguments.get(toolCallId) || '' - accumulatedFunctionCallArguments.set( - toolCallId, - current + toolCallArgs, - ) - } - } else { - // Fallback - toolCallId = `call_${Date.now()}` - toolCallName = '' - actualIndex = openAIIndex - toolCallArgs = '' - } - } - - // Emit the tool call chunk - // For chunks with ID (first chunk), always emit to register the tool call - // For delta chunks, only emit if there are arguments to add - // The ToolCallManager will accumulate the argument deltas for us - if (toolCall.id || toolCallArgs) { - yield { - type: 'tool_call', - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - toolCall: { - id: toolCallId, - type: 'function', - function: { - name: toolCallName, - arguments: toolCallArgs, // Only the delta, not accumulated - }, - }, - index: actualIndex, - } - } - } - } - - // Handle completion - if (finishReason) { - yield { - type: 'done' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - finishReason: finishReason as any, - usage: chunk.usage - ? { - promptTokens: chunk.usage.prompt_tokens || 0, - completionTokens: chunk.usage.completion_tokens || 0, - totalTokens: chunk.usage.total_tokens || 0, - } - : undefined, - } - } - } - } catch (error: any) { - yield { - type: 'error', - id: generateId(), - model: options.model || 'gpt-3.5-turbo', - timestamp, - error: { - message: error.message || 'Unknown error occurred', - code: error.code, - }, - } - } - } - - /** - * Parse Responses API stream - it's JSON lines (not SSE format) - * Each line is a complete JSON object - */ - private async *parseResponsesStream( - stream: ReadableStream, - ): AsyncIterable { - const reader = stream.getReader() - const decoder = new TextDecoder() - let buffer = '' - let parsedCount = 0 - - try { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - while (true) { - const { done, value } = await reader.read() - if (done) break - - // Decode the chunk and add to buffer - buffer += decoder.decode(value, { stream: true }) - - // Process complete lines (newline-separated JSON objects) - const lines = buffer.split('\n') - buffer = lines.pop() || '' // Keep incomplete line in buffer - - for (const line of lines) { - const trimmed = line.trim() - if (!trimmed) continue - - try { - const parsed = JSON.parse(trimmed) - parsedCount++ - // Debug: Log reasoning-related events at the parser level - if ( - parsed.type && - (parsed.type.includes('reasoning') || - parsed.type.includes('reasoning_text')) - ) { - console.log( - '[OpenAI Adapter] Parser: Reasoning event detected:', - { - type: parsed.type, - hasDelta: !!parsed.delta, - hasItem: !!parsed.item, - hasPart: !!parsed.part, - fullEvent: JSON.stringify(parsed).substring(0, 500), - }, - ) - } - - yield parsed - } catch (e) { - // Skip malformed JSON lines - console.log( - '[OpenAI Adapter] Parser: Failed to parse line:', - trimmed.substring(0, 200), - ) - } - } - } - - // Process any remaining buffer - if (buffer.trim()) { - try { - const parsed = JSON.parse(buffer.trim()) - parsedCount++ - yield parsed - } catch (e) { - // Ignore parse errors for final buffer - } - } - } finally { - reader.releaseLock() - } - } - - // TODO proper type is AsyncIterable private async *processOpenAIStreamChunks( - stream: AsyncIterable, + stream: AsyncIterable, toolCallMetadata: Map, - options: ChatCompletionOptions, + options: ChatOptions, generateId: () => string, ): AsyncIterable { let accumulatedContent = '' let accumulatedReasoning = '' const timestamp = Date.now() - let nextIndex = 0 + // let nextIndex = 0 let chunkCount = 0 // Track accumulated function call arguments by call_id const accumulatedFunctionCallArguments = new Map() // Map item_id (from delta events) to call_id (from function_call items) - const itemIdToCallId = new Map() + // const itemIdToCallId = new Map() // Preserve response metadata across events let responseId: string | null = null - let model: string | null = null - let doneChunkEmitted = false + let model: string = options.model + const eventTypeCounts = new Map() // Track which item indices are reasoning items - const reasoningItemIndices = new Set() + // const reasoningItemIndices = new Set() try { for await (const chunk of stream) { + console.log(chunk) chunkCount++ - - // Track event types for debugging - if (chunk.type) { - const count = eventTypeCounts.get(chunk.type) || 0 - eventTypeCounts.set(chunk.type, count + 1) - - // Log first occurrence of each event type - if (count === 0) { - console.log('[OpenAI Adapter] New event type detected:', chunk.type) - } - } - - // Responses API uses event-based streaming with types like: - // - response.created - // - response.in_progress - // - response.output_item.added - // - response.output_text.delta - // - response.function_call_arguments.delta - // - response.function_call_arguments.done - // - response.done - - let delta: any = null - let finishReason: string | null = null - - // Handle Responses API event format - if (chunk.type) { - const eventType = chunk.type - - // Debug: Log all event types to help diagnose reasoning events - if ( - eventType.includes('reasoning') || - eventType.includes('output_reasoning') - ) { - console.log('[OpenAI Adapter] Reasoning-related event detected:', { - eventType, - hasDelta: !!chunk.delta, - deltaType: typeof chunk.delta, - deltaIsArray: Array.isArray(chunk.delta), - hasItem: !!chunk.item, - itemType: chunk.item?.type, - hasPart: !!chunk.part, - partType: chunk.part?.type, - }) - } - - // Debug: Inspect content_part events - reasoning might come through here - if ( - eventType === 'response.content_part.added' || - eventType === 'response.content_part.done' - ) { - console.log('[OpenAI Adapter] Content part event:', { - eventType, - hasPart: !!chunk.part, - partType: chunk.part?.type, - partContentType: chunk.part?.content_type, - hasText: !!chunk.part?.text, - textLength: chunk.part?.text?.length || 0, - hasDelta: !!chunk.delta, - deltaType: typeof chunk.delta, - itemIndex: chunk.item_index, - partIndex: chunk.part_index, - fullPart: JSON.stringify(chunk.part).substring(0, 200), // First 200 chars - }) - } - - // Debug: Inspect ALL output_item.added events - if (eventType === 'response.output_item.added' && chunk.item) { - const item = chunk.item - const itemIndex = chunk.item_index - - // Track reasoning items by index - if (item.type === 'reasoning' && itemIndex !== undefined) { - reasoningItemIndices.add(itemIndex) - console.log( - '[OpenAI Adapter] Reasoning item detected, tracking index:', - itemIndex, - ) - } - - console.log('[OpenAI Adapter] Output item added:', { - itemType: item.type, - itemIndex, - itemId: item.id, - hasContent: !!item.content, - contentIsArray: Array.isArray(item.content), - contentLength: Array.isArray(item.content) - ? item.content.length - : 0, - hasSummary: !!item.summary, - summaryIsArray: Array.isArray(item.summary), - summaryLength: Array.isArray(item.summary) - ? item.summary.length - : 0, - chunkKeys: Object.keys(chunk), - }) - - if (item.type === 'message' && item.content) { - const contentTypes = item.content.map((c: any) => c.type) - console.log( - '[OpenAI Adapter] Output item added (message details):', - { - itemType: item.type, - contentTypes, - hasReasoning: contentTypes.includes('output_reasoning'), - contentDetails: item.content.map((c: any) => ({ - type: c.type, - hasText: !!c.text, - textLength: c.text?.length || 0, - })), - }, - ) - } else if (item.type !== 'message') { - // Log non-message items - maybe reasoning comes as a different item type? - console.log('[OpenAI Adapter] Output item added (non-message):', { - itemType: item.type, - fullItem: JSON.stringify(item).substring(0, 500), // First 500 chars - }) - } - } - - // Extract and preserve response metadata from response.created or response.in_progress - if (chunk.response) { - responseId = chunk.response.id - model = chunk.response.model - } - - // Handle output text deltas (content streaming) - // For response.output_text.delta, chunk.delta is an array of characters/strings - if (eventType === 'response.output_text.delta' && chunk.delta) { - // Delta is an array of characters/strings - join them together - if (Array.isArray(chunk.delta)) { - const textDelta = chunk.delta.join('') - if (textDelta) { - delta = { content: textDelta } - } - } else if (typeof chunk.delta === 'string') { - // Fallback: if it's already a string - delta = { content: chunk.delta } - } - } - - // Handle function call argument deltas - // response.function_call_arguments.delta events contain incremental argument updates - // Note: delta events use item_id, not call_id, and we need to map item_id to call_id - if ( - eventType === 'response.function_call_arguments.delta' && - chunk.delta !== undefined && - chunk.item_id - ) { - // Try to find call_id from item_id by checking if we have the item stored - // The item_id corresponds to the function_call item's id - // We need to maintain a mapping: item_id -> call_id - // For now, we'll use a workaround: check if delta events come after output_item.added - // and use the most recently added function call's call_id - - // Actually, we should track item_id -> call_id when we see output_item.added - // For now, let's use the item_id as a fallback and try to find the call_id - // by checking accumulated items or using a reverse lookup - - // Better approach: track item_id -> call_id mapping when we see output_item.added - const itemId = chunk.item_id - // Find the call_id by looking up the item_id in the output items - // We need to track item_id -> call_id mapping - // For now, we'll look it up from the item if available, or use a reverse lookup - - const callId = itemIdToCallId.get(itemId) - - if (callId) { - const currentArgs = - accumulatedFunctionCallArguments.get(callId) || '' - // Delta is a JSON string fragment - append it to accumulate - let deltaText: string - if (typeof chunk.delta === 'string') { - deltaText = chunk.delta - } else if (Array.isArray(chunk.delta)) { - // Delta might be an array of characters/strings - deltaText = chunk.delta.join('') - } else { - deltaText = JSON.stringify(chunk.delta) - } - - const newArgs = currentArgs + deltaText - accumulatedFunctionCallArguments.set(callId, newArgs) - - // Debug: log delta accumulation for recommendGuitar - if (process.env.DEBUG_TOOL_ARGS) { - const meta = toolCallMetadata.get(callId) - if (meta?.name === 'recommendGuitar') { - console.log( - `[DEBUG] Delta for ${callId}:`, - JSON.stringify(deltaText), - '-> Accumulated:', - newArgs, - ) - } - } - - // Emit updated tool call with accumulated arguments - const meta = toolCallMetadata.get(callId) - if (meta) { - delta = delta || {} - delta.tool_calls = [ - { - id: callId, - function: { - name: meta.name, - arguments: newArgs, - }, - }, - ] - } - } - } - - // Handle function call arguments done (complete arguments) - // response.function_call_arguments.done events contain the final complete arguments - if ( - eventType === 'response.function_call_arguments.done' && - chunk.item_id - ) { - const itemId = chunk.item_id - const callId = itemIdToCallId.get(itemId) - - if (callId) { - // Prefer accumulated arguments from deltas over the done event's arguments - // The done event might have incomplete or empty arguments - let completeArgs: string = - accumulatedFunctionCallArguments.get(callId) || '' - - // If we don't have accumulated args, try the done event's arguments - if (!completeArgs || completeArgs === '') { - if ( - typeof chunk.arguments === 'string' && - chunk.arguments !== '{}' - ) { - completeArgs = chunk.arguments - } else if ( - chunk.arguments && - typeof chunk.arguments === 'object' && - Object.keys(chunk.arguments).length > 0 - ) { - // If it's a non-empty object, stringify it - completeArgs = JSON.stringify(chunk.arguments) - } else { - // Fallback to empty object - completeArgs = '{}' - } - } - - accumulatedFunctionCallArguments.set(callId, completeArgs) - - // Emit final tool call with complete arguments - const meta = toolCallMetadata.get(callId) - if (meta) { - delta = delta || {} - delta.tool_calls = [ - { - id: callId, - function: { - name: meta.name, - arguments: completeArgs, - }, - }, - ] - } + const handleContentPart = (contentPart: OpenAI_SDK.Responses.ResponseOutputText | OpenAI_SDK.Responses.ResponseOutputRefusal | OpenAI_SDK.Responses.ResponseContentPartAddedEvent.ReasoningText): StreamChunk => { + if (contentPart.type === "output_text") { + accumulatedContent += contentPart.text; + return { + type: "content", + id: responseId || generateId(), + model: model || options.model, + timestamp, + delta: contentPart.text, + content: accumulatedContent, + role: "assistant", } } - // Handle reasoning text deltas (reasoning content streaming) - // OpenAI uses response.reasoning_text.delta events for reasoning content - if (eventType === 'response.reasoning_text.delta' && chunk.delta) { - // Delta is an array of characters/strings - join them together - let reasoningDelta = '' - if (Array.isArray(chunk.delta)) { - reasoningDelta = chunk.delta.join('') - } else if (typeof chunk.delta === 'string') { - reasoningDelta = chunk.delta - } - if (reasoningDelta) { - accumulatedReasoning += reasoningDelta - const thinkingChunk: StreamChunk = { - type: 'thinking' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - delta: reasoningDelta, - content: accumulatedReasoning, - } - console.log( - '[OpenAI Adapter] Emitting thinking chunk (reasoning_text.delta):', - { - eventType, - deltaLength: reasoningDelta.length, - accumulatedLength: accumulatedReasoning.length, - chunkType: thinkingChunk.type, - }, - ) - yield thinkingChunk + if (contentPart.type === "reasoning_text") { + accumulatedReasoning += contentPart.text; + return { + type: "thinking", + id: responseId || generateId(), + model: model || options.model, + timestamp, + delta: contentPart.text, + content: accumulatedReasoning, } } - - // Also handle the old format for backwards compatibility - if (eventType === 'response.output_reasoning.delta' && chunk.delta) { - let reasoningDelta = '' - if (Array.isArray(chunk.delta)) { - reasoningDelta = chunk.delta.join('') - } else if (typeof chunk.delta === 'string') { - reasoningDelta = chunk.delta - } - - if (reasoningDelta) { - accumulatedReasoning += reasoningDelta - const thinkingChunk: StreamChunk = { - type: 'thinking' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - delta: reasoningDelta, - content: accumulatedReasoning, - } - console.log( - '[OpenAI Adapter] Emitting thinking chunk (output_reasoning.delta):', - { - eventType, - deltaLength: reasoningDelta.length, - accumulatedLength: accumulatedReasoning.length, - chunkType: thinkingChunk.type, - }, - ) - yield thinkingChunk + return { + type: "error", + id: responseId || generateId(), + model: model || options.model, + timestamp, + error: { + message: contentPart.refusal, } } - // Handle content part events - reasoning might come through content parts - // Note: Content parts can belong to reasoning items (check item_index) - if (eventType === 'response.content_part.added' && chunk.part) { - const part = chunk.part - const itemIndex = chunk.item_index - - // Check if this content part belongs to a reasoning item - const belongsToReasoningItem = - itemIndex !== undefined && reasoningItemIndices.has(itemIndex) - - // Check if this is a reasoning content part - const isReasoningPart = - part.type === 'output_reasoning' || - part.content_type === 'reasoning' || - part.type === 'reasoning_text' || - part.type === 'reasoning' || - belongsToReasoningItem - - if (isReasoningPart) { - const reasoningText = part.text || '' - if (reasoningText) { - accumulatedReasoning += reasoningText - const thinkingChunk: StreamChunk = { - type: 'thinking' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - delta: reasoningText, - content: accumulatedReasoning, - } - console.log( - '[OpenAI Adapter] Emitting thinking chunk (from content_part):', - { - eventType, - partType: part.type, - contentType: part.content_type, - itemIndex, - belongsToReasoningItem, - textLength: reasoningText.length, - accumulatedLength: accumulatedReasoning.length, - }, - ) - yield thinkingChunk - } + } + // handle general response events + if (chunk.type === "response.created" || chunk.type === "response.incomplete" || chunk.type === "response.failed") { + responseId = chunk.response.id; + model = chunk.response.model; + if (chunk.response.error) { + yield { + type: "error", + id: chunk.response.id, + model: chunk.response.model, + timestamp, + error: chunk.response.error, } } + if (chunk.response.incomplete_details) { + yield { + type: "error", + id: chunk.response.id, + model: chunk.response.model, + timestamp, + error: { + message: chunk.response.incomplete_details.reason ?? "", - // Handle output item added (new items like function calls or complete messages) - if (eventType === 'response.output_item.added' && chunk.item) { - const item = chunk.item - if (item.type === 'function_call') { - // Initialize arguments accumulator for this call - const callId = item.call_id - const itemId = item.id // The item's id (used in delta events) - - // Map item_id to call_id for delta event lookups - if (itemId && callId) { - itemIdToCallId.set(itemId, callId) - } - - const initialArgs = item.arguments - ? typeof item.arguments === 'string' - ? item.arguments - : JSON.stringify(item.arguments) - : '' - accumulatedFunctionCallArguments.set(callId, initialArgs) - - // Track metadata immediately so delta/done events can use it - if (!toolCallMetadata.has(callId)) { - toolCallMetadata.set(callId, { - index: nextIndex++, - name: item.name, - }) - } - - delta = delta || {} - delta.tool_calls = [ - { - id: callId, - function: { - name: item.name, - arguments: initialArgs, - }, - }, - ] - } else if (item.type === 'message') { - // Extract content from message item - if (item.content && Array.isArray(item.content)) { - const textContent = item.content.find( - (c: any) => c.type === 'output_text', - ) - if (textContent?.text) { - // For message items added, the text might be incremental or complete - // We'll treat it as a delta and accumulate - const newContent = textContent.text - // If the new content is longer than accumulated, it's likely the full content - // Otherwise, it's a delta - if ( - newContent.length > accumulatedContent.length || - !accumulatedContent - ) { - delta = { content: newContent } - } else { - // It's a delta - extract just the new part - const deltaText = newContent.slice( - accumulatedContent.length, - ) - if (deltaText) { - delta = { content: deltaText } - } - } - } - - // Extract reasoning content from message item - const reasoningContent = item.content.find( - (c: any) => c.type === 'output_reasoning', - ) - if (reasoningContent?.text) { - // Reasoning content comes as complete text in message items - accumulatedReasoning = reasoningContent.text - const thinkingChunk: StreamChunk = { - type: 'thinking' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - content: accumulatedReasoning, - } - console.log( - '[OpenAI Adapter] Emitting thinking chunk (from message item):', - { - eventType: 'response.output_item.added', - contentLength: accumulatedReasoning.length, - chunkType: thinkingChunk.type, - hasDelta: false, - }, - ) - yield thinkingChunk - } - } - // Only set finish reason if status indicates completion (not "in_progress") - if (item.status && item.status !== 'in_progress') { - finishReason = item.status - } + }, } } + } + // handle content_part added events for text, reasoning and refusals + if (chunk.type === "response.content_part.added") { + const contentPart = chunk.part; + yield handleContentPart(contentPart); + } - // Handle output item done - check for both function calls and reasoning items - if (eventType === 'response.output_item.done' && chunk.item) { - const item = chunk.item - - // Handle function call items - check if it has final arguments - if (item.type === 'function_call' && item.call_id) { - const callId = item.call_id - // The item might have the final arguments as a string - if ( - item.arguments && - typeof item.arguments === 'string' && - item.arguments !== '{}' - ) { - const finalArgs = item.arguments - accumulatedFunctionCallArguments.set(callId, finalArgs) - - // Emit final tool call with complete arguments - const meta = toolCallMetadata.get(callId) - if (meta) { - delta = delta || {} - delta.tool_calls = [ - { - id: callId, - function: { - name: meta.name, - arguments: finalArgs, - }, - }, - ] - } - } - } + if (chunk.type === "response.content_part.done") { + const contentPart = chunk.part; - // Handle reasoning items - reasoning content might be available when item completes - if (item.type === 'reasoning') { - // Check if reasoning item has content/text/summary when it's done - console.log('[OpenAI Adapter] Reasoning item done:', { - itemId: item.id, - hasContent: !!item.content, - contentType: typeof item.content, - hasText: !!item.text, - textLength: item.text?.length || 0, - hasSummary: !!item.summary, - summaryType: typeof item.summary, - summaryIsArray: Array.isArray(item.summary), - summaryLength: Array.isArray(item.summary) - ? item.summary.length - : 0, - summaryContent: Array.isArray(item.summary) - ? item.summary - : item.summary, - fullItem: JSON.stringify(item).substring(0, 1000), // More chars to see summary - }) + yield handleContentPart(contentPart); + } - // If reasoning item has text content when done, emit it - if (item.text) { - accumulatedReasoning = item.text - const thinkingChunk: StreamChunk = { - type: 'thinking' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - content: accumulatedReasoning, - } - console.log( - '[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - text):', - { - textLength: item.text.length, - }, - ) - yield thinkingChunk - } - // Check if summary contains reasoning text (summary might be an array of text chunks) - if (Array.isArray(item.summary) && item.summary.length > 0) { - // Summary might be an array of text strings or objects with text/content - const summaryText = item.summary - .map((s: any) => - typeof s === 'string' - ? s - : s?.text || s?.content || JSON.stringify(s), - ) - .join('') - if (summaryText) { - accumulatedReasoning = summaryText - const thinkingChunk: StreamChunk = { - type: 'thinking' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - content: accumulatedReasoning, - } - console.log( - '[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - summary):', - { - summaryLength: summaryText.length, - }, - ) - yield thinkingChunk - } - } else if (typeof item.summary === 'string' && item.summary) { - accumulatedReasoning = item.summary - const thinkingChunk: StreamChunk = { - type: 'thinking' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - content: accumulatedReasoning, - } - console.log( - '[OpenAI Adapter] Emitting thinking chunk (from reasoning item done - summary string):', - { - summaryLength: item.summary.length, - }, - ) - yield thinkingChunk - } - } - } - // Handle response done - if (eventType === 'response.done') { - // If we have tool calls, the finish reason should be "tool_calls" - // Otherwise, it's a normal completion with "stop" - finishReason = toolCallMetadata.size > 0 ? 'tool_calls' : 'stop' - } - } else if (chunk.output && Array.isArray(chunk.output)) { - // Legacy Responses API format with output array - const messageItem = chunk.output.find( - (item: any) => item.type === 'message', - ) - const functionCallItems = chunk.output.filter( - (item: any) => item.type === 'function_call', - ) - if (messageItem?.content) { - const textContent = messageItem.content.find( - (c: any) => c.type === 'output_text', - ) - if (textContent?.text) { - delta = { content: textContent.text } - } - // Extract reasoning content from legacy format - const reasoningContent = messageItem.content.find( - (c: any) => c.type === 'output_reasoning', - ) - if (reasoningContent?.text) { - accumulatedReasoning = reasoningContent.text - const thinkingChunk: StreamChunk = { - type: 'thinking' as const, - id: responseId || chunk.id || generateId(), - model: model || chunk.model || options.model || 'gpt-4o', - timestamp, - content: accumulatedReasoning, - } - console.log( - '[OpenAI Adapter] Emitting thinking chunk (legacy format):', - { - format: 'legacy', - contentLength: accumulatedReasoning.length, - chunkType: thinkingChunk.type, - }, - ) - yield thinkingChunk - } + if (chunk.type === "response.function_call_arguments.done") { + const { name, item_id, output_index, } = chunk + if (!toolCallMetadata.has(item_id)) { + toolCallMetadata.set(item_id, { + index: output_index, + name: name, + }) + accumulatedFunctionCallArguments.set(item_id, '') } - - if (functionCallItems.length > 0) { - delta = delta || {} - delta.tool_calls = functionCallItems.map((fc: any) => ({ - id: fc.call_id, + yield { + type: "tool_call", + id: responseId || generateId(), + model: model || options.model, + timestamp, + index: output_index, + toolCall: { + id: item_id, + type: "function", function: { - name: fc.name, - arguments: JSON.stringify(fc.arguments || {}), + name, + arguments: chunk.arguments, }, - })) - } - - if (messageItem?.status) { - // If we have tool calls, the finish reason should be "tool_calls" - // Otherwise, use the status from the message item - if (toolCallMetadata.size > 0) { - finishReason = 'tool_calls' - } else { - finishReason = messageItem.status } } - } else if (chunk.choices) { - // Chat Completions format (legacy) - delta = chunk.choices?.[0]?.delta - finishReason = chunk.choices?.[0]?.finish_reason } - // Handle content delta - if (delta?.content) { - accumulatedContent += delta.content + if (chunk.type === "response.output_text.done") { yield { - type: 'content' as const, - id: responseId || chunk.id || generateId(), - model: model || chunk.model || options.model || 'gpt-4o', + type: "done", + id: responseId || generateId(), + model: model || options.model, timestamp, - delta: delta.content, - content: accumulatedContent, - role: 'assistant' as const, + finishReason: "stop" } } - // Handle tool calls - if (delta?.tool_calls) { - for (const toolCall of delta.tool_calls) { - // For Responses API, tool calls come as complete items, not deltas - // For Chat Completions, they come as deltas that need tracking - let toolCallId: string - let toolCallName: string - let toolCallArgs: string - let actualIndex: number - - if (toolCall.id) { - // Complete tool call (Responses API format) or first delta (Chat Completions) - toolCallId = toolCall.id - toolCallName = toolCall.function?.name || '' - toolCallArgs = - typeof toolCall.function?.arguments === 'string' - ? toolCall.function.arguments - : JSON.stringify(toolCall.function?.arguments || {}) - // Track for index assignment - if (!toolCallMetadata.has(toolCallId)) { - toolCallMetadata.set(toolCallId, { - index: nextIndex++, - name: toolCallName, - }) - } - const meta = toolCallMetadata.get(toolCallId)! - actualIndex = meta.index - } else { - // Delta chunk (Chat Completions format) - find by index - const openAIIndex = - typeof toolCall.index === 'number' ? toolCall.index : 0 - const entry = Array.from(toolCallMetadata.entries())[openAIIndex] - if (entry) { - const [id, meta] = entry - toolCallId = id - toolCallName = meta.name - actualIndex = meta.index - toolCallArgs = toolCall.function?.arguments || '' - } else { - // Fallback - toolCallId = `call_${Date.now()}` - toolCallName = '' - actualIndex = openAIIndex - toolCallArgs = '' - } - } - - yield { - type: 'tool_call', - id: responseId || chunk.id || generateId(), - model: model || chunk.model || options.model || 'gpt-4o', - timestamp, - toolCall: { - id: toolCallId, - type: 'function', - function: { - name: toolCallName, - arguments: toolCallArgs, - }, - }, - index: actualIndex, - } + if (chunk.type === "response.completed") { + yield { + type: "done", + id: responseId || generateId(), + model: model || options.model, + timestamp, + finishReason: "stop" } } - // Handle completion - only yield "done" for actual completion statuses - if (finishReason && finishReason !== 'in_progress') { - // Get usage from chunk.response.usage (Responses API) or chunk.usage (Chat Completions) - const usage = chunk.response?.usage || chunk.usage + if (chunk.type === "error") { yield { - type: 'done' as const, - id: responseId || chunk.id || generateId(), - model: model || chunk.model || options.model || 'gpt-4o', + type: "error", + id: responseId || generateId(), + model: model || options.model, timestamp, - finishReason: finishReason as any, - usage: usage - ? { - promptTokens: usage.input_tokens || usage.prompt_tokens || 0, - completionTokens: - usage.output_tokens || usage.completion_tokens || 0, - totalTokens: usage.total_tokens || 0, - } - : undefined, + error: { + message: chunk.message, + code: chunk.code ?? undefined + }, } - doneChunkEmitted = true } } - // After stream ends, if we have tool calls but no done chunk was emitted, - // emit a done chunk with tool_calls finish reason - if (toolCallMetadata.size > 0 && !doneChunkEmitted) { - yield { - type: 'done' as const, - id: responseId || generateId(), - model: model || options.model || 'gpt-4o', - timestamp, - finishReason: 'tool_calls' as any, - usage: undefined, - } - } - // Log summary of all event types encountered - console.log('[OpenAI Adapter] Stream completed. Event type summary:', { - totalChunks: chunkCount, - eventTypes: Object.fromEntries(eventTypeCounts), - accumulatedReasoningLength: accumulatedReasoning.length, - accumulatedContentLength: accumulatedContent.length, - hasReasoning: accumulatedReasoning.length > 0, - }) } catch (error: any) { console.log( '[OpenAI Adapter] Stream ended with error. Event type summary:', @@ -1478,7 +366,7 @@ export class OpenAI extends BaseAdapter< yield { type: 'error', id: generateId(), - model: options.model || 'gpt-3.5-turbo', + model: options.model, timestamp, error: { message: error.message || 'Unknown error occurred', @@ -1492,60 +380,45 @@ export class OpenAI extends BaseAdapter< * Maps common options to OpenAI-specific format * Handles translation of normalized options to OpenAI's API format */ - private mapChatOptionsToOpenAI(options: ChatCompletionOptions) { - try { - const providerOptions = options.providerOptions as - | Omit< - InternalTextProviderOptions, - | 'max_output_tokens' - | 'tools' - | 'metadata' - | 'temperature' - | 'input' - | 'top_p' - > - | undefined + private mapChatOptionsToOpenAI(options: ChatOptions) { + + const providerOptions = options.providerOptions as + | Omit< + InternalTextProviderOptions, + | 'max_output_tokens' + | 'tools' + | 'metadata' + | 'temperature' + | 'input' + | 'top_p' + > + | undefined + const input = convertMessagesToInput(options.messages) + if (providerOptions) { + validateTextProviderOptions({ ...providerOptions, input }); + } - const input = convertMessagesToInput(options.messages) + const tools = options.tools + ? convertToolsToProviderFormat(options.tools) + : undefined - const tools = options.tools - ? convertToolsToProviderFormat([...options.tools]) - : undefined + const requestParams: Omit< + OpenAI_SDK.Responses.ResponseCreateParams, + 'stream' + > = { + model: options.model, + temperature: options.options?.temperature, + max_output_tokens: options.options?.maxTokens, + top_p: options.options?.topP, + metadata: options.options?.metadata, + ...providerOptions, + input, + tools, - const requestParams: Omit< - OpenAI_SDK.Responses.ResponseCreateParams, - 'stream' - > = { - model: options.model, - temperature: options.options?.temperature, - max_output_tokens: options.options?.maxTokens, - top_p: options.options?.topP, - metadata: options.options?.metadata, - ...providerOptions, - input, - tools, - } + } - // Debug: Log the reasoning config being sent to OpenAI - console.log('[OpenAI Adapter] Request params (reasoning check):', { - model: requestParams.model, - hasReasoning: !!requestParams.reasoning, - reasoning: requestParams.reasoning, - reasoningEffort: requestParams.reasoning?.effort, - providerOptionsKeys: providerOptions - ? Object.keys(providerOptions) - : [], - fullProviderOptions: providerOptions, - }) + return requestParams - return requestParams - } catch (error: any) { - console.error('>>> mapChatOptionsToOpenAI: Fatal error <<<') - console.error('>>> Error message:', error?.message) - console.error('>>> Error stack:', error?.stack) - console.error('>>> Full error:', error) - throw error - } } } diff --git a/packages/typescript/ai-openai/src/text/text-provider-options.ts b/packages/typescript/ai-openai/src/text/text-provider-options.ts index d7e9f6c07..44ee10ae0 100644 --- a/packages/typescript/ai-openai/src/text/text-provider-options.ts +++ b/packages/typescript/ai-openai/src/text/text-provider-options.ts @@ -354,12 +354,7 @@ export function convertMessagesToInput( result.push({ type: 'message', role: 'assistant', - content: [ - { - type: 'input_text', - text: message.content, - }, - ], + content: message.content }) } @@ -373,7 +368,7 @@ export function convertMessagesToInput( role: 'system', content: [ { - type: 'input_text', + type: "input_text", text: message.content || '', }, ], @@ -387,7 +382,7 @@ export function convertMessagesToInput( role: 'user', content: [ { - type: 'input_text', + type: "input_text", text: message.content || '', }, ], diff --git a/packages/typescript/ai-openai/src/tools/function-tool.ts b/packages/typescript/ai-openai/src/tools/function-tool.ts index bc6f79b9b..307e2cf79 100644 --- a/packages/typescript/ai-openai/src/tools/function-tool.ts +++ b/packages/typescript/ai-openai/src/tools/function-tool.ts @@ -22,7 +22,11 @@ export function convertFunctionToolToAdapterFormat(tool: Tool): FunctionTool { type: 'function', name: tool.function.name, description: tool.function.description, - parameters: tool.function.parameters, + parameters: { + ...tool.function.parameters, + additionalProperties: false, + }, + strict: true } satisfies FunctionTool } diff --git a/packages/typescript/ai/src/core/chat.ts b/packages/typescript/ai/src/core/chat.ts index c6f57ec15..79bcf5855 100644 --- a/packages/typescript/ai/src/core/chat.ts +++ b/packages/typescript/ai/src/core/chat.ts @@ -749,7 +749,7 @@ export async function* chat< >( options: Omit< ChatStreamOptionsUnion, - 'providerOptions' | 'model' + 'providerOptions' | 'model' | 'adapter' > & { adapter: TAdapter model: TModel diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31b3636bc..e0ce2bada 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -183,6 +183,12 @@ importers: specifier: ^4.1.13 version: 4.1.13 devDependencies: + '@tanstack/devtools-vite': + specifier: ^0.3.11 + version: 0.3.11(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/react-ai-devtools': + specifier: workspace:* + version: link:../../packages/typescript/react-ai-devtools '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -627,11 +633,6 @@ packages: resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} @@ -691,10 +692,6 @@ packages: resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} @@ -1933,6 +1930,12 @@ packages: vue: optional: true + '@tanstack/devtools-vite@0.3.11': + resolution: {integrity: sha512-t5jaWJNgkXOQTxuNrwkz71cN86zPZnLJY2Rz0IaMDgjb0ib1EKHeRgdqHMR/2YL96yhCHHDCHroBQXsw5Da4dg==} + engines: {node: '>=18'} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 + '@tanstack/devtools@0.8.2': resolution: {integrity: sha512-ltVS+MpOrA37CiVunSOCcXctaDnQOJV6FPE5Y2uLq3m8b0spmHwp0edp1PRd2CMG4LnGIlRf7lYdhHa2p9CHNA==} engines: {node: '>=18'} @@ -4044,6 +4047,9 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + launch-editor@2.12.0: + resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} + lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -5092,6 +5098,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + sherif-darwin-arm64@1.9.0: resolution: {integrity: sha512-R+RpKSzlqZgBHean04CqHrdlmBBKu6Dhd/9BcdCpjx/KpqsalZsh9LzBVxTWLTtT9IBb/ccr23PNqFzWQTuh6A==} cpu: [arm64] @@ -6137,10 +6147,6 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.5 - '@babel/parser@7.28.4': - dependencies: - '@babel/types': 7.28.5 - '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 @@ -6200,8 +6206,8 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@babel/traverse@7.28.5': dependencies: @@ -6215,11 +6221,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.28.4': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -7363,6 +7364,24 @@ snapshots: transitivePeerDependencies: - csstype + '@tanstack/devtools-vite@0.3.11(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@tanstack/devtools-client': 0.0.4 + '@tanstack/devtools-event-bus': 0.3.3 + chalk: 5.6.2 + launch-editor: 2.12.0 + picomatch: 4.0.3 + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@tanstack/devtools@0.8.2(csstype@3.2.3)(solid-js@1.9.10)': dependencies: '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.10) @@ -9824,6 +9843,11 @@ snapshots: kolorist@1.8.0: {} + launch-editor@2.12.0: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.3 + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -11245,6 +11269,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + sherif-darwin-arm64@1.9.0: optional: true From 37683ea6a66e4f8c3c81ab946ffc6869bebd80d9 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 15:27:45 +0100 Subject: [PATCH 12/24] remove fallback --- CHANGELOG.md | 35 +---------------------------------- package.json | 3 +-- 2 files changed, 2 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d59f104bd..f0ad7ca7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,40 +24,7 @@ npm install @tanstack/ai-client **See:** [Package Documentation](packages/typescript/ai-client/README.md) -#### @tanstack/ai-fallback - -**New Package:** Automatic fallback wrapper for trying multiple adapters in sequence. - -**Installation:** - -```bash -npm install @tanstack/ai-fallback -``` - -**Features:** - -- ✅ Try multiple adapters until one succeeds -- ✅ Rate limit protection -- ✅ Cost optimization (try cheap/local first) -- ✅ Error handling with callbacks -- ✅ Works with all AI methods - -**Usage:** - -```typescript -import { ai } from '@tanstack/ai' -import { fallback, withModel } from '@tanstack/ai-fallback' - -const openAI = withModel(ai(openai()), { model: 'gpt-4' }) -const anthropicAI = withModel(ai(anthropic()), { - model: 'claude-3-5-sonnet-20241022', -}) - -const aiWithFallback = fallback([openAI, anthropicAI]) -``` - -**See:** [Package Documentation](packages/typescript/ai-fallback/README.md) - + #### @tanstack/ai-react-ui **New Package:** Pre-built React UI components for chat interfaces. diff --git a/package.json b/package.json index a7e36f230..f70b1b754 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "clean": "find . -name 'dist' -type d -prune -exec rm -rf {} +", "clean:node_modules": "find . -name 'node_modules' -type d -prune -exec rm -rf {} +", "clean:all": "pnpm run clean && pnpm run clean:node_modules", - "copy:readme": "cp README.md packages/typescript/ai/README.md && cp README.md packages/typescript/ai-devtools/README.md && cp README.md packages/typescript/ai-client/README.md && cp README.md packages/typescript/ai-fallback/README.md && cp README.md packages/typescript/ai-gemini/README.md && cp README.md packages/typescript/ai-ollama/README.md && cp README.md packages/typescript/ai-openai/README.md && cp README.md packages/typescript/ai-react/README.md && cp README.md packages/typescript/ai-react-ui/README.md && cp README.md packages/typescript/react-ai-devtools/README.md && cp README.md packages/typescript/solid-ai-devtools/README.md && cp README.md packages/typescript/tests-adapters/README.md", + "copy:readme": "cp README.md packages/typescript/ai/README.md && cp README.md packages/typescript/ai-devtools/README.md && cp README.md packages/typescript/ai-client/README.md && cp README.md packages/typescript/ai-gemini/README.md && cp README.md packages/typescript/ai-ollama/README.md && cp README.md packages/typescript/ai-openai/README.md && cp README.md packages/typescript/ai-react/README.md && cp README.md packages/typescript/ai-react-ui/README.md && cp README.md packages/typescript/react-ai-devtools/README.md && cp README.md packages/typescript/solid-ai-devtools/README.md && cp README.md packages/typescript/tests-adapters/README.md", "dev": "pnpm run watch", "docs:generate": "node scripts/generateDocs.js && pnpm run copy:readme", "format": "pnpm run prettier:write", @@ -88,7 +88,6 @@ "@tanstack/ai-anthropic": "workspace:*", "@tanstack/ai-client": "workspace:*", "@tanstack/ai-devtools": "workspace:*", - "@tanstack/ai-fallback": "workspace:*", "@tanstack/ai-gemini": "workspace:*", "@tanstack/ai-ollama": "workspace:*", "@tanstack/ai-openai": "workspace:*", From ab1a76ab73d5f1cfeb1c6960974cad3fda584bd0 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 15:30:30 +0100 Subject: [PATCH 13/24] fix --- packages/typescript/ai/tsconfig.docs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/typescript/ai/tsconfig.docs.json b/packages/typescript/ai/tsconfig.docs.json index 2880b4dfa..f547716d6 100644 --- a/packages/typescript/ai/tsconfig.docs.json +++ b/packages/typescript/ai/tsconfig.docs.json @@ -1,4 +1,5 @@ { "extends": "./tsconfig.json", - "include": ["tests", "src"] + "include": ["tests", "src"], + "exclude": [] } From e83f00cb349000308f28648ee5417f93397d1cab Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 15:33:47 +0100 Subject: [PATCH 14/24] fix --- scripts/generateDocs.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/generateDocs.js b/scripts/generateDocs.js index f7488ac94..77358d0d6 100644 --- a/scripts/generateDocs.js +++ b/scripts/generateDocs.js @@ -11,23 +11,23 @@ const __dirname = fileURLToPath(new URL('.', import.meta.url)) const packages = [ { name: 'ai', - entryPoints: [resolve(__dirname, '../packages/ai/src/index.ts')], - tsconfig: resolve(__dirname, '../packages/ai/tsconfig.docs.json'), + entryPoints: [resolve(__dirname, '../packages/typescript/ai/src/index.ts')], + tsconfig: resolve(__dirname, '../packages/typescript/ai/tsconfig.docs.json'), outputDir: resolve(__dirname, '../docs/reference'), }, { name: 'react-ai', - entryPoints: [resolve(__dirname, '../packages/react-ai/src/index.ts')], - tsconfig: resolve(__dirname, '../packages/react-ai/tsconfig.docs.json'), + entryPoints: [resolve(__dirname, '../packages/typescript/react-ai/src/index.ts')], + tsconfig: resolve(__dirname, '../packages/typescript/react-ai/tsconfig.docs.json'), outputDir: resolve(__dirname, '../docs/framework/react/reference'), - exclude: ['packages/ai/**/*'], + exclude: ['packages/typescript/ai/**/*'], }, { name: 'solid-ai', - entryPoints: [resolve(__dirname, '../packages/solid-ai/src/index.ts')], - tsconfig: resolve(__dirname, '../packages/solid-ai/tsconfig.docs.json'), + entryPoints: [resolve(__dirname, '../packages/typescript/solid-ai/src/index.ts')], + tsconfig: resolve(__dirname, '../packages/typescript/solid-ai/tsconfig.docs.json'), outputDir: resolve(__dirname, '../docs/framework/solid/reference'), - exclude: ['packages/ai/**/*'], + exclude: ['packages/typescript/ai/**/*'], }, ] From ec9ab484d4e40a4e06aa686846e434128c7564c1 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Thu, 27 Nov 2025 15:36:02 +0100 Subject: [PATCH 15/24] fix --- scripts/generateDocs.js | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/scripts/generateDocs.js b/scripts/generateDocs.js index 77358d0d6..5c624d1c5 100644 --- a/scripts/generateDocs.js +++ b/scripts/generateDocs.js @@ -15,20 +15,7 @@ const packages = [ tsconfig: resolve(__dirname, '../packages/typescript/ai/tsconfig.docs.json'), outputDir: resolve(__dirname, '../docs/reference'), }, - { - name: 'react-ai', - entryPoints: [resolve(__dirname, '../packages/typescript/react-ai/src/index.ts')], - tsconfig: resolve(__dirname, '../packages/typescript/react-ai/tsconfig.docs.json'), - outputDir: resolve(__dirname, '../docs/framework/react/reference'), - exclude: ['packages/typescript/ai/**/*'], - }, - { - name: 'solid-ai', - entryPoints: [resolve(__dirname, '../packages/typescript/solid-ai/src/index.ts')], - tsconfig: resolve(__dirname, '../packages/typescript/solid-ai/tsconfig.docs.json'), - outputDir: resolve(__dirname, '../docs/framework/solid/reference'), - exclude: ['packages/typescript/ai/**/*'], - }, + ] await generateReferenceDocs({ packages }) From c1e97c887ae491cb1ede4295af607ba76c45c0c5 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 14:37:32 +0000 Subject: [PATCH 16/24] ci: apply automated fixes --- CHANGELOG.md | 1 - docs/reference/classes/BaseAdapter.md | 265 ++++++ docs/reference/classes/ToolCallManager.md | 190 ++++ docs/reference/functions/chat.md | 55 ++ docs/reference/functions/chatOptions.md | 32 + docs/reference/functions/combineStrategies.md | 44 + docs/reference/functions/embedding.md | 30 + docs/reference/functions/maxIterations.md | 40 + docs/reference/functions/summarize.md | 30 + .../functions/toServerSentEventsStream.md | 47 + docs/reference/functions/toStreamResponse.md | 51 ++ docs/reference/functions/tool.md | 108 +++ docs/reference/functions/untilFinishReason.md | 40 + docs/reference/index.md | 62 ++ docs/reference/interfaces/AIAdapter.md | 182 ++++ docs/reference/interfaces/AIAdapterConfig.md | 58 ++ docs/reference/interfaces/AgentLoopState.md | 46 + .../ApprovalRequestedStreamChunk.md | 120 +++ docs/reference/interfaces/BaseStreamChunk.md | 59 ++ .../interfaces/ChatCompletionChunk.md | 86 ++ docs/reference/interfaces/ChatOptions.md | 145 ++++ .../interfaces/ContentStreamChunk.md | 98 +++ docs/reference/interfaces/DoneStreamChunk.md | 106 +++ docs/reference/interfaces/EmbeddingOptions.md | 38 + docs/reference/interfaces/EmbeddingResult.md | 60 ++ docs/reference/interfaces/ErrorStreamChunk.md | 90 ++ docs/reference/interfaces/ModelMessage.md | 58 ++ docs/reference/interfaces/ResponseFormat.md | 151 ++++ .../interfaces/SummarizationOptions.md | 58 ++ .../interfaces/SummarizationResult.md | 66 ++ .../interfaces/ThinkingStreamChunk.md | 88 ++ docs/reference/interfaces/Tool.md | 168 ++++ docs/reference/interfaces/ToolCall.md | 50 ++ .../interfaces/ToolCallStreamChunk.md | 118 +++ docs/reference/interfaces/ToolConfig.md | 14 + .../ToolInputAvailableStreamChunk.md | 98 +++ .../interfaces/ToolResultStreamChunk.md | 88 ++ docs/reference/protocol.md | 415 --------- .../type-aliases/AgentLoopStrategy.md | 35 + .../type-aliases/ChatStreamOptionsUnion.md | 18 + .../type-aliases/ExtractModelsFromAdapter.md | 18 + docs/reference/type-aliases/StreamChunk.md | 22 + .../reference/type-aliases/StreamChunkType.md | 20 + docs/reference/variables/aiEventClient.md | 12 + examples/cli/package.json | 2 +- examples/php-slim/package.json | 2 +- examples/python-fastapi/package.json | 2 +- examples/ts-chat/package.json | 2 +- examples/ts-chat/src/routes/api.tanchat.ts | 1 - examples/ts-chat/vite.config.ts | 2 +- package.json | 2 +- packages/typescript/ai-anthropic/package.json | 2 +- .../ai-anthropic/src/anthropic-adapter.ts | 15 +- .../typescript/ai-anthropic/src/model-meta.ts | 246 +++--- .../src/text/text-provider-options.ts | 27 +- .../ai-anthropic/src/tools/bash-tool.ts | 2 - .../src/tools/code-execution-tool.ts | 1 - .../src/tools/computer-use-tool.ts | 2 - .../src/tools/text-editor-tool.ts | 3 - .../ai-anthropic/src/tools/web-search-tool.ts | 8 +- packages/typescript/ai-client/README.md | 809 +++--------------- packages/typescript/ai-client/package.json | 2 +- .../ai-client/src/message-converters.ts | 28 +- .../ai-client/tests/chat-client-abort.test.ts | 4 +- .../tests/connection-adapters.test.ts | 4 +- .../typescript/ai-client/tests/events.test.ts | 6 +- .../typescript/ai-client/tests/test-utils.ts | 2 +- packages/typescript/ai-devtools/README.md | 104 +++ .../ai-devtools/src/store/ai-store.ts | 8 +- packages/typescript/ai-gemini/README.md | 104 +++ packages/typescript/ai-gemini/package.json | 2 +- .../ai-gemini/src/gemini-adapter.ts | 25 +- packages/typescript/ai-gemini/src/index.ts | 2 +- .../typescript/ai-gemini/src/model-meta.ts | 159 ++-- .../src/text/text-provider-options.ts | 78 +- .../src/tools/code-execution-tool.ts | 2 +- .../ai-gemini/src/tools/file-search-tool.ts | 4 +- .../src/tools/function-declaration-tool.ts | 6 +- .../ai-gemini/src/tools/google-maps-tool.ts | 4 +- .../src/tools/google-search-retriveal-tool.ts | 4 +- .../ai-gemini/src/tools/google-search-tool.ts | 4 +- .../ai-gemini/src/tools/url-context-tool.ts | 2 +- packages/typescript/ai-ollama/README.md | 104 +++ packages/typescript/ai-ollama/package.json | 2 +- packages/typescript/ai-openai/README.md | 104 +++ .../src/audio/audio-provider-options.ts | 24 +- .../src/image/image-provider-options.ts | 2 - .../typescript/ai-openai/src/model-meta.ts | 456 +++++----- .../ai-openai/src/openai-adapter.ts | 129 ++- .../src/text/text-provider-options.ts | 10 +- .../ai-openai/src/tools/function-tool.ts | 2 +- .../ai-openai/src/tools/tool-choice.ts | 14 +- packages/typescript/ai-react-ui/README.md | 386 +++------ packages/typescript/ai-react-ui/src/index.ts | 1 - .../typescript/ai-react-ui/vite.config.ts | 2 +- packages/typescript/ai-react/README.md | 541 +++--------- packages/typescript/ai-react/src/use-chat.ts | 2 +- .../typescript/ai-react/tests/test-utils.ts | 1 - packages/typescript/ai/README.md | 104 +++ packages/typescript/ai/package.json | 2 +- .../typescript/ai/src/tools/tool-utils.ts | 41 +- packages/typescript/ai/tests/ai-chat.test.ts | 2 +- packages/typescript/ai/vite.config.ts | 2 +- .../typescript/react-ai-devtools/README.md | 104 +++ .../typescript/react-ai-devtools/package.json | 2 +- .../react-ai-devtools/vite.config.ts | 2 +- .../typescript/solid-ai-devtools/README.md | 104 +++ .../typescript/solid-ai-devtools/package.json | 2 +- .../solid-ai-devtools/vite.config.ts | 4 +- packages/typescript/tests-adapters/README.md | 179 ++-- .../typescript/tests-adapters/src/harness.ts | 19 +- scripts/generateDocs.js | 6 +- 112 files changed, 4984 insertions(+), 2631 deletions(-) create mode 100644 docs/reference/classes/BaseAdapter.md create mode 100644 docs/reference/classes/ToolCallManager.md create mode 100644 docs/reference/functions/chat.md create mode 100644 docs/reference/functions/chatOptions.md create mode 100644 docs/reference/functions/combineStrategies.md create mode 100644 docs/reference/functions/embedding.md create mode 100644 docs/reference/functions/maxIterations.md create mode 100644 docs/reference/functions/summarize.md create mode 100644 docs/reference/functions/toServerSentEventsStream.md create mode 100644 docs/reference/functions/toStreamResponse.md create mode 100644 docs/reference/functions/tool.md create mode 100644 docs/reference/functions/untilFinishReason.md create mode 100644 docs/reference/index.md create mode 100644 docs/reference/interfaces/AIAdapter.md create mode 100644 docs/reference/interfaces/AIAdapterConfig.md create mode 100644 docs/reference/interfaces/AgentLoopState.md create mode 100644 docs/reference/interfaces/ApprovalRequestedStreamChunk.md create mode 100644 docs/reference/interfaces/BaseStreamChunk.md create mode 100644 docs/reference/interfaces/ChatCompletionChunk.md create mode 100644 docs/reference/interfaces/ChatOptions.md create mode 100644 docs/reference/interfaces/ContentStreamChunk.md create mode 100644 docs/reference/interfaces/DoneStreamChunk.md create mode 100644 docs/reference/interfaces/EmbeddingOptions.md create mode 100644 docs/reference/interfaces/EmbeddingResult.md create mode 100644 docs/reference/interfaces/ErrorStreamChunk.md create mode 100644 docs/reference/interfaces/ModelMessage.md create mode 100644 docs/reference/interfaces/ResponseFormat.md create mode 100644 docs/reference/interfaces/SummarizationOptions.md create mode 100644 docs/reference/interfaces/SummarizationResult.md create mode 100644 docs/reference/interfaces/ThinkingStreamChunk.md create mode 100644 docs/reference/interfaces/Tool.md create mode 100644 docs/reference/interfaces/ToolCall.md create mode 100644 docs/reference/interfaces/ToolCallStreamChunk.md create mode 100644 docs/reference/interfaces/ToolConfig.md create mode 100644 docs/reference/interfaces/ToolInputAvailableStreamChunk.md create mode 100644 docs/reference/interfaces/ToolResultStreamChunk.md delete mode 100644 docs/reference/protocol.md create mode 100644 docs/reference/type-aliases/AgentLoopStrategy.md create mode 100644 docs/reference/type-aliases/ChatStreamOptionsUnion.md create mode 100644 docs/reference/type-aliases/ExtractModelsFromAdapter.md create mode 100644 docs/reference/type-aliases/StreamChunk.md create mode 100644 docs/reference/type-aliases/StreamChunkType.md create mode 100644 docs/reference/variables/aiEventClient.md create mode 100644 packages/typescript/ai-devtools/README.md create mode 100644 packages/typescript/ai-gemini/README.md create mode 100644 packages/typescript/ai-ollama/README.md create mode 100644 packages/typescript/ai-openai/README.md create mode 100644 packages/typescript/ai/README.md create mode 100644 packages/typescript/react-ai-devtools/README.md create mode 100644 packages/typescript/solid-ai-devtools/README.md diff --git a/CHANGELOG.md b/CHANGELOG.md index f0ad7ca7d..0f1b30c09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,6 @@ npm install @tanstack/ai-client **See:** [Package Documentation](packages/typescript/ai-client/README.md) - #### @tanstack/ai-react-ui **New Package:** Pre-built React UI components for chat interfaces. diff --git a/docs/reference/classes/BaseAdapter.md b/docs/reference/classes/BaseAdapter.md new file mode 100644 index 000000000..7ea3273e8 --- /dev/null +++ b/docs/reference/classes/BaseAdapter.md @@ -0,0 +1,265 @@ +--- +id: BaseAdapter +title: BaseAdapter +--- + +# Abstract Class: BaseAdapter\ + +Defined in: [base-adapter.ts:22](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L22) + +Base adapter class with support for endpoint-specific models and provider options. + +Generic parameters: +- TChatModels: Models that support chat/text completion +- TEmbeddingModels: Models that support embeddings +- TChatProviderOptions: Provider-specific options for chat endpoint +- TEmbeddingProviderOptions: Provider-specific options for embedding endpoint +- TModelProviderOptionsByName: Provider-specific options for model by name + +## Type Parameters + +### TChatModels + +`TChatModels` *extends* `ReadonlyArray`\<`string`\> = `ReadonlyArray`\<`string`\> + +### TEmbeddingModels + +`TEmbeddingModels` *extends* `ReadonlyArray`\<`string`\> = `ReadonlyArray`\<`string`\> + +### TChatProviderOptions + +`TChatProviderOptions` *extends* `Record`\<`string`, `any`\> = `Record`\<`string`, `any`\> + +### TEmbeddingProviderOptions + +`TEmbeddingProviderOptions` *extends* `Record`\<`string`, `any`\> = `Record`\<`string`, `any`\> + +### TModelProviderOptionsByName + +`TModelProviderOptionsByName` *extends* `Record`\<`string`, `any`\> = `Record`\<`string`, `any`\> + +## Implements + +- [`AIAdapter`](../../interfaces/AIAdapter.md)\<`TChatModels`, `TEmbeddingModels`, `TChatProviderOptions`, `TEmbeddingProviderOptions`, `TModelProviderOptionsByName`\> + +## Constructors + +### Constructor + +```ts +new BaseAdapter(config): BaseAdapter; +``` + +Defined in: [base-adapter.ts:49](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L49) + +#### Parameters + +##### config + +[`AIAdapterConfig`](../../interfaces/AIAdapterConfig.md) = `{}` + +#### Returns + +`BaseAdapter`\<`TChatModels`, `TEmbeddingModels`, `TChatProviderOptions`, `TEmbeddingProviderOptions`, `TModelProviderOptionsByName`\> + +## Properties + +### \_chatProviderOptions? + +```ts +optional _chatProviderOptions: TChatProviderOptions; +``` + +Defined in: [base-adapter.ts:44](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L44) + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`_chatProviderOptions`](../../interfaces/AIAdapter.md#_chatprovideroptions) + +*** + +### \_embeddingProviderOptions? + +```ts +optional _embeddingProviderOptions: TEmbeddingProviderOptions; +``` + +Defined in: [base-adapter.ts:45](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L45) + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`_embeddingProviderOptions`](../../interfaces/AIAdapter.md#_embeddingprovideroptions) + +*** + +### \_modelProviderOptionsByName + +```ts +_modelProviderOptionsByName: TModelProviderOptionsByName; +``` + +Defined in: [base-adapter.ts:47](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L47) + +Type-only map from model name to its specific provider options. +Used by the core AI types to narrow providerOptions based on the selected model. +Must be provided by all adapters. + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`_modelProviderOptionsByName`](../../interfaces/AIAdapter.md#_modelprovideroptionsbyname) + +*** + +### \_providerOptions? + +```ts +optional _providerOptions: TChatProviderOptions; +``` + +Defined in: [base-adapter.ts:43](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L43) + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`_providerOptions`](../../interfaces/AIAdapter.md#_provideroptions) + +*** + +### config + +```ts +protected config: AIAdapterConfig; +``` + +Defined in: [base-adapter.ts:40](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L40) + +*** + +### embeddingModels? + +```ts +optional embeddingModels: TEmbeddingModels; +``` + +Defined in: [base-adapter.ts:39](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L39) + +Models that support embeddings + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`embeddingModels`](../../interfaces/AIAdapter.md#embeddingmodels) + +*** + +### models + +```ts +abstract models: TChatModels; +``` + +Defined in: [base-adapter.ts:38](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L38) + +Models that support chat/text completion + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`models`](../../interfaces/AIAdapter.md#models) + +*** + +### name + +```ts +abstract name: string; +``` + +Defined in: [base-adapter.ts:37](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L37) + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`name`](../../interfaces/AIAdapter.md#name) + +## Methods + +### chatStream() + +```ts +abstract chatStream(options): AsyncIterable; +``` + +Defined in: [base-adapter.ts:53](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L53) + +#### Parameters + +##### options + +[`ChatOptions`](../../interfaces/ChatOptions.md) + +#### Returns + +`AsyncIterable`\<[`StreamChunk`](../../type-aliases/StreamChunk.md)\> + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`chatStream`](../../interfaces/AIAdapter.md#chatstream) + +*** + +### createEmbeddings() + +```ts +abstract createEmbeddings(options): Promise; +``` + +Defined in: [base-adapter.ts:58](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L58) + +#### Parameters + +##### options + +[`EmbeddingOptions`](../../interfaces/EmbeddingOptions.md) + +#### Returns + +`Promise`\<[`EmbeddingResult`](../../interfaces/EmbeddingResult.md)\> + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`createEmbeddings`](../../interfaces/AIAdapter.md#createembeddings) + +*** + +### generateId() + +```ts +protected generateId(): string; +``` + +Defined in: [base-adapter.ts:60](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L60) + +#### Returns + +`string` + +*** + +### summarize() + +```ts +abstract summarize(options): Promise; +``` + +Defined in: [base-adapter.ts:55](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/base-adapter.ts#L55) + +#### Parameters + +##### options + +[`SummarizationOptions`](../../interfaces/SummarizationOptions.md) + +#### Returns + +`Promise`\<[`SummarizationResult`](../../interfaces/SummarizationResult.md)\> + +#### Implementation of + +[`AIAdapter`](../../interfaces/AIAdapter.md).[`summarize`](../../interfaces/AIAdapter.md#summarize) diff --git a/docs/reference/classes/ToolCallManager.md b/docs/reference/classes/ToolCallManager.md new file mode 100644 index 000000000..1d713c081 --- /dev/null +++ b/docs/reference/classes/ToolCallManager.md @@ -0,0 +1,190 @@ +--- +id: ToolCallManager +title: ToolCallManager +--- + +# Class: ToolCallManager + +Defined in: [tools/tool-calls.ts:41](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/tools/tool-calls.ts#L41) + +Manages tool call accumulation and execution for the chat() method's automatic tool execution loop. + +Responsibilities: +- Accumulates streaming tool call chunks (ID, name, arguments) +- Validates tool calls (filters out incomplete ones) +- Executes tool `execute` functions with parsed arguments +- Emits `tool_result` chunks for client visibility +- Returns tool result messages for conversation history + +This class is used internally by the AI.chat() method to handle the automatic +tool execution loop. It can also be used independently for custom tool execution logic. + +## Example + +```typescript +const manager = new ToolCallManager(tools); + +// During streaming, accumulate tool calls +for await (const chunk of stream) { + if (chunk.type === "tool_call") { + manager.addToolCallChunk(chunk); + } +} + +// After stream completes, execute tools +if (manager.hasToolCalls()) { + const toolResults = yield* manager.executeTools(doneChunk); + messages = [...messages, ...toolResults]; + manager.clear(); +} +``` + +## Constructors + +### Constructor + +```ts +new ToolCallManager(tools): ToolCallManager; +``` + +Defined in: [tools/tool-calls.ts:45](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/tools/tool-calls.ts#L45) + +#### Parameters + +##### tools + +readonly [`Tool`](../../interfaces/Tool.md)[] + +#### Returns + +`ToolCallManager` + +## Methods + +### addToolCallChunk() + +```ts +addToolCallChunk(chunk): void; +``` + +Defined in: [tools/tool-calls.ts:53](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/tools/tool-calls.ts#L53) + +Add a tool call chunk to the accumulator +Handles streaming tool calls by accumulating arguments + +#### Parameters + +##### chunk + +###### index + +`number` + +###### toolCall + +\{ + `function`: \{ + `arguments`: `string`; + `name`: `string`; + \}; + `id`: `string`; + `type`: `"function"`; +\} + +###### toolCall.function + +\{ + `arguments`: `string`; + `name`: `string`; +\} + +###### toolCall.function.arguments + +`string` + +###### toolCall.function.name + +`string` + +###### toolCall.id + +`string` + +###### toolCall.type + +`"function"` + +#### Returns + +`void` + +*** + +### clear() + +```ts +clear(): void; +``` + +Defined in: [tools/tool-calls.ts:171](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/tools/tool-calls.ts#L171) + +Clear the tool calls map for the next iteration + +#### Returns + +`void` + +*** + +### executeTools() + +```ts +executeTools(doneChunk): AsyncGenerator; +``` + +Defined in: [tools/tool-calls.ts:111](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/tools/tool-calls.ts#L111) + +Execute all tool calls and return tool result messages +Also yields tool_result chunks for streaming + +#### Parameters + +##### doneChunk + +[`DoneStreamChunk`](../../interfaces/DoneStreamChunk.md) + +#### Returns + +`AsyncGenerator`\<[`ToolResultStreamChunk`](../../interfaces/ToolResultStreamChunk.md), [`ModelMessage`](../../interfaces/ModelMessage.md)[], `void`\> + +*** + +### getToolCalls() + +```ts +getToolCalls(): ToolCall[]; +``` + +Defined in: [tools/tool-calls.ts:101](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/tools/tool-calls.ts#L101) + +Get all complete tool calls (filtered for valid ID and name) + +#### Returns + +[`ToolCall`](../../interfaces/ToolCall.md)[] + +*** + +### hasToolCalls() + +```ts +hasToolCalls(): boolean; +``` + +Defined in: [tools/tool-calls.ts:94](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/tools/tool-calls.ts#L94) + +Check if there are any complete tool calls to execute + +#### Returns + +`boolean` diff --git a/docs/reference/functions/chat.md b/docs/reference/functions/chat.md new file mode 100644 index 000000000..9dd56efa8 --- /dev/null +++ b/docs/reference/functions/chat.md @@ -0,0 +1,55 @@ +--- +id: chat +title: chat +--- + +# Function: chat() + +```ts +function chat(options): AsyncIterable; +``` + +Defined in: [core/chat.ts:738](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/core/chat.ts#L738) + +Standalone chat streaming function with type inference from adapter +Returns an async iterable of StreamChunks for streaming responses +Includes automatic tool execution loop + +## Type Parameters + +### TAdapter + +`TAdapter` *extends* [`AIAdapter`](../../interfaces/AIAdapter.md)\<`any`, `any`, `any`, `any`, `any`\> + +### TModel + +`TModel` *extends* `any` + +## Parameters + +### options + +`Omit`\<[`ChatStreamOptionsUnion`](../../type-aliases/ChatStreamOptionsUnion.md)\<`TAdapter`\>, `"model"` \| `"providerOptions"` \| `"adapter"`\> & `object` + +Chat options + +## Returns + +`AsyncIterable`\<[`StreamChunk`](../../type-aliases/StreamChunk.md)\> + +## Example + +```typescript +const stream = chat({ + adapter: openai(), + model: 'gpt-4o', + messages: [{ role: 'user', content: 'Hello!' }], + tools: [weatherTool], // Optional: auto-executed when called +}); + +for await (const chunk of stream) { + if (chunk.type === 'content') { + console.log(chunk.delta); + } +} +``` diff --git a/docs/reference/functions/chatOptions.md b/docs/reference/functions/chatOptions.md new file mode 100644 index 000000000..90385ac78 --- /dev/null +++ b/docs/reference/functions/chatOptions.md @@ -0,0 +1,32 @@ +--- +id: chatOptions +title: chatOptions +--- + +# Function: chatOptions() + +```ts +function chatOptions(options): Omit, "model" | "providerOptions" | "messages" | "abortController"> & object; +``` + +Defined in: [utilities/chat-options.ts:3](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/utilities/chat-options.ts#L3) + +## Type Parameters + +### TAdapter + +`TAdapter` *extends* [`AIAdapter`](../../interfaces/AIAdapter.md)\<`any`, `any`, `any`, `any`, `any`\> + +### TModel + +`TModel` *extends* `any` + +## Parameters + +### options + +`Omit`\<[`ChatStreamOptionsUnion`](../../type-aliases/ChatStreamOptionsUnion.md)\<`TAdapter`\>, `"model"` \| `"providerOptions"` \| `"messages"` \| `"abortController"`\> & `object` + +## Returns + +`Omit`\<[`ChatStreamOptionsUnion`](../../type-aliases/ChatStreamOptionsUnion.md)\<`TAdapter`\>, `"model"` \| `"providerOptions"` \| `"messages"` \| `"abortController"`\> & `object` diff --git a/docs/reference/functions/combineStrategies.md b/docs/reference/functions/combineStrategies.md new file mode 100644 index 000000000..4821bbef9 --- /dev/null +++ b/docs/reference/functions/combineStrategies.md @@ -0,0 +1,44 @@ +--- +id: combineStrategies +title: combineStrategies +--- + +# Function: combineStrategies() + +```ts +function combineStrategies(strategies): AgentLoopStrategy; +``` + +Defined in: [utilities/agent-loop-strategies.ts:79](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/utilities/agent-loop-strategies.ts#L79) + +Creates a strategy that combines multiple strategies with AND logic +All strategies must return true to continue + +## Parameters + +### strategies + +[`AgentLoopStrategy`](../../type-aliases/AgentLoopStrategy.md)[] + +Array of strategies to combine + +## Returns + +[`AgentLoopStrategy`](../../type-aliases/AgentLoopStrategy.md) + +AgentLoopStrategy that continues only if all strategies return true + +## Example + +```typescript +const stream = chat({ + adapter: openai(), + model: "gpt-4o", + messages: [...], + tools: [weatherTool], + agentLoopStrategy: combineStrategies([ + maxIterations(10), + ({ messages }) => messages.length < 100, + ]), +}); +``` diff --git a/docs/reference/functions/embedding.md b/docs/reference/functions/embedding.md new file mode 100644 index 000000000..37b8806f0 --- /dev/null +++ b/docs/reference/functions/embedding.md @@ -0,0 +1,30 @@ +--- +id: embedding +title: embedding +--- + +# Function: embedding() + +```ts +function embedding(options): Promise; +``` + +Defined in: [core/embedding.ts:11](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/core/embedding.ts#L11) + +Standalone embedding function with type inference from adapter + +## Type Parameters + +### TAdapter + +`TAdapter` *extends* [`AIAdapter`](../../interfaces/AIAdapter.md)\<`any`, `any`, `any`, `any`, `any`\> + +## Parameters + +### options + +`Omit`\<[`EmbeddingOptions`](../../interfaces/EmbeddingOptions.md), `"model"`\> & `object` + +## Returns + +`Promise`\<[`EmbeddingResult`](../../interfaces/EmbeddingResult.md)\> diff --git a/docs/reference/functions/maxIterations.md b/docs/reference/functions/maxIterations.md new file mode 100644 index 000000000..696ccfad5 --- /dev/null +++ b/docs/reference/functions/maxIterations.md @@ -0,0 +1,40 @@ +--- +id: maxIterations +title: maxIterations +--- + +# Function: maxIterations() + +```ts +function maxIterations(max): AgentLoopStrategy; +``` + +Defined in: [utilities/agent-loop-strategies.ts:20](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/utilities/agent-loop-strategies.ts#L20) + +Creates a strategy that continues for a maximum number of iterations + +## Parameters + +### max + +`number` + +Maximum number of iterations to allow + +## Returns + +[`AgentLoopStrategy`](../../type-aliases/AgentLoopStrategy.md) + +AgentLoopStrategy that stops after max iterations + +## Example + +```typescript +const stream = chat({ + adapter: openai(), + model: "gpt-4o", + messages: [...], + tools: [weatherTool], + agentLoopStrategy: maxIterations(3), // Max 3 iterations +}); +``` diff --git a/docs/reference/functions/summarize.md b/docs/reference/functions/summarize.md new file mode 100644 index 000000000..2a0c35d25 --- /dev/null +++ b/docs/reference/functions/summarize.md @@ -0,0 +1,30 @@ +--- +id: summarize +title: summarize +--- + +# Function: summarize() + +```ts +function summarize(options): Promise; +``` + +Defined in: [core/summarize.ts:11](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/core/summarize.ts#L11) + +Standalone summarize function with type inference from adapter + +## Type Parameters + +### TAdapter + +`TAdapter` *extends* [`AIAdapter`](../../interfaces/AIAdapter.md)\<`any`, `any`, `any`, `any`, `any`\> + +## Parameters + +### options + +`Omit`\<[`SummarizationOptions`](../../interfaces/SummarizationOptions.md), `"model"`\> & `object` + +## Returns + +`Promise`\<[`SummarizationResult`](../../interfaces/SummarizationResult.md)\> diff --git a/docs/reference/functions/toServerSentEventsStream.md b/docs/reference/functions/toServerSentEventsStream.md new file mode 100644 index 000000000..7cbeffe57 --- /dev/null +++ b/docs/reference/functions/toServerSentEventsStream.md @@ -0,0 +1,47 @@ +--- +id: toServerSentEventsStream +title: toServerSentEventsStream +--- + +# Function: toServerSentEventsStream() + +```ts +function toServerSentEventsStream(stream, abortController?): ReadableStream>; +``` + +Defined in: [utilities/stream-to-response.ts:22](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/utilities/stream-to-response.ts#L22) + +Convert a StreamChunk async iterable to a ReadableStream in Server-Sent Events format + +This creates a ReadableStream that emits chunks in SSE format: +- Each chunk is prefixed with "data: " +- Each chunk is followed by "\n\n" +- Stream ends with "data: [DONE]\n\n" + +## Parameters + +### stream + +`AsyncIterable`\<[`StreamChunk`](../../type-aliases/StreamChunk.md)\> + +AsyncIterable of StreamChunks from chat() + +### abortController? + +`AbortController` + +Optional AbortController to abort when stream is cancelled + +## Returns + +`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\> + +ReadableStream in Server-Sent Events format + +## Example + +```typescript +const stream = chat({ adapter: openai(), model: "gpt-4o", messages: [...] }); +const readableStream = toServerSentEventsStream(stream); +// Use with Response, or any API that accepts ReadableStream +``` diff --git a/docs/reference/functions/toStreamResponse.md b/docs/reference/functions/toStreamResponse.md new file mode 100644 index 000000000..883a9e222 --- /dev/null +++ b/docs/reference/functions/toStreamResponse.md @@ -0,0 +1,51 @@ +--- +id: toStreamResponse +title: toStreamResponse +--- + +# Function: toStreamResponse() + +```ts +function toStreamResponse(stream, init?): Response; +``` + +Defined in: [utilities/stream-to-response.ts:102](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/utilities/stream-to-response.ts#L102) + +Create a streaming HTTP response from a StreamChunk async iterable +Includes proper headers for Server-Sent Events + +## Parameters + +### stream + +`AsyncIterable`\<[`StreamChunk`](../../type-aliases/StreamChunk.md)\> + +AsyncIterable of StreamChunks from chat() + +### init? + +`ResponseInit` & `object` + +Optional Response initialization options + +## Returns + +`Response` + +Response object with SSE headers and streaming body + +## Example + +```typescript +export async function POST(request: Request) { + const { messages } = await request.json(); + const abortController = new AbortController(); + const stream = chat({ + adapter: openai(), + model: "gpt-4o", + messages, + options: { abortSignal: abortController.signal } + }); + return toStreamResponse(stream, undefined, abortController); +} +``` diff --git a/docs/reference/functions/tool.md b/docs/reference/functions/tool.md new file mode 100644 index 000000000..f5fb6c7be --- /dev/null +++ b/docs/reference/functions/tool.md @@ -0,0 +1,108 @@ +--- +id: tool +title: tool +--- + +# Function: tool() + +```ts +function tool(config): Tool; +``` + +Defined in: [tools/tool-utils.ts:70](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/tools/tool-utils.ts#L70) + +Helper to define a tool with enforced type safety. +Automatically infers the execute function argument types from the parameters schema. +User must provide the full Tool structure with type: "function" and function: {...} + +## Type Parameters + +### TProps + +`TProps` *extends* `Record`\<`string`, `any`\> + +### TRequired + +`TRequired` *extends* readonly `string`[] \| `undefined` + +## Parameters + +### config + +#### execute + +(`args`) => `string` \| `Promise`\<`string`\> + +#### function + +\{ + `description`: `string`; + `name`: `string`; + `parameters`: \{ + `properties`: `TProps`; + `required?`: `TRequired`; + `type`: `"object"`; + \}; +\} + +#### function.description + +`string` + +#### function.name + +`string` + +#### function.parameters + +\{ + `properties`: `TProps`; + `required?`: `TRequired`; + `type`: `"object"`; +\} + +#### function.parameters.properties + +`TProps` + +#### function.parameters.required? + +`TRequired` + +#### function.parameters.type + +`"object"` + +#### type + +`"function"` + +## Returns + +[`Tool`](../../interfaces/Tool.md) + +## Example + +```typescript +const tools = { + myTool: tool({ + type: "function", + function: { + name: "myTool", + description: "My tool description", + parameters: { + type: "object", + properties: { + id: { type: "string", description: "The ID" }, + optional: { type: "number", description: "Optional param" }, + }, + required: ["id"], + }, + }, + execute: async (args) => { + // ✅ args is automatically typed as { id: string; optional?: number } + return args.id; + }, + }), +}; +``` diff --git a/docs/reference/functions/untilFinishReason.md b/docs/reference/functions/untilFinishReason.md new file mode 100644 index 000000000..02f697ba9 --- /dev/null +++ b/docs/reference/functions/untilFinishReason.md @@ -0,0 +1,40 @@ +--- +id: untilFinishReason +title: untilFinishReason +--- + +# Function: untilFinishReason() + +```ts +function untilFinishReason(stopReasons): AgentLoopStrategy; +``` + +Defined in: [utilities/agent-loop-strategies.ts:41](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/utilities/agent-loop-strategies.ts#L41) + +Creates a strategy that continues until a specific finish reason is encountered + +## Parameters + +### stopReasons + +`string`[] + +Finish reasons that should stop the loop + +## Returns + +[`AgentLoopStrategy`](../../type-aliases/AgentLoopStrategy.md) + +AgentLoopStrategy that stops on specific finish reasons + +## Example + +```typescript +const stream = chat({ + adapter: openai(), + model: "gpt-4o", + messages: [...], + tools: [weatherTool], + agentLoopStrategy: untilFinishReason(["stop", "length"]), +}); +``` diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 000000000..a1632d557 --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,62 @@ +--- +id: "@tanstack/ai" +title: "@tanstack/ai" +--- + +# @tanstack/ai + +## Classes + +- [BaseAdapter](../classes/BaseAdapter.md) +- [ToolCallManager](../classes/ToolCallManager.md) + +## Interfaces + +- [AgentLoopState](../interfaces/AgentLoopState.md) +- [AIAdapter](../interfaces/AIAdapter.md) +- [AIAdapterConfig](../interfaces/AIAdapterConfig.md) +- [ApprovalRequestedStreamChunk](../interfaces/ApprovalRequestedStreamChunk.md) +- [BaseStreamChunk](../interfaces/BaseStreamChunk.md) +- [ChatCompletionChunk](../interfaces/ChatCompletionChunk.md) +- [ChatOptions](../interfaces/ChatOptions.md) +- [ContentStreamChunk](../interfaces/ContentStreamChunk.md) +- [DoneStreamChunk](../interfaces/DoneStreamChunk.md) +- [EmbeddingOptions](../interfaces/EmbeddingOptions.md) +- [EmbeddingResult](../interfaces/EmbeddingResult.md) +- [ErrorStreamChunk](../interfaces/ErrorStreamChunk.md) +- [ModelMessage](../interfaces/ModelMessage.md) +- [ResponseFormat](../interfaces/ResponseFormat.md) +- [SummarizationOptions](../interfaces/SummarizationOptions.md) +- [SummarizationResult](../interfaces/SummarizationResult.md) +- [ThinkingStreamChunk](../interfaces/ThinkingStreamChunk.md) +- [Tool](../interfaces/Tool.md) +- [ToolCall](../interfaces/ToolCall.md) +- [ToolCallStreamChunk](../interfaces/ToolCallStreamChunk.md) +- [ToolConfig](../interfaces/ToolConfig.md) +- [ToolInputAvailableStreamChunk](../interfaces/ToolInputAvailableStreamChunk.md) +- [ToolResultStreamChunk](../interfaces/ToolResultStreamChunk.md) + +## Type Aliases + +- [AgentLoopStrategy](../type-aliases/AgentLoopStrategy.md) +- [ChatStreamOptionsUnion](../type-aliases/ChatStreamOptionsUnion.md) +- [ExtractModelsFromAdapter](../type-aliases/ExtractModelsFromAdapter.md) +- [StreamChunk](../type-aliases/StreamChunk.md) +- [StreamChunkType](../type-aliases/StreamChunkType.md) + +## Variables + +- [aiEventClient](../variables/aiEventClient.md) + +## Functions + +- [chat](../functions/chat.md) +- [chatOptions](../functions/chatOptions.md) +- [combineStrategies](../functions/combineStrategies.md) +- [embedding](../functions/embedding.md) +- [maxIterations](../functions/maxIterations.md) +- [summarize](../functions/summarize.md) +- [tool](../functions/tool.md) +- [toServerSentEventsStream](../functions/toServerSentEventsStream.md) +- [toStreamResponse](../functions/toStreamResponse.md) +- [untilFinishReason](../functions/untilFinishReason.md) diff --git a/docs/reference/interfaces/AIAdapter.md b/docs/reference/interfaces/AIAdapter.md new file mode 100644 index 000000000..6595d6dc9 --- /dev/null +++ b/docs/reference/interfaces/AIAdapter.md @@ -0,0 +1,182 @@ +--- +id: AIAdapter +title: AIAdapter +--- + +# Interface: AIAdapter\ + +Defined in: [types.ts:425](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L425) + +AI adapter interface with support for endpoint-specific models and provider options. + +Generic parameters: +- TChatModels: Models that support chat/text completion +- TImageModels: Models that support image generation +- TEmbeddingModels: Models that support embeddings +- TAudioModels: Models that support audio (transcription and text-to-speech) +- TVideoModels: Models that support video generation +- TChatProviderOptions: Provider-specific options for chat endpoint +- TImageProviderOptions: Provider-specific options for image endpoint +- TEmbeddingProviderOptions: Provider-specific options for embedding endpoint +- TAudioProviderOptions: Provider-specific options for audio endpoint +- TVideoProviderOptions: Provider-specific options for video endpoint + +## Type Parameters + +### TChatModels + +`TChatModels` *extends* `ReadonlyArray`\<`string`\> = `ReadonlyArray`\<`string`\> + +### TEmbeddingModels + +`TEmbeddingModels` *extends* `ReadonlyArray`\<`string`\> = `ReadonlyArray`\<`string`\> + +### TChatProviderOptions + +`TChatProviderOptions` *extends* `Record`\<`string`, `any`\> = `Record`\<`string`, `any`\> + +### TEmbeddingProviderOptions + +`TEmbeddingProviderOptions` *extends* `Record`\<`string`, `any`\> = `Record`\<`string`, `any`\> + +### TModelProviderOptionsByName + +`TModelProviderOptionsByName` *extends* `Record`\<`string`, `any`\> = `Record`\<`string`, `any`\> + +## Properties + +### \_chatProviderOptions? + +```ts +optional _chatProviderOptions: TChatProviderOptions; +``` + +Defined in: [types.ts:441](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L441) + +*** + +### \_embeddingProviderOptions? + +```ts +optional _embeddingProviderOptions: TEmbeddingProviderOptions; +``` + +Defined in: [types.ts:442](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L442) + +*** + +### \_modelProviderOptionsByName + +```ts +_modelProviderOptionsByName: TModelProviderOptionsByName; +``` + +Defined in: [types.ts:448](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L448) + +Type-only map from model name to its specific provider options. +Used by the core AI types to narrow providerOptions based on the selected model. +Must be provided by all adapters. + +*** + +### \_providerOptions? + +```ts +optional _providerOptions: TChatProviderOptions; +``` + +Defined in: [types.ts:440](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L440) + +*** + +### chatStream() + +```ts +chatStream: (options) => AsyncIterable; +``` + +Defined in: [types.ts:451](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L451) + +#### Parameters + +##### options + +[`ChatOptions`](../ChatOptions.md)\<`string`, `TChatProviderOptions`\> + +#### Returns + +`AsyncIterable`\<[`StreamChunk`](../../type-aliases/StreamChunk.md)\> + +*** + +### createEmbeddings() + +```ts +createEmbeddings: (options) => Promise; +``` + +Defined in: [types.ts:459](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L459) + +#### Parameters + +##### options + +[`EmbeddingOptions`](../EmbeddingOptions.md) + +#### Returns + +`Promise`\<[`EmbeddingResult`](../EmbeddingResult.md)\> + +*** + +### embeddingModels? + +```ts +optional embeddingModels: TEmbeddingModels; +``` + +Defined in: [types.ts:437](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L437) + +Models that support embeddings + +*** + +### models + +```ts +models: TChatModels; +``` + +Defined in: [types.ts:434](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L434) + +Models that support chat/text completion + +*** + +### name + +```ts +name: string; +``` + +Defined in: [types.ts:432](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L432) + +*** + +### summarize() + +```ts +summarize: (options) => Promise; +``` + +Defined in: [types.ts:456](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L456) + +#### Parameters + +##### options + +[`SummarizationOptions`](../SummarizationOptions.md) + +#### Returns + +`Promise`\<[`SummarizationResult`](../SummarizationResult.md)\> diff --git a/docs/reference/interfaces/AIAdapterConfig.md b/docs/reference/interfaces/AIAdapterConfig.md new file mode 100644 index 000000000..aed5908ba --- /dev/null +++ b/docs/reference/interfaces/AIAdapterConfig.md @@ -0,0 +1,58 @@ +--- +id: AIAdapterConfig +title: AIAdapterConfig +--- + +# Interface: AIAdapterConfig + +Defined in: [types.ts:462](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L462) + +## Properties + +### apiKey? + +```ts +optional apiKey: string; +``` + +Defined in: [types.ts:463](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L463) + +*** + +### baseUrl? + +```ts +optional baseUrl: string; +``` + +Defined in: [types.ts:464](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L464) + +*** + +### headers? + +```ts +optional headers: Record; +``` + +Defined in: [types.ts:467](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L467) + +*** + +### maxRetries? + +```ts +optional maxRetries: number; +``` + +Defined in: [types.ts:466](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L466) + +*** + +### timeout? + +```ts +optional timeout: number; +``` + +Defined in: [types.ts:465](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L465) diff --git a/docs/reference/interfaces/AgentLoopState.md b/docs/reference/interfaces/AgentLoopState.md new file mode 100644 index 000000000..14a78b4f6 --- /dev/null +++ b/docs/reference/interfaces/AgentLoopState.md @@ -0,0 +1,46 @@ +--- +id: AgentLoopState +title: AgentLoopState +--- + +# Interface: AgentLoopState + +Defined in: [types.ts:205](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L205) + +State passed to agent loop strategy for determining whether to continue + +## Properties + +### finishReason + +```ts +finishReason: string | null; +``` + +Defined in: [types.ts:211](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L211) + +Finish reason from the last response + +*** + +### iterationCount + +```ts +iterationCount: number; +``` + +Defined in: [types.ts:207](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L207) + +Current iteration count (0-indexed) + +*** + +### messages + +```ts +messages: ModelMessage[]; +``` + +Defined in: [types.ts:209](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L209) + +Current messages array diff --git a/docs/reference/interfaces/ApprovalRequestedStreamChunk.md b/docs/reference/interfaces/ApprovalRequestedStreamChunk.md new file mode 100644 index 000000000..0d8e25f04 --- /dev/null +++ b/docs/reference/interfaces/ApprovalRequestedStreamChunk.md @@ -0,0 +1,120 @@ +--- +id: ApprovalRequestedStreamChunk +title: ApprovalRequestedStreamChunk +--- + +# Interface: ApprovalRequestedStreamChunk + +Defined in: [types.ts:323](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L323) + +## Extends + +- [`BaseStreamChunk`](../BaseStreamChunk.md) + +## Properties + +### approval + +```ts +approval: object; +``` + +Defined in: [types.ts:328](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L328) + +#### id + +```ts +id: string; +``` + +#### needsApproval + +```ts +needsApproval: true; +``` + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`id`](../BaseStreamChunk.md#id) + +*** + +### input + +```ts +input: any; +``` + +Defined in: [types.ts:327](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L327) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`model`](../BaseStreamChunk.md#model) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`timestamp`](../BaseStreamChunk.md#timestamp) + +*** + +### toolCallId + +```ts +toolCallId: string; +``` + +Defined in: [types.ts:325](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L325) + +*** + +### toolName + +```ts +toolName: string; +``` + +Defined in: [types.ts:326](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L326) + +*** + +### type + +```ts +type: "approval-requested"; +``` + +Defined in: [types.ts:324](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L324) + +#### Overrides + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`type`](../BaseStreamChunk.md#type) diff --git a/docs/reference/interfaces/BaseStreamChunk.md b/docs/reference/interfaces/BaseStreamChunk.md new file mode 100644 index 000000000..f8fc91435 --- /dev/null +++ b/docs/reference/interfaces/BaseStreamChunk.md @@ -0,0 +1,59 @@ +--- +id: BaseStreamChunk +title: BaseStreamChunk +--- + +# Interface: BaseStreamChunk + +Defined in: [types.ts:272](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L272) + +## Extended by + +- [`ContentStreamChunk`](../ContentStreamChunk.md) +- [`ToolCallStreamChunk`](../ToolCallStreamChunk.md) +- [`ToolResultStreamChunk`](../ToolResultStreamChunk.md) +- [`DoneStreamChunk`](../DoneStreamChunk.md) +- [`ErrorStreamChunk`](../ErrorStreamChunk.md) +- [`ApprovalRequestedStreamChunk`](../ApprovalRequestedStreamChunk.md) +- [`ToolInputAvailableStreamChunk`](../ToolInputAvailableStreamChunk.md) +- [`ThinkingStreamChunk`](../ThinkingStreamChunk.md) + +## Properties + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +*** + +### type + +```ts +type: StreamChunkType; +``` + +Defined in: [types.ts:273](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L273) diff --git a/docs/reference/interfaces/ChatCompletionChunk.md b/docs/reference/interfaces/ChatCompletionChunk.md new file mode 100644 index 000000000..ffe878907 --- /dev/null +++ b/docs/reference/interfaces/ChatCompletionChunk.md @@ -0,0 +1,86 @@ +--- +id: ChatCompletionChunk +title: ChatCompletionChunk +--- + +# Interface: ChatCompletionChunk + +Defined in: [types.ts:362](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L362) + +## Properties + +### content + +```ts +content: string; +``` + +Defined in: [types.ts:365](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L365) + +*** + +### finishReason? + +```ts +optional finishReason: "stop" | "length" | "content_filter" | null; +``` + +Defined in: [types.ts:367](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L367) + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:363](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L363) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:364](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L364) + +*** + +### role? + +```ts +optional role: "assistant"; +``` + +Defined in: [types.ts:366](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L366) + +*** + +### usage? + +```ts +optional usage: object; +``` + +Defined in: [types.ts:368](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L368) + +#### completionTokens + +```ts +completionTokens: number; +``` + +#### promptTokens + +```ts +promptTokens: number; +``` + +#### totalTokens + +```ts +totalTokens: number; +``` diff --git a/docs/reference/interfaces/ChatOptions.md b/docs/reference/interfaces/ChatOptions.md new file mode 100644 index 000000000..5866ecd14 --- /dev/null +++ b/docs/reference/interfaces/ChatOptions.md @@ -0,0 +1,145 @@ +--- +id: ChatOptions +title: ChatOptions +--- + +# Interface: ChatOptions\ + +Defined in: [types.ts:231](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L231) + +Options passed into the SDK and further piped to the AI provider. + +## Type Parameters + +### TModel + +`TModel` *extends* `string` = `string` + +### TProviderOptionsSuperset + +`TProviderOptionsSuperset` *extends* `Record`\<`string`, `any`\> = `Record`\<`string`, `any`\> + +### TOutput + +`TOutput` *extends* [`ResponseFormat`](../ResponseFormat.md)\<`any`\> \| `undefined` = `undefined` + +### TProviderOptionsForModel + +`TProviderOptionsForModel` = `TProviderOptionsSuperset` + +## Properties + +### abortController? + +```ts +optional abortController: AbortController; +``` + +Defined in: [types.ts:259](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L259) + +AbortController for request cancellation. + +Allows you to cancel an in-progress request using an AbortController. +Useful for implementing timeouts or user-initiated cancellations. + +#### Example + +```ts +const abortController = new AbortController(); +setTimeout(() => abortController.abort(), 5000); // Cancel after 5 seconds +await chat({ ..., abortController }); +``` + +#### See + +https://developer.mozilla.org/en-US/docs/Web/API/AbortController + +*** + +### agentLoopStrategy? + +```ts +optional agentLoopStrategy: AgentLoopStrategy; +``` + +Defined in: [types.ts:241](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L241) + +*** + +### messages + +```ts +messages: ModelMessage[]; +``` + +Defined in: [types.ts:238](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L238) + +*** + +### model + +```ts +model: TModel; +``` + +Defined in: [types.ts:237](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L237) + +*** + +### options? + +```ts +optional options: CommonOptions; +``` + +Defined in: [types.ts:242](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L242) + +*** + +### output? + +```ts +optional output: TOutput; +``` + +Defined in: [types.ts:245](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L245) + +*** + +### providerOptions? + +```ts +optional providerOptions: TProviderOptionsForModel; +``` + +Defined in: [types.ts:243](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L243) + +*** + +### request? + +```ts +optional request: Request | RequestInit; +``` + +Defined in: [types.ts:244](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L244) + +*** + +### systemPrompts? + +```ts +optional systemPrompts: string[]; +``` + +Defined in: [types.ts:240](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L240) + +*** + +### tools? + +```ts +optional tools: Tool[]; +``` + +Defined in: [types.ts:239](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L239) diff --git a/docs/reference/interfaces/ContentStreamChunk.md b/docs/reference/interfaces/ContentStreamChunk.md new file mode 100644 index 000000000..9f953f9a6 --- /dev/null +++ b/docs/reference/interfaces/ContentStreamChunk.md @@ -0,0 +1,98 @@ +--- +id: ContentStreamChunk +title: ContentStreamChunk +--- + +# Interface: ContentStreamChunk + +Defined in: [types.ts:279](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L279) + +## Extends + +- [`BaseStreamChunk`](../BaseStreamChunk.md) + +## Properties + +### content + +```ts +content: string; +``` + +Defined in: [types.ts:282](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L282) + +*** + +### delta + +```ts +delta: string; +``` + +Defined in: [types.ts:281](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L281) + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`id`](../BaseStreamChunk.md#id) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`model`](../BaseStreamChunk.md#model) + +*** + +### role? + +```ts +optional role: "assistant"; +``` + +Defined in: [types.ts:283](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L283) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`timestamp`](../BaseStreamChunk.md#timestamp) + +*** + +### type + +```ts +type: "content"; +``` + +Defined in: [types.ts:280](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L280) + +#### Overrides + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`type`](../BaseStreamChunk.md#type) diff --git a/docs/reference/interfaces/DoneStreamChunk.md b/docs/reference/interfaces/DoneStreamChunk.md new file mode 100644 index 000000000..51689b8a5 --- /dev/null +++ b/docs/reference/interfaces/DoneStreamChunk.md @@ -0,0 +1,106 @@ +--- +id: DoneStreamChunk +title: DoneStreamChunk +--- + +# Interface: DoneStreamChunk + +Defined in: [types.ts:305](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L305) + +## Extends + +- [`BaseStreamChunk`](../BaseStreamChunk.md) + +## Properties + +### finishReason + +```ts +finishReason: "stop" | "length" | "content_filter" | "tool_calls" | null; +``` + +Defined in: [types.ts:307](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L307) + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`id`](../BaseStreamChunk.md#id) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`model`](../BaseStreamChunk.md#model) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`timestamp`](../BaseStreamChunk.md#timestamp) + +*** + +### type + +```ts +type: "done"; +``` + +Defined in: [types.ts:306](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L306) + +#### Overrides + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`type`](../BaseStreamChunk.md#type) + +*** + +### usage? + +```ts +optional usage: object; +``` + +Defined in: [types.ts:308](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L308) + +#### completionTokens + +```ts +completionTokens: number; +``` + +#### promptTokens + +```ts +promptTokens: number; +``` + +#### totalTokens + +```ts +totalTokens: number; +``` diff --git a/docs/reference/interfaces/EmbeddingOptions.md b/docs/reference/interfaces/EmbeddingOptions.md new file mode 100644 index 000000000..0c73ef4da --- /dev/null +++ b/docs/reference/interfaces/EmbeddingOptions.md @@ -0,0 +1,38 @@ +--- +id: EmbeddingOptions +title: EmbeddingOptions +--- + +# Interface: EmbeddingOptions + +Defined in: [types.ts:394](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L394) + +## Properties + +### dimensions? + +```ts +optional dimensions: number; +``` + +Defined in: [types.ts:397](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L397) + +*** + +### input + +```ts +input: string | string[]; +``` + +Defined in: [types.ts:396](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L396) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:395](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L395) diff --git a/docs/reference/interfaces/EmbeddingResult.md b/docs/reference/interfaces/EmbeddingResult.md new file mode 100644 index 000000000..f1ec170c0 --- /dev/null +++ b/docs/reference/interfaces/EmbeddingResult.md @@ -0,0 +1,60 @@ +--- +id: EmbeddingResult +title: EmbeddingResult +--- + +# Interface: EmbeddingResult + +Defined in: [types.ts:400](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L400) + +## Properties + +### embeddings + +```ts +embeddings: number[][]; +``` + +Defined in: [types.ts:403](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L403) + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:401](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L401) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:402](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L402) + +*** + +### usage + +```ts +usage: object; +``` + +Defined in: [types.ts:404](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L404) + +#### promptTokens + +```ts +promptTokens: number; +``` + +#### totalTokens + +```ts +totalTokens: number; +``` diff --git a/docs/reference/interfaces/ErrorStreamChunk.md b/docs/reference/interfaces/ErrorStreamChunk.md new file mode 100644 index 000000000..a75aba122 --- /dev/null +++ b/docs/reference/interfaces/ErrorStreamChunk.md @@ -0,0 +1,90 @@ +--- +id: ErrorStreamChunk +title: ErrorStreamChunk +--- + +# Interface: ErrorStreamChunk + +Defined in: [types.ts:315](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L315) + +## Extends + +- [`BaseStreamChunk`](../BaseStreamChunk.md) + +## Properties + +### error + +```ts +error: object; +``` + +Defined in: [types.ts:317](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L317) + +#### code? + +```ts +optional code: string; +``` + +#### message + +```ts +message: string; +``` + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`id`](../BaseStreamChunk.md#id) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`model`](../BaseStreamChunk.md#model) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`timestamp`](../BaseStreamChunk.md#timestamp) + +*** + +### type + +```ts +type: "error"; +``` + +Defined in: [types.ts:316](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L316) + +#### Overrides + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`type`](../BaseStreamChunk.md#type) diff --git a/docs/reference/interfaces/ModelMessage.md b/docs/reference/interfaces/ModelMessage.md new file mode 100644 index 000000000..403690993 --- /dev/null +++ b/docs/reference/interfaces/ModelMessage.md @@ -0,0 +1,58 @@ +--- +id: ModelMessage +title: ModelMessage +--- + +# Interface: ModelMessage + +Defined in: [types.ts:12](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L12) + +## Properties + +### content + +```ts +content: string | null; +``` + +Defined in: [types.ts:14](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L14) + +*** + +### name? + +```ts +optional name: string; +``` + +Defined in: [types.ts:15](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L15) + +*** + +### role + +```ts +role: "system" | "user" | "assistant" | "tool"; +``` + +Defined in: [types.ts:13](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L13) + +*** + +### toolCallId? + +```ts +optional toolCallId: string; +``` + +Defined in: [types.ts:17](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L17) + +*** + +### toolCalls? + +```ts +optional toolCalls: ToolCall[]; +``` + +Defined in: [types.ts:16](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L16) diff --git a/docs/reference/interfaces/ResponseFormat.md b/docs/reference/interfaces/ResponseFormat.md new file mode 100644 index 000000000..62f53a2f4 --- /dev/null +++ b/docs/reference/interfaces/ResponseFormat.md @@ -0,0 +1,151 @@ +--- +id: ResponseFormat +title: ResponseFormat +--- + +# Interface: ResponseFormat\ + +Defined in: [types.ts:121](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L121) + +Structured output format specification. + +Constrains the model's output to match a specific JSON structure. +Useful for extracting structured data, form filling, or ensuring consistent response formats. + +## See + + - https://platform.openai.com/docs/guides/structured-outputs + - https://sdk.vercel.ai/docs/ai-sdk-core/structured-outputs + +## Type Parameters + +### TData + +`TData` = `any` + +TypeScript type of the expected data structure (for type safety) + +## Properties + +### \_\_data? + +```ts +optional __data: TData; +``` + +Defined in: [types.ts:199](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L199) + +**`Internal`** + +Type-only property to carry the inferred data type. + +This is never set at runtime - it only exists for TypeScript type inference. +Allows the SDK to know what type to expect when parsing the response. + +*** + +### json\_schema? + +```ts +optional json_schema: object; +``` + +Defined in: [types.ts:138](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L138) + +JSON schema specification (required when type is "json_schema"). + +Defines the exact structure the model's output must conform to. +OpenAI's structured outputs will guarantee the output matches this schema. + +#### description? + +```ts +optional description: string; +``` + +Optional description of what the schema represents. + +Helps document the purpose of this structured output. + +##### Example + +```ts +"User profile information including name, email, and preferences" +``` + +#### name + +```ts +name: string; +``` + +Unique name for the schema. + +Used to identify the schema in logs and debugging. +Should be descriptive (e.g., "user_profile", "search_results"). + +#### schema + +```ts +schema: Record; +``` + +JSON Schema definition for the expected output structure. + +Must be a valid JSON Schema (draft 2020-12 or compatible). +The model's output will be validated against this schema. + +##### See + +https://json-schema.org/ + +##### Example + +```ts +{ + * type: "object", + * properties: { + * name: { type: "string" }, + * age: { type: "number" }, + * email: { type: "string", format: "email" } + * }, + * required: ["name", "email"], + * additionalProperties: false + * } +``` + +#### strict? + +```ts +optional strict: boolean; +``` + +Whether to enforce strict schema validation. + +When true (recommended), the model guarantees output will match the schema exactly. +When false, the model will "best effort" match the schema. + +Default: true (for providers that support it) + +##### See + +https://platform.openai.com/docs/guides/structured-outputs#strict-mode + +*** + +### type + +```ts +type: "json_object" | "json_schema"; +``` + +Defined in: [types.ts:130](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L130) + +Type of structured output. + +- "json_object": Forces the model to output valid JSON (any structure) +- "json_schema": Validates output against a provided JSON Schema (strict structure) + +#### See + +https://platform.openai.com/docs/api-reference/chat/create#chat-create-response_format diff --git a/docs/reference/interfaces/SummarizationOptions.md b/docs/reference/interfaces/SummarizationOptions.md new file mode 100644 index 000000000..dcd67c898 --- /dev/null +++ b/docs/reference/interfaces/SummarizationOptions.md @@ -0,0 +1,58 @@ +--- +id: SummarizationOptions +title: SummarizationOptions +--- + +# Interface: SummarizationOptions + +Defined in: [types.ts:375](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L375) + +## Properties + +### focus? + +```ts +optional focus: string[]; +``` + +Defined in: [types.ts:380](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L380) + +*** + +### maxLength? + +```ts +optional maxLength: number; +``` + +Defined in: [types.ts:378](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L378) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:376](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L376) + +*** + +### style? + +```ts +optional style: "bullet-points" | "paragraph" | "concise"; +``` + +Defined in: [types.ts:379](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L379) + +*** + +### text + +```ts +text: string; +``` + +Defined in: [types.ts:377](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L377) diff --git a/docs/reference/interfaces/SummarizationResult.md b/docs/reference/interfaces/SummarizationResult.md new file mode 100644 index 000000000..a926eb936 --- /dev/null +++ b/docs/reference/interfaces/SummarizationResult.md @@ -0,0 +1,66 @@ +--- +id: SummarizationResult +title: SummarizationResult +--- + +# Interface: SummarizationResult + +Defined in: [types.ts:383](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L383) + +## Properties + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:384](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L384) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:385](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L385) + +*** + +### summary + +```ts +summary: string; +``` + +Defined in: [types.ts:386](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L386) + +*** + +### usage + +```ts +usage: object; +``` + +Defined in: [types.ts:387](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L387) + +#### completionTokens + +```ts +completionTokens: number; +``` + +#### promptTokens + +```ts +promptTokens: number; +``` + +#### totalTokens + +```ts +totalTokens: number; +``` diff --git a/docs/reference/interfaces/ThinkingStreamChunk.md b/docs/reference/interfaces/ThinkingStreamChunk.md new file mode 100644 index 000000000..91a5fd21c --- /dev/null +++ b/docs/reference/interfaces/ThinkingStreamChunk.md @@ -0,0 +1,88 @@ +--- +id: ThinkingStreamChunk +title: ThinkingStreamChunk +--- + +# Interface: ThinkingStreamChunk + +Defined in: [types.ts:341](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L341) + +## Extends + +- [`BaseStreamChunk`](../BaseStreamChunk.md) + +## Properties + +### content + +```ts +content: string; +``` + +Defined in: [types.ts:344](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L344) + +*** + +### delta? + +```ts +optional delta: string; +``` + +Defined in: [types.ts:343](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L343) + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`id`](../BaseStreamChunk.md#id) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`model`](../BaseStreamChunk.md#model) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`timestamp`](../BaseStreamChunk.md#timestamp) + +*** + +### type + +```ts +type: "thinking"; +``` + +Defined in: [types.ts:342](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L342) + +#### Overrides + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`type`](../BaseStreamChunk.md#type) diff --git a/docs/reference/interfaces/Tool.md b/docs/reference/interfaces/Tool.md new file mode 100644 index 000000000..a0668f0fc --- /dev/null +++ b/docs/reference/interfaces/Tool.md @@ -0,0 +1,168 @@ +--- +id: Tool +title: Tool +--- + +# Interface: Tool + +Defined in: [types.ts:29](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L29) + +Tool/Function definition for function calling. + +Tools allow the model to interact with external systems, APIs, or perform computations. +The model will decide when to call tools based on the user's request and the tool descriptions. + +## See + + - https://platform.openai.com/docs/guides/function-calling + - https://docs.anthropic.com/claude/docs/tool-use + +## Properties + +### execute()? + +```ts +optional execute: (args) => string | Promise; +``` + +Defined in: [types.ts:99](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L99) + +Optional function to execute when the model calls this tool. + +If provided, the SDK will automatically execute the function with the model's arguments +and feed the result back to the model. This enables autonomous tool use loops. + +Returns the result as a string (or Promise) to send back to the model. + +#### Parameters + +##### args + +`any` + +The arguments parsed from the model's tool call (matches the parameters schema) + +#### Returns + +`string` \| `Promise`\<`string`\> + +Result string to send back to the model + +#### Example + +```ts +execute: async (args) => { + const weather = await fetchWeather(args.location); + return JSON.stringify(weather); +} +``` + +*** + +### function + +```ts +function: object; +``` + +Defined in: [types.ts:40](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L40) + +Function definition and metadata. + +#### description + +```ts +description: string; +``` + +Clear description of what the function does. + +This is crucial - the model uses this to decide when to call the function. +Be specific about what the function does, what parameters it needs, and what it returns. + +##### Example + +```ts +"Get the current weather in a given location. Returns temperature, conditions, and forecast." +``` + +#### name + +```ts +name: string; +``` + +Unique name of the function (used by the model to call it). + +Should be descriptive and follow naming conventions (e.g., snake_case or camelCase). +Must be unique within the tools array. + +##### Example + +```ts +"get_weather", "search_database", "sendEmail" +``` + +#### parameters + +```ts +parameters: Record; +``` + +JSON Schema describing the function's parameters. + +Defines the structure and types of arguments the function accepts. +The model will generate arguments matching this schema. + +##### See + +https://json-schema.org/ + +##### Example + +```ts +{ + * type: "object", + * properties: { + * location: { type: "string", description: "City name or coordinates" }, + * unit: { type: "string", enum: ["celsius", "fahrenheit"] } + * }, + * required: ["location"] + * } +``` + +*** + +### metadata? + +```ts +optional metadata: Record; +``` + +Defined in: [types.ts:103](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L103) + +*** + +### needsApproval? + +```ts +optional needsApproval: boolean; +``` + +Defined in: [types.ts:101](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L101) + +If true, tool execution requires user approval before running. Works with both server and client tools. + +*** + +### type + +```ts +type: "function"; +``` + +Defined in: [types.ts:35](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L35) + +Type of tool - currently only "function" is supported. + +Future versions may support additional tool types. diff --git a/docs/reference/interfaces/ToolCall.md b/docs/reference/interfaces/ToolCall.md new file mode 100644 index 000000000..4843850df --- /dev/null +++ b/docs/reference/interfaces/ToolCall.md @@ -0,0 +1,50 @@ +--- +id: ToolCall +title: ToolCall +--- + +# Interface: ToolCall + +Defined in: [types.ts:3](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L3) + +## Properties + +### function + +```ts +function: object; +``` + +Defined in: [types.ts:6](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L6) + +#### arguments + +```ts +arguments: string; +``` + +#### name + +```ts +name: string; +``` + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:4](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L4) + +*** + +### type + +```ts +type: "function"; +``` + +Defined in: [types.ts:5](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L5) diff --git a/docs/reference/interfaces/ToolCallStreamChunk.md b/docs/reference/interfaces/ToolCallStreamChunk.md new file mode 100644 index 000000000..92507c372 --- /dev/null +++ b/docs/reference/interfaces/ToolCallStreamChunk.md @@ -0,0 +1,118 @@ +--- +id: ToolCallStreamChunk +title: ToolCallStreamChunk +--- + +# Interface: ToolCallStreamChunk + +Defined in: [types.ts:286](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L286) + +## Extends + +- [`BaseStreamChunk`](../BaseStreamChunk.md) + +## Properties + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`id`](../BaseStreamChunk.md#id) + +*** + +### index + +```ts +index: number; +``` + +Defined in: [types.ts:296](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L296) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`model`](../BaseStreamChunk.md#model) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`timestamp`](../BaseStreamChunk.md#timestamp) + +*** + +### toolCall + +```ts +toolCall: object; +``` + +Defined in: [types.ts:288](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L288) + +#### function + +```ts +function: object; +``` + +##### function.arguments + +```ts +arguments: string; +``` + +##### function.name + +```ts +name: string; +``` + +#### id + +```ts +id: string; +``` + +#### type + +```ts +type: "function"; +``` + +*** + +### type + +```ts +type: "tool_call"; +``` + +Defined in: [types.ts:287](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L287) + +#### Overrides + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`type`](../BaseStreamChunk.md#type) diff --git a/docs/reference/interfaces/ToolConfig.md b/docs/reference/interfaces/ToolConfig.md new file mode 100644 index 000000000..0cecdd3d6 --- /dev/null +++ b/docs/reference/interfaces/ToolConfig.md @@ -0,0 +1,14 @@ +--- +id: ToolConfig +title: ToolConfig +--- + +# Interface: ToolConfig + +Defined in: [types.ts:106](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L106) + +## Indexable + +```ts +[key: string]: Tool +``` diff --git a/docs/reference/interfaces/ToolInputAvailableStreamChunk.md b/docs/reference/interfaces/ToolInputAvailableStreamChunk.md new file mode 100644 index 000000000..c3f294788 --- /dev/null +++ b/docs/reference/interfaces/ToolInputAvailableStreamChunk.md @@ -0,0 +1,98 @@ +--- +id: ToolInputAvailableStreamChunk +title: ToolInputAvailableStreamChunk +--- + +# Interface: ToolInputAvailableStreamChunk + +Defined in: [types.ts:334](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L334) + +## Extends + +- [`BaseStreamChunk`](../BaseStreamChunk.md) + +## Properties + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`id`](../BaseStreamChunk.md#id) + +*** + +### input + +```ts +input: any; +``` + +Defined in: [types.ts:338](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L338) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`model`](../BaseStreamChunk.md#model) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`timestamp`](../BaseStreamChunk.md#timestamp) + +*** + +### toolCallId + +```ts +toolCallId: string; +``` + +Defined in: [types.ts:336](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L336) + +*** + +### toolName + +```ts +toolName: string; +``` + +Defined in: [types.ts:337](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L337) + +*** + +### type + +```ts +type: "tool-input-available"; +``` + +Defined in: [types.ts:335](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L335) + +#### Overrides + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`type`](../BaseStreamChunk.md#type) diff --git a/docs/reference/interfaces/ToolResultStreamChunk.md b/docs/reference/interfaces/ToolResultStreamChunk.md new file mode 100644 index 000000000..58085881e --- /dev/null +++ b/docs/reference/interfaces/ToolResultStreamChunk.md @@ -0,0 +1,88 @@ +--- +id: ToolResultStreamChunk +title: ToolResultStreamChunk +--- + +# Interface: ToolResultStreamChunk + +Defined in: [types.ts:299](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L299) + +## Extends + +- [`BaseStreamChunk`](../BaseStreamChunk.md) + +## Properties + +### content + +```ts +content: string; +``` + +Defined in: [types.ts:302](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L302) + +*** + +### id + +```ts +id: string; +``` + +Defined in: [types.ts:274](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L274) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`id`](../BaseStreamChunk.md#id) + +*** + +### model + +```ts +model: string; +``` + +Defined in: [types.ts:275](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L275) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`model`](../BaseStreamChunk.md#model) + +*** + +### timestamp + +```ts +timestamp: number; +``` + +Defined in: [types.ts:276](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L276) + +#### Inherited from + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`timestamp`](../BaseStreamChunk.md#timestamp) + +*** + +### toolCallId + +```ts +toolCallId: string; +``` + +Defined in: [types.ts:301](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L301) + +*** + +### type + +```ts +type: "tool_result"; +``` + +Defined in: [types.ts:300](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L300) + +#### Overrides + +[`BaseStreamChunk`](../BaseStreamChunk.md).[`type`](../BaseStreamChunk.md#type) diff --git a/docs/reference/protocol.md b/docs/reference/protocol.md deleted file mode 100644 index 351d3194f..000000000 --- a/docs/reference/protocol.md +++ /dev/null @@ -1,415 +0,0 @@ -# Stream Protocol - -This document describes the structure of chunks sent from `@tanstack/ai` to `@tanstack/ai-client`, regardless of the transport mechanism (SSE, HTTP stream, direct stream, etc.). - -## Overview - -The protocol is based on a stream of JSON objects, where each object represents a chunk of data. All chunks share a common base structure and are distinguished by their `type` field. - -## Base Structure - -All chunks extend a base structure with the following required fields: - -```typescript -interface BaseStreamChunk { - type: StreamChunkType; - id: string; // Unique identifier for this chunk - model: string; // Model name that generated this chunk - timestamp: number; // Unix timestamp in milliseconds -} -``` - -## Chunk Types - -### 1. Content Chunk - -Represents incremental text content from the AI model. - -```typescript -interface ContentStreamChunk extends BaseStreamChunk { - type: "content"; - delta?: string; // The incremental content token (preferred) - content: string; // Full accumulated content so far - role?: "assistant"; -} -``` - -**Example:** - -```json -{ - "type": "content", - "id": "chunk_abc123", - "model": "gpt-4", - "timestamp": 1699123456789, - "delta": "Hello", - "content": "Hello", - "role": "assistant" -} -``` - -**Notes:** - -- `delta` is preferred over `content` for incremental updates -- `content` represents the full accumulated text up to this point -- The client should prefer `delta` when both are present - -### 2. Tool Call Chunk - -Represents incremental tool call arguments being streamed. - -```typescript -interface ToolCallStreamChunk extends BaseStreamChunk { - type: "tool_call"; - toolCall: { - id: string; // Unique identifier for this tool call - type: "function"; - function: { - name: string; // Name of the function/tool - arguments: string; // Incremental JSON arguments (may be incomplete) - }; - }; - index: number; // Zero-based index of this tool call in the current response -} -``` - -**Example:** - -```json -{ - "type": "tool_call", - "id": "chunk_def456", - "model": "gpt-4", - "timestamp": 1699123456790, - "toolCall": { - "id": "call_xyz789", - "type": "function", - "function": { - "name": "get_weather", - "arguments": "{\"location\": \"San" - } - }, - "index": 0 -} -``` - -**Notes:** - -- `arguments` is a JSON string that may be incomplete (partial JSON) -- Multiple chunks may be sent for the same tool call as arguments are streamed -- The client should accumulate and parse the arguments incrementally - -### 3. Tool Result Chunk - -Represents the result of a tool execution. - -```typescript -interface ToolResultStreamChunk extends BaseStreamChunk { - type: "tool_result"; - toolCallId: string; // ID of the tool call this result belongs to - content: string; // Result content (typically JSON stringified) -} -``` - -**Example:** - -```json -{ - "type": "tool_result", - "id": "chunk_ghi012", - "model": "gpt-4", - "timestamp": 1699123456791, - "toolCallId": "call_xyz789", - "content": "{\"temperature\": 72, \"condition\": \"sunny\"}" -} -``` - -### 4. Done Chunk - -Indicates the stream has completed. - -```typescript -interface DoneStreamChunk extends BaseStreamChunk { - type: "done"; - finishReason: "stop" | "length" | "content_filter" | "tool_calls" | null; - usage?: { - promptTokens: number; - completionTokens: number; - totalTokens: number; - }; -} -``` - -**Example:** - -```json -{ - "type": "done", - "id": "chunk_jkl345", - "model": "gpt-4", - "timestamp": 1699123456792, - "finishReason": "stop", - "usage": { - "promptTokens": 150, - "completionTokens": 75, - "totalTokens": 225 - } -} -``` - -**Notes:** - -- `finishReason: "tool_calls"` indicates the model wants to make tool calls -- `finishReason: "stop"` indicates normal completion -- `finishReason: "length"` indicates the response was truncated due to token limits -- `usage` is optional and may not be present in all cases - -### 5. Error Chunk - -Indicates an error occurred during streaming. - -```typescript -interface ErrorStreamChunk extends BaseStreamChunk { - type: "error"; - error: { - message: string; - code?: string; - }; -} -``` - -**Example:** - -```json -{ - "type": "error", - "id": "chunk_mno678", - "model": "gpt-4", - "timestamp": 1699123456793, - "error": { - "message": "Rate limit exceeded", - "code": "rate_limit_exceeded" - } -} -``` - -**Notes:** - -- When an error chunk is received, the stream should be considered terminated -- The client should handle the error and stop processing further chunks - -### 6. Approval Requested Chunk - -Indicates a tool call requires user approval before execution. - -```typescript -interface ApprovalRequestedStreamChunk extends BaseStreamChunk { - type: "approval-requested"; - toolCallId: string; // ID of the tool call requiring approval - toolName: string; // Name of the tool - input: any; // Parsed input arguments for the tool - approval: { - id: string; // Unique approval request ID - needsApproval: true; - }; -} -``` - -**Example:** - -```json -{ - "type": "approval-requested", - "id": "chunk_pqr901", - "model": "gpt-4", - "timestamp": 1699123456794, - "toolCallId": "call_xyz789", - "toolName": "send_email", - "input": { - "to": "user@example.com", - "subject": "Important Update", - "body": "Your request has been processed." - }, - "approval": { - "id": "approval_abc123", - "needsApproval": true - } -} -``` - -**Notes:** - -- This chunk is emitted when a tool has `needsApproval: true` in its definition -- The client should pause execution and wait for user approval -- The approval ID is used to respond to the approval request - -### 7. Tool Input Available Chunk - -Indicates a tool call's input is available for client-side execution. - -```typescript -interface ToolInputAvailableStreamChunk extends BaseStreamChunk { - type: "tool-input-available"; - toolCallId: string; // ID of the tool call - toolName: string; // Name of the tool - input: any; // Parsed input arguments for the tool -} -``` - -**Example:** - -```json -{ - "type": "tool-input-available", - "id": "chunk_stu234", - "model": "gpt-4", - "timestamp": 1699123456795, - "toolCallId": "call_xyz789", - "toolName": "update_ui", - "input": { - "component": "status", - "value": "completed" - } -} -``` - -**Notes:** - -- This chunk is emitted for client-side tools (tools without server-side execution) -- The client should execute the tool locally and return the result -- This is separate from approval-requested - a tool can be client-side without requiring approval - -### 8. Thinking Chunk - -Represents "thinking" or reasoning content from models that support it (e.g., Claude's thinking mode). - -```typescript -interface ThinkingStreamChunk extends BaseStreamChunk { - type: "thinking"; - delta?: string; // The incremental thinking token (preferred) - content: string; // Full accumulated thinking content so far -} -``` - -**Example:** - -```json -{ - "type": "thinking", - "id": "chunk_vwx567", - "model": "claude-3-opus", - "timestamp": 1699123456796, - "delta": "Let me", - "content": "Let me" -} -``` - -**Notes:** - -- Similar to content chunks, `delta` is preferred over `content` -- This represents internal reasoning that may not be shown to the user -- Not all models support thinking chunks - -## Complete Type Definition - -```typescript -type StreamChunkType = - | "content" - | "tool_call" - | "tool_result" - | "done" - | "error" - | "approval-requested" - | "tool-input-available" - | "thinking"; - -type StreamChunk = - | ContentStreamChunk - | ToolCallStreamChunk - | ToolResultStreamChunk - | DoneStreamChunk - | ErrorStreamChunk - | ApprovalRequestedStreamChunk - | ToolInputAvailableStreamChunk - | ThinkingStreamChunk; -``` - -## Transport Mechanisms - -The protocol is transport-agnostic. Chunks can be sent via: - -1. **Server-Sent Events (SSE)**: Each chunk is sent as `data: \n\n` -2. **HTTP Stream**: Newline-delimited JSON (NDJSON) -3. **Direct Stream**: AsyncIterable of chunk objects - -### SSE Format - -``` -data: {"type":"content","id":"chunk_1","model":"gpt-4","timestamp":1699123456789,"delta":"Hello","content":"Hello"} - -data: {"type":"content","id":"chunk_2","model":"gpt-4","timestamp":1699123456790,"delta":" world","content":"Hello world"} - -data: [DONE] -``` - -### NDJSON Format - -``` -{"type":"content","id":"chunk_1","model":"gpt-4","timestamp":1699123456789,"delta":"Hello","content":"Hello"} -{"type":"content","id":"chunk_2","model":"gpt-4","timestamp":1699123456790,"delta":" world","content":"Hello world"} -``` - -## Chunk Flow - -### Typical Text Response - -1. Multiple `content` chunks (with `delta` and `content`) -2. One `done` chunk (with `finishReason: "stop"`) - -### Tool Call Flow - -1. Multiple `tool_call` chunks (incremental arguments) -2. One `done` chunk (with `finishReason: "tool_calls"`) -3. Either: - - `approval-requested` chunk (if tool needs approval) - - `tool-input-available` chunk (if client-side tool) - - `tool_result` chunk (if server executed) -4. Continue with more content or another tool call cycle - -### Error Flow - -1. Any number of chunks -2. One `error` chunk -3. Stream terminates - -## Client Processing - -The `@tanstack/ai-client` package processes these chunks through: - -1. **Connection Adapter**: Receives chunks from transport -2. **Stream Parser**: Converts adapter format to processor format (if needed) -3. **Stream Processor**: Accumulates state, tracks tool calls, emits events -4. **Chat Client**: Manages message state and UI updates - -The processor handles: - -- Accumulating text content from `delta` or `content` fields -- Tracking tool call state (awaiting-input, input-streaming, input-complete) -- Parsing partial JSON arguments incrementally -- Emitting lifecycle events for tool calls -- Managing parallel tool calls - -## Best Practices - -1. **Always prefer `delta` over `content`** when both are present -2. **Handle partial JSON** in tool call arguments gracefully -3. **Track tool call state** using the `id` field, not the `index` -4. **Handle errors gracefully** - an error chunk terminates the stream -5. **Respect approval flow** - wait for user approval when `approval-requested` is received -6. **Use timestamps** for debugging and ordering chunks if needed - -## See Also - -- [Chat Client API](/docs/api/ai-client.md) - How to use the client -- [Streaming Guide](/docs/guides/streaming.md) - Streaming patterns and examples -- [Tool Registry](/docs/guides/tool-registry.md) - Tool execution and approval diff --git a/docs/reference/type-aliases/AgentLoopStrategy.md b/docs/reference/type-aliases/AgentLoopStrategy.md new file mode 100644 index 000000000..371cb3c32 --- /dev/null +++ b/docs/reference/type-aliases/AgentLoopStrategy.md @@ -0,0 +1,35 @@ +--- +id: AgentLoopStrategy +title: AgentLoopStrategy +--- + +# Type Alias: AgentLoopStrategy() + +```ts +type AgentLoopStrategy = (state) => boolean; +``` + +Defined in: [types.ts:226](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L226) + +Strategy function that determines whether the agent loop should continue + +## Parameters + +### state + +[`AgentLoopState`](../../interfaces/AgentLoopState.md) + +Current state of the agent loop + +## Returns + +`boolean` + +true to continue looping, false to stop + +## Example + +```typescript +// Continue for up to 5 iterations +const strategy: AgentLoopStrategy = ({ iterationCount }) => iterationCount < 5; +``` diff --git a/docs/reference/type-aliases/ChatStreamOptionsUnion.md b/docs/reference/type-aliases/ChatStreamOptionsUnion.md new file mode 100644 index 000000000..3599785a3 --- /dev/null +++ b/docs/reference/type-aliases/ChatStreamOptionsUnion.md @@ -0,0 +1,18 @@ +--- +id: ChatStreamOptionsUnion +title: ChatStreamOptionsUnion +--- + +# Type Alias: ChatStreamOptionsUnion\ + +```ts +type ChatStreamOptionsUnion = TAdapter extends AIAdapter ? Models[number] extends infer TModel ? TModel extends string ? Omit & object : never : never : never; +``` + +Defined in: [types.ts:470](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L470) + +## Type Parameters + +### TAdapter + +`TAdapter` *extends* [`AIAdapter`](../../interfaces/AIAdapter.md)\<`any`, `any`, `any`, `any`, `any`\> diff --git a/docs/reference/type-aliases/ExtractModelsFromAdapter.md b/docs/reference/type-aliases/ExtractModelsFromAdapter.md new file mode 100644 index 000000000..1e5ab2524 --- /dev/null +++ b/docs/reference/type-aliases/ExtractModelsFromAdapter.md @@ -0,0 +1,18 @@ +--- +id: ExtractModelsFromAdapter +title: ExtractModelsFromAdapter +--- + +# Type Alias: ExtractModelsFromAdapter\ + +```ts +type ExtractModelsFromAdapter = T extends AIAdapter ? M[number] : never; +``` + +Defined in: [types.ts:494](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L494) + +## Type Parameters + +### T + +`T` diff --git a/docs/reference/type-aliases/StreamChunk.md b/docs/reference/type-aliases/StreamChunk.md new file mode 100644 index 000000000..758a39737 --- /dev/null +++ b/docs/reference/type-aliases/StreamChunk.md @@ -0,0 +1,22 @@ +--- +id: StreamChunk +title: StreamChunk +--- + +# Type Alias: StreamChunk + +```ts +type StreamChunk = + | ContentStreamChunk + | ToolCallStreamChunk + | ToolResultStreamChunk + | DoneStreamChunk + | ErrorStreamChunk + | ApprovalRequestedStreamChunk + | ToolInputAvailableStreamChunk + | ThinkingStreamChunk; +``` + +Defined in: [types.ts:350](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L350) + +Chunk returned by the sdk during streaming chat completions. diff --git a/docs/reference/type-aliases/StreamChunkType.md b/docs/reference/type-aliases/StreamChunkType.md new file mode 100644 index 000000000..1fface013 --- /dev/null +++ b/docs/reference/type-aliases/StreamChunkType.md @@ -0,0 +1,20 @@ +--- +id: StreamChunkType +title: StreamChunkType +--- + +# Type Alias: StreamChunkType + +```ts +type StreamChunkType = + | "content" + | "tool_call" + | "tool_result" + | "done" + | "error" + | "approval-requested" + | "tool-input-available" + | "thinking"; +``` + +Defined in: [types.ts:262](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/types.ts#L262) diff --git a/docs/reference/variables/aiEventClient.md b/docs/reference/variables/aiEventClient.md new file mode 100644 index 000000000..80b4d1405 --- /dev/null +++ b/docs/reference/variables/aiEventClient.md @@ -0,0 +1,12 @@ +--- +id: aiEventClient +title: aiEventClient +--- + +# Variable: aiEventClient + +```ts +const aiEventClient: AiEventClient; +``` + +Defined in: [event-client.ts:357](https://github.com/TanStack/ai/blob/main/packages/typescript/ai/src/event-client.ts#L357) diff --git a/examples/cli/package.json b/examples/cli/package.json index 51263f120..c8c9afe1e 100644 --- a/examples/cli/package.json +++ b/examples/cli/package.json @@ -2,4 +2,4 @@ "name": "cli", "version": "0.0.0", "private": true -} \ No newline at end of file +} diff --git a/examples/php-slim/package.json b/examples/php-slim/package.json index d93538981..d8747401d 100644 --- a/examples/php-slim/package.json +++ b/examples/php-slim/package.json @@ -2,4 +2,4 @@ "name": "php-slim", "version": "0.0.0", "private": true -} \ No newline at end of file +} diff --git a/examples/python-fastapi/package.json b/examples/python-fastapi/package.json index 7c6dcd2a6..ec87def56 100644 --- a/examples/python-fastapi/package.json +++ b/examples/python-fastapi/package.json @@ -2,4 +2,4 @@ "name": "python-fastapi", "version": "0.0.0", "private": true -} \ No newline at end of file +} diff --git a/examples/ts-chat/package.json b/examples/ts-chat/package.json index dbbbfd2df..b76671bf3 100644 --- a/examples/ts-chat/package.json +++ b/examples/ts-chat/package.json @@ -58,4 +58,4 @@ "vitest": "^4.0.14", "web-vitals": "^5.1.0" } -} \ No newline at end of file +} diff --git a/examples/ts-chat/src/routes/api.tanchat.ts b/examples/ts-chat/src/routes/api.tanchat.ts index 855a563da..fa6adaf91 100644 --- a/examples/ts-chat/src/routes/api.tanchat.ts +++ b/examples/ts-chat/src/routes/api.tanchat.ts @@ -61,7 +61,6 @@ export const Route = createFileRoute('/api/tanchat')({ agentLoopStrategy: maxIterations(20), messages, providerOptions: { - // Enable reasoning for OpenAI (gpt-5, o3 models): // reasoning: { // effort: "medium", // or "low", "high", "minimal", "none" (for gpt-5.1) diff --git a/examples/ts-chat/vite.config.ts b/examples/ts-chat/vite.config.ts index 68b6bb4c7..809a10692 100644 --- a/examples/ts-chat/vite.config.ts +++ b/examples/ts-chat/vite.config.ts @@ -4,7 +4,7 @@ import viteReact from '@vitejs/plugin-react' import viteTsConfigPaths from 'vite-tsconfig-paths' import tailwindcss from '@tailwindcss/vite' import { nitroV2Plugin } from '@tanstack/nitro-v2-vite-plugin' -import { devtools } from "@tanstack/devtools-vite"; +import { devtools } from '@tanstack/devtools-vite' const config = defineConfig({ plugins: [ diff --git a/package.json b/package.json index f70b1b754..2fd9bfe30 100644 --- a/package.json +++ b/package.json @@ -97,4 +97,4 @@ "@tanstack/solid-ai-devtools": "workspace:*", "@tanstack/tests-adapters": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-anthropic/package.json b/packages/typescript/ai-anthropic/package.json index e8a375615..d17289033 100644 --- a/packages/typescript/ai-anthropic/package.json +++ b/packages/typescript/ai-anthropic/package.json @@ -49,4 +49,4 @@ "peerDependencies": { "@tanstack/ai": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-anthropic/src/anthropic-adapter.ts b/packages/typescript/ai-anthropic/src/anthropic-adapter.ts index ca3c09dc1..a84580f7e 100644 --- a/packages/typescript/ai-anthropic/src/anthropic-adapter.ts +++ b/packages/typescript/ai-anthropic/src/anthropic-adapter.ts @@ -2,9 +2,7 @@ import Anthropic_SDK from '@anthropic-ai/sdk' import { BaseAdapter } from '@tanstack/ai' import { ANTHROPIC_MODELS } from './model-meta' import { convertToolsToProviderFormat } from './tools/tool-converter' -import { - validateTextProviderOptions -} from './text/text-provider-options' +import { validateTextProviderOptions } from './text/text-provider-options' import type { ChatStreamOptionsUnion, EmbeddingOptions, @@ -18,7 +16,6 @@ import type { AnthropicChatModelProviderOptionsByName } from './model-meta' import type { ExternalTextProviderOptions, InternalTextProviderOptions, - } from './text/text-provider-options' import type { MessageParam } from '@anthropic-ai/sdk/resources/messages' @@ -34,8 +31,8 @@ export type AnthropicProviderOptions = ExternalTextProviderOptions type AnthropicContentBlocks = Extract> extends Array - ? Array - : never + ? Array + : never type AnthropicContentBlock = AnthropicContentBlocks extends Array ? Block : never @@ -208,9 +205,9 @@ export class Anthropic extends BaseAdapter< const value = providerOptions[key] // Anthropic expects tool_choice to be an object, not a string if (key === 'tool_choice' && typeof value === 'string') { - ; (validProviderOptions as any)[key] = { type: value } + ;(validProviderOptions as any)[key] = { type: value } } else { - ; (validProviderOptions as any)[key] = value + ;(validProviderOptions as any)[key] = value } } } @@ -408,7 +405,7 @@ export class Anthropic extends BaseAdapter< event.delta.stop_reason === 'tool_use' ? 'tool_calls' : // TODO Fix the any and map the responses properly - (event.delta.stop_reason as any), + (event.delta.stop_reason as any), usage: { promptTokens: event.usage.input_tokens || 0, diff --git a/packages/typescript/ai-anthropic/src/model-meta.ts b/packages/typescript/ai-anthropic/src/model-meta.ts index 00b005e8a..19f5079a2 100644 --- a/packages/typescript/ai-anthropic/src/model-meta.ts +++ b/packages/typescript/ai-anthropic/src/model-meta.ts @@ -65,13 +65,13 @@ const CLAUDE_SONNET_4_5 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_HAIKU_4_5 = { @@ -94,13 +94,13 @@ const CLAUDE_HAIKU_4_5 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_OPUS_4_1 = { @@ -123,13 +123,13 @@ const CLAUDE_OPUS_4_1 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_OPUS_4_5 = { @@ -152,13 +152,13 @@ const CLAUDE_OPUS_4_5 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_SONNET_4 = { @@ -181,13 +181,13 @@ const CLAUDE_SONNET_4 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_SONNET_3_7 = { @@ -209,13 +209,13 @@ const CLAUDE_SONNET_3_7 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_OPUS_4 = { @@ -238,13 +238,13 @@ const CLAUDE_OPUS_4 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_HAIKU_3_5 = { @@ -267,13 +267,13 @@ const CLAUDE_HAIKU_3_5 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > const CLAUDE_HAIKU_3 = { @@ -296,13 +296,13 @@ const CLAUDE_HAIKU_3 = { }, } as const satisfies ModelMeta< AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions > /* const ANTHROPIC_MODEL_META = { @@ -374,76 +374,76 @@ export const ANTHROPIC_MODELS = [ export type AnthropicChatModelProviderOptionsByName = { // Models with both extended_thinking and priority_tier [CLAUDE_OPUS_4_5.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_SONNET_4_5.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_HAIKU_4_5.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_OPUS_4_1.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_SONNET_4.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_SONNET_3_7.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions [CLAUDE_OPUS_4.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicThinkingOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicThinkingOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions // Model with priority_tier but NO extended_thinking [CLAUDE_HAIKU_3_5.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicServiceTierOptions & - AnthropicStopSequencesOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicServiceTierOptions & + AnthropicStopSequencesOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions // Model with neither extended_thinking nor priority_tier [CLAUDE_HAIKU_3.id]: AnthropicContainerOptions & - AnthropicContextManagementOptions & - AnthropicMCPOptions & - AnthropicStopSequencesOptions & - AnthropicToolChoiceOptions & - AnthropicSamplingOptions + AnthropicContextManagementOptions & + AnthropicMCPOptions & + AnthropicStopSequencesOptions & + AnthropicToolChoiceOptions & + AnthropicSamplingOptions } diff --git a/packages/typescript/ai-anthropic/src/text/text-provider-options.ts b/packages/typescript/ai-anthropic/src/text/text-provider-options.ts index 34429d91e..fc8720268 100644 --- a/packages/typescript/ai-anthropic/src/text/text-provider-options.ts +++ b/packages/typescript/ai-anthropic/src/text/text-provider-options.ts @@ -77,19 +77,19 @@ export interface AnthropicThinkingOptions { When enabled, responses include thinking content blocks showing Claude's thinking process before the final answer. Requires a minimum budget of 1,024 tokens and counts towards your max_tokens limit. */ thinking?: - | { - /** + | { + /** * Determines how many tokens Claude can use for its internal reasoning process. Larger budgets can enable more thorough analysis for complex problems, improving response quality. Must be ≥1024 and less than max_tokens */ - budget_tokens: number + budget_tokens: number - type: 'enabled' - } - | { - type: 'disabled' - } + type: 'enabled' + } + | { + type: 'disabled' + } } export interface AnthropicToolChoiceOptions { @@ -156,9 +156,7 @@ In nucleus sampling, we compute the cumulative distribution over all the options top_p?: number } -const validateTopPandTemperature = ( - options: InternalTextProviderOptions, -) => { +const validateTopPandTemperature = (options: InternalTextProviderOptions) => { if (options.top_p !== undefined && options.temperature !== undefined) { throw new Error('You should either set top_p or temperature, but not both.') } @@ -181,7 +179,6 @@ const validateThinking = (options: InternalTextProviderOptions) => { } } - interface MCPServer { name: string url: string @@ -199,8 +196,10 @@ const validateMaxTokens = (options: InternalTextProviderOptions) => { } } -export const validateTextProviderOptions = (options: InternalTextProviderOptions) => { +export const validateTextProviderOptions = ( + options: InternalTextProviderOptions, +) => { validateTopPandTemperature(options) validateThinking(options) validateMaxTokens(options) -} \ No newline at end of file +} diff --git a/packages/typescript/ai-anthropic/src/tools/bash-tool.ts b/packages/typescript/ai-anthropic/src/tools/bash-tool.ts index 896f912d3..7afcfa64a 100644 --- a/packages/typescript/ai-anthropic/src/tools/bash-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/bash-tool.ts @@ -6,8 +6,6 @@ import type { Tool } from '@tanstack/ai' export type BashTool = BetaToolBash20241022 | BetaToolBash20250124 - - export function convertBashToolToAdapterFormat(tool: Tool): BashTool { const metadata = tool.metadata as BashTool return metadata diff --git a/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts b/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts index 1c7c18d24..cb2dc1058 100644 --- a/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/code-execution-tool.ts @@ -8,7 +8,6 @@ export type CodeExecutionTool = | BetaCodeExecutionTool20250522 | BetaCodeExecutionTool20250825 - export function convertCodeExecutionToolToAdapterFormat( tool: Tool, ): CodeExecutionTool { diff --git a/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts b/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts index 586f05f22..bdd4110a7 100644 --- a/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/computer-use-tool.ts @@ -8,8 +8,6 @@ export type ComputerUseTool = | BetaToolComputerUse20241022 | BetaToolComputerUse20250124 - - export function convertComputerUseToolToAdapterFormat( tool: Tool, ): ComputerUseTool { diff --git a/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts b/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts index 753a8055d..401b09230 100644 --- a/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/text-editor-tool.ts @@ -10,8 +10,6 @@ export type TextEditorTool = | ToolTextEditor20250429 | ToolTextEditor20250728 - - export function convertTextEditorToolToAdapterFormat( tool: Tool, ): TextEditorTool { @@ -32,4 +30,3 @@ export function textEditorTool(config: T): Tool { metadata: config, } } - diff --git a/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts b/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts index cb4e0ddda..2aea4a09a 100644 --- a/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts +++ b/packages/typescript/ai-anthropic/src/tools/web-search-tool.ts @@ -12,10 +12,8 @@ const validateDomains = (tool: WebSearchTool) => { } } -const validateUserLocation = ( - tool: WebSearchTool, -) => { - const userLocation = tool.user_location; +const validateUserLocation = (tool: WebSearchTool) => { + const userLocation = tool.user_location if (userLocation) { if ( userLocation.city && @@ -82,6 +80,6 @@ export function webSearchTool(config: WebSearchTool): Tool { description: '', parameters: {}, }, - metadata: config + metadata: config, } } diff --git a/packages/typescript/ai-client/README.md b/packages/typescript/ai-client/README.md index ab8af8b67..7c4143074 100644 --- a/packages/typescript/ai-client/README.md +++ b/packages/typescript/ai-client/README.md @@ -1,705 +1,104 @@ -# @tanstack/ai-client - -Framework-agnostic headless client for TanStack AI chat functionality. - -## Overview - -`@tanstack/ai-client` provides a headless `ChatClient` class that manages chat state and streaming AI interactions without any framework dependencies. This makes it ideal for: - -- Building custom framework integrations -- Server-side usage -- Testing and automation -- Any JavaScript/TypeScript environment - -**Note:** The backend should use `@tanstack/ai`'s `chat()` method which **automatically handles tool execution in a loop**. The client receives tool execution events via the stream. - -## Installation - -```bash -pnpm add @tanstack/ai-client -# or -npm install @tanstack/ai-client -# or -yarn add @tanstack/ai-client -``` - -## Basic Usage - -```typescript -import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' - -// Create a client instance -const client = new ChatClient({ - connection: fetchServerSentEvents('/api/chat'), - onMessagesChange: (messages) => { - console.log('Messages updated:', messages) - }, - onLoadingChange: (isLoading) => { - console.log('Loading state:', isLoading) - }, - onErrorChange: (error) => { - console.log('Error:', error) - }, -}) - -// Send a message -await client.sendMessage('Hello, AI!') - -// Get current messages -const messages = client.getMessages() - -// Append a message manually -await client.append({ - role: 'user', - content: 'Another message', -}) - -// Reload the last response -await client.reload() - -// Stop the current response -client.stop() - -// Clear all messages -client.clear() -``` - -## Connection Adapters - -Connection adapters provide a flexible way to connect to different types of streaming backends. - -### `fetchServerSentEvents(url, options?)` - -For Server-Sent Events (SSE) format - the standard for HTTP streaming: - -```typescript -import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' - -const client = new ChatClient({ - connection: fetchServerSentEvents('/api/chat', { - headers: { - Authorization: 'Bearer token', - 'X-Custom-Header': 'value', - }, - credentials: 'include', // "omit" | "same-origin" | "include" - }), -}) - -await client.sendMessage('Hello!') -``` - -**Use when:** Your backend uses `toStreamResponse()` from `@tanstack/ai` - -**Format expected:** Server-Sent Events with `data:` prefix - -``` -data: {"type":"content","delta":"Hello","content":"Hello",...} -data: {"type":"content","delta":" world","content":"Hello world",...} -data: {"type":"done","finishReason":"stop",...} -data: [DONE] -``` - -### `fetchHttpStream(url, options?)` - -For raw HTTP streaming with newline-delimited JSON: - -```typescript -import { ChatClient, fetchHttpStream } from '@tanstack/ai-client' - -const client = new ChatClient({ - connection: fetchHttpStream('/api/chat', { - headers: { Authorization: 'Bearer token' }, - }), -}) - -await client.sendMessage('Hello!') -``` - -**Use when:** Your backend streams newline-delimited JSON directly - -**Format expected:** Newline-delimited JSON - -``` -{"type":"content","delta":"Hello","content":"Hello",...} -{"type":"content","delta":" world","content":"Hello world",...} -{"type":"done","finishReason":"stop",...} -``` - -### `stream(factory)` - -For direct async iterables - use with server functions or in-memory streams: - -```typescript -import { ChatClient, stream } from '@tanstack/ai-client' -import { chat } from '@tanstack/ai' -import { openai } from '@tanstack/ai-openai' - -const client = new ChatClient({ - connection: stream((messages, data) => { - // Return an async iterable directly - return chat({ - adapter: openai(), - model: 'gpt-4o', - messages, - }) - }), -}) - -await client.sendMessage('Hello!') -``` - -**Use when:** - -- TanStack Start server functions -- Direct access to streaming functions -- Testing with mock streams - -**Benefits:** - -- ✅ No HTTP overhead -- ✅ Perfect for server components -- ✅ Easy to test with mocks - -### Custom Adapters - -You can create custom connection adapters for special scenarios: - -```typescript -import type { ConnectionAdapter } from '@tanstack/ai-client' - -// Example: WebSocket connection adapter -function createWebSocketAdapter(url: string): ConnectionAdapter { - return { - async *connect(messages, data, abortSignal) { - const ws = new WebSocket(url) - - // Handle abort signal - if (abortSignal) { - abortSignal.addEventListener('abort', () => { - ws.close() - }) - } - - return new Promise((resolve, reject) => { - ws.onopen = () => { - ws.send(JSON.stringify({ messages, data })) - } - - ws.onmessage = (event) => { - // Check if aborted before processing - if (abortSignal?.aborted) { - ws.close() - return - } - - const chunk = JSON.parse(event.data) - // Yield chunks as they arrive - } - - ws.onerror = (error) => reject(error) - ws.onclose = () => resolve() - }) - }, - } -} - -// Use it -const client = new ChatClient({ - connection: createWebSocketAdapter('wss://api.example.com/chat'), -}) -``` - -## Stream Processor - -The stream processor provides configurable text chunking strategies to control UI update frequency and improve user experience. - -### Default Behavior - -By default, `ChatClient` uses immediate chunking (every chunk updates the UI): - -```typescript -import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' - -const client = new ChatClient({ - connection: fetchServerSentEvents('/api/chat'), - onMessagesChange: (messages) => { - console.log('Messages updated:', messages) - }, -}) - -await client.sendMessage('Hello!') -``` - -### Using Chunk Strategies - -#### Punctuation Strategy - -Update the UI only when punctuation is encountered (smoother for reading): - -```typescript -import { - ChatClient, - fetchServerSentEvents, - PunctuationStrategy, -} from '@tanstack/ai-client' - -const client = new ChatClient({ - connection: fetchServerSentEvents('/api/chat'), - streamProcessor: { - chunkStrategy: new PunctuationStrategy(), - }, - onMessagesChange: (messages) => { - console.log('Messages updated:', messages) - }, -}) - -await client.sendMessage('Tell me a story.') -``` - -#### Batch Strategy - -Update the UI every N chunks (reduces update frequency): - -```typescript -import { - ChatClient, - fetchServerSentEvents, - BatchStrategy, -} from '@tanstack/ai-client' - -const client = new ChatClient({ - connection: fetchServerSentEvents('/api/chat'), - streamProcessor: { - chunkStrategy: new BatchStrategy(10), // Update every 10 chunks - }, - onMessagesChange: (messages) => { - console.log('Messages updated:', messages) - }, -}) - -await client.sendMessage('Explain quantum physics.') -``` - -#### Combining Strategies - -Use `CompositeStrategy` to combine multiple strategies (OR logic): - -```typescript -import { - ChatClient, - fetchServerSentEvents, - CompositeStrategy, - PunctuationStrategy, - BatchStrategy, -} from '@tanstack/ai-client' - -const client = new ChatClient({ - connection: fetchServerSentEvents('/api/chat'), - streamProcessor: { - chunkStrategy: new CompositeStrategy([ - new PunctuationStrategy(), // Update on punctuation - new BatchStrategy(20), // OR every 20 chunks - ]), - }, - onMessagesChange: (messages) => { - console.log('Messages updated:', messages) - }, -}) -``` - -#### Custom Chunk Strategy - -Create your own strategy for fine-grained control: - -```typescript -import { - ChatClient, - fetchServerSentEvents, - type ChunkStrategy, -} from '@tanstack/ai-client' - -class CustomStrategy implements ChunkStrategy { - private wordCount = 0 - - shouldEmit(chunk: string, accumulated: string): boolean { - // Count words in the chunk - const words = chunk.split(/\s+/).filter((w) => w.length > 0) - this.wordCount += words.length - - // Emit every 5 words - if (this.wordCount >= 5) { - this.wordCount = 0 - return true - } - return false - } - - reset(): void { - this.wordCount = 0 - } -} - -const client = new ChatClient({ - connection: fetchServerSentEvents('/api/chat'), - streamProcessor: { - chunkStrategy: new CustomStrategy(), - }, - onMessagesChange: (messages) => { - console.log('Messages updated:', messages) - }, -}) -``` - -### Built-in Strategies - -| Strategy | When it Emits | Best For | -| ----------------------- | --------------------------------- | ------------------------- | -| `ImmediateStrategy` | Every chunk | Default, real-time feel | -| `PunctuationStrategy` | When chunk contains `. , ! ? ; :` | Natural reading flow | -| `BatchStrategy(N)` | Every N chunks | Reducing update frequency | -| `WordBoundaryStrategy` | When chunk ends with whitespace | Preventing word cuts | -| `DebounceStrategy(ms)` | After ms of silence | High-frequency streams | -| `CompositeStrategy([])` | When ANY sub-strategy emits (OR) | Combining multiple rules | -| Custom `ChunkStrategy` | Your custom `shouldEmit()` logic | Fine-grained control | - -### Parallel Tool Calls - -The stream processor automatically handles multiple parallel tool calls: - -```typescript -import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' - -const client = new ChatClient({ - connection: fetchServerSentEvents('/api/chat'), - streamProcessor: { - // Use any chunk strategy - }, - onMessagesChange: (messages) => { - const lastMessage = messages[messages.length - 1] - if (lastMessage.toolCalls) { - console.log('Tool calls in progress:', lastMessage.toolCalls) - // Can have multiple tool calls streaming simultaneously! - } - }, -}) - -await client.sendMessage('Get weather in Paris and Tokyo') -``` - -### Custom Stream Parser - -For handling non-standard stream formats: - -```typescript -import { - ChatClient, - stream, - type StreamParser, - type StreamChunk, -} from '@tanstack/ai-client' - -class CustomParser implements StreamParser { - async *parse(source: AsyncIterable): AsyncIterable { - for await (const chunk of source) { - // Custom parsing logic for your stream format - if (chunk.message) { - yield { - type: 'text', - content: chunk.message, - } - } - - if (chunk.tool) { - yield { - type: 'tool-call-delta', - toolCallIndex: chunk.tool.index, - toolCall: { - id: chunk.tool.id, - function: { - name: chunk.tool.name, - arguments: chunk.tool.args, - }, - }, - } - } - } - } -} - -const client = new ChatClient({ - connection: stream(async (messages) => { - // Your custom stream source - return customStreamGenerator(messages) - }), - streamProcessor: { - parser: new CustomParser(), - }, - onMessagesChange: (messages) => { - console.log('Messages updated:', messages) - }, -}) -``` - -## Working with Streams Directly - -Connection adapters return async iterables of `StreamChunk` objects, which you can iterate over directly if needed: - -```typescript -import type { StreamChunk } from '@tanstack/ai' -import { fetchServerSentEvents } from '@tanstack/ai-client' - -const connection = fetchServerSentEvents('/api/chat') - -// Get the stream directly -const stream = connection.connect(messages, data) - -// Iterate over chunks -for await (const chunk of stream) { - if (chunk.type === 'content') { - console.log('Content:', chunk.content) - } else if (chunk.type === 'tool_call') { - console.log('Tool call:', chunk.toolCall) - } -} -``` - -### Custom Connection Adapter Example - -You can create custom connection adapters for any transport protocol. Here's a WebSocket example: - -```typescript -import type { ConnectionAdapter, StreamChunk } from '@tanstack/ai-client' - -function createWebSocketAdapter(url: string): ConnectionAdapter { - return { - async *connect(messages, data, abortSignal) { - const ws = new WebSocket(url) - - // Handle abort signal - if (abortSignal) { - abortSignal.addEventListener('abort', () => { - ws.close() - }) - } - - // Wait for connection - await new Promise((resolve, reject) => { - ws.onopen = resolve - ws.onerror = reject - }) - - // Send messages - ws.send(JSON.stringify({ messages, data })) - - // Yield chunks as they arrive - const queue: StreamChunk[] = [] - let resolver: ((chunk: StreamChunk | null) => void) | null = null - - ws.onmessage = (event) => { - try { - const chunk: StreamChunk = JSON.parse(event.data) - if (abortSignal?.aborted) { - ws.close() - return - } - if (resolver) { - resolver(chunk) - resolver = null - } else { - queue.push(chunk) - } - } catch (error) { - console.error('Failed to parse WebSocket message:', error) - } - } - - ws.onclose = () => { - if (resolver) { - resolver(null) - } - } - - try { - while (true) { - if (queue.length > 0) { - yield queue.shift()! - } else { - const chunk = await new Promise((resolve) => { - resolver = resolve - }) - if (chunk === null) break - yield chunk - } - } - } finally { - ws.close() - } - }, - } -} - -// Use it -const client = new ChatClient({ - connection: createWebSocketAdapter('wss://api.example.com/chat'), -}) -``` - -## API Reference - -### `ChatClient` - -The main class for managing chat interactions. - -#### Constructor Options - -```typescript -interface ChatClientOptions { - // Connection adapter (required) - connection: ConnectionAdapter - - // Initial messages - initialMessages?: UIMessage[] - - // Unique chat identifier - id?: string - - // Callbacks - onResponse?: (response: Response) => void | Promise - onChunk?: (chunk: StreamChunk) => void - onFinish?: (message: UIMessage) => void - onError?: (error: Error) => void - onMessagesChange?: (messages: UIMessage[]) => void - onLoadingChange?: (isLoading: boolean) => void - onErrorChange?: (error: Error | undefined) => void - - // Stream processor configuration - streamProcessor?: { - chunkStrategy?: ChunkStrategy - parser?: StreamParser - } - - // Request configuration (for legacy api option) - api?: string - headers?: Record | Headers - body?: Record - credentials?: 'omit' | 'same-origin' | 'include' - fetch?: typeof fetch -} -``` - -#### Methods - -- `sendMessage(content: string): Promise` - Send a text message -- `append(message: Message | UIMessage): Promise` - Append any message -- `reload(): Promise` - Reload the last assistant response -- `stop(): void` - Stop the current streaming response -- `clear(): void` - Clear all messages -- `getMessages(): UIMessage[]` - Get current messages -- `getIsLoading(): boolean` - Get loading state -- `getError(): Error | undefined` - Get current error -- `setMessagesManually(messages: UIMessage[]): void` - Manually set messages - -## Framework Integration - -This package is used by framework-specific packages like `@tanstack/ai-react`, which provide hooks and components for their respective frameworks. - -### Example: Custom React Hook - -```typescript -import { ChatClient, fetchServerSentEvents } from '@tanstack/ai-client' -import { useState, useRef, useCallback } from 'react' - -function useCustomChat(options) { - const [messages, setMessages] = useState([]) - const [isLoading, setIsLoading] = useState(false) - - const clientRef = useRef(null) - - if (!clientRef.current) { - clientRef.current = new ChatClient({ - connection: fetchServerSentEvents('/api/chat'), - ...options, - onMessagesChange: setMessages, - onLoadingChange: setIsLoading, - }) - } - - const sendMessage = useCallback((content) => { - return clientRef.current.sendMessage(content) - }, []) - - return { messages, isLoading, sendMessage } -} -``` - -### With React - -All connection adapters work seamlessly with `useChat`: - -```typescript -import { useChat } from "@tanstack/ai-react"; -import { fetchServerSentEvents, fetchHttpStream, stream } from "@tanstack/ai-client"; - -// SSE connection -function ChatSSE() { - const chat = useChat({ - connection: fetchServerSentEvents("/api/chat"), - }); - - return ; -} - -// HTTP stream connection -function ChatHTTP() { - const chat = useChat({ - connection: fetchHttpStream("/api/chat"), - }); - - return ; -} - -// Direct stream connection (server functions) -function ChatDirect() { - const chat = useChat({ - connection: stream((messages) => myServerFunction({ messages })), - }); - - return ; -} -``` - -## Backend Example - -Your backend should use `@tanstack/ai`'s `chat()` method with automatic tool execution: - -```typescript -import { chat, toStreamResponse } from '@tanstack/ai' -import { openai } from '@tanstack/ai-openai' - -export async function POST(request: Request) { - const { messages } = await request.json() - - // chat() automatically executes tools in a loop - const stream = chat({ - adapter: openai(), - model: 'gpt-4o', - messages, - tools: [weatherTool], // Tools are auto-executed when called - agentLoopStrategy: maxIterations(5), // Control loop behavior - }) - - // Stream includes tool_call and tool_result chunks - return toStreamResponse(stream) -} -``` - -The client will receive: - -- `content` chunks - text from the model -- `tool_call` chunks - when model calls a tool (auto-executed by SDK) -- `tool_result` chunks - results from tool execution (auto-emitted by SDK) -- `done` chunk - conversation complete - -## License - -MIT +
+ +
+ +
+ +
+ + + + + + + + + +
+ + + +
+ +### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) +
+ +# TanStack AI + +A powerful, type-safe AI SDK for building AI-powered applications. + +- Provider-agnostic adapters (OpenAI, Anthropic, Gemini, Ollama, etc.) +- Chat completion, streaming, and agent loop strategies +- Headless chat state management with adapters (SSE, HTTP stream, custom) +- Type-safe tools with server/client execution + +### Read the docs → + +## Get Involved + +- We welcome issues and pull requests! +- Participate in [GitHub discussions](https://github.com/TanStack/ai/discussions) +- Chat with the community on [Discord](https://discord.com/invite/WrRKjPJ) +- See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions + +## Partners + + + + + + +
+ + + + + CodeRabbit + + + + + + + + Cloudflare + + +
+ +
+AI & you? +

+We're looking for TanStack AI Partners to join our mission! Partner with us to push the boundaries of TanStack AI and build amazing things together. +

+LET'S CHAT +
+ +## Explore the TanStack Ecosystem + +- TanStack Config – Tooling for JS/TS packages +- TanStack DB – Reactive sync client store +- TanStack Devtools – Unified devtools panel +- TanStack Form – Type‑safe form state +- TanStack Pacer – Debouncing, throttling, batching +- TanStack Query – Async state & caching +- TanStack Ranger – Range & slider primitives +- TanStack Router – Type‑safe routing, caching & URL state +- TanStack Start – Full‑stack SSR & streaming +- TanStack Store – Reactive data store +- TanStack Table – Headless datagrids +- TanStack Virtual – Virtualized rendering + +… and more at TanStack.com » + + diff --git a/packages/typescript/ai-client/package.json b/packages/typescript/ai-client/package.json index aaa6bac23..bd16433d6 100644 --- a/packages/typescript/ai-client/package.json +++ b/packages/typescript/ai-client/package.json @@ -48,4 +48,4 @@ "@vitest/coverage-v8": "4.0.14", "vite": "^7.2.4" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-client/src/message-converters.ts b/packages/typescript/ai-client/src/message-converters.ts index e9f4cbbce..5595e9800 100644 --- a/packages/typescript/ai-client/src/message-converters.ts +++ b/packages/typescript/ai-client/src/message-converters.ts @@ -64,20 +64,20 @@ export function uiMessageToModelMessages( const toolCalls = toolCallParts.length > 0 ? toolCallParts - .filter( - (p) => - p.state === 'input-complete' || - p.state === 'approval-responded' || - p.output !== undefined, // Include if has output (client tool result) - ) - .map((p) => ({ - id: p.id, - type: 'function' as const, - function: { - name: p.name, - arguments: p.arguments, - }, - })) + .filter( + (p) => + p.state === 'input-complete' || + p.state === 'approval-responded' || + p.output !== undefined, // Include if has output (client tool result) + ) + .map((p) => ({ + id: p.id, + type: 'function' as const, + function: { + name: p.name, + arguments: p.arguments, + }, + })) : undefined // Create the main message diff --git a/packages/typescript/ai-client/tests/chat-client-abort.test.ts b/packages/typescript/ai-client/tests/chat-client-abort.test.ts index d7f7e8b61..3b77bedd9 100644 --- a/packages/typescript/ai-client/tests/chat-client-abort.test.ts +++ b/packages/typescript/ai-client/tests/chat-client-abort.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { ChatClient } from '../src/chat-client' -import type { ConnectionAdapter, } from '../src/connection-adapters' -import type { StreamChunk } from "@tanstack/ai" +import type { ConnectionAdapter } from '../src/connection-adapters' +import type { StreamChunk } from '@tanstack/ai' describe('ChatClient - Abort Signal Handling', () => { let mockAdapter: ConnectionAdapter diff --git a/packages/typescript/ai-client/tests/connection-adapters.test.ts b/packages/typescript/ai-client/tests/connection-adapters.test.ts index 59ff68af9..8db8907e2 100644 --- a/packages/typescript/ai-client/tests/connection-adapters.test.ts +++ b/packages/typescript/ai-client/tests/connection-adapters.test.ts @@ -133,7 +133,7 @@ describe('connection-adapters', () => { it('should handle malformed JSON gracefully', async () => { const consoleWarnSpy = vi .spyOn(console, 'warn') - .mockImplementation(() => { }) + .mockImplementation(() => {}) const mockReader = { read: vi @@ -358,7 +358,7 @@ describe('connection-adapters', () => { it('should handle malformed JSON gracefully', async () => { const consoleWarnSpy = vi .spyOn(console, 'warn') - .mockImplementation(() => { }) + .mockImplementation(() => {}) const mockReader = { read: vi diff --git a/packages/typescript/ai-client/tests/events.test.ts b/packages/typescript/ai-client/tests/events.test.ts index ea4245020..12df82d5f 100644 --- a/packages/typescript/ai-client/tests/events.test.ts +++ b/packages/typescript/ai-client/tests/events.test.ts @@ -1,8 +1,6 @@ -import { beforeEach, describe, expect, it, vi, } from 'vitest' +import { beforeEach, describe, expect, it, vi } from 'vitest' import { aiEventClient } from '@tanstack/ai/event-client' -import { - DefaultChatClientEventEmitter, -} from '../src/events' +import { DefaultChatClientEventEmitter } from '../src/events' import type { UIMessage } from '../src/types' // Mock the event client diff --git a/packages/typescript/ai-client/tests/test-utils.ts b/packages/typescript/ai-client/tests/test-utils.ts index 464eed88f..487046752 100644 --- a/packages/typescript/ai-client/tests/test-utils.ts +++ b/packages/typescript/ai-client/tests/test-utils.ts @@ -171,7 +171,7 @@ export function createToolCallChunks( if (includeToolInputAvailable) { let parsedInput: any try { - parsedInput = JSON.parse(toolCall?.arguments ?? "") + parsedInput = JSON.parse(toolCall?.arguments ?? '') } catch { parsedInput = toolCall?.arguments } diff --git a/packages/typescript/ai-devtools/README.md b/packages/typescript/ai-devtools/README.md new file mode 100644 index 000000000..7c4143074 --- /dev/null +++ b/packages/typescript/ai-devtools/README.md @@ -0,0 +1,104 @@ +
+ +
+ +
+ +
+ + + + + + + + + +
+ + + +
+ +### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) +
+ +# TanStack AI + +A powerful, type-safe AI SDK for building AI-powered applications. + +- Provider-agnostic adapters (OpenAI, Anthropic, Gemini, Ollama, etc.) +- Chat completion, streaming, and agent loop strategies +- Headless chat state management with adapters (SSE, HTTP stream, custom) +- Type-safe tools with server/client execution + +### Read the docs → + +## Get Involved + +- We welcome issues and pull requests! +- Participate in [GitHub discussions](https://github.com/TanStack/ai/discussions) +- Chat with the community on [Discord](https://discord.com/invite/WrRKjPJ) +- See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions + +## Partners + + + + + + +
+ + + + + CodeRabbit + + + + + + + + Cloudflare + + +
+ +
+AI & you? +

+We're looking for TanStack AI Partners to join our mission! Partner with us to push the boundaries of TanStack AI and build amazing things together. +

+LET'S CHAT +
+ +## Explore the TanStack Ecosystem + +- TanStack Config – Tooling for JS/TS packages +- TanStack DB – Reactive sync client store +- TanStack Devtools – Unified devtools panel +- TanStack Form – Type‑safe form state +- TanStack Pacer – Debouncing, throttling, batching +- TanStack Query – Async state & caching +- TanStack Ranger – Range & slider primitives +- TanStack Router – Type‑safe routing, caching & URL state +- TanStack Start – Full‑stack SSR & streaming +- TanStack Store – Reactive data store +- TanStack Table – Headless datagrids +- TanStack Virtual – Virtualized rendering + +… and more at TanStack.com » + + diff --git a/packages/typescript/ai-devtools/src/store/ai-store.ts b/packages/typescript/ai-devtools/src/store/ai-store.ts index 984f95a3e..600b9ffba 100644 --- a/packages/typescript/ai-devtools/src/store/ai-store.ts +++ b/packages/typescript/ai-devtools/src/store/ai-store.ts @@ -1,8 +1,2 @@ // Re-export types from ai-context for backward compatibility -export type { - ToolCall, - Message, - Chunk, - Conversation, -} from './ai-context' - +export type { ToolCall, Message, Chunk, Conversation } from './ai-context' diff --git a/packages/typescript/ai-gemini/README.md b/packages/typescript/ai-gemini/README.md new file mode 100644 index 000000000..7c4143074 --- /dev/null +++ b/packages/typescript/ai-gemini/README.md @@ -0,0 +1,104 @@ +
+ +
+ +
+ +
+ + + + + + + + + +
+ + + +
+ +### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) +
+ +# TanStack AI + +A powerful, type-safe AI SDK for building AI-powered applications. + +- Provider-agnostic adapters (OpenAI, Anthropic, Gemini, Ollama, etc.) +- Chat completion, streaming, and agent loop strategies +- Headless chat state management with adapters (SSE, HTTP stream, custom) +- Type-safe tools with server/client execution + +### Read the docs → + +## Get Involved + +- We welcome issues and pull requests! +- Participate in [GitHub discussions](https://github.com/TanStack/ai/discussions) +- Chat with the community on [Discord](https://discord.com/invite/WrRKjPJ) +- See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions + +## Partners + + + + + + +
+ + + + + CodeRabbit + + + + + + + + Cloudflare + + +
+ +
+AI & you? +

+We're looking for TanStack AI Partners to join our mission! Partner with us to push the boundaries of TanStack AI and build amazing things together. +

+LET'S CHAT +
+ +## Explore the TanStack Ecosystem + +- TanStack Config – Tooling for JS/TS packages +- TanStack DB – Reactive sync client store +- TanStack Devtools – Unified devtools panel +- TanStack Form – Type‑safe form state +- TanStack Pacer – Debouncing, throttling, batching +- TanStack Query – Async state & caching +- TanStack Ranger – Range & slider primitives +- TanStack Router – Type‑safe routing, caching & URL state +- TanStack Start – Full‑stack SSR & streaming +- TanStack Store – Reactive data store +- TanStack Table – Headless datagrids +- TanStack Virtual – Virtualized rendering + +… and more at TanStack.com » + + diff --git a/packages/typescript/ai-gemini/package.json b/packages/typescript/ai-gemini/package.json index 1cb3d648f..5ec5c90f5 100644 --- a/packages/typescript/ai-gemini/package.json +++ b/packages/typescript/ai-gemini/package.json @@ -50,4 +50,4 @@ "peerDependencies": { "@tanstack/ai": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-gemini/src/gemini-adapter.ts b/packages/typescript/ai-gemini/src/gemini-adapter.ts index fdd0685f7..29ece9834 100644 --- a/packages/typescript/ai-gemini/src/gemini-adapter.ts +++ b/packages/typescript/ai-gemini/src/gemini-adapter.ts @@ -57,9 +57,7 @@ export class GeminiAdapter extends BaseAdapter< }) } - async *chatStream( - options: ChatOptions, - ): AsyncIterable { + async *chatStream(options: ChatOptions): AsyncIterable { // Map common options to Gemini format const mappedOptions = this.mapCommonOptionsToGemini(options) @@ -94,7 +92,6 @@ export class GeminiAdapter extends BaseAdapter< if (!summary && typeof result.text === 'string') { summary = result.text - } const promptTokens = this.estimateTokens(prompt) @@ -237,10 +234,10 @@ export class GeminiAdapter extends BaseAdapter< finishReason: mappedFinishReason as any, usage: chunk.usageMetadata ? { - promptTokens: chunk.usageMetadata.promptTokenCount ?? 0, - completionTokens: chunk.usageMetadata.thoughtsTokenCount ?? 0, - totalTokens: chunk.usageMetadata.totalTokenCount ?? 0, - } + promptTokens: chunk.usageMetadata.promptTokenCount ?? 0, + completionTokens: chunk.usageMetadata.thoughtsTokenCount ?? 0, + totalTokens: chunk.usageMetadata.totalTokenCount ?? 0, + } : undefined, } } @@ -402,10 +399,10 @@ export class GeminiAdapter extends BaseAdapter< finishReason: mappedFinishReason as any, usage: chunk.usageMetadata ? { - promptTokens: chunk.usageMetadata.promptTokenCount ?? 0, - completionTokens: chunk.usageMetadata.thoughtsTokenCount ?? 0, - totalTokens: chunk.usageMetadata.totalTokenCount ?? 0, - } + promptTokens: chunk.usageMetadata.promptTokenCount ?? 0, + completionTokens: chunk.usageMetadata.thoughtsTokenCount ?? 0, + totalTokens: chunk.usageMetadata.totalTokenCount ?? 0, + } : undefined, } } @@ -480,9 +477,7 @@ export class GeminiAdapter extends BaseAdapter< * Maps common options to Gemini-specific format * Handles translation of normalized options to Gemini's API format */ - private mapCommonOptionsToGemini( - options: ChatOptions, - ) { + private mapCommonOptionsToGemini(options: ChatOptions) { const providerOpts = options.providerOptions const requestOptions: GenerateContentParameters = { model: options.model, diff --git a/packages/typescript/ai-gemini/src/index.ts b/packages/typescript/ai-gemini/src/index.ts index 80c85152d..38b8359e4 100644 --- a/packages/typescript/ai-gemini/src/index.ts +++ b/packages/typescript/ai-gemini/src/index.ts @@ -5,4 +5,4 @@ export type { GeminiStructuredOutputOptions, GeminiThinkingOptions, } from './text/text-provider-options' -export type { GoogleGeminiTool } from "./tools/index"; \ No newline at end of file +export type { GoogleGeminiTool } from './tools/index' diff --git a/packages/typescript/ai-gemini/src/model-meta.ts b/packages/typescript/ai-gemini/src/model-meta.ts index 7d40303a2..86017cfd9 100644 --- a/packages/typescript/ai-gemini/src/model-meta.ts +++ b/packages/typescript/ai-gemini/src/model-meta.ts @@ -76,11 +76,11 @@ const GEMINI_3_PRO = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_5_PRO = { @@ -114,11 +114,11 @@ const GEMINI_2_5_PRO = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > /* const GEMINI_2_5_PRO_TTS = { @@ -177,11 +177,11 @@ const GEMINI_2_5_FLASH = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_5_FLASH_PREVIEW = { @@ -214,11 +214,11 @@ const GEMINI_2_5_FLASH_PREVIEW = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > /* const GEMINI_2_5_FLASH_IMAGE = { @@ -341,11 +341,11 @@ const GEMINI_2_5_FLASH_LITE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_5_FLASH_LITE_PREVIEW = { @@ -377,11 +377,11 @@ const GEMINI_2_5_FLASH_LITE_PREVIEW = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions > const GEMINI_2_FLASH = { @@ -413,10 +413,10 @@ const GEMINI_2_FLASH = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions > /* const GEMINI_2_FLASH_IMAGE = { @@ -508,10 +508,10 @@ const GEMINI_2_FLASH_LITE = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions > /* const IMAGEN_4_GENERATE = { @@ -736,9 +736,9 @@ const GEMINI_EMBEDDING = { }, } as const satisfies ModelMeta< GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions > /* const GEMINI_MODEL_META = { @@ -768,7 +768,6 @@ const GEMINI_EMBEDDING = { [GEMINI_EMBEDDING.name]: GEMINI_EMBEDDING, } as const */ - export const GEMINI_MODELS = [ GEMINI_3_PRO.name, GEMINI_2_5_PRO.name, @@ -812,50 +811,50 @@ export const GEMINI_EMBEDDING_MODELS = [GEMINI_EMBEDDING.name] as const export type GeminiChatModelProviderOptionsByName = { // Models with thinking and structured output support [GEMINI_3_PRO.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_PRO.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_FLASH.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_FLASH_PREVIEW.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_FLASH_LITE.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions [GEMINI_2_5_FLASH_LITE_PREVIEW.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions & - GeminiThinkingOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions & + GeminiThinkingOptions // Models with structured output but no thinking support [GEMINI_2_FLASH.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions [GEMINI_2_FLASH_LITE.name]: GeminiToolConfigOptions & - GeminiSafetyOptions & - GeminiGenerationConfigOptions & - GeminiCachedContentOptions & - GeminiStructuredOutputOptions + GeminiSafetyOptions & + GeminiGenerationConfigOptions & + GeminiCachedContentOptions & + GeminiStructuredOutputOptions } diff --git a/packages/typescript/ai-gemini/src/text/text-provider-options.ts b/packages/typescript/ai-gemini/src/text/text-provider-options.ts index 708075c0d..fe9373b8a 100644 --- a/packages/typescript/ai-gemini/src/text/text-provider-options.ts +++ b/packages/typescript/ai-gemini/src/text/text-provider-options.ts @@ -114,57 +114,57 @@ Caution: A negative penalty will encourage the model to reuse tokens proportiona Valid values are: de-DE, en-AU, en-GB, en-IN, en-US, es-US, fr-FR, hi-IN, pt-BR, ar-XA, es-ES, fr-CA, id-ID, it-IT, ja-JP, tr-TR, vi-VN, bn-IN, gu-IN, kn-IN, ml-IN, mr-IN, ta-IN, te-IN, nl-NL, ko-KR, cmn-CN, pl-PL, ru-RU, and th-TH. */ languageCode?: - | 'de-DE' - | 'en-AU' - | 'en-GB' - | 'en-IN' - | 'en-US' - | 'es-US' - | 'fr-FR' - | 'hi-IN' - | 'pt-BR' - | 'ar-XA' - | 'es-ES' - | 'fr-CA' - | 'id-ID' - | 'it-IT' - | 'ja-JP' - | 'tr-TR' - | 'vi-VN' - | 'bn-IN' - | 'gu-IN' - | 'kn-IN' - | 'ml-IN' - | 'mr-IN' - | 'ta-IN' - | 'te-IN' - | 'nl-NL' - | 'ko-KR' - | 'cmn-CN' - | 'pl-PL' - | 'ru-RU' - | 'th-TH' + | 'de-DE' + | 'en-AU' + | 'en-GB' + | 'en-IN' + | 'en-US' + | 'es-US' + | 'fr-FR' + | 'hi-IN' + | 'pt-BR' + | 'ar-XA' + | 'es-ES' + | 'fr-CA' + | 'id-ID' + | 'it-IT' + | 'ja-JP' + | 'tr-TR' + | 'vi-VN' + | 'bn-IN' + | 'gu-IN' + | 'kn-IN' + | 'ml-IN' + | 'mr-IN' + | 'ta-IN' + | 'te-IN' + | 'nl-NL' + | 'ko-KR' + | 'cmn-CN' + | 'pl-PL' + | 'ru-RU' + | 'th-TH' } /** * Config for image generation. An error will be returned if this field is set for models that don't support these config options. */ imageConfig?: { aspectRatio?: - | '1:1' - | '2:3' - | '3:2' - | '3:4' - | '4:3' - | '9:16' - | '16:9' - | '21:9' + | '1:1' + | '2:3' + | '3:2' + | '3:4' + | '4:3' + | '9:16' + | '16:9' + | '21:9' } /** * If specified, the media resolution specified will be used. */ mediaResolution?: MediaResolution } & GeminiThinkingOptions & - GeminiStructuredOutputOptions + GeminiStructuredOutputOptions } export interface GeminiCachedContentOptions { diff --git a/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts b/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts index a525829fd..f7eadd93d 100644 --- a/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/code-execution-tool.ts @@ -1,6 +1,6 @@ import type { Tool } from '@tanstack/ai' -export interface CodeExecutionTool { } +export interface CodeExecutionTool {} export function convertCodeExecutionToolToAdapterFormat(_tool: Tool) { return { diff --git a/packages/typescript/ai-gemini/src/tools/file-search-tool.ts b/packages/typescript/ai-gemini/src/tools/file-search-tool.ts index f77f5f4cc..2c3816a10 100644 --- a/packages/typescript/ai-gemini/src/tools/file-search-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/file-search-tool.ts @@ -6,7 +6,7 @@ export type FileSearchTool = FileSearch export function convertFileSearchToolToAdapterFormat(tool: Tool) { const metadata = tool.metadata as FileSearchTool return { - fileSearch: metadata + fileSearch: metadata, } } @@ -18,6 +18,6 @@ export function fileSearchTool(config: FileSearchTool): Tool { description: '', parameters: {}, }, - metadata: config + metadata: config, } } diff --git a/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts b/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts index 35cdc3dfc..5840c94da 100644 --- a/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/function-declaration-tool.ts @@ -1,10 +1,8 @@ -import type { FunctionDeclaration } from "@google/genai" +import type { FunctionDeclaration } from '@google/genai' export type FunctionDeclarationTool = FunctionDeclaration -const validateFunctionDeclarationTool = ( - tool: FunctionDeclarationTool, -) => { +const validateFunctionDeclarationTool = (tool: FunctionDeclarationTool) => { const nameRegex = /^[a-zA-Z0-9_:.-]{1,64}$/ const valid = nameRegex.test(tool.name!) if (!valid) { diff --git a/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts b/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts index bd70a5423..00305f6dd 100644 --- a/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-maps-tool.ts @@ -6,7 +6,7 @@ export type GoogleMapsTool = GoogleMaps export function convertGoogleMapsToolToAdapterFormat(tool: Tool) { const metadata = tool.metadata as GoogleMapsTool return { - googleMaps: metadata + googleMaps: metadata, } } @@ -18,6 +18,6 @@ export function googleMapsTool(config?: GoogleMapsTool): Tool { description: '', parameters: {}, }, - metadata: config + metadata: config, } } diff --git a/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts b/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts index be8f3443a..4f235d70c 100644 --- a/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-search-retriveal-tool.ts @@ -6,7 +6,7 @@ export type GoogleSearchRetrievalTool = GoogleSearchRetrieval export function convertGoogleSearchRetrievalToolToAdapterFormat(tool: Tool) { const metadata = tool.metadata as GoogleSearchRetrievalTool return { - googleSearchRetrieval: metadata + googleSearchRetrieval: metadata, } } @@ -20,6 +20,6 @@ export function googleSearchRetrievalTool( description: '', parameters: {}, }, - metadata: config + metadata: config, } } diff --git a/packages/typescript/ai-gemini/src/tools/google-search-tool.ts b/packages/typescript/ai-gemini/src/tools/google-search-tool.ts index 65fbef0bd..bc41b22ec 100644 --- a/packages/typescript/ai-gemini/src/tools/google-search-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/google-search-tool.ts @@ -6,7 +6,7 @@ export type GoogleSearchTool = GoogleSearch export function convertGoogleSearchToolToAdapterFormat(tool: Tool) { const metadata = tool.metadata as GoogleSearchTool return { - googleSearch: metadata + googleSearch: metadata, } } @@ -18,6 +18,6 @@ export function googleSearchTool(config?: GoogleSearchTool): Tool { description: '', parameters: {}, }, - metadata: config + metadata: config, } } diff --git a/packages/typescript/ai-gemini/src/tools/url-context-tool.ts b/packages/typescript/ai-gemini/src/tools/url-context-tool.ts index c71bfa32d..dc3d69b7f 100644 --- a/packages/typescript/ai-gemini/src/tools/url-context-tool.ts +++ b/packages/typescript/ai-gemini/src/tools/url-context-tool.ts @@ -1,6 +1,6 @@ import type { Tool } from '@tanstack/ai' -export interface UrlContextTool { } +export interface UrlContextTool {} export function convertUrlContextToolToAdapterFormat(_tool: Tool) { return { diff --git a/packages/typescript/ai-ollama/README.md b/packages/typescript/ai-ollama/README.md new file mode 100644 index 000000000..7c4143074 --- /dev/null +++ b/packages/typescript/ai-ollama/README.md @@ -0,0 +1,104 @@ +
+ +
+ +
+ +
+ + + + + + + + + +
+ + + +
+ +### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) +
+ +# TanStack AI + +A powerful, type-safe AI SDK for building AI-powered applications. + +- Provider-agnostic adapters (OpenAI, Anthropic, Gemini, Ollama, etc.) +- Chat completion, streaming, and agent loop strategies +- Headless chat state management with adapters (SSE, HTTP stream, custom) +- Type-safe tools with server/client execution + +### Read the docs → + +## Get Involved + +- We welcome issues and pull requests! +- Participate in [GitHub discussions](https://github.com/TanStack/ai/discussions) +- Chat with the community on [Discord](https://discord.com/invite/WrRKjPJ) +- See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions + +## Partners + + + + + + +
+ + + + + CodeRabbit + + + + + + + + Cloudflare + + +
+ +
+AI & you? +

+We're looking for TanStack AI Partners to join our mission! Partner with us to push the boundaries of TanStack AI and build amazing things together. +

+LET'S CHAT +
+ +## Explore the TanStack Ecosystem + +- TanStack Config – Tooling for JS/TS packages +- TanStack DB – Reactive sync client store +- TanStack Devtools – Unified devtools panel +- TanStack Form – Type‑safe form state +- TanStack Pacer – Debouncing, throttling, batching +- TanStack Query – Async state & caching +- TanStack Ranger – Range & slider primitives +- TanStack Router – Type‑safe routing, caching & URL state +- TanStack Start – Full‑stack SSR & streaming +- TanStack Store – Reactive data store +- TanStack Table – Headless datagrids +- TanStack Virtual – Virtualized rendering + +… and more at TanStack.com » + + diff --git a/packages/typescript/ai-ollama/package.json b/packages/typescript/ai-ollama/package.json index c00d87fd4..b7a152dbc 100644 --- a/packages/typescript/ai-ollama/package.json +++ b/packages/typescript/ai-ollama/package.json @@ -52,4 +52,4 @@ "peerDependencies": { "@tanstack/ai": "workspace:*" } -} \ No newline at end of file +} diff --git a/packages/typescript/ai-openai/README.md b/packages/typescript/ai-openai/README.md new file mode 100644 index 000000000..7c4143074 --- /dev/null +++ b/packages/typescript/ai-openai/README.md @@ -0,0 +1,104 @@ +
+ +
+ +
+ +
+ + + + + + + + + +
+ + + +
+ +### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) +
+ +# TanStack AI + +A powerful, type-safe AI SDK for building AI-powered applications. + +- Provider-agnostic adapters (OpenAI, Anthropic, Gemini, Ollama, etc.) +- Chat completion, streaming, and agent loop strategies +- Headless chat state management with adapters (SSE, HTTP stream, custom) +- Type-safe tools with server/client execution + +### Read the docs → + +## Get Involved + +- We welcome issues and pull requests! +- Participate in [GitHub discussions](https://github.com/TanStack/ai/discussions) +- Chat with the community on [Discord](https://discord.com/invite/WrRKjPJ) +- See [CONTRIBUTING.md](./CONTRIBUTING.md) for setup instructions + +## Partners + + + + + + +
+ + + + + CodeRabbit + + + + + + + + Cloudflare + + +
+ +
+AI & you? +

+We're looking for TanStack AI Partners to join our mission! Partner with us to push the boundaries of TanStack AI and build amazing things together. +

+LET'S CHAT +
+ +## Explore the TanStack Ecosystem + +- TanStack Config – Tooling for JS/TS packages +- TanStack DB – Reactive sync client store +- TanStack Devtools – Unified devtools panel +- TanStack Form – Type‑safe form state +- TanStack Pacer – Debouncing, throttling, batching +- TanStack Query – Async state & caching +- TanStack Ranger – Range & slider primitives +- TanStack Router – Type‑safe routing, caching & URL state +- TanStack Start – Full‑stack SSR & streaming +- TanStack Store – Reactive data store +- TanStack Table – Headless datagrids +- TanStack Virtual – Virtualized rendering + +… and more at TanStack.com » + + diff --git a/packages/typescript/ai-openai/src/audio/audio-provider-options.ts b/packages/typescript/ai-openai/src/audio/audio-provider-options.ts index 69a35d3ee..6021df5bb 100644 --- a/packages/typescript/ai-openai/src/audio/audio-provider-options.ts +++ b/packages/typescript/ai-openai/src/audio/audio-provider-options.ts @@ -1,5 +1,3 @@ - - export interface AudioProviderOptions { /** * The text to generate audio for. The maximum length is 4096 characters. @@ -16,17 +14,17 @@ export interface AudioProviderOptions { * https://platform.openai.com/docs/guides/text-to-speech#voice-options */ voice?: - | 'alloy' - | 'ash' - | 'ballad' - | 'coral' - | 'echo' - | 'fable' - | 'onyx' - | 'nova' - | 'sage' - | 'shimmer' - | 'verse' + | 'alloy' + | 'ash' + | 'ballad' + | 'coral' + | 'echo' + | 'fable' + | 'onyx' + | 'nova' + | 'sage' + | 'shimmer' + | 'verse' /** * Control the voice of your generated audio with additional instructions. Does not work with tts-1 or tts-1-hd. */ diff --git a/packages/typescript/ai-openai/src/image/image-provider-options.ts b/packages/typescript/ai-openai/src/image/image-provider-options.ts index e129542f2..49e9fcc12 100644 --- a/packages/typescript/ai-openai/src/image/image-provider-options.ts +++ b/packages/typescript/ai-openai/src/image/image-provider-options.ts @@ -1,5 +1,3 @@ - - interface ImageProviderOptions { /** * A text prompt describing the desired image. The maximum length is 32000 characters for gpt-image-1, 1000 characters for dall-e-2 and 4000 characters for dall-e-3. diff --git a/packages/typescript/ai-openai/src/model-meta.ts b/packages/typescript/ai-openai/src/model-meta.ts index 8e4053242..c4a9a3732 100644 --- a/packages/typescript/ai-openai/src/model-meta.ts +++ b/packages/typescript/ai-openai/src/model-meta.ts @@ -98,11 +98,11 @@ const GPT5_1 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_1_CODEX = { @@ -127,11 +127,11 @@ const GPT5_1_CODEX = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5 = { @@ -168,11 +168,11 @@ const GPT5 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_MINI = { @@ -198,10 +198,10 @@ const GPT5_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_NANO = { @@ -233,10 +233,10 @@ const GPT5_NANO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_PRO = { @@ -261,11 +261,11 @@ const GPT5_PRO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT5_CODEX = { @@ -290,11 +290,11 @@ const GPT5_CODEX = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > /* const SORA2 = { @@ -407,9 +407,9 @@ const O3_DEEP_RESEARCH = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O4_MINI_DEEP_RESEARCH = { @@ -434,9 +434,9 @@ const O4_MINI_DEEP_RESEARCH = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O3_PRO = { @@ -460,11 +460,11 @@ const O3_PRO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_AUDIO = { @@ -489,9 +489,9 @@ const GPT_AUDIO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > /* const GPT_REALTIME = { @@ -572,9 +572,9 @@ const GPT_AUDIO_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O3 = { @@ -599,11 +599,11 @@ const O3 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O4_MINI = { @@ -633,10 +633,10 @@ const O4_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT4_1 = { @@ -680,11 +680,11 @@ const GPT4_1 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT4_1_MINI = { @@ -720,10 +720,10 @@ const GPT4_1_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT4_1_NANO = { @@ -760,10 +760,10 @@ const GPT4_1_NANO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const O1_PRO = { @@ -787,11 +787,11 @@ const O1_PRO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const COMPUTER_USE_PREVIEW = { @@ -815,9 +815,9 @@ const COMPUTER_USE_PREVIEW = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_4O_MINI_SEARCH_PREVIEW = { @@ -888,11 +888,11 @@ const O3_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_4O_MINI_AUDIO = { @@ -917,9 +917,9 @@ const GPT_4O_MINI_AUDIO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > /* const GPT_4O_MINI_REALTIME = { @@ -972,11 +972,11 @@ const O1 = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > /* const OMNI_MODERATION = { @@ -1034,11 +1034,11 @@ const GPT_4O = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_4O_AUDIO = { @@ -1063,9 +1063,9 @@ const GPT_4O_AUDIO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_40_MINI = { @@ -1102,10 +1102,10 @@ const GPT_40_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > /* const GPT__4O_REALTIME = { @@ -1157,9 +1157,9 @@ const GPT_4_TURBO = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const CHATGPT_40 = { @@ -1207,11 +1207,11 @@ const GPT_5_1_CODEX_MINI = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const CODEX_MINI_LATEST = { @@ -1236,11 +1236,11 @@ const CODEX_MINI_LATEST = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > /* const DALL_E_2 = { @@ -1452,11 +1452,11 @@ const GPT_5_1_CHAT = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const GPT_5_CHAT = { @@ -1488,11 +1488,11 @@ const GPT_5_CHAT = { }, } as const satisfies ModelMeta< OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions > const TEXT_EMBEDDING_3_LARGE = { @@ -1769,150 +1769,150 @@ const OPENAI_VIDEO_MODELS = [SORA2.name, SORA2_PRO.name] as const export type OpenAIChatModelProviderOptionsByName = { // Models WITH structured output support (have 'text' field) 'gpt-5.1': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5.1-codex': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5-mini': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5-nano': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5-pro': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-5-codex': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4.1': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4.1-mini': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4.1-nano': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o-mini': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions // Models WITHOUT structured output support (NO 'text' field) 'gpt-4': OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4-turbo': OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-3.5-turbo': OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'chatgpt-4.0': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions o3: OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o3-pro': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o3-mini': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o4-mini': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o3-deep-research': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIMetadataOptions 'o4-mini-deep-research': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIMetadataOptions o1: OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions 'o1-pro': OpenAIBaseOptions & OpenAIReasoningOptions & OpenAIMetadataOptions // Audio models 'gpt-audio': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-audio-mini': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o-audio': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o-mini-audio': OpenAIBaseOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStreamingOptions & + OpenAIMetadataOptions // Chat-only models 'gpt-5.1-chat': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIMetadataOptions 'gpt-5-chat': OpenAIBaseOptions & - OpenAIReasoningOptions & - OpenAIStructuredOutputOptions & - OpenAIMetadataOptions + OpenAIReasoningOptions & + OpenAIStructuredOutputOptions & + OpenAIMetadataOptions // Codex models 'gpt-5.1-codex-mini': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'codex-mini-latest': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions // Search models 'gpt-4o-search-preview': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions 'gpt-4o-mini-search-preview': OpenAIBaseOptions & - OpenAIStructuredOutputOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIStructuredOutputOptions & + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions // Special models 'computer-use-preview': OpenAIBaseOptions & - OpenAIToolsOptions & - OpenAIStreamingOptions & - OpenAIMetadataOptions + OpenAIToolsOptions & + OpenAIStreamingOptions & + OpenAIMetadataOptions } diff --git a/packages/typescript/ai-openai/src/openai-adapter.ts b/packages/typescript/ai-openai/src/openai-adapter.ts index 1c0b194a0..ef2dc4fc7 100644 --- a/packages/typescript/ai-openai/src/openai-adapter.ts +++ b/packages/typescript/ai-openai/src/openai-adapter.ts @@ -1,7 +1,10 @@ import OpenAI_SDK from 'openai' import { BaseAdapter } from '@tanstack/ai' -import { OPENAI_CHAT_MODELS, OPENAI_EMBEDDING_MODELS, } from './model-meta' -import { convertMessagesToInput, validateTextProviderOptions } from './text/text-provider-options' +import { OPENAI_CHAT_MODELS, OPENAI_EMBEDDING_MODELS } from './model-meta' +import { + convertMessagesToInput, + validateTextProviderOptions, +} from './text/text-provider-options' import { convertToolsToProviderFormat } from './tools' import type { ChatOptions, @@ -9,7 +12,7 @@ import type { EmbeddingResult, StreamChunk, SummarizationOptions, - SummarizationResult + SummarizationResult, } from '@tanstack/ai' import type { OpenAIChatModelProviderOptionsByName } from './model-meta' import type { @@ -28,7 +31,6 @@ export interface OpenAIConfig { */ export type OpenAIProviderOptions = ExternalTextProviderOptions - /** * OpenAI-specific provider options for embeddings * Based on OpenAI Embeddings API documentation @@ -41,8 +43,6 @@ interface OpenAIEmbeddingProviderOptions { user?: string } - - export class OpenAI extends BaseAdapter< typeof OPENAI_CHAT_MODELS, typeof OPENAI_EMBEDDING_MODELS, @@ -78,7 +78,7 @@ export class OpenAI extends BaseAdapter< // OpenAI streams tool calls with deltas - first chunk has ID/name, subsequent chunks only have args // We assign our own indices as we encounter unique tool call IDs const toolCallMetadata = new Map() - const requestArguments = this.mapChatOptionsToOpenAI(options); + const requestArguments = this.mapChatOptionsToOpenAI(options) try { const response = await this.client.responses.create( @@ -106,7 +106,6 @@ export class OpenAI extends BaseAdapter< console.error('>>> Full error:', error) throw error } - } async summarize(options: SummarizationOptions): Promise { @@ -181,7 +180,6 @@ export class OpenAI extends BaseAdapter< return prompt } - private async *processOpenAIStreamChunks( stream: AsyncIterable, toolCallMetadata: Map, @@ -212,25 +210,29 @@ export class OpenAI extends BaseAdapter< for await (const chunk of stream) { console.log(chunk) chunkCount++ - const handleContentPart = (contentPart: OpenAI_SDK.Responses.ResponseOutputText | OpenAI_SDK.Responses.ResponseOutputRefusal | OpenAI_SDK.Responses.ResponseContentPartAddedEvent.ReasoningText): StreamChunk => { - if (contentPart.type === "output_text") { - accumulatedContent += contentPart.text; + const handleContentPart = ( + contentPart: + | OpenAI_SDK.Responses.ResponseOutputText + | OpenAI_SDK.Responses.ResponseOutputRefusal + | OpenAI_SDK.Responses.ResponseContentPartAddedEvent.ReasoningText, + ): StreamChunk => { + if (contentPart.type === 'output_text') { + accumulatedContent += contentPart.text return { - type: "content", + type: 'content', id: responseId || generateId(), model: model || options.model, timestamp, delta: contentPart.text, content: accumulatedContent, - role: "assistant", + role: 'assistant', } } - - if (contentPart.type === "reasoning_text") { - accumulatedReasoning += contentPart.text; + if (contentPart.type === 'reasoning_text') { + accumulatedReasoning += contentPart.text return { - type: "thinking", + type: 'thinking', id: responseId || generateId(), model: model || options.model, timestamp, @@ -239,23 +241,26 @@ export class OpenAI extends BaseAdapter< } } return { - type: "error", + type: 'error', id: responseId || generateId(), model: model || options.model, timestamp, error: { message: contentPart.refusal, - } + }, } - } // handle general response events - if (chunk.type === "response.created" || chunk.type === "response.incomplete" || chunk.type === "response.failed") { - responseId = chunk.response.id; - model = chunk.response.model; + if ( + chunk.type === 'response.created' || + chunk.type === 'response.incomplete' || + chunk.type === 'response.failed' + ) { + responseId = chunk.response.id + model = chunk.response.model if (chunk.response.error) { yield { - type: "error", + type: 'error', id: chunk.response.id, model: chunk.response.model, timestamp, @@ -264,35 +269,30 @@ export class OpenAI extends BaseAdapter< } if (chunk.response.incomplete_details) { yield { - type: "error", + type: 'error', id: chunk.response.id, model: chunk.response.model, timestamp, error: { - message: chunk.response.incomplete_details.reason ?? "", - + message: chunk.response.incomplete_details.reason ?? '', }, } } } // handle content_part added events for text, reasoning and refusals - if (chunk.type === "response.content_part.added") { - const contentPart = chunk.part; - yield handleContentPart(contentPart); + if (chunk.type === 'response.content_part.added') { + const contentPart = chunk.part + yield handleContentPart(contentPart) } - if (chunk.type === "response.content_part.done") { - const contentPart = chunk.part; + if (chunk.type === 'response.content_part.done') { + const contentPart = chunk.part - yield handleContentPart(contentPart); + yield handleContentPart(contentPart) } - - - - - if (chunk.type === "response.function_call_arguments.done") { - const { name, item_id, output_index, } = chunk + if (chunk.type === 'response.function_call_arguments.done') { + const { name, item_id, output_index } = chunk if (!toolCallMetadata.has(item_id)) { toolCallMetadata.set(item_id, { index: output_index, @@ -301,59 +301,55 @@ export class OpenAI extends BaseAdapter< accumulatedFunctionCallArguments.set(item_id, '') } yield { - type: "tool_call", + type: 'tool_call', id: responseId || generateId(), model: model || options.model, timestamp, index: output_index, toolCall: { id: item_id, - type: "function", + type: 'function', function: { name, arguments: chunk.arguments, }, - } + }, } } - if (chunk.type === "response.output_text.done") { + if (chunk.type === 'response.output_text.done') { yield { - type: "done", + type: 'done', id: responseId || generateId(), model: model || options.model, timestamp, - finishReason: "stop" + finishReason: 'stop', } } - - if (chunk.type === "response.completed") { + if (chunk.type === 'response.completed') { yield { - type: "done", + type: 'done', id: responseId || generateId(), model: model || options.model, timestamp, - finishReason: "stop" + finishReason: 'stop', } } - - if (chunk.type === "error") { + if (chunk.type === 'error') { yield { - type: "error", + type: 'error', id: responseId || generateId(), model: model || options.model, timestamp, error: { message: chunk.message, - code: chunk.code ?? undefined + code: chunk.code ?? undefined, }, } } } - - } catch (error: any) { console.log( '[OpenAI Adapter] Stream ended with error. Event type summary:', @@ -381,21 +377,20 @@ export class OpenAI extends BaseAdapter< * Handles translation of normalized options to OpenAI's API format */ private mapChatOptionsToOpenAI(options: ChatOptions) { - const providerOptions = options.providerOptions as | Omit< - InternalTextProviderOptions, - | 'max_output_tokens' - | 'tools' - | 'metadata' - | 'temperature' - | 'input' - | 'top_p' - > + InternalTextProviderOptions, + | 'max_output_tokens' + | 'tools' + | 'metadata' + | 'temperature' + | 'input' + | 'top_p' + > | undefined const input = convertMessagesToInput(options.messages) if (providerOptions) { - validateTextProviderOptions({ ...providerOptions, input }); + validateTextProviderOptions({ ...providerOptions, input }) } const tools = options.tools @@ -414,11 +409,9 @@ export class OpenAI extends BaseAdapter< ...providerOptions, input, tools, - } return requestParams - } } diff --git a/packages/typescript/ai-openai/src/text/text-provider-options.ts b/packages/typescript/ai-openai/src/text/text-provider-options.ts index 44ee10ae0..e44f86e8f 100644 --- a/packages/typescript/ai-openai/src/text/text-provider-options.ts +++ b/packages/typescript/ai-openai/src/text/text-provider-options.ts @@ -285,7 +285,9 @@ const validateConversationAndPreviousResponseId = ( } } -export const validateTextProviderOptions = (options: InternalTextProviderOptions) => { +export const validateTextProviderOptions = ( + options: InternalTextProviderOptions, +) => { validateMetadata(options) validateConversationAndPreviousResponseId(options) } @@ -354,7 +356,7 @@ export function convertMessagesToInput( result.push({ type: 'message', role: 'assistant', - content: message.content + content: message.content, }) } @@ -368,7 +370,7 @@ export function convertMessagesToInput( role: 'system', content: [ { - type: "input_text", + type: 'input_text', text: message.content || '', }, ], @@ -382,7 +384,7 @@ export function convertMessagesToInput( role: 'user', content: [ { - type: "input_text", + type: 'input_text', text: message.content || '', }, ], diff --git a/packages/typescript/ai-openai/src/tools/function-tool.ts b/packages/typescript/ai-openai/src/tools/function-tool.ts index 307e2cf79..d7e324cef 100644 --- a/packages/typescript/ai-openai/src/tools/function-tool.ts +++ b/packages/typescript/ai-openai/src/tools/function-tool.ts @@ -27,7 +27,7 @@ export function convertFunctionToolToAdapterFormat(tool: Tool): FunctionTool { additionalProperties: false, }, - strict: true + strict: true, } satisfies FunctionTool } diff --git a/packages/typescript/ai-openai/src/tools/tool-choice.ts b/packages/typescript/ai-openai/src/tools/tool-choice.ts index b51ba1eca..db6e0b148 100644 --- a/packages/typescript/ai-openai/src/tools/tool-choice.ts +++ b/packages/typescript/ai-openai/src/tools/tool-choice.ts @@ -15,13 +15,13 @@ interface CustomToolChoice { interface HostedToolChoice { type: - | 'file_search' - | 'web_search_preview' - | 'computer_use_preview' - | 'code_interpreter' - | 'image_generation' - | 'shell' - | 'apply_patch' + | 'file_search' + | 'web_search_preview' + | 'computer_use_preview' + | 'code_interpreter' + | 'image_generation' + | 'shell' + | 'apply_patch' } export type ToolChoice = diff --git a/packages/typescript/ai-react-ui/README.md b/packages/typescript/ai-react-ui/README.md index a6b0be3e0..7c4143074 100644 --- a/packages/typescript/ai-react-ui/README.md +++ b/packages/typescript/ai-react-ui/README.md @@ -1,282 +1,104 @@ -# @tanstack/ai-react-ui - -Headless React components for building AI chat interfaces with TanStack AI SDK. - -## Features - -🧩 **Parts-Based Messages** - Native support for TanStack AI's message parts (text, thinking, tool calls, results) -💭 **Thinking/Reasoning** - Collapsible thinking sections that auto-collapse when complete -🔐 **Tool Approvals** - Built-in UI for tools that require user approval -💻 **Client-Side Tools** - Execute tools in the browser without server round-trips -🎨 **Headless & Customizable** - Fully unstyled with render props for complete control -⚡ **Type-Safe** - Full TypeScript support with proper inference - -## Installation - -```bash -pnpm add @tanstack/ai-react-ui -``` - -## Quick Start - -```tsx -import { Chat } from '@tanstack/ai-react-ui' -import { fetchServerSentEvents } from '@tanstack/ai-react' - -function MyChat() { - return ( - - - {(message) => } - - - - ) -} -``` - -## Core Concepts - -### Parts-Based Messages - -Unlike traditional chat libraries that treat messages as simple strings, TanStack AI uses **parts**: - -```typescript -{ - role: "assistant", - parts: [ - { - type: "thinking", - content: "The user wants a guitar recommendation..." - }, - { type: "text", content: "Here's a recommendation:" }, - { - type: "tool-call", - name: "recommendGuitar", - arguments: '{"id":"6"}', - state: "input-complete" - } - ] -} -``` - -This allows: - -- Multiple content types in one message (thinking, text, tool calls, results) -- Proper streaming of thinking/reasoning alongside text -- Collapsible thinking sections that auto-collapse when complete -- Proper streaming of tool calls alongside text -- State tracking for each part independently - -### Tool Approvals - -Tools can require user approval before execution: - -```tsx - { - // Client-side tool execution - if (toolName === 'addToWishList') { - const wishList = JSON.parse(localStorage.getItem('wishList') || '[]') - wishList.push(input.guitarId) - localStorage.setItem('wishList', JSON.stringify(wishList)) - return { success: true } - } - }} -> - - {(message) => ( - - approval?.needsApproval ? ( - - ) : null, - }} - /> - )} - - -``` - -## API Reference - -### `` - -Root component that provides chat context to all subcomponents. - -**Props:** - -- `connection: ConnectionAdapter` - How to connect to your API -- `onToolCall?: (args) => Promise` - Handler for client-side tools -- `className?: string` - CSS class for root element -- All other `useChat` options - -### `` - -Renders the list of messages. - -**Props:** - -- `children?: (message, index) => ReactNode` - Custom message renderer -- `emptyState?: ReactNode` - Show when no messages -- `loadingState?: ReactNode` - Show while loading -- `autoScroll?: boolean` - Auto-scroll to bottom (default: true) - -### `` - -Renders a single message with all its parts. - -**Props:** - -- `message: UIMessage` - The message to render -- `textPartRenderer?: (props: { content: string }) => ReactNode` - Custom renderer for text parts -- `thinkingPartRenderer?: (props: { content: string; isComplete?: boolean }) => ReactNode` - Custom renderer for thinking parts -- `toolsRenderer?: Record ReactNode>` - Named tool renderers -- `defaultToolRenderer?: (props) => ReactNode` - Default tool renderer -- `toolResultRenderer?: (props) => ReactNode` - Custom renderer for tool results - -### `` - -Auto-growing textarea input. - -**Props:** - -- `children?: (renderProps) => ReactNode` - Render prop for full control -- `placeholder?: string` -- `autoGrow?: boolean` - Auto-grow textarea (default: true) -- `maxHeight?: number` - Max height in pixels (default: 200) -- `submitOnEnter?: boolean` - Submit on Enter, new line on Shift+Enter (default: true) - -### `` - -Renders approve/deny buttons for tools requiring approval. - -**Props:** - -- `toolCallId: string` -- `toolName: string` -- `input: any` - Parsed tool arguments -- `approval: { id, needsApproval, approved? }` -- `children?: (renderProps) => ReactNode` - Custom approval UI - -## Examples - -### Custom Message Styling - -```tsx - ( -
- {content} -
- )} - thinkingPartRenderer={({ content, isComplete }) => ( -
-
- 💭 Thinking... -
{content}
-
-
- )} - toolsRenderer={{ - recommendGuitar: ({ name, state }) => ( -
- Tool: {name} ({state}) -
- ), - }} -/> -``` - -### Custom Input with Send Button - -```tsx - - {({ value, onChange, onSubmit, isLoading, inputRef }) => ( -
-