diff --git a/.smartconfig.json b/.smartconfig.json index 688d733..c7ab4d7 100644 --- a/.smartconfig.json +++ b/.smartconfig.json @@ -11,12 +11,17 @@ "projectDomain": "push.rocks" }, "release": { - "registries": [ - "https://verdaccio.lossless.digital", - "https://registry.npmjs.org" - ], - "accessLevel": "public" - } + "targets": { + "npm": { + "registries": [ + "https://verdaccio.lossless.digital", + "https://registry.npmjs.org" + ], + "accessLevel": "public" + } + } + }, + "schemaVersion": 2 }, "@git.zone/tsdoc": { "legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n" @@ -24,4 +29,4 @@ "@ship.zone/szci": { "npmGlobalTools": [] } -} +} \ No newline at end of file diff --git a/changelog.md b/changelog.md index ec70b40..c17783b 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,15 @@ # Changelog +## Pending + +### Features + +- add OpenAI Max device-code authentication and unified prompt caching helpers (openai-auth) + - adds OpenAI Max device-code login, token refresh, and ChatGPT Codex provider routing for OpenAI models + - introduces reusable SmartAI cache helpers and middleware for prompt/message cache provider options across providers + - updates Anthropic prompt caching to use opencode-style breakpoint selection with optional longer retention + - exports the new auth and caching APIs and adds tests and documentation for both features + ## 2026-05-06 - 2.2.0 - feat(openai) add getModelSetup() and typed provider options for OpenAI reasoning settings diff --git a/package.json b/package.json index 1ea691a..4611610 100644 --- a/package.json +++ b/package.json @@ -41,30 +41,30 @@ "buildDocs": "(tsdoc)" }, "devDependencies": { - "@git.zone/tsbuild": "^4.4.0", - "@git.zone/tsrun": "^2.0.3", - "@git.zone/tstest": "^3.6.3", + "@git.zone/tsbuild": "^4.4.1", + "@git.zone/tsrun": "^2.0.4", + "@git.zone/tstest": "^3.6.6", "@push.rocks/qenv": "^6.1.4", "@types/json-schema": "^7.0.15", "@types/lodash.clonedeep": "^4.5.9", - "@types/node": "^25.6.0", + "@types/node": "^25.7.0", "@types/pngjs": "^6.0.5", "typescript": "^6.0.3", "undici-types": "^8.2.0" }, "dependencies": { - "@ai-sdk/anthropic": "^3.0.75", - "@ai-sdk/google": "^3.0.67", - "@ai-sdk/groq": "^3.0.38", - "@ai-sdk/mistral": "^3.0.35", - "@ai-sdk/openai": "^3.0.62", - "@ai-sdk/perplexity": "^3.0.32", + "@ai-sdk/anthropic": "^3.0.77", + "@ai-sdk/google": "^3.0.73", + "@ai-sdk/groq": "^3.0.39", + "@ai-sdk/mistral": "^3.0.36", + "@ai-sdk/openai": "^3.0.63", + "@ai-sdk/perplexity": "^3.0.33", "@ai-sdk/provider": "^3.0.10", - "@ai-sdk/xai": "^3.0.88", - "@anthropic-ai/sdk": "0.95.0", + "@ai-sdk/xai": "^3.0.89", + "@anthropic-ai/sdk": "0.95.2", "@push.rocks/smartpdf": "^4.2.2", - "ai": "^6.0.175", - "openai": "^6.36.0" + "ai": "^6.0.180", + "openai": "^6.37.0" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2fc6cc..7b9e289 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,51 +9,51 @@ importers: .: dependencies: '@ai-sdk/anthropic': - specifier: ^3.0.75 - version: 3.0.75(zod@3.25.76) + specifier: ^3.0.77 + version: 3.0.77(zod@3.25.76) '@ai-sdk/google': - specifier: ^3.0.67 - version: 3.0.67(zod@3.25.76) + specifier: ^3.0.73 + version: 3.0.73(zod@3.25.76) '@ai-sdk/groq': - specifier: ^3.0.38 - version: 3.0.38(zod@3.25.76) + specifier: ^3.0.39 + version: 3.0.39(zod@3.25.76) '@ai-sdk/mistral': - specifier: ^3.0.35 - version: 3.0.35(zod@3.25.76) + specifier: ^3.0.36 + version: 3.0.36(zod@3.25.76) '@ai-sdk/openai': - specifier: ^3.0.62 - version: 3.0.62(zod@3.25.76) + specifier: ^3.0.63 + version: 3.0.63(zod@3.25.76) '@ai-sdk/perplexity': - specifier: ^3.0.32 - version: 3.0.32(zod@3.25.76) + specifier: ^3.0.33 + version: 3.0.33(zod@3.25.76) '@ai-sdk/provider': specifier: ^3.0.10 version: 3.0.10 '@ai-sdk/xai': - specifier: ^3.0.88 - version: 3.0.88(zod@3.25.76) + specifier: ^3.0.89 + version: 3.0.89(zod@3.25.76) '@anthropic-ai/sdk': - specifier: 0.95.0 - version: 0.95.0(zod@3.25.76) + specifier: 0.95.2 + version: 0.95.2(zod@3.25.76) '@push.rocks/smartpdf': specifier: ^4.2.2 version: 4.2.2(typescript@6.0.3) ai: - specifier: ^6.0.175 - version: 6.0.175(zod@3.25.76) + specifier: ^6.0.180 + version: 6.0.180(zod@3.25.76) openai: - specifier: ^6.36.0 - version: 6.36.0(ws@8.20.0)(zod@3.25.76) + specifier: ^6.37.0 + version: 6.37.0(ws@8.20.1)(zod@3.25.76) devDependencies: '@git.zone/tsbuild': - specifier: ^4.4.0 - version: 4.4.0 + specifier: ^4.4.1 + version: 4.4.1 '@git.zone/tsrun': - specifier: ^2.0.3 - version: 2.0.3 + specifier: ^2.0.4 + version: 2.0.4 '@git.zone/tstest': - specifier: ^3.6.3 - version: 3.6.3(@aws-sdk/credential-providers@3.808.0)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(socks@2.8.8)(typescript@6.0.3) + specifier: ^3.6.6 + version: 3.6.6(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8)(typescript@6.0.3) '@push.rocks/qenv': specifier: ^6.1.4 version: 6.1.4 @@ -64,8 +64,8 @@ importers: specifier: ^4.5.9 version: 4.5.9 '@types/node': - specifier: ^25.6.0 - version: 25.6.0 + specifier: ^25.7.0 + version: 25.7.0 '@types/pngjs': specifier: ^6.0.5 version: 6.0.5 @@ -78,56 +78,56 @@ importers: packages: - '@ai-sdk/anthropic@3.0.75': - resolution: {integrity: sha512-5AV3CKwaOJFdGXhihVgvRLNrjwRn2Xmy71YygT8DYOA+5zTx93Seg2QSIS8b3tJxzZ7X4H84pEtrE8VZKBCZGA==} + '@ai-sdk/anthropic@3.0.77': + resolution: {integrity: sha512-ML8C2M1YvPA1ulEx4TiyF0k1xvC2ikEiPBIC1PPQ0a5xELUGrO2lAaEzsTEoJ+eCeDd8PSBuFJjs+r+9yIwQXA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.110': - resolution: {integrity: sha512-sbv8+1L9/BRKydn8dMNwoMQKupA4iLJ9N+yvxgW6wMQ/94UepDf3FeYWMj/dLdzolAHZ6izRUP4s5WqQkmJ2Zg==} + '@ai-sdk/gateway@3.0.114': + resolution: {integrity: sha512-MqkZ5sd+qiq6RgIxELkoFQXg2/JwK+WCMaot7U+rtrZpWJl3fSyYvc28SC03b256o4F7OXjQtdjTqs81B2w+dA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@3.0.67': - resolution: {integrity: sha512-Qeq+SidYtzMrcf0fdw3L0QLmtXK+ErwdBzbxS4+0Q/2UP85Ges8RJJcbAj7SO8e2JbeJoM35BLqkeNy1o3wJvQ==} + '@ai-sdk/google@3.0.73': + resolution: {integrity: sha512-o2MuIeyvZrFIeIbnbA8Thrr63irdyUBh0uWBZ2lY6yFeXuE/tcwyXF74bDKS4KvTu84uFpQfpbS/LXHGKKXz+g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/groq@3.0.38': - resolution: {integrity: sha512-mzn+KYeROVHFZnAr3qNX+eZ4Un4BFykOcs8XDH8LLzdfgrW6fxQkdiZyww0asYGjIYaa16dkyVtglp4GV6BeUQ==} + '@ai-sdk/groq@3.0.39': + resolution: {integrity: sha512-BZAr6DjCbzWQ0Qn1/TSsHo/bmCt4JaAMb4A7HCSUZBQCAcOjne/03D0sVjHnQhUC3TpwcmYiv7tHAviK7BluRw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/mistral@3.0.35': - resolution: {integrity: sha512-8BCt8pOWjvfIFZOVFz+koFcbydVv7Q8WM24J0gVJWDw1eOEn3Muugw4py+TuaQc8KdjP7d1HR9E4gIMN55zBgQ==} + '@ai-sdk/mistral@3.0.36': + resolution: {integrity: sha512-FLIb2QdLraOgQP3puUybuFYWbtsB02YWQBTOJOk8heiEsdFW3YE0dfuzwtsvoF4FXlBnbYYMWu5jgOesthcmWg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@2.0.46': - resolution: {integrity: sha512-23ExGdy3p0Grfz3BAjCbIOc74TjQc5nHu72e0+kx3hshvScp32a4nnQlzzG4VT1bDZxa9yPNNUNyb5nN6vJHcQ==} + '@ai-sdk/openai-compatible@2.0.47': + resolution: {integrity: sha512-Enm5UlL0zUCrW3792opk5h7hRWxZOZzDe6eQYVFqX9LUOGGCe1h8MZWAGim765nwzgnjlpeYOsuzZmLtRsTPlg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@3.0.62': - resolution: {integrity: sha512-Oy74Bztik2X25wZD9HRd83BAXOKcRvrfgz9gvVGqKj68yegf447NiElPbB6TSVb8zyiY9wv1GSGywMCxnnoF9g==} + '@ai-sdk/openai@3.0.63': + resolution: {integrity: sha512-4yY/m8a57MNNVoJCsXuNblKf6BO4yuAuLKRX4tzSNffBEBSp1FlcWdPE0Z4FkqUeS0AJhYSSqp0GIiA/cIcDNA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/perplexity@3.0.32': - resolution: {integrity: sha512-5kPyfDOHL72Mnz0unBiW3S/jHjNMo/frPW6dBTADX1SMbFB9Yvks4k1pjixIJc1m8YBulI5hV5yTvr7uUxpzxA==} + '@ai-sdk/perplexity@3.0.33': + resolution: {integrity: sha512-aNt6pTAzq+akadDXVdg2SjN2dODtaVlkKbw8/35c+sekr+Tx0sJwVqMR1udxrjLzhQvz8qtfsWRuz+hB9pmOnQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.26': - resolution: {integrity: sha512-CsKNLKsOpvPujRlIYvoz+Ybw+kGn7J4/fIZa/58+R7iWLLfwn6ifE2G6Yq8K9XvH/I/3bzaDAJ3NhRwEMsLBKQ==} + '@ai-sdk/provider-utils@4.0.27': + resolution: {integrity: sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -136,14 +136,14 @@ packages: resolution: {integrity: sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==} engines: {node: '>=18'} - '@ai-sdk/xai@3.0.88': - resolution: {integrity: sha512-9jc7CT+6YxdPnkMF66jX/LmFoEcRI2Cjr5CTxZcrCA8f764NPF0mGtaNRv3M0OzYwBIppgZ3F0TNhADguHWLrg==} + '@ai-sdk/xai@3.0.89': + resolution: {integrity: sha512-ecFE4iQnWePrxPYuSUYCh8lpoKZ52J3jao5whDVC3+Z9Cu/XeyOe2oUGzsYSUPgbJNi/ZmD/KN69bHbUcAHFvw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@anthropic-ai/sdk@0.95.0': - resolution: {integrity: sha512-7It2B76OFJH9jC/a0TicXFMq0ZZM25ei+i/mK7JnsE1Ibmo0Yfkqm+DXOHeU/ZxxKwLLGPP6qaAvKmQmgV6XhA==} + '@anthropic-ai/sdk@0.95.2': + resolution: {integrity: sha512-Egddwo3sheo1PzUrMkZnH6VkQYwS0h/b/i8vSK8Ta9M45UQipAMeDFH57dYuDAfXMEUUGeKw6CMlremgMZgrSQ==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -160,6 +160,9 @@ packages: '@api.global/typedrequest@3.3.0': resolution: {integrity: sha512-Jwobqla+9k2IBG0duwrCFtc6GU6wsvHS3f0gJJsxTrpapylBW1YSF7NnGHPGs7F9hbATsO6IoUBpR2ScoKyGJA==} + '@api.global/typedrequest@3.3.1': + resolution: {integrity: sha512-uJ8uGS7T4OvnpvKlc1T6ML/CHOGKZIrgRFYYxnPKho2SZGnBFEfazWKshxlgqPsiWMZDFwX9i8c8sp+l3AGI2w==} + '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -464,174 +467,330 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.27.7': resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.27.7': resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.27.7': resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.27.7': resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.27.7': resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.27.7': resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.7': resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.27.7': resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.27.7': resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.27.7': resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.27.7': resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.27.7': resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.27.7': resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.27.7': resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.27.7': resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.27.7': resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.7': resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.7': resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.7': resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.7': resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.7': resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.27.7': resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.27.7': resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.27.7': resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.27.7': resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@git.zone/tsbuild@4.4.0': - resolution: {integrity: sha512-98igHfppi6blFYDyzNukNkj4FUO5ZlyXEaSyJh8vCkkZM8SyAgfZj+NUWA1D1iaPXE58UvK1Pt/o8p8iI9UHHw==} + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@git.zone/tsbuild@4.4.1': + resolution: {integrity: sha512-usxx8BBQsAypxjFOfd1GEV9pL9EUshRKktXtRWHMDByb6ps83+PdUIb3D7O+nkkBp4C9PXo3cfbsR4Asvo33CA==} hasBin: true - '@git.zone/tsbundle@2.10.1': - resolution: {integrity: sha512-bCoDoHsT9oIQRFZbItkjPu/lTiyCKxzhA+XSEc1L2jV8S717faaLWHJEbbmrX/pZXG2OkIr2At1xpsicE/6I7g==} + '@git.zone/tsbundle@2.10.4': + resolution: {integrity: sha512-/xWOGrnuMaJ/Xo/EasaF9N3N9w1J9LDywZaRTa0UTtzbEtfJP7F2NJ9l4tWCwS+vTKpnqApX7ZueRh1h5MrwPQ==} hasBin: true - '@git.zone/tspublish@1.11.6': - resolution: {integrity: sha512-0HmIS4rs5fgbxnNWAm0aZ4wKjSMX9nsHx1Gy90iK9uXFUVmzx/4SibE9UmSgNfmGAGSXiSh8TW6M1gOmLODNNw==} + '@git.zone/tspublish@1.11.7': + resolution: {integrity: sha512-6vXXOQ7mPQu72q/Trr8bHwYLrAX1Y1okX/KoKTXlnx0adtqJKw1V5p9cimGrkq40rX5ivh1rPg+7fTlbXgjyew==} hasBin: true - '@git.zone/tsrun@2.0.3': - resolution: {integrity: sha512-QxSM8u+PFnO4jWul0MZpIVCk8XmafqnlPram68dgKuFBl86JM+29G1ag66QUAXSH13WWawbozAGcpCCpIWz7dQ==} + '@git.zone/tsrun@2.0.4': + resolution: {integrity: sha512-IXXtM6Kc3bEYPBUgDsO1y/+bbAts9L+nanxTZ3WYA5jHfgcJCxUJN8fhapp91/bpVzkLr7jZA5nSV/v/gQmfKg==} hasBin: true - '@git.zone/tstest@3.6.3': - resolution: {integrity: sha512-xvHZia3VEYO3ztXNqN3+ytF07vA2imZJwpD7GOv/wVM/hY58bUVvs/YnJ0C4nwiCGiHV87LU27NDEGfoNPYZcw==} + '@git.zone/tstest@3.6.6': + resolution: {integrity: sha512-CGbwM7y2S74G4gJJSzmR9l5WoAw8wyzr1j/9utSQ7+mFaejIkRLJtqKc76ooaTeDGy4wueNpaXZzByxkbBbe4g==} hasBin: true '@img/colour@1.1.0': @@ -964,30 +1123,9 @@ packages: '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} - '@module-federation/error-codes@0.22.0': - resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} - - '@module-federation/runtime-core@0.22.0': - resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} - - '@module-federation/runtime-tools@0.22.0': - resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} - - '@module-federation/runtime@0.22.0': - resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} - - '@module-federation/sdk@0.22.0': - resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} - - '@module-federation/webpack-bundler-runtime@0.22.0': - resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} - '@mongodb-js/saslprep@1.4.11': resolution: {integrity: sha512-o9rAHc0IpIjuPSxRutWpE1F62x7n+4mVS4rCNHkzhIUMQcc18bb6xEq5wd2NdN0WjepIyXIppRshYI2kQDOZVA==} - '@napi-rs/wasm-runtime@1.0.7': - resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: @@ -997,12 +1135,12 @@ packages: '@nodable/entities@2.1.0': resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==} - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} '@pdf-lib/standard-fonts@1.0.0': resolution: {integrity: sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==} @@ -1097,8 +1235,8 @@ packages: '@push.rocks/smartbuffer@3.0.6': resolution: {integrity: sha512-1jXfAOsisgDZS+L1E5OCLcM1dseO2rpuqGtSbeB89IDMiBeBTYbzcQ7ZkQQpFIzEzpzjvtl6COT6ZVxCtGnhGA==} - '@push.rocks/smartcli@4.0.21': - resolution: {integrity: sha512-BtBL4uTNrrEynYsltPJBxYd6lweVuD9DDoKyqZLMFGIWMdizqzy1PuO6aCUqCKdZBcxW7ckfXZDWIoEc61sa3w==} + '@push.rocks/smartcli@4.1.0': + resolution: {integrity: sha512-/XePm5PBNSrCCSyjgQsRc7K8O2rdX9ejIyroJv6VS9FJGZxA2gZm32c2xoN+LPj+hlfeBSHbAyJv9j0DZJDdaQ==} '@push.rocks/smartclickhouse@2.2.1': resolution: {integrity: sha512-K0qSPcMbUisHn/igQu4XaHn3SC9mnlu/mhAp5RwTeyL+rha/U4RtW/t4E89OUp7o35XnP4T4U4UUs58Cxk1h+Q==} @@ -1175,6 +1313,9 @@ packages: '@push.rocks/smartmongo@5.1.1': resolution: {integrity: sha512-OFzEjTlXQ0zN9KYewhJRJxxX8bdVO7sl5H4RRd0F0PyU4FEXesLF8Sm4rsCFtQW1ifGQEBOcoruRkoiWz918Ug==} + '@push.rocks/smartmongo@7.0.0': + resolution: {integrity: sha512-qswsXSj3EQyyPGjjm/2RNDl1mE69R5KX1CivWNiXTpVHXJ83WUqsHKZ3d90ZoYfm2/oL6hTHlWLCtuzt9HYV6A==} + '@push.rocks/smartnetwork@4.7.1': resolution: {integrity: sha512-x9SolGn8lU3oh+fKL26dR5dIhsus5f0p/Xiaut2pK5Wamgwrvt5y5To8F+pzF1pQr6yA0XwWZ0Dgoppp2E+ziQ==} @@ -1217,6 +1358,9 @@ packages: '@push.rocks/smartshell@3.3.8': resolution: {integrity: sha512-t9J/py0vnea4ZtOs7Anc9dc6lcvg6EDvYBw5eE1mB+KUWxMQf/ROIQwWMo6B9SMNY4JS2UwvfuJQJ8makP/7Tg==} + '@push.rocks/smartshell@3.5.0': + resolution: {integrity: sha512-Hx9TVvC/AWxZsnm1GDb+W4Fe58nf1FkKbSBABUgkxct4XRYugBI2z9Twnjm3R9vdRry8oy0enfR9NPVhisGaGA==} + '@push.rocks/smartspawn@3.0.4': resolution: {integrity: sha512-bPl4+SCLbW07YHXU1bgBuIfPVv5+Wbg89+Pz0e6ezPBmEQxj372qPRGdaR+8Ouw3d5KZ/IEyuVG+fcQbpDhyYw==} @@ -1266,172 +1410,172 @@ packages: '@push.rocks/webstream@1.0.10': resolution: {integrity: sha512-45CcR0I4/9v0qSjLvz2dYTGMkR0YP3x66ItpStdad5hidJm86t1lfHF06d0oiEvJTpvQkeyIX/8YKAumf21d/Q==} - '@rolldown/binding-android-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==} + '@rolldown/binding-android-arm64@1.0.0': + resolution: {integrity: sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==} + '@rolldown/binding-darwin-arm64@1.0.0': + resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.11': - resolution: {integrity: sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==} + '@rolldown/binding-darwin-x64@1.0.0': + resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.11': - resolution: {integrity: sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==} + '@rolldown/binding-freebsd-x64@1.0.0': + resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11': - resolution: {integrity: sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.11': - resolution: {integrity: sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==} + '@rolldown/binding-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==} + '@rolldown/binding-linux-s390x-gnu@1.0.0': + resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==} + '@rolldown/binding-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.11': - resolution: {integrity: sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==} + '@rolldown/binding-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==} + '@rolldown/binding-openharmony-arm64@1.0.0': + resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.11': - resolution: {integrity: sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==} - engines: {node: '>=14.0.0'} + '@rolldown/binding-wasm32-wasi@1.0.0': + resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11': - resolution: {integrity: sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==} + '@rolldown/binding-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.11': - resolution: {integrity: sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==} + '@rolldown/binding-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.11': - resolution: {integrity: sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==} + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} - '@rspack/binding-darwin-arm64@1.7.11': - resolution: {integrity: sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==} + '@rspack/binding-darwin-arm64@2.0.3': + resolution: {integrity: sha512-4UyCjLJwU/WxR6K1/gG4u3+jUsoaRHJ5rNu9fto/UbvrItwdlVNULChAApqZFw6mcSetMddSjSICeuj5pSB6sA==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.7.11': - resolution: {integrity: sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==} + '@rspack/binding-darwin-x64@2.0.3': + resolution: {integrity: sha512-K3evrbTgZNa8emEqk+AjDtbuoXZp5tPZz3pcEgETxuu3KanW8Zu+Fb+TUp1DEUcL0xOmHPPox8H2cZ3pF4Zmug==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.7.11': - resolution: {integrity: sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==} + '@rspack/binding-linux-arm64-gnu@2.0.3': + resolution: {integrity: sha512-aPLDaaTtX1wqjLYAIHc2MGDQZtv1Hbjx47oaaefbWz5GbAnSA4P8jdYIeeGRyrqvQ0WqJXIWXgT0d/iXtes00A==} cpu: [arm64] os: [linux] libc: [glibc] - '@rspack/binding-linux-arm64-musl@1.7.11': - resolution: {integrity: sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==} + '@rspack/binding-linux-arm64-musl@2.0.3': + resolution: {integrity: sha512-0WulUQPop6vmSDfrTxghmVlm+6crU8/XqD2f0dOWbEniZVuDZJ5/Y/cBqTRyk3rjl0vrmUv3lc87/t7UgQJQSw==} cpu: [arm64] os: [linux] libc: [musl] - '@rspack/binding-linux-x64-gnu@1.7.11': - resolution: {integrity: sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==} + '@rspack/binding-linux-x64-gnu@2.0.3': + resolution: {integrity: sha512-fAhiMuV5omT53YMft+f3Y9euAFgspuyBAk9ZpeW2buL2TkuUMwP07adhhvQfKdQ5gpELfzmjQaRDGqaIT8UWiA==} cpu: [x64] os: [linux] libc: [glibc] - '@rspack/binding-linux-x64-musl@1.7.11': - resolution: {integrity: sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==} + '@rspack/binding-linux-x64-musl@2.0.3': + resolution: {integrity: sha512-0kcuFoZ8vy2iNWoISFOZt+/Ujo7LRLrzE7h07AV5r+oN/mv+/v14Sd/8NUtDIScCkrYOszYq/QS31e6t0UrVfw==} cpu: [x64] os: [linux] libc: [musl] - '@rspack/binding-wasm32-wasi@1.7.11': - resolution: {integrity: sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==} + '@rspack/binding-wasm32-wasi@2.0.3': + resolution: {integrity: sha512-x2fsw7GzNZEnw444ikj4/b8kVjM0Y0TllxmizHpYZ9gmaQrOk5OXo9RQdz+l4zzoGors0l2IZP5Cc4GJNCaSoQ==} cpu: [wasm32] - '@rspack/binding-win32-arm64-msvc@1.7.11': - resolution: {integrity: sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==} + '@rspack/binding-win32-arm64-msvc@2.0.3': + resolution: {integrity: sha512-jqlxuVPdrgMuwj/HEjSkC/jmhl4fAuKyob36zJXq2uAusn2FRJ4kClGe1fLFpfxRXFVQAWwlAOwLJg8T0suuaA==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.7.11': - resolution: {integrity: sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==} + '@rspack/binding-win32-ia32-msvc@2.0.3': + resolution: {integrity: sha512-QM4JEuyk5QaZ5gnvnAIaCwVQzCkrD2E4Sud77kx/MVGDsRkcOlMx3blMC5QNHPDamRmWGk+7314YOQvRhKuWyg==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.7.11': - resolution: {integrity: sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==} + '@rspack/binding-win32-x64-msvc@2.0.3': + resolution: {integrity: sha512-vSQNnAy0wswG6AfNRuArTHQBiXOXl+A9ddQxBFup4PMHUzXxKtsBLQzw7BgFC0EgrPeHbt+30j7sXVZKYukj4A==} cpu: [x64] os: [win32] - '@rspack/binding@1.7.11': - resolution: {integrity: sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==} + '@rspack/binding@2.0.3': + resolution: {integrity: sha512-4exVNhGhW5RFHjK87XeTKbkA/qAgI5NHJlT1jNqiJv0gcUXLqTOEU3w7f8+f9zUo4JMFvPc0c9veOi4M19YYTg==} - '@rspack/core@1.7.11': - resolution: {integrity: sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==} - engines: {node: '>=18.12.0'} + '@rspack/core@2.0.3': + resolution: {integrity: sha512-2ufO/8FHIA/lX6UOgSsKPhpDvHr0sh9lYq/n/LsIZsTwu3973BGbu2fg1Akvuu3rEnskPqXjsqH2EPBzEA42uA==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: + '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0 '@swc/helpers': '>=0.5.1' peerDependenciesMeta: + '@module-federation/runtime-tools': + optional: true '@swc/helpers': optional: true - '@rspack/lite-tapable@1.1.0': - resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} - '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -1447,14 +1591,26 @@ packages: resolution: {integrity: sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==} engines: {node: '>=18.0.0'} + '@smithy/config-resolver@4.5.1': + resolution: {integrity: sha512-abXk3LhODsvRHsk0ZS9ztrg/fZatTa9Z/z4pgx65YSLR+rY6kvUG/1IgcDKEUciR8MfdnkT5oPeHJTy/HhzDIQ==} + engines: {node: '>=18.0.0'} + '@smithy/core@3.23.17': resolution: {integrity: sha512-x7BlLbUFL8NWCGjMF9C+1N5cVCxcPa7g6Tv9B4A2luWx3be3oU8hQ96wIwxe/s7OhIzvoJH73HAUSg5JXVlEtQ==} engines: {node: '>=18.0.0'} + '@smithy/core@3.24.1': + resolution: {integrity: sha512-3mT7o4qQyUWttYnVK3A0Z/u3Xha3E81tXn32Tz6vjZiUXhBrkEivpw1hBYfh84iFF9CSzkBU9Y1DJ3Q6RQ231g==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.2.14': resolution: {integrity: sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==} engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.3.1': + resolution: {integrity: sha512-0S/acwHnqX4WrjXzhdiDRxsG2s9SC0cpPIK9nZ1R6UOHd+j7uL28+4bHu22urbLk2TVw3fkp6na/+fkUt/pLNQ==} + engines: {node: '>=18.0.0'} + '@smithy/eventstream-codec@4.2.14': resolution: {integrity: sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==} engines: {node: '>=18.0.0'} @@ -1479,6 +1635,10 @@ packages: resolution: {integrity: sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==} engines: {node: '>=18.0.0'} + '@smithy/fetch-http-handler@5.4.1': + resolution: {integrity: sha512-r7bN6spQ+caZC8AnyvSxkRUb57zt2jhhRw3Z+2Ez8hjq6coIikDBFUUI/+CQ1xx9K6eX1Gx6wUKo4ylU66TIqw==} + engines: {node: '>=18.0.0'} + '@smithy/hash-blob-browser@4.2.15': resolution: {integrity: sha512-0PJ4Al3fg2nM4qKrAIxyNcApgqHAXcBkN8FeizOz69z0rb26uZ6lMESYtxegaTlXB5Hj84JfwMPavMrwDMjucA==} engines: {node: '>=18.0.0'} @@ -1487,6 +1647,10 @@ packages: resolution: {integrity: sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==} engines: {node: '>=18.0.0'} + '@smithy/hash-node@4.3.1': + resolution: {integrity: sha512-u0/zo11mg7yNneoYgTkH4sXwSmcBpbl49o4UNCtQ7hYsXxynsN25KYHmXzqi7TPk5HQL5klGnpU5koOY0O+9hw==} + engines: {node: '>=18.0.0'} + '@smithy/hash-stream-node@4.2.14': resolution: {integrity: sha512-tw4GANWkZPb6+BdD4Fgucqzey2+r73Z/GRo9zklsCdwrnxxumUV83ZIaBDdudV4Ylazw3EPTiJZhpX42105ruQ==} engines: {node: '>=18.0.0'} @@ -1495,6 +1659,10 @@ packages: resolution: {integrity: sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==} engines: {node: '>=18.0.0'} + '@smithy/invalid-dependency@4.3.1': + resolution: {integrity: sha512-cLmwtDoulyZvRepAfyV+3rx5oMvuh51dbE+6En3vGC09j3uVSRt1U4oguNu32ub3soGX0oYtBs8E7S2Q4SxTqg==} + engines: {node: '>=18.0.0'} + '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} @@ -1511,38 +1679,74 @@ packages: resolution: {integrity: sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==} engines: {node: '>=18.0.0'} + '@smithy/middleware-content-length@4.3.1': + resolution: {integrity: sha512-l4BUIP+wljW/Ar+0/QcGdmElI9lalrywfzNijXMBG34Z510FRzPyrDLx/blNTZOAm0C4Mvx5t/bf760CZo1ajg==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.4.32': resolution: {integrity: sha512-ZZkgyjnJppiZbIm6Qbx92pbXYi1uzenIvGhBSCDlc7NwuAkiqSgS75j1czAD25ZLs2FjMjYy1q7gyRVWG6JA0Q==} engines: {node: '>=18.0.0'} + '@smithy/middleware-endpoint@4.5.1': + resolution: {integrity: sha512-qtqu5TS+8Y18ZDkJoiXN5AMW1G4JAg1+xytzpsUvIR5a4EUsgd5HQg12lekEHWpm2TDUmOgg+hBaHK7dvyWdkA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.5.7': resolution: {integrity: sha512-bRt6ZImqVSeTk39Nm81K20ObIiAZ3WefY7G6+iz/0tZjs4dgRRjvRX2sgsH+zi6iDCRR/aQvQofLKxxz4rPBZg==} engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@4.6.1': + resolution: {integrity: sha512-eTaQhxs0rfUuAkL2MSKrH8DTO7YCeAgrdN0B2/RAeuHmXQ+x52dk5qUBsi/jtcqe5LxItgq5AG5tI6Cp8c0sow==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.2.20': resolution: {integrity: sha512-Lx9JMO9vArPtiChE3wbEZ5akMIDQpWQtlu90lhACQmNOXcGXRbaDywMHDzuDZ2OkZzP+9wQfZi3YJT9F67zTQQ==} engines: {node: '>=18.0.0'} + '@smithy/middleware-serde@4.3.1': + resolution: {integrity: sha512-t7YtUe076zWVypVmy1rX91oKi2TFJCkpfFpfMhJFpEIRPP0iL9JxjeSyFQ+1bF45JUfDzOzslUJa150WcSrBug==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.2.14': resolution: {integrity: sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==} engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@4.3.1': + resolution: {integrity: sha512-1jKwiKZxCMQNqmp4uVPYA6r+MLGjEtH07gnOUdPgbnjuOIrl/0JY/ICdpQtFgeBsQ/Up01gnSv8GYEL0fb8yvg==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.3.14': resolution: {integrity: sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==} engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@4.4.1': + resolution: {integrity: sha512-q7tDJEJXcaSG/8TVpu2f2l9bzxTzDM9geWmltbzsY6Hfh3yiuXXTpLIO8+zwYASPPVFaTJpdKwjSSjdoDoccgw==} + engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.6.1': resolution: {integrity: sha512-iB+orM4x3xrr57X3YaXazfKnntl0LHlZB1kcXSGzMV1Tt0+YwEjGlbjk/44qEGtBzXAz6yFDzkYTKSV6Pj2HUg==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.7.1': + resolution: {integrity: sha512-BdEYko85f/ldp68uH8XEyIvo810xFk6eyPH81SRggTOApYHWA+Xu7B2EzLuHbe37WVLaUA7F1fWR3/zBeme2WA==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.14': resolution: {integrity: sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==} engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.3.1': + resolution: {integrity: sha512-3NHoqVBhzpY2b4YBx9AqyKC4C8nnEjl5FyKuxrCjvnjinG0ODj+yg1xX360nNahT6wghYjSw1SooCt3kIdnqIA==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.3.14': resolution: {integrity: sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==} engines: {node: '>=18.0.0'} + '@smithy/protocol-http@5.4.1': + resolution: {integrity: sha512-8irPNCQgYxcSFp1aGcnDNFkTwSA+xPUaFq9V/v1+JXWu8sKr5b3cFmg2kBTkjkvypDmGeNffuNu0x5iqw1NoAw==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@4.2.14': resolution: {integrity: sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==} engines: {node: '>=18.0.0'} @@ -1559,14 +1763,26 @@ packages: resolution: {integrity: sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==} engines: {node: '>=18.0.0'} + '@smithy/shared-ini-file-loader@4.5.1': + resolution: {integrity: sha512-FKoKxVzdFPhyynFI+SPTWrgOP60fZ4l1UwukWYj4eyhpSmEI7MJ6p58hawIIt9bwp+aek9NEm8Zika7E+GEoeg==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.3.14': resolution: {integrity: sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==} engines: {node: '>=18.0.0'} + '@smithy/signature-v4@5.4.1': + resolution: {integrity: sha512-728lZZEWYWubBESrfntNslZQYDKRlJDY4dcDnYbL50+gu35pGPLblu4S0/RH/RDLF6me1M87ECHsHELGL7dA/Q==} + engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.12.13': resolution: {integrity: sha512-y/Pcj1V9+qG98gyu1gvftHB7rDpdh+7kIBIggs55yGm3JdtBV8GT8IFF3a1qxZ79QnaJHX9GXzvBG6tAd+czJA==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.13.1': + resolution: {integrity: sha512-IcznNM8Qd9u1X3oflp12tkzyOB4HbT+sfYWlWiyEysgNzSHoWcHUUsTT4y1jjDjtVuuVVQbYks+g1kVd7u1eGQ==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.14.1': resolution: {integrity: sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==} engines: {node: '>=18.0.0'} @@ -1575,18 +1791,34 @@ packages: resolution: {integrity: sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==} engines: {node: '>=18.0.0'} + '@smithy/url-parser@4.3.1': + resolution: {integrity: sha512-tuelFlF2PZR/wogFC58NIrPOv+Zna4N1+3kA161/33D1Gbwvl6Nh4WsAsW05ZyPp0O6CMGsdbb0S2b/qVjRMCw==} + engines: {node: '>=18.0.0'} + '@smithy/util-base64@4.3.2': resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} engines: {node: '>=18.0.0'} + '@smithy/util-base64@4.4.1': + resolution: {integrity: sha512-fTHiwW2xbiRiWzfSk4IGAr3gNZCH4fuRYqt8+IuarsP/YON35576iVdePraZ6yJlFxlCL0eMec3/F7xYqoKzlg==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@4.2.2': resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@4.3.1': + resolution: {integrity: sha512-1scg5t4nV3hV7CZs996/XHb80aDZ5YotH4NcvkW/w/rHj+cSz0aCIzwz8aUNKB4nCDPSHRCbrKoj+TvycYefmw==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@4.2.3': resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@4.3.1': + resolution: {integrity: sha512-VRC8MKVPKrgUYThTA7ughcKMfjW6/X92H0wXGJoda0Apw4O5xbXL0GMLz40DTWlsb5hh2iItk6+XL72uJdxYcw==} + engines: {node: '>=18.0.0'} + '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} @@ -1599,18 +1831,34 @@ packages: resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@4.3.1': + resolution: {integrity: sha512-lw6L5GF5+W19vO6o3fZwRT2cXEG+8b2LH0b9ppjDT6nIxjUgmljEQGninx5XorylwKZZ4XLVABeroJ8oaF9RmQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.3.49': resolution: {integrity: sha512-a5bNrdiONYB/qE2BuKegvUMd/+ZDwdg4vsNuuSzYE8qs2EYAdK9CynL+Rzn29PbPiUqoz/cbpRbcLzD5lEevHw==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@4.4.1': + resolution: {integrity: sha512-1rA7w+LjK1WJClsffC81Z/ZtjFt22QsKhBjUYEnZsGVS2nOTfOENKBzdg4SxhdwFvBCjcbpjscUfXOPwE3UHWQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.2.54': resolution: {integrity: sha512-g1cvrJvOnzeJgEdf7AE4luI7gp6L8weE0y9a9wQUSGtjb8QRHDbCJYuE4Sy0SD9N8RrnNPFsPltAz/OSoBR9Zw==} engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-node@4.3.1': + resolution: {integrity: sha512-1fk1wfQHBenQD5NitVKOFgW0wsISYAFPIXGyStJWAeCtMyRhgHYvtJxBk2rwGWA0L5QX6oM6yeHSLKPFMk59ww==} + engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.4.2': resolution: {integrity: sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==} engines: {node: '>=18.0.0'} + '@smithy/util-endpoints@3.5.1': + resolution: {integrity: sha512-yORYzJD5zoGbSDkAACr0dIjDiSEA3X8h8lggDENl1dkKpCG0TQIoItPBqtvuJHzFFjRXumcoH+/09xIuixGyCw==} + engines: {node: '>=18.0.0'} + '@smithy/util-hex-encoding@4.2.2': resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} engines: {node: '>=18.0.0'} @@ -1619,14 +1867,26 @@ packages: resolution: {integrity: sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==} engines: {node: '>=18.0.0'} + '@smithy/util-middleware@4.3.1': + resolution: {integrity: sha512-SRRMDcIgVXVhVbxviBaSZbuWuVW3jD08wv4ESV0V2oiw0Mki8TPVQ5IxwD3MvSTPg52QYsRP+JoMw5WdUdeWAg==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.3.8': resolution: {integrity: sha512-LUIxbTBi+OpvXpg91poGA6BdyoleMDLnfXjVDqyi2RvZmTveY5loE/FgYUBCR5LU2BThW2SoZRh8dTIIy38IPw==} engines: {node: '>=18.0.0'} + '@smithy/util-retry@4.4.1': + resolution: {integrity: sha512-qkgWgwn1xw0GoY9Ea/B6FrYSPfHA0zyOtJkokwxZuvucRf2+2lfTut6adi4e4Y7LEAaxsFG7r6i05mtDCxbHKA==} + engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.5.25': resolution: {integrity: sha512-/PFpG4k8Ze8Ei+mMKj3oiPICYekthuzePZMgZbCqMiXIHHf4n2aZ4Ps0aSRShycFTGuj/J6XldmC0x0DwednIA==} engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.6.1': + resolution: {integrity: sha512-GjZfEft0M0V3n2YM/LGkr5LeLd8gxHUIzW0rUz6VtTtlAq245GxHlJghvoPEjJHKTj255iHFAiA4IsIdK40Ueg==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.2.2': resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} engines: {node: '>=18.0.0'} @@ -1639,6 +1899,10 @@ packages: resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} + '@smithy/util-utf8@4.3.1': + resolution: {integrity: sha512-FtRrSnriXtOs4+J8/y9SbQ1xmN71hrOsN/YJr5PQQj5nR1l7YNkGS/TEk4gr0WN7gyrUqw8/RFaYVjI18732ZA==} + engines: {node: '>=18.0.0'} + '@smithy/util-waiter@4.3.0': resolution: {integrity: sha512-JyjYmLAfS+pdxF92o4yLgEoy0zhayKTw73FU1aofLWwLcJw7iSqIY2exGmMTrl/lmZugP5p/zxdFSippJDfKWA==} engines: {node: '>=18.0.0'} @@ -1728,11 +1992,11 @@ packages: '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} - '@types/node@22.19.17': - resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} + '@types/node@22.19.19': + resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} - '@types/node@25.6.0': - resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} + '@types/node@25.7.0': + resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==} '@types/pngjs@6.0.5': resolution: {integrity: sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==} @@ -1801,8 +2065,8 @@ packages: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} - ai@6.0.175: - resolution: {integrity: sha512-6fFFHzbh6FIZnYc31V6osOxq25ABJYCShfG0O6ajHiA4FB/DgnPi1mP8cO5aAU3HNSbQHiMazdlh9bIsp97mVA==} + ai@6.0.180: + resolution: {integrity: sha512-tOyRbwD0PEjMZKGvYQcTsv95K2zktwwNhQ49QOUAh0g8MNprO7ELIO1SgANMuPc0BFtkP6Ny6OAdjq3TtxLCbQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2125,6 +2389,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2762,8 +3031,8 @@ packages: once@1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} - openai@6.36.0: - resolution: {integrity: sha512-Has2YbIusMq9wQEierFsgf9c783dy1y9arX459LmphNacEkkM5yxi2RIyXP0LmkOroQyW19iTwALHL8Yf26UKA==} + openai@6.37.0: + resolution: {integrity: sha512-0H5dEGFmmLv6KSd0W1w2nyL8WsLkX6yoLeQpU+dZAOuGcany5qkYQMmj35ZrKgb6yiyYqpUzFOpR8mZQkgqeEQ==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -3008,8 +3277,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rolldown@1.0.0-rc.11: - resolution: {integrity: sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==} + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3039,6 +3308,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3230,11 +3504,6 @@ packages: typed-query-selector@2.12.2: resolution: {integrity: sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==} - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -3252,8 +3521,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} + undici-types@7.21.0: + resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} undici-types@8.2.0: resolution: {integrity: sha512-uciYZ5yCmf+QJb18kJw10HjquzM7K0z992vWcI+84KeBpTfXT4hfgfGJ5DQbf/mCBPACofkrjvqgcjZfuujjFA==} @@ -3319,6 +3588,11 @@ packages: engines: {node: ^20.17.0 || >=22.9.0} hasBin: true + which@7.0.0: + resolution: {integrity: sha512-RancgH2dmbLdHl6LRhEqvklWMgl/Hdnun0Y90KhBOLkMefg8Qa7/Zel8Sm+8HEcP6DEjzsWzpkuBQEZok58isA==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + hasBin: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -3342,6 +3616,18 @@ packages: utf-8-validate: optional: true + ws@8.20.1: + resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-parse-from-string@1.0.1: resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} @@ -3362,6 +3648,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -3393,56 +3684,56 @@ packages: snapshots: - '@ai-sdk/anthropic@3.0.75(zod@3.25.76)': + '@ai-sdk/anthropic@3.0.77(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/gateway@3.0.110(zod@3.25.76)': + '@ai-sdk/gateway@3.0.114(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) '@vercel/oidc': 3.2.0 zod: 3.25.76 - '@ai-sdk/google@3.0.67(zod@3.25.76)': + '@ai-sdk/google@3.0.73(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/groq@3.0.38(zod@3.25.76)': + '@ai-sdk/groq@3.0.39(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/mistral@3.0.35(zod@3.25.76)': + '@ai-sdk/mistral@3.0.36(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai-compatible@2.0.46(zod@3.25.76)': + '@ai-sdk/openai-compatible@2.0.47(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai@3.0.62(zod@3.25.76)': + '@ai-sdk/openai@3.0.63(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/perplexity@3.0.32(zod@3.25.76)': + '@ai-sdk/perplexity@3.0.33(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.26(zod@3.25.76)': + '@ai-sdk/provider-utils@4.0.27(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.10 '@standard-schema/spec': 1.1.0 @@ -3453,14 +3744,14 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/xai@3.0.88(zod@3.25.76)': + '@ai-sdk/xai@3.0.89(zod@3.25.76)': dependencies: - '@ai-sdk/openai-compatible': 2.0.46(zod@3.25.76) + '@ai-sdk/openai-compatible': 2.0.47(zod@3.25.76) '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) zod: 3.25.76 - '@anthropic-ai/sdk@0.95.0(zod@3.25.76)': + '@anthropic-ai/sdk@0.95.2(zod@3.25.76)': dependencies: json-schema-to-ts: 3.1.1 standardwebhooks: 1.0.0 @@ -3483,6 +3774,18 @@ snapshots: '@push.rocks/webrequest': 4.0.5 '@push.rocks/webstream': 1.0.10 + '@api.global/typedrequest@3.3.1': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.4.1 + '@push.rocks/smartbuffer': 3.0.6 + '@push.rocks/smartdelay': 3.1.0 + '@push.rocks/smartguard': 3.1.0 + '@push.rocks/smartpromise': 4.2.4 + '@push.rocks/webrequest': 4.0.5 + '@push.rocks/webstream': 1.0.10 + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -3545,31 +3848,31 @@ snapshots: '@aws-sdk/util-endpoints': 3.808.0 '@aws-sdk/util-user-agent-browser': 3.804.0 '@aws-sdk/util-user-agent-node': 3.808.0 - '@smithy/config-resolver': 4.4.17 - '@smithy/core': 3.23.17 - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/hash-node': 4.2.14 - '@smithy/invalid-dependency': 4.2.14 - '@smithy/middleware-content-length': 4.2.14 - '@smithy/middleware-endpoint': 4.4.32 - '@smithy/middleware-retry': 4.5.7 - '@smithy/middleware-serde': 4.2.20 - '@smithy/middleware-stack': 4.2.14 - '@smithy/node-config-provider': 4.3.14 - '@smithy/node-http-handler': 4.6.1 - '@smithy/protocol-http': 5.3.14 - '@smithy/smithy-client': 4.12.13 + '@smithy/config-resolver': 4.5.1 + '@smithy/core': 3.24.1 + '@smithy/fetch-http-handler': 5.4.1 + '@smithy/hash-node': 4.3.1 + '@smithy/invalid-dependency': 4.3.1 + '@smithy/middleware-content-length': 4.3.1 + '@smithy/middleware-endpoint': 4.5.1 + '@smithy/middleware-retry': 4.6.1 + '@smithy/middleware-serde': 4.3.1 + '@smithy/middleware-stack': 4.3.1 + '@smithy/node-config-provider': 4.4.1 + '@smithy/node-http-handler': 4.7.1 + '@smithy/protocol-http': 5.4.1 + '@smithy/smithy-client': 4.13.1 '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.49 - '@smithy/util-defaults-mode-node': 4.2.54 - '@smithy/util-endpoints': 3.4.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-retry': 4.3.8 - '@smithy/util-utf8': 4.2.2 + '@smithy/url-parser': 4.3.1 + '@smithy/util-base64': 4.4.1 + '@smithy/util-body-length-browser': 4.3.1 + '@smithy/util-body-length-node': 4.3.1 + '@smithy/util-defaults-mode-browser': 4.4.1 + '@smithy/util-defaults-mode-node': 4.3.1 + '@smithy/util-endpoints': 3.5.1 + '@smithy/util-middleware': 4.3.1 + '@smithy/util-retry': 4.4.1 + '@smithy/util-utf8': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -3649,31 +3952,31 @@ snapshots: '@aws-sdk/util-endpoints': 3.808.0 '@aws-sdk/util-user-agent-browser': 3.804.0 '@aws-sdk/util-user-agent-node': 3.808.0 - '@smithy/config-resolver': 4.4.17 - '@smithy/core': 3.23.17 - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/hash-node': 4.2.14 - '@smithy/invalid-dependency': 4.2.14 - '@smithy/middleware-content-length': 4.2.14 - '@smithy/middleware-endpoint': 4.4.32 - '@smithy/middleware-retry': 4.5.7 - '@smithy/middleware-serde': 4.2.20 - '@smithy/middleware-stack': 4.2.14 - '@smithy/node-config-provider': 4.3.14 - '@smithy/node-http-handler': 4.6.1 - '@smithy/protocol-http': 5.3.14 - '@smithy/smithy-client': 4.12.13 + '@smithy/config-resolver': 4.5.1 + '@smithy/core': 3.24.1 + '@smithy/fetch-http-handler': 5.4.1 + '@smithy/hash-node': 4.3.1 + '@smithy/invalid-dependency': 4.3.1 + '@smithy/middleware-content-length': 4.3.1 + '@smithy/middleware-endpoint': 4.5.1 + '@smithy/middleware-retry': 4.6.1 + '@smithy/middleware-serde': 4.3.1 + '@smithy/middleware-stack': 4.3.1 + '@smithy/node-config-provider': 4.4.1 + '@smithy/node-http-handler': 4.7.1 + '@smithy/protocol-http': 5.4.1 + '@smithy/smithy-client': 4.13.1 '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.49 - '@smithy/util-defaults-mode-node': 4.2.54 - '@smithy/util-endpoints': 3.4.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-retry': 4.3.8 - '@smithy/util-utf8': 4.2.2 + '@smithy/url-parser': 4.3.1 + '@smithy/util-base64': 4.4.1 + '@smithy/util-body-length-browser': 4.3.1 + '@smithy/util-body-length-node': 4.3.1 + '@smithy/util-defaults-mode-browser': 4.4.1 + '@smithy/util-defaults-mode-node': 4.3.1 + '@smithy/util-endpoints': 3.5.1 + '@smithy/util-middleware': 4.3.1 + '@smithy/util-retry': 4.4.1 + '@smithy/util-utf8': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -3682,14 +3985,14 @@ snapshots: '@aws-sdk/core@3.808.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/core': 3.23.17 - '@smithy/node-config-provider': 4.3.14 - '@smithy/property-provider': 4.2.14 - '@smithy/protocol-http': 5.3.14 - '@smithy/signature-v4': 5.3.14 - '@smithy/smithy-client': 4.12.13 + '@smithy/core': 3.24.1 + '@smithy/node-config-provider': 4.4.1 + '@smithy/property-provider': 4.3.1 + '@smithy/protocol-http': 5.4.1 + '@smithy/signature-v4': 5.4.1 + '@smithy/smithy-client': 4.13.1 '@smithy/types': 4.14.1 - '@smithy/util-middleware': 4.2.14 + '@smithy/util-middleware': 4.3.1 fast-xml-parser: 4.4.1 tslib: 2.8.1 optional: true @@ -3720,7 +4023,7 @@ snapshots: dependencies: '@aws-sdk/client-cognito-identity': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.14 + '@smithy/property-provider': 4.3.1 '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: @@ -3731,7 +4034,7 @@ snapshots: dependencies: '@aws-sdk/core': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.14 + '@smithy/property-provider': 4.3.1 '@smithy/types': 4.14.1 tslib: 2.8.1 optional: true @@ -3748,13 +4051,13 @@ snapshots: dependencies: '@aws-sdk/core': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/node-http-handler': 4.6.1 - '@smithy/property-provider': 4.2.14 - '@smithy/protocol-http': 5.3.14 - '@smithy/smithy-client': 4.12.13 + '@smithy/fetch-http-handler': 5.4.1 + '@smithy/node-http-handler': 4.7.1 + '@smithy/property-provider': 4.3.1 + '@smithy/protocol-http': 5.4.1 + '@smithy/smithy-client': 4.13.1 '@smithy/types': 4.14.1 - '@smithy/util-stream': 4.5.25 + '@smithy/util-stream': 4.6.1 tslib: 2.8.1 optional: true @@ -3781,9 +4084,9 @@ snapshots: '@aws-sdk/credential-provider-web-identity': 3.808.0 '@aws-sdk/nested-clients': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.2.14 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/credential-provider-imds': 4.3.1 + '@smithy/property-provider': 4.3.1 + '@smithy/shared-ini-file-loader': 4.5.1 '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: @@ -3831,9 +4134,9 @@ snapshots: '@aws-sdk/credential-provider-sso': 3.808.0 '@aws-sdk/credential-provider-web-identity': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.2.14 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/credential-provider-imds': 4.3.1 + '@smithy/property-provider': 4.3.1 + '@smithy/shared-ini-file-loader': 4.5.1 '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: @@ -3861,8 +4164,8 @@ snapshots: dependencies: '@aws-sdk/core': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/property-provider': 4.3.1 + '@smithy/shared-ini-file-loader': 4.5.1 '@smithy/types': 4.14.1 tslib: 2.8.1 optional: true @@ -3882,8 +4185,8 @@ snapshots: '@aws-sdk/core': 3.808.0 '@aws-sdk/token-providers': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/property-provider': 4.3.1 + '@smithy/shared-ini-file-loader': 4.5.1 '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: @@ -3908,7 +4211,7 @@ snapshots: '@aws-sdk/core': 3.808.0 '@aws-sdk/nested-clients': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.14 + '@smithy/property-provider': 4.3.1 '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: @@ -3941,11 +4244,11 @@ snapshots: '@aws-sdk/credential-provider-web-identity': 3.808.0 '@aws-sdk/nested-clients': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/config-resolver': 4.4.17 - '@smithy/core': 3.23.17 - '@smithy/credential-provider-imds': 4.2.14 - '@smithy/node-config-provider': 4.3.14 - '@smithy/property-provider': 4.2.14 + '@smithy/config-resolver': 4.5.1 + '@smithy/core': 3.24.1 + '@smithy/credential-provider-imds': 4.3.1 + '@smithy/node-config-provider': 4.4.1 + '@smithy/property-provider': 4.3.1 '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: @@ -3989,7 +4292,7 @@ snapshots: '@aws-sdk/middleware-host-header@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.3.14 + '@smithy/protocol-http': 5.4.1 '@smithy/types': 4.14.1 tslib: 2.8.1 optional: true @@ -4023,7 +4326,7 @@ snapshots: '@aws-sdk/middleware-recursion-detection@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.3.14 + '@smithy/protocol-http': 5.4.1 '@smithy/types': 4.14.1 tslib: 2.8.1 optional: true @@ -4064,8 +4367,8 @@ snapshots: '@aws-sdk/core': 3.808.0 '@aws-sdk/types': 3.804.0 '@aws-sdk/util-endpoints': 3.808.0 - '@smithy/core': 3.23.17 - '@smithy/protocol-http': 5.3.14 + '@smithy/core': 3.24.1 + '@smithy/protocol-http': 5.4.1 '@smithy/types': 4.14.1 tslib: 2.8.1 optional: true @@ -4095,31 +4398,31 @@ snapshots: '@aws-sdk/util-endpoints': 3.808.0 '@aws-sdk/util-user-agent-browser': 3.804.0 '@aws-sdk/util-user-agent-node': 3.808.0 - '@smithy/config-resolver': 4.4.17 - '@smithy/core': 3.23.17 - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/hash-node': 4.2.14 - '@smithy/invalid-dependency': 4.2.14 - '@smithy/middleware-content-length': 4.2.14 - '@smithy/middleware-endpoint': 4.4.32 - '@smithy/middleware-retry': 4.5.7 - '@smithy/middleware-serde': 4.2.20 - '@smithy/middleware-stack': 4.2.14 - '@smithy/node-config-provider': 4.3.14 - '@smithy/node-http-handler': 4.6.1 - '@smithy/protocol-http': 5.3.14 - '@smithy/smithy-client': 4.12.13 + '@smithy/config-resolver': 4.5.1 + '@smithy/core': 3.24.1 + '@smithy/fetch-http-handler': 5.4.1 + '@smithy/hash-node': 4.3.1 + '@smithy/invalid-dependency': 4.3.1 + '@smithy/middleware-content-length': 4.3.1 + '@smithy/middleware-endpoint': 4.5.1 + '@smithy/middleware-retry': 4.6.1 + '@smithy/middleware-serde': 4.3.1 + '@smithy/middleware-stack': 4.3.1 + '@smithy/node-config-provider': 4.4.1 + '@smithy/node-http-handler': 4.7.1 + '@smithy/protocol-http': 5.4.1 + '@smithy/smithy-client': 4.13.1 '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.49 - '@smithy/util-defaults-mode-node': 4.2.54 - '@smithy/util-endpoints': 3.4.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-retry': 4.3.8 - '@smithy/util-utf8': 4.2.2 + '@smithy/url-parser': 4.3.1 + '@smithy/util-base64': 4.4.1 + '@smithy/util-body-length-browser': 4.3.1 + '@smithy/util-body-length-node': 4.3.1 + '@smithy/util-defaults-mode-browser': 4.4.1 + '@smithy/util-defaults-mode-node': 4.3.1 + '@smithy/util-endpoints': 3.5.1 + '@smithy/util-middleware': 4.3.1 + '@smithy/util-retry': 4.4.1 + '@smithy/util-utf8': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4172,10 +4475,10 @@ snapshots: '@aws-sdk/region-config-resolver@3.808.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.3.14 + '@smithy/node-config-provider': 4.4.1 '@smithy/types': 4.14.1 - '@smithy/util-config-provider': 4.2.2 - '@smithy/util-middleware': 4.2.14 + '@smithy/util-config-provider': 4.3.1 + '@smithy/util-middleware': 4.3.1 tslib: 2.8.1 optional: true @@ -4212,8 +4515,8 @@ snapshots: dependencies: '@aws-sdk/nested-clients': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/property-provider': 4.3.1 + '@smithy/shared-ini-file-loader': 4.5.1 '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: @@ -4239,7 +4542,7 @@ snapshots: dependencies: '@aws-sdk/types': 3.804.0 '@smithy/types': 4.14.1 - '@smithy/util-endpoints': 3.4.2 + '@smithy/util-endpoints': 3.5.1 tslib: 2.8.1 optional: true @@ -4274,7 +4577,7 @@ snapshots: dependencies: '@aws-sdk/middleware-user-agent': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.3.14 + '@smithy/node-config-provider': 4.4.1 '@smithy/types': 4.14.1 tslib: 2.8.1 optional: true @@ -4319,14 +4622,14 @@ snapshots: '@design.estate/dees-comms@1.0.30': dependencies: - '@api.global/typedrequest': 3.3.0 + '@api.global/typedrequest': 3.3.1 '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/smartdelay': 3.1.0 broadcast-channel: 7.3.0 '@design.estate/dees-domtools@2.5.6': dependencies: - '@api.global/typedrequest': 3.3.0 + '@api.global/typedrequest': 3.3.1 '@design.estate/dees-comms': 1.0.30 '@push.rocks/lik': 6.4.1 '@push.rocks/smartdelay': 3.1.0 @@ -4381,86 +4684,164 @@ snapshots: '@esbuild/aix-ppc64@0.27.7': optional: true + '@esbuild/aix-ppc64@0.28.0': + optional: true + '@esbuild/android-arm64@0.27.7': optional: true + '@esbuild/android-arm64@0.28.0': + optional: true + '@esbuild/android-arm@0.27.7': optional: true + '@esbuild/android-arm@0.28.0': + optional: true + '@esbuild/android-x64@0.27.7': optional: true + '@esbuild/android-x64@0.28.0': + optional: true + '@esbuild/darwin-arm64@0.27.7': optional: true + '@esbuild/darwin-arm64@0.28.0': + optional: true + '@esbuild/darwin-x64@0.27.7': optional: true + '@esbuild/darwin-x64@0.28.0': + optional: true + '@esbuild/freebsd-arm64@0.27.7': optional: true + '@esbuild/freebsd-arm64@0.28.0': + optional: true + '@esbuild/freebsd-x64@0.27.7': optional: true + '@esbuild/freebsd-x64@0.28.0': + optional: true + '@esbuild/linux-arm64@0.27.7': optional: true + '@esbuild/linux-arm64@0.28.0': + optional: true + '@esbuild/linux-arm@0.27.7': optional: true + '@esbuild/linux-arm@0.28.0': + optional: true + '@esbuild/linux-ia32@0.27.7': optional: true + '@esbuild/linux-ia32@0.28.0': + optional: true + '@esbuild/linux-loong64@0.27.7': optional: true + '@esbuild/linux-loong64@0.28.0': + optional: true + '@esbuild/linux-mips64el@0.27.7': optional: true + '@esbuild/linux-mips64el@0.28.0': + optional: true + '@esbuild/linux-ppc64@0.27.7': optional: true + '@esbuild/linux-ppc64@0.28.0': + optional: true + '@esbuild/linux-riscv64@0.27.7': optional: true + '@esbuild/linux-riscv64@0.28.0': + optional: true + '@esbuild/linux-s390x@0.27.7': optional: true + '@esbuild/linux-s390x@0.28.0': + optional: true + '@esbuild/linux-x64@0.27.7': optional: true + '@esbuild/linux-x64@0.28.0': + optional: true + '@esbuild/netbsd-arm64@0.27.7': optional: true + '@esbuild/netbsd-arm64@0.28.0': + optional: true + '@esbuild/netbsd-x64@0.27.7': optional: true + '@esbuild/netbsd-x64@0.28.0': + optional: true + '@esbuild/openbsd-arm64@0.27.7': optional: true + '@esbuild/openbsd-arm64@0.28.0': + optional: true + '@esbuild/openbsd-x64@0.27.7': optional: true + '@esbuild/openbsd-x64@0.28.0': + optional: true + '@esbuild/openharmony-arm64@0.27.7': optional: true + '@esbuild/openharmony-arm64@0.28.0': + optional: true + '@esbuild/sunos-x64@0.27.7': optional: true + '@esbuild/sunos-x64@0.28.0': + optional: true + '@esbuild/win32-arm64@0.27.7': optional: true + '@esbuild/win32-arm64@0.28.0': + optional: true + '@esbuild/win32-ia32@0.27.7': optional: true + '@esbuild/win32-ia32@0.28.0': + optional: true + '@esbuild/win32-x64@0.27.7': optional: true - '@git.zone/tsbuild@4.4.0': + '@esbuild/win32-x64@0.28.0': + optional: true + + '@git.zone/tsbuild@4.4.1': dependencies: - '@git.zone/tspublish': 1.11.6 + '@git.zone/tspublish': 1.11.7 '@push.rocks/early': 4.0.4 - '@push.rocks/smartcli': 4.0.21 + '@push.rocks/smartcli': 4.1.0 '@push.rocks/smartdelay': 3.1.0 '@push.rocks/smartfile': 13.1.3 '@push.rocks/smartfs': 1.5.1 @@ -4478,10 +4859,10 @@ snapshots: - supports-color - vue - '@git.zone/tsbundle@2.10.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@git.zone/tsbundle@2.10.4': dependencies: '@push.rocks/early': 4.0.4 - '@push.rocks/smartcli': 4.0.21 + '@push.rocks/smartcli': 4.1.0 '@push.rocks/smartconfig': 6.1.1 '@push.rocks/smartdelay': 3.1.0 '@push.rocks/smartfs': 1.5.1 @@ -4491,25 +4872,24 @@ snapshots: '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.4 '@push.rocks/smartspawn': 3.0.4 - '@rspack/core': 1.7.11 + '@rspack/core': 2.0.3 '@types/html-minifier': 4.0.6 - esbuild: 0.27.7 + esbuild: 0.28.0 html-minifier: 4.0.0 - rolldown: 1.0.0-rc.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - typescript: 6.0.2 + rolldown: 1.0.0 + typescript: 6.0.3 transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + - '@module-federation/runtime-tools' - '@nuxt/kit' - '@swc/helpers' - react - supports-color - vue - '@git.zone/tspublish@1.11.6': + '@git.zone/tspublish@1.11.7': dependencies: '@push.rocks/consolecolor': 2.0.4 - '@push.rocks/smartcli': 4.0.21 + '@push.rocks/smartcli': 4.1.0 '@push.rocks/smartconfig': 6.1.1 '@push.rocks/smartdelay': 3.1.0 '@push.rocks/smartfile': 13.1.3 @@ -4518,7 +4898,7 @@ snapshots: '@push.rocks/smartnpm': 2.1.0 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartrequest': 5.0.3 - '@push.rocks/smartshell': 3.3.8 + '@push.rocks/smartshell': 3.5.0 transitivePeerDependencies: - '@nuxt/kit' - aws-crt @@ -4529,16 +4909,16 @@ snapshots: - supports-color - vue - '@git.zone/tsrun@2.0.3': + '@git.zone/tsrun@2.0.4': dependencies: '@push.rocks/smartfile': 13.1.3 - '@push.rocks/smartshell': 3.3.8 + '@push.rocks/smartshell': 3.5.0 tsx: 4.21.0 - '@git.zone/tstest@3.6.3(@aws-sdk/credential-providers@3.808.0)(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(socks@2.8.8)(typescript@6.0.3)': + '@git.zone/tstest@3.6.6(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8)(typescript@6.0.3)': dependencies: - '@git.zone/tsbundle': 2.10.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - '@git.zone/tsrun': 2.0.3 + '@git.zone/tsbundle': 2.10.4 + '@git.zone/tsrun': 2.0.4 '@push.rocks/consolecolor': 2.0.4 '@push.rocks/qenv': 6.1.4 '@push.rocks/smartbrowser': 2.0.11(typescript@6.0.3) @@ -4550,23 +4930,22 @@ snapshots: '@push.rocks/smartfs': 1.5.1 '@push.rocks/smartjson': 6.0.1 '@push.rocks/smartlog': 3.2.2 - '@push.rocks/smartmongo': 5.1.1(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8) + '@push.rocks/smartmongo': 7.0.0(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8) '@push.rocks/smartnetwork': 4.7.1 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.4 '@push.rocks/smartrequest': 5.0.3 '@push.rocks/smartserve': 2.0.4 - '@push.rocks/smartshell': 3.3.8 + '@push.rocks/smartshell': 3.5.0 '@push.rocks/smartstorage': 6.5.1 '@push.rocks/smarttime': 4.2.3 '@push.rocks/smartwatch': 6.4.0 '@types/ws': 8.18.1 figures: 6.1.0 - ws: 8.20.0 + ws: 8.20.1 transitivePeerDependencies: - '@aws-sdk/credential-providers' - - '@emnapi/core' - - '@emnapi/runtime' + - '@module-federation/runtime-tools' - '@mongodb-js/zstd' - '@nuxt/kit' - '@swc/helpers' @@ -4700,7 +5079,7 @@ snapshots: '@inquirer/figures': 1.0.15 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.19.17 + '@types/node': 22.19.19 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -5009,42 +5388,10 @@ snapshots: '@mixmark-io/domino@2.2.0': {} - '@module-federation/error-codes@0.22.0': {} - - '@module-federation/runtime-core@0.22.0': - dependencies: - '@module-federation/error-codes': 0.22.0 - '@module-federation/sdk': 0.22.0 - - '@module-federation/runtime-tools@0.22.0': - dependencies: - '@module-federation/runtime': 0.22.0 - '@module-federation/webpack-bundler-runtime': 0.22.0 - - '@module-federation/runtime@0.22.0': - dependencies: - '@module-federation/error-codes': 0.22.0 - '@module-federation/runtime-core': 0.22.0 - '@module-federation/sdk': 0.22.0 - - '@module-federation/sdk@0.22.0': {} - - '@module-federation/webpack-bundler-runtime@0.22.0': - dependencies: - '@module-federation/runtime': 0.22.0 - '@module-federation/sdk': 0.22.0 - '@mongodb-js/saslprep@1.4.11': dependencies: sparse-bitfield: 3.0.3 - '@napi-rs/wasm-runtime@1.0.7': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 - optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -5054,9 +5401,9 @@ snapshots: '@nodable/entities@2.1.0': {} - '@opentelemetry/api@1.9.0': {} + '@opentelemetry/api@1.9.1': {} - '@oxc-project/types@0.122.0': {} + '@oxc-project/types@0.129.0': {} '@pdf-lib/standard-fonts@1.0.0': dependencies: @@ -5301,7 +5648,7 @@ snapshots: dependencies: uint8array-extras: 1.5.0 - '@push.rocks/smartcli@4.0.21': + '@push.rocks/smartcli@4.1.0': dependencies: '@push.rocks/lik': 6.4.1 '@push.rocks/smartlog': 3.2.2 @@ -5545,6 +5892,29 @@ snapshots: - supports-color - vue + '@push.rocks/smartmongo@7.0.0(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8)': + dependencies: + '@push.rocks/mongodump': 1.1.1(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8) + '@push.rocks/smartdata': 7.1.7(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8) + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.4 + mongodb-memory-server: 11.1.0(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - '@nuxt/kit' + - bare-abort-controller + - bare-buffer + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react + - react-native-b4a + - snappy + - socks + - supports-color + - vue + '@push.rocks/smartnetwork@4.7.1': dependencies: '@push.rocks/smartdns': 7.9.2 @@ -5674,6 +6044,14 @@ snapshots: '@types/which': 3.0.4 which: 6.0.1 + '@push.rocks/smartshell@3.5.0': + dependencies: + '@push.rocks/smartdelay': 3.1.0 + '@push.rocks/smartexit': 2.0.3 + '@push.rocks/smartpromise': 4.2.4 + '@types/which': 3.0.4 + which: 7.0.0 + '@push.rocks/smartspawn@3.0.4': dependencies: '@push.rocks/smartpromise': 4.2.4 @@ -5730,7 +6108,7 @@ snapshots: '@push.rocks/smartversion@3.1.0': dependencies: '@types/semver': 7.7.1 - semver: 7.7.4 + semver: 7.8.0 '@push.rocks/smartwatch@6.4.0': dependencies: @@ -5744,7 +6122,7 @@ snapshots: '@push.rocks/smartyaml@3.0.5': dependencies: - yaml: 2.8.4 + yaml: 2.9.0 '@push.rocks/taskbuffer@8.0.2': dependencies: @@ -5790,110 +6168,107 @@ snapshots: dependencies: '@push.rocks/smartenv': 5.0.13 - '@rolldown/binding-android-arm64@1.0.0-rc.11': + '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.11': + '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.11': + '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.11': + '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11': + '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.11': + '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11': + '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11': + '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.11': + '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.11': + '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.11': + '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@rolldown/binding-wasm32-wasi@1.0.0': dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11': + '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.11': + '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rolldown/pluginutils@1.0.0-rc.11': {} + '@rolldown/pluginutils@1.0.0': {} - '@rspack/binding-darwin-arm64@1.7.11': + '@rspack/binding-darwin-arm64@2.0.3': optional: true - '@rspack/binding-darwin-x64@1.7.11': + '@rspack/binding-darwin-x64@2.0.3': optional: true - '@rspack/binding-linux-arm64-gnu@1.7.11': + '@rspack/binding-linux-arm64-gnu@2.0.3': optional: true - '@rspack/binding-linux-arm64-musl@1.7.11': + '@rspack/binding-linux-arm64-musl@2.0.3': optional: true - '@rspack/binding-linux-x64-gnu@1.7.11': + '@rspack/binding-linux-x64-gnu@2.0.3': optional: true - '@rspack/binding-linux-x64-musl@1.7.11': + '@rspack/binding-linux-x64-musl@2.0.3': optional: true - '@rspack/binding-wasm32-wasi@1.7.11': + '@rspack/binding-wasm32-wasi@2.0.3': dependencies: - '@napi-rs/wasm-runtime': 1.0.7 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rspack/binding-win32-arm64-msvc@1.7.11': + '@rspack/binding-win32-arm64-msvc@2.0.3': optional: true - '@rspack/binding-win32-ia32-msvc@1.7.11': + '@rspack/binding-win32-ia32-msvc@2.0.3': optional: true - '@rspack/binding-win32-x64-msvc@1.7.11': + '@rspack/binding-win32-x64-msvc@2.0.3': optional: true - '@rspack/binding@1.7.11': + '@rspack/binding@2.0.3': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.7.11 - '@rspack/binding-darwin-x64': 1.7.11 - '@rspack/binding-linux-arm64-gnu': 1.7.11 - '@rspack/binding-linux-arm64-musl': 1.7.11 - '@rspack/binding-linux-x64-gnu': 1.7.11 - '@rspack/binding-linux-x64-musl': 1.7.11 - '@rspack/binding-wasm32-wasi': 1.7.11 - '@rspack/binding-win32-arm64-msvc': 1.7.11 - '@rspack/binding-win32-ia32-msvc': 1.7.11 - '@rspack/binding-win32-x64-msvc': 1.7.11 + '@rspack/binding-darwin-arm64': 2.0.3 + '@rspack/binding-darwin-x64': 2.0.3 + '@rspack/binding-linux-arm64-gnu': 2.0.3 + '@rspack/binding-linux-arm64-musl': 2.0.3 + '@rspack/binding-linux-x64-gnu': 2.0.3 + '@rspack/binding-linux-x64-musl': 2.0.3 + '@rspack/binding-wasm32-wasi': 2.0.3 + '@rspack/binding-win32-arm64-msvc': 2.0.3 + '@rspack/binding-win32-ia32-msvc': 2.0.3 + '@rspack/binding-win32-x64-msvc': 2.0.3 - '@rspack/core@1.7.11': + '@rspack/core@2.0.3': dependencies: - '@module-federation/runtime-tools': 0.22.0 - '@rspack/binding': 1.7.11 - '@rspack/lite-tapable': 1.1.0 - - '@rspack/lite-tapable@1.1.0': {} + '@rspack/binding': 2.0.3 '@sec-ant/readable-stream@0.4.1': {} @@ -5915,6 +6290,12 @@ snapshots: '@smithy/util-middleware': 4.2.14 tslib: 2.8.1 + '@smithy/config-resolver@4.5.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/core@3.23.17': dependencies: '@smithy/protocol-http': 5.3.14 @@ -5928,6 +6309,13 @@ snapshots: '@smithy/uuid': 1.1.2 tslib: 2.8.1 + '@smithy/core@3.24.1': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + optional: true + '@smithy/credential-provider-imds@4.2.14': dependencies: '@smithy/node-config-provider': 4.3.14 @@ -5936,6 +6324,13 @@ snapshots: '@smithy/url-parser': 4.2.14 tslib: 2.8.1 + '@smithy/credential-provider-imds@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + optional: true + '@smithy/eventstream-codec@4.2.14': dependencies: '@aws-crypto/crc32': 5.2.0 @@ -5974,6 +6369,13 @@ snapshots: '@smithy/util-base64': 4.3.2 tslib: 2.8.1 + '@smithy/fetch-http-handler@5.4.1': + dependencies: + '@smithy/core': 3.24.1 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + optional: true + '@smithy/hash-blob-browser@4.2.15': dependencies: '@smithy/chunked-blob-reader': 5.2.2 @@ -5988,6 +6390,12 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@smithy/hash-node@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/hash-stream-node@4.2.14': dependencies: '@smithy/types': 4.14.1 @@ -5999,6 +6407,12 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/invalid-dependency@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 @@ -6019,6 +6433,12 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/middleware-content-length@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/middleware-endpoint@4.4.32': dependencies: '@smithy/core': 3.23.17 @@ -6030,6 +6450,12 @@ snapshots: '@smithy/util-middleware': 4.2.14 tslib: 2.8.1 + '@smithy/middleware-endpoint@4.5.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/middleware-retry@4.5.7': dependencies: '@smithy/core': 3.23.17 @@ -6043,6 +6469,12 @@ snapshots: '@smithy/uuid': 1.1.2 tslib: 2.8.1 + '@smithy/middleware-retry@4.6.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/middleware-serde@4.2.20': dependencies: '@smithy/core': 3.23.17 @@ -6050,11 +6482,23 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/middleware-serde@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/middleware-stack@4.2.14': dependencies: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/middleware-stack@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/node-config-provider@4.3.14': dependencies: '@smithy/property-provider': 4.2.14 @@ -6062,6 +6506,12 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/node-config-provider@4.4.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/node-http-handler@4.6.1': dependencies: '@smithy/protocol-http': 5.3.14 @@ -6069,16 +6519,35 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/node-http-handler@4.7.1': + dependencies: + '@smithy/core': 3.24.1 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + optional: true + '@smithy/property-provider@4.2.14': dependencies: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/property-provider@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/protocol-http@5.3.14': dependencies: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/protocol-http@5.4.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/querystring-builder@4.2.14': dependencies: '@smithy/types': 4.14.1 @@ -6099,6 +6568,12 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/shared-ini-file-loader@4.5.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/signature-v4@5.3.14': dependencies: '@smithy/is-array-buffer': 4.2.2 @@ -6110,6 +6585,13 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@smithy/signature-v4@5.4.1': + dependencies: + '@smithy/core': 3.24.1 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + optional: true + '@smithy/smithy-client@4.12.13': dependencies: '@smithy/core': 3.23.17 @@ -6120,6 +6602,13 @@ snapshots: '@smithy/util-stream': 4.5.25 tslib: 2.8.1 + '@smithy/smithy-client@4.13.1': + dependencies: + '@smithy/core': 3.24.1 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + optional: true + '@smithy/types@4.14.1': dependencies: tslib: 2.8.1 @@ -6130,20 +6619,44 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/url-parser@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-base64@4.3.2': dependencies: '@smithy/util-buffer-from': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@smithy/util-base64@4.4.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-body-length-browser@4.2.2': dependencies: tslib: 2.8.1 + '@smithy/util-body-length-browser@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-body-length-node@4.2.3': dependencies: tslib: 2.8.1 + '@smithy/util-body-length-node@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-buffer-from@2.2.0': dependencies: '@smithy/is-array-buffer': 2.2.0 @@ -6158,6 +6671,12 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-config-provider@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-defaults-mode-browser@4.3.49': dependencies: '@smithy/property-provider': 4.2.14 @@ -6165,6 +6684,12 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@4.4.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-defaults-mode-node@4.2.54': dependencies: '@smithy/config-resolver': 4.4.17 @@ -6175,12 +6700,24 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/util-defaults-mode-node@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-endpoints@3.4.2': dependencies: '@smithy/node-config-provider': 4.3.14 '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/util-endpoints@3.5.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-hex-encoding@4.2.2': dependencies: tslib: 2.8.1 @@ -6190,12 +6727,24 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/util-middleware@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-retry@4.3.8': dependencies: '@smithy/service-error-classification': 4.3.1 '@smithy/types': 4.14.1 tslib: 2.8.1 + '@smithy/util-retry@4.4.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-stream@4.5.25': dependencies: '@smithy/fetch-http-handler': 5.3.17 @@ -6207,6 +6756,12 @@ snapshots: '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 + '@smithy/util-stream@4.6.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-uri-escape@4.2.2': dependencies: tslib: 2.8.1 @@ -6221,6 +6776,12 @@ snapshots: '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 + '@smithy/util-utf8@4.3.1': + dependencies: + '@smithy/core': 3.24.1 + tslib: 2.8.1 + optional: true + '@smithy/util-waiter@4.3.0': dependencies: '@smithy/types': 4.14.1 @@ -6262,7 +6823,7 @@ snapshots: '@types/clean-css@4.2.11': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.7.0 source-map: 0.6.1 '@types/debug@4.1.13': @@ -6299,25 +6860,25 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.7.0 '@types/node-forge@1.3.14': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.7.0 '@types/node@16.9.1': {} - '@types/node@22.19.17': + '@types/node@22.19.19': dependencies: undici-types: 6.21.0 - '@types/node@25.6.0': + '@types/node@25.7.0': dependencies: - undici-types: 7.19.2 + undici-types: 7.21.0 '@types/pngjs@6.0.5': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.7.0 '@types/relateurl@0.2.33': {} @@ -6327,7 +6888,7 @@ snapshots: '@types/through2@2.0.41': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.7.0 '@types/trusted-types@2.0.7': {} @@ -6353,11 +6914,11 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.7.0 '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.6.0 + '@types/node': 25.7.0 optional: true '@ungap/structured-clone@1.3.1': {} @@ -6380,12 +6941,12 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@6.0.175(zod@3.25.76): + ai@6.0.180(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 3.0.110(zod@3.25.76) + '@ai-sdk/gateway': 3.0.114(zod@3.25.76) '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@3.25.76) - '@opentelemetry/api': 1.9.0 + '@ai-sdk/provider-utils': 4.0.27(zod@3.25.76) + '@opentelemetry/api': 1.9.1 zod: 3.25.76 ansi-256-colors@1.1.0: {} @@ -6694,6 +7255,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.7 '@esbuild/win32-x64': 0.27.7 + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + escalade@3.2.0: {} escape-string-regexp@5.0.0: {} @@ -7495,7 +8085,7 @@ snapshots: https-proxy-agent: 7.0.6 mongodb: 7.2.0(@aws-sdk/credential-providers@3.808.0)(socks@2.8.8) new-find-package-json: 2.0.0 - semver: 7.7.4 + semver: 7.8.0 tar-stream: 3.2.0 tslib: 2.8.1 yauzl: 3.3.0 @@ -7570,9 +8160,9 @@ snapshots: dependencies: wrappy: 1.0.2 - openai@6.36.0(ws@8.20.0)(zod@3.25.76): + openai@6.37.0(ws@8.20.1)(zod@3.25.76): optionalDependencies: - ws: 8.20.0 + ws: 8.20.1 zod: 3.25.76 os-tmpdir@1.0.2: {} @@ -7623,7 +8213,7 @@ snapshots: ky: 1.14.3 registry-auth-token: 5.1.1 registry-url: 6.0.1 - semver: 7.7.4 + semver: 7.8.0 pako@1.0.11: {} @@ -7850,29 +8440,26 @@ snapshots: glob: 13.0.6 package-json-from-dist: 1.0.1 - rolldown@1.0.0-rc.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + rolldown@1.0.0: dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.11 + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.11 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.11 - '@rolldown/binding-darwin-x64': 1.0.0-rc.11 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.11 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.11 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.11 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.11 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.11 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.11 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.11 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@rolldown/binding-android-arm64': 1.0.0 + '@rolldown/binding-darwin-arm64': 1.0.0 + '@rolldown/binding-darwin-x64': 1.0.0 + '@rolldown/binding-freebsd-x64': 1.0.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0 + '@rolldown/binding-linux-arm64-gnu': 1.0.0 + '@rolldown/binding-linux-arm64-musl': 1.0.0 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0 + '@rolldown/binding-linux-s390x-gnu': 1.0.0 + '@rolldown/binding-linux-x64-gnu': 1.0.0 + '@rolldown/binding-linux-x64-musl': 1.0.0 + '@rolldown/binding-openharmony-arm64': 1.0.0 + '@rolldown/binding-wasm32-wasi': 1.0.0 + '@rolldown/binding-win32-arm64-msvc': 1.0.0 + '@rolldown/binding-win32-x64-msvc': 1.0.0 run-async@3.0.0: {} @@ -7890,6 +8477,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -8142,8 +8731,6 @@ snapshots: typed-query-selector@2.12.2: {} - typescript@6.0.2: {} - typescript@6.0.3: {} uglify-js@3.19.3: {} @@ -8152,7 +8739,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.19.2: {} + undici-types@7.21.0: {} undici-types@8.2.0: {} @@ -8228,6 +8815,10 @@ snapshots: dependencies: isexe: 4.0.0 + which@7.0.0: + dependencies: + isexe: 4.0.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -8244,6 +8835,8 @@ snapshots: ws@8.20.0: {} + ws@8.20.1: {} + xml-parse-from-string@1.0.1: {} xml2js@0.5.0: @@ -8257,6 +8850,8 @@ snapshots: yaml@2.8.4: {} + yaml@2.9.0: {} + yargs-parser@21.1.1: {} yargs-parser@22.0.0: {} diff --git a/readme.hints.md b/readme.hints.md index 18d17d0..152aac9 100644 --- a/readme.hints.md +++ b/readme.hints.md @@ -10,6 +10,7 @@ The package is a **provider registry** built on the Vercel AI SDK (`ai` v6). The - Providers: anthropic, openai, google, groq, mistral, xai, perplexity, ollama - Anthropic prompt caching via `wrapLanguageModel` middleware (enabled by default) - Custom Ollama provider implementing `LanguageModelV3` directly (for think, num_ctx support) +- OpenAI ChatGPT/Max device-code auth in `smartai.auth.openai.ts`; `openAiMaxAuth` routes OpenAI models to the ChatGPT Codex backend ### Subpath Exports - `@push.rocks/smartai/vision` — `analyzeImage()` using `generateText` with image content @@ -43,6 +44,7 @@ The package is a **provider registry** built on the Vercel AI SDK (`ai` v6). The - `qenv.getEnvVarOnDemand()` returns a Promise — must be awaited in tests - OpenAI reasoning options belong in AI SDK `providerOptions`, not model construction options - SmartAI accepts OpenAI model IDs as plain strings, including `gpt-5.5` +- ChatGPT-authenticated OpenAI model calls use `https://chatgpt.com/backend-api/codex` plus bearer access token and `ChatGPT-Account-ID`, not `https://api.openai.com/v1` ## Testing diff --git a/readme.md b/readme.md index 273e2df..e45de47 100644 --- a/readme.md +++ b/readme.md @@ -17,7 +17,7 @@ For reporting bugs, issues, or security vulnerabilities, please visit [community - **🔌 One function, eight providers** — `getModel()` returns a standard `LanguageModelV3`. Switch providers by changing a string. - **🧱 Built on Vercel AI SDK** — Uses `ai` v6 under the hood. Your model works with `generateText()`, `streamText()`, tool calling, structured output, and everything else in the AI SDK ecosystem. - **🏠 Custom Ollama provider** — A full `LanguageModelV3` implementation for Ollama with support for `think` mode, `num_ctx`, auto-tuned temperature for Qwen models, and native tool calling. -- **💰 Anthropic prompt caching** — Automatic `cacheControl` middleware reduces cost and latency on repeated calls. Enabled by default, opt out with `promptCaching: false`. +- **💰 Prompt caching** — Anthropic cache-control middleware is enabled by default; provider cache helpers are available for agent/session integrations. - **📦 Modular subpath exports** — Vision, audio, image, document, and research capabilities ship as separate imports. Only import what you need. - **⚡ Zero lock-in** — Your code uses standard AI SDK types. Swap providers without touching application logic. @@ -107,6 +107,30 @@ console.log(result.text); OpenAI `reasoningEffort` supports `'none'`, `'minimal'`, `'low'`, `'medium'`, `'high'`, and `'xhigh'`. Model IDs are accepted as strings, so new IDs like `'gpt-5.5'` can be used before upstream model unions are updated. +### OpenAI Max / ChatGPT Auth + +SmartAI can request ChatGPT subscription-backed Codex credentials with OpenAI's device-code flow. The returned credentials are passed to `getModel()` through `openAiMaxAuth`; SmartAI then routes OpenAI model calls through the ChatGPT Codex backend with the required account headers. + +```typescript +import { + completeOpenAiMaxDeviceCodeLogin, + getModel, + requestOpenAiMaxDeviceCode, +} from '@push.rocks/smartai'; + +const deviceCode = await requestOpenAiMaxDeviceCode(); +console.log(`Open ${deviceCode.verificationUrl} and enter ${deviceCode.userCode}`); + +const openAiMaxAuth = await completeOpenAiMaxDeviceCodeLogin(deviceCode); +const model = getModel({ + provider: 'openai', + model: 'gpt-5.5', + openAiMaxAuth, +}); +``` + +Use `refreshOpenAiMaxTokenData(openAiMaxAuth)` before stored credentials expire, or after receiving an unauthorized response. + ### Re-exported AI SDK Functions SmartAI re-exports the most commonly used functions from `ai` for convenience: @@ -250,9 +274,9 @@ console.log(result.text); - **Streaming with reasoning** — `doStream()` emits proper `reasoning-start`, `reasoning-delta`, `reasoning-end` parts alongside text. - **All Ollama options** — `num_ctx`, `top_k`, `top_p`, `repeat_penalty`, `num_predict`, `stop`, `seed`. -## 💰 Anthropic Prompt Caching +## 💰 Prompt Caching -When using the Anthropic provider, SmartAI automatically wraps the model with caching middleware that adds `cacheControl: { type: 'ephemeral' }` to the last system message and last user message. This can significantly reduce cost and latency for repeated calls with the same system prompt. +When using the Anthropic provider, SmartAI automatically wraps the model with caching middleware. The middleware follows the same breakpoint strategy used by opencode: cache the first two system messages and the two most recent non-system messages. This can significantly reduce cost and latency for repeated agent calls with stable system/tool context. ```typescript // Caching enabled by default @@ -271,6 +295,17 @@ const modelNoCaching = getModel({ }); ``` +Longer Anthropic cache TTL is opt-in: + +```typescript +const modelWithOneHourCache = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey: process.env.ANTHROPIC_TOKEN, + promptCaching: { retention: '1h' }, +}); +``` + You can also use the middleware directly: ```typescript @@ -281,6 +316,23 @@ const middleware = createAnthropicCachingMiddleware(); const cachedModel = wrapLanguageModel({ model: baseModel, middleware }); ``` +For agent frameworks, SmartAI exports lower-level helpers: + +```typescript +import { + applySmartAiCacheProviderOptions, + createSmartAiCachingMiddleware, +} from '@push.rocks/smartai'; + +const providerOptions = applySmartAiCacheProviderOptions({ + provider: 'openai', + sessionId: 'stable-session-id', + cache: 'auto', +}); +``` + +OpenAI request-level cache affinity is only added when a stable `sessionId` or explicit cache `key` is provided. Extended OpenAI retention (`'24h'`) is opt-in. + ## 📦 Subpath Exports SmartAI provides specialized capabilities as separate subpath imports. Each one is a focused utility that takes a model (or API key) and does one thing well. diff --git a/test/test.openai-auth.node.ts b/test/test.openai-auth.node.ts new file mode 100644 index 0000000..e869d69 --- /dev/null +++ b/test/test.openai-auth.node.ts @@ -0,0 +1,209 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as smartai from '../ts/index.js'; +import type { IOpenAiMaxTokenData } from '../ts/index.js'; + +interface IMockFetchRequest { + url: string; + init?: RequestInit; +} + +function createJwt(payload: Record): string { + const encode = (value: Record) => Buffer.from(JSON.stringify(value)).toString('base64url'); + return `${encode({ alg: 'none', typ: 'JWT' })}.${encode(payload)}.sig`; +} + +function createTokenData(accountId = 'workspace-1'): IOpenAiMaxTokenData { + const idToken = createJwt({ + email: 'user@example.com', + exp: 4_102_444_800, + 'https://api.openai.com/auth': { + chatgpt_plan_type: 'pro', + chatgpt_user_id: 'user-1', + chatgpt_account_id: accountId, + chatgpt_account_is_fedramp: false, + }, + }); + const idTokenInfo = smartai.parseOpenAiMaxIdToken(idToken); + return { + idToken, + accessToken: 'access-token', + refreshToken: 'refresh-token', + accountId, + idTokenInfo, + }; +} + +function jsonResponse(body: unknown, status = 200): Response { + return new Response(JSON.stringify(body), { + status, + headers: { 'content-type': 'application/json' }, + }); +} + +function getHeader(init: RequestInit | undefined, name: string): string | null { + return new Headers(init?.headers).get(name); +} + +tap.test('requestOpenAiMaxDeviceCode requests a user code', async () => { + const originalFetch = globalThis.fetch; + const requests: IMockFetchRequest[] = []; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push({ url: String(input), init }); + return jsonResponse({ + device_auth_id: 'device-1', + usercode: 'ABCD-EFGH', + interval: '2', + }); + }; + + try { + const deviceCode = await smartai.requestOpenAiMaxDeviceCode({ + issuer: 'https://auth.example.test', + clientId: 'client-1', + }); + + expect(deviceCode).toEqual({ + verificationUrl: 'https://auth.example.test/codex/device', + userCode: 'ABCD-EFGH', + deviceAuthId: 'device-1', + intervalSeconds: 2, + }); + expect(requests[0].url).toEqual('https://auth.example.test/api/accounts/deviceauth/usercode'); + expect(JSON.parse(String(requests[0].init?.body))).toEqual({ client_id: 'client-1' }); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('completeOpenAiMaxDeviceCodeLogin polls and exchanges OAuth tokens', async () => { + const originalFetch = globalThis.fetch; + const requests: IMockFetchRequest[] = []; + const tokenData = createTokenData('workspace-1'); + const responses = [ + jsonResponse({}, 403), + jsonResponse({ + authorization_code: 'auth-code', + code_challenge: 'challenge', + code_verifier: 'verifier', + }), + jsonResponse({ + id_token: tokenData.idToken, + access_token: tokenData.accessToken, + refresh_token: tokenData.refreshToken, + }), + ]; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push({ url: String(input), init }); + const response = responses.shift(); + if (!response) throw new Error('Unexpected fetch call'); + return response; + }; + + try { + const result = await smartai.completeOpenAiMaxDeviceCodeLogin({ + verificationUrl: 'https://auth.example.test/codex/device', + userCode: 'ABCD-EFGH', + deviceAuthId: 'device-1', + intervalSeconds: 1, + }, { + issuer: 'https://auth.example.test', + clientId: 'client-1', + forcedChatGptWorkspaceId: 'workspace-1', + sleep: async () => undefined, + }); + + expect(result.accessToken).toEqual('access-token'); + expect(result.refreshToken).toEqual('refresh-token'); + expect(result.idTokenInfo.chatgptAccountId).toEqual('workspace-1'); + expect(requests.length).toEqual(3); + expect(JSON.parse(String(requests[0].init?.body))).toEqual({ + device_auth_id: 'device-1', + user_code: 'ABCD-EFGH', + }); + const tokenExchangeBody = new URLSearchParams(String(requests[2].init?.body)); + expect(tokenExchangeBody.get('grant_type')).toEqual('authorization_code'); + expect(tokenExchangeBody.get('code')).toEqual('auth-code'); + expect(tokenExchangeBody.get('redirect_uri')).toEqual('https://auth.example.test/deviceauth/callback'); + expect(tokenExchangeBody.get('client_id')).toEqual('client-1'); + expect(tokenExchangeBody.get('code_verifier')).toEqual('verifier'); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('refreshOpenAiMaxTokenData refreshes and preserves omitted token fields', async () => { + const originalFetch = globalThis.fetch; + const requests: IMockFetchRequest[] = []; + const tokenData = createTokenData('workspace-1'); + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + requests.push({ url: String(input), init }); + return jsonResponse({ access_token: 'new-access-token' }); + }; + + try { + const result = await smartai.refreshOpenAiMaxTokenData(tokenData, { + issuer: 'https://auth.example.test', + clientId: 'client-1', + }); + + expect(result.accessToken).toEqual('new-access-token'); + expect(result.refreshToken).toEqual('refresh-token'); + expect(result.idToken).toEqual(tokenData.idToken); + expect(JSON.parse(String(requests[0].init?.body))).toEqual({ + client_id: 'client-1', + grant_type: 'refresh_token', + refresh_token: 'refresh-token', + }); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('getModel uses ChatGPT Codex backend for OpenAI Max auth', async () => { + const originalFetch = globalThis.fetch; + let capturedRequest: IMockFetchRequest | undefined; + const tokenData = createTokenData('workspace-1'); + const model = smartai.getModel({ + provider: 'openai', + model: 'gpt-5.5', + openAiMaxAuth: tokenData, + }); + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + capturedRequest = { url: String(input), init }; + return jsonResponse({ + id: 'resp-1', + created_at: 1, + model: 'gpt-5.5', + output: [{ + type: 'message', + role: 'assistant', + id: 'msg-1', + content: [{ type: 'output_text', text: 'ok', annotations: [] }], + }], + usage: { + input_tokens: 1, + output_tokens: 1, + }, + }); + }; + + try { + await model.doGenerate({ + prompt: [{ role: 'user', content: [{ type: 'text', text: 'hello' }] }], + inputFormat: 'prompt', + } as any); + + expect(capturedRequest?.url).toEqual('https://chatgpt.com/backend-api/codex/responses'); + expect(getHeader(capturedRequest?.init, 'authorization')).toEqual('Bearer access-token'); + expect(getHeader(capturedRequest?.init, 'chatgpt-account-id')).toEqual('workspace-1'); + expect(getHeader(capturedRequest?.init, 'originator')).toEqual('smartai'); + } finally { + globalThis.fetch = originalFetch; + } +}); + +export default tap.start(); diff --git a/test/test.smartai.ts b/test/test.smartai.ts index f8fdd9b..b7f787a 100644 --- a/test/test.smartai.ts +++ b/test/test.smartai.ts @@ -2,6 +2,7 @@ import { tap, expect } from '@git.zone/tstest/tapbundle'; import * as qenv from '@push.rocks/qenv'; import { simulateReadableStream } from 'ai'; import { MockLanguageModelV3 } from 'ai/test'; +import type { LanguageModelV3Prompt } from '@ai-sdk/provider'; import * as smartai from '../ts/index.js'; const testQenv = new qenv.Qenv('./', './.nogit/'); @@ -53,6 +54,56 @@ tap.test('getModel with anthropic prompt caching returns wrapped model', async ( expect(modelNoCaching).toHaveProperty('doGenerate'); }); +tap.test('applySmartAiPromptCaching should mark opencode-style breakpoints', async () => { + const prompt: LanguageModelV3Prompt = [ + { role: 'system', content: 'stable system one' }, + { role: 'system', content: 'stable system two' }, + { role: 'system', content: 'uncached system three' }, + { role: 'user', content: [{ type: 'text', text: 'old user' }] }, + { role: 'assistant', content: [{ type: 'text', text: 'recent assistant' }] }, + { role: 'user', content: [{ type: 'text', text: 'recent user' }] }, + ]; + + const cached = smartai.applySmartAiPromptCaching(prompt, { provider: 'anthropic' }); + + expect((cached[0].providerOptions as any)?.anthropic?.cacheControl?.type).toEqual('ephemeral'); + expect((cached[1].providerOptions as any)?.anthropic?.cacheControl?.type).toEqual('ephemeral'); + expect((cached[2].providerOptions as any)?.anthropic).toBeUndefined(); + expect((cached[3].providerOptions as any)?.anthropic).toBeUndefined(); + expect((cached[4].providerOptions as any)?.anthropic?.cacheControl?.type).toEqual('ephemeral'); + expect((cached[5].providerOptions as any)?.anthropic?.cacheControl?.type).toEqual('ephemeral'); +}); + +tap.test('applySmartAiPromptCaching should use content-level options for compatible providers', async () => { + const prompt: LanguageModelV3Prompt = [ + { role: 'user', content: [{ type: 'text', text: 'cache this' }] }, + ]; + + const cached = smartai.applySmartAiPromptCaching(prompt, { provider: 'openaiCompatible' }); + const userContent = cached[0].role === 'user' ? cached[0].content : []; + const lastPart = userContent[0]; + + expect((lastPart.providerOptions as any)?.openaiCompatible?.cache_control?.type).toEqual('ephemeral'); +}); + +tap.test('applySmartAiCacheProviderOptions should add OpenAI cache defaults without overriding caller options', async () => { + const providerOptions = smartai.applySmartAiCacheProviderOptions({ + provider: 'openai', + sessionId: 'session-123', + cache: 'auto', + providerOptions: { + openai: { + reasoningEffort: 'high', + }, + }, + }); + + expect(providerOptions?.openai?.store).toEqual(false); + expect(providerOptions?.openai?.promptCacheKey).toEqual('session-123'); + expect(providerOptions?.openai?.promptCacheRetention).toEqual('in_memory'); + expect(providerOptions?.openai?.reasoningEffort).toEqual('high'); +}); + tap.test('generateText with anthropic model', async () => { const apiKey = await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'); if (!apiKey) { diff --git a/ts/index.ts b/ts/index.ts index ed8ee25..9f49767 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,6 +1,13 @@ export { getModel, getModelSetup } from './smartai.classes.smartai.js'; export type { IOpenAiProviderOptions, + IOpenAiMaxAuthCredentials, + IOpenAiMaxAuthOptions, + IOpenAiMaxCompleteDeviceCodeOptions, + IOpenAiMaxDeviceCode, + IOpenAiMaxDeviceCodePollOptions, + IOpenAiMaxIdTokenInfo, + IOpenAiMaxTokenData, ISmartAiModelSetup, ISmartAiOptions, TOpenAiReasoningEffort, @@ -9,9 +16,41 @@ export type { TSmartAiProviderOptions, IOllamaModelOptions, LanguageModelV3, + LanguageModelV3Prompt, } from './smartai.interfaces.js'; export { createAnthropicCachingMiddleware } from './smartai.middleware.anthropic.js'; +export { + applySmartAiCacheProviderOptions, + applySmartAiPromptCaching, + createSmartAiCachingMiddleware, + getSmartAiCacheProviderOptions, + getSmartAiMessageCacheProviderOptions, + mergeSmartAiProviderOptions, + resolveSmartAiCacheProvider, +} from './smartai.cache.js'; +export type { + ISmartAiCacheOptions, + TSmartAiCacheRetention, + TSmartAiCacheSetting, + TSmartAiMessageCacheProvider, +} from './smartai.cache.js'; export { createOllamaModel } from './smartai.provider.ollama.js'; +export { + OPENAI_MAX_AUTH_ISSUER, + OPENAI_MAX_CLIENT_ID, + OPENAI_MAX_CODEX_BASE_URL, + OPENAI_MAX_DEFAULT_ORIGINATOR, + OpenAiMaxAuthError, + completeOpenAiMaxDeviceCodeLogin, + createOpenAiMaxProviderSettings, + ensureOpenAiMaxWorkspaceAllowed, + exchangeOpenAiMaxAuthorizationCode, + parseOpenAiMaxIdToken, + pollOpenAiMaxDeviceCode, + refreshOpenAiMaxTokenData, + requestOpenAiMaxDeviceCode, +} from './smartai.auth.openai.js'; +export type { IOpenAiMaxAuthorizationCode } from './smartai.auth.openai.js'; // Re-export commonly used ai-sdk functions for consumer convenience export { generateText, streamText, tool, jsonSchema } from 'ai'; diff --git a/ts/smartai.auth.openai.ts b/ts/smartai.auth.openai.ts new file mode 100644 index 0000000..dcc77cc --- /dev/null +++ b/ts/smartai.auth.openai.ts @@ -0,0 +1,303 @@ +import type { + IOpenAiMaxAuthCredentials, + IOpenAiMaxAuthOptions, + IOpenAiMaxCompleteDeviceCodeOptions, + IOpenAiMaxDeviceCode, + IOpenAiMaxDeviceCodePollOptions, + IOpenAiMaxIdTokenInfo, + IOpenAiMaxTokenData, +} from './smartai.interfaces.js'; + +export const OPENAI_MAX_AUTH_ISSUER = 'https://auth.openai.com'; +export const OPENAI_MAX_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann'; +export const OPENAI_MAX_CODEX_BASE_URL = 'https://chatgpt.com/backend-api/codex'; +export const OPENAI_MAX_DEFAULT_ORIGINATOR = 'smartai'; + +const DEVICE_CODE_TIMEOUT_MS = 15 * 60 * 1000; + +export class OpenAiMaxAuthError extends Error { + public status?: number; + public body?: string; + + constructor(message: string, options: { status?: number; body?: string } = {}) { + super(message); + this.name = 'OpenAiMaxAuthError'; + this.status = options.status; + this.body = options.body; + } +} + +export interface IOpenAiMaxAuthorizationCode { + authorizationCode: string; + codeChallenge: string; + codeVerifier: string; +} + +interface IOpenAiMaxTokenResponse { + id_token?: unknown; + access_token?: unknown; + refresh_token?: unknown; +} + +function getFetch(options: IOpenAiMaxAuthOptions): typeof fetch { + const fetchFunction = options.fetch ?? globalThis.fetch; + if (!fetchFunction) { + throw new OpenAiMaxAuthError('fetch is not available for OpenAI Max authentication.'); + } + return fetchFunction; +} + +function getIssuer(options: IOpenAiMaxAuthOptions): string { + return (options.issuer ?? OPENAI_MAX_AUTH_ISSUER).replace(/\/+$/, ''); +} + +function getClientId(options: IOpenAiMaxAuthOptions): string { + return options.clientId ?? OPENAI_MAX_CLIENT_ID; +} + +function asString(value: unknown, name: string): string { + if (typeof value !== 'string' || value.length === 0) { + throw new OpenAiMaxAuthError(`OpenAI Max auth response is missing ${name}.`); + } + return value; +} + +function asOptionalString(value: unknown): string | undefined { + return typeof value === 'string' && value.length > 0 ? value : undefined; +} + +function asIntervalSeconds(value: unknown): number { + const interval = typeof value === 'number' ? value : Number.parseInt(String(value ?? ''), 10); + if (!Number.isFinite(interval) || interval <= 0) { + throw new OpenAiMaxAuthError('OpenAI Max device-code response has an invalid interval.'); + } + return interval; +} + +async function readJson(response: Response, context: string): Promise { + const body = await response.text(); + if (!response.ok) { + throw new OpenAiMaxAuthError(`${context} failed with status ${response.status}.`, { + status: response.status, + body, + }); + } + + try { + return body ? JSON.parse(body) : {}; + } catch (error) { + throw new OpenAiMaxAuthError(`${context} returned invalid JSON: ${(error as Error).message}`, { + status: response.status, + body, + }); + } +} + +async function postJson(url: string, body: unknown, options: IOpenAiMaxAuthOptions): Promise { + const response = await getFetch(options)(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + return readJson(response, `POST ${url}`); +} + +async function postForm(url: string, body: URLSearchParams, options: IOpenAiMaxAuthOptions): Promise { + const response = await getFetch(options)(url, { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: body.toString(), + }); + return readJson(response, `POST ${url}`); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function parseJwtPayload(jwt: string): Record { + const parts = jwt.split('.'); + if (parts.length !== 3 || !parts[1]) { + throw new OpenAiMaxAuthError('OpenAI Max auth returned an invalid ID token.'); + } + + try { + return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8')) as Record; + } catch (error) { + throw new OpenAiMaxAuthError(`OpenAI Max ID token could not be parsed: ${(error as Error).message}`); + } +} + +export function parseOpenAiMaxIdToken(idToken: string): IOpenAiMaxIdTokenInfo { + const claims = parseJwtPayload(idToken); + const profile = claims['https://api.openai.com/profile'] as Record | undefined; + const auth = claims['https://api.openai.com/auth'] as Record | undefined; + const expiresAtSeconds = typeof claims.exp === 'number' ? claims.exp : undefined; + + return { + email: asOptionalString(claims.email) ?? asOptionalString(profile?.email), + chatgptPlanType: asOptionalString(auth?.chatgpt_plan_type), + chatgptUserId: asOptionalString(auth?.chatgpt_user_id) ?? asOptionalString(auth?.user_id), + chatgptAccountId: asOptionalString(auth?.chatgpt_account_id), + chatgptAccountIsFedramp: auth?.chatgpt_account_is_fedramp === true, + expiresAt: expiresAtSeconds ? new Date(expiresAtSeconds * 1000).toISOString() : undefined, + rawJwt: idToken, + }; +} + +function createTokenData(response: IOpenAiMaxTokenResponse): IOpenAiMaxTokenData { + const idToken = asString(response.id_token, 'id_token'); + const accessToken = asString(response.access_token, 'access_token'); + const refreshToken = asString(response.refresh_token, 'refresh_token'); + const idTokenInfo = parseOpenAiMaxIdToken(idToken); + + return { + idToken, + accessToken, + refreshToken, + accountId: idTokenInfo.chatgptAccountId, + idTokenInfo, + }; +} + +export async function requestOpenAiMaxDeviceCode( + options: IOpenAiMaxAuthOptions = {}, +): Promise { + const issuer = getIssuer(options); + const response = await postJson(`${issuer}/api/accounts/deviceauth/usercode`, { + client_id: getClientId(options), + }, options) as Record; + + return { + verificationUrl: `${issuer}/codex/device`, + userCode: asString(response.user_code ?? response.usercode, 'user_code'), + deviceAuthId: asString(response.device_auth_id, 'device_auth_id'), + intervalSeconds: asIntervalSeconds(response.interval), + }; +} + +export async function pollOpenAiMaxDeviceCode( + deviceCode: IOpenAiMaxDeviceCode, + options: IOpenAiMaxDeviceCodePollOptions = {}, +): Promise { + const issuer = getIssuer(options); + const pollUrl = `${issuer}/api/accounts/deviceauth/token`; + const timeoutMs = options.timeoutMs ?? DEVICE_CODE_TIMEOUT_MS; + const sleepFunction = options.sleep ?? sleep; + const startedAt = Date.now(); + + while (Date.now() - startedAt < timeoutMs) { + const response = await getFetch(options)(pollUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + device_auth_id: deviceCode.deviceAuthId, + user_code: deviceCode.userCode, + }), + }); + + if (response.ok) { + const body = await readJson(response, `POST ${pollUrl}`) as Record; + return { + authorizationCode: asString(body.authorization_code, 'authorization_code'), + codeChallenge: asString(body.code_challenge, 'code_challenge'), + codeVerifier: asString(body.code_verifier, 'code_verifier'), + }; + } + + if (response.status !== 403 && response.status !== 404) { + const body = await response.text(); + throw new OpenAiMaxAuthError(`OpenAI Max device-code polling failed with status ${response.status}.`, { + status: response.status, + body, + }); + } + + await response.arrayBuffer().catch(() => undefined); + const remaining = timeoutMs - (Date.now() - startedAt); + await sleepFunction(Math.min(deviceCode.intervalSeconds * 1000, Math.max(remaining, 0))); + } + + throw new OpenAiMaxAuthError('OpenAI Max device-code login timed out.'); +} + +export async function exchangeOpenAiMaxAuthorizationCode( + authorizationCode: IOpenAiMaxAuthorizationCode, + options: IOpenAiMaxAuthOptions = {}, +): Promise { + const issuer = getIssuer(options); + const response = await postForm(`${issuer}/oauth/token`, new URLSearchParams({ + grant_type: 'authorization_code', + code: authorizationCode.authorizationCode, + redirect_uri: `${issuer}/deviceauth/callback`, + client_id: getClientId(options), + code_verifier: authorizationCode.codeVerifier, + }), options) as IOpenAiMaxTokenResponse; + + return createTokenData(response); +} + +export function ensureOpenAiMaxWorkspaceAllowed( + tokenData: IOpenAiMaxTokenData, + forcedChatGptWorkspaceId?: string, +): void { + if (!forcedChatGptWorkspaceId) { + return; + } + if (tokenData.idTokenInfo.chatgptAccountId !== forcedChatGptWorkspaceId) { + throw new OpenAiMaxAuthError(`OpenAI Max login is restricted to workspace ${forcedChatGptWorkspaceId}.`); + } +} + +export async function completeOpenAiMaxDeviceCodeLogin( + deviceCode: IOpenAiMaxDeviceCode, + options: IOpenAiMaxCompleteDeviceCodeOptions = {}, +): Promise { + const authorizationCode = await pollOpenAiMaxDeviceCode(deviceCode, options); + const tokenData = await exchangeOpenAiMaxAuthorizationCode(authorizationCode, options); + ensureOpenAiMaxWorkspaceAllowed(tokenData, options.forcedChatGptWorkspaceId); + return tokenData; +} + +export async function refreshOpenAiMaxTokenData( + tokenData: IOpenAiMaxTokenData, + options: IOpenAiMaxAuthOptions = {}, +): Promise { + const issuer = getIssuer(options); + const response = await postJson(`${issuer}/oauth/token`, { + client_id: getClientId(options), + grant_type: 'refresh_token', + refresh_token: tokenData.refreshToken, + }, options) as IOpenAiMaxTokenResponse; + + return createTokenData({ + id_token: response.id_token ?? tokenData.idToken, + access_token: response.access_token ?? tokenData.accessToken, + refresh_token: response.refresh_token ?? tokenData.refreshToken, + }); +} + +export function createOpenAiMaxProviderSettings(credentials: IOpenAiMaxAuthCredentials): { + apiKey: string; + baseURL: string; + headers: Record; +} { + const accountId = credentials.accountId ?? credentials.idTokenInfo?.chatgptAccountId; + const isFedrampAccount = credentials.idTokenInfo?.chatgptAccountIsFedramp === true; + const headers: Record = { + originator: credentials.originator ?? OPENAI_MAX_DEFAULT_ORIGINATOR, + }; + + if (accountId) { + headers['ChatGPT-Account-ID'] = accountId; + } + if (isFedrampAccount) { + headers['X-OpenAI-Fedramp'] = 'true'; + } + + return { + apiKey: credentials.accessToken, + baseURL: credentials.baseUrl ?? OPENAI_MAX_CODEX_BASE_URL, + headers, + }; +} diff --git a/ts/smartai.cache.ts b/ts/smartai.cache.ts new file mode 100644 index 0000000..6ac8866 --- /dev/null +++ b/ts/smartai.cache.ts @@ -0,0 +1,250 @@ +import type { JSONObject, JSONValue, LanguageModelV3Middleware, LanguageModelV3Prompt } from '@ai-sdk/provider'; +import type { TSmartAiProviderOptions } from './smartai.interfaces.js'; + +export type TSmartAiMessageCacheProvider = + | 'anthropic' + | 'openrouter' + | 'bedrock' + | 'openaiCompatible' + | 'copilot' + | 'alibaba'; + +export type TSmartAiCacheRetention = 'ephemeral' | '1h' | 'in_memory' | '24h'; + +export interface ISmartAiCacheOptions { + /** Provider-specific message cache marker namespace. Usually inferred from the model. */ + provider?: TSmartAiMessageCacheProvider; + /** Stable session/request key for providers that support request-level prompt cache affinity. */ + key?: string; + /** Short retention is the default; longer retention is opt-in. */ + retention?: TSmartAiCacheRetention; +} + +export type TSmartAiCacheSetting = boolean | 'auto' | ISmartAiCacheOptions; + +function isObject(input: unknown): input is Record { + return typeof input === 'object' && input !== null && !Array.isArray(input); +} + +function mergeJsonDefaults(defaults: JSONObject, overrides?: JSONObject): JSONObject { + const result: JSONObject = { ...defaults }; + + if (!overrides) return result; + + for (const [key, value] of Object.entries(overrides)) { + const existing = result[key]; + if (isObject(existing) && isObject(value)) { + result[key] = mergeJsonDefaults(existing as JSONObject, value as JSONObject); + continue; + } + result[key] = value as JSONValue; + } + + return result; +} + +export function mergeSmartAiProviderOptions( + defaults?: TSmartAiProviderOptions, + overrides?: TSmartAiProviderOptions, +): TSmartAiProviderOptions | undefined { + if (!defaults) return overrides; + if (!overrides) return defaults; + return mergeJsonDefaults(defaults as JSONObject, overrides as JSONObject) as TSmartAiProviderOptions; +} + +function cacheOptionsFromSetting(cache: TSmartAiCacheSetting | undefined): ISmartAiCacheOptions | undefined { + if (cache === false) return undefined; + if (cache === undefined || cache === true || cache === 'auto') return {}; + return cache; +} + +export function resolveSmartAiCacheProvider(provider?: string, modelId?: string): TSmartAiMessageCacheProvider | undefined { + const providerLower = provider?.toLowerCase() ?? ''; + const modelLower = modelId?.toLowerCase() ?? ''; + + if (providerLower.includes('openrouter')) return 'openrouter'; + if (providerLower.includes('bedrock')) return 'bedrock'; + if (providerLower.includes('copilot')) return 'copilot'; + if (providerLower.includes('alibaba')) return 'alibaba'; + if (providerLower.includes('openai-compatible') || providerLower.includes('openaicompatible')) { + return 'openaiCompatible'; + } + if (providerLower.includes('anthropic')) return 'anthropic'; + if (modelLower.includes('claude') || modelLower.includes('anthropic')) return 'anthropic'; + + return undefined; +} + +export function getSmartAiMessageCacheProviderOptions( + provider: TSmartAiMessageCacheProvider, + options: ISmartAiCacheOptions = {}, +): TSmartAiProviderOptions { + const anthropicCacheControl: JSONObject = { + type: 'ephemeral', + ...(options.retention === '1h' ? { ttl: '1h' } : {}), + }; + + const providerOptions: Record = { + anthropic: { + anthropic: { + cacheControl: anthropicCacheControl, + }, + }, + openrouter: { + openrouter: { + cacheControl: { type: 'ephemeral' }, + }, + }, + bedrock: { + bedrock: { + cachePoint: { type: 'default' }, + }, + }, + openaiCompatible: { + openaiCompatible: { + cache_control: { type: 'ephemeral' }, + }, + }, + copilot: { + copilot: { + copilot_cache_control: { type: 'ephemeral' }, + }, + }, + alibaba: { + alibaba: { + cacheControl: { type: 'ephemeral' }, + }, + }, + }; + + return providerOptions[provider] as TSmartAiProviderOptions; +} + +function shouldUseMessageLevelOptions(provider: TSmartAiMessageCacheProvider): boolean { + return provider === 'anthropic' || provider === 'bedrock'; +} + +function applyProviderOptionsDefaults( + item: T, + defaults: TSmartAiProviderOptions, +): T { + return { + ...item, + providerOptions: mergeSmartAiProviderOptions(defaults, item.providerOptions), + }; +} + +function isToolApprovalPart(part: unknown): boolean { + if (!isObject(part)) return false; + return part.type === 'tool-approval-request' || part.type === 'tool-approval-response'; +} + +function applyCacheToMessage( + message: LanguageModelV3Prompt[number], + provider: TSmartAiMessageCacheProvider, + options: ISmartAiCacheOptions, +): LanguageModelV3Prompt[number] { + const providerOptions = getSmartAiMessageCacheProviderOptions(provider, options); + const content = message.content; + + if (!shouldUseMessageLevelOptions(provider) && Array.isArray(content) && content.length > 0) { + const lastIndex = content.length - 1; + const lastPart = content[lastIndex]; + if (!isToolApprovalPart(lastPart)) { + const messageWithArrayContent = message as Extract; + return { + ...messageWithArrayContent, + content: content.map((part, index) => + index === lastIndex ? applyProviderOptionsDefaults(part, providerOptions) : part, + ) as typeof messageWithArrayContent.content, + } as LanguageModelV3Prompt[number]; + } + } + + return applyProviderOptionsDefaults(message, providerOptions); +} + +export function applySmartAiPromptCaching( + prompt: LanguageModelV3Prompt, + options: ISmartAiCacheOptions = {}, +): LanguageModelV3Prompt { + const provider = options.provider ?? 'anthropic'; + const targetIndexes = new Set(); + const nonSystemIndexes: number[] = []; + let systemCount = 0; + + for (let i = 0; i < prompt.length; i++) { + const message = prompt[i]; + if (message.role === 'system') { + if (systemCount < 2) targetIndexes.add(i); + systemCount++; + continue; + } + nonSystemIndexes.push(i); + } + + for (const index of nonSystemIndexes.slice(-2)) { + targetIndexes.add(index); + } + + if (targetIndexes.size === 0) return prompt; + + return prompt.map((message, index) => + targetIndexes.has(index) ? applyCacheToMessage(message, provider, options) : message, + ) as LanguageModelV3Prompt; +} + +export function createSmartAiCachingMiddleware(options: ISmartAiCacheOptions = {}): LanguageModelV3Middleware { + return { + specificationVersion: 'v3', + transformParams: async ({ params }) => ({ + ...params, + prompt: applySmartAiPromptCaching(params.prompt, options), + }), + }; +} + +function isOpenAiProvider(provider?: string): boolean { + const providerLower = provider?.toLowerCase() ?? ''; + return providerLower === 'openai' || providerLower.startsWith('openai.') || providerLower.includes('@ai-sdk/openai'); +} + +export function getSmartAiCacheProviderOptions(input: { + provider?: string; + modelId?: string; + cache?: TSmartAiCacheSetting; + sessionId?: string; +}): TSmartAiProviderOptions | undefined { + const cacheOptions = cacheOptionsFromSetting(input.cache); + if (!cacheOptions) return undefined; + + if (isOpenAiProvider(input.provider)) { + const key = cacheOptions.key ?? input.sessionId; + return { + openai: { + store: false, + ...(key ? { promptCacheKey: key } : {}), + ...(cacheOptions.retention === '24h' || cacheOptions.retention === 'in_memory' + ? { promptCacheRetention: cacheOptions.retention } + : key + ? { promptCacheRetention: 'in_memory' } + : {}), + }, + }; + } + + return undefined; +} + +export function applySmartAiCacheProviderOptions(input: { + provider?: string; + modelId?: string; + providerOptions?: TSmartAiProviderOptions; + cache?: TSmartAiCacheSetting; + sessionId?: string; +}): TSmartAiProviderOptions | undefined { + return mergeSmartAiProviderOptions( + getSmartAiCacheProviderOptions(input), + input.providerOptions, + ); +} diff --git a/ts/smartai.classes.smartai.ts b/ts/smartai.classes.smartai.ts index 5b04a04..658c99a 100644 --- a/ts/smartai.classes.smartai.ts +++ b/ts/smartai.classes.smartai.ts @@ -2,6 +2,7 @@ import * as plugins from './plugins.js'; import type { ISmartAiModelSetup, ISmartAiOptions, LanguageModelV3 } from './smartai.interfaces.js'; import { createOllamaModel } from './smartai.provider.ollama.js'; import { createAnthropicCachingMiddleware } from './smartai.middleware.anthropic.js'; +import { createOpenAiMaxProviderSettings } from './smartai.auth.openai.js'; /** * Returns a LanguageModelV3 for the given provider and model. @@ -16,11 +17,17 @@ export function getModel(options: ISmartAiOptions): LanguageModelV3 { if (options.promptCaching === false) return base; return plugins.wrapLanguageModel({ model: base, - middleware: createAnthropicCachingMiddleware(), + middleware: createAnthropicCachingMiddleware( + typeof options.promptCaching === 'object' ? options.promptCaching : undefined, + ), }) as unknown as LanguageModelV3; } case 'openai': { - const p = plugins.createOpenAI({ apiKey: options.apiKey }); + const p = plugins.createOpenAI( + options.openAiMaxAuth + ? createOpenAiMaxProviderSettings(options.openAiMaxAuth) + : { apiKey: options.apiKey }, + ); return p(options.model) as LanguageModelV3; } case 'google': { diff --git a/ts/smartai.interfaces.ts b/ts/smartai.interfaces.ts index 11a0b59..523f67e 100644 --- a/ts/smartai.interfaces.ts +++ b/ts/smartai.interfaces.ts @@ -1,4 +1,5 @@ -import type { JSONObject, JSONValue, LanguageModelV3 } from '@ai-sdk/provider'; +import type { JSONObject, JSONValue, LanguageModelV3, LanguageModelV3Prompt } from '@ai-sdk/provider'; +import type { ISmartAiCacheOptions } from './smartai.cache.js'; export type TProvider = | 'anthropic' @@ -14,6 +15,54 @@ export type TOpenAiReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'hi export type TOpenAiTextVerbosity = 'low' | 'medium' | 'high'; +export interface IOpenAiMaxIdTokenInfo { + email?: string; + chatgptPlanType?: string; + chatgptUserId?: string; + chatgptAccountId?: string; + chatgptAccountIsFedramp: boolean; + expiresAt?: string; + rawJwt: string; +} + +export interface IOpenAiMaxAuthCredentials { + accessToken: string; + refreshToken?: string; + idToken?: string; + accountId?: string; + idTokenInfo?: IOpenAiMaxIdTokenInfo; + baseUrl?: string; + originator?: string; +} + +export interface IOpenAiMaxTokenData extends IOpenAiMaxAuthCredentials { + refreshToken: string; + idToken: string; + idTokenInfo: IOpenAiMaxIdTokenInfo; +} + +export interface IOpenAiMaxDeviceCode { + verificationUrl: string; + userCode: string; + deviceAuthId: string; + intervalSeconds: number; +} + +export interface IOpenAiMaxAuthOptions { + issuer?: string; + clientId?: string; + fetch?: typeof fetch; +} + +export interface IOpenAiMaxDeviceCodePollOptions extends IOpenAiMaxAuthOptions { + timeoutMs?: number; + sleep?: (ms: number) => Promise; +} + +export interface IOpenAiMaxCompleteDeviceCodeOptions extends IOpenAiMaxDeviceCodePollOptions { + forcedChatGptWorkspaceId?: string; +} + export interface IOpenAiProviderOptions extends JSONObject { conversation?: string | null; include?: string[] | null; @@ -55,6 +104,11 @@ export interface ISmartAiOptions { provider: TProvider; model: string; apiKey?: string; + /** + * OpenAI ChatGPT/Codex subscription credentials from the device-code auth flow. + * Only used when provider === 'openai'. + */ + openAiMaxAuth?: IOpenAiMaxAuthCredentials; /** * Provider-specific AI SDK generation options. * Pass this to generateText()/streamText() alongside the model. @@ -71,7 +125,7 @@ export interface ISmartAiOptions { * Enable Anthropic prompt caching on system + recent messages. * Only used when provider === 'anthropic'. Default: true. */ - promptCaching?: boolean; + promptCaching?: boolean | ISmartAiCacheOptions; } /** @@ -96,4 +150,4 @@ export interface IOllamaModelOptions { think?: boolean; } -export type { LanguageModelV3 }; +export type { LanguageModelV3, LanguageModelV3Prompt }; diff --git a/ts/smartai.middleware.anthropic.ts b/ts/smartai.middleware.anthropic.ts index 6a58fc3..65ef376 100644 --- a/ts/smartai.middleware.anthropic.ts +++ b/ts/smartai.middleware.anthropic.ts @@ -1,38 +1,12 @@ -import type { LanguageModelV3Middleware, LanguageModelV3Prompt } from '@ai-sdk/provider'; +import type { LanguageModelV3Middleware } from '@ai-sdk/provider'; +import { createSmartAiCachingMiddleware } from './smartai.cache.js'; +import type { ISmartAiCacheOptions } from './smartai.cache.js'; /** * Creates middleware that adds Anthropic prompt caching directives. * Marks the last system message and last user message with ephemeral cache control, * reducing input token cost and latency on repeated calls. */ -export function createAnthropicCachingMiddleware(): LanguageModelV3Middleware { - return { - specificationVersion: 'v3', - transformParams: async ({ params }) => { - const messages = [...params.prompt] as Array>; - - // Find the last system message and last user message - let lastSystemIdx = -1; - let lastUserIdx = -1; - for (let i = 0; i < messages.length; i++) { - if (messages[i].role === 'system') lastSystemIdx = i; - if (messages[i].role === 'user') lastUserIdx = i; - } - - const targets = [lastSystemIdx, lastUserIdx].filter(i => i >= 0); - for (const idx of targets) { - const msg = { ...messages[idx] }; - msg.providerOptions = { - ...(msg.providerOptions as Record || {}), - anthropic: { - ...((msg.providerOptions as Record)?.anthropic as Record || {}), - cacheControl: { type: 'ephemeral' }, - }, - }; - messages[idx] = msg; - } - - return { ...params, prompt: messages as unknown as LanguageModelV3Prompt }; - }, - }; +export function createAnthropicCachingMiddleware(options: ISmartAiCacheOptions = {}): LanguageModelV3Middleware { + return createSmartAiCachingMiddleware({ ...options, provider: 'anthropic' }); }