diff --git a/changelog.md b/changelog.md index e2c0668..d1bf662 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,15 @@ # Changelog +## 2026-03-05 - 2.0.0 - BREAKING CHANGE(vercel-ai-sdk) +migrate to Vercel AI SDK v6 and introduce provider registry (getModel) returning LanguageModelV3 + +- Major API rewrite and module reorganization; bump package version to 1.0.0 +- Replace many legacy provider implementations with @ai-sdk/* providers and a new Ollama adapter (LanguageModelV3-based) +- Add subpath exports for capability packages: ./vision, ./audio, ./image, ./document, ./research +- Introduce Anthropic prompt-caching middleware and provider-level promptCaching option +- Split functionality into focused ts_* packages (ts_audio, ts_image, ts_document, ts_vision, ts_research) and adapt tests accordingly +- Update dependencies and devDependencies to use ai SDK providers and newer package versions + ## 2026-01-20 - 0.13.3 - fix() no changes detected diff --git a/package.json b/package.json index 9f9ba61..d4ac029 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,67 @@ { "name": "@push.rocks/smartai", - "version": "0.13.3", + "version": "1.0.0", "private": false, - "description": "SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.", + "description": "Provider registry and capability utilities for ai-sdk (Vercel AI SDK). Core export returns LanguageModel; subpath exports provide vision, audio, image, document and research capabilities.", "main": "dist_ts/index.js", "typings": "dist_ts/index.d.ts", "type": "module", + "exports": { + ".": { + "import": "./dist_ts/index.js", + "types": "./dist_ts/index.d.ts" + }, + "./vision": { + "import": "./dist_ts_vision/index.js", + "types": "./dist_ts_vision/index.d.ts" + }, + "./audio": { + "import": "./dist_ts_audio/index.js", + "types": "./dist_ts_audio/index.d.ts" + }, + "./image": { + "import": "./dist_ts_image/index.js", + "types": "./dist_ts_image/index.d.ts" + }, + "./document": { + "import": "./dist_ts_document/index.js", + "types": "./dist_ts_document/index.d.ts" + }, + "./research": { + "import": "./dist_ts_research/index.js", + "types": "./dist_ts_research/index.d.ts" + } + }, "author": "Task Venture Capital GmbH", "license": "MIT", "scripts": { - "test": "(tstest test/ --web --verbose)", + "test": "(tstest test/ --verbose --logfile)", "typecheck": "tsbuild check", "build": "(tsbuild tsfolders --allowimplicitany)", "buildDocs": "(tsdoc)" }, "devDependencies": { - "@git.zone/tsbuild": "^4.1.2", - "@git.zone/tsbundle": "^2.8.1", + "@git.zone/tsbuild": "^4.2.6", + "@git.zone/tsbundle": "^2.9.1", "@git.zone/tsrun": "^2.0.1", - "@git.zone/tstest": "^3.1.6", + "@git.zone/tstest": "^3.2.0", "@push.rocks/qenv": "^6.1.3", - "@types/node": "^25.0.9", + "@types/node": "^25.3.3", "typescript": "^5.9.3" }, "dependencies": { - "@anthropic-ai/sdk": "^0.71.2", - "@mistralai/mistralai": "^1.12.0", - "@push.rocks/smartarray": "^1.1.0", - "@push.rocks/smartfs": "^1.3.1", - "@push.rocks/smartpath": "^6.0.0", - "@push.rocks/smartpdf": "^4.1.1", - "@push.rocks/smartpromise": "^4.2.3", - "@push.rocks/smartrequest": "^5.0.1", - "@push.rocks/webstream": "^1.0.10", - "openai": "^6.16.0" + "@ai-sdk/anthropic": "^3.0.58", + "@ai-sdk/google": "^3.0.43", + "@ai-sdk/groq": "^3.0.29", + "@ai-sdk/mistral": "^3.0.24", + "@ai-sdk/openai": "^3.0.41", + "@ai-sdk/perplexity": "^3.0.23", + "@ai-sdk/provider": "^3.0.8", + "@ai-sdk/xai": "^3.0.67", + "@anthropic-ai/sdk": "^0.78.0", + "@push.rocks/smartpdf": "^4.1.3", + "ai": "^6.0.116", + "openai": "^6.26.0" }, "repository": { "type": "git", @@ -48,13 +76,13 @@ ], "files": [ "ts/**/*", - "ts_web/**/*", - "dist/**/*", + "ts_vision/**/*", + "ts_audio/**/*", + "ts_image/**/*", + "ts_document/**/*", + "ts_research/**/*", "dist_*/**/*", - "dist_ts/**/*", - "dist_ts_web/**/*", "assets/**/*", - "cli.js", "npmextra.json", "readme.md" ], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd41a03..1914509 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,63 +8,133 @@ importers: .: dependencies: + '@ai-sdk/anthropic': + specifier: ^3.0.58 + version: 3.0.58(zod@3.25.76) + '@ai-sdk/google': + specifier: ^3.0.43 + version: 3.0.43(zod@3.25.76) + '@ai-sdk/groq': + specifier: ^3.0.29 + version: 3.0.29(zod@3.25.76) + '@ai-sdk/mistral': + specifier: ^3.0.24 + version: 3.0.24(zod@3.25.76) + '@ai-sdk/openai': + specifier: ^3.0.41 + version: 3.0.41(zod@3.25.76) + '@ai-sdk/perplexity': + specifier: ^3.0.23 + version: 3.0.23(zod@3.25.76) + '@ai-sdk/provider': + specifier: ^3.0.8 + version: 3.0.8 + '@ai-sdk/xai': + specifier: ^3.0.67 + version: 3.0.67(zod@3.25.76) '@anthropic-ai/sdk': - specifier: ^0.71.2 - version: 0.71.2(zod@3.25.76) - '@mistralai/mistralai': - specifier: ^1.12.0 - version: 1.12.0 - '@push.rocks/smartarray': - specifier: ^1.1.0 - version: 1.1.0 - '@push.rocks/smartfs': - specifier: ^1.3.1 - version: 1.3.1 - '@push.rocks/smartpath': - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^0.78.0 + version: 0.78.0(zod@3.25.76) '@push.rocks/smartpdf': - specifier: ^4.1.1 - version: 4.1.1(typescript@5.9.3) - '@push.rocks/smartpromise': - specifier: ^4.2.3 - version: 4.2.3 - '@push.rocks/smartrequest': - specifier: ^5.0.1 - version: 5.0.1 - '@push.rocks/webstream': - specifier: ^1.0.10 - version: 1.0.10 + specifier: ^4.1.3 + version: 4.1.3(typescript@5.9.3) + ai: + specifier: ^6.0.116 + version: 6.0.116(zod@3.25.76) openai: - specifier: ^6.16.0 - version: 6.16.0(ws@8.18.3)(zod@3.25.76) + specifier: ^6.26.0 + version: 6.26.0(ws@8.19.0)(zod@3.25.76) devDependencies: '@git.zone/tsbuild': - specifier: ^4.1.2 - version: 4.1.2 + specifier: ^4.2.6 + version: 4.2.6 '@git.zone/tsbundle': - specifier: ^2.8.1 - version: 2.8.1 + specifier: ^2.9.1 + version: 2.9.1 '@git.zone/tsrun': specifier: ^2.0.1 version: 2.0.1 '@git.zone/tstest': - specifier: ^3.1.6 - version: 3.1.6(@aws-sdk/credential-providers@3.808.0)(socks@2.8.4)(typescript@5.9.3) + specifier: ^3.2.0 + version: 3.2.0(@aws-sdk/credential-providers@3.808.0)(@tiptap/pm@2.27.2)(socks@2.8.4)(typescript@5.9.3) '@push.rocks/qenv': specifier: ^6.1.3 version: 6.1.3 '@types/node': - specifier: ^25.0.9 - version: 25.0.9 + specifier: ^25.3.3 + version: 25.3.3 typescript: specifier: ^5.9.3 version: 5.9.3 packages: - '@anthropic-ai/sdk@0.71.2': - resolution: {integrity: sha512-TGNDEUuEstk/DKu0/TflXAEt+p+p/WhTlFzEnoosvbaDU2LTjm42igSdlL0VijrKpWejtOKxX0b8A7uc+XiSAQ==} + '@ai-sdk/anthropic@3.0.58': + resolution: {integrity: sha512-/53SACgmVukO4bkms4dpxpRlYhW8Ct6QZRe6sj1Pi5H00hYhxIrqfiLbZBGxkdRvjsBQeP/4TVGsXgH5rQeb8Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/gateway@3.0.66': + resolution: {integrity: sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/google@3.0.43': + resolution: {integrity: sha512-NGCgP5g8HBxrNdxvF8Dhww+UKfqAkZAmyYBvbu9YLoBkzAmGKDBGhVptN/oXPB5Vm0jggMdoLycZ8JReQM8Zqg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/groq@3.0.29': + resolution: {integrity: sha512-I/tUoHuOvGXbIr1dJ0CLRLA7W0UPDMtrYT5mgeb3O+P+6I5BAm/7riPwr22Xw5YTzpwQxcoDQlIczOU9XDXBpA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/mistral@3.0.24': + resolution: {integrity: sha512-krBTH2KHxtX8lCkSYSL4ZKSpn2EoJ5cNmBa9BmFL62KO1h5lYY6ivEwQb93TgY/hs2pkAIe4HJFIMX5kG1XtXg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/openai-compatible@2.0.35': + resolution: {integrity: sha512-g3wA57IAQFb+3j4YuFndgkUdXyRETZVvbfAWM+UX7bZSxA3xjes0v3XKgIdKdekPtDGsh4ZX2byHD0gJIMPfiA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/openai@3.0.41': + resolution: {integrity: sha512-IZ42A+FO+vuEQCVNqlnAPYQnnUpUfdJIwn1BEDOBywiEHa23fw7PahxVtlX9zm3/zMvTW4JKPzWyvAgDu+SQ2A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/perplexity@3.0.23': + resolution: {integrity: sha512-LyizJlT3rVJ9WgU7C8RqCf4/QuV/aZT/D3s77sa2M0FtzA9tX5VsWDBR3GN0eAKnXxbC3Lhp5PaNuvqQgoMDiw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@4.0.19': + resolution: {integrity: sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@3.0.8': + resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} + engines: {node: '>=18'} + + '@ai-sdk/xai@3.0.67': + resolution: {integrity: sha512-KQQIDc91dUA5IGFMnXBuvPBeraYNTdpDC1qUS+JG8vE+/299//5sZFafI1kKYUu3f3p7LaZrKXYgZ1Ni7QIRbw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@anthropic-ai/sdk@0.78.0': + resolution: {integrity: sha512-PzQhR715td/m1UaaN5hHXjYB8Gl2lF9UVhrrGrZeysiF6Rb74Wc9GCB8hzLdzmQtBd1qe89F9OptgB9Za1Ib5w==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -81,11 +151,16 @@ packages: '@api.global/typedrequest@3.1.10': resolution: {integrity: sha512-EiCp44XVcMjBvEs4oM1nMUaeY4ySU0Pzt3+mDwVG5DNP6EV87Nwancbr2jKScvaFNel9eeDgGtgEnFBKjOnApA==} - '@api.global/typedserver@3.0.80': - resolution: {integrity: sha512-dcp0oXsjBL+XdFg1wUUP08uJQid5bQ0Yv3V3Y3lnI2QCbat0FU+Tsb0TZRnZ4+P150Vj/ITBqJUgDzFsF34grA==} + '@api.global/typedrequest@3.3.0': + resolution: {integrity: sha512-Jwobqla+9k2IBG0duwrCFtc6GU6wsvHS3f0gJJsxTrpapylBW1YSF7NnGHPGs7F9hbATsO6IoUBpR2ScoKyGJA==} - '@api.global/typedsocket@3.0.1': - resolution: {integrity: sha512-xojiAVNXtHoxkpBo8U2HHJG8FrVXXuLvDNndSHXwx4C9VslUwDn5zSCI+PdBl8iAg+ZuBmKjqkpZZ9sL6DC5yQ==} + '@api.global/typedserver@8.4.2': + resolution: {integrity: sha512-eESOcWvrbqkshR4s4OeTX1AK74bNCeGgiRebKgjxIzJ+b0+rkPQyn2DOaMtyXjFZRNgRHyytLm5Iqj5fdazeqw==} + + '@api.global/typedsocket@4.1.2': + resolution: {integrity: sha512-fZFuJY9ucFCICjF4wi6OvK8drsv6UcwVVsfamOT1HxFj7OBOYw6QHOceQ+cAQ8IrWbX817sf8gzlesl+jlG8JA==} + peerDependencies: + '@push.rocks/smartserve': '>=1.1.0' '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} @@ -114,22 +189,10 @@ packages: resolution: {integrity: sha512-M9pdFQ+Efl1O4No6R7uMEOkidKVUiNsmN13EyzuIOGech9g+RF+LgDn3n8+PuC7EIgndQVe6sQ6w39sPQdBkww==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.750.0': - resolution: {integrity: sha512-S9G9noCeBxchoMVkHYrRi1A1xW/VOTP2W7X34lP+Y7Wpl32yMA7IJo0fAGAuTc0q1Nu6/pXDm+oDG7rhTCA1tg==} - engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.906.0': resolution: {integrity: sha512-6JQGrmQBHjnARQR+HSaj8DvLRbXTpPa8knYi1veT709JHXVkCkNNLKs7ULjVNCpSffRpzVYJn+eONHKj3Y0knQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.971.0': - resolution: {integrity: sha512-BBUne390fKa4C4QvZlUZ5gKcu+Uyid4IyQ20N4jl0vS7SK2xpfXlJcgKqPW5ts6kx6hWTQBk6sH5Lf12RvuJxg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-sso@3.750.0': - resolution: {integrity: sha512-y0Rx6pTQXw0E61CaptpZF65qNggjqOgymq/RYZU5vWba5DGQ+iqGt8Yq8s+jfBoBBNXshxq8l8Dl5Uq/JTY1wg==} - engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.808.0': resolution: {integrity: sha512-NxGomD0x9q30LPOXf4x7haOm6l2BJdLEzpiC/bPEXUkf2+4XudMQumMA/hDfErY5hCE19mFAouoO465m3Gl3JQ==} engines: {node: '>=18.0.0'} @@ -138,14 +201,6 @@ packages: resolution: {integrity: sha512-GGDwjW2cLzoEF5A1tBlZQZXzhlZzuM6cKNbSxUsCcBXtPAX03eb2GKApVy1SzpD03nTJk5T6GicGAm+BzK+lEg==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.971.0': - resolution: {integrity: sha512-Xx+w6DQqJxDdymYyIxyKJnRzPvVJ4e/Aw0czO7aC9L/iraaV7AG8QtRe93OGW6aoHSh72CIiinnpJJfLsQqP4g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/core@3.750.0': - resolution: {integrity: sha512-bZ5K7N5L4+Pa2epbVpUQqd1XLG2uU8BGs/Sd+2nbgTf+lNQJyIxAg/Qsrjz9MzmY8zzQIeRQEkNmR6yVAfCmmQ==} - engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.808.0': resolution: {integrity: sha512-+nTmxJVIPtAarGq9Fd/uU2qU/Ngfb9EntT0/kwXdKKMI0wU9fQNWi10xSTVeqOtzWERbQpOJgBAdta+v3W7cng==} engines: {node: '>=18.0.0'} @@ -154,22 +209,10 @@ packages: resolution: {integrity: sha512-+FuwAcozee8joVfjwly/8kSFNCvQOkcQYjINUckqBkdjO4iCRfOgSaz+0JMpMcYgVPnnyZv62gJ2g0bj0U+YDQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.970.0': - resolution: {integrity: sha512-klpzObldOq8HXzDjDlY6K8rMhYZU6mXRz6P9F9N+tWnjoYFfeBMra8wYApydElTUYQKP1O7RLHwH1OKFfKcqIA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/crc64-nvme@3.969.0': - resolution: {integrity: sha512-IGNkP54HD3uuLnrPCYsv3ZD478UYq+9WwKrIVJ9Pdi3hxPg8562CH3ZHf8hEgfePN31P9Kj+Zu9kq2Qcjjt61A==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.808.0': resolution: {integrity: sha512-AbsD/qHyQmyZ+CqJNOaGlnwZaXu8HfndfEiLsIJU/dIf9Wbt7ZtsHSAI/x78awxGohDneMZ6c5vuaRGYL7Z04g==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.750.0': - resolution: {integrity: sha512-In6bsG0p/P31HcH4DBRKBbcDS/3SHvEPjfXV8ODPWZO/l3/p7IRoYBdQ07C9R+VMZU2D0+/Sc/DWK/TUNDk1+Q==} - engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.808.0': resolution: {integrity: sha512-snPRQnwG9PV4kYHQimo1tenf7P974RcdxkHUThzWSxPEV7HpjxTFYNWGlKbOKBhL4AcgeCVeiZ/j+zveF2lEPA==} engines: {node: '>=18.0.0'} @@ -178,14 +221,6 @@ packages: resolution: {integrity: sha512-vtMDguMci2aXhkgEqg1iqyQ7vVcafpx9uypksM6FQsNr3Cc/8I6HgfBAja6BuPwkaCn9NoMnG0/iuuOWr8P9dg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.970.0': - resolution: {integrity: sha512-rtVzXzEtAfZBfh+lq3DAvRar4c3jyptweOAJR2DweyXx71QSMY+O879hjpMwES7jl07a3O1zlnFIDo4KP/96kQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-http@3.750.0': - resolution: {integrity: sha512-wFB9qqfa20AB0dElsQz5ZlZT5o+a+XzpEpmg0erylmGYqEOvh8NQWfDUVpRmQuGq9VbvW/8cIbxPoNqEbPtuWQ==} - engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.808.0': resolution: {integrity: sha512-gNXjlx3BIUeX7QpVqxbjBxG6zm45lC39QvUIo92WzEJd2OTPcR8TU0OTTsgq/lpn2FrKcISj5qXvhWykd41+CA==} engines: {node: '>=18.0.0'} @@ -194,14 +229,6 @@ packages: resolution: {integrity: sha512-L97N2SUkZp03s1LJZ1sCkUaUZ7m9T72faaadn05wyst/iXonSZKPHYMQVWGYhTC2OtRV0FQvBXIAqFZsNGQD0Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.970.0': - resolution: {integrity: sha512-CjDbWL7JxjLc9ZxQilMusWSw05yRvUJKRpz59IxDpWUnSMHC9JMMUUkOy5Izk8UAtzi6gupRWArp4NG4labt9Q==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-ini@3.750.0': - resolution: {integrity: sha512-2YIZmyEr5RUd3uxXpxOLD9G67Bibm4I/65M6vKFP17jVMUT+R1nL7mKqmhEVO2p+BoeV+bwMyJ/jpTYG368PCg==} - engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.808.0': resolution: {integrity: sha512-Y53CW0pCvFQQEvtVFwExCCMbTg+6NOl8b3YOuZVzPmVmDoW7M1JIn9IScesqoGERXL3VoXny6nYTsZj+vfpp7Q==} engines: {node: '>=18.0.0'} @@ -210,18 +237,6 @@ packages: resolution: {integrity: sha512-r7TbHD80WXo42kTEC5bqa4b87ho3T3yd2VEKo1qbEmOUovocntO8HC3JxHYr0XSeZ82DEYxLARb84akWjabPzg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.971.0': - resolution: {integrity: sha512-c0TGJG4xyfTZz3SInXfGU8i5iOFRrLmy4Bo7lMyH+IpngohYMYGYl61omXqf2zdwMbDv+YJ9AviQTcCaEUKi8w==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-login@3.971.0': - resolution: {integrity: sha512-yhbzmDOsk0RXD3rTPhZra4AWVnVAC4nFWbTp+sUty1hrOPurUmhuz8bjpLqYTHGnlMbJp+UqkQONhS2+2LzW2g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-node@3.750.0': - resolution: {integrity: sha512-THWHHAceLwsOiowPEmKyhWVDlEUxH07GHSw5AQFDvNQtGKOQl0HSIFO1mKObT2Q2Vqzji9Bq8H58SO5BFtNPRw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.808.0': resolution: {integrity: sha512-lASHlXJ6U5Cpnt9Gs+mWaaSmWcEibr1AFGhp+5UNvfyd+UU2Oiwgbo7rYXygmaVDGkbfXEiTkgYtoNOBSddnWQ==} engines: {node: '>=18.0.0'} @@ -230,14 +245,6 @@ packages: resolution: {integrity: sha512-xga127vP0rFxiHjEUjLe6Yf4hQ/AZinOF4AqQr/asWQO+/uwh3aH8nXcS4lkpZNygxMHbuNXm7Xg504GKCMlLQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.971.0': - resolution: {integrity: sha512-epUJBAKivtJqalnEBRsYIULKYV063o/5mXNJshZfyvkAgNIzc27CmmKRXTN4zaNOZg8g/UprFp25BGsi19x3nQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-process@3.750.0': - resolution: {integrity: sha512-Q78SCH1n0m7tpu36sJwfrUSxI8l611OyysjQeMiIOliVfZICEoHcLHLcLkiR+tnIpZ3rk7d2EQ6R1jwlXnalMQ==} - engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.808.0': resolution: {integrity: sha512-ZLqp+xsQUatoo8pMozcfLwf/pwfXeIk0w3n0Lo/rWBgT3RcdECmmPCRcnkYBqxHQyE66aS9HiJezZUwMYPqh6w==} engines: {node: '>=18.0.0'} @@ -246,14 +253,6 @@ packages: resolution: {integrity: sha512-P8R4GpDLppe+8mp+SOj1fKaY3AwDULCi/fqMSJjvf8qN6OM+vGGpFP3iXvkjFYyyV+8nRXY+HQCLRoZKpRtzMg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.970.0': - resolution: {integrity: sha512-0XeT8OaT9iMA62DFV9+m6mZfJhrD0WNKf4IvsIpj2Z7XbaYfz3CoDDvNoALf3rPY9NzyMHgDxOspmqdvXP00mw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-sso@3.750.0': - resolution: {integrity: sha512-FGYrDjXN/FOQVi/t8fHSv8zCk+NEvtFnuc4cZUj5OIbM4vrfFc5VaPyn41Uza3iv6Qq9rZg0QOwWnqK8lNrqUw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.808.0': resolution: {integrity: sha512-gWZByAokHX+aps1+syIW/hbKUBrjE2RpPRd/RGQvrBbVVgwsJzsHKsW0zy1B6mgARPG6IahmSUMjNkBCVsiAgw==} engines: {node: '>=18.0.0'} @@ -262,14 +261,6 @@ packages: resolution: {integrity: sha512-wYljHU7yNEzt7ngZZ21FWh+RlO16gTpWvXyRqlryuCgIWugHD8bl7JphGnUN1md5/v+mCRuGK58JoFGZq+qrjA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.971.0': - resolution: {integrity: sha512-dY0hMQ7dLVPQNJ8GyqXADxa9w5wNfmukgQniLxGVn+dMRx3YLViMp5ZpTSQpFhCWNF0oKQrYAI5cHhUJU1hETw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.750.0': - resolution: {integrity: sha512-Nz8zs3YJ+GOTSrq+LyzbbC1Ffpt7pK38gcOyNZv76pP5MswKTUKNYBJehqwa+i7FcFQHsCk3TdhR8MT1ZR23uA==} - engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.808.0': resolution: {integrity: sha512-SsGa1Gfa05aJM/qYOtHmfg0OKKW6Fl6kyMCcai63jWDVDYy0QSHcesnqRayJolISkdsVK6bqoWoFcPxiopcFcg==} engines: {node: '>=18.0.0'} @@ -278,54 +269,22 @@ packages: resolution: {integrity: sha512-V9PurepVko8+iyEvI9WAlk5dXJ1uWIW03RPLnNBEmeCqFjjit16HrNaaVvnp9fQbG7CSKSGqK026SjDgtKGKYA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.971.0': - resolution: {integrity: sha512-F1AwfNLr7H52T640LNON/h34YDiMuIqW/ZreGzhRR6vnFGaSPtNSKAKB2ssAMkLM8EVg8MjEAYD3NCUiEo+t/w==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-providers@3.808.0': resolution: {integrity: sha512-JJvY/gcet+tFw7dGifhTMJ2jfLXCJBR2Tu2rY/ePi+HVUrR//TnWmcm8qGvT1nWiCQ7w9NEhMlJgqKEIM/MkVQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.734.0': - resolution: {integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.901.0': resolution: {integrity: sha512-mPF3N6eZlVs9G8aBSzvtoxR1RZqMo1aIwR+X8BAZSkhfj55fVF2no4IfPXfdFO3I66N+zEQ8nKoB0uTATWrogQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.969.0': - resolution: {integrity: sha512-MlbrlixtkTVhYhoasblKOkr7n2yydvUZjjxTnBhIuHmkyBS1619oGnTfq/uLeGYb4NYXdeQ5OYcqsRGvmWSuTw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-expect-continue@3.734.0': - resolution: {integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.901.0': resolution: {integrity: sha512-bwq9nj6MH38hlJwOY9QXIDwa6lI48UsaZpaXbdD71BljEIRlxDzfB4JaYb+ZNNK7RIAdzsP/K05mJty6KJAQHw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.969.0': - resolution: {integrity: sha512-qXygzSi8osok7tH9oeuS3HoKw6jRfbvg5Me/X5RlHOvSSqQz8c5O9f3MjUApaCUSwbAU92KrbZWasw2PKiaVHg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-flexible-checksums@3.750.0': - resolution: {integrity: sha512-ach0d2buDnX2TUausUbiXXFWFo3IegLnCrA+Rw8I9AYVpLN9lTaRwAYJwYC6zEuW9Golff8MwkYsp/OaC5tKMw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.906.0': resolution: {integrity: sha512-vbOf5Pf2bRjw+Is1OsUKKP88uPKES8/B3c3yq0B72Y4ZgZEDymXIxGvZYPkThLk266PH7eHo+ZneZjkdfz6Zbg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.971.0': - resolution: {integrity: sha512-+hGUDUxeIw8s2kkjfeXym0XZxdh0cqkHkDpEanWYdS1gnWkIR+gf9u/DKbKqGHXILPaqHXhWpLTQTVlaB4sI7Q==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-host-header@3.734.0': - resolution: {integrity: sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.804.0': resolution: {integrity: sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==} engines: {node: '>=18.0.0'} @@ -334,26 +293,10 @@ packages: resolution: {integrity: sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.969.0': - resolution: {integrity: sha512-AWa4rVsAfBR4xqm7pybQ8sUNJYnjyP/bJjfAw34qPuh3M9XrfGbAHG0aiAfQGrBnmS28jlO6Kz69o+c6PRw1dw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-location-constraint@3.734.0': - resolution: {integrity: sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.901.0': resolution: {integrity: sha512-MuCS5R2ngNoYifkVt05CTULvYVWX0dvRT0/Md4jE3a0u0yMygYy31C1zorwfE/SUgAQXyLmUx8ATmPp9PppImQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.969.0': - resolution: {integrity: sha512-zH7pDfMLG/C4GWMOpvJEoYcSpj7XsNP9+irlgqwi667sUQ6doHQJ3yyDut3yiTk0maq1VgmriPFELyI9lrvH/g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-logger@3.734.0': - resolution: {integrity: sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.804.0': resolution: {integrity: sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==} engines: {node: '>=18.0.0'} @@ -362,14 +305,6 @@ packages: resolution: {integrity: sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.969.0': - resolution: {integrity: sha512-xwrxfip7Y2iTtCMJ+iifN1E1XMOuhxIHY9DreMCvgdl4r7+48x2S1bCYPWH3eNY85/7CapBWdJ8cerpEl12sQQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.734.0': - resolution: {integrity: sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.804.0': resolution: {integrity: sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==} engines: {node: '>=18.0.0'} @@ -378,38 +313,14 @@ packages: resolution: {integrity: sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.969.0': - resolution: {integrity: sha512-2r3PuNquU3CcS1Am4vn/KHFwLi8QFjMdA/R+CRDXT4AFO/0qxevF/YStW3gAKntQIgWgQV8ZdEtKAoJvLI4UWg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.750.0': - resolution: {integrity: sha512-3H6Z46cmAQCHQ0z8mm7/cftY5ifiLfCjbObrbyyp2fhQs9zk6gCKzIX8Zjhw0RMd93FZi3ebRuKJWmMglf4Itw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.906.0': resolution: {integrity: sha512-8Ztl5natyVXOvpk/en2j9Bjn2t8vawjbvgcU0/ZF5/JtA1rKSTctRXusICJgCovFHzaAH2MVhA51nnp3d8rViA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.970.0': - resolution: {integrity: sha512-v/Y5F1lbFFY7vMeG5yYxuhnn0CAshz6KMxkz1pDyPxejNE9HtA0w8R6OTBh/bVdIm44QpjhbI7qeLdOE/PLzXQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-ssec@3.734.0': - resolution: {integrity: sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.901.0': resolution: {integrity: sha512-YiLLJmA3RvjL38mFLuu8fhTTGWtp2qT24VqpucgfoyziYcTgIQkJJmKi90Xp6R6/3VcArqilyRgM1+x8i/em+Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.971.0': - resolution: {integrity: sha512-QGVhvRveYG64ZhnS/b971PxXM6N2NU79Fxck4EfQ7am8v1Br0ctoeDDAn9nXNblLGw87we9Z65F7hMxxiFHd3w==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-user-agent@3.750.0': - resolution: {integrity: sha512-YYcslDsP5+2NZoN3UwuhZGkhAHPSli7HlJHBafBrvjGV/I9f8FuOO1d1ebxGdEP4HyRXUGyh+7Ur4q+Psk0ryw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.808.0': resolution: {integrity: sha512-VckV6l5cf/rL3EtgzSHVTTD4mI0gd8UxDDWbKJsxbQ2bpNPDQG2L1wWGLaolTSzjEJ5f3ijDwQrNDbY9l85Mmg==} engines: {node: '>=18.0.0'} @@ -418,14 +329,6 @@ packages: resolution: {integrity: sha512-CMAjq2oCEv5EEvmlFvio8t4KQL2jGORyDQu7oLj4l0a2biPgxbwL3utalbm9yKty1rQM5zKpaa7id7ZG3X1f6A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.970.0': - resolution: {integrity: sha512-dnSJGGUGSFGEX2NzvjwSefH+hmZQ347AwbLhAsi0cdnISSge+pcGfOFrJt2XfBIypwFe27chQhlfuf/gWdzpZg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/nested-clients@3.750.0': - resolution: {integrity: sha512-OH68BRF0rt9nDloq4zsfeHI0G21lj11a66qosaljtEP66PWm7tQ06feKbFkXHT5E1K3QhJW3nVyK8v2fEBY5fg==} - engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.808.0': resolution: {integrity: sha512-NparPojwoBul7XPCasy4psFMJbw7Ys4bz8lVB93ljEUD4VV7mM7zwK27Uhz20B8mBFGmFEoAprPsVymJcK9Vcw==} engines: {node: '>=18.0.0'} @@ -434,14 +337,6 @@ packages: resolution: {integrity: sha512-0/r0bh/9Bm14lVe+jAzQQB2ufq9S4Vd9Wg5rZn8RhrhKl6y/DC1aRzOo2kJTNu5pCbVfQsd/VXLLnkcbOrDy6A==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.971.0': - resolution: {integrity: sha512-TWaILL8GyYlhGrxxnmbkazM4QsXatwQgoWUvo251FXmUOsiXDFDVX3hoGIfB3CaJhV2pJPfebHUNJtY6TjZ11g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/region-config-resolver@3.734.0': - resolution: {integrity: sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==} - engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.808.0': resolution: {integrity: sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==} engines: {node: '>=18.0.0'} @@ -450,26 +345,10 @@ packages: resolution: {integrity: sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.969.0': - resolution: {integrity: sha512-scj9OXqKpcjJ4jsFLtqYWz3IaNvNOQTFFvEY8XMJXTv+3qF5I7/x9SJtKzTRJEBF3spjzBUYPtGFbs9sj4fisQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.750.0': - resolution: {integrity: sha512-RA9hv1Irro/CrdPcOEXKwJ0DJYJwYCsauGEdRXihrRfy8MNSR9E+mD5/Fr5Rxjaq5AHM05DYnN3mg/DU6VwzSw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.906.0': resolution: {integrity: sha512-zqxRN8/dSrAaAEi5oXIeScsrbDkS63+ZyaBrkC6bc8Jd/bCvJM6D4LjJJxIOPBNXuF0bNhBIlTmqwtbkiqCwZw==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.970.0': - resolution: {integrity: sha512-z3syXfuK/x/IsKf/AeYmgc2NT7fcJ+3fHaGO+fkghkV9WEba3fPyOwtTBX4KpFMNb2t50zDGZwbzW1/5ighcUQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/token-providers@3.750.0': - resolution: {integrity: sha512-X/KzqZw41iWolwNdc8e3RMcNSMR364viHv78u6AefXOO5eRM40c4/LuST1jDzq35/LpnqRhL7/MuixOetw+sFw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.808.0': resolution: {integrity: sha512-PsfKanHmnyO7FxowXqxbLQ+QjURCdSGxyhUiSdZbfvlvme/wqaMyIoMV/i4jppndksoSdPbW2kZXjzOqhQF+ew==} engines: {node: '>=18.0.0'} @@ -478,10 +357,6 @@ packages: resolution: {integrity: sha512-gdxXleCjMUAKnyR/1ksdnv3Fuifr9iuaeEtINRHkwVluwcORabEdOlxW36th2QdkpTTyP1hW35VATz2R6v/i2Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.971.0': - resolution: {integrity: sha512-4hKGWZbmuDdONMJV0HJ+9jwTDb0zLfKxcCLx2GEnBY31Gt9GeyIQ+DZ97Bb++0voawj6pnZToFikXTyrEq2x+w==} - engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.734.0': resolution: {integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==} engines: {node: '>=18.0.0'} @@ -494,26 +369,10 @@ packages: resolution: {integrity: sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.969.0': - resolution: {integrity: sha512-7IIzM5TdiXn+VtgPdVLjmE6uUBUtnga0f4RiSEI1WW10RPuNvZ9U+pL3SwDiRDAdoGrOF9tSLJOFZmfuwYuVYQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-arn-parser@3.723.0': - resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} - engines: {node: '>=18.0.0'} - '@aws-sdk/util-arn-parser@3.893.0': resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-arn-parser@3.968.0': - resolution: {integrity: sha512-gqqvYcitIIM2K4lrDX9de9YvOfXBcVdxfT/iLnvHJd4YHvSXlt+gs+AsL4FfPCxG4IG9A+FyulP9Sb1MEA75vw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.743.0': - resolution: {integrity: sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==} - engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.808.0': resolution: {integrity: sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==} engines: {node: '>=18.0.0'} @@ -522,35 +381,16 @@ packages: resolution: {integrity: sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.970.0': - resolution: {integrity: sha512-TZNZqFcMUtjvhZoZRtpEGQAdULYiy6rcGiXAbLU7e9LSpIYlRqpLa207oMNfgbzlL2PnHko+eVg8rajDiSOYCg==} - engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.723.0': resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.734.0': - resolution: {integrity: sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==} - '@aws-sdk/util-user-agent-browser@3.804.0': resolution: {integrity: sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==} '@aws-sdk/util-user-agent-browser@3.901.0': resolution: {integrity: sha512-Ntb6V/WFI21Ed4PDgL/8NSfoZQQf9xzrwNgiwvnxgAl/KvAvRBgQtqj5gHsDX8Nj2YmJuVoHfH9BGjL9VQ4WNg==} - '@aws-sdk/util-user-agent-browser@3.969.0': - resolution: {integrity: sha512-bpJGjuKmFr0rA6UKUCmN8D19HQFMLXMx5hKBXqBlPFdalMhxJSjcxzX9DbQh0Fn6bJtxCguFmRGOBdQqNOt49g==} - - '@aws-sdk/util-user-agent-node@3.750.0': - resolution: {integrity: sha512-84HJj9G9zbrHX2opLk9eHfDceB+UIHVrmflMzWHpsmo9fDuro/flIBqaVDlE021Osj6qIM0SJJcnL6s23j7JEw==} - engines: {node: '>=18.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - '@aws-sdk/util-user-agent-node@3.808.0': resolution: {integrity: sha512-5UmB6u7RBSinXZAVP2iDgqyeVA/odO2SLEcrXaeTCw8ICXEoqF0K+GL36T4iDbzCBOAIugOZ6OcQX5vH3ck5UA==} engines: {node: '>=18.0.0'} @@ -569,35 +409,14 @@ packages: aws-crt: optional: true - '@aws-sdk/util-user-agent-node@3.971.0': - resolution: {integrity: sha512-Eygjo9mFzQYjbGY3MYO6CsIhnTwAMd3WmuFalCykqEmj2r5zf0leWrhPaqvA5P68V5JdGfPYgj7vhNOd6CtRBQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/xml-builder@3.734.0': - resolution: {integrity: sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==} - engines: {node: '>=18.0.0'} - '@aws-sdk/xml-builder@3.901.0': resolution: {integrity: sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==} engines: {node: '>=18.0.0'} - '@aws-sdk/xml-builder@3.969.0': - resolution: {integrity: sha512-BSe4Lx/qdRQQdX8cSSI7Et20vqBspzAjBy8ZmXVoyLkol3y4sXBXzn+BiLtR+oh60ExQn6o2DU4QjdOZbXaKIQ==} - engines: {node: '>=20.0.0'} - '@aws/lambda-invoke-store@0.0.1': resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} engines: {node: '>=18.0.0'} - '@aws/lambda-invoke-store@0.2.3': - resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} - engines: {node: '>=18.0.0'} - '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -614,30 +433,52 @@ packages: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + '@borewit/text-codec@0.1.1': resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} - '@cloudflare/workers-types@4.20251008.0': - resolution: {integrity: sha512-dZLkO4PbCL0qcCSKzuW7KE4GYe49lI12LCfQ5y9XeSwgYBoAUbwH4gmJ6A0qUIURiTJTkGkRkhVPqpq2XNgYRA==} + '@borewit/text-codec@0.2.1': + resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==} + + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + + '@cloudflare/workers-types@4.20260305.0': + resolution: {integrity: sha512-sCgPFnQ03SVpC2OVW8wysONLZW/A8hlp9Mq2ckG/h1oId4kr9NawA6vUiOmOjCWRn2hIohejBYVQ+Vu20rCdKA==} '@configvault.io/interfaces@1.0.17': resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} + '@design.estate/dees-catalog@3.43.3': + resolution: {integrity: sha512-GjTePdwqNBL4isMOx4Ibei6pgK55H+DccbtgyNqjHRBz3LL14mo809ebjY2IZOVobswyzuTcNFvhfiqFP4/HLg==} + '@design.estate/dees-comms@1.0.27': resolution: {integrity: sha512-GvzTUwkV442LD60T08iqSoqvhA02Mou5lFvvqBPc4yBUiU7cZISqBx+76xvMgMIEI9Dx9JfTl4/2nW8MoVAanw==} + '@design.estate/dees-comms@1.0.30': + resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==} + '@design.estate/dees-domtools@2.3.3': resolution: {integrity: sha512-diIRuEWNRko508+eXDGVD9yxte+50VSuSsxBvWXUnE7ZPOLo9Y0oNyVi+R1Rb1AVJiXcGCORLdCtmCIcId40VA==} + '@design.estate/dees-domtools@2.3.8': + resolution: {integrity: sha512-jUG9GMvPxKMwmRIZ9oLTL3c8hHvHuiwIk8cTrYnuZzGO/uJJ5/czk9o6LRXUuCOOG7TRLtqgOpK8EEQgaadfZA==} + '@design.estate/dees-element@2.1.2': resolution: {integrity: sha512-ZiwvE411RJPHaYio26asQLnSmtJ6G1HRLYWbxW/HvCMbFtrcrXysP1y4PQ9KjdNfiQ4yoWPjTtwYMJjLE0NcbA==} + '@design.estate/dees-element@2.1.6': + resolution: {integrity: sha512-7zyHkUjB8UEQgT9VbB2IJtc/yuPt9CI5JGel3b6BxA1kecY64ceIjFvof1uIkc0QP8q2fMLLY45r1c+9zDTjzg==} + + '@design.estate/dees-wcctools@3.8.0': + resolution: {integrity: sha512-CC14iVKUrguzD9jIrdPBd9fZ4egVJEZMxl5y8iy0l7WLumeoYvGsoXj5INVkRPLRVLqziIdi4Je1hXqHt2NU+g==} + '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} @@ -650,174 +491,350 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.27.2': resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.27.2': resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.27.2': resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.27.2': resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.27.2': resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.27.2': resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.2': resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.27.2': resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.27.2': resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.27.2': resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.27.2': resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.27.2': resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.27.2': resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.27.2': resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.27.2': resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.27.2': resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.2': resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.2': resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.2': resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.2': resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.2': resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.27.2': resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.27.2': resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.27.2': resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.27.2': resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@git.zone/tsbuild@4.1.2': - resolution: {integrity: sha512-S518ulKveO76pS6jrAELrnFaCw5nDAIZD9j6QzVmLYDiZuJmlRwPK3/2E8ugQ+b7ffpkwJ9MT685ooEGDcWQ4Q==} + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fortawesome/fontawesome-common-types@7.2.0': + resolution: {integrity: sha512-IpR0bER9FY25p+e7BmFH25MZKEwFHTfRAfhOyJubgiDnoJNsSvJ7nigLraHtp4VOG/cy8D7uiV0dLkHOne5Fhw==} + engines: {node: '>=6'} + + '@fortawesome/fontawesome-svg-core@7.2.0': + resolution: {integrity: sha512-6639htZMjEkwskf3J+e6/iar+4cTNM9qhoWuRfj9F3eJD6r7iCzV1SWnQr2Mdv0QT0suuqU8BoJCZUyCtP9R4Q==} + engines: {node: '>=6'} + + '@fortawesome/free-brands-svg-icons@7.2.0': + resolution: {integrity: sha512-VNG8xqOip1JuJcC3zsVsKRQ60oXG9+oYNDCosjoU/H9pgYmLTEwWw8pE0jhPz/JWdHeUuK6+NQ3qsM4gIbdbYQ==} + engines: {node: '>=6'} + + '@fortawesome/free-regular-svg-icons@7.2.0': + resolution: {integrity: sha512-iycmlN51EULlQ4D/UU9WZnHiN0CvjJ2TuuCrAh+1MVdzD+4ViKYH2deNAll4XAAYlZa8WAefHR5taSK8hYmSMw==} + engines: {node: '>=6'} + + '@fortawesome/free-solid-svg-icons@7.2.0': + resolution: {integrity: sha512-YTVITFGN0/24PxzXrwqCgnyd7njDuzp5ZvaCx5nq/jg55kUYd94Nj8UTchBdBofi/L0nwRfjGOg0E41d2u9T1w==} + engines: {node: '>=6'} + + '@git.zone/tsbuild@4.2.6': + resolution: {integrity: sha512-Vb9ccFMcNb2RK6OC/9DkzQFyORwOk0WDX3YH0wMKt3gOID+7zWFI8kP943mcly8UHMXn3+Yt1DDEXXDAMKPvQw==} hasBin: true - '@git.zone/tsbundle@2.8.1': - resolution: {integrity: sha512-K4HzZmJ3wrR+sO5sZwcVcSEHxJiLj71bv7J6GRmGoex8sXj6T2QrpkeCshsnbMan8OCuwOKtzyVrBDXt36chHw==} + '@git.zone/tsbundle@2.9.1': + resolution: {integrity: sha512-JW1xjSv7UjAm2lwAQPxhCWs14wqs+UIq5FqIGUPuI6rrDBWIMT2d0gpP6iP6TqXqgm6XpBlfU4rHcHheUXzXbQ==} hasBin: true - '@git.zone/tspublish@1.11.0': - resolution: {integrity: sha512-dkgaDBTzZJ53lAV72r7OW/W7l/KqpkncFuPojr11JO35OKAbjjDhZbAwPv4oGX9NplyXrhC5VJRPNX/orqNTHA==} + '@git.zone/tspublish@1.11.2': + resolution: {integrity: sha512-BcGap1OzXDgXpfQXMh9W17r/CkWNhPsJ3WzjG2wrGE+ePUJCJAm9w6+J8G5WdZZcZKPqTB07cp707LbSiksc5A==} hasBin: true '@git.zone/tsrun@2.0.1': resolution: {integrity: sha512-NEcnsjvlC1o3Z6SS3VhKCf6Ev+Sh4EAinmggslrIR/ppMrvjDbXNFXoyr3PB+GLeSAR0JRZ1fGvVYjpEzjBdIg==} hasBin: true - '@git.zone/tstest@3.1.6': - resolution: {integrity: sha512-xRGc6wO4rJ6mohPCMIBDRH+oNjiIvX6Jeo8v/Y5o5VyKSHFmqol7FCKSBrojMcqgBpESnLHFPJAAOmT9W3JV8Q==} + '@git.zone/tstest@3.2.0': + resolution: {integrity: sha512-NXJkgfaBL1owmhC4rW+ikPWQWkXK4s1R0akbMdqZ8MiaW5+Gs1xYZ+iEPRzsGS0s0P+4VS7Y+hCnAjCL90AcIg==} hasBin: true '@happy-dom/global-registrator@15.11.7': @@ -1135,9 +1152,6 @@ packages: '@lit/reactive-element@2.1.1': resolution: {integrity: sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==} - '@mistralai/mistralai@1.12.0': - resolution: {integrity: sha512-oDr1hcS3wsIT/QupBG93TNiA5kilwBYoAIyl5BNYqMM2Ix/xsNq+wT8b++uhp/GTUMx44n+8Bn1mkATbwxe6bQ==} - '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} @@ -1162,12 +1176,86 @@ packages: '@mongodb-js/saslprep@1.2.2': resolution: {integrity: sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==} + '@napi-rs/canvas-android-arm64@0.1.95': + resolution: {integrity: sha512-SqTh0wsYbetckMXEvHqmR7HKRJujVf1sYv1xdlhkifg6TlCSysz1opa49LlS3+xWuazcQcfRfmhA07HxxxGsAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.95': + resolution: {integrity: sha512-F7jT0Syu+B9DGBUBcMk3qCRIxAWiDXmvEjamwbYfbZl7asI1pmXZUnCOoIu49Wt0RNooToYfRDxU9omD6t5Xuw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.95': + resolution: {integrity: sha512-54eb2Ho15RDjYGXO/harjRznBrAvu+j5nQ85Z4Qd6Qg3slR8/Ja+Yvvy9G4yo7rdX6NR9GPkZeSTf2UcKXwaXw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.95': + resolution: {integrity: sha512-hYaLCSLx5bmbnclzQc3ado3PgZ66blJWzjXp0wJmdwpr/kH+Mwhj6vuytJIomgksyJoCdIqIa4N6aiqBGJtJ5Q==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.95': + resolution: {integrity: sha512-J7VipONahKsmScPZsipHVQBqpbZx4favaD8/enWzzlGcjiwycOoymL7f4tNeqdjK0su19bDOUt6mjp9gsPWYlw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.95': + resolution: {integrity: sha512-PXy0UT1J/8MPG8UAkWp6Fd51ZtIZINFzIjGH909JjQrtCuJf3X6nanHYdz1A+Wq9o4aoPAw1YEUpFS1lelsVlg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.95': + resolution: {integrity: sha512-2IzCkW2RHRdcgF9W5/plHvYFpc6uikyjMb5SxjqmNxfyDFz9/HB89yhi8YQo0SNqrGRI7yBVDec7Pt+uMyRWsg==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.95': + resolution: {integrity: sha512-OV/ol/OtcUr4qDhQg8G7SdViZX8XyQeKpPsVv/j3+7U178FGoU4M+yIocdVo1ih/A8GQ63+LjF4jDoEjaVU8Pw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.95': + resolution: {integrity: sha512-Z5KzqBK/XzPz5+SFHKz7yKqClEQ8pOiEDdgk5SlphBLVNb8JFIJkxhtJKSvnJyHh2rjVgiFmvtJzMF0gNwwKyQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-arm64-msvc@0.1.95': + resolution: {integrity: sha512-aj0YbRpe8qVJ4OzMsK7NfNQePgcf9zkGFzNZ9mSuaxXzhpLHmlF2GivNdCdNOg8WzA/NxV6IU4c5XkXadUMLeA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/canvas-win32-x64-msvc@0.1.95': + resolution: {integrity: sha512-GA8leTTCfdjuHi8reICTIxU0081PhXvl3lzIniLUjeLACx9GubUiyzkwFb+oyeKLS5IAGZFLKnzAf4wm2epRlA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.95': + resolution: {integrity: sha512-lkg23ge+rgyhgUwXmlbkPEhuhHq/hUi/gXKH+4I7vO+lJrbNfEYcQdJLIGjKyXLQzgFiiyDAwh5vAe/tITAE+w==} + engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + '@oxc-project/types@0.99.0': resolution: {integrity: sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==} @@ -1218,8 +1306,8 @@ packages: resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} engines: {node: '>=12.22.0'} - '@pnpm/npm-conf@2.3.1': - resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + '@pnpm/npm-conf@3.0.2': + resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} engines: {node: '>=12'} '@puppeteer/browsers@2.7.1': @@ -1239,9 +1327,6 @@ packages: '@push.rocks/isounique@1.0.5': resolution: {integrity: sha512-Z0BVqZZOCif1THTbIKWMgg0wxCzt9CyBtBBqQJiZ+jJ0KlQFrQHNHrPt81/LXe/L4x0cxWsn0bpL6W5DNSvNLw==} - '@push.rocks/levelcache@3.1.1': - resolution: {integrity: sha512-+JpDNEt+EuvmbtADGH9SkODxBy+slHDDzs43mAbuMbwpVvi6uNuMK0Mkhrfz9UFpxUSp+cJE/jl/OxdpD0xL1A==} - '@push.rocks/levelcache@3.2.0': resolution: {integrity: sha512-Ch0Oguta2I0SVi704kHghhBcgfyfS92ua1elRu9d8X1/9LMRYuqvvBAnyXyFxQzI3S8q8QC6EkRdd8CAAYSzRg==} @@ -1251,6 +1336,9 @@ packages: '@push.rocks/lik@6.2.2': resolution: {integrity: sha512-j64FFPPyMXeeUorjKJVF6PWaJUfiIrF3pc41iJH4lOh0UUpBAHpcNzHVxTR58orwbVA/h3Hz+DQd4b1Rq0dFDQ==} + '@push.rocks/lik@6.3.1': + resolution: {integrity: sha512-UWDwGBaVx5yPtAFXqDDBtQZCzETUOA/7myQIXb+YBsuiIw4yQuhNZ23uY2ChQH2Zn6DLqdNSgQcYC0WywMZBNQ==} + '@push.rocks/mongodump@1.0.8': resolution: {integrity: sha512-oDufyjNBg8I50OaJvbHhc0RnRpJQ544dr9her0G6sA8JmI3hD2/amTdcPLVIX1kzYf5GsTUKeWuRaZgdNqz3ew==} @@ -1260,11 +1348,8 @@ packages: '@push.rocks/qenv@6.1.3': resolution: {integrity: sha512-+z2hsAU/7CIgpYLFqvda8cn9rUBMHqLdQLjsFfRn5jPoD7dJ5rFlpkbhfM4Ws8mHMniwWaxGKo+q/YBhtzRBLg==} - '@push.rocks/smartarchive@4.2.2': - resolution: {integrity: sha512-6EpqbKU32D6Gcqsc9+Tn1dOCU5HoTlrqqs/7IdUr9Tirp9Ngtptkapca1Fw/D0kVJ7SSw3kG/miAYnuPMZLEoA==} - - '@push.rocks/smartarray@1.1.0': - resolution: {integrity: sha512-b5YgBmUdglOJH8zeUf2ZWdPCoqySgwvkycRi2BhA9zVZHkpASh39Ej0q0fxFJetlUVyYqGfVoMVjbVrLFfFV7g==} + '@push.rocks/smartarchive@4.2.4': + resolution: {integrity: sha512-uiqVAXPxmr8G5rv3uZvZFMOCt8l7cZC3nzvsy4YQqKf/VkPhKIEX+b7LkAeNlxPSYUiBQUkNRoawg9+5BaMcHg==} '@push.rocks/smartbrowser@2.0.8': resolution: {integrity: sha512-0KWRZj3TuKo/sNwgPbiSE6WL+TMeR19t1JmXBZWh9n8iA2mpc4HhMrQAndEUdRCkx5ofSaHWojIRVFzGChj0Dg==} @@ -1272,25 +1357,12 @@ packages: '@push.rocks/smartbucket@3.3.10': resolution: {integrity: sha512-0H2MioALspC8Aj0Q1FPCs2w4k2u9oJg7Q5yM8+1TZo7aRfrdxgM5HQ7z3apUaqC3ZEDewW6vSlttjHFHhMEC3A==} - '@push.rocks/smartbucket@3.3.7': - resolution: {integrity: sha512-RiOuEtwHJ+HFbV1nlZgh5VuMvP6PXElX6rVe7OSQsyNCBybRQa/d1qDic92+2Ejx852DGeHlyREELQCxd/a/7w==} - - '@push.rocks/smartbucket@4.3.0': - resolution: {integrity: sha512-4nstzEduCKou4R5ekKH6kUjDZXWfrtjA1hIQ4MJmTbtncmm2+4+ixjaFThS2nS8Aa+fHcBgOtKkBv8wTsgvK/Q==} - '@push.rocks/smartbuffer@3.0.5': resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==} - '@push.rocks/smartcache@1.0.16': - resolution: {integrity: sha512-UAXf74eDuH4/RebJhydIbHlYVR3ACYJjniEY/9ZePblu7bIPgwFZqLBE9g1lcKVogbH9yY62dk3rSpgBzenyfQ==} - '@push.rocks/smartcache@1.0.18': resolution: {integrity: sha512-3+cmLu9chbnmi4yD4kjlFP/Tn4NReaZIoicEcGTtwbcokTrSDMs3YPdJzIpDZkAs83PW7OcVSHa3Ak5KU5OWzA==} - '@push.rocks/smartchok@1.1.1': - resolution: {integrity: sha512-WmNigGmn1muBJMANVuJb4F8x3TzgYrnn6YZm6ixTsG+0WFbYevivEwp+J4S7npobLHsR7ynf+Ky8LxRYmsL50A==} - deprecated: This package has been renamed. Please use @push.rocks/smartwatch instead. - '@push.rocks/smartcli@4.0.20': resolution: {integrity: sha512-gCo4ItvsPj8WoVAJw/6vkuoGA5FtIoACux2ktcCeH0nrFe7/xGR6waJ1aZcYAi7QN4gi52TlsgwuKz7BzXqhmQ==} @@ -1324,6 +1396,9 @@ packages: '@push.rocks/smartexit@1.0.23': resolution: {integrity: sha512-WmwKYcwbHBByoABhHHB+PAjr5475AtD/xBh1mDcqPrFsOOUOZq3BBUdpq25wI3ccu/SZB5IwaimiVzadls6HkA==} + '@push.rocks/smartexit@2.0.3': + resolution: {integrity: sha512-ZWpZ3Elorpv/rKtUcCUejUHG4BIE5B3QWysBAgb7lTcA7y0vGdFY32Y5/Q5tHpZM6PPxl/WTdUOYtSojQTq+pA==} + '@push.rocks/smartexpect@2.5.0': resolution: {integrity: sha512-yoyuCoQ3tTiAriuvF+/09fNbVfFnacudL2SwHSzPhX/ugaE7VTSWXQ9A34eKOWvil0MPyDcOY36fVZDxvrPd8A==} @@ -1342,15 +1417,18 @@ packages: '@push.rocks/smartfs@1.3.1': resolution: {integrity: sha512-ZSduVS8tM+/erbyCTvRRvc9gLWwbpqN5xdIIkMr+gub7fowSeJb7tR2rnGwySa63DyimU0q2KTp79VV9YqGLeg==} + '@push.rocks/smartfs@1.3.3': + resolution: {integrity: sha512-IF16dgeDFDv65j+lhyhqjhm6gFhBrWTrnayVOCwbBg4yJ/6tNpd7sL8YsvBJRBRCBWrMFBCSL7thG0Thvq0VZA==} + '@push.rocks/smartguard@3.1.0': resolution: {integrity: sha512-J23q84f1O+TwFGmd4lrO9XLHUh2DaLXo9PN/9VmTWYzTkQDv5JehmifXVI0esophXcCIfbdIu6hbt7/aHlDF4A==} - '@push.rocks/smarthash@3.2.0': - resolution: {integrity: sha512-+dgvrtj9hwE/Xxqy9NLEDw8kmbn4TybFhwHsU6C0baVt7oTy97fj39PO0ooyNCKVfNrfLGhq5iSUTAJiGWnMlQ==} - '@push.rocks/smarthash@3.2.6': resolution: {integrity: sha512-Mq/WNX0Tjjes3X1gHd/ZBwOOKSrAG/Z3Xoc0OcCm3P20WKpniihkMpsnlE7wGjvpHLi/ZRe/XkB3KC3d5r9X4g==} + '@push.rocks/smarti18n@1.0.4': + resolution: {integrity: sha512-bHIi9Iuzp2cbux9q79ZK5jOQYPsYJ9zDDS4p/xEPQH31gr0mcFRosLSQb1kvDQDVmUhI0ADlQMqr2ui9zEXQHA==} + '@push.rocks/smartinteract@2.0.16': resolution: {integrity: sha512-eltvVRRUKBKd77DSFA4DPY2g4V4teZLNe8A93CDy/WglglYcUjxMoLY/b0DFTWCWKYT+yjk6Fe6p0FRrvX9Yvg==} @@ -1363,6 +1441,9 @@ packages: '@push.rocks/smartjson@5.2.0': resolution: {integrity: sha512-710e8UwovRfPgUtaBHcd6unaODUjV5fjxtGcGCqtaTcmvOV6VpasdVfT66xMDzQmWH2E9ZfHDJeso9HdDQzNQA==} + '@push.rocks/smartjson@6.0.0': + resolution: {integrity: sha512-FYfJnmukt66WePn6xrVZ3BLmRQl9W82LcsICK3VU9sGW7kasig090jKXPm+yX8ibQcZAO/KyR/Q8tMIYZNxGew==} + '@push.rocks/smartlog-destination-devtools@1.0.12': resolution: {integrity: sha512-zvsIkrqByc0JRaBgIyhh+PSz2SY/e/bmhZdUcr/OW6pudgAcqe2sso68EzrKux0w9OMl1P9ZnzF3FpCZPFWD/A==} @@ -1372,12 +1453,12 @@ packages: '@push.rocks/smartlog-interfaces@3.0.2': resolution: {integrity: sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==} - '@push.rocks/smartlog@3.0.7': - resolution: {integrity: sha512-WHOw0iHHjCEbYY4KGX40iFtLI11QJvvWIbC9yFn3Mt+nrdupMnry7Ztc5v/PqO8lu33Q6xDBMXiNQ9yNY0HVGw==} - '@push.rocks/smartlog@3.1.10': resolution: {integrity: sha512-5pf5JyzOE2WTCUislNIW4EHePo1a7hiXB+jbil38+N5hW71AEwcPFe6oGxbp5w9ALlz66hV2+E+25R0SsxN+fQ==} + '@push.rocks/smartlog@3.2.1': + resolution: {integrity: sha512-x9/P59pfzY6HOGYmYrhqmoRl/pliTVx44g2Vbb8dIr/0zA39cAJHlPze1+UGncn37XKGmutK2iLSsJLEsexD0A==} + '@push.rocks/smartmanifest@2.0.2': resolution: {integrity: sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==} @@ -1393,8 +1474,8 @@ packages: '@push.rocks/smartmongo@2.0.14': resolution: {integrity: sha512-fvfPeCDDy5JaDBpVnsMKednsOoRzuYC0OszO8OoLOX/RaR755zIbRppCCK8Cez0hqd6eNkJGQeWdX/vXlJOPBA==} - '@push.rocks/smartnetwork@4.1.2': - resolution: {integrity: sha512-TjucG72ooHgzAUpNu2LAv4iFoettmZq2aEWhhzIa7AKcOvt4yxsk3Vl73guhKRohTfhdRauPcH5OHISLUHJbYA==} + '@push.rocks/smartmongo@5.1.0': + resolution: {integrity: sha512-2tpKf8K+SMdLHOEpafgKPIN+ypWTLwHc33hCUDNMQ1KaL7vokkavA44+fHxQydOGPMtDi22tSMFeVMCcUSzs4w==} '@push.rocks/smartnetwork@4.4.0': resolution: {integrity: sha512-OvFtz41cvQ7lcXwaIOhghNUUlNoMxvwKDctbDvMyuZyEH08SpLjhyv2FuKbKL/mgwA/WxakTbohoC8SW7t+kiw==} @@ -1420,8 +1501,8 @@ packages: '@push.rocks/smartpdf@3.3.0': resolution: {integrity: sha512-k4mBZAIl/TVBHDYQXaBZAgC8DdmHXsIZ3hRrLY3ysLr143YJ1VkwqQ2poqWh3A2SZQDrVfpKRYliUtjFRFrYVw==} - '@push.rocks/smartpdf@4.1.1': - resolution: {integrity: sha512-pC5gBDk4nk+xhRltS0ByTTSnVrwHjrrVfyrAgHYyiPKPZmYH5+Q4fZ+qzBrc6lEZSuCP8TEAeZcsGoOd3hAwvw==} + '@push.rocks/smartpdf@4.1.3': + resolution: {integrity: sha512-o0myXTRULg8HR55IXTSBIR+d0EjAlSrjwdqAnMYV3PDdUiPfxE7JE0GcDGsTKcm6mPxx/N2mg9Y/7xrlQU0z3w==} '@push.rocks/smartping@1.0.8': resolution: {integrity: sha512-Fvx1Db6hSsDOI6pdiCuS9GjtOX8ugx865YQrPg5vK2iw6Qj/srwyXcWLFYt+19WVKtvtWDJIAKbW+q3bXFsCeA==} @@ -1438,33 +1519,39 @@ packages: '@push.rocks/smartrequest@4.3.1': resolution: {integrity: sha512-H5FQSfFEbSJCHpE2A+SasQQcxM5FlxhHIUEzhUsSLjtlCTEu9T7Xb1WzVLFYvdWfyP5VIrg+XM4AMOols8cG+Q==} + '@push.rocks/smartrequest@4.4.2': + resolution: {integrity: sha512-Om4y1Ce4YdSu8VoXREz2SgFz9pDxcFEm0+SC1YYa3RXd0AH2Mknaj/1XfvfMqojnK9L7N2z1fY4xX8tO1IwqFQ==} + '@push.rocks/smartrequest@5.0.1': resolution: {integrity: sha512-gZQQF6HVt3LwTBxaPh6hHObd4VF76PUYQcs5pHD7f0VXaEewmrNAQSnccoinOY7fi45+0dOf04PJOXu9MibPzQ==} '@push.rocks/smartrouter@1.3.3': resolution: {integrity: sha512-1+xZEnWlhzqLWAaJ1zFNhQ0zgbfCWQl1DBT72LygLxTs+P0K8AwJKgqo/IX6CT55kGCFnPAZIYSbVJlGsgrB0w==} + '@push.rocks/smartrust@1.3.1': + resolution: {integrity: sha512-3ApbgF6yGeE2TRQxBY9Y48H1JlpcRheIp7QDBLSSfk80Uoe6fjdgBAfNz3Ir8hW3RZ3b7hA3sm1ZshCok58SEA==} + '@push.rocks/smartrx@3.0.10': resolution: {integrity: sha512-USjIYcsSfzn14cwOsxgq/bBmWDTTzy3ouWAnW5NdMyRRzEbmeNrvmy6TRqNeDlJ2PsYNTt1rr/zGUqvIy72ITg==} '@push.rocks/smartrx@3.0.7': resolution: {integrity: sha512-qCWy0s3RLAgGSnaw/Gu0BNaJ59CsI6RK5OJDCCqxc7P2X/S755vuLtnAR5/0dEjdhCHXHX9ytPZx+o9g/CNiyA==} - '@push.rocks/smarts3@3.0.3': - resolution: {integrity: sha512-Y9nXMwurthJ9Z7yi0RwjhPFUC58aY8Mhia8kFo6Xj1tBM4LE8Oxg/ydejF7otHqQGr3QyqV5C4YrDEG17rUuzg==} + '@push.rocks/smarts3@5.3.0': + resolution: {integrity: sha512-6bo55ovCDEylbTxwPFZYDrZrz2babQEUmxHIexmVcP2j+6LYRHDbGYnWoyKdtqniqDFZ04pFkOoZ85hUzU5xCw==} - '@push.rocks/smartshell@3.2.3': - resolution: {integrity: sha512-BWA/DH1H9lG7Er23d4uYgirfYaya5dX4g/WpWm2la7mOzuL9o2FnPIhel52DQUKIh7ty3Ql305ApV8YaAb4+/w==} + '@push.rocks/smartserve@2.0.1': + resolution: {integrity: sha512-YQb2qexfCzCqOlLWBBXKMg6xG4zahCPAxomz/KEKAwHtW6wMTtuHKSTSkRTQ0vl9jssLMAmRz2OyafiL9XGJXQ==} '@push.rocks/smartshell@3.3.0': resolution: {integrity: sha512-m0w618H6YBs+vXGz1CgS4nPi5CUAnqRtckcS9/koGwfcIx1IpjqmiP47BoCTbdgcv0IPUxQVBG1IXTHPuZ8Z5g==} + '@push.rocks/smartshell@3.3.7': + resolution: {integrity: sha512-b3st2+FjHUVhZZRlXfw93+SQA0UMVlURqe55uVpWdjJX7jeGXTTeszuYygtiR99zC5iZ8WZhGDct3N2L1qc/qw==} + '@push.rocks/smartsitemap@2.0.4': resolution: {integrity: sha512-76dYWG/o/EjV4vYCK7ZKM35T9xgrI+oHEiiIE6E2MDaFIU6QnSfciTfbscH5nc0vxx8Ah+I0HPEJO94BM2S39w==} - '@push.rocks/smartsocket@2.1.0': - resolution: {integrity: sha512-etOGyfiDFQz/1WJnD3jFL2N7ykujTjiudAz6qZTz82xE5oabKuKX+Cn8SdM9dOwzyWmBUKbUdll8QhovAXjn+g==} - '@push.rocks/smartspawn@3.0.3': resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} @@ -1474,6 +1561,9 @@ packages: '@push.rocks/smartstream@3.2.5': resolution: {integrity: sha512-PLGGIFDy8JLNVUnnntMSIYN4W081YSbNC7Y/sWpvUT8PAXtbEXXUiDFgK5o3gcI0ptpKQxHAwxhzNlPj0sbFVg==} + '@push.rocks/smartstream@3.4.0': + resolution: {integrity: sha512-kePb44W9n5K96zj2Ms3K4xnYbNXP5AfxDd86zZMDQ1/T10nvkIpL9m5w4lG/VJ4KAsWFs81S87BkkcjhhrY5Kw==} + '@push.rocks/smartstring@4.0.15': resolution: {integrity: sha512-NTNeOjWyg+aHtBTiQEyXamr7oTvYZ3wS1fudHo9ua7CLrykpK+i+RxFyJaLg1zB5x9xQF3NLEQecB14HPFX8Cg==} @@ -1483,6 +1573,9 @@ packages: '@push.rocks/smarttime@4.1.1': resolution: {integrity: sha512-Ha/3J/G+zfTl4ahpZgF6oUOZnUjpLhrBja0OQ2cloFxF9sKT8I1COaSqIfBGDtoK2Nly4UD4aTJ3JcJNOg/kgA==} + '@push.rocks/smarttime@4.2.3': + resolution: {integrity: sha512-8gMg8RUkrCG4p9NcEUZV7V6KpL24+jAMK02g7qyhfA6giz/JJWD0+8w8xjSR+G7qe16KVQ2y3RbvAL9TxmO36g==} + '@push.rocks/smartunique@3.0.9': resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==} @@ -1492,6 +1585,10 @@ packages: '@push.rocks/smartversion@3.0.5': resolution: {integrity: sha512-8MZSo1yqyaKxKq0Q5N188l4un++9GFWVbhCAX5mXJwewZHn97ujffTeL+eOQYpWFTEpUhaq1QhL4NhqObBCt1Q==} + '@push.rocks/smartwatch@6.3.0': + resolution: {integrity: sha512-TeZ1PGBoBMpC4/CK8StIj5InEiFfKp7xWJSm3aYMjB/uaoeRP0vXqv1ORIC/TKYGJuEDuAXUsit8tZVjn0qT1Q==} + engines: {node: '>=20.0.0'} + '@push.rocks/smartxml@2.0.0': resolution: {integrity: sha512-1d06zYJX4Zt8s5w5qFOUg2LAEz9ykrh9d6CQPK4WAgOBIefb1xzVEWHc7yoxicc2OkzNgC3IBCEg3s6BncZKWw==} @@ -1501,18 +1598,21 @@ packages: '@push.rocks/smartyaml@3.0.4': resolution: {integrity: sha512-1JRt+hnoc2zHw3AW+vXKlCdSVwqOmY/01fu+2HBviS0UDjoZCa+/rp6E3GaQb5lEEafKi8ENbffAfjXXp3N2xQ==} - '@push.rocks/taskbuffer@3.1.7': - resolution: {integrity: sha512-QktGVJPucqQmW/QNGnscf4FAigT1H7JWKFGFdRuDEaOHKFh9qN+PXG3QY7DtZ4jfXdGLxPN4yAufDuPSAJYFnw==} - '@push.rocks/taskbuffer@3.4.0': resolution: {integrity: sha512-Rvwr1CzYztB9PMboojRzVSq3xGp8288kvtvWx4Mg3rvps913znMja1UOjNn52ivOxu3dHUNYE3NDSP+j84cUWQ==} + '@push.rocks/taskbuffer@3.5.0': + resolution: {integrity: sha512-Y9WwIEIyp6oVFdj06j84tfrZIvjhbMb3DF52rYxlTeYLk3W7RPhSg1bGPCbtkXWeKdBrSe37V90BkOG7Qq8Pqg==} + '@push.rocks/webrequest@3.0.37': resolution: {integrity: sha512-fLN7kP6GeHFxE4UH4r9C9pjcQb0QkJxHeAMwXvbOqB9hh0MFNKhtGU7GoaTn8SVRGRMPc9UqZVNwo6u5l8Wn0A==} '@push.rocks/webrequest@4.0.1': resolution: {integrity: sha512-I60XZZLVf8W5I7YdmUVVu4G92teE3rg3/aKaV00BRg8vJ3VXx3wc59Qj4em7zxQ5o0HvL8m1Aezw3RFMDPyVgA==} + '@push.rocks/webrequest@4.0.5': + resolution: {integrity: sha512-wVSCaXqJ9Vh+rbwVz0wDl46dYz4rnwwSrm5vbVXKbuH6oKTPF0YRoujeJPqRltIn64RVGdLeY9/6ix+ZCrzhsg==} + '@push.rocks/websetup@3.0.19': resolution: {integrity: sha512-iKJDwXdMmQdu5siOIgziPRxM51lN1AU9HOr+yMteu1YMDkZT7HKCyisDAr4gC9WZ9a7FzsG8zgthm4dMeA8NTw==} @@ -1546,10 +1646,6 @@ packages: resolution: {integrity: sha512-VWON1OJ4qV2/9hzJbgRquRekaO9am3b8W82tgCwgO6LBg23ea2tanfd+gESVMbRFduxHVoFLvlhSBcDGM5zsLA==} deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartenv - '@pushrocks/smarterror@2.0.1': - resolution: {integrity: sha512-3OrF5me+/sy5VgwR/tfCqs7qhb0Ywzgn8tTThRUZnCGas0aindISzMiW7cIro3RlFykmtPmdTztC9Ostu2ioeA==} - deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarterror - '@pushrocks/smartfile-interfaces@1.0.7': resolution: {integrity: sha512-C/v9Scbx1J+ByMk3YBZrlLRYXdObty/Uz/h6kSZqsO8ghYuT9l7OVpEcyduiSVPakaMi6YnzfME3Nfs3oLj//Q==} deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartfile-interfaces @@ -1630,6 +1726,9 @@ packages: resolution: {integrity: sha512-6KGnf2vHR7hW4mQpAD7gkDVL3QVML3jb/No/Uw+qCqvs0TaQr60Yjm+CXoLxJNCKwmrL+I1yx8mhAHBHfYJiJA==} deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarturl + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@rolldown/binding-android-arm64@1.0.0-beta.52': resolution: {integrity: sha512-MBGIgysimZPqTDcLXI+i9VveijkP5C3EAncEogXhqfax6YXj1Tr2LY3DVuEOMIjWfMPMhtQSPup4fSTAmgjqIw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1716,60 +1815,60 @@ packages: '@rolldown/pluginutils@1.0.0-beta.52': resolution: {integrity: sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==} - '@rspack/binding-darwin-arm64@1.7.2': - resolution: {integrity: sha512-EsmfzNZnuEhVPMX5jWATCHT2UCCBh6iqq448xUMmASDiKVbIOhUTN1ONTV+aMERYl7BgMNJn0iTis6ot2GWKIg==} + '@rspack/binding-darwin-arm64@1.7.7': + resolution: {integrity: sha512-eL14fHy2JqfQ0YA5YMN2hktXhbafDSZt5kthvlBCbpQZLnYB7RP7TjHManIW/xFpnzrabvxkrLUOHhuIbWixIw==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.7.2': - resolution: {integrity: sha512-lQLq0eNzFDzR31XD0H5oTG0y8cBoNF9hJ2gt1GgqMlYvaY+pMEeh7s4rTX1/M0c4gHpLudp86SsDuDJ53BwnaQ==} + '@rspack/binding-darwin-x64@1.7.7': + resolution: {integrity: sha512-Zt+whHag/cTw1pZfRwkv11tu5LaAHy2VkvRVCsHClwrfp81PRcNJ2oRMurOUmRt1YL0mRdpRbZTh7XjGSc6gGw==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.7.2': - resolution: {integrity: sha512-rtrsygVbDYw55ukdIk3NEwNQWkUemfRgeNOUvZ0k/6p7eP16020VPDvIqvcmyPtBhwFmz5vfo57GnBLisjM/kw==} + '@rspack/binding-linux-arm64-gnu@1.7.7': + resolution: {integrity: sha512-uSq4qkvmAzSDUTKE2v4yUgHIBdTily1k3BcK5wBCGFm9OPODj5lQZpAdOHHIwu+Jxyjoa7Mb64tghhj9hZcXcA==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.7.2': - resolution: {integrity: sha512-zhh6ycumTHI7V/VOOT6DolvBe5RFG+Np/e5hhlhjEFtskraO9rkWg8knE9Ssu6a6Qdj4nGscqOj9ENNpc6gb+A==} + '@rspack/binding-linux-arm64-musl@1.7.7': + resolution: {integrity: sha512-NhWCBfiu6plpmLRP6c6D5lBUaVrBr1nvjSEc7VyQF8TGh8URo2btH0wngEiX0nWvidsSlERt1l6Y5QPGuiCl1g==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.7.2': - resolution: {integrity: sha512-ON9hy6OTpBOmmFp/51RPa0r9bDbZ3wTTubT54V+yhHuB+eSrlXQIOQScUGCGoGgqp6sLTwKjv2yy7YLyzd1gCA==} + '@rspack/binding-linux-x64-gnu@1.7.7': + resolution: {integrity: sha512-aRvf8gCI7jDeEN9i4u9fY5coa3ZAyHzGVA4ZhTJCgZ5wWA5A9SQewMSq7khS1WAAFE1USlk1tUuPujnrGoYrGg==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.7.2': - resolution: {integrity: sha512-+2nnjwaSOStgLKtY5O7I3yfkwTkhiJLQ35CwQqWKRw+g1E4OFIKpXBfl34JDtrF/2DeS7sVVyLeuC25+43n9/A==} + '@rspack/binding-linux-x64-musl@1.7.7': + resolution: {integrity: sha512-ALPto4OT7snzXbYDyqkLfh1BvwDTTH1hPYXGUXBzQ0wEV7sXeyvxCC4yjH6B5MhR7W3tFuF4IfDy5Z4BxmOoGQ==} cpu: [x64] os: [linux] - '@rspack/binding-wasm32-wasi@1.7.2': - resolution: {integrity: sha512-TU/aLBpm9CTR/RTLF27WlvBKGyju6gpiNTRd3XRbX2JfY3UBNUQN/Ev+gQMVeOj55y9Fruzou42/w9ncTKA0Dw==} + '@rspack/binding-wasm32-wasi@1.7.7': + resolution: {integrity: sha512-7DZvUp0v75n451qfZw1ppbPakL6NAc2gjb5e9AJcOb7KUMBHNyOxqpPo/jRYKxH7isPpLfpoId79WQGGNTTMAw==} cpu: [wasm32] - '@rspack/binding-win32-arm64-msvc@1.7.2': - resolution: {integrity: sha512-RReQN3AUu46XUZnOy5L/vSj5J+tcl/bzSnGQ2KetZ7dUOjGCC6c0Ki3EiklVM5OC1Agytz0Rz7cJqHJ+HaQbsA==} + '@rspack/binding-win32-arm64-msvc@1.7.7': + resolution: {integrity: sha512-oI08KqyVDKhq1Qi/YPMdrSLDOib0DQes9Cg67NJLZISe5UXwzvgBj7zyyKpaj8TLWnIlKSq4ITr3haRnd4lOfA==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.7.2': - resolution: {integrity: sha512-EytrfT2sfUCnRMtXfSNv7AR65DWuY3dX/Bsn1TTin7CC6+RFEAP9nzHtCMISvFPp+c5bveok0/eY8j/f4LZ/Gg==} + '@rspack/binding-win32-ia32-msvc@1.7.7': + resolution: {integrity: sha512-nZ/t7XpO/+tRjK6m85an27j8FwJqpYXVSBGReZbB6dVHZiS7l6psjWkIf6A3E2umn/RjA7qvHaPH9czWkH+Fhw==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.7.2': - resolution: {integrity: sha512-zLFt6cr55fjbIy6HT1xS2yLVmtvRjyZ0TbcRum7Ipp+s23gyGHVYNRuDMj34AHnhbCcX/XrxDTzCc4ba6xtYTw==} + '@rspack/binding-win32-x64-msvc@1.7.7': + resolution: {integrity: sha512-+XnPOC1MoeF5Qa24Z8+DCsytQP0Q9Ifdkh+XzTWgvjpFQmGAkDynHUVfscmJL/8k/nd1l/6TyXCL1EGoqa0huQ==} cpu: [x64] os: [win32] - '@rspack/binding@1.7.2': - resolution: {integrity: sha512-bVssRQ39TgGA2RxKEbhUBKYRHln9sbBi0motHmqSU53aMnIkiLXjcj7tZC5dK7Okl2SrHM5KCYK9eG4UodDfdA==} + '@rspack/binding@1.7.7': + resolution: {integrity: sha512-9FqHG2Bl70Bd4gUmwA+3xUx4pYphdLO9ToIm9iMWbBINyArME0XboZg4FoEdU13LqndkWqaamkE613BR0lRF3g==} - '@rspack/core@1.7.2': - resolution: {integrity: sha512-Pm06phSQqbthbzl92KdnbXmwcnYRv3Ef86uE6hoADqVjsmt2WvJwNjpqgs0S6n+s9UL6QzxqaaAaKg5qeBT+3g==} + '@rspack/core@1.7.7': + resolution: {integrity: sha512-efwVXxAA9eYgLtYX53zcuuex6Wr8DnOXeIw3JFoA8EuyN7TINGqnvkuGDuE+F9XQxQ3KBzVueiYdMK42sVTyUw==} engines: {node: '>=18.12.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -1787,10 +1886,6 @@ packages: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@smithy/abort-controller@4.0.1': - resolution: {integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==} - engines: {node: '>=18.0.0'} - '@smithy/abort-controller@4.2.0': resolution: {integrity: sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==} engines: {node: '>=18.0.0'} @@ -1799,26 +1894,14 @@ packages: resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.0.0': - resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} - engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.2.1': resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.0.0': - resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} - engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.2.0': resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.0.1': - resolution: {integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==} - engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.3.0': resolution: {integrity: sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==} engines: {node: '>=18.0.0'} @@ -1827,10 +1910,6 @@ packages: resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.1.5': - resolution: {integrity: sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.15.0': resolution: {integrity: sha512-VJWncXgt+ExNn0U2+Y7UywuATtRYaodGQKFo9mDyh70q+fJGedfrqi2XuKU1BhiLeXgg6RZrW7VEKfeqFhHAJA==} engines: {node: '>=18.0.0'} @@ -1839,10 +1918,6 @@ packages: resolution: {integrity: sha512-aO7jmh3CtrmPsIJxUwYIzI5WVlMK8BMCPQ4D4nTzqTqBhbzvxHNzBMGcEg13yg/z9R2Qsz49NUFl0F0lVbTVFw==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.1': - resolution: {integrity: sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==} - engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.0': resolution: {integrity: sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==} engines: {node: '>=18.0.0'} @@ -1851,70 +1926,26 @@ packages: resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.0.1': - resolution: {integrity: sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==} - engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.0': resolution: {integrity: sha512-XE7CtKfyxYiNZ5vz7OvyTf1osrdbJfmUy+rbh+NLQmZumMGvY0mT0Cq1qKSfhrvLtRYzMsOBuRpi10dyI0EBPg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.8': - resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-browser@4.0.1': - resolution: {integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==} - engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.2.0': resolution: {integrity: sha512-U53p7fcrk27k8irLhOwUu+UYnBqsXNLKl1XevOpsxK3y1Lndk8R7CSiZV6FN3fYFuTPuJy5pP6qa/bjDzEkRvA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.2.8': - resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.0.1': - resolution: {integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==} - engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.0': resolution: {integrity: sha512-uwx54t8W2Yo9Jr3nVF5cNnkAAnMCJ8Wrm+wDlQY6rY/IrEgZS3OqagtCu/9ceIcZFQ1zVW/zbN9dxb5esuojfA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.8': - resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-node@4.0.1': - resolution: {integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==} - engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.0': resolution: {integrity: sha512-yjM2L6QGmWgJjVu/IgYd6hMzwm/tf4VFX0lm8/SvGbGBwc+aFl3hOzvO/e9IJ2XI+22Tx1Zg3vRpFRs04SWFcg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.8': - resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-universal@4.0.1': - resolution: {integrity: sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==} - engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.0': resolution: {integrity: sha512-C3jxz6GeRzNyGKhU7oV656ZbuHY93mrfkT12rmjDdZch142ykjn8do+VOkeRNjSGKw01p4g+hdalPYPhmMwk1g==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.8': - resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.0.1': - resolution: {integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==} - engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.1': resolution: {integrity: sha512-3AvYYbB+Dv5EPLqnJIAgYw/9+WzeBiUYS8B+rU0pHq5NMQMvrZmevUROS4V2GAt0jEOn9viBzPLrZE+riTNd5Q==} engines: {node: '>=18.0.0'} @@ -1923,22 +1954,10 @@ packages: resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.0.1': - resolution: {integrity: sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==} - engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.2.1': resolution: {integrity: sha512-Os9cg1fTXMwuqbvjemELlf+HB5oEeVyZmYsTbAtDQBmjGyibjmbeeqcaw7xOJLIHrkH/u0wAYabNcN6FRTqMRg==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.2.9': - resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-node@4.0.1': - resolution: {integrity: sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==} - engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.0': resolution: {integrity: sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==} engines: {node: '>=18.0.0'} @@ -1947,22 +1966,10 @@ packages: resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.0.1': - resolution: {integrity: sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==} - engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.2.0': resolution: {integrity: sha512-8dELAuGv+UEjtzrpMeNBZc1sJhO8GxFVV/Yh21wE35oX4lOE697+lsMHBoUIFAUuYkTMIeu0EuJSEsH7/8Y+UQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.2.8': - resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.0.1': - resolution: {integrity: sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==} - engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.2.0': resolution: {integrity: sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==} engines: {node: '>=18.0.0'} @@ -1975,30 +1982,14 @@ packages: resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.0.0': - resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} - engines: {node: '>=18.0.0'} - '@smithy/is-array-buffer@4.2.0': resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.0.1': - resolution: {integrity: sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==} - engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.2.0': resolution: {integrity: sha512-LFEPniXGKRQArFmDQ3MgArXlClFJMsXDteuQQY8WG1/zzv6gVSo96+qpkuu1oJp4MZsKrwchY0cuAoPKzEbaNA==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.2.8': - resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.0.1': - resolution: {integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.2.0': resolution: {integrity: sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==} engines: {node: '>=18.0.0'} @@ -2007,10 +1998,6 @@ packages: resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.0.6': - resolution: {integrity: sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.3.1': resolution: {integrity: sha512-JtM4SjEgImLEJVXdsbvWHYiJ9dtuKE8bqLlvkvGi96LbejDL6qnVpVxEFUximFodoQbg0Gnkyff9EKUhFhVJFw==} engines: {node: '>=18.0.0'} @@ -2019,10 +2006,6 @@ packages: resolution: {integrity: sha512-TV44qwB/T0OMMzjIuI+JeS0ort3bvlPJ8XIH0MSlGADraXpZqmyND27ueuAL3E14optleADWqtd7dUgc2w+qhQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.0.7': - resolution: {integrity: sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.1': resolution: {integrity: sha512-wXxS4ex8cJJteL0PPQmWYkNi9QKDWZIpsndr0wZI2EL+pSSvA/qqxXU60gBOJoIc2YgtZSWY/PE86qhKCCKP1w==} engines: {node: '>=18.0.0'} @@ -2031,10 +2014,6 @@ packages: resolution: {integrity: sha512-yiUY1UvnbUFfP5izoKLtfxDSTRv724YRRwyiC/5HYY6vdsVDcDOXKSXmkJl/Hovcxt5r+8tZEUAdrOaCJwrl9Q==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.2': - resolution: {integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.0': resolution: {integrity: sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==} engines: {node: '>=18.0.0'} @@ -2043,10 +2022,6 @@ packages: resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.1': - resolution: {integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.2.0': resolution: {integrity: sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==} engines: {node: '>=18.0.0'} @@ -2055,10 +2030,6 @@ packages: resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.0.1': - resolution: {integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==} - engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.0': resolution: {integrity: sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==} engines: {node: '>=18.0.0'} @@ -2067,10 +2038,6 @@ packages: resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.0.3': - resolution: {integrity: sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==} - engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.3.0': resolution: {integrity: sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==} engines: {node: '>=18.0.0'} @@ -2079,10 +2046,6 @@ packages: resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.1': - resolution: {integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==} - engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.0': resolution: {integrity: sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==} engines: {node: '>=18.0.0'} @@ -2091,10 +2054,6 @@ packages: resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.0.1': - resolution: {integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==} - engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.0': resolution: {integrity: sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==} engines: {node: '>=18.0.0'} @@ -2103,10 +2062,6 @@ packages: resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.0.1': - resolution: {integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==} - engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.0': resolution: {integrity: sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==} engines: {node: '>=18.0.0'} @@ -2115,10 +2070,6 @@ packages: resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.0.1': - resolution: {integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==} - engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.0': resolution: {integrity: sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==} engines: {node: '>=18.0.0'} @@ -2127,10 +2078,6 @@ packages: resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.1': - resolution: {integrity: sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==} - engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.0': resolution: {integrity: sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==} engines: {node: '>=18.0.0'} @@ -2139,10 +2086,6 @@ packages: resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.0.1': - resolution: {integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==} - engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.3.0': resolution: {integrity: sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==} engines: {node: '>=18.0.0'} @@ -2151,10 +2094,6 @@ packages: resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.0.1': - resolution: {integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==} - engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.3.0': resolution: {integrity: sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==} engines: {node: '>=18.0.0'} @@ -2163,10 +2102,6 @@ packages: resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.1.6': - resolution: {integrity: sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==} - engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.10.9': resolution: {integrity: sha512-Je0EvGXVJ0Vrrr2lsubq43JGRIluJ/hX17aN/W/A0WfE+JpoMdI8kwk2t9F0zTX9232sJDGcoH4zZre6m6f/sg==} engines: {node: '>=18.0.0'} @@ -2187,10 +2122,6 @@ packages: resolution: {integrity: sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.1': - resolution: {integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==} - engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.0': resolution: {integrity: sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==} engines: {node: '>=18.0.0'} @@ -2199,26 +2130,14 @@ packages: resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.0.0': - resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} - engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.3.0': resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.0.0': - resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} - engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.2.0': resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.0.0': - resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} - engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.2.1': resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} engines: {node: '>=18.0.0'} @@ -2227,26 +2146,14 @@ packages: resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.0.0': - resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} - engines: {node: '>=18.0.0'} - '@smithy/util-buffer-from@4.2.0': resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.0.0': - resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} - engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.2.0': resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.7': - resolution: {integrity: sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==} - engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.0': resolution: {integrity: sha512-H4MAj8j8Yp19Mr7vVtGgi7noJjvjJbsKQJkvNnLlrIFduRFT5jq5Eri1k838YW7rN2g5FTnXpz5ktKVr1KVgPQ==} engines: {node: '>=18.0.0'} @@ -2255,10 +2162,6 @@ packages: resolution: {integrity: sha512-mMg+r/qDfjfF/0psMbV4zd7F/i+rpyp7Hjh0Wry7eY15UnzTEId+xmQTGDU8IdZtDfbGQxuWNfgBZKBj+WuYbA==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.7': - resolution: {integrity: sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==} - engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.1': resolution: {integrity: sha512-PuDcgx7/qKEMzV1QFHJ7E4/MMeEjaA7+zS5UNcHCLPvvn59AeZQ0DSDGMpqC2xecfa/1cNGm4l8Ec/VxCuY7Ug==} engines: {node: '>=18.0.0'} @@ -2267,10 +2170,6 @@ packages: resolution: {integrity: sha512-EQqe/WkbCinah0h1lMWh9ICl0Ob4lyl20/10WTB35SC9vDQfD8zWsOT+x2FIOXKAoZQ8z/y0EFMoodbcqWJY/w==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.1': - resolution: {integrity: sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==} - engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.2.0': resolution: {integrity: sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==} engines: {node: '>=18.0.0'} @@ -2279,18 +2178,10 @@ packages: resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.0.0': - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} - engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.2.0': resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.0.1': - resolution: {integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==} - engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.0': resolution: {integrity: sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==} engines: {node: '>=18.0.0'} @@ -2299,10 +2190,6 @@ packages: resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.1': - resolution: {integrity: sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==} - engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.2.0': resolution: {integrity: sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==} engines: {node: '>=18.0.0'} @@ -2311,10 +2198,6 @@ packages: resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.1.2': - resolution: {integrity: sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==} - engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.0': resolution: {integrity: sha512-0TD5M5HCGu5diEvZ/O/WquSjhJPasqv7trjoqHyWjNh/FBeBl7a0ztl9uFMOsauYtRfd8jvpzIAQhDHbx+nvZw==} engines: {node: '>=18.0.0'} @@ -2323,10 +2206,6 @@ packages: resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.0.0': - resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} - engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.2.0': resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} @@ -2335,32 +2214,20 @@ packages: resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.0.0': - resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} - engines: {node: '>=18.0.0'} - '@smithy/util-utf8@4.2.0': resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.0.2': - resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==} - engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.0': resolution: {integrity: sha512-0Z+nxUU4/4T+SL8BCNN4ztKdQjToNvUYmkF1kXO5T7Yz3Gafzh0HeIG6mrkN8Fz3gn9hSyxuAT+6h4vM+iQSBQ==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.8': - resolution: {integrity: sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==} - engines: {node: '>=18.0.0'} - '@smithy/uuid@1.1.0': resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -2369,8 +2236,157 @@ packages: '@tempfix/idb@8.0.3': resolution: {integrity: sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==} - '@tokenizer/inflate@0.2.7': - resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} + '@tempfix/lenis@1.3.20': + resolution: {integrity: sha512-ypeB0FuHLHOCQXW4d0RQ69txPJJH+1CHcpsZIUdcv2t1vR0IVyQr2vHihtde9UOXhjzqEnUphWon/UcJNsa0YA==} + peerDependencies: + '@nuxt/kit': '>=3.0.0' + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + react: + optional: true + vue: + optional: true + + '@tempfix/webcontainer__api@1.6.1': + resolution: {integrity: sha512-Hgn3cwy0vPzjrVBqeVnY0jNZLaOCW7d+dxBe7Jv9YGHAjJ8udUMS+KbTywSv5paAfld3A/RN/iolmMzOwZxLTA==} + + '@tiptap/core@2.27.2': + resolution: {integrity: sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.27.2': + resolution: {integrity: sha512-oIGZgiAeA4tG3YxbTDfrmENL4/CIwGuP3THtHsNhwRqwsl9SfMk58Ucopi2GXTQSdYXpRJ0ahE6nPqB5D6j/Zw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bold@2.27.2': + resolution: {integrity: sha512-bR7J5IwjCGQ0s3CIxyMvOCnMFMzIvsc5OVZKscTN5UkXzFsaY6muUAIqtKxayBUucjtUskm5qZowJITCeCb1/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bullet-list@2.27.2': + resolution: {integrity: sha512-gmFuKi97u5f8uFc/GQs+zmezjiulZmFiDYTh3trVoLRoc2SAHOjGEB7qxdx7dsqmMN7gwiAWAEVurLKIi1lnnw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-code-block@2.27.2': + resolution: {integrity: sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.27.2': + resolution: {integrity: sha512-7X9AgwqiIGXoZX7uvdHQsGsjILnN/JaEVtqfXZnPECzKGaWHeK/Ao4sYvIIIffsyZJA8k5DC7ny2/0sAgr2TuA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-document@2.27.2': + resolution: {integrity: sha512-CFhAYsPnyYnosDC4639sCJnBUnYH4Cat9qH5NZWHVvdgtDwu8GZgZn2eSzaKSYXWH1vJ9DSlCK+7UyC3SNXIBA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-dropcursor@2.27.2': + resolution: {integrity: sha512-oEu/OrktNoQXq1x29NnH/GOIzQZm8ieTQl3FK27nxfBPA89cNoH4mFEUmBL5/OFIENIjiYG3qWpg6voIqzswNw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-gapcursor@2.27.2': + resolution: {integrity: sha512-/c9VF1HBxj+AP54XGVgCmD9bEGYc5w5OofYCFQgM7l7PB1J00A4vOke0oPkHJnqnOOyPlFaxO/7N6l3XwFcnKA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.27.2': + resolution: {integrity: sha512-kSRVGKlCYK6AGR0h8xRkk0WOFGXHIIndod3GKgWU49APuIGDiXd8sziXsSlniUsWmqgDmDXcNnSzPcV7AQ8YNg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-heading@2.27.2': + resolution: {integrity: sha512-iM3yeRWuuQR/IRQ1djwNooJGfn9Jts9zF43qZIUf+U2NY8IlvdNsk2wTOdBgh6E0CamrStPxYGuln3ZS4fuglw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-history@2.27.2': + resolution: {integrity: sha512-+hSyqERoFNTWPiZx4/FCyZ/0eFqB9fuMdTB4AC/q9iwu3RNWAQtlsJg5230bf/qmyO6bZxRUc0k8p4hrV6ybAw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.27.2': + resolution: {integrity: sha512-WGWUSgX+jCsbtf9Y9OCUUgRZYuwjVoieW5n6mAUohJ9/6gc6sGIOrUpBShf+HHo6WD+gtQjRd+PssmX3NPWMpg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-italic@2.27.2': + resolution: {integrity: sha512-1OFsw2SZqfaqx5Fa5v90iNlPRcqyt+lVSjBwTDzuPxTPFY4Q0mL89mKgkq2gVHYNCiaRkXvFLDxaSvBWbmthgg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-link@2.27.2': + resolution: {integrity: sha512-bnP61qkr0Kj9Cgnop1hxn2zbOCBzNtmawxr92bVTOE31fJv6FhtCnQiD6tuPQVGMYhcmAj7eihtvuEMFfqEPcQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-list-item@2.27.2': + resolution: {integrity: sha512-eJNee7IEGXMnmygM5SdMGDC8m/lMWmwNGf9fPCK6xk0NxuQRgmZHL6uApKcdH6gyNcRPHCqvTTkhEP7pbny/fg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-ordered-list@2.27.2': + resolution: {integrity: sha512-M7A4tLGJcLPYdLC4CI2Gwl8LOrENQW59u3cMVa+KkwG1hzSJyPsbDpa1DI6oXPC2WtYiTf22zrbq3gVvH+KA2w==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-paragraph@2.27.2': + resolution: {integrity: sha512-elYVn2wHJJ+zB9LESENWOAfI4TNT0jqEN34sMA/hCtA4im1ZG2DdLHwkHIshj/c4H0dzQhmsS/YmNC5Vbqab/A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-strike@2.27.2': + resolution: {integrity: sha512-HHIjhafLhS2lHgfAsCwC1okqMsQzR4/mkGDm4M583Yftyjri1TNA7lzhzXWRFWiiMfJxKtdjHjUAQaHuteRTZw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-align@2.27.2': + resolution: {integrity: sha512-0Pyks6Hu+Q/+9+5/osoSv0SP6jIerdWMYbi13aaZLsJoj3lBj5WNaE11JtAwSFN5sx0IbqhDSlp1zkvRnzgZ8g==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-style@2.27.2': + resolution: {integrity: sha512-Omk+uxjJLyEY69KStpCw5fA9asvV+MGcAX2HOxyISDFoLaL49TMrNjhGAuz09P1L1b0KGXo4ml7Q3v/Lfy4WPA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text@2.27.2': + resolution: {integrity: sha512-Xk7nYcigljAY0GO9hAQpZ65ZCxqOqaAlTPDFcKerXmlkQZP/8ndx95OgUb1Xf63kmPOh3xypurGS2is3v0MXSA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-typography@2.27.2': + resolution: {integrity: sha512-NSyqDa8PlAZoVRfTWQuxueTZ6ftOD72EV7UKVpftf3C+Heme727mvwl1YHMnagOlqVoxBhFOrl9CnSs/q5uayQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-underline@2.27.2': + resolution: {integrity: sha512-gPOsbAcw1S07ezpAISwoO8f0RxpjcSH7VsHEFDVuXm4ODE32nhvSinvHQjv2icRLOXev+bnA7oIBu7Oy859gWQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/pm@2.27.2': + resolution: {integrity: sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==} + + '@tiptap/starter-kit@2.27.2': + resolution: {integrity: sha512-bb0gJvPoDuyRUQ/iuN52j1//EtWWttw+RXAv1uJxfR0uKf8X7uAqzaOOgwjknoCIDC97+1YHwpGdnRjpDkOBxw==} + + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} engines: {node: '>=18'} '@tokenizer/token@0.3.0': @@ -2379,18 +2395,12 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tsclass/tsclass@4.4.0': - resolution: {integrity: sha512-/T3qmxj28yRMM+0x9UtyBmrsJ66flviQEDg3M4kwmWuZQgbrDACa6JXdA0ieqfmuPOXDJRRDKcyKaKvKi2EdwA==} - '@tsclass/tsclass@4.4.4': resolution: {integrity: sha512-YZOAF+u+r4u5rCev2uUd1KBTBdfyFdtDmcv4wuN+864lMccbdfRICR3SlJwCfYS1lbeV3QNLYGD30wjRXgvCJA==} '@tsclass/tsclass@8.2.1': resolution: {integrity: sha512-bRDCfJTipsTcK6eEokWdsOR1mGCQFeM7zTg6PRHzbxTWQcWQD9AhEr2q3CrPcmAbvIS7fvkO6/pU/mPm1MZxhQ==} - '@tsclass/tsclass@9.2.0': - resolution: {integrity: sha512-A6ULEkQfYgOnCKQVQRt26O7PRzFo4PE2EoD25RAtnuFuVrNwGynYC20Vee2c8KAOyI7nQ/LaREki9KAX4AHOHQ==} - '@tsclass/tsclass@9.3.0': resolution: {integrity: sha512-KD3oTUN3RGu67tgjNHgWWZGsdYipr1RUDxQ9MMKSgIJ6oNZ4q5m2rg0ibrgyHWkAjTPlHVa6kHP3uVOY+8bnHw==} @@ -2412,15 +2422,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cors@2.8.19': - resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/default-gateway@7.2.2': - resolution: {integrity: sha512-35C93fYQlnLKLASkMPoxRvok4fENwB3By9clRLd2I/08n/XRl0pCdf7EB17K5oMMwZu8NBYA8i66jH5r/LYBKA==} - '@types/dns-packet@5.6.5': resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} @@ -2430,9 +2434,6 @@ packages: '@types/express-serve-static-core@5.0.7': resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} - '@types/express@5.0.3': - resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} - '@types/express@5.0.6': resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} @@ -2455,8 +2456,8 @@ packages: '@types/html-minifier@4.0.6': resolution: {integrity: sha512-1Dcf38DkVMYo8SIOkUka7GxI+0BztCVsnfiG2Sxb6G8ShHDQTWQb1WKps/eb3O074HNDCn8wU7LMl5N99nNG+Q==} - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -2470,9 +2471,18 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} @@ -2497,11 +2507,11 @@ packages: '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} - '@types/node@22.19.7': - resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==} + '@types/node@22.19.13': + resolution: {integrity: sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==} - '@types/node@25.0.9': - resolution: {integrity: sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==} + '@types/node@25.3.3': + resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} '@types/ping@0.4.4': resolution: {integrity: sha512-ifvo6w2f5eJYlXm+HiVx67iJe8WZp87sfa683nlqED5Vnt9Z93onkokNoWqOG21EaE8fMxyKPobE+mkPEyxsdw==} @@ -2524,9 +2534,6 @@ packages: '@types/send@0.17.5': resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} - '@types/serve-static@2.2.0': resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} @@ -2578,14 +2585,17 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} + engines: {node: '>= 20'} + + '@yr/monotone-cubic-spline@1.0.3': + resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} @@ -2602,6 +2612,12 @@ packages: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} + ai@6.0.116: + resolution: {integrity: sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ansi-256-colors@1.1.0: resolution: {integrity: sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=} engines: {node: '>=0.10.0'} @@ -2629,6 +2645,9 @@ packages: any-base@1.1.0: resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} + apexcharts@5.10.0: + resolution: {integrity: sha512-QRg/IX8yjGRUgBbHGdGV647XUFaZZ7+sOgOf9kwO+jrg8/VZ4HtQ/Fg3MgDjR6YVw8hkM7J9boTp91WCmSIp4A==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2659,6 +2678,14 @@ packages: b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + b4a@1.8.0: + resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2668,10 +2695,27 @@ packages: bare-events@2.5.4: resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-fs@4.0.1: resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} engines: {bare: '>=1.7.0'} + bare-fs@4.5.5: + resolution: {integrity: sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-os@3.4.0: resolution: {integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==} engines: {bare: '>=1.6.0'} @@ -2690,13 +2734,23 @@ packages: bare-events: optional: true + bare-stream@2.8.0: + resolution: {integrity: sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} @@ -2711,8 +2765,9 @@ packages: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} - bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} bowser@2.12.1: resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} @@ -2726,6 +2781,9 @@ packages: broadcast-channel@7.1.0: resolution: {integrity: sha512-InJljddsYWbEL8LBnopnCg+qMQp9KcowvYWOt4YWrjD5HmxzDYKdVbDS1w/ji5rFZdRD58V5UxJPtBdpEbEJYw==} + broadcast-channel@7.3.0: + resolution: {integrity: sha512-UHPhLBQKfQ8OmMFMpmPfO5dRakyA1vsfiDGWTYNvChYol65tbuhivPEGgZZiuetorvExdvxaWiBy/ym1Ty08yA==} + brorand@1.1.0: resolution: {integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=} @@ -2799,9 +2857,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} chromium-bidi@2.0.0: resolution: {integrity: sha512-8VmyVj0ewSY4pstZV0Y3rCUUwpomam8uWgHZf1XavRxJEP4vU9/dcpNuoyB+u4AQxPo96CASXz5CHPvdH+dSeQ==} @@ -2824,10 +2882,6 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone-regexp@3.0.0: - resolution: {integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==} - engines: {node: '>=12'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2869,10 +2923,6 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - convert-hrtime@5.0.0: - resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} - engines: {node: '>=12'} - cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -2881,10 +2931,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -2894,6 +2940,13 @@ packages: typescript: optional: true + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + croner@4.4.1: resolution: {integrity: sha512-aqVeeIPCf5/NZFlz4mN4MLEOs9xf4ODCmHQDs+577JFj8mK3RkKJz77h7+Rn94AijUqKdFNOUHM+v88d8p02UQ==} @@ -2923,32 +2976,8 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -3016,9 +3045,8 @@ packages: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} - dns-socket@4.2.2: - resolution: {integrity: sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg==} - engines: {node: '>=6'} + dompurify@3.2.7: + resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} @@ -3046,17 +3074,6 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - engine.io-client@6.6.3: - resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} - - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - engine.io@6.6.4: - resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} - engines: {node: '>=10.2.0'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3089,6 +3106,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3137,21 +3159,28 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + exif-parser@0.1.12: resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} - express-force-ssl@0.3.2: - resolution: {integrity: sha1-AbK0mK5v0uQRUrIrV6Phc3c69n4=} - engines: {node: '>=0.2.2'} - express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -3218,8 +3247,8 @@ packages: resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} - file-type@21.0.0: - resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} + file-type@21.3.0: + resolution: {integrity: sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==} engines: {node: '>=20'} finalhandler@2.1.0: @@ -3298,10 +3327,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function-timeout@0.1.1: - resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} - engines: {node: '>=14.16'} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3352,10 +3377,6 @@ packages: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} - got@13.0.0: - resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} - engines: {node: '>=16'} - graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -3397,6 +3418,10 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + hmac-drbg@1.0.1: resolution: {integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=} @@ -3408,13 +3433,17 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -3430,6 +3459,9 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} + ibantools@4.5.1: + resolution: {integrity: sha512-DfKQpLlFq9yEUIEnFuCJzss3XavD7iHZTU5PyqXiAJ+rmaMp+NFP3hboumHKuK8nZjuOJg93WemTzcQ5b9jOZA==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -3438,6 +3470,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3465,10 +3501,6 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} - ip-regex@5.0.0: - resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -3488,10 +3520,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-ip@5.0.1: - resolution: {integrity: sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==} - engines: {node: '>=14.16'} - is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -3511,10 +3539,6 @@ packages: is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-regexp@3.1.0: - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} - engines: {node: '>=12'} - is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -3538,6 +3562,10 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + isopen@1.3.0: resolution: {integrity: sha512-AN6Q9J0UlqHFl1fN/2xJCHCBLCBCFDjZhpGBO1gh3wzgRPsFSFBUL36I2Lbfd9qkuoj58axmE7j83iejTQsk8Q==} @@ -3579,6 +3607,9 @@ packages: resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} engines: {node: '>=16'} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} @@ -3606,6 +3637,12 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + lit-element@4.2.1: resolution: {integrity: sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==} @@ -3615,46 +3652,16 @@ packages: lit@3.3.1: resolution: {integrity: sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==} + lit@3.3.2: + resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - lodash._baseassign@3.2.0: - resolution: {integrity: sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=} - - lodash._basecopy@3.0.1: - resolution: {integrity: sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=} - - lodash._bindcallback@3.0.1: - resolution: {integrity: sha1-5THCdkTPi1epnhftlbNcdIeJOS4=} - - lodash._createassigner@3.1.1: - resolution: {integrity: sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=} - - lodash._getnative@3.9.1: - resolution: {integrity: sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=} - - lodash._isiterateecall@3.0.9: - resolution: {integrity: sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=} - - lodash.assign@3.2.0: - resolution: {integrity: sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=} - lodash.clonedeep@4.5.0: resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} - lodash.isarguments@3.1.0: - resolution: {integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=} - - lodash.isarray@3.0.4: - resolution: {integrity: sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=} - - lodash.keys@3.1.2: - resolution: {integrity: sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=} - - lodash.restparam@3.6.1: - resolution: {integrity: sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -3673,6 +3680,9 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + lucide@0.564.0: + resolution: {integrity: sha512-FasyXKHWon773WIl3HeCQpd5xS6E0aLjqxiQStlHNKktni+HDncc1sqY+6vRUbCfmDsIaKQz43EEQLAUDLZO0g==} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -3683,9 +3693,18 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + markdown-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + hasBin: true + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@14.0.0: + resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} + engines: {node: '>= 18'} + hasBin: true + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -3740,6 +3759,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -3876,6 +3898,9 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + mingo@7.2.0: + resolution: {integrity: sha512-UeX942qZpofn5L97h295SkS7j/ADf7Qac8gdRCMBPxi0/1m70aeB2owLFvWbyuMj1dowonlivlVRQVDx+6h+7Q==} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -3907,6 +3932,9 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + monaco-editor@0.55.1: + resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==} + mongodb-connection-string-url@2.6.0: resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} @@ -3964,10 +3992,6 @@ packages: engines: {node: ^14 || ^16 || >=18} hasBin: true - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -3991,14 +4015,10 @@ packages: resolution: {integrity: sha512-ff4jKqMI8Xl50/4Mms/9jPobzAV/UK+kXG2XJ/7AqOmxIx8mqfqTIHYxuAnEgJ2AQeBbLnlbmZ5+38Y9A0w/YA==} engines: {node: '>=12'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} engines: {node: '>=14.16'} - object-assign@4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} - engines: {node: '>=0.10.0'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -4011,6 +4031,10 @@ packages: resolution: {integrity: sha512-szyd0ou0T8nsAqHtprRcP3WidfsN1TnAR5yWXf2mFCEr5ek3LEOkT6EZ/92Xfs74HIdyhG5WkGxIssMU0jBaeg==} engines: {node: '>=16'} + oblivious-set@2.0.0: + resolution: {integrity: sha512-QOUH5Xrsced9fKXaQTjWoDGKeS/Or7E2jB0FN63N4mkAO4qJdB7WR7e6qWAOHM5nk25FJ8TGjhP7DH4l6vFVLg==} + engines: {node: '>=16'} + observable-fns@0.6.1: resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} @@ -4028,8 +4052,8 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openai@6.16.0: - resolution: {integrity: sha512-fZ1uBqjFUjXzbGc35fFtYKEOxd20kd9fDpFeqWtsOZWiubY8CZ1NAlXHW3iathaFvqmNtCWMIsosCuyeI7Joxg==} + openai@6.26.0: + resolution: {integrity: sha512-zd23dbWTjiJ6sSAX6s0HrCZi41JwTA1bQVs0wLQPZ2/5o2gxOJA5wh7yOAUgwYybfhDXyhwlpeQf7Mlgx8EOCA==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -4040,6 +4064,9 @@ packages: zod: optional: true + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + os-tmpdir@1.0.2: resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} engines: {node: '>=0.10.0'} @@ -4142,10 +4169,6 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} @@ -4158,6 +4181,16 @@ packages: hasBin: true bundledDependencies: [] + pdf2json@4.0.2: + resolution: {integrity: sha512-iiRSuRmLihoEJ4YGkoqSq3/r4MR0OmkMTYDda0Pq7DAWqJwMylTilXu46T16gfS3DUp3fhiVuz7NtRMbk3uBhw==} + engines: {node: '>=20.18.0'} + hasBin: true + bundledDependencies: [] + + pdfjs-dist@4.10.38: + resolution: {integrity: sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==} + engines: {node: '>=20'} + peek-readable@4.1.0: resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} engines: {node: '>=8'} @@ -4208,6 +4241,10 @@ packages: resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + process@0.11.10: resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=} engines: {node: '>= 0.6.0'} @@ -4219,6 +4256,64 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + prosemirror-changeset@2.4.0: + resolution: {integrity: sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.4.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + + prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + prosemirror-markdown@1.13.4: + resolution: {integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==} + + prosemirror-menu@1.3.0: + resolution: {integrity: sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==} + + prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + + prosemirror-tables@1.8.5: + resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.11.0: + resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} + + prosemirror-view@1.41.6: + resolution: {integrity: sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==} + proto-list@1.2.4: resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} @@ -4233,13 +4328,13 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - public-ip@7.0.1: - resolution: {integrity: sha512-DdNcqcIbI0wEeCBcqX+bmZpUCvrDMJHXE553zgyG1MZ8S1a/iCCxmK9iTjjql+SpHSv4cZkmRv5/zGYW93AlCw==} - engines: {node: '>=18'} - pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@1.4.1: resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} @@ -4267,6 +4362,10 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} + qs@6.15.0: + resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} + engines: {node: '>=0.6'} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -4283,6 +4382,10 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4299,9 +4402,9 @@ packages: resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} engines: {node: '>=8'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -4309,8 +4412,8 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - registry-auth-token@5.1.0: - resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} engines: {node: '>=14'} registry-url@6.0.1: @@ -4367,6 +4470,9 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -4391,21 +4497,16 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + send@1.2.0: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} @@ -4467,21 +4568,6 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socket.io-adapter@2.5.5: - resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} - - socket.io-client@4.8.1: - resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} - engines: {node: '>=10.0.0'} - - socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - - socket.io@4.8.1: - resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} - engines: {node: '>=10.2.0'} - socks-proxy-agent@8.0.5: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} @@ -4521,6 +4607,9 @@ packages: streamx@2.22.0: resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4551,9 +4640,6 @@ packages: resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} engines: {node: '>=0.10.0'} - strnum@1.1.1: - resolution: {integrity: sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==} - strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} @@ -4572,10 +4658,6 @@ packages: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} - super-regex@0.2.0: - resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==} - engines: {node: '>=14.16'} - sweet-scroll@4.0.0: resolution: {integrity: sha512-mR6fRsAQANtm3zpzhUE73KAOt2aT4ZsWzNSggiEsSqdO6Zh4gM7ioJG81EngrZEl0XAc3ZvzEfhxggOoEBc8jA==} @@ -4588,34 +4670,30 @@ packages: os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true - systeminformation@5.27.7: - resolution: {integrity: sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==} - engines: {node: '>=8.0.0'} - os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] - hasBin: true - tar-fs@3.0.8: resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar-stream@3.1.8: + resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + threads@1.7.0: resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - through@2.3.8: - resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} - - time-span@5.1.0: - resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} - engines: {node: '>=12'} - tiny-worker@2.3.0: resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} @@ -4638,6 +4716,10 @@ packages: resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} engines: {node: '>=14.16'} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + tr46@3.0.0: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} @@ -4688,10 +4770,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.35.0: - resolution: {integrity: sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==} - engines: {node: '>=16'} - type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -4708,6 +4786,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -4724,8 +4805,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -4783,6 +4864,9 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -4809,6 +4893,11 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -4824,30 +4913,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - 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 - - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - 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 - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -4860,6 +4925,18 @@ packages: utf-8-validate: optional: true + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + 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==} @@ -4871,9 +4948,13 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - xmlhttprequest-ssl@2.1.2: - resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} - engines: {node: '>=0.4.0'} + xterm-addon-fit@0.8.0: + resolution: {integrity: sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==} + peerDependencies: + xterm: ^5.0.0 + + xterm@5.3.0: + resolution: {integrity: sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -4907,14 +4988,6 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} - peerDependencies: - zod: ^3.25 || ^4 - - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -4923,7 +4996,74 @@ packages: snapshots: - '@anthropic-ai/sdk@0.71.2(zod@3.25.76)': + '@ai-sdk/anthropic@3.0.58(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/gateway@3.0.66(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + '@vercel/oidc': 3.1.0 + zod: 3.25.76 + + '@ai-sdk/google@3.0.43(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/groq@3.0.29(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/mistral@3.0.24(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/openai-compatible@2.0.35(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/openai@3.0.41(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/perplexity@3.0.23(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/provider-utils@4.0.19(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 3.0.8 + '@standard-schema/spec': 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + '@ai-sdk/provider@3.0.8': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/xai@3.0.67(zod@3.25.76)': + dependencies: + '@ai-sdk/openai-compatible': 2.0.35(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + zod: 3.25.76 + + '@anthropic-ai/sdk@0.78.0(zod@3.25.76)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: @@ -4945,21 +5085,34 @@ snapshots: '@push.rocks/webrequest': 3.0.37 '@push.rocks/webstream': 1.0.10 - '@api.global/typedserver@3.0.80': + '@api.global/typedrequest@3.3.0': dependencies: - '@api.global/typedrequest': 3.1.10 '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedsocket': 3.0.1 - '@cloudflare/workers-types': 4.20251008.0 - '@design.estate/dees-comms': 1.0.27 - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartchok': 1.1.1 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartbuffer': 3.0.5 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartguard': 3.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webrequest': 4.0.5 + '@push.rocks/webstream': 1.0.10 + + '@api.global/typedserver@8.4.2(@tiptap/pm@2.27.2)': + dependencies: + '@api.global/typedrequest': 3.3.0 + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedsocket': 4.1.2(@push.rocks/smartserve@2.0.1) + '@cloudflare/workers-types': 4.20260305.0 + '@design.estate/dees-catalog': 3.43.3(@tiptap/pm@2.27.2) + '@design.estate/dees-comms': 1.0.30 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 6.0.0 '@push.rocks/smartfeed': 1.4.0 - '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.3.1 '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartlog-destination-devtools': 1.0.12 '@push.rocks/smartlog-interfaces': 3.0.2 '@push.rocks/smartmanifest': 2.0.2 @@ -4969,46 +5122,39 @@ snapshots: '@push.rocks/smartopen': 2.0.0 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.3.1 + '@push.rocks/smartrequest': 5.0.1 '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartserve': 2.0.1 '@push.rocks/smartsitemap': 2.0.4 '@push.rocks/smartstream': 3.2.5 - '@push.rocks/smarttime': 4.1.1 - '@push.rocks/taskbuffer': 3.4.0 - '@push.rocks/webrequest': 3.0.37 + '@push.rocks/smarttime': 4.2.3 + '@push.rocks/smartwatch': 6.3.0 + '@push.rocks/taskbuffer': 3.5.0 + '@push.rocks/webrequest': 4.0.1 '@push.rocks/webstore': 2.0.20 '@tsclass/tsclass': 9.3.0 - '@types/express': 5.0.6 - body-parser: 2.2.0 - cors: 2.8.5 - express: 5.1.0 - express-force-ssl: 0.3.2 lit: 3.3.1 transitivePeerDependencies: - '@nuxt/kit' + - '@tiptap/pm' - bufferutil - react - supports-color - utf-8-validate - vue - '@api.global/typedsocket@3.0.1': + '@api.global/typedsocket@4.1.2(@push.rocks/smartserve@2.0.1)': dependencies: - '@api.global/typedrequest': 3.1.10 + '@api.global/typedrequest': 3.3.0 '@api.global/typedrequest-interfaces': 3.0.19 '@push.rocks/isohash': 2.0.1 + '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartsocket': 2.1.0 + '@push.rocks/smartserve': 2.0.1 '@push.rocks/smartstring': 4.1.0 '@push.rocks/smarturl': 3.1.0 - transitivePeerDependencies: - - '@nuxt/kit' - - bufferutil - - react - - supports-color - - utf-8-validate - - vue '@aws-crypto/crc32@5.2.0': dependencies: @@ -5072,97 +5218,36 @@ 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.3.0 - '@smithy/core': 3.15.0 - '@smithy/fetch-http-handler': 5.3.1 - '@smithy/hash-node': 4.2.0 - '@smithy/invalid-dependency': 4.2.0 - '@smithy/middleware-content-length': 4.2.0 - '@smithy/middleware-endpoint': 4.3.1 - '@smithy/middleware-retry': 4.4.1 - '@smithy/middleware-serde': 4.2.0 - '@smithy/middleware-stack': 4.2.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/node-http-handler': 4.3.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/smithy-client': 4.7.1 - '@smithy/types': 4.6.0 - '@smithy/url-parser': 4.2.0 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.20.7 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.8 + '@smithy/middleware-retry': 4.4.24 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.10.9 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.0 - '@smithy/util-defaults-mode-node': 4.2.1 - '@smithy/util-endpoints': 3.2.0 - '@smithy/util-middleware': 4.2.0 - '@smithy/util-retry': 4.2.0 + '@smithy/util-defaults-mode-browser': 4.3.23 + '@smithy/util-defaults-mode-node': 4.2.26 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt optional: true - '@aws-sdk/client-s3@3.750.0': - dependencies: - '@aws-crypto/sha1-browser': 5.2.0 - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.750.0 - '@aws-sdk/credential-provider-node': 3.750.0 - '@aws-sdk/middleware-bucket-endpoint': 3.734.0 - '@aws-sdk/middleware-expect-continue': 3.734.0 - '@aws-sdk/middleware-flexible-checksums': 3.750.0 - '@aws-sdk/middleware-host-header': 3.734.0 - '@aws-sdk/middleware-location-constraint': 3.734.0 - '@aws-sdk/middleware-logger': 3.734.0 - '@aws-sdk/middleware-recursion-detection': 3.734.0 - '@aws-sdk/middleware-sdk-s3': 3.750.0 - '@aws-sdk/middleware-ssec': 3.734.0 - '@aws-sdk/middleware-user-agent': 3.750.0 - '@aws-sdk/region-config-resolver': 3.734.0 - '@aws-sdk/signature-v4-multi-region': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@aws-sdk/util-user-agent-browser': 3.734.0 - '@aws-sdk/util-user-agent-node': 3.750.0 - '@aws-sdk/xml-builder': 3.734.0 - '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.5 - '@smithy/eventstream-serde-browser': 4.0.1 - '@smithy/eventstream-serde-config-resolver': 4.0.1 - '@smithy/eventstream-serde-node': 4.0.1 - '@smithy/fetch-http-handler': 5.0.1 - '@smithy/hash-blob-browser': 4.0.1 - '@smithy/hash-node': 4.0.1 - '@smithy/hash-stream-node': 4.0.1 - '@smithy/invalid-dependency': 4.0.1 - '@smithy/md5-js': 4.0.1 - '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/middleware-retry': 4.0.7 - '@smithy/middleware-serde': 4.0.2 - '@smithy/middleware-stack': 4.0.1 - '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.3 - '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - '@smithy/url-parser': 4.0.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.7 - '@smithy/util-defaults-mode-node': 4.0.7 - '@smithy/util-endpoints': 3.0.1 - '@smithy/util-middleware': 4.0.1 - '@smithy/util-retry': 4.0.1 - '@smithy/util-stream': 4.1.2 - '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.2 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-s3@3.906.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 @@ -5225,40 +5310,25 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.971.0': + '@aws-sdk/client-sso@3.808.0': dependencies: - '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.970.0 - '@aws-sdk/credential-provider-node': 3.971.0 - '@aws-sdk/middleware-bucket-endpoint': 3.969.0 - '@aws-sdk/middleware-expect-continue': 3.969.0 - '@aws-sdk/middleware-flexible-checksums': 3.971.0 - '@aws-sdk/middleware-host-header': 3.969.0 - '@aws-sdk/middleware-location-constraint': 3.969.0 - '@aws-sdk/middleware-logger': 3.969.0 - '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-sdk-s3': 3.970.0 - '@aws-sdk/middleware-ssec': 3.971.0 - '@aws-sdk/middleware-user-agent': 3.970.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/signature-v4-multi-region': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.970.0 - '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.971.0 + '@aws-sdk/core': 3.808.0 + '@aws-sdk/middleware-host-header': 3.804.0 + '@aws-sdk/middleware-logger': 3.804.0 + '@aws-sdk/middleware-recursion-detection': 3.804.0 + '@aws-sdk/middleware-user-agent': 3.808.0 + '@aws-sdk/region-config-resolver': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@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.6 '@smithy/core': 3.20.7 - '@smithy/eventstream-serde-browser': 4.2.8 - '@smithy/eventstream-serde-config-resolver': 4.3.8 - '@smithy/eventstream-serde-node': 4.2.8 '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-blob-browser': 4.2.9 '@smithy/hash-node': 4.2.8 - '@smithy/hash-stream-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 - '@smithy/md5-js': 4.2.8 '@smithy/middleware-content-length': 4.2.8 '@smithy/middleware-endpoint': 4.4.8 '@smithy/middleware-retry': 4.4.24 @@ -5278,94 +5348,6 @@ snapshots: '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.8 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.750.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.750.0 - '@aws-sdk/middleware-host-header': 3.734.0 - '@aws-sdk/middleware-logger': 3.734.0 - '@aws-sdk/middleware-recursion-detection': 3.734.0 - '@aws-sdk/middleware-user-agent': 3.750.0 - '@aws-sdk/region-config-resolver': 3.734.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@aws-sdk/util-user-agent-browser': 3.734.0 - '@aws-sdk/util-user-agent-node': 3.750.0 - '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.5 - '@smithy/fetch-http-handler': 5.0.1 - '@smithy/hash-node': 4.0.1 - '@smithy/invalid-dependency': 4.0.1 - '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/middleware-retry': 4.0.7 - '@smithy/middleware-serde': 4.0.2 - '@smithy/middleware-stack': 4.0.1 - '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.3 - '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - '@smithy/url-parser': 4.0.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.7 - '@smithy/util-defaults-mode-node': 4.0.7 - '@smithy/util-endpoints': 3.0.1 - '@smithy/util-middleware': 4.0.1 - '@smithy/util-retry': 4.0.1 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.808.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.808.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.808.0 - '@aws-sdk/region-config-resolver': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@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.3.0 - '@smithy/core': 3.15.0 - '@smithy/fetch-http-handler': 5.3.1 - '@smithy/hash-node': 4.2.0 - '@smithy/invalid-dependency': 4.2.0 - '@smithy/middleware-content-length': 4.2.0 - '@smithy/middleware-endpoint': 4.3.1 - '@smithy/middleware-retry': 4.4.1 - '@smithy/middleware-serde': 4.2.0 - '@smithy/middleware-stack': 4.2.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/node-http-handler': 4.3.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/smithy-client': 4.7.1 - '@smithy/types': 4.6.0 - '@smithy/url-parser': 4.2.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.0 - '@smithy/util-defaults-mode-node': 4.2.1 - '@smithy/util-endpoints': 3.2.0 - '@smithy/util-middleware': 4.2.0 - '@smithy/util-retry': 4.2.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -5415,20 +5397,400 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.971.0': + '@aws-sdk/core@3.808.0': + dependencies: + '@aws-sdk/types': 3.804.0 + '@smithy/core': 3.20.7 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.10.9 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + fast-xml-parser: 4.4.1 + tslib: 2.8.1 + optional: true + + '@aws-sdk/core@3.906.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws-sdk/xml-builder': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-cognito-identity@3.808.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/credential-provider-env@3.808.0': + dependencies: + '@aws-sdk/core': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + optional: true + + '@aws-sdk/credential-provider-env@3.906.0': + dependencies: + '@aws-sdk/core': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.808.0': + dependencies: + '@aws-sdk/core': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.10.9 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.10 + tslib: 2.8.1 + optional: true + + '@aws-sdk/credential-provider-http@3.906.0': + dependencies: + '@aws-sdk/core': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.808.0': + dependencies: + '@aws-sdk/core': 3.808.0 + '@aws-sdk/credential-provider-env': 3.808.0 + '@aws-sdk/credential-provider-http': 3.808.0 + '@aws-sdk/credential-provider-process': 3.808.0 + '@aws-sdk/credential-provider-sso': 3.808.0 + '@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.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/credential-provider-ini@3.906.0': + dependencies: + '@aws-sdk/core': 3.906.0 + '@aws-sdk/credential-provider-env': 3.906.0 + '@aws-sdk/credential-provider-http': 3.906.0 + '@aws-sdk/credential-provider-process': 3.906.0 + '@aws-sdk/credential-provider-sso': 3.906.0 + '@aws-sdk/credential-provider-web-identity': 3.906.0 + '@aws-sdk/nested-clients': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.808.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.808.0 + '@aws-sdk/credential-provider-http': 3.808.0 + '@aws-sdk/credential-provider-ini': 3.808.0 + '@aws-sdk/credential-provider-process': 3.808.0 + '@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.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/credential-provider-node@3.906.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.906.0 + '@aws-sdk/credential-provider-http': 3.906.0 + '@aws-sdk/credential-provider-ini': 3.906.0 + '@aws-sdk/credential-provider-process': 3.906.0 + '@aws-sdk/credential-provider-sso': 3.906.0 + '@aws-sdk/credential-provider-web-identity': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.808.0': + dependencies: + '@aws-sdk/core': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + optional: true + + '@aws-sdk/credential-provider-process@3.906.0': + dependencies: + '@aws-sdk/core': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.808.0': + dependencies: + '@aws-sdk/client-sso': 3.808.0 + '@aws-sdk/core': 3.808.0 + '@aws-sdk/token-providers': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/credential-provider-sso@3.906.0': + dependencies: + '@aws-sdk/client-sso': 3.906.0 + '@aws-sdk/core': 3.906.0 + '@aws-sdk/token-providers': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.808.0': + dependencies: + '@aws-sdk/core': 3.808.0 + '@aws-sdk/nested-clients': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/credential-provider-web-identity@3.906.0': + dependencies: + '@aws-sdk/core': 3.906.0 + '@aws-sdk/nested-clients': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-providers@3.808.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.808.0 + '@aws-sdk/core': 3.808.0 + '@aws-sdk/credential-provider-cognito-identity': 3.808.0 + '@aws-sdk/credential-provider-env': 3.808.0 + '@aws-sdk/credential-provider-http': 3.808.0 + '@aws-sdk/credential-provider-ini': 3.808.0 + '@aws-sdk/credential-provider-node': 3.808.0 + '@aws-sdk/credential-provider-process': 3.808.0 + '@aws-sdk/credential-provider-sso': 3.808.0 + '@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.6 + '@smithy/core': 3.20.7 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + optional: true + + '@aws-sdk/middleware-bucket-endpoint@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-expect-continue@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.906.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.804.0': + dependencies: + '@aws-sdk/types': 3.804.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + optional: true + + '@aws-sdk/middleware-host-header@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.804.0': + dependencies: + '@aws-sdk/types': 3.804.0 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + optional: true + + '@aws-sdk/middleware-logger@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.804.0': + dependencies: + '@aws-sdk/types': 3.804.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + optional: true + + '@aws-sdk/middleware-recursion-detection@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws/lambda-invoke-store': 0.0.1 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.906.0': + dependencies: + '@aws-sdk/core': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.808.0': + dependencies: + '@aws-sdk/core': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@aws-sdk/util-endpoints': 3.808.0 + '@smithy/core': 3.20.7 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + optional: true + + '@aws-sdk/middleware-user-agent@3.906.0': + dependencies: + '@aws-sdk/core': 3.906.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.808.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.970.0 - '@aws-sdk/middleware-host-header': 3.969.0 - '@aws-sdk/middleware-logger': 3.969.0 - '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-user-agent': 3.970.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.970.0 - '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.971.0 + '@aws-sdk/core': 3.808.0 + '@aws-sdk/middleware-host-header': 3.804.0 + '@aws-sdk/middleware-logger': 3.804.0 + '@aws-sdk/middleware-recursion-detection': 3.804.0 + '@aws-sdk/middleware-user-agent': 3.808.0 + '@aws-sdk/region-config-resolver': 3.808.0 + '@aws-sdk/types': 3.804.0 + '@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.6 '@smithy/core': 3.20.7 '@smithy/fetch-http-handler': 5.3.9 @@ -5457,886 +5819,6 @@ snapshots: tslib: 2.8.1 transitivePeerDependencies: - aws-crt - - '@aws-sdk/core@3.750.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/core': 3.1.5 - '@smithy/node-config-provider': 4.0.1 - '@smithy/property-provider': 4.0.1 - '@smithy/protocol-http': 5.0.1 - '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - '@smithy/util-middleware': 4.0.1 - fast-xml-parser: 4.4.1 - tslib: 2.8.1 - - '@aws-sdk/core@3.808.0': - dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/core': 3.15.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/property-provider': 4.2.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/signature-v4': 5.3.0 - '@smithy/smithy-client': 4.7.1 - '@smithy/types': 4.6.0 - '@smithy/util-middleware': 4.2.0 - fast-xml-parser: 4.4.1 - tslib: 2.8.1 - optional: true - - '@aws-sdk/core@3.906.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@aws-sdk/xml-builder': 3.901.0 - '@smithy/core': 3.15.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/property-provider': 4.2.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/signature-v4': 5.3.0 - '@smithy/smithy-client': 4.7.1 - '@smithy/types': 4.6.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/core@3.970.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@aws-sdk/xml-builder': 3.969.0 - '@smithy/core': 3.20.7 - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.9 - '@smithy/types': 4.12.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/crc64-nvme@3.969.0': - dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-cognito-identity@3.808.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/credential-provider-env@3.750.0': - dependencies: - '@aws-sdk/core': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/property-provider': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.808.0': - dependencies: - '@aws-sdk/core': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - optional: true - - '@aws-sdk/credential-provider-env@3.906.0': - dependencies: - '@aws-sdk/core': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@smithy/property-provider': 4.2.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.970.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@smithy/property-provider': 4.2.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.750.0': - dependencies: - '@aws-sdk/core': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/fetch-http-handler': 5.0.1 - '@smithy/node-http-handler': 4.0.3 - '@smithy/property-provider': 4.0.1 - '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - '@smithy/util-stream': 4.1.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.808.0': - dependencies: - '@aws-sdk/core': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@smithy/fetch-http-handler': 5.3.1 - '@smithy/node-http-handler': 4.3.0 - '@smithy/property-provider': 4.2.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/smithy-client': 4.7.1 - '@smithy/types': 4.6.0 - '@smithy/util-stream': 4.5.0 - tslib: 2.8.1 - optional: true - - '@aws-sdk/credential-provider-http@3.906.0': - dependencies: - '@aws-sdk/core': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@smithy/fetch-http-handler': 5.3.1 - '@smithy/node-http-handler': 4.3.0 - '@smithy/property-provider': 4.2.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/smithy-client': 4.7.1 - '@smithy/types': 4.6.0 - '@smithy/util-stream': 4.5.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.970.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/node-http-handler': 4.4.8 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.9 - '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.10 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.750.0': - dependencies: - '@aws-sdk/core': 3.750.0 - '@aws-sdk/credential-provider-env': 3.750.0 - '@aws-sdk/credential-provider-http': 3.750.0 - '@aws-sdk/credential-provider-process': 3.750.0 - '@aws-sdk/credential-provider-sso': 3.750.0 - '@aws-sdk/credential-provider-web-identity': 3.750.0 - '@aws-sdk/nested-clients': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/credential-provider-imds': 4.0.1 - '@smithy/property-provider': 4.0.1 - '@smithy/shared-ini-file-loader': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-ini@3.808.0': - dependencies: - '@aws-sdk/core': 3.808.0 - '@aws-sdk/credential-provider-env': 3.808.0 - '@aws-sdk/credential-provider-http': 3.808.0 - '@aws-sdk/credential-provider-process': 3.808.0 - '@aws-sdk/credential-provider-sso': 3.808.0 - '@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.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/credential-provider-ini@3.906.0': - dependencies: - '@aws-sdk/core': 3.906.0 - '@aws-sdk/credential-provider-env': 3.906.0 - '@aws-sdk/credential-provider-http': 3.906.0 - '@aws-sdk/credential-provider-process': 3.906.0 - '@aws-sdk/credential-provider-sso': 3.906.0 - '@aws-sdk/credential-provider-web-identity': 3.906.0 - '@aws-sdk/nested-clients': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@smithy/credential-provider-imds': 4.2.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-ini@3.971.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/credential-provider-env': 3.970.0 - '@aws-sdk/credential-provider-http': 3.970.0 - '@aws-sdk/credential-provider-login': 3.971.0 - '@aws-sdk/credential-provider-process': 3.970.0 - '@aws-sdk/credential-provider-sso': 3.971.0 - '@aws-sdk/credential-provider-web-identity': 3.971.0 - '@aws-sdk/nested-clients': 3.971.0 - '@aws-sdk/types': 3.969.0 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-login@3.971.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/nested-clients': 3.971.0 - '@aws-sdk/types': 3.969.0 - '@smithy/property-provider': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.750.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.750.0 - '@aws-sdk/credential-provider-http': 3.750.0 - '@aws-sdk/credential-provider-ini': 3.750.0 - '@aws-sdk/credential-provider-process': 3.750.0 - '@aws-sdk/credential-provider-sso': 3.750.0 - '@aws-sdk/credential-provider-web-identity': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/credential-provider-imds': 4.0.1 - '@smithy/property-provider': 4.0.1 - '@smithy/shared-ini-file-loader': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.808.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.808.0 - '@aws-sdk/credential-provider-http': 3.808.0 - '@aws-sdk/credential-provider-ini': 3.808.0 - '@aws-sdk/credential-provider-process': 3.808.0 - '@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.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/credential-provider-node@3.906.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.906.0 - '@aws-sdk/credential-provider-http': 3.906.0 - '@aws-sdk/credential-provider-ini': 3.906.0 - '@aws-sdk/credential-provider-process': 3.906.0 - '@aws-sdk/credential-provider-sso': 3.906.0 - '@aws-sdk/credential-provider-web-identity': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@smithy/credential-provider-imds': 4.2.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.971.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.970.0 - '@aws-sdk/credential-provider-http': 3.970.0 - '@aws-sdk/credential-provider-ini': 3.971.0 - '@aws-sdk/credential-provider-process': 3.970.0 - '@aws-sdk/credential-provider-sso': 3.971.0 - '@aws-sdk/credential-provider-web-identity': 3.971.0 - '@aws-sdk/types': 3.969.0 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-process@3.750.0': - dependencies: - '@aws-sdk/core': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/property-provider': 4.0.1 - '@smithy/shared-ini-file-loader': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-process@3.808.0': - dependencies: - '@aws-sdk/core': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - optional: true - - '@aws-sdk/credential-provider-process@3.906.0': - dependencies: - '@aws-sdk/core': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-process@3.970.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.750.0': - dependencies: - '@aws-sdk/client-sso': 3.750.0 - '@aws-sdk/core': 3.750.0 - '@aws-sdk/token-providers': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/property-provider': 4.0.1 - '@smithy/shared-ini-file-loader': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-sso@3.808.0': - dependencies: - '@aws-sdk/client-sso': 3.808.0 - '@aws-sdk/core': 3.808.0 - '@aws-sdk/token-providers': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/credential-provider-sso@3.906.0': - dependencies: - '@aws-sdk/client-sso': 3.906.0 - '@aws-sdk/core': 3.906.0 - '@aws-sdk/token-providers': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-sso@3.971.0': - dependencies: - '@aws-sdk/client-sso': 3.971.0 - '@aws-sdk/core': 3.970.0 - '@aws-sdk/token-providers': 3.971.0 - '@aws-sdk/types': 3.969.0 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-web-identity@3.750.0': - dependencies: - '@aws-sdk/core': 3.750.0 - '@aws-sdk/nested-clients': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/property-provider': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-web-identity@3.808.0': - dependencies: - '@aws-sdk/core': 3.808.0 - '@aws-sdk/nested-clients': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/credential-provider-web-identity@3.906.0': - dependencies: - '@aws-sdk/core': 3.906.0 - '@aws-sdk/nested-clients': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-web-identity@3.971.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/nested-clients': 3.971.0 - '@aws-sdk/types': 3.969.0 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-providers@3.808.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.808.0 - '@aws-sdk/core': 3.808.0 - '@aws-sdk/credential-provider-cognito-identity': 3.808.0 - '@aws-sdk/credential-provider-env': 3.808.0 - '@aws-sdk/credential-provider-http': 3.808.0 - '@aws-sdk/credential-provider-ini': 3.808.0 - '@aws-sdk/credential-provider-node': 3.808.0 - '@aws-sdk/credential-provider-process': 3.808.0 - '@aws-sdk/credential-provider-sso': 3.808.0 - '@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.3.0 - '@smithy/core': 3.15.0 - '@smithy/credential-provider-imds': 4.2.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/property-provider': 4.2.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - optional: true - - '@aws-sdk/middleware-bucket-endpoint@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-arn-parser': 3.723.0 - '@smithy/node-config-provider': 4.0.1 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - '@smithy/util-config-provider': 4.0.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-bucket-endpoint@3.901.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - '@smithy/util-config-provider': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-bucket-endpoint@3.969.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-arn-parser': 3.968.0 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-expect-continue@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-expect-continue@3.901.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-expect-continue@3.969.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-flexible-checksums@3.750.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/is-array-buffer': 4.0.0 - '@smithy/node-config-provider': 4.0.1 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.1.2 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-flexible-checksums@3.906.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@smithy/is-array-buffer': 4.2.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - '@smithy/util-middleware': 4.2.0 - '@smithy/util-stream': 4.5.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-flexible-checksums@3.971.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.970.0 - '@aws-sdk/crc64-nvme': 3.969.0 - '@aws-sdk/types': 3.969.0 - '@smithy/is-array-buffer': 4.2.0 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.804.0': - dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-host-header@3.901.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.969.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-location-constraint@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-location-constraint@3.901.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-location-constraint@3.969.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.804.0': - dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-logger@3.901.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.969.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.804.0': - dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-recursion-detection@3.901.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@aws/lambda-invoke-store': 0.0.1 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.969.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@aws/lambda-invoke-store': 0.2.3 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.750.0': - dependencies: - '@aws-sdk/core': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-arn-parser': 3.723.0 - '@smithy/core': 3.1.5 - '@smithy/node-config-provider': 4.0.1 - '@smithy/protocol-http': 5.0.1 - '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.1.2 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.906.0': - dependencies: - '@aws-sdk/core': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/core': 3.15.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/signature-v4': 5.3.0 - '@smithy/smithy-client': 4.7.1 - '@smithy/types': 4.6.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.0 - '@smithy/util-stream': 4.5.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.970.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-arn-parser': 3.968.0 - '@smithy/core': 3.20.7 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.9 - '@smithy/types': 4.12.0 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-ssec@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-ssec@3.901.0': - dependencies: - '@aws-sdk/types': 3.901.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-ssec@3.971.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.750.0': - dependencies: - '@aws-sdk/core': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@smithy/core': 3.1.5 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.808.0': - dependencies: - '@aws-sdk/core': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.808.0 - '@smithy/core': 3.15.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - optional: true - - '@aws-sdk/middleware-user-agent@3.906.0': - dependencies: - '@aws-sdk/core': 3.906.0 - '@aws-sdk/types': 3.901.0 - '@aws-sdk/util-endpoints': 3.901.0 - '@smithy/core': 3.15.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/types': 4.6.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.970.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.970.0 - '@smithy/core': 3.20.7 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/nested-clients@3.750.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.750.0 - '@aws-sdk/middleware-host-header': 3.734.0 - '@aws-sdk/middleware-logger': 3.734.0 - '@aws-sdk/middleware-recursion-detection': 3.734.0 - '@aws-sdk/middleware-user-agent': 3.750.0 - '@aws-sdk/region-config-resolver': 3.734.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@aws-sdk/util-user-agent-browser': 3.734.0 - '@aws-sdk/util-user-agent-node': 3.750.0 - '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.5 - '@smithy/fetch-http-handler': 5.0.1 - '@smithy/hash-node': 4.0.1 - '@smithy/invalid-dependency': 4.0.1 - '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/middleware-retry': 4.0.7 - '@smithy/middleware-serde': 4.0.2 - '@smithy/middleware-stack': 4.0.1 - '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.3 - '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - '@smithy/url-parser': 4.0.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.7 - '@smithy/util-defaults-mode-node': 4.0.7 - '@smithy/util-endpoints': 3.0.1 - '@smithy/util-middleware': 4.0.1 - '@smithy/util-retry': 4.0.1 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/nested-clients@3.808.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.808.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.808.0 - '@aws-sdk/region-config-resolver': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@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.3.0 - '@smithy/core': 3.15.0 - '@smithy/fetch-http-handler': 5.3.1 - '@smithy/hash-node': 4.2.0 - '@smithy/invalid-dependency': 4.2.0 - '@smithy/middleware-content-length': 4.2.0 - '@smithy/middleware-endpoint': 4.3.1 - '@smithy/middleware-retry': 4.4.1 - '@smithy/middleware-serde': 4.2.0 - '@smithy/middleware-stack': 4.2.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/node-http-handler': 4.3.0 - '@smithy/protocol-http': 5.3.0 - '@smithy/smithy-client': 4.7.1 - '@smithy/types': 4.6.0 - '@smithy/url-parser': 4.2.0 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.0 - '@smithy/util-defaults-mode-node': 4.2.1 - '@smithy/util-endpoints': 3.2.0 - '@smithy/util-middleware': 4.2.0 - '@smithy/util-retry': 4.2.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt optional: true '@aws-sdk/nested-clients@3.906.0': @@ -6382,65 +5864,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/nested-clients@3.971.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.970.0 - '@aws-sdk/middleware-host-header': 3.969.0 - '@aws-sdk/middleware-logger': 3.969.0 - '@aws-sdk/middleware-recursion-detection': 3.969.0 - '@aws-sdk/middleware-user-agent': 3.970.0 - '@aws-sdk/region-config-resolver': 3.969.0 - '@aws-sdk/types': 3.969.0 - '@aws-sdk/util-endpoints': 3.970.0 - '@aws-sdk/util-user-agent-browser': 3.969.0 - '@aws-sdk/util-user-agent-node': 3.971.0 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.7 - '@smithy/fetch-http-handler': 5.3.9 - '@smithy/hash-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.8 - '@smithy/middleware-retry': 4.4.24 - '@smithy/middleware-serde': 4.2.9 - '@smithy/middleware-stack': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/node-http-handler': 4.4.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.9 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-base64': 4.3.0 - '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.23 - '@smithy/util-defaults-mode-node': 4.2.26 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-retry': 4.2.8 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/region-config-resolver@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/node-config-provider': 4.0.1 - '@smithy/types': 4.1.0 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.1 - tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.808.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/types': 4.6.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.0 + '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 optional: true @@ -6453,23 +5883,6 @@ snapshots: '@smithy/util-middleware': 4.2.0 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.969.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/config-resolver': 4.4.6 - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/signature-v4-multi-region@3.750.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/protocol-http': 5.0.1 - '@smithy/signature-v4': 5.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.906.0': dependencies: '@aws-sdk/middleware-sdk-s3': 3.906.0 @@ -6479,33 +5892,13 @@ snapshots: '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.970.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.750.0': - dependencies: - '@aws-sdk/nested-clients': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/property-provider': 4.0.1 - '@smithy/shared-ini-file-loader': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/token-providers@3.808.0': dependencies: '@aws-sdk/nested-clients': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.2.0 - '@smithy/shared-ini-file-loader': 4.3.0 - '@smithy/types': 4.6.0 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -6523,18 +5916,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/token-providers@3.971.0': - dependencies: - '@aws-sdk/core': 3.970.0 - '@aws-sdk/nested-clients': 3.971.0 - '@aws-sdk/types': 3.969.0 - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/types@3.734.0': dependencies: '@smithy/types': 4.1.0 @@ -6542,7 +5923,7 @@ snapshots: '@aws-sdk/types@3.804.0': dependencies: - '@smithy/types': 4.6.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 optional: true @@ -6551,35 +5932,15 @@ snapshots: '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/types@3.969.0': - dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/util-arn-parser@3.723.0': - dependencies: - tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.968.0': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.743.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/types': 4.1.0 - '@smithy/util-endpoints': 3.0.1 - tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.808.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.6.0 - '@smithy/util-endpoints': 3.2.0 + '@smithy/types': 4.12.0 + '@smithy/util-endpoints': 3.2.8 tslib: 2.8.1 optional: true @@ -6591,29 +5952,14 @@ snapshots: '@smithy/util-endpoints': 3.2.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.970.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-endpoints': 3.2.8 - tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.723.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.734.0': - dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/types': 4.1.0 - bowser: 2.11.0 - tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.804.0': dependencies: '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.6.0 + '@smithy/types': 4.12.0 bowser: 2.12.1 tslib: 2.8.1 optional: true @@ -6625,27 +5971,12 @@ snapshots: bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.969.0': - dependencies: - '@aws-sdk/types': 3.969.0 - '@smithy/types': 4.12.0 - bowser: 2.12.1 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.750.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.750.0 - '@aws-sdk/types': 3.734.0 - '@smithy/node-config-provider': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.808.0': dependencies: '@aws-sdk/middleware-user-agent': 3.808.0 '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.3.0 - '@smithy/types': 4.6.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 optional: true @@ -6657,35 +5988,14 @@ snapshots: '@smithy/types': 4.6.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.971.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.970.0 - '@aws-sdk/types': 3.969.0 - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.734.0': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@aws-sdk/xml-builder@3.901.0': dependencies: '@smithy/types': 4.6.0 fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.969.0': - dependencies: - '@smithy/types': 4.12.0 - fast-xml-parser: 5.2.5 - tslib: 2.8.1 - '@aws/lambda-invoke-store@0.0.1': {} - '@aws/lambda-invoke-store@0.2.3': {} - '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -6700,14 +6010,55 @@ snapshots: '@babel/runtime@7.28.4': {} + '@babel/runtime@7.28.6': {} + '@borewit/text-codec@0.1.1': {} - '@cloudflare/workers-types@4.20251008.0': {} + '@borewit/text-codec@0.2.1': {} + + '@cfworker/json-schema@4.1.1': {} + + '@cloudflare/workers-types@4.20260305.0': {} '@configvault.io/interfaces@1.0.17': dependencies: '@api.global/typedrequest-interfaces': 3.0.19 + '@design.estate/dees-catalog@3.43.3(@tiptap/pm@2.27.2)': + dependencies: + '@design.estate/dees-domtools': 2.3.8 + '@design.estate/dees-element': 2.1.6 + '@design.estate/dees-wcctools': 3.8.0 + '@fortawesome/fontawesome-svg-core': 7.2.0 + '@fortawesome/free-brands-svg-icons': 7.2.0 + '@fortawesome/free-regular-svg-icons': 7.2.0 + '@fortawesome/free-solid-svg-icons': 7.2.0 + '@push.rocks/smarti18n': 1.0.4 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.1.0 + '@tempfix/webcontainer__api': 1.6.1 + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-link': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-text-align': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-typography': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-underline': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/starter-kit': 2.27.2 + '@tsclass/tsclass': 9.3.0 + apexcharts: 5.10.0 + highlight.js: 11.11.1 + ibantools: 4.5.1 + lucide: 0.564.0 + monaco-editor: 0.55.1 + pdfjs-dist: 4.10.38 + xterm: 5.3.0 + xterm-addon-fit: 0.8.0(xterm@5.3.0) + transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/pm' + - react + - supports-color + - vue + '@design.estate/dees-comms@1.0.27': dependencies: '@api.global/typedrequest': 3.1.10 @@ -6715,6 +6066,13 @@ snapshots: '@push.rocks/smartdelay': 3.0.5 broadcast-channel: 7.1.0 + '@design.estate/dees-comms@1.0.30': + dependencies: + '@api.global/typedrequest': 3.3.0 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/smartdelay': 3.0.5 + broadcast-channel: 7.3.0 + '@design.estate/dees-domtools@2.3.3': dependencies: '@api.global/typedrequest': 3.1.10 @@ -6741,6 +6099,32 @@ snapshots: - supports-color - vue + '@design.estate/dees-domtools@2.3.8': + dependencies: + '@api.global/typedrequest': 3.3.0 + '@design.estate/dees-comms': 1.0.30 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartmarkdown': 3.0.3 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrouter': 1.3.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstate': 2.0.27 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smarturl': 3.1.0 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/websetup': 3.0.19 + '@push.rocks/webstore': 2.0.20 + '@tempfix/lenis': 1.3.20 + lit: 3.3.2 + sweet-scroll: 4.0.0 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + '@design.estate/dees-element@2.1.2': dependencies: '@design.estate/dees-domtools': 2.3.3 @@ -6753,17 +6137,36 @@ snapshots: - supports-color - vue + '@design.estate/dees-element@2.1.6': + dependencies: + '@design.estate/dees-domtools': 2.3.8 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartrx': 3.0.10 + lit: 3.3.2 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@design.estate/dees-wcctools@3.8.0': + dependencies: + '@design.estate/dees-domtools': 2.3.8 + '@design.estate/dees-element': 2.1.6 + '@push.rocks/smartdelay': 3.0.5 + lit: 3.3.2 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.5': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 @@ -6777,116 +6180,215 @@ snapshots: '@esbuild/aix-ppc64@0.27.2': optional: true + '@esbuild/aix-ppc64@0.27.3': + optional: true + '@esbuild/android-arm64@0.27.2': optional: true + '@esbuild/android-arm64@0.27.3': + optional: true + '@esbuild/android-arm@0.27.2': optional: true + '@esbuild/android-arm@0.27.3': + optional: true + '@esbuild/android-x64@0.27.2': optional: true + '@esbuild/android-x64@0.27.3': + optional: true + '@esbuild/darwin-arm64@0.27.2': optional: true + '@esbuild/darwin-arm64@0.27.3': + optional: true + '@esbuild/darwin-x64@0.27.2': optional: true + '@esbuild/darwin-x64@0.27.3': + optional: true + '@esbuild/freebsd-arm64@0.27.2': optional: true + '@esbuild/freebsd-arm64@0.27.3': + optional: true + '@esbuild/freebsd-x64@0.27.2': optional: true + '@esbuild/freebsd-x64@0.27.3': + optional: true + '@esbuild/linux-arm64@0.27.2': optional: true + '@esbuild/linux-arm64@0.27.3': + optional: true + '@esbuild/linux-arm@0.27.2': optional: true + '@esbuild/linux-arm@0.27.3': + optional: true + '@esbuild/linux-ia32@0.27.2': optional: true + '@esbuild/linux-ia32@0.27.3': + optional: true + '@esbuild/linux-loong64@0.27.2': optional: true + '@esbuild/linux-loong64@0.27.3': + optional: true + '@esbuild/linux-mips64el@0.27.2': optional: true + '@esbuild/linux-mips64el@0.27.3': + optional: true + '@esbuild/linux-ppc64@0.27.2': optional: true + '@esbuild/linux-ppc64@0.27.3': + optional: true + '@esbuild/linux-riscv64@0.27.2': optional: true + '@esbuild/linux-riscv64@0.27.3': + optional: true + '@esbuild/linux-s390x@0.27.2': optional: true + '@esbuild/linux-s390x@0.27.3': + optional: true + '@esbuild/linux-x64@0.27.2': optional: true + '@esbuild/linux-x64@0.27.3': + optional: true + '@esbuild/netbsd-arm64@0.27.2': optional: true + '@esbuild/netbsd-arm64@0.27.3': + optional: true + '@esbuild/netbsd-x64@0.27.2': optional: true + '@esbuild/netbsd-x64@0.27.3': + optional: true + '@esbuild/openbsd-arm64@0.27.2': optional: true + '@esbuild/openbsd-arm64@0.27.3': + optional: true + '@esbuild/openbsd-x64@0.27.2': optional: true + '@esbuild/openbsd-x64@0.27.3': + optional: true + '@esbuild/openharmony-arm64@0.27.2': optional: true + '@esbuild/openharmony-arm64@0.27.3': + optional: true + '@esbuild/sunos-x64@0.27.2': optional: true + '@esbuild/sunos-x64@0.27.3': + optional: true + '@esbuild/win32-arm64@0.27.2': optional: true + '@esbuild/win32-arm64@0.27.3': + optional: true + '@esbuild/win32-ia32@0.27.2': optional: true + '@esbuild/win32-ia32@0.27.3': + optional: true + '@esbuild/win32-x64@0.27.2': optional: true - '@git.zone/tsbuild@4.1.2': + '@esbuild/win32-x64@0.27.3': + optional: true + + '@fortawesome/fontawesome-common-types@7.2.0': {} + + '@fortawesome/fontawesome-svg-core@7.2.0': dependencies: - '@git.zone/tspublish': 1.11.0 + '@fortawesome/fontawesome-common-types': 7.2.0 + + '@fortawesome/free-brands-svg-icons@7.2.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.2.0 + + '@fortawesome/free-regular-svg-icons@7.2.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.2.0 + + '@fortawesome/free-solid-svg-icons@7.2.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.2.0 + + '@git.zone/tsbuild@4.2.6': + dependencies: + '@git.zone/tspublish': 1.11.2 '@push.rocks/early': 4.0.4 '@push.rocks/smartcli': 4.0.20 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 13.1.2 - '@push.rocks/smartfs': 1.3.1 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartfs': 1.3.3 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 typescript: 5.9.3 transitivePeerDependencies: - '@nuxt/kit' - aws-crt + - bare-abort-controller + - bare-buffer - react + - react-native-b4a - supports-color - vue - '@git.zone/tsbundle@2.8.1': + '@git.zone/tsbundle@2.9.1': dependencies: '@push.rocks/early': 4.0.4 '@push.rocks/npmextra': 5.3.3 '@push.rocks/smartcli': 4.0.20 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartfs': 1.3.3 '@push.rocks/smartinteract': 2.0.16 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartlog-destination-local': 9.0.2 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartspawn': 3.0.3 - '@rspack/core': 1.7.2 + '@rspack/core': 1.7.7 '@types/html-minifier': 4.0.6 - esbuild: 0.27.2 + esbuild: 0.27.3 html-minifier: 4.0.0 rolldown: 1.0.0-beta.52 typescript: 5.9.3 @@ -6897,23 +6399,26 @@ snapshots: - supports-color - vue - '@git.zone/tspublish@1.11.0': + '@git.zone/tspublish@1.11.2': dependencies: '@push.rocks/consolecolor': 2.0.3 '@push.rocks/npmextra': 5.3.3 '@push.rocks/smartcli': 4.0.20 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartfile': 13.1.2 - '@push.rocks/smartfs': 1.3.1 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartfs': 1.3.3 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartnpm': 2.0.6 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartrequest': 5.0.1 - '@push.rocks/smartshell': 3.3.0 + '@push.rocks/smartshell': 3.3.7 transitivePeerDependencies: - '@nuxt/kit' - aws-crt + - bare-abort-controller + - bare-buffer - react + - react-native-b4a - supports-color - vue @@ -6923,38 +6428,40 @@ snapshots: '@push.rocks/smartshell': 3.3.0 tsx: 4.21.0 - '@git.zone/tstest@3.1.6(@aws-sdk/credential-providers@3.808.0)(socks@2.8.4)(typescript@5.9.3)': + '@git.zone/tstest@3.2.0(@aws-sdk/credential-providers@3.808.0)(@tiptap/pm@2.27.2)(socks@2.8.4)(typescript@5.9.3)': dependencies: - '@api.global/typedserver': 3.0.80 - '@git.zone/tsbundle': 2.8.1 + '@api.global/typedserver': 8.4.2(@tiptap/pm@2.27.2) + '@git.zone/tsbundle': 2.9.1 '@git.zone/tsrun': 2.0.1 '@push.rocks/consolecolor': 2.0.3 '@push.rocks/qenv': 6.1.3 '@push.rocks/smartbrowser': 2.0.8(typescript@5.9.3) - '@push.rocks/smartchok': 1.1.1 '@push.rocks/smartcrypto': 2.0.4 '@push.rocks/smartdelay': 3.0.5 '@push.rocks/smartenv': 6.0.0 '@push.rocks/smartexpect': 2.5.0 - '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 - '@push.rocks/smartmongo': 2.0.14(@aws-sdk/credential-providers@3.808.0)(socks@2.8.4) + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartjson': 6.0.0 + '@push.rocks/smartlog': 3.2.1 + '@push.rocks/smartmongo': 5.1.0(@aws-sdk/credential-providers@3.808.0)(socks@2.8.4) '@push.rocks/smartnetwork': 4.4.0 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrequest': 5.0.1 - '@push.rocks/smarts3': 3.0.3 + '@push.rocks/smarts3': 5.3.0 '@push.rocks/smartshell': 3.3.0 - '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smarttime': 4.2.3 + '@push.rocks/smartwatch': 6.3.0 '@types/ws': 8.18.1 figures: 6.1.0 - ws: 8.18.3 + ws: 8.19.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@mongodb-js/zstd' - '@nuxt/kit' - '@swc/helpers' + - '@tiptap/pm' - aws-crt - bare-buffer - bufferutil @@ -7047,7 +6554,7 @@ snapshots: '@img/sharp-wasm32@0.34.3': dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.8.1 optional: true '@img/sharp-win32-arm64@0.34.3': @@ -7077,7 +6584,7 @@ snapshots: '@inquirer/figures': 1.0.15 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.19.7 + '@types/node': 22.19.13 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -7367,11 +6874,6 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.4.0 - '@mistralai/mistralai@1.12.0': - dependencies: - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - '@mixmark-io/domino@2.2.0': {} '@module-federation/error-codes@0.22.0': {} @@ -7403,6 +6905,54 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 + '@napi-rs/canvas-android-arm64@0.1.95': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.95': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.95': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.95': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.95': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.95': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.95': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.95': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.95': + optional: true + + '@napi-rs/canvas-win32-arm64-msvc@0.1.95': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.95': + optional: true + + '@napi-rs/canvas@0.1.95': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.95 + '@napi-rs/canvas-darwin-arm64': 0.1.95 + '@napi-rs/canvas-darwin-x64': 0.1.95 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.95 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.95 + '@napi-rs/canvas-linux-arm64-musl': 0.1.95 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.95 + '@napi-rs/canvas-linux-x64-gnu': 0.1.95 + '@napi-rs/canvas-linux-x64-musl': 0.1.95 + '@napi-rs/canvas-win32-arm64-msvc': 0.1.95 + '@napi-rs/canvas-win32-x64-msvc': 0.1.95 + optional: true + '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.8.1 @@ -7417,6 +6967,8 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@opentelemetry/api@1.9.0': {} + '@oxc-project/types@0.99.0': {} '@pdf-lib/standard-fonts@1.0.0': @@ -7523,7 +7075,7 @@ snapshots: dependencies: graceful-fs: 4.2.10 - '@pnpm/npm-conf@2.3.1': + '@pnpm/npm-conf@3.0.2': dependencies: '@pnpm/config.env-replace': 1.1.0 '@pnpm/network.ca-file': 1.0.2 @@ -7531,11 +7083,11 @@ snapshots: '@puppeteer/browsers@2.7.1': dependencies: - debug: 4.4.0 + debug: 4.4.3 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.7.1 + semver: 7.7.3 tar-fs: 3.0.8 yargs: 17.7.2 transitivePeerDependencies: @@ -7558,24 +7110,6 @@ snapshots: '@push.rocks/isounique@1.0.5': {} - '@push.rocks/levelcache@3.1.1': - dependencies: - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartbucket': 3.3.7 - '@push.rocks/smartcache': 1.0.16 - '@push.rocks/smartenv': 5.0.12 - '@push.rocks/smartexit': 1.0.23 - '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpath': 5.1.0 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartstring': 4.0.15 - '@push.rocks/smartunique': 3.0.9 - '@push.rocks/taskbuffer': 3.1.7 - '@tsclass/tsclass': 4.4.4 - transitivePeerDependencies: - - aws-crt - '@push.rocks/levelcache@3.2.0': dependencies: '@push.rocks/lik': 6.2.2 @@ -7620,6 +7154,17 @@ snapshots: '@types/symbol-tree': 3.2.5 symbol-tree: 3.2.4 + '@push.rocks/lik@6.3.1': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.2.3 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + '@push.rocks/mongodump@1.0.8': dependencies: '@pushrocks/lik': 6.0.2 @@ -7637,11 +7182,11 @@ snapshots: '@push.rocks/qenv': 6.1.3 '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 - '@push.rocks/taskbuffer': 3.4.0 + '@push.rocks/taskbuffer': 3.5.0 '@tsclass/tsclass': 9.3.0 transitivePeerDependencies: - '@nuxt/kit' @@ -7657,27 +7202,27 @@ snapshots: '@push.rocks/smartlog': 3.1.10 '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartarchive@4.2.2': + '@push.rocks/smartarchive@4.2.4': dependencies: '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartfile': 13.1.2 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.3.1 + '@push.rocks/smartrequest': 4.4.2 '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smartstream': 3.4.0 '@push.rocks/smartunique': 3.0.9 '@push.rocks/smarturl': 3.1.0 '@types/tar-stream': 3.1.4 fflate: 0.8.2 - file-type: 21.0.0 - tar-stream: 3.1.7 - through: 2.3.8 + file-type: 21.3.0 + tar-stream: 3.1.8 transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a - supports-color - '@push.rocks/smartarray@1.1.0': {} - '@push.rocks/smartbrowser@2.0.8(typescript@5.9.3)': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -7705,47 +7250,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@push.rocks/smartbucket@3.3.7': - dependencies: - '@aws-sdk/client-s3': 3.750.0 - '@push.rocks/smartmime': 2.0.4 - '@push.rocks/smartpath': 5.1.0 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smartstream': 3.2.5 - '@push.rocks/smartstring': 4.0.15 - '@push.rocks/smartunique': 3.0.9 - '@tsclass/tsclass': 4.4.0 - transitivePeerDependencies: - - aws-crt - - '@push.rocks/smartbucket@4.3.0': - dependencies: - '@aws-sdk/client-s3': 3.971.0 - '@push.rocks/smartmime': 2.0.4 - '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smartstream': 3.2.5 - '@push.rocks/smartstring': 4.1.0 - '@push.rocks/smartunique': 3.0.9 - '@tsclass/tsclass': 9.3.0 - minimatch: 10.1.1 - transitivePeerDependencies: - - aws-crt - '@push.rocks/smartbuffer@3.0.5': dependencies: uint8array-extras: 1.4.0 - '@push.rocks/smartcache@1.0.16': - dependencies: - '@pushrocks/smartdelay': 2.0.13 - '@pushrocks/smarterror': 2.0.1 - '@pushrocks/smarthash': 3.0.2 - '@pushrocks/smartpromise': 3.1.10 - '@pushrocks/smarttime': 4.0.1 - '@push.rocks/smartcache@1.0.18': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -7754,18 +7262,10 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smarttime': 4.1.1 - '@push.rocks/smartchok@1.1.1': - dependencies: - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrx': 3.0.10 - chokidar: 4.0.3 - picomatch: 4.0.3 - '@push.rocks/smartcli@4.0.20': dependencies: - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartobject': 1.0.12 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 @@ -7790,12 +7290,12 @@ snapshots: dependencies: '@push.rocks/lik': 6.2.2 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog': 3.2.1 '@push.rocks/smartmongo': 2.0.14(@aws-sdk/credential-providers@3.808.0)(socks@2.8.4) '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smartstring': 4.1.0 - '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smarttime': 4.2.3 '@push.rocks/smartunique': 3.0.9 '@push.rocks/taskbuffer': 3.4.0 '@tsclass/tsclass': 8.2.1 @@ -7830,7 +7330,7 @@ snapshots: acme-client: 5.4.0 dns-packet: 5.6.1 elliptic: 6.6.1 - minimatch: 10.0.3 + minimatch: 10.1.1 transitivePeerDependencies: - supports-color @@ -7858,6 +7358,11 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 tree-kill: 1.2.2 + '@push.rocks/smartexit@2.0.3': + dependencies: + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartexpect@2.5.0': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -7910,19 +7415,15 @@ snapshots: dependencies: '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartfs@1.3.3': + dependencies: + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartguard@3.1.0': dependencies: '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrequest': 2.1.0 - '@push.rocks/smarthash@3.2.0': - dependencies: - '@push.rocks/smartenv': 5.0.12 - '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpromise': 4.2.3 - '@types/through2': 2.0.41 - through2: 4.0.2 - '@push.rocks/smarthash@3.2.6': dependencies: '@push.rocks/smartenv': 5.0.13 @@ -7931,24 +7432,30 @@ snapshots: '@types/through2': 2.0.41 through2: 4.0.2 + '@push.rocks/smarti18n@1.0.4': {} + '@push.rocks/smartinteract@2.0.16': dependencies: - '@push.rocks/lik': 6.2.2 + '@push.rocks/lik': 6.3.1 '@push.rocks/smartobject': 1.0.12 '@push.rocks/smartpromise': 4.2.3 inquirer: 11.1.0 '@push.rocks/smartjimp@1.2.0': dependencies: - '@push.rocks/levelcache': 3.1.1 + '@push.rocks/levelcache': 3.2.0 '@push.rocks/smartfile': 11.2.7 - '@push.rocks/smarthash': 3.2.0 + '@push.rocks/smarthash': 3.2.6 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartrequest': 4.3.1 jimp: 1.6.0 sharp: 0.34.3 transitivePeerDependencies: + - '@nuxt/kit' - aws-crt + - react + - supports-color + - vue '@push.rocks/smartjson@5.0.20': dependencies: @@ -7964,6 +7471,13 @@ snapshots: fast-json-stable-stringify: 2.1.0 lodash.clonedeep: 4.5.0 + '@push.rocks/smartjson@6.0.0': + dependencies: + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartstring': 4.1.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + '@push.rocks/smartlog-destination-devtools@1.0.12': dependencies: '@push.rocks/smartlog-interfaces': 3.0.2 @@ -7977,12 +7491,7 @@ snapshots: '@push.rocks/smartlog-interfaces@3.0.2': dependencies: '@api.global/typedrequest-interfaces': 2.0.2 - '@tsclass/tsclass': 4.4.0 - - '@push.rocks/smartlog@3.0.7': - dependencies: - '@push.rocks/isounique': 1.0.5 - '@push.rocks/smartlog-interfaces': 3.0.2 + '@tsclass/tsclass': 4.4.4 '@push.rocks/smartlog@3.1.10': dependencies: @@ -7997,6 +7506,19 @@ snapshots: '@push.rocks/webrequest': 3.0.37 '@tsclass/tsclass': 9.3.0 + '@push.rocks/smartlog@3.2.1': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartclickhouse': 2.0.17 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarttime': 4.2.3 + '@push.rocks/webrequest': 4.0.1 + '@tsclass/tsclass': 9.3.0 + '@push.rocks/smartmanifest@2.0.2': {} '@push.rocks/smartmarkdown@3.0.3': @@ -8045,15 +7567,30 @@ snapshots: - supports-color - vue - '@push.rocks/smartnetwork@4.1.2': + '@push.rocks/smartmongo@5.1.0(@aws-sdk/credential-providers@3.808.0)(socks@2.8.4)': dependencies: - '@push.rocks/smartping': 1.0.8 + '@push.rocks/mongodump': 1.0.8 + '@push.rocks/smartdata': 5.15.1(@aws-sdk/credential-providers@3.808.0)(socks@2.8.4) + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartpath': 5.1.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartstring': 4.0.15 - '@types/default-gateway': 7.2.2 - isopen: 1.3.0 - public-ip: 7.0.1 - systeminformation: 5.27.7 + '@push.rocks/smartrx': 3.0.10 + bson: 6.10.3 + mingo: 7.2.0 + mongodb-memory-server: 10.1.4(@aws-sdk/credential-providers@3.808.0)(socks@2.8.4) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - '@nuxt/kit' + - aws-crt + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react + - snappy + - socks + - supports-color + - vue '@push.rocks/smartnetwork@4.4.0': dependencies: @@ -8070,18 +7607,21 @@ snapshots: dependencies: '@push.rocks/consolecolor': 2.0.3 '@push.rocks/levelcache': 3.2.0 - '@push.rocks/smartarchive': 4.2.2 + '@push.rocks/smartarchive': 4.2.4 '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.3.1 - '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartrequest': 4.4.2 + '@push.rocks/smarttime': 4.2.3 '@push.rocks/smartversion': 3.0.5 package-json: 8.1.1 transitivePeerDependencies: - '@nuxt/kit' - aws-crt + - bare-abort-controller + - bare-buffer - react + - react-native-b4a - supports-color - vue @@ -8121,7 +7661,7 @@ snapshots: '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.3) '@push.rocks/smartunique': 3.0.9 '@tsclass/tsclass': 9.3.0 - '@types/express': 5.0.3 + '@types/express': 5.0.6 express: 5.1.0 pdf-lib: 1.17.1 pdf2json: 3.2.0 @@ -8132,29 +7672,32 @@ snapshots: - typescript - utf-8-validate - '@push.rocks/smartpdf@4.1.1(typescript@5.9.3)': + '@push.rocks/smartpdf@4.1.3(typescript@5.9.3)': dependencies: '@push.rocks/smartbuffer': 3.0.5 '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartfs': 1.3.1 '@push.rocks/smartjimp': 1.2.0 - '@push.rocks/smartnetwork': 4.1.2 + '@push.rocks/smartnetwork': 4.4.0 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.3) '@push.rocks/smartunique': 3.0.9 - '@tsclass/tsclass': 9.2.0 - '@types/express': 5.0.3 - express: 5.1.0 + '@tsclass/tsclass': 9.3.0 + '@types/express': 5.0.6 + express: 5.2.1 pdf-lib: 1.17.1 - pdf2json: 3.2.0 + pdf2json: 4.0.2 transitivePeerDependencies: + - '@nuxt/kit' - aws-crt - bare-buffer - bufferutil + - react - supports-color - typescript - utf-8-validate + - vue '@push.rocks/smartping@1.0.8': dependencies: @@ -8166,7 +7709,7 @@ snapshots: '@push.rocks/smartpuppeteer@2.0.5(typescript@5.9.3)': dependencies: '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartshell': 3.2.3 + '@push.rocks/smartshell': 3.3.0 puppeteer: 24.3.0(typescript@5.9.3) tree-kill: 1.2.2 transitivePeerDependencies: @@ -8192,6 +7735,15 @@ snapshots: agentkeepalive: 4.6.0 form-data: 4.0.4 + '@push.rocks/smartrequest@4.4.2': + dependencies: + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarturl': 3.1.0 + agentkeepalive: 4.6.0 + form-data: 4.0.5 + '@push.rocks/smartrequest@5.0.1': dependencies: '@push.rocks/smartenv': 6.0.0 @@ -8207,6 +7759,10 @@ snapshots: '@push.rocks/smartrx': 3.0.10 path-to-regexp: 8.3.0 + '@push.rocks/smartrust@1.3.1': + dependencies: + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartrx@3.0.10': dependencies: '@push.rocks/smartpromise': 4.2.3 @@ -8217,24 +7773,24 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 rxjs: 7.8.2 - '@push.rocks/smarts3@3.0.3': + '@push.rocks/smarts3@5.3.0': dependencies: - '@push.rocks/smartbucket': 4.3.0 - '@push.rocks/smartfs': 1.3.1 '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartxml': 2.0.0 + '@push.rocks/smartrust': 1.3.1 '@tsclass/tsclass': 9.3.0 - transitivePeerDependencies: - - aws-crt - '@push.rocks/smartshell@3.2.3': + '@push.rocks/smartserve@2.0.1': dependencies: - '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartexit': 1.0.23 - '@push.rocks/smartpromise': 4.2.3 - '@types/which': 3.0.4 - tree-kill: 1.2.2 - which: 5.0.0 + '@api.global/typedrequest': 3.3.0 + '@cfworker/json-schema': 4.1.1 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartlog': 3.2.1 + '@push.rocks/smartpath': 6.0.0 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate '@push.rocks/smartshell@3.3.0': dependencies: @@ -8245,6 +7801,14 @@ snapshots: tree-kill: 1.2.2 which: 5.0.0 + '@push.rocks/smartshell@3.3.7': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartexit': 2.0.3 + '@push.rocks/smartpromise': 4.2.3 + '@types/which': 3.0.4 + which: 6.0.1 + '@push.rocks/smartsitemap@2.0.4': dependencies: '@push.rocks/smartcache': 1.0.18 @@ -8254,31 +7818,6 @@ snapshots: '@push.rocks/webrequest': 4.0.1 '@tsclass/tsclass': 9.3.0 - '@push.rocks/smartsocket@2.1.0': - dependencies: - '@api.global/typedrequest-interfaces': 3.0.19 - '@api.global/typedserver': 3.0.80 - '@push.rocks/isohash': 2.0.1 - '@push.rocks/isounique': 1.0.5 - '@push.rocks/lik': 6.2.2 - '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartenv': 5.0.13 - '@push.rocks/smartjson': 5.2.0 - '@push.rocks/smartlog': 3.1.10 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smarttime': 4.1.1 - engine.io: 6.6.4 - socket.io: 4.8.1 - socket.io-client: 4.8.1 - transitivePeerDependencies: - - '@nuxt/kit' - - bufferutil - - react - - supports-color - - utf-8-validate - - vue - '@push.rocks/smartspawn@3.0.3': dependencies: '@push.rocks/smartpromise': 4.2.3 @@ -8304,6 +7843,13 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartrx': 3.0.7 + '@push.rocks/smartstream@3.4.0': + dependencies: + '@push.rocks/lik': 6.3.1 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstring@4.0.15': dependencies: '@push.rocks/isounique': 1.0.5 @@ -8330,6 +7876,17 @@ snapshots: is-nan: 1.3.2 pretty-ms: 9.2.0 + '@push.rocks/smarttime@4.2.3': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + croner: 10.0.1 + date-fns: 4.1.0 + dayjs: 1.11.19 + is-nan: 1.3.2 + pretty-ms: 9.3.0 + '@push.rocks/smartunique@3.0.9': dependencies: '@types/uuid': 9.0.8 @@ -8341,7 +7898,16 @@ snapshots: '@push.rocks/smartversion@3.0.5': dependencies: '@types/semver': 7.7.1 - semver: 7.7.3 + semver: 7.7.4 + + '@push.rocks/smartwatch@6.3.0': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + chokidar: 5.0.0 + picomatch: 4.0.3 '@push.rocks/smartxml@2.0.0': dependencies: @@ -8356,16 +7922,6 @@ snapshots: dependencies: yaml: 2.8.2 - '@push.rocks/taskbuffer@3.1.7': - dependencies: - '@push.rocks/lik': 6.1.0 - '@push.rocks/smartdelay': 3.0.5 - '@push.rocks/smartlog': 3.0.7 - '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrx': 3.0.7 - '@push.rocks/smarttime': 4.1.1 - '@push.rocks/smartunique': 3.0.9 - '@push.rocks/taskbuffer@3.4.0': dependencies: '@design.estate/dees-element': 2.1.2 @@ -8382,6 +7938,22 @@ snapshots: - supports-color - vue + '@push.rocks/taskbuffer@3.5.0': + dependencies: + '@design.estate/dees-element': 2.1.6 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.2.1 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.2.3 + '@push.rocks/smartunique': 3.0.9 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + '@push.rocks/webrequest@3.0.37': dependencies: '@push.rocks/smartdelay': 3.0.5 @@ -8398,6 +7970,14 @@ snapshots: '@push.rocks/smartpromise': 4.2.3 '@push.rocks/webstore': 2.0.20 + '@push.rocks/webrequest@4.0.5': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartjson': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webstore': 2.0.20 + '@push.rocks/websetup@3.0.19': dependencies: '@pushrocks/smartdelay': 3.0.1 @@ -8454,11 +8034,6 @@ snapshots: dependencies: '@pushrocks/smartpromise': 3.1.10 - '@pushrocks/smarterror@2.0.1': - dependencies: - clean-stack: 1.3.0 - make-error-cause: 2.3.0 - '@pushrocks/smartfile-interfaces@1.0.7': {} '@pushrocks/smartfile@9.0.6': @@ -8535,7 +8110,7 @@ snapshots: '@pushrocks/smartpromise': 3.1.10 '@pushrocks/smarturl': 2.0.1 agentkeepalive: 4.6.0 - form-data: 4.0.4 + form-data: 4.0.5 '@pushrocks/smartrx@2.0.27': dependencies: @@ -8582,6 +8157,8 @@ snapshots: '@pushrocks/smarturl@2.0.1': {} + '@remirror/core-constants@3.0.0': {} + '@rolldown/binding-android-arm64@1.0.0-beta.52': optional: true @@ -8628,55 +8205,55 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.52': {} - '@rspack/binding-darwin-arm64@1.7.2': + '@rspack/binding-darwin-arm64@1.7.7': optional: true - '@rspack/binding-darwin-x64@1.7.2': + '@rspack/binding-darwin-x64@1.7.7': optional: true - '@rspack/binding-linux-arm64-gnu@1.7.2': + '@rspack/binding-linux-arm64-gnu@1.7.7': optional: true - '@rspack/binding-linux-arm64-musl@1.7.2': + '@rspack/binding-linux-arm64-musl@1.7.7': optional: true - '@rspack/binding-linux-x64-gnu@1.7.2': + '@rspack/binding-linux-x64-gnu@1.7.7': optional: true - '@rspack/binding-linux-x64-musl@1.7.2': + '@rspack/binding-linux-x64-musl@1.7.7': optional: true - '@rspack/binding-wasm32-wasi@1.7.2': + '@rspack/binding-wasm32-wasi@1.7.7': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rspack/binding-win32-arm64-msvc@1.7.2': + '@rspack/binding-win32-arm64-msvc@1.7.7': optional: true - '@rspack/binding-win32-ia32-msvc@1.7.2': + '@rspack/binding-win32-ia32-msvc@1.7.7': optional: true - '@rspack/binding-win32-x64-msvc@1.7.2': + '@rspack/binding-win32-x64-msvc@1.7.7': optional: true - '@rspack/binding@1.7.2': + '@rspack/binding@1.7.7': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.7.2 - '@rspack/binding-darwin-x64': 1.7.2 - '@rspack/binding-linux-arm64-gnu': 1.7.2 - '@rspack/binding-linux-arm64-musl': 1.7.2 - '@rspack/binding-linux-x64-gnu': 1.7.2 - '@rspack/binding-linux-x64-musl': 1.7.2 - '@rspack/binding-wasm32-wasi': 1.7.2 - '@rspack/binding-win32-arm64-msvc': 1.7.2 - '@rspack/binding-win32-ia32-msvc': 1.7.2 - '@rspack/binding-win32-x64-msvc': 1.7.2 + '@rspack/binding-darwin-arm64': 1.7.7 + '@rspack/binding-darwin-x64': 1.7.7 + '@rspack/binding-linux-arm64-gnu': 1.7.7 + '@rspack/binding-linux-arm64-musl': 1.7.7 + '@rspack/binding-linux-x64-gnu': 1.7.7 + '@rspack/binding-linux-x64-musl': 1.7.7 + '@rspack/binding-wasm32-wasi': 1.7.7 + '@rspack/binding-win32-arm64-msvc': 1.7.7 + '@rspack/binding-win32-ia32-msvc': 1.7.7 + '@rspack/binding-win32-x64-msvc': 1.7.7 - '@rspack/core@1.7.2': + '@rspack/core@1.7.7': dependencies: '@module-federation/runtime-tools': 0.22.0 - '@rspack/binding': 1.7.2 + '@rspack/binding': 1.7.7 '@rspack/lite-tapable': 1.1.0 '@rspack/lite-tapable@1.1.0': {} @@ -8685,11 +8262,6 @@ snapshots: '@sindresorhus/is@5.6.0': {} - '@smithy/abort-controller@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/abort-controller@4.2.0': dependencies: '@smithy/types': 4.6.0 @@ -8699,33 +8271,17 @@ snapshots: dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/chunked-blob-reader-native@4.0.0': - dependencies: - '@smithy/util-base64': 4.0.0 - tslib: 2.8.1 + optional: true '@smithy/chunked-blob-reader-native@4.2.1': dependencies: '@smithy/util-base64': 4.3.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.0.0': - dependencies: - tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.2.0': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.0.1': - dependencies: - '@smithy/node-config-provider': 4.0.1 - '@smithy/types': 4.1.0 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.1 - tslib: 2.8.1 - '@smithy/config-resolver@4.3.0': dependencies: '@smithy/node-config-provider': 4.3.0 @@ -8742,17 +8298,7 @@ snapshots: '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - - '@smithy/core@3.1.5': - dependencies: - '@smithy/middleware-serde': 4.0.2 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.1.2 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 + optional: true '@smithy/core@3.15.0': dependencies: @@ -8779,14 +8325,7 @@ snapshots: '@smithy/util-utf8': 4.2.0 '@smithy/uuid': 1.1.0 tslib: 2.8.1 - - '@smithy/credential-provider-imds@4.0.1': - dependencies: - '@smithy/node-config-provider': 4.0.1 - '@smithy/property-provider': 4.0.1 - '@smithy/types': 4.1.0 - '@smithy/url-parser': 4.0.1 - tslib: 2.8.1 + optional: true '@smithy/credential-provider-imds@4.2.0': dependencies: @@ -8803,105 +8342,38 @@ snapshots: '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 tslib: 2.8.1 - - '@smithy/eventstream-codec@4.0.1': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.1.0 - '@smithy/util-hex-encoding': 4.0.0 - tslib: 2.8.1 + optional: true '@smithy/eventstream-codec@4.2.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.6.0 - '@smithy/util-hex-encoding': 4.2.0 - tslib: 2.8.1 - - '@smithy/eventstream-codec@4.2.8': dependencies: '@aws-crypto/crc32': 5.2.0 '@smithy/types': 4.12.0 '@smithy/util-hex-encoding': 4.2.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.1': - dependencies: - '@smithy/eventstream-serde-universal': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.0': dependencies: '@smithy/eventstream-serde-universal': 4.2.0 '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.8': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-config-resolver@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.0': dependencies: '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.8': - dependencies: - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.0.1': - dependencies: - '@smithy/eventstream-serde-universal': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.0': dependencies: '@smithy/eventstream-serde-universal': 4.2.0 '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.8': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-universal@4.0.1': - dependencies: - '@smithy/eventstream-codec': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.0': dependencies: '@smithy/eventstream-codec': 4.2.0 '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.8': - dependencies: - '@smithy/eventstream-codec': 4.2.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@smithy/fetch-http-handler@5.0.1': - dependencies: - '@smithy/protocol-http': 5.0.1 - '@smithy/querystring-builder': 4.0.1 - '@smithy/types': 4.1.0 - '@smithy/util-base64': 4.0.0 - tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.1': dependencies: '@smithy/protocol-http': 5.3.0 @@ -8917,13 +8389,7 @@ snapshots: '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 tslib: 2.8.1 - - '@smithy/hash-blob-browser@4.0.1': - dependencies: - '@smithy/chunked-blob-reader': 5.0.0 - '@smithy/chunked-blob-reader-native': 4.0.0 - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/hash-blob-browser@4.2.1': dependencies: @@ -8932,20 +8398,6 @@ snapshots: '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.2.9': - dependencies: - '@smithy/chunked-blob-reader': 5.2.0 - '@smithy/chunked-blob-reader-native': 4.2.1 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - - '@smithy/hash-node@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - '@smithy/hash-node@4.2.0': dependencies: '@smithy/types': 4.6.0 @@ -8959,12 +8411,7 @@ snapshots: '@smithy/util-buffer-from': 4.2.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - - '@smithy/hash-stream-node@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 + optional: true '@smithy/hash-stream-node@4.2.0': dependencies: @@ -8972,17 +8419,6 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/hash-stream-node@4.2.8': - dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/invalid-dependency@4.2.0': dependencies: '@smithy/types': 4.6.0 @@ -8992,43 +8428,22 @@ snapshots: dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 + optional: true '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.0.0': - dependencies: - tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - '@smithy/md5-js@4.2.0': dependencies: '@smithy/types': 4.6.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/md5-js@4.2.8': - dependencies: - '@smithy/types': 4.12.0 - '@smithy/util-utf8': 4.2.0 - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.0.1': - dependencies: - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.0': dependencies: '@smithy/protocol-http': 5.3.0 @@ -9040,17 +8455,7 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.0.6': - dependencies: - '@smithy/core': 3.1.5 - '@smithy/middleware-serde': 4.0.2 - '@smithy/node-config-provider': 4.0.1 - '@smithy/shared-ini-file-loader': 4.0.1 - '@smithy/types': 4.1.0 - '@smithy/url-parser': 4.0.1 - '@smithy/util-middleware': 4.0.1 - tslib: 2.8.1 + optional: true '@smithy/middleware-endpoint@4.3.1': dependencies: @@ -9073,18 +8478,7 @@ snapshots: '@smithy/url-parser': 4.2.8 '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - - '@smithy/middleware-retry@4.0.7': - dependencies: - '@smithy/node-config-provider': 4.0.1 - '@smithy/protocol-http': 5.0.1 - '@smithy/service-error-classification': 4.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - '@smithy/util-middleware': 4.0.1 - '@smithy/util-retry': 4.0.1 - tslib: 2.8.1 - uuid: 9.0.1 + optional: true '@smithy/middleware-retry@4.4.1': dependencies: @@ -9109,11 +8503,7 @@ snapshots: '@smithy/util-retry': 4.2.8 '@smithy/uuid': 1.1.0 tslib: 2.8.1 - - '@smithy/middleware-serde@4.0.2': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/middleware-serde@4.2.0': dependencies: @@ -9126,11 +8516,7 @@ snapshots: '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/middleware-stack@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/middleware-stack@4.2.0': dependencies: @@ -9141,13 +8527,7 @@ snapshots: dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/node-config-provider@4.0.1': - dependencies: - '@smithy/property-provider': 4.0.1 - '@smithy/shared-ini-file-loader': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/node-config-provider@4.3.0': dependencies: @@ -9162,14 +8542,7 @@ snapshots: '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/node-http-handler@4.0.3': - dependencies: - '@smithy/abort-controller': 4.0.1 - '@smithy/protocol-http': 5.0.1 - '@smithy/querystring-builder': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/node-http-handler@4.3.0': dependencies: @@ -9186,11 +8559,7 @@ snapshots: '@smithy/querystring-builder': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/property-provider@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/property-provider@4.2.0': dependencies: @@ -9201,11 +8570,7 @@ snapshots: dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/protocol-http@5.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/protocol-http@5.3.0': dependencies: @@ -9216,12 +8581,7 @@ snapshots: dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/querystring-builder@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - '@smithy/util-uri-escape': 4.0.0 - tslib: 2.8.1 + optional: true '@smithy/querystring-builder@4.2.0': dependencies: @@ -9234,11 +8594,7 @@ snapshots: '@smithy/types': 4.12.0 '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 - - '@smithy/querystring-parser@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/querystring-parser@4.2.0': dependencies: @@ -9249,10 +8605,7 @@ snapshots: dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/service-error-classification@4.0.1': - dependencies: - '@smithy/types': 4.1.0 + optional: true '@smithy/service-error-classification@4.2.0': dependencies: @@ -9261,11 +8614,7 @@ snapshots: '@smithy/service-error-classification@4.2.8': dependencies: '@smithy/types': 4.12.0 - - '@smithy/shared-ini-file-loader@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/shared-ini-file-loader@4.3.0': dependencies: @@ -9276,17 +8625,7 @@ snapshots: dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/signature-v4@5.0.1': - dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.1 - '@smithy/util-uri-escape': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 + optional: true '@smithy/signature-v4@5.3.0': dependencies: @@ -9309,16 +8648,7 @@ snapshots: '@smithy/util-uri-escape': 4.2.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - - '@smithy/smithy-client@4.1.6': - dependencies: - '@smithy/core': 3.1.5 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/middleware-stack': 4.0.1 - '@smithy/protocol-http': 5.0.1 - '@smithy/types': 4.1.0 - '@smithy/util-stream': 4.1.2 - tslib: 2.8.1 + optional: true '@smithy/smithy-client@4.10.9': dependencies: @@ -9329,6 +8659,7 @@ snapshots: '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 tslib: 2.8.1 + optional: true '@smithy/smithy-client@4.7.1': dependencies: @@ -9352,12 +8683,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.1': - dependencies: - '@smithy/querystring-parser': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/url-parser@4.2.0': dependencies: '@smithy/querystring-parser': 4.2.0 @@ -9369,12 +8694,7 @@ snapshots: '@smithy/querystring-parser': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/util-base64@4.0.0': - dependencies: - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 + optional: true '@smithy/util-base64@4.3.0': dependencies: @@ -9382,18 +8702,10 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.0.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-body-length-browser@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.0.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-body-length-node@4.2.1': dependencies: tslib: 2.8.1 @@ -9403,32 +8715,15 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.0.0': - dependencies: - '@smithy/is-array-buffer': 4.0.0 - tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.0': dependencies: '@smithy/is-array-buffer': 4.2.0 tslib: 2.8.1 - '@smithy/util-config-provider@4.0.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-config-provider@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.7': - dependencies: - '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - bowser: 2.11.0 - tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.0': dependencies: '@smithy/property-provider': 4.2.0 @@ -9442,16 +8737,7 @@ snapshots: '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.0.7': - dependencies: - '@smithy/config-resolver': 4.0.1 - '@smithy/credential-provider-imds': 4.0.1 - '@smithy/node-config-provider': 4.0.1 - '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.6 - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/util-defaults-mode-node@4.2.1': dependencies: @@ -9472,12 +8758,7 @@ snapshots: '@smithy/smithy-client': 4.10.9 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/util-endpoints@3.0.1': - dependencies: - '@smithy/node-config-provider': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/util-endpoints@3.2.0': dependencies: @@ -9490,20 +8771,12 @@ snapshots: '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/util-hex-encoding@4.0.0': - dependencies: - tslib: 2.8.1 + optional: true '@smithy/util-hex-encoding@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.0.1': - dependencies: - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/util-middleware@4.2.0': dependencies: '@smithy/types': 4.6.0 @@ -9513,12 +8786,7 @@ snapshots: dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/util-retry@4.0.1': - dependencies: - '@smithy/service-error-classification': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 + optional: true '@smithy/util-retry@4.2.0': dependencies: @@ -9531,17 +8799,7 @@ snapshots: '@smithy/service-error-classification': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - - '@smithy/util-stream@4.1.2': - dependencies: - '@smithy/fetch-http-handler': 5.0.1 - '@smithy/node-http-handler': 4.0.3 - '@smithy/types': 4.1.0 - '@smithy/util-base64': 4.0.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 + optional: true '@smithy/util-stream@4.5.0': dependencies: @@ -9564,10 +8822,7 @@ snapshots: '@smithy/util-hex-encoding': 4.2.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - - '@smithy/util-uri-escape@4.0.0': - dependencies: - tslib: 2.8.1 + optional: true '@smithy/util-uri-escape@4.2.0': dependencies: @@ -9578,39 +8833,22 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.0.0': - dependencies: - '@smithy/util-buffer-from': 4.0.0 - tslib: 2.8.1 - '@smithy/util-utf8@4.2.0': dependencies: '@smithy/util-buffer-from': 4.2.0 tslib: 2.8.1 - '@smithy/util-waiter@4.0.2': - dependencies: - '@smithy/abort-controller': 4.0.1 - '@smithy/types': 4.1.0 - tslib: 2.8.1 - '@smithy/util-waiter@4.2.0': dependencies: '@smithy/abort-controller': 4.2.0 '@smithy/types': 4.6.0 tslib: 2.8.1 - '@smithy/util-waiter@4.2.8': - dependencies: - '@smithy/abort-controller': 4.2.8 - '@smithy/types': 4.12.0 - tslib: 2.8.1 - '@smithy/uuid@1.1.0': dependencies: tslib: 2.8.1 - '@socket.io/component-emitter@3.1.2': {} + '@standard-schema/spec@1.1.0': {} '@szmarczak/http-timer@5.0.1': dependencies: @@ -9618,11 +8856,162 @@ snapshots: '@tempfix/idb@8.0.3': {} - '@tokenizer/inflate@0.2.7': + '@tempfix/lenis@1.3.20': {} + + '@tempfix/webcontainer__api@1.6.1': {} + + '@tiptap/core@2.27.2(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-blockquote@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-bold@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-bullet-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-code@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-document@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-dropcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-gapcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-hard-break@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-heading@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-history@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-horizontal-rule@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + + '@tiptap/extension-italic@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-link@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + linkifyjs: 4.3.2 + + '@tiptap/extension-list-item@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-ordered-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-paragraph@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-strike@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-text-align@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-text-style@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-text@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-typography@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/extension-underline@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + + '@tiptap/pm@2.27.2': + dependencies: + prosemirror-changeset: 2.4.0 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.4 + prosemirror-menu: 1.3.0 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6) + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + '@tiptap/starter-kit@2.27.2': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-blockquote': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bold': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-bullet-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-code-block': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-document': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-dropcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-gapcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-hard-break': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-heading': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-history': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-horizontal-rule': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-italic': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-list-item': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-ordered-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-paragraph': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-strike': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-text': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/extension-text-style': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) + '@tiptap/pm': 2.27.2 + + '@tokenizer/inflate@0.4.1': dependencies: debug: 4.4.3 - fflate: 0.8.2 - token-types: 6.1.1 + token-types: 6.1.2 transitivePeerDependencies: - supports-color @@ -9630,10 +9019,6 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tsclass/tsclass@4.4.0': - dependencies: - type-fest: 4.35.0 - '@tsclass/tsclass@4.4.4': dependencies: type-fest: 4.41.0 @@ -9642,10 +9027,6 @@ snapshots: dependencies: type-fest: 4.41.0 - '@tsclass/tsclass@9.2.0': - dependencies: - type-fest: 4.41.0 - '@tsclass/tsclass@9.3.0': dependencies: type-fest: 4.41.0 @@ -9657,37 +9038,31 @@ snapshots: '@types/bn.js@5.2.0': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/buffer-json@2.0.3': {} '@types/clean-css@4.2.11': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 source-map: 0.6.1 '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.7 - - '@types/cors@2.8.19': - dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 - '@types/default-gateway@7.2.2': {} - '@types/dns-packet@5.6.5': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/elliptic@6.4.18': dependencies: @@ -9695,17 +9070,11 @@ snapshots: '@types/express-serve-static-core@5.0.7': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 - '@types/express@5.0.3': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.0.7 - '@types/serve-static': 1.15.8 - '@types/express@5.0.6': dependencies: '@types/body-parser': 1.19.6 @@ -9719,16 +9088,16 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/hast@3.0.4': dependencies: @@ -9740,7 +9109,7 @@ snapshots: '@types/relateurl': 0.2.33 '@types/uglify-js': 3.17.5 - '@types/http-cache-semantics@4.0.4': {} + '@types/http-cache-semantics@4.2.0': {} '@types/http-errors@2.0.5': {} @@ -9750,12 +9119,21 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/mime-types@2.1.4': {} '@types/mime@1.3.5': {} @@ -9768,21 +9146,21 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/node@16.9.1': {} - '@types/node@22.19.7': + '@types/node@22.19.13': dependencies: undici-types: 6.21.0 - '@types/node@25.0.9': + '@types/node@25.3.3': dependencies: - undici-types: 7.16.0 + undici-types: 7.18.2 '@types/ping@0.4.4': {} @@ -9799,28 +9177,22 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.19.7 - - '@types/serve-static@1.15.8': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 22.19.7 - '@types/send': 0.17.5 + '@types/node': 25.3.3 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/symbol-tree@3.2.5': {} '@types/tar-stream@3.1.4': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/through2@2.0.41': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/trusted-types@2.0.7': {} @@ -9842,7 +9214,7 @@ snapshots: '@types/whatwg-url@8.2.2': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/webidl-conversions': 7.0.3 '@types/which@3.0.4': {} @@ -9851,24 +9223,23 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.19.7 + '@types/node': 25.3.3 optional: true '@ungap/structured-clone@1.3.0': {} + '@vercel/oidc@3.1.0': {} + + '@yr/monotone-cubic-spline@1.0.3': {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - accepts@2.0.0: dependencies: mime-types: 3.0.1 @@ -9890,6 +9261,14 @@ snapshots: dependencies: humanize-ms: 1.2.1 + ai@6.0.116(zod@3.25.76): + dependencies: + '@ai-sdk/gateway': 3.0.66(zod@3.25.76) + '@ai-sdk/provider': 3.0.8 + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + zod: 3.25.76 + ansi-256-colors@1.1.0: {} ansi-escapes@4.3.2: @@ -9908,6 +9287,10 @@ snapshots: any-base@1.1.0: {} + apexcharts@5.10.0: + dependencies: + '@yr/monotone-cubic-spline': 1.0.3 + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -9935,13 +9318,15 @@ snapshots: axios@1.12.2(debug@4.4.3): dependencies: follow-redirects: 1.15.11(debug@4.4.3) - form-data: 4.0.4 + form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug b4a@1.6.7: {} + b4a@1.8.0: {} + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -9949,6 +9334,8 @@ snapshots: bare-events@2.5.4: optional: true + bare-events@2.8.2: {} + bare-fs@4.0.1: dependencies: bare-events: 2.5.4 @@ -9958,13 +9345,22 @@ snapshots: - bare-buffer optional: true - bare-os@3.4.0: - optional: true + bare-fs@4.5.5: + dependencies: + bare-events: 2.8.2 + bare-path: 3.0.0 + bare-stream: 2.8.0(bare-events@2.8.2) + bare-url: 2.3.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-os@3.4.0: {} bare-path@3.0.0: dependencies: bare-os: 3.4.0 - optional: true bare-stream@2.6.5(bare-events@2.5.4): dependencies: @@ -9973,9 +9369,21 @@ snapshots: bare-events: 2.5.4 optional: true - base64-js@1.5.1: {} + bare-stream@2.8.0(bare-events@2.8.2): + dependencies: + streamx: 2.23.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - base64id@2.0.0: {} + bare-url@2.3.2: + dependencies: + bare-path: 3.0.0 + + base64-js@1.5.1: {} basic-ftp@5.0.5: {} @@ -9987,7 +9395,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1 + debug: 4.4.3 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -9997,7 +9405,19 @@ snapshots: transitivePeerDependencies: - supports-color - bowser@2.11.0: {} + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.0 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.15.0 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color bowser@2.12.1: {} @@ -10017,6 +9437,13 @@ snapshots: p-queue: 6.6.2 unload: 2.4.1 + broadcast-channel@7.3.0: + dependencies: + '@babel/runtime': 7.28.6 + oblivious-set: 2.0.0 + p-queue: 6.6.2 + unload: 2.4.1 + brorand@1.1.0: {} bson@4.7.2: @@ -10045,12 +9472,12 @@ snapshots: cacheable-request@10.2.14: dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.2.0 get-stream: 6.0.1 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.1 + normalize-url: 8.1.1 responselike: 3.0.0 call-bind-apply-helpers@1.0.2: @@ -10089,15 +9516,15 @@ snapshots: chardet@0.7.0: {} - chokidar@4.0.3: + chokidar@5.0.0: dependencies: - readdirp: 4.1.2 + readdirp: 5.0.0 chromium-bidi@2.0.0(devtools-protocol@0.0.1402036): dependencies: devtools-protocol: 0.0.1402036 mitt: 3.0.1 - zod: 3.24.2 + zod: 3.25.76 clean-css@4.2.4: dependencies: @@ -10113,10 +9540,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-regexp@3.0.0: - dependencies: - is-regexp: 3.1.0 - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -10156,17 +9579,10 @@ snapshots: content-type@1.0.5: {} - convert-hrtime@5.0.0: {} - cookie-signature@1.2.2: {} cookie@0.7.2: {} - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 @@ -10176,6 +9592,10 @@ snapshots: optionalDependencies: typescript: 5.9.3 + crelt@1.0.6: {} + + croner@10.0.1: {} + croner@4.4.1: {} croner@5.7.0: {} @@ -10198,17 +9618,7 @@ snapshots: dayjs@1.11.13: {} - debug@4.3.7: - dependencies: - ms: 2.1.3 - - debug@4.4.0: - dependencies: - ms: 2.1.3 - - debug@4.4.1: - dependencies: - ms: 2.1.3 + dayjs@1.11.19: {} debug@4.4.3: dependencies: @@ -10264,9 +9674,9 @@ snapshots: dependencies: '@leichtgewicht/ip-codec': 2.0.5 - dns-socket@4.2.2: - dependencies: - dns-packet: 5.6.1 + dompurify@3.2.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 dunder-proto@1.0.1: dependencies: @@ -10298,36 +9708,6 @@ snapshots: dependencies: once: 1.4.0 - engine.io-client@6.6.3: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.17.1 - xmlhttprequest-ssl: 2.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - engine.io-parser@5.2.3: {} - - engine.io@6.6.4: - dependencies: - '@types/cors': 2.8.19 - '@types/node': 22.19.7 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.7.2 - cors: 2.8.5 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - entities@4.5.0: {} env-paths@2.2.1: {} @@ -10380,6 +9760,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.2 '@esbuild/win32-x64': 0.27.2 + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -10410,13 +9819,17 @@ snapshots: eventemitter3@4.0.7: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} - exif-parser@0.1.12: {} + eventsource-parser@3.0.6: {} - express-force-ssl@0.3.2: - dependencies: - lodash.assign: 3.2.0 + exif-parser@0.1.12: {} express@5.1.0: dependencies: @@ -10426,7 +9839,40 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1 + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -10460,7 +9906,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -10480,7 +9926,8 @@ snapshots: fast-xml-parser@4.4.1: dependencies: - strnum: 1.1.1 + strnum: 1.1.2 + optional: true fast-xml-parser@4.5.3: dependencies: @@ -10521,18 +9968,18 @@ snapshots: token-types: 6.1.1 uint8array-extras: 1.5.0 - file-type@21.0.0: + file-type@21.3.0: dependencies: - '@tokenizer/inflate': 0.2.7 + '@tokenizer/inflate': 0.4.1 strtok3: 10.3.4 - token-types: 6.1.1 + token-types: 6.1.2 uint8array-extras: 1.5.0 transitivePeerDependencies: - supports-color finalhandler@2.1.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -10616,8 +10063,6 @@ snapshots: function-bind@1.1.2: {} - function-timeout@0.1.1: {} - get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -10657,7 +10102,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10700,20 +10145,6 @@ snapshots: p-cancelable: 3.0.0 responselike: 3.0.0 - got@13.0.0: - dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 - graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} @@ -10769,6 +10200,8 @@ snapshots: he@1.2.0: {} + highlight.js@11.11.1: {} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -10787,7 +10220,7 @@ snapshots: html-void-elements@3.0.0: {} - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-errors@2.0.0: dependencies: @@ -10797,10 +10230,18 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10812,7 +10253,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10820,6 +10261,8 @@ snapshots: dependencies: ms: 2.1.3 + ibantools@4.5.1: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -10828,6 +10271,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} image-q@4.0.0: @@ -10864,8 +10311,6 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 - ip-regex@5.0.0: {} - ipaddr.js@1.9.1: {} is-arrayish@0.2.1: {} @@ -10876,11 +10321,6 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-ip@5.0.1: - dependencies: - ip-regex: 5.0.0 - super-regex: 0.2.0 - is-nan@1.3.2: dependencies: call-bind: 1.0.8 @@ -10894,8 +10334,6 @@ snapshots: is-promise@4.0.0: {} - is-regexp@3.1.0: {} - is-stream@4.0.1: {} is-unicode-supported@2.1.0: {} @@ -10910,6 +10348,8 @@ snapshots: isexe@3.1.1: {} + isexe@4.0.0: {} + isopen@1.3.0: {} jackspeak@4.1.1: @@ -10972,6 +10412,8 @@ snapshots: '@babel/runtime': 7.28.4 ts-algebra: 2.0.0 + json-schema@0.4.0: {} + jsonfile@6.2.0: dependencies: universalify: 2.0.1 @@ -10988,6 +10430,12 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.2: {} + lit-element@4.2.1: dependencies: '@lit-labs/ssr-dom-shim': 1.4.0 @@ -11004,49 +10452,18 @@ snapshots: lit-element: 4.2.1 lit-html: 3.3.1 + lit@3.3.2: + dependencies: + '@lit/reactive-element': 2.1.1 + lit-element: 4.2.1 + lit-html: 3.3.1 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - lodash._baseassign@3.2.0: - dependencies: - lodash._basecopy: 3.0.1 - lodash.keys: 3.1.2 - - lodash._basecopy@3.0.1: {} - - lodash._bindcallback@3.0.1: {} - - lodash._createassigner@3.1.1: - dependencies: - lodash._bindcallback: 3.0.1 - lodash._isiterateecall: 3.0.9 - lodash.restparam: 3.6.1 - - lodash._getnative@3.9.1: {} - - lodash._isiterateecall@3.0.9: {} - - lodash.assign@3.2.0: - dependencies: - lodash._baseassign: 3.2.0 - lodash._createassigner: 3.1.1 - lodash.keys: 3.1.2 - lodash.clonedeep@4.5.0: {} - lodash.isarguments@3.1.0: {} - - lodash.isarray@3.0.4: {} - - lodash.keys@3.1.2: - dependencies: - lodash._getnative: 3.9.1 - lodash.isarguments: 3.1.0 - lodash.isarray: 3.0.4 - - lodash.restparam@3.6.1: {} - longest-streak@3.1.0: {} lower-case@1.1.4: {} @@ -11057,6 +10474,8 @@ snapshots: lru-cache@7.18.3: {} + lucide@0.564.0: {} + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -11067,8 +10486,19 @@ snapshots: make-error@1.3.6: {} + markdown-it@14.1.1: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + markdown-table@3.0.4: {} + marked@14.0.0: {} + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -11206,6 +10636,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdurl@2.0.0: {} + media-typer@1.1.0: {} memory-pager@1.5.0: {} @@ -11432,6 +10864,8 @@ snapshots: min-indent@1.0.1: {} + mingo@7.2.0: {} + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -11458,6 +10892,11 @@ snapshots: mitt@3.0.1: {} + monaco-editor@0.55.1: + dependencies: + dompurify: 3.2.7 + marked: 14.0.0 + mongodb-connection-string-url@2.6.0: dependencies: '@types/whatwg-url': 8.2.2 @@ -11532,8 +10971,6 @@ snapshots: nanoid@4.0.2: {} - negotiator@0.6.3: {} - negotiator@1.0.0: {} netmask@2.0.2: {} @@ -11554,9 +10991,7 @@ snapshots: dependencies: replace-buffer: 1.2.1 - normalize-url@8.0.1: {} - - object-assign@4.1.1: {} + normalize-url@8.1.1: {} object-inspect@1.13.4: {} @@ -11564,6 +10999,8 @@ snapshots: oblivious-set@1.4.0: {} + oblivious-set@2.0.0: {} + observable-fns@0.6.1: {} omggif@1.0.10: {} @@ -11582,11 +11019,13 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@6.16.0(ws@8.18.3)(zod@3.25.76): + openai@6.26.0(ws@8.19.0)(zod@3.25.76): optionalDependencies: - ws: 8.18.3 + ws: 8.19.0 zod: 3.25.76 + orderedmap@2.1.1: {} + os-tmpdir@1.0.2: {} p-cancelable@3.0.0: {} @@ -11616,7 +11055,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 get-uri: 6.0.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -11635,9 +11074,9 @@ snapshots: package-json@8.1.1: dependencies: got: 12.6.1 - registry-auth-token: 5.1.0 + registry-auth-token: 5.1.1 registry-url: 6.0.1 - semver: 7.7.3 + semver: 7.7.4 pako@1.0.11: {} @@ -11684,8 +11123,6 @@ snapshots: lru-cache: 11.2.2 minipass: 7.1.2 - path-to-regexp@8.2.0: {} - path-to-regexp@8.3.0: {} pdf-lib@1.17.1: @@ -11697,6 +11134,12 @@ snapshots: pdf2json@3.2.0: {} + pdf2json@4.0.2: {} + + pdfjs-dist@4.10.38: + optionalDependencies: + '@napi-rs/canvas': 0.1.95 + peek-readable@4.1.0: {} peek-readable@5.4.2: {} @@ -11733,12 +11176,119 @@ snapshots: dependencies: parse-ms: 4.0.0 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + process@0.11.10: {} progress@2.0.3: {} property-information@7.1.0: {} + prosemirror-changeset@2.4.0: + dependencies: + prosemirror-transform: 1.11.0 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.4 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-gapcursor@1.4.0: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.6 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.4: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.1 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.3.0: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-tables@1.8.5: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.6 + + prosemirror-transform@1.11.0: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-view@1.41.6: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.11.0 + proto-list@1.2.4: {} proxy-addr@2.0.7: @@ -11749,7 +11299,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -11761,17 +11311,13 @@ snapshots: proxy-from-env@1.1.0: {} - public-ip@7.0.1: - dependencies: - dns-socket: 4.2.2 - got: 13.0.0 - is-ip: 5.0.1 - pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + punycode.js@2.3.1: {} + punycode@1.4.1: {} punycode@2.3.1: {} @@ -11780,10 +11326,10 @@ snapshots: dependencies: '@puppeteer/browsers': 2.7.1 chromium-bidi: 2.0.0(devtools-protocol@0.0.1402036) - debug: 4.4.0 + debug: 4.4.3 devtools-protocol: 0.0.1402036 typed-query-selector: 2.12.0 - ws: 8.18.1 + ws: 8.18.3 transitivePeerDependencies: - bare-buffer - bufferutil @@ -11815,6 +11361,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.15.0: + dependencies: + side-channel: 1.1.0 + quick-lru@5.1.1: {} randomatic@3.1.1: @@ -11832,6 +11382,13 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -11857,15 +11414,15 @@ snapshots: dependencies: readable-stream: 4.7.0 - readdirp@4.1.2: {} + readdirp@5.0.0: {} reflect-metadata@0.2.2: {} regenerator-runtime@0.14.1: {} - registry-auth-token@5.1.0: + registry-auth-token@5.1.1: dependencies: - '@pnpm/npm-conf': 2.3.1 + '@pnpm/npm-conf': 3.0.2 registry-url@6.0.1: dependencies: @@ -11954,13 +11511,15 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.52 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.52 + rope-sequence@1.3.4: {} + router@2.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color @@ -11978,15 +11537,13 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} - - semver@7.7.2: {} - semver@7.7.3: {} + semver@7.7.4: {} + send@1.2.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -12024,7 +11581,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.4 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.3 '@img/sharp-darwin-x64': 0.34.3 @@ -12095,51 +11652,10 @@ snapshots: smart-buffer@4.2.0: {} - socket.io-adapter@2.5.5: - dependencies: - debug: 4.3.7 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-client@4.8.1: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-client: 6.6.3 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@4.2.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - socket.io@4.8.1: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.5 - debug: 4.3.7 - engine.io: 6.6.4 - socket.io-adapter: 2.5.5 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 socks: 2.8.4 transitivePeerDependencies: - supports-color @@ -12181,6 +11697,15 @@ snapshots: optionalDependencies: bare-events: 2.5.4 + streamx@2.23.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -12216,8 +11741,6 @@ snapshots: strip-json-comments@2.0.1: {} - strnum@1.1.1: {} - strnum@1.1.2: {} strnum@2.1.1: {} @@ -12236,20 +11759,12 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.4.2 - super-regex@0.2.0: - dependencies: - clone-regexp: 3.0.0 - function-timeout: 0.1.1 - time-span: 5.1.0 - sweet-scroll@4.0.0: {} symbol-tree@3.2.4: {} systeminformation@5.27.11: {} - systeminformation@5.27.7: {} - tar-fs@3.0.8: dependencies: pump: 3.0.2 @@ -12266,10 +11781,34 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.22.0 + tar-stream@3.1.8: + dependencies: + b4a: 1.8.0 + bare-fs: 4.5.5 + fast-fifo: 1.3.2 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + teex@1.0.1: + dependencies: + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + text-decoder@1.2.3: dependencies: b4a: 1.6.7 + text-decoder@1.2.7: + dependencies: + b4a: 1.8.0 + transitivePeerDependencies: + - react-native-b4a + threads@1.7.0: dependencies: callsites: 3.1.0 @@ -12285,12 +11824,6 @@ snapshots: dependencies: readable-stream: 3.6.2 - through@2.3.8: {} - - time-span@5.1.0: - dependencies: - convert-hrtime: 5.0.0 - tiny-worker@2.3.0: dependencies: esm: 3.2.25 @@ -12314,6 +11847,12 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.1 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + tr46@3.0.0: dependencies: punycode: 2.3.1 @@ -12355,8 +11894,6 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.35.0: {} - type-fest@4.41.0: {} type-is@2.0.1: @@ -12369,6 +11906,8 @@ snapshots: typescript@5.9.3: {} + uc.micro@2.1.0: {} + uglify-js@3.19.3: {} uint8array-extras@1.4.0: {} @@ -12377,7 +11916,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} + undici-types@7.18.2: {} unified@11.0.5: dependencies: @@ -12445,6 +11984,8 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + w3c-keyname@2.2.8: {} + webidl-conversions@7.0.0: {} whatwg-mimetype@3.0.0: {} @@ -12467,6 +12008,10 @@ snapshots: dependencies: isexe: 3.1.1 + which@6.0.1: + dependencies: + isexe: 4.0.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -12487,12 +12032,10 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.1: {} - - ws@8.18.1: {} - ws@8.18.3: {} + ws@8.19.0: {} + xml-parse-from-string@1.0.1: {} xml2js@0.5.0: @@ -12502,7 +12045,11 @@ snapshots: xmlbuilder@11.0.1: {} - xmlhttprequest-ssl@2.1.2: {} + xterm-addon-fit@0.8.0(xterm@5.3.0): + dependencies: + xterm: 5.3.0 + + xterm@5.3.0: {} y18n@5.0.8: {} @@ -12534,12 +12081,6 @@ snapshots: yoctocolors-cjs@2.1.3: {} - zod-to-json-schema@3.25.1(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod@3.24.2: {} - zod@3.25.76: {} zwitch@2.0.4: {} diff --git a/readme.hints.md b/readme.hints.md index 5515b1c..91ae02d 100644 --- a/readme.hints.md +++ b/readme.hints.md @@ -1,104 +1,50 @@ # SmartAI Project Hints +## Architecture (v1.0.0 - Vercel AI SDK rewrite) + +The package is a **provider registry** built on the Vercel AI SDK (`ai` v6). The core export returns a `LanguageModelV3` from `@ai-sdk/provider`. Specialized capabilities are in subpath exports. + +### Core Entry (`ts/`) +- `getModel(options)` → returns `LanguageModelV3` for any supported provider +- 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) + +### Subpath Exports +- `@push.rocks/smartai/vision` — `analyzeImage()` using `generateText` with image content +- `@push.rocks/smartai/audio` — `textToSpeech()` using OpenAI SDK directly +- `@push.rocks/smartai/image` — `generateImage()`, `editImage()` using OpenAI SDK directly +- `@push.rocks/smartai/document` — `analyzeDocuments()` using SmartPdf + `generateText` +- `@push.rocks/smartai/research` — `research()` using `@anthropic-ai/sdk` web_search tool + ## Dependencies -- Uses `@git.zone/tstest` v3.x for testing (import from `@git.zone/tstest/tapbundle`) -- `@push.rocks/smartfs` v1.x for file system operations -- `@anthropic-ai/sdk` v0.71.x with extended thinking support -- `@mistralai/mistralai` v1.x for Mistral OCR and chat capabilities -- `openai` v6.x for OpenAI API integration -- `@push.rocks/smartrequest` v5.x - uses `response.stream()` + `Readable.fromWeb()` for streaming +- `ai` ^6.0.116 — Vercel AI SDK core +- `@ai-sdk/*` — Provider packages (anthropic, openai, google, groq, mistral, xai, perplexity) +- `@ai-sdk/provider` ^3.0.8 — LanguageModelV3 types +- `@anthropic-ai/sdk` ^0.78.0 — Direct SDK for research (web search tool) +- `openai` ^6.25.0 — Direct SDK for audio TTS and image generation/editing +- `@push.rocks/smartpdf` ^4.1.3 — PDF to PNG conversion for document analysis + +## Build + +- `pnpm build` → `tsbuild tsfolders --allowimplicitany` +- Compiles: ts/, ts_vision/, ts_audio/, ts_image/, ts_document/, ts_research/ ## Important Notes -- When extended thinking is enabled, temperature parameter must NOT be set (or set to 1) -- The `streamNode()` method was removed in smartrequest v5, use `response.stream()` with `Readable.fromWeb()` instead - -## Provider Capabilities Summary - -| Provider | Chat | Stream | TTS | Vision | Documents | Research | Images | -|--------------|------|--------|-----|--------|-----------|----------|--------| -| OpenAI | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| Anthropic | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | -| Mistral | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | -| ElevenLabs | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Ollama | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | -| XAI | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | -| Perplexity | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | -| Groq | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | -| Exo | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | - -## Mistral Provider Integration - -### Overview - -The Mistral provider supports: -- **Document AI** via Mistral OCR (December 2025) - native PDF processing without image conversion -- **Chat capabilities** using Mistral's chat models (`mistral-large-latest`, etc.) - -### Key Advantage: Native PDF Support - -Unlike other providers that require converting PDFs to images (using SmartPdf), Mistral OCR natively accepts PDF documents as base64-encoded data. This makes document processing potentially faster and more accurate for text extraction. - -### Configuration - -```typescript -import * as smartai from '@push.rocks/smartai'; - -const provider = new smartai.MistralProvider({ - mistralToken: 'your-token-here', - chatModel: 'mistral-large-latest', // default - ocrModel: 'mistral-ocr-latest', // default - tableFormat: 'markdown', // 'markdown' or 'html' -}); - -await provider.start(); -``` - -### API Key - -Tests require `MISTRAL_API_KEY` in `.nogit/env.json`. - -## Anthropic Extended Thinking Feature - -### Configuration - -Extended thinking is configured at the provider level during instantiation: - -```typescript -import * as smartai from '@push.rocks/smartai'; - -const provider = new smartai.AnthropicProvider({ - anthropicToken: 'your-token-here', - extendedThinking: 'normal', // Options: 'quick' | 'normal' | 'deep' | 'off' -}); -``` - -### Thinking Modes - -| Mode | Budget Tokens | Use Case | -| ---------- | ------------- | ----------------------------------------------- | -| `'quick'` | 2,048 | Lightweight reasoning for simple queries | -| `'normal'` | 8,000 | **Default** - Balanced reasoning for most tasks | -| `'deep'` | 16,000 | Complex reasoning for difficult problems | -| `'off'` | 0 | Disable extended thinking | - -### Implementation Details - -- Extended thinking is implemented via `getThinkingConfig()` private method -- When thinking is enabled, temperature must NOT be set -- Uses `claude-sonnet-4-5-20250929` model +- LanguageModelV3 uses `unified`/`raw` in FinishReason (not `type`/`rawType`) +- LanguageModelV3 system messages have `content: string` (not array) +- LanguageModelV3 file parts use `mediaType` (not `mimeType`) +- LanguageModelV3FunctionTool uses `inputSchema` (not `parameters`) +- Ollama `think` param goes at request body top level, not inside `options` +- Qwen models get default temperature 0.55 in the custom Ollama provider +- `qenv.getEnvVarOnDemand()` returns a Promise — must be awaited in tests ## Testing -Run tests with: - ```bash -pnpm test -``` - -Run specific tests: - -```bash -npx tstest test/test.something.ts --verbose +pnpm test # all tests +tstest test/test.smartai.ts --verbose # core tests +tstest test/test.ollama.ts --verbose # ollama provider tests (mocked, no API needed) ``` diff --git a/readme.md b/readme.md index 8e13301..da68b9d 100644 --- a/readme.md +++ b/readme.md @@ -1,12 +1,12 @@ # @push.rocks/smartai -**One API to rule them all** 🚀 +**A unified provider registry for the Vercel AI SDK** 🧠⚡ [![npm version](https://img.shields.io/npm/v/@push.rocks/smartai.svg)](https://www.npmjs.com/package/@push.rocks/smartai) [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue.svg)](https://www.typescriptlang.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -SmartAI unifies the world's leading AI providers — OpenAI, Anthropic, Mistral, Perplexity, Ollama, Groq, XAI, Exo, and ElevenLabs — under a single, elegant TypeScript interface. Build AI applications at lightning speed without vendor lock-in. +SmartAI gives you a single `getModel()` function that returns a standard `LanguageModelV3` for **any** supported provider — Anthropic, OpenAI, Google, Groq, Mistral, XAI, Perplexity, or Ollama. Use the returned model with the Vercel AI SDK's `generateText()`, `streamText()`, and tool ecosystem. Specialized capabilities like vision, audio, image generation, document analysis, and web research are available as dedicated subpath imports. ## Issue Reporting and Security @@ -14,679 +14,416 @@ For reporting bugs, issues, or security vulnerabilities, please visit [community ## 🎯 Why SmartAI? -- **🔌 Universal Interface**: Write once, run with any AI provider. Switch between GPT-5, Claude, Llama, or Grok with a single line change. -- **🛡️ Type-Safe**: Full TypeScript support with comprehensive type definitions for all operations. -- **🌊 Streaming First**: Built for real-time applications with native streaming support. -- **🎨 Multi-Modal**: Seamlessly work with text, images, audio, and documents. -- **🏠 Local & Cloud**: Support for both cloud providers and local models via Ollama/Exo. -- **⚡ Zero Lock-In**: Your code remains portable across all AI providers. +- **🔌 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`. +- **📦 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. ## 📦 Installation ```bash -npm install @push.rocks/smartai -# or pnpm install @push.rocks/smartai ``` ## 🚀 Quick Start ```typescript -import { SmartAi } from '@push.rocks/smartai'; +import { getModel, generateText, streamText } from '@push.rocks/smartai'; -// Initialize with your favorite providers -const ai = new SmartAi({ - openaiToken: 'sk-...', - anthropicToken: 'sk-ant-...', - elevenlabsToken: 'sk-...', - elevenlabs: { - defaultVoiceId: '19STyYD15bswVz51nqLf', // Optional: Samara voice - }, +// Get a model for any provider +const model = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey: process.env.ANTHROPIC_TOKEN, }); -await ai.start(); - -// Same API, multiple providers -const response = await ai.openaiProvider.chat({ - systemMessage: 'You are a helpful assistant.', - userMessage: 'Explain quantum computing in simple terms', - messageHistory: [], +// Use it with the standard AI SDK functions +const result = await generateText({ + model, + prompt: 'Explain quantum computing in simple terms.', }); -console.log(response.message); +console.log(result.text); ``` -## 📊 Provider Capabilities Matrix +That's it. Change `provider` to `'openai'` and `model` to `'gpt-4o'` and the rest of your code stays exactly the same. -Choose the right provider for your use case: +## 🔧 Core API -| Provider | Chat | Streaming | TTS | Vision | Documents | Research | Images | Highlights | -| -------------- | :--: | :-------: | :-: | :----: | :-------: | :------: | :----: | --------------------------------------------------------------- | -| **OpenAI** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | gpt-image-1 • DALL-E 3 • Deep Research API | -| **Anthropic** | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | Claude Sonnet 4.5 • Extended Thinking • Web Search API | -| **Mistral** | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | Native PDF OCR • mistral-large • Fast inference | -| **ElevenLabs** | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | Premium TTS • 70+ languages • v3 model | -| **Ollama** | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | 100% local • Privacy-first • No API costs | -| **XAI** | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | Grok 2 • Real-time data | -| **Perplexity** | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | Web-aware • Research-focused • Sonar Pro | -| **Groq** | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | 10x faster • LPU inference • Llama 3.3 | -| **Exo** | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | Distributed • P2P compute • Decentralized | +### `getModel(options): LanguageModelV3` -## 🎮 Core Features - -### 💬 Universal Chat Interface - -Works identically across all providers: +The primary export. Returns a standard `LanguageModelV3` you can use with any AI SDK function. ```typescript -// Use GPT-5 for complex reasoning -const gptResponse = await ai.openaiProvider.chat({ - systemMessage: 'You are an expert physicist.', - userMessage: 'Explain the implications of quantum entanglement', - messageHistory: [], -}); +import { getModel } from '@push.rocks/smartai'; +import type { ISmartAiOptions } from '@push.rocks/smartai'; -// Use Claude for safety-critical applications -const claudeResponse = await ai.anthropicProvider.chat({ - systemMessage: 'You are a medical advisor.', - userMessage: 'Review this patient data for concerns', - messageHistory: [], -}); +const options: ISmartAiOptions = { + provider: 'anthropic', // 'anthropic' | 'openai' | 'google' | 'groq' | 'mistral' | 'xai' | 'perplexity' | 'ollama' + model: 'claude-sonnet-4-5-20250929', + apiKey: 'sk-ant-...', + // Anthropic-only: prompt caching (default: true) + promptCaching: true, + // Ollama-only: base URL (default: http://localhost:11434) + baseUrl: 'http://localhost:11434', + // Ollama-only: model runtime options + ollamaOptions: { think: true, num_ctx: 4096 }, +}; -// Use Groq for lightning-fast responses -const groqResponse = await ai.groqProvider.chat({ - systemMessage: 'You are a code reviewer.', - userMessage: 'Quick! Find the bug in this code: ...', - messageHistory: [], -}); +const model = getModel(options); ``` -### 🌊 Real-Time Streaming +### Re-exported AI SDK Functions -Build responsive chat interfaces with token-by-token streaming: +SmartAI re-exports the most commonly used functions from `ai` for convenience: ```typescript -// Create a chat stream -const stream = await ai.openaiProvider.chatStream(inputStream); -const reader = stream.getReader(); +import { + getModel, + generateText, + streamText, + tool, + jsonSchema, +} from '@push.rocks/smartai'; -// Display responses as they arrive -while (true) { - const { done, value } = await reader.read(); - if (done) break; +import type { + ModelMessage, + ToolSet, + StreamTextResult, + LanguageModelV3, +} from '@push.rocks/smartai'; +``` - // Update UI in real-time - process.stdout.write(value); +## 🤖 Supported Providers + +| Provider | Package | Example Models | +|----------|---------|----------------| +| **Anthropic** | `@ai-sdk/anthropic` | `claude-sonnet-4-5-20250929`, `claude-opus-4-5-20250929` | +| **OpenAI** | `@ai-sdk/openai` | `gpt-4o`, `gpt-4o-mini`, `o3-mini` | +| **Google** | `@ai-sdk/google` | `gemini-2.0-flash`, `gemini-2.5-pro` | +| **Groq** | `@ai-sdk/groq` | `llama-3.3-70b-versatile`, `mixtral-8x7b-32768` | +| **Mistral** | `@ai-sdk/mistral` | `mistral-large-latest`, `mistral-small-latest` | +| **XAI** | `@ai-sdk/xai` | `grok-3`, `grok-3-mini` | +| **Perplexity** | `@ai-sdk/perplexity` | `sonar-pro`, `sonar` | +| **Ollama** | Custom `LanguageModelV3` | `qwen3:8b`, `llama3:8b`, `deepseek-r1` | + +## 💬 Text Generation + +### Generate Text + +```typescript +import { getModel, generateText } from '@push.rocks/smartai'; + +const model = getModel({ + provider: 'openai', + model: 'gpt-4o', + apiKey: process.env.OPENAI_TOKEN, +}); + +const result = await generateText({ + model, + system: 'You are a helpful assistant.', + prompt: 'What is 2 + 2?', +}); + +console.log(result.text); // "4" +``` + +### Stream Text + +```typescript +import { getModel, streamText } from '@push.rocks/smartai'; + +const model = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey: process.env.ANTHROPIC_TOKEN, +}); + +const result = await streamText({ + model, + prompt: 'Count from 1 to 10.', +}); + +for await (const chunk of result.textStream) { + process.stdout.write(chunk); } ``` -### 🎙️ Text-to-Speech - -Generate natural voices with OpenAI or ElevenLabs: +### Tool Calling ```typescript -// OpenAI TTS -const audioStream = await ai.openaiProvider.audio({ - message: 'Welcome to the future of AI development!', +import { getModel, generateText, tool, jsonSchema } from '@push.rocks/smartai'; + +const model = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey: process.env.ANTHROPIC_TOKEN, }); -// ElevenLabs TTS - Premium quality, natural voices (uses v3 by default) -const elevenLabsAudio = await ai.elevenlabsProvider.audio({ - message: 'Experience the most lifelike text to speech technology.', - voiceId: '19STyYD15bswVz51nqLf', // Optional: Samara voice - modelId: 'eleven_v3', // Optional: defaults to eleven_v3 (70+ languages) - voiceSettings: { - // Optional: fine-tune voice characteristics - stability: 0.5, // 0-1: Speech consistency - similarity_boost: 0.8, // 0-1: Voice similarity to original - style: 0.0, // 0-1: Expressiveness - use_speaker_boost: true, // Enhanced clarity +const result = await generateText({ + model, + prompt: 'What is the weather in London?', + tools: { + getWeather: tool({ + description: 'Get weather for a location', + parameters: jsonSchema({ + type: 'object', + properties: { + location: { type: 'string' }, + }, + required: ['location'], + }), + execute: async ({ location }) => { + return { temperature: 18, condition: 'cloudy' }; + }, + }), + }, +}); +``` + +## 🏠 Ollama (Local Models) + +The custom Ollama provider implements `LanguageModelV3` directly, calling Ollama's native `/api/chat` endpoint. This gives you features that generic OpenAI-compatible wrappers miss: + +```typescript +import { getModel, generateText } from '@push.rocks/smartai'; + +const model = getModel({ + provider: 'ollama', + model: 'qwen3:8b', + baseUrl: 'http://localhost:11434', // default + ollamaOptions: { + think: true, // Enable thinking/reasoning mode + num_ctx: 8192, // Context window size + temperature: 0.7, // Override default (Qwen models auto-default to 0.55) }, }); -// Stream directly to speakers or save to file -audioStream.pipe(fs.createWriteStream('welcome.mp3')); +const result = await generateText({ + model, + prompt: 'Solve this step by step: what is 15% of 340?', +}); + +console.log(result.text); ``` -### 👁️ Vision Analysis +### Ollama Features -Understand images with multiple providers: +- **`think` mode** — Enables reasoning for models that support it (Qwen3, QwQ, DeepSeek-R1). The `think` parameter is sent at the top level of the request body as required by the Ollama API. +- **Auto-tuned temperature** — Qwen models automatically get `temperature: 0.55` when no explicit temperature is set, matching the recommended inference setting. +- **Native tool calling** — Full tool call support via Ollama's native format (not shimmed through OpenAI-compatible endpoints). +- **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 + +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. ```typescript -const image = fs.readFileSync('product-photo.jpg'); - -// OpenAI: General purpose vision -const gptVision = await ai.openaiProvider.vision({ - image, - prompt: 'Describe this product and suggest marketing angles', +// Caching enabled by default +const model = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey: process.env.ANTHROPIC_TOKEN, }); -// Anthropic: Detailed analysis with extended thinking -const claudeVision = await ai.anthropicProvider.vision({ - image, - prompt: 'Identify any safety concerns or defects', -}); - -// Ollama: Private, local analysis -const ollamaVision = await ai.ollamaProvider.vision({ - image, - prompt: 'Extract all text and categorize the content', +// Opt out of caching +const modelNoCaching = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey: process.env.ANTHROPIC_TOKEN, + promptCaching: false, }); ``` -### 📄 Document Intelligence - -Extract insights from PDFs with AI: +You can also use the middleware directly: ```typescript -const contract = fs.readFileSync('contract.pdf'); -const invoice = fs.readFileSync('invoice.pdf'); +import { createAnthropicCachingMiddleware } from '@push.rocks/smartai'; +import { wrapLanguageModel } from 'ai'; -// Analyze documents with OpenAI -const analysis = await ai.openaiProvider.document({ - systemMessage: 'You are a legal expert.', - userMessage: 'Compare these documents and highlight key differences', - messageHistory: [], - pdfDocuments: [contract, invoice], -}); - -// Multi-document analysis with Anthropic -const taxDocs = [form1099, w2, receipts]; -const taxAnalysis = await ai.anthropicProvider.document({ - systemMessage: 'You are a tax advisor.', - userMessage: 'Prepare a tax summary from these documents', - messageHistory: [], - pdfDocuments: taxDocs, -}); +const middleware = createAnthropicCachingMiddleware(); +const cachedModel = wrapLanguageModel({ model: baseModel, middleware }); ``` -### 🔬 Research & Web Search +## 📦 Subpath Exports -Perform deep research with web search capabilities across multiple providers: +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. + +### 👁️ Vision — `@push.rocks/smartai/vision` + +Analyze images using any vision-capable model. ```typescript -// OpenAI Deep Research - Comprehensive analysis -const deepResearch = await ai.openaiProvider.research({ - query: 'What are the latest developments in quantum computing?', - searchDepth: 'deep', - includeWebSearch: true, +import { analyzeImage } from '@push.rocks/smartai/vision'; +import { getModel } from '@push.rocks/smartai'; +import * as fs from 'fs'; + +const model = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey: process.env.ANTHROPIC_TOKEN, }); -console.log(deepResearch.answer); -console.log('Sources:', deepResearch.sources); - -// Anthropic Web Search - Domain-filtered research -import { AnthropicProvider } from '@push.rocks/smartai'; - -const anthropic = new AnthropicProvider({ - anthropicToken: 'sk-ant-...', - enableWebSearch: true, - searchDomainAllowList: ['nature.com', 'science.org'], +const description = await analyzeImage({ + model, + image: fs.readFileSync('photo.jpg'), + prompt: 'Describe this image in detail.', + mediaType: 'image/jpeg', // optional, defaults to 'image/jpeg' }); -const scientificResearch = await anthropic.research({ - query: 'Latest breakthroughs in CRISPR gene editing', - searchDepth: 'advanced', -}); - -// Perplexity - Research-focused with citations -const perplexityResearch = await ai.perplexityProvider.research({ - query: 'Current state of autonomous vehicle technology', - searchDepth: 'deep', // Uses Sonar Pro model -}); +console.log(description); ``` -**Research Options:** +**`analyzeImage(options)`** accepts: +- `model` — Any `LanguageModelV3` with vision support +- `image` — `Buffer` or `Uint8Array` +- `prompt` — What to ask about the image +- `mediaType` — `'image/jpeg'` | `'image/png'` | `'image/webp'` | `'image/gif'` -- `searchDepth`: `'basic'` | `'advanced'` | `'deep'` -- `maxSources`: Number of sources to include -- `includeWebSearch`: Enable web search (OpenAI) -- `background`: Run as background task (OpenAI) +### 🎙️ Audio — `@push.rocks/smartai/audio` -**Supported Providers:** - -- **OpenAI**: Deep Research API with specialized models (`o3-deep-research-*`, `o4-mini-deep-research-*`) -- **Anthropic**: Web Search API with domain filtering -- **Perplexity**: Sonar and Sonar Pro models with built-in citations - -### 🧠 Extended Thinking (Anthropic) - -Enable Claude to spend more time reasoning about complex problems before generating responses: +Text-to-speech using OpenAI's TTS models. ```typescript -import { AnthropicProvider } from '@push.rocks/smartai'; +import { textToSpeech } from '@push.rocks/smartai/audio'; +import * as fs from 'fs'; -// Configure extended thinking mode at provider level -const anthropic = new AnthropicProvider({ - anthropicToken: 'sk-ant-...', - extendedThinking: 'normal', // Options: 'quick' | 'normal' | 'deep' | 'off' +const stream = await textToSpeech({ + apiKey: process.env.OPENAI_TOKEN, + text: 'Welcome to the future of AI development!', + voice: 'nova', // 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer' + model: 'tts-1-hd', // 'tts-1' | 'tts-1-hd' + responseFormat: 'mp3', // 'mp3' | 'opus' | 'aac' | 'flac' + speed: 1.0, // 0.25 to 4.0 }); -await anthropic.start(); - -// Extended thinking is automatically applied to all methods -const response = await anthropic.chat({ - systemMessage: 'You are an expert mathematician.', - userMessage: 'Prove the Pythagorean theorem from first principles', - messageHistory: [], -}); +stream.pipe(fs.createWriteStream('welcome.mp3')); ``` -**Thinking Modes:** +### 🎨 Image — `@push.rocks/smartai/image` -| Mode | Budget Tokens | Use Case | -| ---------- | ------------- | ------------------------------------------------ | -| `'quick'` | 2,048 | Lightweight reasoning for simple queries | -| `'normal'` | 8,000 | **Default** — Balanced reasoning for most tasks | -| `'deep'` | 16,000 | Complex reasoning for difficult problems | -| `'off'` | 0 | Disable extended thinking | - -**Best Practices:** - -- Start with `'normal'` (default) for general usage -- Use `'deep'` for complex analytical tasks, philosophy, mathematics, or research -- Use `'quick'` for simple factual queries where deep reasoning isn't needed -- Thinking budget counts against total token usage - -### 📑 Native PDF OCR (Mistral) - -Mistral provides native PDF document processing via their OCR API — no image conversion required: +Generate and edit images using OpenAI's image models. ```typescript -import { MistralProvider } from '@push.rocks/smartai'; +import { generateImage, editImage } from '@push.rocks/smartai/image'; -const mistral = new MistralProvider({ - mistralToken: 'your-api-key', - chatModel: 'mistral-large-latest', // Default - ocrModel: 'mistral-ocr-latest', // Default - tableFormat: 'markdown', // 'markdown' | 'html' -}); - -await mistral.start(); - -// Direct PDF processing - no image conversion overhead -const result = await mistral.document({ - systemMessage: 'You are a document analyst.', - userMessage: 'Extract all invoice details and calculate the total.', - pdfDocuments: [invoicePdfBuffer], - messageHistory: [], -}); -``` - -**Key Advantage**: Unlike other providers that convert PDFs to images first, Mistral's OCR API processes PDFs natively, potentially offering faster and more accurate text extraction for document-heavy workloads. - -**Supported Formats:** - -- Native PDF processing via Files API -- Image OCR (JPEG, PNG, GIF, WebP) for vision tasks -- Table extraction with markdown or HTML output - -### 🎨 Image Generation & Editing - -Generate and edit images with OpenAI's cutting-edge models: - -```typescript -// Basic image generation with gpt-image-1 -const image = await ai.openaiProvider.imageGenerate({ - prompt: 'A futuristic robot assistant in a modern office, digital art', - model: 'gpt-image-1', - quality: 'high', +// Generate an image +const result = await generateImage({ + apiKey: process.env.OPENAI_TOKEN, + prompt: 'A futuristic cityscape at sunset, digital art', + model: 'gpt-image-1', // 'gpt-image-1' | 'dall-e-3' | 'dall-e-2' + quality: 'high', // 'low' | 'medium' | 'high' | 'auto' size: '1024x1024', + background: 'transparent', // gpt-image-1 only + outputFormat: 'png', // 'png' | 'jpeg' | 'webp' + n: 1, }); -// Save the generated image -const imageBuffer = Buffer.from(image.images[0].b64_json!, 'base64'); -fs.writeFileSync('robot.png', imageBuffer); - -// Advanced: Transparent background with custom format -const logo = await ai.openaiProvider.imageGenerate({ - prompt: 'Minimalist mountain peak logo, geometric design', - model: 'gpt-image-1', - quality: 'high', - size: '1024x1024', - background: 'transparent', - outputFormat: 'png', -}); - -// WebP with compression for web use -const webImage = await ai.openaiProvider.imageGenerate({ - prompt: 'Product showcase: sleek smartphone on marble surface', - model: 'gpt-image-1', - quality: 'high', - size: '1536x1024', - outputFormat: 'webp', - outputCompression: 85, -}); - -// Superior text rendering (gpt-image-1's strength) -const signage = await ai.openaiProvider.imageGenerate({ - prompt: - 'Vintage cafe sign saying "COFFEE & CODE" in hand-lettered typography', - model: 'gpt-image-1', - quality: 'high', - size: '1024x1024', -}); - -// Generate multiple variations at once -const variations = await ai.openaiProvider.imageGenerate({ - prompt: 'Abstract geometric pattern, colorful minimalist art', - model: 'gpt-image-1', - n: 3, - quality: 'medium', - size: '1024x1024', -}); +// result.images[0].b64_json — base64-encoded image data +const imageBuffer = Buffer.from(result.images[0].b64_json!, 'base64'); // Edit an existing image -const editedImage = await ai.openaiProvider.imageEdit({ - image: originalImageBuffer, - prompt: 'Add sunglasses and change the background to a beach sunset', +const edited = await editImage({ + apiKey: process.env.OPENAI_TOKEN, + image: imageBuffer, + prompt: 'Add a rainbow in the sky', model: 'gpt-image-1', - quality: 'high', }); ``` -**Image Generation Options:** +### 📄 Document — `@push.rocks/smartai/document` -- `model`: `'gpt-image-1'` | `'dall-e-3'` | `'dall-e-2'` -- `quality`: `'low'` | `'medium'` | `'high'` | `'auto'` -- `size`: Multiple aspect ratios up to 4096×4096 -- `background`: `'transparent'` | `'opaque'` | `'auto'` -- `outputFormat`: `'png'` | `'jpeg'` | `'webp'` -- `outputCompression`: 0–100 for webp/jpeg -- `moderation`: `'low'` | `'auto'` -- `n`: Number of images (1–10) - -**gpt-image-1 Advantages:** - -- Superior text rendering in images -- Up to 4096×4096 resolution -- Transparent background support -- Advanced output formats (WebP with compression) -- Better prompt understanding -- Streaming support for progressive rendering - -### 🔄 Persistent Conversations - -Maintain context across interactions: +Analyze PDF documents by converting them to images and using a vision model. Uses `@push.rocks/smartpdf` for PDF-to-PNG conversion (requires Chromium/Puppeteer). ```typescript -// Create a coding assistant conversation -const assistant = ai.createConversation('openai'); -await assistant.setSystemMessage('You are an expert TypeScript developer.'); +import { analyzeDocuments, stopSmartpdf } from '@push.rocks/smartai/document'; +import { getModel } from '@push.rocks/smartai'; +import * as fs from 'fs'; -// First question -const inputWriter = assistant.getInputStreamWriter(); -await inputWriter.write('How do I implement a singleton pattern?'); - -// Continue the conversation -await inputWriter.write('Now show me how to make it thread-safe'); - -// The assistant remembers the entire context -``` - -## 🚀 Real-World Examples - -### Build a Customer Support Bot - -```typescript -const supportBot = new SmartAi({ - anthropicToken: process.env.ANTHROPIC_KEY, // Claude for empathetic responses +const model = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey: process.env.ANTHROPIC_TOKEN, }); -async function handleCustomerQuery(query: string, history: ChatMessage[]) { - try { - const response = await supportBot.anthropicProvider.chat({ - systemMessage: `You are a helpful customer support agent. - Be empathetic, professional, and solution-oriented.`, - userMessage: query, - messageHistory: history, - }); - - return response.message; - } catch (error) { - // Fallback to another provider if needed - return await supportBot.openaiProvider.chat({ /* ... */ }); - } -} -``` - -### Create a Code Review Assistant - -```typescript -const codeReviewer = new SmartAi({ - groqToken: process.env.GROQ_KEY, // Groq for speed +const analysis = await analyzeDocuments({ + model, + systemMessage: 'You are a legal document analyst.', + userMessage: 'Summarize the key terms and conditions.', + pdfDocuments: [fs.readFileSync('contract.pdf')], + messageHistory: [], // optional: prior conversation context }); -async function reviewCode(code: string, language: string) { - const review = await codeReviewer.groqProvider.chat({ - systemMessage: `You are a ${language} expert. Review code for: - - Security vulnerabilities - - Performance issues - - Best practices - - Potential bugs`, - userMessage: `Review this code:\n\n${code}`, - messageHistory: [], - }); +console.log(analysis); - return review.message; -} +// Clean up the SmartPdf instance when done +await stopSmartpdf(); ``` -### Build a Research Assistant +### 🔬 Research — `@push.rocks/smartai/research` + +Perform web-search-powered research using Anthropic's `web_search_20250305` tool. ```typescript -const researcher = new SmartAi({ - perplexityToken: process.env.PERPLEXITY_KEY, +import { research } from '@push.rocks/smartai/research'; + +const result = await research({ + apiKey: process.env.ANTHROPIC_TOKEN, + query: 'What are the latest developments in quantum computing?', + searchDepth: 'basic', // 'basic' | 'advanced' | 'deep' + maxSources: 10, // optional: limit number of search results + allowedDomains: ['nature.com', 'arxiv.org'], // optional: restrict to domains + blockedDomains: ['reddit.com'], // optional: exclude domains }); -async function research(topic: string) { - // Perplexity excels at web-aware research - const findings = await researcher.perplexityProvider.research({ - query: `Research the latest developments in ${topic}`, - searchDepth: 'deep', - }); - - return { - answer: findings.answer, - sources: findings.sources, - }; -} +console.log(result.answer); +console.log('Sources:', result.sources); // Array<{ url, title, snippet }> +console.log('Queries:', result.searchQueries); // search queries the model used ``` -### Local AI for Sensitive Data +## 🧪 Testing -```typescript -const localAI = new SmartAi({ - ollama: { - baseUrl: 'http://localhost:11434', - model: 'llama2', - visionModel: 'llava', - }, -}); +```bash +# All tests +pnpm test -// Process sensitive documents without leaving your infrastructure -async function analyzeSensitiveDoc(pdfBuffer: Buffer) { - const analysis = await localAI.ollamaProvider.document({ - systemMessage: 'Extract and summarize key information.', - userMessage: 'Analyze this confidential document', - messageHistory: [], - pdfDocuments: [pdfBuffer], - }); - - // Data never leaves your servers - return analysis.message; -} +# Individual test files +tstest test/test.smartai.ts --verbose # Core getModel + generateText + streamText +tstest test/test.ollama.ts --verbose # Ollama provider (mocked, no API needed) +tstest test/test.vision.ts --verbose # Vision analysis +tstest test/test.image.ts --verbose # Image generation +tstest test/test.research.ts --verbose # Web research +tstest test/test.audio.ts --verbose # Text-to-speech +tstest test/test.document.ts --verbose # Document analysis (needs Chromium) ``` -## ⚡ Performance Tips +Most tests skip gracefully when API keys are not set. The Ollama tests are fully mocked and require no external services. -### 1. Provider Selection Strategy +## 📐 Architecture -```typescript -class SmartAIRouter { - constructor(private ai: SmartAi) {} - - async query( - message: string, - requirements: { - speed?: boolean; - accuracy?: boolean; - cost?: boolean; - privacy?: boolean; - } - ) { - if (requirements.privacy) { - return this.ai.ollamaProvider.chat({ /* ... */ }); // Local only - } - if (requirements.speed) { - return this.ai.groqProvider.chat({ /* ... */ }); // 10x faster - } - if (requirements.accuracy) { - return this.ai.anthropicProvider.chat({ /* ... */ }); // Best reasoning - } - // Default fallback - return this.ai.openaiProvider.chat({ /* ... */ }); - } -} +``` +@push.rocks/smartai +├── ts/ # Core package +│ ├── index.ts # Re-exports getModel, AI SDK functions, types +│ ├── smartai.classes.smartai.ts # getModel() — provider switch +│ ├── smartai.interfaces.ts # ISmartAiOptions, TProvider, IOllamaModelOptions +│ ├── smartai.provider.ollama.ts # Custom LanguageModelV3 for Ollama +│ ├── smartai.middleware.anthropic.ts # Prompt caching middleware +│ └── plugins.ts # AI SDK provider factories +├── ts_vision/ # @push.rocks/smartai/vision +├── ts_audio/ # @push.rocks/smartai/audio +├── ts_image/ # @push.rocks/smartai/image +├── ts_document/ # @push.rocks/smartai/document +└── ts_research/ # @push.rocks/smartai/research ``` -### 2. Streaming for Large Responses +The core package is a thin registry. `getModel()` creates the appropriate `@ai-sdk/*` provider, calls it with the model ID, and returns the resulting `LanguageModelV3`. For Anthropic, it optionally wraps the model with prompt caching middleware. For Ollama, it returns a custom `LanguageModelV3` implementation that talks directly to Ollama's `/api/chat` endpoint. -```typescript -// Don't wait for the entire response -async function streamResponse(userQuery: string) { - const stream = await ai.openaiProvider.chatStream( - createInputStream(userQuery) - ); - - // Process tokens as they arrive - for await (const chunk of stream) { - updateUI(chunk); // Immediate feedback - await processChunk(chunk); // Parallel processing - } -} -``` - -### 3. Parallel Multi-Provider Queries - -```typescript -// Get the best answer from multiple AIs -async function consensusQuery(question: string) { - const providers = [ - ai.openaiProvider.chat({ /* ... */ }), - ai.anthropicProvider.chat({ /* ... */ }), - ai.perplexityProvider.chat({ /* ... */ }), - ]; - - const responses = await Promise.all(providers); - return synthesizeResponses(responses); -} -``` - -## 🛠️ Advanced Configuration - -### Provider-Specific Options - -```typescript -const ai = new SmartAi({ - // OpenAI - openaiToken: 'sk-...', - - // Anthropic with extended thinking - anthropicToken: 'sk-ant-...', - - // Perplexity for research - perplexityToken: 'pplx-...', - - // Groq for speed - groqToken: 'gsk_...', - - // Mistral with OCR settings - mistralToken: 'your-key', - mistral: { - chatModel: 'mistral-large-latest', - ocrModel: 'mistral-ocr-latest', - tableFormat: 'markdown', - }, - - // XAI (Grok) - xaiToken: 'xai-...', - - // ElevenLabs TTS - elevenlabsToken: 'sk-...', - elevenlabs: { - defaultVoiceId: '19STyYD15bswVz51nqLf', - defaultModelId: 'eleven_v3', - }, - - // Ollama (local) - ollama: { - baseUrl: 'http://localhost:11434', - model: 'llama2', - visionModel: 'llava', - defaultOptions: { - num_ctx: 4096, - temperature: 0.7, - top_p: 0.9, - }, - defaultTimeout: 120000, - }, - - // Exo (distributed) - exo: { - baseUrl: 'http://localhost:8080/v1', - apiKey: 'optional-key', - }, -}); -``` - -### Error Handling & Fallbacks - -```typescript -class ResilientAI { - private providers = ['openai', 'anthropic', 'groq']; - - async query(opts: ChatOptions): Promise { - for (const provider of this.providers) { - try { - return await this.ai[`${provider}Provider`].chat(opts); - } catch (error) { - console.warn(`${provider} failed, trying next...`); - continue; - } - } - throw new Error('All providers failed'); - } -} -``` - -## 🎯 Choosing the Right Provider - -| Use Case | Recommended Provider | Why | -| --------------------- | -------------------- | --------------------------------------------------------- | -| **General Purpose** | OpenAI | Most features, stable, well-documented | -| **Complex Reasoning** | Anthropic | Superior logical thinking, extended thinking, safer | -| **Document OCR** | Mistral | Native PDF processing, no image conversion overhead | -| **Research & Facts** | Perplexity | Web-aware, provides citations | -| **Deep Research** | OpenAI | Deep Research API with comprehensive analysis | -| **Premium TTS** | ElevenLabs | Most natural voices, 70+ languages, v3 model | -| **Speed Critical** | Groq | 10x faster inference, sub-second responses | -| **Privacy Critical** | Ollama | 100% local, no data leaves your servers | -| **Real-time Data** | XAI | Grok with access to current information | -| **Cost Sensitive** | Ollama/Exo | Free (local) or distributed compute | - -## 📈 Roadmap - -- [x] Research & Web Search API -- [x] Image generation support (gpt-image-1, DALL-E 3, DALL-E 2) -- [x] Extended thinking (Anthropic) -- [x] Native PDF OCR (Mistral) -- [ ] Streaming function calls -- [ ] Voice input processing -- [ ] Fine-tuning integration -- [ ] Embedding support -- [ ] Agent framework -- [ ] More providers (Cohere, AI21, etc.) +Subpath modules are independent — they import `ai` and provider SDKs directly, not through the core package. This keeps the dependency graph clean and allows tree-shaking. ## License and Legal Information diff --git a/test/test.audio.elevenlabs.ts b/test/test.audio.elevenlabs.ts deleted file mode 100644 index 1c69d09..0000000 --- a/test/test.audio.elevenlabs.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); -const smartfs = new SmartFs(new SmartFsProviderNode()); - -import * as smartai from '../ts/index.js'; - -let testSmartai: smartai.SmartAi; - -tap.test('ElevenLabs Audio: should create a smartai instance with ElevenLabs provider', async () => { - testSmartai = new smartai.SmartAi({ - elevenlabsToken: await testQenv.getEnvVarOnDemand('ELEVENLABS_TOKEN'), - elevenlabs: { - defaultVoiceId: '19STyYD15bswVz51nqLf', - }, - }); - await testSmartai.start(); -}); - -tap.test('ElevenLabs Audio: should create audio response', async () => { - const audioStream = await testSmartai.elevenlabsProvider.audio({ - message: 'Welcome to SmartAI, the unified interface for the world\'s leading artificial intelligence providers. SmartAI brings together OpenAI, Anthropic, Perplexity, and ElevenLabs under a single elegant TypeScript API. Whether you need text generation, vision analysis, document processing, or premium text-to-speech capabilities, SmartAI provides a consistent and powerful interface for all your AI needs. Build intelligent applications at lightning speed without vendor lock-in.', - }); - const chunks: Uint8Array[] = []; - for await (const chunk of audioStream) { - chunks.push(chunk as Uint8Array); - } - const audioBuffer = Buffer.concat(chunks); - await smartfs.file('./.nogit/testoutput_elevenlabs.mp3').write(audioBuffer); - console.log(`Audio Buffer length: ${audioBuffer.length}`); - expect(audioBuffer.length).toBeGreaterThan(0); -}); - -tap.test('ElevenLabs Audio: should create audio with custom voice', async () => { - const audioStream = await testSmartai.elevenlabsProvider.audio({ - message: 'Testing with a different voice.', - voiceId: 'JBFqnCBsd6RMkjVDRZzb', - }); - const chunks: Uint8Array[] = []; - for await (const chunk of audioStream) { - chunks.push(chunk as Uint8Array); - } - const audioBuffer = Buffer.concat(chunks); - await smartfs.file('./.nogit/testoutput_elevenlabs_custom.mp3').write(audioBuffer); - console.log(`Audio Buffer length (custom voice): ${audioBuffer.length}`); - expect(audioBuffer.length).toBeGreaterThan(0); -}); - -tap.test('ElevenLabs Audio: should stop the smartai instance', async () => { - await testSmartai.stop(); -}); - -export default tap.start(); diff --git a/test/test.audio.openai.ts b/test/test.audio.openai.ts deleted file mode 100644 index 5cf8c5e..0000000 --- a/test/test.audio.openai.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); -const smartfs = new SmartFs(new SmartFsProviderNode()); - -import * as smartai from '../ts/index.js'; - -let testSmartai: smartai.SmartAi; - -tap.test('OpenAI Audio: should create a smartai instance with OpenAI provider', async () => { - testSmartai = new smartai.SmartAi({ - openaiToken: await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'), - }); - await testSmartai.start(); -}); - -tap.test('OpenAI Audio: should create audio response', async () => { - // Call the audio method with a sample message. - const audioStream = await testSmartai.openaiProvider.audio({ - message: 'This is a test of audio generation.', - }); - // Read all chunks from the stream. - const chunks: Uint8Array[] = []; - for await (const chunk of audioStream) { - chunks.push(chunk as Uint8Array); - } - const audioBuffer = Buffer.concat(chunks); - await smartfs.file('./.nogit/testoutput.mp3').write(audioBuffer); - console.log(`Audio Buffer length: ${audioBuffer.length}`); - // Assert that the resulting buffer is not empty. - expect(audioBuffer.length).toBeGreaterThan(0); -}); - -tap.test('OpenAI Audio: should stop the smartai instance', async () => { - await testSmartai.stop(); -}); - -export default tap.start(); diff --git a/test/test.audio.stubs.ts b/test/test.audio.stubs.ts deleted file mode 100644 index 95ec863..0000000 --- a/test/test.audio.stubs.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); - -import * as smartai from '../ts/index.js'; - -let anthropicProvider: smartai.AnthropicProvider; - -tap.test('Audio Stubs: should create Anthropic provider', async () => { - anthropicProvider = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - }); - await anthropicProvider.start(); -}); - -tap.test('Audio Stubs: Anthropic audio should throw not supported error', async () => { - let errorCaught = false; - - try { - await anthropicProvider.audio({ - message: 'This should fail' - }); - } catch (error) { - errorCaught = true; - expect(error.message).toInclude('not yet supported'); - } - - expect(errorCaught).toBeTrue(); -}); - -tap.test('Audio Stubs: should stop Anthropic provider', async () => { - await anthropicProvider.stop(); -}); - -export default tap.start(); diff --git a/test/test.audio.ts b/test/test.audio.ts new file mode 100644 index 0000000..0b74676 --- /dev/null +++ b/test/test.audio.ts @@ -0,0 +1,36 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as qenv from '@push.rocks/qenv'; +import { textToSpeech } from '../ts_audio/index.js'; + +const testQenv = new qenv.Qenv('./', './.nogit/'); + +tap.test('textToSpeech should return a readable stream', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'); + if (!apiKey) { + console.log('OPENAI_TOKEN not set, skipping test'); + return; + } + + const stream = await textToSpeech({ + apiKey, + text: 'Hello, this is a test of the text to speech system.', + voice: 'alloy', + model: 'tts-1', + }); + + expect(stream).toBeTruthy(); + expect(stream.readable).toBeTrue(); + + // Read some bytes to verify it's actual audio data + const chunks: Buffer[] = []; + for await (const chunk of stream) { + chunks.push(Buffer.from(chunk)); + if (chunks.length > 2) break; // Just read a few chunks to verify + } + + const totalBytes = chunks.reduce((sum, c) => sum + c.length, 0); + console.log(`Audio stream produced ${totalBytes} bytes in ${chunks.length} chunks`); + expect(totalBytes).toBeGreaterThan(0); +}); + +export default tap.start(); diff --git a/test/test.basic.ts b/test/test.basic.ts deleted file mode 100644 index 6862a13..0000000 --- a/test/test.basic.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { tap, expect } from '@git.zone/tstest/tapbundle'; -import * as smartai from '../ts/index.js'; - -// Basic instantiation tests that don't require API tokens -// These tests can run in CI/CD environments without credentials - -tap.test('Basic: should create SmartAi instance', async () => { - const testSmartai = new smartai.SmartAi({ - openaiToken: 'dummy-token-for-testing' - }); - expect(testSmartai).toBeInstanceOf(smartai.SmartAi); - // Provider is only created after calling start() - expect(testSmartai.options.openaiToken).toEqual('dummy-token-for-testing'); -}); - -tap.test('Basic: should instantiate OpenAI provider', async () => { - const openaiProvider = new smartai.OpenAiProvider({ - openaiToken: 'dummy-token' - }); - expect(openaiProvider).toBeInstanceOf(smartai.OpenAiProvider); - expect(typeof openaiProvider.chat).toEqual('function'); - expect(typeof openaiProvider.audio).toEqual('function'); - expect(typeof openaiProvider.vision).toEqual('function'); - expect(typeof openaiProvider.document).toEqual('function'); - expect(typeof openaiProvider.research).toEqual('function'); -}); - -tap.test('Basic: should instantiate Anthropic provider', async () => { - const anthropicProvider = new smartai.AnthropicProvider({ - anthropicToken: 'dummy-token' - }); - expect(anthropicProvider).toBeInstanceOf(smartai.AnthropicProvider); - expect(typeof anthropicProvider.chat).toEqual('function'); - expect(typeof anthropicProvider.audio).toEqual('function'); - expect(typeof anthropicProvider.vision).toEqual('function'); - expect(typeof anthropicProvider.document).toEqual('function'); - expect(typeof anthropicProvider.research).toEqual('function'); -}); - -tap.test('Basic: should instantiate Perplexity provider', async () => { - const perplexityProvider = new smartai.PerplexityProvider({ - perplexityToken: 'dummy-token' - }); - expect(perplexityProvider).toBeInstanceOf(smartai.PerplexityProvider); - expect(typeof perplexityProvider.chat).toEqual('function'); - expect(typeof perplexityProvider.research).toEqual('function'); -}); - -tap.test('Basic: should instantiate Groq provider', async () => { - const groqProvider = new smartai.GroqProvider({ - groqToken: 'dummy-token' - }); - expect(groqProvider).toBeInstanceOf(smartai.GroqProvider); - expect(typeof groqProvider.chat).toEqual('function'); - expect(typeof groqProvider.research).toEqual('function'); -}); - -tap.test('Basic: should instantiate Ollama provider', async () => { - const ollamaProvider = new smartai.OllamaProvider({ - baseUrl: 'http://localhost:11434' - }); - expect(ollamaProvider).toBeInstanceOf(smartai.OllamaProvider); - expect(typeof ollamaProvider.chat).toEqual('function'); - expect(typeof ollamaProvider.research).toEqual('function'); -}); - -tap.test('Basic: should instantiate xAI provider', async () => { - const xaiProvider = new smartai.XAIProvider({ - xaiToken: 'dummy-token' - }); - expect(xaiProvider).toBeInstanceOf(smartai.XAIProvider); - expect(typeof xaiProvider.chat).toEqual('function'); - expect(typeof xaiProvider.research).toEqual('function'); -}); - -tap.test('Basic: should instantiate Exo provider', async () => { - const exoProvider = new smartai.ExoProvider({ - exoBaseUrl: 'http://localhost:8000' - }); - expect(exoProvider).toBeInstanceOf(smartai.ExoProvider); - expect(typeof exoProvider.chat).toEqual('function'); - expect(typeof exoProvider.research).toEqual('function'); -}); - -tap.test('Basic: all providers should extend MultiModalModel', async () => { - const openai = new smartai.OpenAiProvider({ openaiToken: 'test' }); - const anthropic = new smartai.AnthropicProvider({ anthropicToken: 'test' }); - - expect(openai).toBeInstanceOf(smartai.MultiModalModel); - expect(anthropic).toBeInstanceOf(smartai.MultiModalModel); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.chat.anthropic.ts b/test/test.chat.anthropic.ts deleted file mode 100644 index d36c504..0000000 --- a/test/test.chat.anthropic.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); - -import * as smartai from '../ts/index.js'; - -let anthropicProvider: smartai.AnthropicProvider; - -tap.test('Anthropic Chat: should create and start Anthropic provider', async () => { - anthropicProvider = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - }); - await anthropicProvider.start(); - expect(anthropicProvider).toBeInstanceOf(smartai.AnthropicProvider); -}); - -tap.test('Anthropic Chat: should create chat response', async () => { - const userMessage = 'What is the capital of France? Answer in one word.'; - const response = await anthropicProvider.chat({ - systemMessage: 'You are a helpful assistant. Be concise.', - userMessage: userMessage, - messageHistory: [], - }); - console.log(`Anthropic Chat - User: ${userMessage}`); - console.log(`Anthropic Chat - Response: ${response.message}`); - - expect(response.role).toEqual('assistant'); - expect(response.message).toBeTruthy(); - expect(response.message.toLowerCase()).toInclude('paris'); -}); - -tap.test('Anthropic Chat: should handle message history', async () => { - const messageHistory: smartai.ChatMessage[] = [ - { role: 'user', content: 'My name is Claude Test' }, - { role: 'assistant', content: 'Nice to meet you, Claude Test!' } - ]; - - const response = await anthropicProvider.chat({ - systemMessage: 'You are a helpful assistant with good memory.', - userMessage: 'What is my name?', - messageHistory: messageHistory, - }); - - console.log(`Anthropic Memory Test - Response: ${response.message}`); - expect(response.message.toLowerCase()).toInclude('claude test'); -}); - -tap.test('Anthropic Chat: should handle errors gracefully', async () => { - // Test with invalid message (empty) - let errorCaught = false; - - try { - await anthropicProvider.chat({ - systemMessage: '', - userMessage: '', - messageHistory: [], - }); - } catch (error) { - errorCaught = true; - console.log('Expected error caught:', error.message); - } - - // Anthropic might handle empty messages, so we don't assert error - console.log(`Error handling test - Error caught: ${errorCaught}`); -}); - -tap.test('Anthropic Chat: should stop the provider', async () => { - await anthropicProvider.stop(); -}); - -export default tap.start(); diff --git a/test/test.chat.mistral.ts b/test/test.chat.mistral.ts deleted file mode 100644 index 6922272..0000000 --- a/test/test.chat.mistral.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); - -import * as smartai from '../ts/index.js'; - -let mistralProvider: smartai.MistralProvider; - -tap.test('Mistral Chat: should create and start Mistral provider', async () => { - mistralProvider = new smartai.MistralProvider({ - mistralToken: await testQenv.getEnvVarOnDemand('MISTRAL_API_KEY'), - }); - await mistralProvider.start(); - expect(mistralProvider).toBeInstanceOf(smartai.MistralProvider); -}); - -tap.test('Mistral Chat: should create chat response', async () => { - const userMessage = 'What is the capital of France? Answer in one word.'; - const response = await mistralProvider.chat({ - systemMessage: 'You are a helpful assistant. Be concise.', - userMessage: userMessage, - messageHistory: [], - }); - console.log(`Mistral Chat - User: ${userMessage}`); - console.log(`Mistral Chat - Response: ${response.message}`); - - expect(response.role).toEqual('assistant'); - expect(response.message).toBeTruthy(); - expect(response.message.toLowerCase()).toInclude('paris'); -}); - -tap.test('Mistral Chat: should handle message history', async () => { - const messageHistory: smartai.ChatMessage[] = [ - { role: 'user', content: 'My name is Claude Test' }, - { role: 'assistant', content: 'Nice to meet you, Claude Test!' } - ]; - - const response = await mistralProvider.chat({ - systemMessage: 'You are a helpful assistant with good memory.', - userMessage: 'What is my name?', - messageHistory: messageHistory, - }); - - console.log(`Mistral Memory Test - Response: ${response.message}`); - expect(response.message.toLowerCase()).toInclude('claude test'); -}); - -tap.test('Mistral Chat: should handle longer conversations', async () => { - const response = await mistralProvider.chat({ - systemMessage: 'You are a helpful coding assistant.', - userMessage: 'Write a simple hello world function in TypeScript. Keep it brief.', - messageHistory: [], - }); - - console.log(`Mistral Coding Test - Response: ${response.message}`); - expect(response.message).toBeTruthy(); - // Should contain some TypeScript/function code - expect(response.message).toInclude('function'); -}); - -tap.test('Mistral Chat: should stop the provider', async () => { - await mistralProvider.stop(); -}); - -export default tap.start(); diff --git a/test/test.chat.openai.ts b/test/test.chat.openai.ts deleted file mode 100644 index 1bd013b..0000000 --- a/test/test.chat.openai.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); - -import * as smartai from '../ts/index.js'; - -let testSmartai: smartai.SmartAi; - -tap.test('OpenAI Chat: should create a smartai instance with OpenAI provider', async () => { - testSmartai = new smartai.SmartAi({ - openaiToken: await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'), - }); - await testSmartai.start(); -}); - -tap.test('OpenAI Chat: should create chat response', async () => { - const userMessage = 'How are you?'; - const response = await testSmartai.openaiProvider.chat({ - systemMessage: 'Hello', - userMessage: userMessage, - messageHistory: [], - }); - console.log(`userMessage: ${userMessage}`); - console.log(response.message); - expect(response.role).toEqual('assistant'); - expect(response.message).toBeTruthy(); -}); - -tap.test('OpenAI Chat: should stop the smartai instance', async () => { - await testSmartai.stop(); -}); - -export default tap.start(); diff --git a/test/test.document.anthropic.ts b/test/test.document.anthropic.ts deleted file mode 100644 index cb70566..0000000 --- a/test/test.document.anthropic.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import * as smartrequest from '@push.rocks/smartrequest'; -import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); -const smartfs = new SmartFs(new SmartFsProviderNode()); - -import * as smartai from '../ts/index.js'; - -let anthropicProvider: smartai.AnthropicProvider; - -tap.test('Anthropic Document: should create and start Anthropic provider', async () => { - anthropicProvider = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - }); - await anthropicProvider.start(); - expect(anthropicProvider).toBeInstanceOf(smartai.AnthropicProvider); -}); - -tap.test('Anthropic Document: should document a PDF', async () => { - const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'; - const pdfResponse = await smartrequest.SmartRequest.create() - .url(pdfUrl) - .get(); - - const result = await anthropicProvider.document({ - systemMessage: 'Classify the document. Only the following answers are allowed: "invoice", "bank account statement", "contract", "test document", "other". The answer should only contain the keyword for machine use.', - userMessage: 'Classify this document.', - messageHistory: [], - pdfDocuments: [Buffer.from(await pdfResponse.arrayBuffer())], - }); - - console.log(`Anthropic Document - Result:`, result); - expect(result).toBeTruthy(); - expect(result.message).toBeTruthy(); -}); - -tap.test('Anthropic Document: should handle complex document analysis', async () => { - // Test with the demo PDF if it exists - const pdfPath = './.nogit/demo_without_textlayer.pdf'; - let pdfBuffer: Uint8Array; - - try { - pdfBuffer = await smartfs.file(pdfPath).read(); - } catch (error) { - // If the file doesn't exist, use the dummy PDF - console.log('Demo PDF not found, using dummy PDF instead'); - const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'; - const pdfResponse = await smartrequest.SmartRequest.create() - .url(pdfUrl) - .get(); - pdfBuffer = Buffer.from(await pdfResponse.arrayBuffer()); - } - - const result = await anthropicProvider.document({ - systemMessage: ` - Analyze this document and provide a JSON response with the following structure: - { - "documentType": "string", - "hasText": boolean, - "summary": "string" - } - `, - userMessage: 'Analyze this document.', - messageHistory: [], - pdfDocuments: [pdfBuffer], - }); - - console.log(`Anthropic Complex Document Analysis:`, result); - expect(result).toBeTruthy(); - expect(result.message).toBeTruthy(); -}); - -tap.test('Anthropic Document: should stop the provider', async () => { - await anthropicProvider.stop(); -}); - -export default tap.start(); diff --git a/test/test.document.mistral.ts b/test/test.document.mistral.ts deleted file mode 100644 index 49bf908..0000000 --- a/test/test.document.mistral.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import * as smartrequest from '@push.rocks/smartrequest'; -import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); -const smartfs = new SmartFs(new SmartFsProviderNode()); - -import * as smartai from '../ts/index.js'; - -let mistralProvider: smartai.MistralProvider; - -tap.test('Mistral Document: should create and start Mistral provider', async () => { - mistralProvider = new smartai.MistralProvider({ - mistralToken: await testQenv.getEnvVarOnDemand('MISTRAL_API_KEY'), - tableFormat: 'markdown', - }); - await mistralProvider.start(); - expect(mistralProvider).toBeInstanceOf(smartai.MistralProvider); -}); - -tap.test('Mistral Document: should process a PDF document', async () => { - const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'; - const pdfResponse = await smartrequest.SmartRequest.create() - .url(pdfUrl) - .get(); - - const result = await mistralProvider.document({ - systemMessage: 'Classify the document. Only the following answers are allowed: "invoice", "bank account statement", "contract", "test document", "other". The answer should only contain the keyword for machine use.', - userMessage: 'Classify this document.', - messageHistory: [], - pdfDocuments: [Buffer.from(await pdfResponse.arrayBuffer())], - }); - - console.log(`Mistral Document - Result:`, result); - expect(result).toBeTruthy(); - expect(result.message).toBeTruthy(); -}); - -tap.test('Mistral Document: should handle complex document analysis', async () => { - // Test with the demo PDF if it exists - const pdfPath = './.nogit/demo_without_textlayer.pdf'; - let pdfBuffer: Uint8Array; - - try { - pdfBuffer = await smartfs.file(pdfPath).read(); - } catch (error) { - // If the file doesn't exist, use the dummy PDF - console.log('Demo PDF not found, using dummy PDF instead'); - const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'; - const pdfResponse = await smartrequest.SmartRequest.create() - .url(pdfUrl) - .get(); - pdfBuffer = Buffer.from(await pdfResponse.arrayBuffer()); - } - - const result = await mistralProvider.document({ - systemMessage: ` - Analyze this document and provide a JSON response with the following structure: - { - "documentType": "string", - "hasText": boolean, - "summary": "string" - } - `, - userMessage: 'Analyze this document.', - messageHistory: [], - pdfDocuments: [pdfBuffer], - }); - - console.log(`Mistral Complex Document Analysis:`, result); - expect(result).toBeTruthy(); - expect(result.message).toBeTruthy(); -}); - -tap.test('Mistral Document: should process multiple PDF documents', async () => { - const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'; - const pdfResponse = await smartrequest.SmartRequest.create() - .url(pdfUrl) - .get(); - - const pdfBuffer = Buffer.from(await pdfResponse.arrayBuffer()); - - const result = await mistralProvider.document({ - systemMessage: 'You are a document comparison assistant.', - userMessage: 'Are these two documents the same? Answer yes or no.', - messageHistory: [], - pdfDocuments: [pdfBuffer, pdfBuffer], // Same document twice for test - }); - - console.log(`Mistral Multi-Document - Result:`, result); - expect(result).toBeTruthy(); - expect(result.message).toBeTruthy(); -}); - -tap.test('Mistral Document: should stop the provider', async () => { - await mistralProvider.stop(); -}); - -export default tap.start(); diff --git a/test/test.document.openai.ts b/test/test.document.openai.ts deleted file mode 100644 index 9f60d24..0000000 --- a/test/test.document.openai.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import * as smartrequest from '@push.rocks/smartrequest'; -import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); -const smartfs = new SmartFs(new SmartFsProviderNode()); - -import * as smartai from '../ts/index.js'; - -let testSmartai: smartai.SmartAi; - -tap.test('OpenAI Document: should create a smartai instance with OpenAI provider', async () => { - testSmartai = new smartai.SmartAi({ - openaiToken: await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'), - }); - await testSmartai.start(); -}); - -tap.test('OpenAI Document: should document a pdf', async () => { - const pdfUrl = 'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf'; - const pdfResponse = await smartrequest.SmartRequest.create() - .url(pdfUrl) - .get(); - const result = await testSmartai.openaiProvider.document({ - systemMessage: 'Classify the document. Only the following answers are allowed: "invoice", "bank account statement", "contract", "other". The answer should only contain the keyword for machine use.', - userMessage: "Classify the document.", - messageHistory: [], - pdfDocuments: [Buffer.from(await pdfResponse.arrayBuffer())], - }); - console.log(result); - expect(result.message).toBeTruthy(); -}); - -tap.test('OpenAI Document: should recognize companies in a pdf', async () => { - const pdfBuffer = await smartfs.file('./.nogit/demo_without_textlayer.pdf').read(); - const result = await testSmartai.openaiProvider.document({ - systemMessage: ` - summarize the document. - - answer in JSON format, adhering to the following schema: - \`\`\`typescript - type TAnswer = { - entitySender: { - type: 'official state entity' | 'company' | 'person'; - name: string; - address: string; - city: string; - country: string; - EU: boolean; // whether the entity is within EU - }; - entityReceiver: { - type: 'official state entity' | 'company' | 'person'; - name: string; - address: string; - city: string; - country: string; - EU: boolean; // whether the entity is within EU - }; - date: string; // the date of the document as YYYY-MM-DD - title: string; // a short title, suitable for a filename - } - \`\`\` - `, - userMessage: "Classify the document.", - messageHistory: [], - pdfDocuments: [pdfBuffer], - }); - console.log(result); - expect(result.message).toBeTruthy(); -}); - -tap.test('OpenAI Document: should stop the smartai instance', async () => { - await testSmartai.stop(); -}); - -export default tap.start(); diff --git a/test/test.document.ts b/test/test.document.ts new file mode 100644 index 0000000..59e1350 --- /dev/null +++ b/test/test.document.ts @@ -0,0 +1,50 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as qenv from '@push.rocks/qenv'; +import { getModel } from '../ts/index.js'; +import { analyzeDocuments, stopSmartpdf } from '../ts_document/index.js'; + +const testQenv = new qenv.Qenv('./', './.nogit/'); + +tap.test('analyzeDocuments should analyze a PDF', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'); + if (!apiKey) { + console.log('ANTHROPIC_TOKEN not set, skipping test'); + return; + } + + // Create a minimal test PDF (this is a valid minimal PDF) + const minimalPdf = Buffer.from( + '%PDF-1.0\n1 0 obj<>endobj\n' + + '2 0 obj<>endobj\n' + + '3 0 obj<>>>>>endobj\n' + + '4 0 obj<>stream\nBT /F1 12 Tf 100 700 Td (Hello World) Tj ET\nendstream\nendobj\n' + + '5 0 obj<>endobj\n' + + 'xref\n0 6\n0000000000 65535 f \n0000000009 00000 n \n0000000058 00000 n \n0000000115 00000 n \n0000000266 00000 n \n0000000360 00000 n \n' + + 'trailer<>\nstartxref\n434\n%%EOF' + ); + + const model = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey, + promptCaching: false, + }); + + try { + const result = await analyzeDocuments({ + model, + systemMessage: 'You are a document analysis assistant.', + userMessage: 'What text is visible in this document?', + pdfDocuments: [minimalPdf], + }); + + console.log('Document analysis result:', result); + expect(result).toBeTruthy(); + } catch (error) { + console.log('Document test failed (may need puppeteer):', error.message); + } finally { + await stopSmartpdf(); + } +}); + +export default tap.start(); diff --git a/test/test.image.openai.ts b/test/test.image.openai.ts deleted file mode 100644 index 408762e..0000000 --- a/test/test.image.openai.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import * as smartai from '../ts/index.js'; -import * as path from 'path'; -import { promises as fs } from 'fs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); - -let openaiProvider: smartai.OpenAiProvider; - -// Helper function to save image results -async function saveImageResult(testName: string, result: any) { - const sanitizedName = testName.replace(/[^a-z0-9]/gi, '_').toLowerCase(); - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); - const filename = `openai_${sanitizedName}_${timestamp}.json`; - const filepath = path.join('.nogit', 'testresults', 'images', filename); - - await fs.mkdir(path.dirname(filepath), { recursive: true }); - await fs.writeFile(filepath, JSON.stringify(result, null, 2), 'utf-8'); - - console.log(` 💾 Saved to: ${filepath}`); - - // Also save the actual image if b64_json is present - if (result.images && result.images[0]?.b64_json) { - const imageFilename = `openai_${sanitizedName}_${timestamp}.png`; - const imageFilepath = path.join('.nogit', 'testresults', 'images', imageFilename); - await fs.writeFile(imageFilepath, Buffer.from(result.images[0].b64_json, 'base64')); - console.log(` 🖼️ Image saved to: ${imageFilepath}`); - } -} - -tap.test('OpenAI Image Generation: should initialize provider', async () => { - const openaiToken = await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'); - expect(openaiToken).toBeTruthy(); - - openaiProvider = new smartai.OpenAiProvider({ - openaiToken, - imageModel: 'gpt-image-1' - }); - - await openaiProvider.start(); - expect(openaiProvider).toBeInstanceOf(smartai.OpenAiProvider); -}); - -tap.test('OpenAI Image: Basic generation with gpt-image-1', async () => { - const result = await openaiProvider.imageGenerate({ - prompt: 'A cute robot reading a book in a cozy library, digital art style', - model: 'gpt-image-1', - quality: 'medium', - size: '1024x1024' - }); - - console.log('Basic gpt-image-1 Generation:'); - console.log('- Images generated:', result.images.length); - console.log('- Model used:', result.metadata?.model); - console.log('- Quality:', result.metadata?.quality); - console.log('- Size:', result.metadata?.size); - console.log('- Tokens used:', result.metadata?.tokensUsed); - - await saveImageResult('basic_generation_gptimage1', result); - - expect(result.images).toBeTruthy(); - expect(result.images.length).toEqual(1); - expect(result.images[0].b64_json).toBeTruthy(); - expect(result.metadata?.model).toEqual('gpt-image-1'); -}); - -tap.test('OpenAI Image: High quality with transparent background', async () => { - const result = await openaiProvider.imageGenerate({ - prompt: 'A simple geometric logo of a mountain peak, minimal design, clean lines', - model: 'gpt-image-1', - quality: 'high', - size: '1024x1024', - background: 'transparent', - outputFormat: 'png' - }); - - console.log('High Quality Transparent:'); - console.log('- Quality:', result.metadata?.quality); - console.log('- Background: transparent'); - console.log('- Format:', result.metadata?.outputFormat); - console.log('- Tokens used:', result.metadata?.tokensUsed); - - await saveImageResult('high_quality_transparent', result); - - expect(result.images.length).toEqual(1); - expect(result.images[0].b64_json).toBeTruthy(); -}); - -tap.test('OpenAI Image: WebP format with compression', async () => { - const result = await openaiProvider.imageGenerate({ - prompt: 'A futuristic cityscape at sunset with flying cars, photorealistic', - model: 'gpt-image-1', - quality: 'high', - size: '1536x1024', - outputFormat: 'webp', - outputCompression: 85 - }); - - console.log('WebP with Compression:'); - console.log('- Format:', result.metadata?.outputFormat); - console.log('- Compression: 85%'); - console.log('- Size:', result.metadata?.size); - - await saveImageResult('webp_compression', result); - - expect(result.images.length).toEqual(1); - expect(result.images[0].b64_json).toBeTruthy(); -}); - -tap.test('OpenAI Image: Text rendering with gpt-image-1', async () => { - const result = await openaiProvider.imageGenerate({ - prompt: 'A vintage cafe sign that says "COFFEE & CODE" in elegant hand-lettered typography, warm colors', - model: 'gpt-image-1', - quality: 'high', - size: '1024x1024' - }); - - console.log('Text Rendering:'); - console.log('- Prompt includes text: "COFFEE & CODE"'); - console.log('- gpt-image-1 has superior text rendering'); - console.log('- Tokens used:', result.metadata?.tokensUsed); - - await saveImageResult('text_rendering', result); - - expect(result.images.length).toEqual(1); - expect(result.images[0].b64_json).toBeTruthy(); -}); - -tap.test('OpenAI Image: Multiple images generation', async () => { - const result = await openaiProvider.imageGenerate({ - prompt: 'Abstract colorful geometric patterns, modern minimalist art', - model: 'gpt-image-1', - n: 2, - quality: 'medium', - size: '1024x1024' - }); - - console.log('Multiple Images:'); - console.log('- Images requested: 2'); - console.log('- Images generated:', result.images.length); - - await saveImageResult('multiple_images', result); - - expect(result.images.length).toEqual(2); - expect(result.images[0].b64_json).toBeTruthy(); - expect(result.images[1].b64_json).toBeTruthy(); -}); - -tap.test('OpenAI Image: Low moderation setting', async () => { - const result = await openaiProvider.imageGenerate({ - prompt: 'A fantasy battle scene with warriors and dragons', - model: 'gpt-image-1', - moderation: 'low', - quality: 'medium' - }); - - console.log('Low Moderation:'); - console.log('- Moderation: low (less restrictive filtering)'); - console.log('- Tokens used:', result.metadata?.tokensUsed); - - await saveImageResult('low_moderation', result); - - expect(result.images.length).toEqual(1); - expect(result.images[0].b64_json).toBeTruthy(); -}); - -tap.test('OpenAI Image Editing: edit with gpt-image-1', async () => { - // First, generate a base image - const baseResult = await openaiProvider.imageGenerate({ - prompt: 'A simple white cat sitting on a red cushion', - model: 'gpt-image-1', - quality: 'low', - size: '1024x1024' - }); - - const baseImageBuffer = Buffer.from(baseResult.images[0].b64_json!, 'base64'); - - // Now edit it - const editResult = await openaiProvider.imageEdit({ - image: baseImageBuffer, - prompt: 'Change the cat to orange and add stylish sunglasses', - model: 'gpt-image-1', - quality: 'medium' - }); - - console.log('Image Editing:'); - console.log('- Base image created'); - console.log('- Edit: change color and add sunglasses'); - console.log('- Result images:', editResult.images.length); - - await saveImageResult('image_edit', editResult); - - expect(editResult.images.length).toEqual(1); - expect(editResult.images[0].b64_json).toBeTruthy(); -}); - -tap.test('OpenAI Image: should clean up provider', async () => { - await openaiProvider.stop(); - console.log('OpenAI image provider stopped successfully'); -}); - -export default tap.start(); diff --git a/test/test.image.ts b/test/test.image.ts new file mode 100644 index 0000000..f162140 --- /dev/null +++ b/test/test.image.ts @@ -0,0 +1,35 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as qenv from '@push.rocks/qenv'; +import { generateImage } from '../ts_image/index.js'; + +const testQenv = new qenv.Qenv('./', './.nogit/'); + +tap.test('generateImage should return an image response', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'); + if (!apiKey) { + console.log('OPENAI_TOKEN not set, skipping test'); + return; + } + + const result = await generateImage({ + apiKey, + prompt: 'A simple red circle on a white background', + model: 'gpt-image-1', + size: '1024x1024', + quality: 'low', + n: 1, + }); + + console.log('Image generation result: images count =', result.images.length); + expect(result.images).toBeArray(); + expect(result.images.length).toBeGreaterThan(0); + + const firstImage = result.images[0]; + // gpt-image-1 returns b64_json by default + expect(firstImage.b64_json || firstImage.url).toBeTruthy(); + + expect(result.metadata).toBeTruthy(); + expect(result.metadata!.model).toEqual('gpt-image-1'); +}); + +export default tap.start(); diff --git a/test/test.interfaces.ts b/test/test.interfaces.ts deleted file mode 100644 index 741a063..0000000 --- a/test/test.interfaces.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { tap, expect } from '@git.zone/tstest/tapbundle'; -import * as smartai from '../ts/index.js'; - -// Test interface exports and type checking -// These tests verify that all interfaces are properly exported and usable - -tap.test('Interfaces: ResearchOptions should be properly typed', async () => { - const testOptions: smartai.ResearchOptions = { - query: 'test query', - searchDepth: 'basic', - maxSources: 10, - includeWebSearch: true, - background: false - }; - - expect(testOptions).toBeInstanceOf(Object); - expect(testOptions.query).toEqual('test query'); - expect(testOptions.searchDepth).toEqual('basic'); -}); - -tap.test('Interfaces: ResearchResponse should be properly typed', async () => { - const testResponse: smartai.ResearchResponse = { - answer: 'test answer', - sources: [ - { - url: 'https://example.com', - title: 'Example Source', - snippet: 'This is a snippet' - } - ], - searchQueries: ['query1', 'query2'], - metadata: { - model: 'test-model', - tokensUsed: 100 - } - }; - - expect(testResponse).toBeInstanceOf(Object); - expect(testResponse.answer).toEqual('test answer'); - expect(testResponse.sources).toBeArray(); - expect(testResponse.sources[0].url).toEqual('https://example.com'); -}); - -tap.test('Interfaces: ChatOptions should be properly typed', async () => { - const testChatOptions: smartai.ChatOptions = { - systemMessage: 'You are a helpful assistant', - userMessage: 'Hello', - messageHistory: [ - { role: 'user', content: 'Previous message' }, - { role: 'assistant', content: 'Previous response' } - ] - }; - - expect(testChatOptions).toBeInstanceOf(Object); - expect(testChatOptions.systemMessage).toBeTruthy(); - expect(testChatOptions.messageHistory).toBeArray(); -}); - -tap.test('Interfaces: ChatResponse should be properly typed', async () => { - const testChatResponse: smartai.ChatResponse = { - role: 'assistant', - message: 'This is a response' - }; - - expect(testChatResponse).toBeInstanceOf(Object); - expect(testChatResponse.role).toEqual('assistant'); - expect(testChatResponse.message).toBeTruthy(); -}); - -tap.test('Interfaces: ChatMessage should be properly typed', async () => { - const testMessage: smartai.ChatMessage = { - role: 'user', - content: 'Test message' - }; - - expect(testMessage).toBeInstanceOf(Object); - expect(testMessage.role).toBeOneOf(['user', 'assistant', 'system']); - expect(testMessage.content).toBeTruthy(); -}); - -tap.test('Interfaces: Provider options should be properly typed', async () => { - // OpenAI options - const openaiOptions: smartai.IOpenaiProviderOptions = { - openaiToken: 'test-token', - chatModel: 'gpt-5-mini', - audioModel: 'tts-1-hd', - visionModel: '04-mini', - researchModel: 'o4-mini-deep-research-2025-06-26', - enableWebSearch: true - }; - - expect(openaiOptions).toBeInstanceOf(Object); - expect(openaiOptions.openaiToken).toBeTruthy(); - - // Anthropic options - const anthropicOptions: smartai.IAnthropicProviderOptions = { - anthropicToken: 'test-token', - enableWebSearch: true, - searchDomainAllowList: ['example.com'], - searchDomainBlockList: ['blocked.com'] - }; - - expect(anthropicOptions).toBeInstanceOf(Object); - expect(anthropicOptions.anthropicToken).toBeTruthy(); -}); - -tap.test('Interfaces: Search depth values should be valid', async () => { - const validDepths: smartai.ResearchOptions['searchDepth'][] = ['basic', 'advanced', 'deep']; - - for (const depth of validDepths) { - const options: smartai.ResearchOptions = { - query: 'test', - searchDepth: depth - }; - expect(options.searchDepth).toBeOneOf(['basic', 'advanced', 'deep', undefined]); - } -}); - -tap.test('Interfaces: Optional properties should work correctly', async () => { - // Minimal ResearchOptions - const minimalOptions: smartai.ResearchOptions = { - query: 'test query' - }; - - expect(minimalOptions.query).toBeTruthy(); - expect(minimalOptions.searchDepth).toBeUndefined(); - expect(minimalOptions.maxSources).toBeUndefined(); - - // Minimal ChatOptions - const minimalChat: smartai.ChatOptions = { - systemMessage: 'system', - userMessage: 'user', - messageHistory: [] - }; - - expect(minimalChat.messageHistory).toBeArray(); - expect(minimalChat.messageHistory.length).toEqual(0); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.ollama.ts b/test/test.ollama.ts new file mode 100644 index 0000000..6c97f8d --- /dev/null +++ b/test/test.ollama.ts @@ -0,0 +1,390 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import { createOllamaModel } from '../ts/smartai.provider.ollama.js'; +import type { ISmartAiOptions } from '../ts/smartai.interfaces.js'; + +tap.test('createOllamaModel returns valid LanguageModelV3', async () => { + const model = createOllamaModel({ + provider: 'ollama', + model: 'qwen3:8b', + ollamaOptions: { think: true, num_ctx: 4096 }, + }); + + expect(model.specificationVersion).toEqual('v3'); + expect(model.provider).toEqual('ollama'); + expect(model.modelId).toEqual('qwen3:8b'); + expect(model).toHaveProperty('doGenerate'); + expect(model).toHaveProperty('doStream'); +}); + +tap.test('Qwen models get default temperature 0.55', async () => { + // Mock fetch to capture the request body + const originalFetch = globalThis.fetch; + let capturedBody: Record | undefined; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + capturedBody = JSON.parse(init?.body as string); + return new Response(JSON.stringify({ + message: { content: 'test response', role: 'assistant' }, + done: true, + prompt_eval_count: 10, + eval_count: 5, + }), { status: 200 }); + }; + + try { + const model = createOllamaModel({ + provider: 'ollama', + model: 'qwen3:8b', + }); + + await model.doGenerate({ + prompt: [{ role: 'user', content: [{ type: 'text', text: 'hello' }] }], + inputFormat: 'prompt', + } as any); + + expect(capturedBody).toBeTruthy(); + // Temperature 0.55 should be in the options + expect((capturedBody!.options as Record).temperature).toEqual(0.55); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('think option is passed at top level of request body', async () => { + const originalFetch = globalThis.fetch; + let capturedBody: Record | undefined; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + capturedBody = JSON.parse(init?.body as string); + return new Response(JSON.stringify({ + message: { content: 'test', role: 'assistant', thinking: 'let me think...' }, + done: true, + prompt_eval_count: 10, + eval_count: 5, + }), { status: 200 }); + }; + + try { + const model = createOllamaModel({ + provider: 'ollama', + model: 'qwen3:8b', + ollamaOptions: { think: true, num_ctx: 4096 }, + }); + + await model.doGenerate({ + prompt: [{ role: 'user', content: [{ type: 'text', text: 'hello' }] }], + inputFormat: 'prompt', + } as any); + + expect(capturedBody).toBeTruthy(); + // think should be at top level, not inside options + expect(capturedBody!.think).toEqual(true); + // num_ctx should be in options + expect((capturedBody!.options as Record).num_ctx).toEqual(4096); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('Non-qwen models do not get default temperature', async () => { + const originalFetch = globalThis.fetch; + let capturedBody: Record | undefined; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + capturedBody = JSON.parse(init?.body as string); + return new Response(JSON.stringify({ + message: { content: 'test', role: 'assistant' }, + done: true, + }), { status: 200 }); + }; + + try { + const model = createOllamaModel({ + provider: 'ollama', + model: 'llama3:8b', + }); + + await model.doGenerate({ + prompt: [{ role: 'user', content: [{ type: 'text', text: 'hello' }] }], + inputFormat: 'prompt', + } as any); + + expect(capturedBody).toBeTruthy(); + // No temperature should be set + expect((capturedBody!.options as Record).temperature).toBeUndefined(); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('doGenerate parses reasoning/thinking from response', async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + return new Response(JSON.stringify({ + message: { + content: 'The answer is 42.', + role: 'assistant', + thinking: 'Let me reason about this carefully...', + }, + done: true, + prompt_eval_count: 20, + eval_count: 15, + }), { status: 200 }); + }; + + try { + const model = createOllamaModel({ + provider: 'ollama', + model: 'qwen3:8b', + ollamaOptions: { think: true }, + }); + + const result = await model.doGenerate({ + prompt: [{ role: 'user', content: [{ type: 'text', text: 'What is the meaning of life?' }] }], + } as any); + + // Should have both reasoning and text content + const reasoningParts = result.content.filter(c => c.type === 'reasoning'); + const textParts = result.content.filter(c => c.type === 'text'); + + expect(reasoningParts.length).toEqual(1); + expect((reasoningParts[0] as any).text).toEqual('Let me reason about this carefully...'); + expect(textParts.length).toEqual(1); + expect((textParts[0] as any).text).toEqual('The answer is 42.'); + expect(result.finishReason.unified).toEqual('stop'); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('doGenerate parses tool calls from response', async () => { + const originalFetch = globalThis.fetch; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + return new Response(JSON.stringify({ + message: { + content: '', + role: 'assistant', + tool_calls: [ + { + function: { + name: 'get_weather', + arguments: { location: 'London', unit: 'celsius' }, + }, + }, + ], + }, + done: true, + prompt_eval_count: 30, + eval_count: 10, + }), { status: 200 }); + }; + + try { + const model = createOllamaModel({ + provider: 'ollama', + model: 'qwen3:8b', + }); + + const result = await model.doGenerate({ + prompt: [{ role: 'user', content: [{ type: 'text', text: 'What is the weather in London?' }] }], + tools: [{ + type: 'function' as const, + name: 'get_weather', + description: 'Get weather for a location', + inputSchema: { + type: 'object', + properties: { + location: { type: 'string' }, + unit: { type: 'string' }, + }, + }, + }], + } as any); + + const toolCalls = result.content.filter(c => c.type === 'tool-call'); + expect(toolCalls.length).toEqual(1); + expect((toolCalls[0] as any).toolName).toEqual('get_weather'); + expect(JSON.parse((toolCalls[0] as any).input)).toEqual({ location: 'London', unit: 'celsius' }); + expect(result.finishReason.unified).toEqual('tool-calls'); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('doStream produces correct stream parts', async () => { + const originalFetch = globalThis.fetch; + + // Simulate Ollama's newline-delimited JSON streaming + const chunks = [ + JSON.stringify({ message: { content: 'Hello', role: 'assistant' }, done: false }) + '\n', + JSON.stringify({ message: { content: ' world', role: 'assistant' }, done: false }) + '\n', + JSON.stringify({ message: { content: '!', role: 'assistant' }, done: true, prompt_eval_count: 5, eval_count: 3 }) + '\n', + ]; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + const encoder = new TextEncoder(); + const stream = new ReadableStream({ + start(controller) { + for (const chunk of chunks) { + controller.enqueue(encoder.encode(chunk)); + } + controller.close(); + }, + }); + return new Response(stream, { status: 200 }); + }; + + try { + const model = createOllamaModel({ + provider: 'ollama', + model: 'llama3:8b', + }); + + const result = await model.doStream({ + prompt: [{ role: 'user', content: [{ type: 'text', text: 'hello' }] }], + } as any); + + const parts: any[] = []; + const reader = result.stream.getReader(); + while (true) { + const { done, value } = await reader.read(); + if (done) break; + parts.push(value); + } + + // Should have: text-start, text-delta x3, text-end, finish + const textDeltas = parts.filter(p => p.type === 'text-delta'); + const finishParts = parts.filter(p => p.type === 'finish'); + const textStarts = parts.filter(p => p.type === 'text-start'); + const textEnds = parts.filter(p => p.type === 'text-end'); + + expect(textStarts.length).toEqual(1); + expect(textDeltas.length).toEqual(3); + expect(textDeltas.map((d: any) => d.delta).join('')).toEqual('Hello world!'); + expect(textEnds.length).toEqual(1); + expect(finishParts.length).toEqual(1); + expect(finishParts[0].finishReason.unified).toEqual('stop'); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('doStream handles thinking/reasoning in stream', async () => { + const originalFetch = globalThis.fetch; + + const chunks = [ + JSON.stringify({ message: { thinking: 'Let me think...', content: '', role: 'assistant' }, done: false }) + '\n', + JSON.stringify({ message: { thinking: ' about this.', content: '', role: 'assistant' }, done: false }) + '\n', + JSON.stringify({ message: { content: 'The answer.', role: 'assistant' }, done: false }) + '\n', + JSON.stringify({ message: { content: '', role: 'assistant' }, done: true, prompt_eval_count: 10, eval_count: 8 }) + '\n', + ]; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + const encoder = new TextEncoder(); + const stream = new ReadableStream({ + start(controller) { + for (const chunk of chunks) { + controller.enqueue(encoder.encode(chunk)); + } + controller.close(); + }, + }); + return new Response(stream, { status: 200 }); + }; + + try { + const model = createOllamaModel({ + provider: 'ollama', + model: 'qwen3:8b', + ollamaOptions: { think: true }, + }); + + const result = await model.doStream({ + prompt: [{ role: 'user', content: [{ type: 'text', text: 'think about this' }] }], + } as any); + + const parts: any[] = []; + const reader = result.stream.getReader(); + while (true) { + const { done, value } = await reader.read(); + if (done) break; + parts.push(value); + } + + const reasoningStarts = parts.filter(p => p.type === 'reasoning-start'); + const reasoningDeltas = parts.filter(p => p.type === 'reasoning-delta'); + const reasoningEnds = parts.filter(p => p.type === 'reasoning-end'); + const textDeltas = parts.filter(p => p.type === 'text-delta'); + + expect(reasoningStarts.length).toEqual(1); + expect(reasoningDeltas.length).toEqual(2); + expect(reasoningDeltas.map((d: any) => d.delta).join('')).toEqual('Let me think... about this.'); + expect(reasoningEnds.length).toEqual(1); + expect(textDeltas.length).toEqual(1); + expect(textDeltas[0].delta).toEqual('The answer.'); + } finally { + globalThis.fetch = originalFetch; + } +}); + +tap.test('message conversion handles system, assistant, and tool messages', async () => { + const originalFetch = globalThis.fetch; + let capturedBody: Record | undefined; + + globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { + capturedBody = JSON.parse(init?.body as string); + return new Response(JSON.stringify({ + message: { content: 'response', role: 'assistant' }, + done: true, + }), { status: 200 }); + }; + + try { + const model = createOllamaModel({ + provider: 'ollama', + model: 'llama3:8b', + }); + + await model.doGenerate({ + prompt: [ + { role: 'system', content: 'You are helpful.' }, + { role: 'user', content: [{ type: 'text', text: 'Hi' }] }, + { + role: 'assistant', + content: [ + { type: 'text', text: 'Let me check.' }, + { type: 'tool-call', toolCallId: 'tc1', toolName: 'search', input: '{"q":"test"}' }, + ], + }, + { + role: 'tool', + content: [ + { type: 'tool-result', toolCallId: 'tc1', output: { type: 'text', value: 'result data' } }, + ], + }, + { role: 'user', content: [{ type: 'text', text: 'What did you find?' }] }, + ], + } as any); + + const messages = capturedBody!.messages as Array>; + expect(messages.length).toEqual(5); + expect(messages[0].role).toEqual('system'); + expect(messages[0].content).toEqual('You are helpful.'); + expect(messages[1].role).toEqual('user'); + expect(messages[1].content).toEqual('Hi'); + expect(messages[2].role).toEqual('assistant'); + expect(messages[2].content).toEqual('Let me check.'); + expect((messages[2].tool_calls as any[]).length).toEqual(1); + expect((messages[2].tool_calls as any[])[0].function.name).toEqual('search'); + expect(messages[3].role).toEqual('tool'); + expect(messages[3].content).toEqual('result data'); + expect(messages[4].role).toEqual('user'); + expect(messages[4].content).toEqual('What did you find?'); + } finally { + globalThis.fetch = originalFetch; + } +}); + +export default tap.start(); diff --git a/test/test.research.anthropic.ts b/test/test.research.anthropic.ts deleted file mode 100644 index 1059997..0000000 --- a/test/test.research.anthropic.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import * as smartai from '../ts/index.js'; -import * as path from 'path'; -import { promises as fs } from 'fs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); - -// Helper function to save research results -async function saveResearchResult(testName: string, result: any) { - const sanitizedName = testName.replace(/[^a-z0-9]/gi, '_').toLowerCase(); - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); - const filename = `${sanitizedName}_${timestamp}.json`; - const filepath = path.join('.nogit', 'testresults', 'research', filename); - - await fs.mkdir(path.dirname(filepath), { recursive: true }); - await fs.writeFile(filepath, JSON.stringify(result, null, 2), 'utf-8'); - - console.log(` 💾 Saved to: ${filepath}`); -} - -let anthropicProvider: smartai.AnthropicProvider; - -tap.test('Anthropic Research: should initialize provider with web search', async () => { - anthropicProvider = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - enableWebSearch: true - }); - - await anthropicProvider.start(); - expect(anthropicProvider).toBeInstanceOf(smartai.AnthropicProvider); - expect(typeof anthropicProvider.research).toEqual('function'); -}); - -tap.test('Anthropic Research: should perform basic research query', async () => { - const result = await anthropicProvider.research({ - query: 'What is machine learning and its main applications?', - searchDepth: 'basic' - }); - - console.log('Anthropic Basic Research:'); - console.log('- Answer length:', result.answer.length); - console.log('- Sources found:', result.sources.length); - console.log('- First 200 chars:', result.answer.substring(0, 200)); - - await saveResearchResult('basic_research_machine_learning', result); - - expect(result).toBeTruthy(); - expect(result.answer).toBeTruthy(); - expect(result.answer.toLowerCase()).toInclude('machine learning'); - expect(result.sources).toBeArray(); - expect(result.metadata).toBeTruthy(); -}); - -tap.test('Anthropic Research: should perform research with web search', async () => { - const result = await anthropicProvider.research({ - query: 'What are the latest developments in renewable energy technology?', - searchDepth: 'advanced', - includeWebSearch: true, - maxSources: 5 - }); - - console.log('Anthropic Web Search Research:'); - console.log('- Answer length:', result.answer.length); - console.log('- Sources:', result.sources.length); - if (result.searchQueries) { - console.log('- Search queries:', result.searchQueries); - } - - await saveResearchResult('web_search_renewable_energy', result); - - expect(result.answer).toBeTruthy(); - expect(result.answer.toLowerCase()).toInclude('renewable'); - - // Check if sources were extracted - if (result.sources.length > 0) { - console.log('- Example source:', result.sources[0]); - expect(result.sources[0]).toHaveProperty('url'); - } -}); - -tap.test('Anthropic Research: should handle deep research queries', async () => { - const result = await anthropicProvider.research({ - query: 'Explain the differences between REST and GraphQL APIs', - searchDepth: 'deep' - }); - - console.log('Anthropic Deep Research:'); - console.log('- Answer length:', result.answer.length); - console.log('- Token usage:', result.metadata?.tokensUsed); - - await saveResearchResult('deep_research_rest_vs_graphql', result); - - expect(result.answer).toBeTruthy(); - expect(result.answer.length).toBeGreaterThan(300); - expect(result.answer.toLowerCase()).toInclude('rest'); - expect(result.answer.toLowerCase()).toInclude('graphql'); -}); - -tap.test('Anthropic Research: should extract citations from response', async () => { - const result = await anthropicProvider.research({ - query: 'What is Docker and how does containerization work?', - searchDepth: 'basic', - maxSources: 3 - }); - - console.log('Anthropic Citation Extraction:'); - console.log('- Sources found:', result.sources.length); - console.log('- Answer includes Docker:', result.answer.toLowerCase().includes('docker')); - - await saveResearchResult('citation_extraction_docker', result); - - expect(result.answer).toInclude('Docker'); - - // Check for URL extraction (both markdown and plain URLs) - const hasUrls = result.answer.includes('http') || result.sources.length > 0; - console.log('- Contains URLs or sources:', hasUrls); -}); - -tap.test('Anthropic Research: should use domain filtering when configured', async () => { - // Create a new provider with domain restrictions - const filteredProvider = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - enableWebSearch: true, - searchDomainAllowList: ['wikipedia.org', 'docs.microsoft.com'], - searchDomainBlockList: ['reddit.com'] - }); - - await filteredProvider.start(); - - const result = await filteredProvider.research({ - query: 'What is JavaScript?', - searchDepth: 'basic' - }); - - console.log('Anthropic Domain Filtering Test:'); - console.log('- Answer length:', result.answer.length); - console.log('- Applied domain filters (allow: wikipedia, docs.microsoft)'); - - await saveResearchResult('domain_filtering_javascript', result); - - expect(result.answer).toBeTruthy(); - expect(result.answer.toLowerCase()).toInclude('javascript'); - - await filteredProvider.stop(); -}); - -tap.test('Anthropic Research: should handle errors gracefully', async () => { - let errorCaught = false; - - try { - await anthropicProvider.research({ - query: '', // Empty query - searchDepth: 'basic' - }); - } catch (error) { - errorCaught = true; - console.log('Expected error for empty query:', error.message.substring(0, 100)); - } - - // Anthropic might handle empty queries differently - console.log(`Empty query error test - Error caught: ${errorCaught}`); -}); - -tap.test('Anthropic Research: should handle different search depths', async () => { - // Test basic search depth - const basicResult = await anthropicProvider.research({ - query: 'What is Python?', - searchDepth: 'basic' - }); - - // Test advanced search depth - const advancedResult = await anthropicProvider.research({ - query: 'What is Python?', - searchDepth: 'advanced' - }); - - console.log('Anthropic Search Depth Comparison:'); - console.log('- Basic answer length:', basicResult.answer.length); - console.log('- Advanced answer length:', advancedResult.answer.length); - console.log('- Basic tokens:', basicResult.metadata?.tokensUsed); - console.log('- Advanced tokens:', advancedResult.metadata?.tokensUsed); - - await saveResearchResult('search_depth_python_basic', basicResult); - await saveResearchResult('search_depth_python_advanced', advancedResult); - - expect(basicResult.answer).toBeTruthy(); - expect(advancedResult.answer).toBeTruthy(); - - // Advanced search typically produces longer answers - // But this isn't guaranteed, so we just check they exist - expect(basicResult.answer.toLowerCase()).toInclude('python'); - expect(advancedResult.answer.toLowerCase()).toInclude('python'); -}); - -tap.test('Anthropic Research: ARM vs. Qualcomm comparison', async () => { - const result = await anthropicProvider.research({ - query: 'Compare ARM and Qualcomm: their technologies, market positions, and recent developments in the mobile and computing sectors', - searchDepth: 'advanced', - includeWebSearch: true, - maxSources: 10 - }); - - console.log('ARM vs. Qualcomm Research:'); - console.log('- Answer length:', result.answer.length); - console.log('- Sources found:', result.sources.length); - console.log('- First 300 chars:', result.answer.substring(0, 300)); - - await saveResearchResult('arm_vs_qualcomm_comparison', result); - - expect(result.answer).toBeTruthy(); - expect(result.answer.length).toBeGreaterThan(500); - expect(result.answer.toLowerCase()).toInclude('arm'); - expect(result.answer.toLowerCase()).toInclude('qualcomm'); - expect(result.sources.length).toBeGreaterThan(0); -}); - -tap.test('Anthropic Research: should clean up provider', async () => { - await anthropicProvider.stop(); - console.log('Anthropic research provider stopped successfully'); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.research.openai.ts b/test/test.research.openai.ts deleted file mode 100644 index 06d6cf3..0000000 --- a/test/test.research.openai.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import * as smartai from '../ts/index.js'; -import * as path from 'path'; -import { promises as fs } from 'fs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); - -// Helper function to save research results -async function saveResearchResult(testName: string, result: any) { - const sanitizedName = testName.replace(/[^a-z0-9]/gi, '_').toLowerCase(); - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); - const filename = `openai_${sanitizedName}_${timestamp}.json`; - const filepath = path.join('.nogit', 'testresults', 'research', filename); - - await fs.mkdir(path.dirname(filepath), { recursive: true }); - await fs.writeFile(filepath, JSON.stringify(result, null, 2), 'utf-8'); - - console.log(` 💾 Saved to: ${filepath}`); -} - -let openaiProvider: smartai.OpenAiProvider; - -tap.test('OpenAI Research: should initialize provider with research capabilities', async () => { - openaiProvider = new smartai.OpenAiProvider({ - openaiToken: await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'), - researchModel: 'o4-mini-deep-research-2025-06-26', - enableWebSearch: true - }); - - await openaiProvider.start(); - expect(openaiProvider).toBeInstanceOf(smartai.OpenAiProvider); - expect(typeof openaiProvider.research).toEqual('function'); -}); - -tap.test('OpenAI Research: should perform basic research query', async () => { - const result = await openaiProvider.research({ - query: 'What is TypeScript and why is it useful for web development?', - searchDepth: 'basic' - }); - - console.log('OpenAI Basic Research:'); - console.log('- Answer length:', result.answer.length); - console.log('- Sources found:', result.sources.length); - console.log('- First 200 chars:', result.answer.substring(0, 200)); - - await saveResearchResult('basic_research_typescript', result); - - expect(result).toBeTruthy(); - expect(result.answer).toBeTruthy(); - expect(result.answer.toLowerCase()).toInclude('typescript'); - expect(result.sources).toBeArray(); - expect(result.metadata).toBeTruthy(); - expect(result.metadata.model).toBeTruthy(); -}); - -tap.test('OpenAI Research: should perform research with web search enabled', async () => { - const result = await openaiProvider.research({ - query: 'What are the latest features in ECMAScript 2024?', - searchDepth: 'advanced', - includeWebSearch: true, - maxSources: 5 - }); - - console.log('OpenAI Web Search Research:'); - console.log('- Answer length:', result.answer.length); - console.log('- Sources:', result.sources.length); - if (result.searchQueries) { - console.log('- Search queries used:', result.searchQueries); - } - - await saveResearchResult('web_search_ecmascript', result); - - expect(result.answer).toBeTruthy(); - expect(result.answer.toLowerCase()).toInclude('ecmascript'); - - // The model might include sources or search queries - if (result.sources.length > 0) { - expect(result.sources[0]).toHaveProperty('url'); - expect(result.sources[0]).toHaveProperty('title'); - } -}); - -tap.test('OpenAI Research: should handle deep research for complex topics', async () => { - // Skip this test if it takes too long or costs too much - // You can enable it for thorough testing - const skipDeepResearch = true; - - if (skipDeepResearch) { - console.log('Skipping deep research test to save API costs'); - return; - } - - const result = await openaiProvider.research({ - query: 'Compare the pros and cons of microservices vs monolithic architecture', - searchDepth: 'deep', - includeWebSearch: true - }); - - console.log('OpenAI Deep Research:'); - console.log('- Answer length:', result.answer.length); - console.log('- Token usage:', result.metadata?.tokensUsed); - - expect(result.answer).toBeTruthy(); - expect(result.answer.length).toBeGreaterThan(500); - expect(result.answer.toLowerCase()).toInclude('microservices'); - expect(result.answer.toLowerCase()).toInclude('monolithic'); -}); - -tap.test('OpenAI Research: should extract sources from markdown links', async () => { - const result = await openaiProvider.research({ - query: 'What is Node.js and provide some official documentation links?', - searchDepth: 'basic', - maxSources: 3 - }); - - console.log('OpenAI Source Extraction:'); - console.log('- Sources found:', result.sources.length); - - await saveResearchResult('source_extraction_nodejs', result); - - if (result.sources.length > 0) { - console.log('- Example source:', result.sources[0]); - expect(result.sources[0].url).toBeTruthy(); - expect(result.sources[0].title).toBeTruthy(); - } - - expect(result.answer).toInclude('Node.js'); -}); - -tap.test('OpenAI Research: should handle research errors gracefully', async () => { - // Test with an extremely long query that might cause issues - const longQuery = 'a'.repeat(10000); - - let errorCaught = false; - try { - await openaiProvider.research({ - query: longQuery, - searchDepth: 'basic' - }); - } catch (error) { - errorCaught = true; - console.log('Expected error for long query:', error.message.substring(0, 100)); - expect(error.message).toBeTruthy(); - } - - // OpenAI might handle long queries, so we don't assert the error - console.log(`Long query error test - Error caught: ${errorCaught}`); -}); - -tap.test('OpenAI Research: should respect maxSources parameter', async () => { - const maxSources = 3; - const result = await openaiProvider.research({ - query: 'List popular JavaScript frameworks', - searchDepth: 'basic', - maxSources: maxSources - }); - - console.log(`OpenAI Max Sources Test - Requested: ${maxSources}, Found: ${result.sources.length}`); - - // The API might not always return exactly maxSources, but should respect it as a limit - if (result.sources.length > 0) { - expect(result.sources.length).toBeLessThanOrEqual(maxSources * 2); // Allow some flexibility - } -}); - -tap.test('OpenAI Research: should clean up provider', async () => { - await openaiProvider.stop(); - console.log('OpenAI research provider stopped successfully'); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.research.stubs.ts b/test/test.research.stubs.ts deleted file mode 100644 index d15b1a5..0000000 --- a/test/test.research.stubs.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { tap, expect } from '@git.zone/tstest/tapbundle'; -import * as smartai from '../ts/index.js'; - -// Test research method stubs for providers without full implementation -// These providers have research methods that throw "not yet supported" errors - -tap.test('Research Stubs: Perplexity provider should have research method', async () => { - const perplexityProvider = new smartai.PerplexityProvider({ - perplexityToken: 'test-token' - }); - - // Perplexity has a basic implementation with Sonar models - expect(typeof perplexityProvider.research).toEqual('function'); -}); - -tap.test('Research Stubs: Groq provider should throw not supported error', async () => { - const groqProvider = new smartai.GroqProvider({ - groqToken: 'test-token' - }); - - expect(typeof groqProvider.research).toEqual('function'); - - let errorCaught = false; - try { - await groqProvider.research({ query: 'test' }); - } catch (error) { - errorCaught = true; - expect(error.message).toInclude('not yet supported'); - } - expect(errorCaught).toBeTrue(); -}); - -tap.test('Research Stubs: Ollama provider should throw not supported error', async () => { - const ollamaProvider = new smartai.OllamaProvider({}); - - expect(typeof ollamaProvider.research).toEqual('function'); - - let errorCaught = false; - try { - await ollamaProvider.research({ query: 'test' }); - } catch (error) { - errorCaught = true; - expect(error.message).toInclude('not yet supported'); - } - expect(errorCaught).toBeTrue(); -}); - -tap.test('Research Stubs: xAI provider should throw not supported error', async () => { - const xaiProvider = new smartai.XAIProvider({ - xaiToken: 'test-token' - }); - - expect(typeof xaiProvider.research).toEqual('function'); - - let errorCaught = false; - try { - await xaiProvider.research({ query: 'test' }); - } catch (error) { - errorCaught = true; - expect(error.message).toInclude('not yet supported'); - } - expect(errorCaught).toBeTrue(); -}); - -tap.test('Research Stubs: Exo provider should throw not supported error', async () => { - const exoProvider = new smartai.ExoProvider({}); - - expect(typeof exoProvider.research).toEqual('function'); - - let errorCaught = false; - try { - await exoProvider.research({ query: 'test' }); - } catch (error) { - errorCaught = true; - expect(error.message).toInclude('not yet supported'); - } - expect(errorCaught).toBeTrue(); -}); - -export default tap.start(); \ No newline at end of file diff --git a/test/test.research.ts b/test/test.research.ts new file mode 100644 index 0000000..fb5a816 --- /dev/null +++ b/test/test.research.ts @@ -0,0 +1,31 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as qenv from '@push.rocks/qenv'; +import { research } from '../ts_research/index.js'; + +const testQenv = new qenv.Qenv('./', './.nogit/'); + +tap.test('research should return answer and sources', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'); + if (!apiKey) { + console.log('ANTHROPIC_TOKEN not set, skipping test'); + return; + } + + const result = await research({ + apiKey, + query: 'What is the current version of Node.js?', + searchDepth: 'basic', + }); + + console.log('Research answer:', result.answer.substring(0, 200)); + console.log('Research sources:', result.sources.length); + if (result.searchQueries) { + console.log('Search queries:', result.searchQueries); + } + + expect(result.answer).toBeTruthy(); + expect(result.answer.length).toBeGreaterThan(10); + expect(result.sources).toBeArray(); +}); + +export default tap.start(); diff --git a/test/test.smartai.ts b/test/test.smartai.ts new file mode 100644 index 0000000..d1e5d76 --- /dev/null +++ b/test/test.smartai.ts @@ -0,0 +1,161 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as qenv from '@push.rocks/qenv'; +import * as smartai from '../ts/index.js'; + +const testQenv = new qenv.Qenv('./', './.nogit/'); + +tap.test('getModel should return a LanguageModelV3 for anthropic', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'); + if (!apiKey) { + console.log('ANTHROPIC_TOKEN not set, skipping test'); + return; + } + + const model = smartai.getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey, + }); + + expect(model).toHaveProperty('specificationVersion'); + expect(model).toHaveProperty('provider'); + expect(model).toHaveProperty('modelId'); + expect(model).toHaveProperty('doGenerate'); + expect(model).toHaveProperty('doStream'); +}); + +tap.test('getModel with anthropic prompt caching returns wrapped model', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'); + if (!apiKey) { + console.log('ANTHROPIC_TOKEN not set, skipping test'); + return; + } + + // Default: prompt caching enabled + const model = smartai.getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey, + }); + + // With caching disabled + const modelNoCaching = smartai.getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey, + promptCaching: false, + }); + + // Both should be valid models + expect(model).toHaveProperty('doGenerate'); + expect(modelNoCaching).toHaveProperty('doGenerate'); +}); + +tap.test('generateText with anthropic model', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'); + if (!apiKey) { + console.log('ANTHROPIC_TOKEN not set, skipping test'); + return; + } + + const model = smartai.getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey, + }); + + const result = await smartai.generateText({ + model, + prompt: 'Say hello in exactly 3 words.', + }); + + console.log('Anthropic response:', result.text); + expect(result.text).toBeTruthy(); + expect(result.text.length).toBeGreaterThan(0); +}); + +tap.test('getModel should return a LanguageModelV3 for openai', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'); + if (!apiKey) { + console.log('OPENAI_TOKEN not set, skipping test'); + return; + } + + const model = smartai.getModel({ + provider: 'openai', + model: 'gpt-4o-mini', + apiKey, + }); + + expect(model).toHaveProperty('doGenerate'); + expect(model).toHaveProperty('doStream'); +}); + +tap.test('streamText with anthropic model', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'); + if (!apiKey) { + console.log('ANTHROPIC_TOKEN not set, skipping test'); + return; + } + + const model = smartai.getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey, + }); + + const result = await smartai.streamText({ + model, + prompt: 'Count from 1 to 5.', + }); + + const tokens: string[] = []; + for await (const chunk of result.textStream) { + tokens.push(chunk); + } + + const fullText = tokens.join(''); + console.log('Streamed text:', fullText); + expect(fullText).toBeTruthy(); + expect(fullText.length).toBeGreaterThan(0); + expect(tokens.length).toBeGreaterThan(1); // Should have multiple chunks +}); + +tap.test('generateText with openai model', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('OPENAI_TOKEN'); + if (!apiKey) { + console.log('OPENAI_TOKEN not set, skipping test'); + return; + } + + const model = smartai.getModel({ + provider: 'openai', + model: 'gpt-4o-mini', + apiKey, + }); + + const result = await smartai.generateText({ + model, + prompt: 'What is 2+2? Reply with just the number.', + }); + + console.log('OpenAI response:', result.text); + expect(result.text).toBeTruthy(); + expect(result.text).toInclude('4'); +}); + +tap.test('getModel should throw for unknown provider', async () => { + let threw = false; + try { + smartai.getModel({ + provider: 'nonexistent' as any, + model: 'test', + }); + } catch (e) { + threw = true; + expect(e.message).toInclude('Unknown provider'); + } + expect(threw).toBeTrue(); +}); + +export default tap.start(); diff --git a/test/test.thinking.anthropic.ts b/test/test.thinking.anthropic.ts deleted file mode 100644 index c6f953a..0000000 --- a/test/test.thinking.anthropic.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); - -import * as smartai from '../ts/index.js'; - -let anthropicProviderQuick: smartai.AnthropicProvider; -let anthropicProviderNormal: smartai.AnthropicProvider; -let anthropicProviderDeep: smartai.AnthropicProvider; -let anthropicProviderOff: smartai.AnthropicProvider; - -// Test 'quick' mode -tap.test('Extended Thinking: should create Anthropic provider with quick mode', async () => { - anthropicProviderQuick = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - extendedThinking: 'quick', - }); - await anthropicProviderQuick.start(); - expect(anthropicProviderQuick).toBeInstanceOf(smartai.AnthropicProvider); -}); - -tap.test('Extended Thinking: should chat with quick mode (2048 tokens)', async () => { - const userMessage = 'Explain quantum entanglement in simple terms.'; - const response = await anthropicProviderQuick.chat({ - systemMessage: 'You are a helpful physics teacher.', - userMessage: userMessage, - messageHistory: [], - }); - console.log(`Quick Mode - User: ${userMessage}`); - console.log(`Quick Mode - Response length: ${response.message.length} chars`); - expect(response.role).toEqual('assistant'); - expect(response.message).toBeTruthy(); - expect(response.message.toLowerCase()).toInclude('quantum'); -}); - -tap.test('Extended Thinking: should stop quick mode provider', async () => { - await anthropicProviderQuick.stop(); -}); - -// Test 'normal' mode (default) -tap.test('Extended Thinking: should create Anthropic provider with normal mode (default)', async () => { - anthropicProviderNormal = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - // extendedThinking not specified, should default to 'normal' - }); - await anthropicProviderNormal.start(); - expect(anthropicProviderNormal).toBeInstanceOf(smartai.AnthropicProvider); -}); - -tap.test('Extended Thinking: should chat with normal mode (8000 tokens default)', async () => { - const userMessage = 'What are the implications of the P vs NP problem?'; - const response = await anthropicProviderNormal.chat({ - systemMessage: 'You are a helpful computer science expert.', - userMessage: userMessage, - messageHistory: [], - }); - console.log(`Normal Mode - User: ${userMessage}`); - console.log(`Normal Mode - Response length: ${response.message.length} chars`); - expect(response.role).toEqual('assistant'); - expect(response.message).toBeTruthy(); - expect(response.message.length).toBeGreaterThan(50); -}); - -tap.test('Extended Thinking: should stop normal mode provider', async () => { - await anthropicProviderNormal.stop(); -}); - -// Test 'deep' mode -tap.test('Extended Thinking: should create Anthropic provider with deep mode', async () => { - anthropicProviderDeep = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - extendedThinking: 'deep', - }); - await anthropicProviderDeep.start(); - expect(anthropicProviderDeep).toBeInstanceOf(smartai.AnthropicProvider); -}); - -tap.test('Extended Thinking: should chat with deep mode (16000 tokens)', async () => { - const userMessage = 'Analyze the philosophical implications of artificial consciousness.'; - const response = await anthropicProviderDeep.chat({ - systemMessage: 'You are a philosopher and cognitive scientist.', - userMessage: userMessage, - messageHistory: [], - }); - console.log(`Deep Mode - User: ${userMessage}`); - console.log(`Deep Mode - Response length: ${response.message.length} chars`); - expect(response.role).toEqual('assistant'); - expect(response.message).toBeTruthy(); - expect(response.message.length).toBeGreaterThan(100); -}); - -tap.test('Extended Thinking: should stop deep mode provider', async () => { - await anthropicProviderDeep.stop(); -}); - -// Test 'off' mode -tap.test('Extended Thinking: should create Anthropic provider with thinking disabled', async () => { - anthropicProviderOff = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - extendedThinking: 'off', - }); - await anthropicProviderOff.start(); - expect(anthropicProviderOff).toBeInstanceOf(smartai.AnthropicProvider); -}); - -tap.test('Extended Thinking: should chat with thinking disabled', async () => { - const userMessage = 'What is 2 + 2?'; - const response = await anthropicProviderOff.chat({ - systemMessage: 'You are a helpful assistant.', - userMessage: userMessage, - messageHistory: [], - }); - console.log(`Thinking Off - User: ${userMessage}`); - console.log(`Thinking Off - Response: ${response.message}`); - expect(response.role).toEqual('assistant'); - expect(response.message).toBeTruthy(); - expect(response.message).toInclude('4'); -}); - -tap.test('Extended Thinking: should stop off mode provider', async () => { - await anthropicProviderOff.stop(); -}); - -// Test with vision method -tap.test('Extended Thinking: should work with vision method', async () => { - const provider = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - extendedThinking: 'normal', - }); - await provider.start(); - - // Create a simple test image (1x1 red pixel PNG) - const redPixelPng = Buffer.from( - 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==', - 'base64' - ); - - const response = await provider.vision({ - image: redPixelPng, - prompt: 'What color is this image?', - }); - - console.log(`Vision with Thinking - Response: ${response}`); - expect(response).toBeTruthy(); - expect(response.toLowerCase()).toInclude('red'); - - await provider.stop(); -}); - -export default tap.start(); diff --git a/test/test.vision.anthropic.ts b/test/test.vision.anthropic.ts deleted file mode 100644 index acf53b7..0000000 --- a/test/test.vision.anthropic.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { expect, tap } from '@git.zone/tstest/tapbundle'; -import * as qenv from '@push.rocks/qenv'; -import { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs'; - -const testQenv = new qenv.Qenv('./', './.nogit/'); -const smartfs = new SmartFs(new SmartFsProviderNode()); - -import * as smartai from '../ts/index.js'; - -let anthropicProvider: smartai.AnthropicProvider; - -tap.test('Anthropic Vision: should create and start Anthropic provider', async () => { - anthropicProvider = new smartai.AnthropicProvider({ - anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'), - }); - await anthropicProvider.start(); - expect(anthropicProvider).toBeInstanceOf(smartai.AnthropicProvider); -}); - -tap.test('Anthropic Vision: should analyze coffee image with latte art', async () => { - // Test 1: Coffee image from Unsplash by Dani - const imagePath = './test/testimages/coffee-dani/coffee.jpg'; - console.log(`Loading coffee image from: ${imagePath}`); - - const imageBuffer = await smartfs.file(imagePath).read(); - console.log(`Image loaded, size: ${imageBuffer.length} bytes`); - - const result = await anthropicProvider.vision({ - image: imageBuffer, - prompt: 'Describe this coffee image. What do you see in terms of the cup, foam pattern, and overall composition?' - }); - - console.log(`Anthropic Vision (Coffee) - Result: ${result}`); - expect(result).toBeTruthy(); - expect(typeof result).toEqual('string'); - expect(result.toLowerCase()).toInclude('coffee'); - // The image has a heart pattern in the latte art - const mentionsLatte = result.toLowerCase().includes('heart') || - result.toLowerCase().includes('latte') || - result.toLowerCase().includes('foam'); - expect(mentionsLatte).toBeTrue(); -}); - -tap.test('Anthropic Vision: should analyze laptop/workspace image', async () => { - // Test 2: Laptop image from Unsplash by Nicolas Bichon - const imagePath = './test/testimages/laptop-nicolas/laptop.jpg'; - console.log(`Loading laptop image from: ${imagePath}`); - - const imageBuffer = await smartfs.file(imagePath).read(); - console.log(`Image loaded, size: ${imageBuffer.length} bytes`); - - const result = await anthropicProvider.vision({ - image: imageBuffer, - prompt: 'Describe the technology and workspace setup in this image. What devices and equipment can you see?' - }); - - console.log(`Anthropic Vision (Laptop) - Result: ${result}`); - expect(result).toBeTruthy(); - expect(typeof result).toEqual('string'); - // Should mention laptop, computer, keyboard, or desk - const mentionsTech = result.toLowerCase().includes('laptop') || - result.toLowerCase().includes('computer') || - result.toLowerCase().includes('keyboard') || - result.toLowerCase().includes('desk'); - expect(mentionsTech).toBeTrue(); -}); - -tap.test('Anthropic Vision: should analyze receipt/document image', async () => { - // Test 3: Receipt image from Unsplash by Annie Spratt - const imagePath = './test/testimages/receipt-annie/receipt.jpg'; - console.log(`Loading receipt image from: ${imagePath}`); - - const imageBuffer = await smartfs.file(imagePath).read(); - console.log(`Image loaded, size: ${imageBuffer.length} bytes`); - - const result = await anthropicProvider.vision({ - image: imageBuffer, - prompt: 'What type of document is this? Can you identify any text or numbers visible in the image?' - }); - - console.log(`Anthropic Vision (Receipt) - Result: ${result}`); - expect(result).toBeTruthy(); - expect(typeof result).toEqual('string'); - // Should mention receipt, document, text, or paper - const mentionsDocument = result.toLowerCase().includes('receipt') || - result.toLowerCase().includes('document') || - result.toLowerCase().includes('text') || - result.toLowerCase().includes('paper'); - expect(mentionsDocument).toBeTrue(); -}); - -tap.test('Anthropic Vision: should stop the provider', async () => { - await anthropicProvider.stop(); -}); - -export default tap.start(); diff --git a/test/test.vision.ts b/test/test.vision.ts new file mode 100644 index 0000000..03ce6b4 --- /dev/null +++ b/test/test.vision.ts @@ -0,0 +1,66 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; +import * as qenv from '@push.rocks/qenv'; +import * as fs from 'fs'; +import * as path from 'path'; +import { getModel } from '../ts/index.js'; +import { analyzeImage } from '../ts_vision/index.js'; + +const testQenv = new qenv.Qenv('./', './.nogit/'); + +tap.test('analyzeImage should describe a test image', async () => { + const apiKey = await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'); + if (!apiKey) { + console.log('ANTHROPIC_TOKEN not set, skipping test'); + return; + } + + // Find an image file recursively in testimages/ + const testImageDir = path.join(process.cwd(), 'test', 'testimages'); + if (!fs.existsSync(testImageDir)) { + console.log('No test images directory found, skipping test'); + return; + } + + const findImage = (dir: string): string | null => { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + const found = findImage(fullPath); + if (found) return found; + } else if (/\.(jpg|jpeg|png)$/i.test(entry.name)) { + return fullPath; + } + } + return null; + }; + + const imagePath = findImage(testImageDir); + if (!imagePath) { + console.log('No test images found, skipping test'); + return; + } + + const imageBuffer = fs.readFileSync(imagePath); + const ext = path.extname(imagePath).toLowerCase(); + const mediaType = ext === '.png' ? 'image/png' : 'image/jpeg'; + + const model = getModel({ + provider: 'anthropic', + model: 'claude-sonnet-4-5-20250929', + apiKey, + promptCaching: false, + }); + + const result = await analyzeImage({ + model, + image: imageBuffer, + prompt: 'Describe this image briefly.', + mediaType: mediaType as 'image/jpeg' | 'image/png', + }); + + console.log('Vision result:', result); + expect(result).toBeTruthy(); + expect(result.length).toBeGreaterThan(10); +}); + +export default tap.start(); diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 29493c0..80061a2 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@push.rocks/smartai', - version: '0.13.3', - description: 'SmartAi is a versatile TypeScript library designed to facilitate integration and interaction with various AI models, offering functionalities for chat, audio generation, document processing, and vision tasks.' + version: '2.0.0', + description: 'Provider registry and capability utilities for ai-sdk (Vercel AI SDK). Core export returns LanguageModel; subpath exports provide vision, audio, image, document and research capabilities.' } diff --git a/ts/abstract.classes.multimodal.ts b/ts/abstract.classes.multimodal.ts deleted file mode 100644 index 7c3fac7..0000000 --- a/ts/abstract.classes.multimodal.ts +++ /dev/null @@ -1,240 +0,0 @@ -import * as plugins from './plugins.js'; - -/** - * Message format for chat interactions - */ -export interface ChatMessage { - role: 'assistant' | 'user' | 'system'; - content: string; - /** Base64-encoded images for vision-capable models */ - images?: string[]; - /** Chain-of-thought reasoning for GPT-OSS models (e.g., Ollama) */ - reasoning?: string; -} - -/** - * Options for chat interactions - */ -export interface ChatOptions { - systemMessage: string; - userMessage: string; - messageHistory: ChatMessage[]; - /** Base64-encoded images for the current message (vision-capable models) */ - images?: string[]; -} - -/** - * Options for streaming chat interactions - */ -export interface StreamingChatOptions extends ChatOptions { - /** Callback fired for each token during generation */ - onToken?: (token: string) => void; -} - -/** - * Response format for chat interactions - */ -export interface ChatResponse { - role: 'assistant'; - message: string; - /** Chain-of-thought reasoning from reasoning models */ - reasoning?: string; -} - -/** - * Options for research interactions - */ -export interface ResearchOptions { - query: string; - searchDepth?: 'basic' | 'advanced' | 'deep'; - maxSources?: number; - includeWebSearch?: boolean; - background?: boolean; -} - -/** - * Response format for research interactions - */ -export interface ResearchResponse { - answer: string; - sources: Array<{ - url: string; - title: string; - snippet: string; - }>; - searchQueries?: string[]; - metadata?: any; -} - -/** - * Options for image generation - */ -export interface ImageGenerateOptions { - prompt: string; - model?: 'gpt-image-1' | 'dall-e-3' | 'dall-e-2'; - quality?: 'low' | 'medium' | 'high' | 'standard' | 'hd' | 'auto'; - size?: '256x256' | '512x512' | '1024x1024' | '1536x1024' | '1024x1536' | '1792x1024' | '1024x1792' | 'auto'; - style?: 'vivid' | 'natural'; - background?: 'transparent' | 'opaque' | 'auto'; - outputFormat?: 'png' | 'jpeg' | 'webp'; - outputCompression?: number; // 0-100 for webp/jpeg - moderation?: 'low' | 'auto'; - n?: number; // Number of images to generate - stream?: boolean; - partialImages?: number; // 0-3 for streaming -} - -/** - * Options for image editing - */ -export interface ImageEditOptions { - image: Buffer; - prompt: string; - mask?: Buffer; - model?: 'gpt-image-1' | 'dall-e-2'; - quality?: 'low' | 'medium' | 'high' | 'standard' | 'auto'; - size?: '256x256' | '512x512' | '1024x1024' | '1536x1024' | '1024x1536' | 'auto'; - background?: 'transparent' | 'opaque' | 'auto'; - outputFormat?: 'png' | 'jpeg' | 'webp'; - outputCompression?: number; - n?: number; - stream?: boolean; - partialImages?: number; -} - -/** - * Response format for image operations - */ -export interface ImageResponse { - images: Array<{ - b64_json?: string; - url?: string; - revisedPrompt?: string; - }>; - metadata?: { - model: string; - quality?: string; - size?: string; - outputFormat?: string; - tokensUsed?: number; - }; -} - -/** - * Abstract base class for multi-modal AI models. - * Provides a common interface for different AI providers (OpenAI, Anthropic, Perplexity, Ollama) - */ -export abstract class MultiModalModel { - /** - * SmartPdf instance for document processing - * Lazy-loaded only when PDF processing is needed to avoid starting browser unnecessarily - */ - protected smartpdfInstance: plugins.smartpdf.SmartPdf | null = null; - - /** - * Ensures SmartPdf instance is initialized and ready - * Call this before using smartpdfInstance in document processing methods - */ - protected async ensureSmartpdfReady(): Promise { - if (!this.smartpdfInstance) { - this.smartpdfInstance = new plugins.smartpdf.SmartPdf(); - await this.smartpdfInstance.start(); - } - } - - /** - * Initializes the model and any necessary resources - * Should be called before using any other methods - */ - public async start(): Promise { - // SmartPdf is now lazy-loaded only when needed for PDF processing - // This avoids starting a browser unless document() method is actually used - } - - /** - * Cleans up any resources used by the model - * Should be called when the model is no longer needed - */ - public async stop(): Promise { - if (this.smartpdfInstance) { - await this.smartpdfInstance.stop(); - this.smartpdfInstance = null; - } - } - - /** - * Synchronous chat interaction with the model - * @param optionsArg Options containing system message, user message, and message history - * @returns Promise resolving to the assistant's response - */ - public abstract chat(optionsArg: ChatOptions): Promise; - - /** - * Streaming interface for chat interactions - * Allows for real-time responses from the model - * @param input Stream of user messages - * @returns Stream of model responses - */ - public abstract chatStream(input: ReadableStream): Promise>; - - /** - * Streaming chat with token callback - * Calls onToken for each token generated, returns final response - * @param optionsArg Options containing system message, user message, message history, and onToken callback - * @returns Promise resolving to the assistant's response - */ - public chatStreaming?(optionsArg: StreamingChatOptions): Promise; - - /** - * Text-to-speech conversion - * @param optionsArg Options containing the message to convert to speech - * @returns Promise resolving to a readable stream of audio data - * @throws Error if the provider doesn't support audio generation - */ - public abstract audio(optionsArg: { message: string }): Promise; - - /** - * Vision-language processing - * @param optionsArg Options containing the image and prompt for analysis - * @returns Promise resolving to the model's description or analysis of the image - * @throws Error if the provider doesn't support vision tasks - */ - public abstract vision(optionsArg: { image: Buffer; prompt: string }): Promise; - - /** - * Document analysis and processing - * @param optionsArg Options containing system message, user message, PDF documents, and message history - * @returns Promise resolving to the model's analysis of the documents - * @throws Error if the provider doesn't support document processing - */ - public abstract document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: ChatMessage[]; - }): Promise<{ message: any }>; - - /** - * Research and web search capabilities - * @param optionsArg Options containing the research query and configuration - * @returns Promise resolving to the research results with sources - * @throws Error if the provider doesn't support research capabilities - */ - public abstract research(optionsArg: ResearchOptions): Promise; - - /** - * Image generation from text prompts - * @param optionsArg Options containing the prompt and generation parameters - * @returns Promise resolving to the generated image(s) - * @throws Error if the provider doesn't support image generation - */ - public abstract imageGenerate(optionsArg: ImageGenerateOptions): Promise; - - /** - * Image editing and inpainting - * @param optionsArg Options containing the image, prompt, and editing parameters - * @returns Promise resolving to the edited image(s) - * @throws Error if the provider doesn't support image editing - */ - public abstract imageEdit(optionsArg: ImageEditOptions): Promise; -} diff --git a/ts/classes.conversation.ts b/ts/classes.conversation.ts deleted file mode 100644 index 4a651e2..0000000 --- a/ts/classes.conversation.ts +++ /dev/null @@ -1,176 +0,0 @@ -import type { SmartAi } from "./classes.smartai.js"; -import { OpenAiProvider } from "./provider.openai.js"; - -type TProcessFunction = (input: string) => Promise; - -export interface IConversationOptions { - processFunction: TProcessFunction; -} - -/** - * a conversation - */ -export class Conversation { - // STATIC - public static async createWithOpenAi(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.openaiProvider) { - throw new Error('OpenAI provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - public static async createWithAnthropic(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.anthropicProvider) { - throw new Error('Anthropic provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - public static async createWithPerplexity(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.perplexityProvider) { - throw new Error('Perplexity provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - public static async createWithExo(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.exoProvider) { - throw new Error('Exo provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - public static async createWithOllama(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.ollamaProvider) { - throw new Error('Ollama provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - public static async createWithGroq(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.groqProvider) { - throw new Error('Groq provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - public static async createWithMistral(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.mistralProvider) { - throw new Error('Mistral provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - public static async createWithXai(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.xaiProvider) { - throw new Error('XAI provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - public static async createWithElevenlabs(smartaiRefArg: SmartAi) { - if (!smartaiRefArg.elevenlabsProvider) { - throw new Error('ElevenLabs provider not available'); - } - const conversation = new Conversation(smartaiRefArg, { - processFunction: async (input) => { - return '' // TODO implement proper streaming - } - }); - return conversation; - } - - // INSTANCE - smartaiRef: SmartAi - private systemMessage: string; - private processFunction: TProcessFunction; - private inputStreamWriter: WritableStreamDefaultWriter | null = null; - private outputStreamController: ReadableStreamDefaultController | null = null; - - constructor(smartairefArg: SmartAi, options: IConversationOptions) { - this.processFunction = options.processFunction; - } - - public async setSystemMessage(systemMessageArg: string) { - this.systemMessage = systemMessageArg; - } - - private setupOutputStream(): ReadableStream { - return new ReadableStream({ - start: (controller) => { - this.outputStreamController = controller; - } - }); - } - - private setupInputStream(): WritableStream { - const writableStream = new WritableStream({ - write: async (chunk) => { - const processedData = await this.processFunction(chunk); - if (this.outputStreamController) { - this.outputStreamController.enqueue(processedData); - } - }, - close: () => { - this.outputStreamController?.close(); - }, - abort: (err) => { - console.error('Stream aborted', err); - this.outputStreamController?.error(err); - } - }); - return writableStream; - } - - public getInputStreamWriter(): WritableStreamDefaultWriter { - if (!this.inputStreamWriter) { - const inputStream = this.setupInputStream(); - this.inputStreamWriter = inputStream.getWriter(); - } - return this.inputStreamWriter; - } - - public getOutputStream(): ReadableStream { - return this.setupOutputStream(); - } -} diff --git a/ts/classes.smartai.ts b/ts/classes.smartai.ts deleted file mode 100644 index e6e4e20..0000000 --- a/ts/classes.smartai.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { Conversation } from './classes.conversation.js'; -import * as plugins from './plugins.js'; -import { AnthropicProvider } from './provider.anthropic.js'; -import { ElevenLabsProvider } from './provider.elevenlabs.js'; -import { MistralProvider } from './provider.mistral.js'; -import { OllamaProvider, type IOllamaModelOptions } from './provider.ollama.js'; -import { OpenAiProvider } from './provider.openai.js'; -import { PerplexityProvider } from './provider.perplexity.js'; -import { ExoProvider } from './provider.exo.js'; -import { GroqProvider } from './provider.groq.js'; -import { XAIProvider } from './provider.xai.js'; - - -export interface ISmartAiOptions { - openaiToken?: string; - anthropicToken?: string; - perplexityToken?: string; - groqToken?: string; - mistralToken?: string; - xaiToken?: string; - elevenlabsToken?: string; - exo?: { - baseUrl?: string; - apiKey?: string; - }; - mistral?: { - chatModel?: string; - ocrModel?: string; - tableFormat?: 'markdown' | 'html'; - }; - ollama?: { - baseUrl?: string; - model?: string; - visionModel?: string; - defaultOptions?: IOllamaModelOptions; - defaultTimeout?: number; - }; - elevenlabs?: { - defaultVoiceId?: string; - defaultModelId?: string; - }; -} - -export type TProvider = 'openai' | 'anthropic' | 'perplexity' | 'ollama' | 'exo' | 'groq' | 'mistral' | 'xai' | 'elevenlabs'; - -export class SmartAi { - public options: ISmartAiOptions; - - public openaiProvider: OpenAiProvider; - public anthropicProvider: AnthropicProvider; - public perplexityProvider: PerplexityProvider; - public ollamaProvider: OllamaProvider; - public exoProvider: ExoProvider; - public groqProvider: GroqProvider; - public mistralProvider: MistralProvider; - public xaiProvider: XAIProvider; - public elevenlabsProvider: ElevenLabsProvider; - - constructor(optionsArg: ISmartAiOptions) { - this.options = optionsArg; - } - - public async start() { - if (this.options.openaiToken) { - this.openaiProvider = new OpenAiProvider({ - openaiToken: this.options.openaiToken, - }); - await this.openaiProvider.start(); - } - if (this.options.anthropicToken) { - this.anthropicProvider = new AnthropicProvider({ - anthropicToken: this.options.anthropicToken, - }); - await this.anthropicProvider.start(); - } - if (this.options.perplexityToken) { - this.perplexityProvider = new PerplexityProvider({ - perplexityToken: this.options.perplexityToken, - }); - await this.perplexityProvider.start(); - } - if (this.options.groqToken) { - this.groqProvider = new GroqProvider({ - groqToken: this.options.groqToken, - }); - await this.groqProvider.start(); - } - if (this.options.mistralToken) { - this.mistralProvider = new MistralProvider({ - mistralToken: this.options.mistralToken, - chatModel: this.options.mistral?.chatModel, - ocrModel: this.options.mistral?.ocrModel, - tableFormat: this.options.mistral?.tableFormat, - }); - await this.mistralProvider.start(); - } - if (this.options.xaiToken) { - this.xaiProvider = new XAIProvider({ - xaiToken: this.options.xaiToken, - }); - await this.xaiProvider.start(); - } - if (this.options.elevenlabsToken) { - this.elevenlabsProvider = new ElevenLabsProvider({ - elevenlabsToken: this.options.elevenlabsToken, - defaultVoiceId: this.options.elevenlabs?.defaultVoiceId, - defaultModelId: this.options.elevenlabs?.defaultModelId, - }); - await this.elevenlabsProvider.start(); - } - if (this.options.ollama) { - this.ollamaProvider = new OllamaProvider({ - baseUrl: this.options.ollama.baseUrl, - model: this.options.ollama.model, - visionModel: this.options.ollama.visionModel, - defaultOptions: this.options.ollama.defaultOptions, - defaultTimeout: this.options.ollama.defaultTimeout, - }); - await this.ollamaProvider.start(); - } - if (this.options.exo) { - this.exoProvider = new ExoProvider({ - exoBaseUrl: this.options.exo.baseUrl, - apiKey: this.options.exo.apiKey, - }); - await this.exoProvider.start(); - } - } - - public async stop() { - if (this.openaiProvider) { - await this.openaiProvider.stop(); - } - if (this.anthropicProvider) { - await this.anthropicProvider.stop(); - } - if (this.perplexityProvider) { - await this.perplexityProvider.stop(); - } - if (this.groqProvider) { - await this.groqProvider.stop(); - } - if (this.mistralProvider) { - await this.mistralProvider.stop(); - } - if (this.xaiProvider) { - await this.xaiProvider.stop(); - } - if (this.elevenlabsProvider) { - await this.elevenlabsProvider.stop(); - } - if (this.ollamaProvider) { - await this.ollamaProvider.stop(); - } - if (this.exoProvider) { - await this.exoProvider.stop(); - } - } - - /** - * create a new conversation - */ - createConversation(provider: TProvider) { - switch (provider) { - case 'exo': - return Conversation.createWithExo(this); - case 'openai': - return Conversation.createWithOpenAi(this); - case 'anthropic': - return Conversation.createWithAnthropic(this); - case 'perplexity': - return Conversation.createWithPerplexity(this); - case 'ollama': - return Conversation.createWithOllama(this); - case 'groq': - return Conversation.createWithGroq(this); - case 'mistral': - return Conversation.createWithMistral(this); - case 'xai': - return Conversation.createWithXai(this); - case 'elevenlabs': - return Conversation.createWithElevenlabs(this); - default: - throw new Error('Provider not available'); - } - } -} \ No newline at end of file diff --git a/ts/classes.tts.ts b/ts/classes.tts.ts deleted file mode 100644 index f9cd9d3..0000000 --- a/ts/classes.tts.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { SmartAi } from './classes.smartai.js'; -import * as plugins from './plugins.js'; - -export class TTS { - public static async createWithOpenAi(smartaiRef: SmartAi): Promise { - return new TTS(smartaiRef); - } - - // INSTANCE - smartaiRef: SmartAi; - - constructor(smartairefArg: SmartAi) { - this.smartaiRef = smartairefArg; - } -} \ No newline at end of file diff --git a/ts/index.ts b/ts/index.ts index c57b8b1..01891d6 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,11 +1,8 @@ -export * from './classes.smartai.js'; -export * from './abstract.classes.multimodal.js'; -export * from './provider.openai.js'; -export * from './provider.anthropic.js'; -export * from './provider.perplexity.js'; -export * from './provider.groq.js'; -export * from './provider.mistral.js'; -export * from './provider.ollama.js'; -export * from './provider.xai.js'; -export * from './provider.exo.js'; -export * from './provider.elevenlabs.js'; +export { getModel } from './smartai.classes.smartai.js'; +export type { ISmartAiOptions, TProvider, IOllamaModelOptions, LanguageModelV3 } from './smartai.interfaces.js'; +export { createAnthropicCachingMiddleware } from './smartai.middleware.anthropic.js'; +export { createOllamaModel } from './smartai.provider.ollama.js'; + +// Re-export commonly used ai-sdk functions for consumer convenience +export { generateText, streamText, tool, jsonSchema } from 'ai'; +export type { ModelMessage, ToolSet, StreamTextResult } from 'ai'; diff --git a/ts/interfaces.ts b/ts/interfaces.ts deleted file mode 100644 index e69de29..0000000 diff --git a/ts/paths.ts b/ts/paths.ts deleted file mode 100644 index 280f4cb..0000000 --- a/ts/paths.ts +++ /dev/null @@ -1,4 +0,0 @@ -import * as plugins from './plugins.js'; - -export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../'); -export const nogitDir = plugins.path.join(packageDir, './.nogit'); \ No newline at end of file diff --git a/ts/plugins.ts b/ts/plugins.ts index 881963f..da3e543 100644 --- a/ts/plugins.ts +++ b/ts/plugins.ts @@ -1,38 +1,22 @@ -// node native -import * as path from 'path'; +// ai sdk core +import { generateText, streamText, wrapLanguageModel, tool, jsonSchema } from 'ai'; +export { generateText, streamText, wrapLanguageModel, tool, jsonSchema }; + +// ai sdk providers +import { createAnthropic } from '@ai-sdk/anthropic'; +import { createOpenAI } from '@ai-sdk/openai'; +import { createGoogleGenerativeAI } from '@ai-sdk/google'; +import { createGroq } from '@ai-sdk/groq'; +import { createMistral } from '@ai-sdk/mistral'; +import { createXai } from '@ai-sdk/xai'; +import { createPerplexity } from '@ai-sdk/perplexity'; export { - path, -} - -// @push.rocks scope -import * as qenv from '@push.rocks/qenv'; -import * as smartarray from '@push.rocks/smartarray'; -import * as smartfs from '@push.rocks/smartfs'; -import * as smartpath from '@push.rocks/smartpath'; -import * as smartpdf from '@push.rocks/smartpdf'; -import * as smartpromise from '@push.rocks/smartpromise'; -import * as smartrequest from '@push.rocks/smartrequest'; -import * as webstream from '@push.rocks/webstream'; - -export { - smartarray, - qenv, - smartfs, - smartpath, - smartpdf, - smartpromise, - smartrequest, - webstream, -} - -// third party -import * as anthropic from '@anthropic-ai/sdk'; -import * as mistralai from '@mistralai/mistralai'; -import * as openai from 'openai'; - -export { - anthropic, - mistralai, - openai, -} + createAnthropic, + createOpenAI, + createGoogleGenerativeAI, + createGroq, + createMistral, + createXai, + createPerplexity, +}; diff --git a/ts/provider.anthropic.ts b/ts/provider.anthropic.ts deleted file mode 100644 index 8db261c..0000000 --- a/ts/provider.anthropic.ts +++ /dev/null @@ -1,446 +0,0 @@ -import * as plugins from './plugins.js'; -import * as paths from './paths.js'; -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ChatOptions, - ChatResponse, - ChatMessage, - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse -} from './abstract.classes.multimodal.js'; -import type { ImageBlockParam, TextBlockParam } from '@anthropic-ai/sdk/resources/messages'; - -type ContentBlock = ImageBlockParam | TextBlockParam; - -export interface IAnthropicProviderOptions { - anthropicToken: string; - enableWebSearch?: boolean; - searchDomainAllowList?: string[]; - searchDomainBlockList?: string[]; - extendedThinking?: 'quick' | 'normal' | 'deep' | 'off'; -} - -export class AnthropicProvider extends MultiModalModel { - private options: IAnthropicProviderOptions; - public anthropicApiClient: plugins.anthropic.default; - - constructor(optionsArg: IAnthropicProviderOptions) { - super(); - this.options = optionsArg // Ensure the token is stored - } - - async start() { - await super.start(); - this.anthropicApiClient = new plugins.anthropic.default({ - apiKey: this.options.anthropicToken, - }); - } - - async stop() { - await super.stop(); - } - - /** - * Returns the thinking configuration based on provider options. - * Defaults to 'normal' mode (8000 tokens) if not specified. - */ - private getThinkingConfig(): { type: 'enabled'; budget_tokens: number } | undefined { - const mode = this.options.extendedThinking ?? 'normal'; - - const budgetMap = { - quick: 2048, - normal: 8000, - deep: 16000, - off: 0, - }; - - const budget = budgetMap[mode]; - - return budget > 0 ? { type: 'enabled', budget_tokens: budget } : undefined; - } - - public async chatStream(input: ReadableStream): Promise> { - // Create a TextDecoder to handle incoming chunks - const decoder = new TextDecoder(); - let buffer = ''; - let currentMessage: { role: string; content: string; } | null = null; - - // Create a TransformStream to process the input - const transform = new TransformStream({ - async transform(chunk, controller) { - buffer += decoder.decode(chunk, { stream: true }); - - // Try to parse complete JSON messages from the buffer - while (true) { - const newlineIndex = buffer.indexOf('\n'); - if (newlineIndex === -1) break; - - const line = buffer.slice(0, newlineIndex); - buffer = buffer.slice(newlineIndex + 1); - - if (line.trim()) { - try { - const message = JSON.parse(line); - currentMessage = { - role: message.role || 'user', - content: message.content || '', - }; - } catch (e) { - console.error('Failed to parse message:', e); - } - } - } - - // If we have a complete message, send it to Anthropic - if (currentMessage) { - const thinkingConfig = this.getThinkingConfig(); - const stream = await this.anthropicApiClient.messages.create({ - model: 'claude-sonnet-4-5-20250929', - messages: [{ role: currentMessage.role, content: currentMessage.content }], - system: '', - stream: true, - max_tokens: 20000, - ...(thinkingConfig && { thinking: thinkingConfig }), - }); - - // Process each chunk from Anthropic - for await (const chunk of stream) { - const content = chunk.delta?.text; - if (content) { - controller.enqueue(content); - } - } - - currentMessage = null; - } - }, - - flush(controller) { - if (buffer) { - try { - const message = JSON.parse(buffer); - controller.enqueue(message.content || ''); - } catch (e) { - console.error('Failed to parse remaining buffer:', e); - } - } - } - }); - - // Connect the input to our transform stream - return input.pipeThrough(transform); - } - - // Implementing the synchronous chat interaction - public async chat(optionsArg: ChatOptions): Promise { - // Convert message history to Anthropic format - const messages = optionsArg.messageHistory.map(msg => ({ - role: msg.role === 'assistant' ? 'assistant' as const : 'user' as const, - content: msg.content - })); - - const thinkingConfig = this.getThinkingConfig(); - const result = await this.anthropicApiClient.messages.create({ - model: 'claude-sonnet-4-5-20250929', - system: optionsArg.systemMessage, - messages: [ - ...messages, - { role: 'user' as const, content: optionsArg.userMessage } - ], - max_tokens: 20000, - ...(thinkingConfig && { thinking: thinkingConfig }), - }); - - // Extract text content from the response - let message = ''; - for (const block of result.content) { - if ('text' in block) { - message += block.text; - } - } - - return { - role: 'assistant' as const, - message, - }; - } - - public async audio(optionsArg: { message: string }): Promise { - // Anthropic does not provide an audio API, so this method is not implemented. - throw new Error('Audio generation is not yet supported by Anthropic.'); - } - - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - const base64Image = optionsArg.image.toString('base64'); - - const content: ContentBlock[] = [ - { - type: 'text', - text: optionsArg.prompt - }, - { - type: 'image', - source: { - type: 'base64', - media_type: 'image/jpeg', - data: base64Image - } - } - ]; - - const thinkingConfig = this.getThinkingConfig(); - const result = await this.anthropicApiClient.messages.create({ - model: 'claude-sonnet-4-5-20250929', - messages: [{ - role: 'user', - content - }], - max_tokens: 10000, - ...(thinkingConfig && { thinking: thinkingConfig }), - }); - - // Extract text content from the response - let message = ''; - for (const block of result.content) { - if ('text' in block) { - message += block.text; - } - } - return message; - } - - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: ChatMessage[]; - }): Promise<{ message: any }> { - // Ensure SmartPdf is initialized before processing documents - await this.ensureSmartpdfReady(); - - // Convert PDF documents to images using SmartPDF - let documentImageBytesArray: Uint8Array[] = []; - - for (const pdfDocument of optionsArg.pdfDocuments) { - const documentImageArray = await this.smartpdfInstance!.convertPDFToPngBytes(pdfDocument); - documentImageBytesArray = documentImageBytesArray.concat(documentImageArray); - } - - // Convert message history to Anthropic format - const messages = optionsArg.messageHistory.map(msg => ({ - role: msg.role === 'assistant' ? 'assistant' as const : 'user' as const, - content: msg.content - })); - - // Create content array with text and images - const content: ContentBlock[] = [ - { - type: 'text', - text: optionsArg.userMessage - } - ]; - - // Add each document page as an image - for (const imageBytes of documentImageBytesArray) { - content.push({ - type: 'image', - source: { - type: 'base64', - media_type: 'image/png', - data: Buffer.from(imageBytes).toString('base64') - } - }); - } - - const thinkingConfig = this.getThinkingConfig(); - const result = await this.anthropicApiClient.messages.create({ - model: 'claude-sonnet-4-5-20250929', - system: optionsArg.systemMessage, - messages: [ - ...messages, - { role: 'user', content } - ], - max_tokens: 20000, - ...(thinkingConfig && { thinking: thinkingConfig }), - }); - - // Extract text content from the response - let message = ''; - for (const block of result.content) { - if ('text' in block) { - message += block.text; - } - } - - return { - message: { - role: 'assistant', - content: message - } - }; - } - - public async research(optionsArg: ResearchOptions): Promise { - // Prepare the messages for the research request - const systemMessage = `You are a research assistant with web search capabilities. - Provide comprehensive, well-researched answers with citations and sources. - When searching the web, be thorough and cite your sources accurately.`; - - try { - // Build the tool configuration for web search - const tools: any[] = []; - - if (this.options.enableWebSearch) { - const webSearchTool: any = { - type: 'web_search_20250305', - name: 'web_search' - }; - - // Add optional parameters - if (optionsArg.maxSources) { - webSearchTool.max_uses = optionsArg.maxSources; - } - - if (this.options.searchDomainAllowList?.length) { - webSearchTool.allowed_domains = this.options.searchDomainAllowList; - } else if (this.options.searchDomainBlockList?.length) { - webSearchTool.blocked_domains = this.options.searchDomainBlockList; - } - - tools.push(webSearchTool); - } - - // Configure the request based on search depth - const maxTokens = optionsArg.searchDepth === 'deep' ? 20000 : - optionsArg.searchDepth === 'advanced' ? 20000 : 20000; - - // Add thinking configuration if enabled - const thinkingConfig = this.getThinkingConfig(); - - // Create the research request - // Note: When thinking is enabled, temperature must be 1 (or omitted) - const requestParams: any = { - model: 'claude-sonnet-4-5-20250929', - system: systemMessage, - messages: [ - { - role: 'user' as const, - content: optionsArg.query - } - ], - max_tokens: maxTokens, - // Only set temperature when thinking is NOT enabled - ...(thinkingConfig ? {} : { temperature: 0.7 }) - }; - - // Add tools if web search is enabled - if (tools.length > 0) { - requestParams.tools = tools; - } - - // Add thinking configuration if enabled - if (thinkingConfig) { - requestParams.thinking = thinkingConfig; - } - - // Execute the research request - const result = await this.anthropicApiClient.messages.create(requestParams); - - // Extract the answer from content blocks - let answer = ''; - const sources: Array<{ url: string; title: string; snippet: string }> = []; - const searchQueries: string[] = []; - - // Process content blocks - for (const block of result.content) { - if ('text' in block) { - // Accumulate text content - answer += block.text; - - // Extract citations if present - if ('citations' in block && Array.isArray(block.citations)) { - for (const citation of block.citations) { - if (citation.type === 'web_search_result_location') { - sources.push({ - title: citation.title || '', - url: citation.url || '', - snippet: citation.cited_text || '' - }); - } - } - } - } else if ('type' in block && block.type === 'server_tool_use') { - // Extract search queries from server tool use - if (block.name === 'web_search' && block.input && typeof block.input === 'object' && 'query' in block.input) { - searchQueries.push((block.input as any).query); - } - } else if ('type' in block && block.type === 'web_search_tool_result') { - // Extract sources from web search results - if (Array.isArray(block.content)) { - for (const result of block.content) { - if (result.type === 'web_search_result') { - // Only add if not already in sources (avoid duplicates from citations) - if (!sources.some(s => s.url === result.url)) { - sources.push({ - title: result.title || '', - url: result.url || '', - snippet: '' // Search results don't include snippets, only citations do - }); - } - } - } - } - } - } - - // Fallback: Parse markdown-style links if no citations found - if (sources.length === 0) { - const urlRegex = /\[([^\]]+)\]\(([^)]+)\)/g; - let match: RegExpExecArray | null; - - while ((match = urlRegex.exec(answer)) !== null) { - sources.push({ - title: match[1], - url: match[2], - snippet: '' - }); - } - } - - // Check if web search was used based on usage info - const webSearchCount = result.usage?.server_tool_use?.web_search_requests || 0; - - return { - answer, - sources, - searchQueries: searchQueries.length > 0 ? searchQueries : undefined, - metadata: { - model: 'claude-sonnet-4-5-20250929', - searchDepth: optionsArg.searchDepth || 'basic', - tokensUsed: result.usage?.output_tokens, - webSearchesPerformed: webSearchCount - } - }; - } catch (error) { - console.error('Anthropic research error:', error); - throw new Error(`Failed to perform research: ${error.message}`); - } - } - - /** - * Image generation is not supported by Anthropic - */ - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - throw new Error('Image generation is not supported by Anthropic. Claude can only analyze images, not generate them. Please use OpenAI provider for image generation.'); - } - - /** - * Image editing is not supported by Anthropic - */ - public async imageEdit(optionsArg: ImageEditOptions): Promise { - throw new Error('Image editing is not supported by Anthropic. Claude can only analyze images, not edit them. Please use OpenAI provider for image editing.'); - } -} \ No newline at end of file diff --git a/ts/provider.elevenlabs.ts b/ts/provider.elevenlabs.ts deleted file mode 100644 index e9679c9..0000000 --- a/ts/provider.elevenlabs.ts +++ /dev/null @@ -1,116 +0,0 @@ -import * as plugins from './plugins.js'; -import { Readable } from 'stream'; - -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ChatOptions, - ChatResponse, - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse -} from './abstract.classes.multimodal.js'; - -export interface IElevenLabsProviderOptions { - elevenlabsToken: string; - defaultVoiceId?: string; - defaultModelId?: string; -} - -export interface IElevenLabsVoiceSettings { - stability?: number; - similarity_boost?: number; - style?: number; - use_speaker_boost?: boolean; -} - -export class ElevenLabsProvider extends MultiModalModel { - private options: IElevenLabsProviderOptions; - private baseUrl: string = 'https://api.elevenlabs.io/v1'; - - constructor(optionsArg: IElevenLabsProviderOptions) { - super(); - this.options = optionsArg; - } - - public async start() { - await super.start(); - } - - public async stop() { - await super.stop(); - } - - public async chat(optionsArg: ChatOptions): Promise { - throw new Error('ElevenLabs does not support chat functionality. This provider is specialized for text-to-speech only.'); - } - - public async chatStream(input: ReadableStream): Promise> { - throw new Error('ElevenLabs does not support chat streaming functionality. This provider is specialized for text-to-speech only.'); - } - - public async audio(optionsArg: { - message: string; - voiceId?: string; - modelId?: string; - voiceSettings?: IElevenLabsVoiceSettings; - }): Promise { - // Use Samara voice as default fallback - const voiceId = optionsArg.voiceId || this.options.defaultVoiceId || '19STyYD15bswVz51nqLf'; - - const modelId = optionsArg.modelId || this.options.defaultModelId || 'eleven_v3'; - - const url = `${this.baseUrl}/text-to-speech/${voiceId}`; - - const requestBody: any = { - text: optionsArg.message, - model_id: modelId, - }; - - if (optionsArg.voiceSettings) { - requestBody.voice_settings = optionsArg.voiceSettings; - } - - const response = await plugins.smartrequest.SmartRequest.create() - .url(url) - .header('xi-api-key', this.options.elevenlabsToken) - .json(requestBody) - .autoDrain(false) - .post(); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`ElevenLabs API error: ${response.status} ${response.statusText} - ${errorText}`); - } - - const webStream = response.stream(); - const nodeStream = Readable.fromWeb(webStream as any); - return nodeStream; - } - - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - throw new Error('ElevenLabs does not support vision functionality. This provider is specialized for text-to-speech only.'); - } - - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: any[]; - }): Promise<{ message: any }> { - throw new Error('ElevenLabs does not support document processing. This provider is specialized for text-to-speech only.'); - } - - public async research(optionsArg: ResearchOptions): Promise { - throw new Error('ElevenLabs does not support research capabilities. This provider is specialized for text-to-speech only.'); - } - - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - throw new Error('ElevenLabs does not support image generation. This provider is specialized for text-to-speech only.'); - } - - public async imageEdit(optionsArg: ImageEditOptions): Promise { - throw new Error('ElevenLabs does not support image editing. This provider is specialized for text-to-speech only.'); - } -} diff --git a/ts/provider.exo.ts b/ts/provider.exo.ts deleted file mode 100644 index 207e747..0000000 --- a/ts/provider.exo.ts +++ /dev/null @@ -1,155 +0,0 @@ -import * as plugins from './plugins.js'; -import * as paths from './paths.js'; -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ChatOptions, - ChatResponse, - ChatMessage, - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse -} from './abstract.classes.multimodal.js'; -import type { ChatCompletionMessageParam } from 'openai/resources/chat/completions'; - -export interface IExoProviderOptions { - exoBaseUrl?: string; - apiKey?: string; -} - -export class ExoProvider extends MultiModalModel { - private options: IExoProviderOptions; - public openAiApiClient: plugins.openai.default; - - constructor(optionsArg: IExoProviderOptions = {}) { - super(); - this.options = { - exoBaseUrl: 'http://localhost:8080/v1', // Default Exo API endpoint - ...optionsArg - }; - } - - public async start() { - this.openAiApiClient = new plugins.openai.default({ - apiKey: this.options.apiKey || 'not-needed', // Exo might not require an API key for local deployment - baseURL: this.options.exoBaseUrl, - }); - } - - public async stop() {} - - public async chatStream(input: ReadableStream): Promise> { - // Create a TextDecoder to handle incoming chunks - const decoder = new TextDecoder(); - let buffer = ''; - let currentMessage: { role: string; content: string; } | null = null; - - // Create a TransformStream to process the input - const transform = new TransformStream({ - transform: async (chunk, controller) => { - buffer += decoder.decode(chunk, { stream: true }); - - // Try to parse complete JSON messages from the buffer - while (true) { - const newlineIndex = buffer.indexOf('\n'); - if (newlineIndex === -1) break; - - const line = buffer.slice(0, newlineIndex); - buffer = buffer.slice(newlineIndex + 1); - - if (line.trim()) { - try { - const message = JSON.parse(line); - currentMessage = message; - - // Process the message based on its type - if (message.type === 'message') { - const response = await this.chat({ - systemMessage: '', - userMessage: message.content, - messageHistory: [{ role: message.role as 'user' | 'assistant' | 'system', content: message.content }] - }); - - controller.enqueue(JSON.stringify(response) + '\n'); - } - } catch (error) { - console.error('Error processing message:', error); - } - } - } - }, - flush(controller) { - if (buffer) { - try { - const message = JSON.parse(buffer); - currentMessage = message; - } catch (error) { - console.error('Error processing remaining buffer:', error); - } - } - } - }); - - return input.pipeThrough(transform); - } - - public async chat(options: ChatOptions): Promise { - const messages: ChatCompletionMessageParam[] = [ - { role: 'system', content: options.systemMessage }, - ...options.messageHistory, - { role: 'user', content: options.userMessage } - ]; - - try { - const response = await this.openAiApiClient.chat.completions.create({ - model: 'local-model', // Exo uses local models - messages: messages, - stream: false - }); - - return { - role: 'assistant', - message: response.choices[0]?.message?.content || '' - }; - } catch (error) { - console.error('Error in chat completion:', error); - throw error; - } - } - - public async audio(optionsArg: { message: string }): Promise { - throw new Error('Audio generation is not supported by Exo provider'); - } - - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - throw new Error('Vision processing is not supported by Exo provider'); - } - - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: ChatMessage[]; - }): Promise<{ message: any }> { - throw new Error('Document processing is not supported by Exo provider'); - } - - public async research(optionsArg: ResearchOptions): Promise { - throw new Error('Research capabilities are not yet supported by Exo provider.'); - } - - /** - * Image generation is not supported by Exo - */ - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - throw new Error('Image generation is not supported by Exo. Please use OpenAI provider for image generation.'); - } - - /** - * Image editing is not supported by Exo - */ - public async imageEdit(optionsArg: ImageEditOptions): Promise { - throw new Error('Image editing is not supported by Exo. Please use OpenAI provider for image editing.'); - } -} diff --git a/ts/provider.groq.ts b/ts/provider.groq.ts deleted file mode 100644 index 87e7339..0000000 --- a/ts/provider.groq.ts +++ /dev/null @@ -1,219 +0,0 @@ -import * as plugins from './plugins.js'; -import * as paths from './paths.js'; -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ChatOptions, - ChatResponse, - ChatMessage, - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse -} from './abstract.classes.multimodal.js'; - -export interface IGroqProviderOptions { - groqToken: string; - model?: string; -} - -export class GroqProvider extends MultiModalModel { - private options: IGroqProviderOptions; - private baseUrl = 'https://api.groq.com/v1'; - - constructor(optionsArg: IGroqProviderOptions) { - super(); - this.options = { - ...optionsArg, - model: optionsArg.model || 'llama-3.3-70b-versatile', // Default model - }; - } - - async start() {} - - async stop() {} - - public async chatStream(input: ReadableStream): Promise> { - // Create a TextDecoder to handle incoming chunks - const decoder = new TextDecoder(); - let buffer = ''; - let currentMessage: { role: string; content: string; } | null = null; - - // Create a TransformStream to process the input - const transform = new TransformStream({ - transform: async (chunk, controller) => { - buffer += decoder.decode(chunk, { stream: true }); - - // Try to parse complete JSON messages from the buffer - while (true) { - const newlineIndex = buffer.indexOf('\n'); - if (newlineIndex === -1) break; - - const line = buffer.slice(0, newlineIndex); - buffer = buffer.slice(newlineIndex + 1); - - if (line.trim()) { - try { - const message = JSON.parse(line); - currentMessage = { - role: message.role || 'user', - content: message.content || '', - }; - } catch (e) { - console.error('Failed to parse message:', e); - } - } - } - - // If we have a complete message, send it to Groq - if (currentMessage) { - const response = await fetch(`${this.baseUrl}/chat/completions`, { - method: 'POST', - headers: { - 'Authorization': `Bearer ${this.options.groqToken}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: this.options.model, - messages: [{ role: currentMessage.role, content: currentMessage.content }], - stream: true, - }), - }); - - // Process each chunk from Groq - const reader = response.body?.getReader(); - if (reader) { - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - const chunk = new TextDecoder().decode(value); - const lines = chunk.split('\n'); - - for (const line of lines) { - if (line.startsWith('data: ')) { - const data = line.slice(6); - if (data === '[DONE]') break; - - try { - const parsed = JSON.parse(data); - const content = parsed.choices[0]?.delta?.content; - if (content) { - controller.enqueue(content); - } - } catch (e) { - console.error('Failed to parse SSE data:', e); - } - } - } - } - } finally { - reader.releaseLock(); - } - } - - currentMessage = null; - } - }, - - flush(controller) { - if (buffer) { - try { - const message = JSON.parse(buffer); - controller.enqueue(message.content || ''); - } catch (e) { - console.error('Failed to parse remaining buffer:', e); - } - } - } - }); - - // Connect the input to our transform stream - return input.pipeThrough(transform); - } - - // Implementing the synchronous chat interaction - public async chat(optionsArg: ChatOptions): Promise { - const messages = [ - // System message - { - role: 'system', - content: optionsArg.systemMessage, - }, - // Message history - ...optionsArg.messageHistory.map(msg => ({ - role: msg.role, - content: msg.content, - })), - // User message - { - role: 'user', - content: optionsArg.userMessage, - }, - ]; - - const response = await fetch(`${this.baseUrl}/chat/completions`, { - method: 'POST', - headers: { - 'Authorization': `Bearer ${this.options.groqToken}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: this.options.model, - messages, - temperature: 0.7, - max_completion_tokens: 1024, - stream: false, - }), - }); - - if (!response.ok) { - const error = await response.json(); - throw new Error(`Groq API error: ${error.message || response.statusText}`); - } - - const result = await response.json(); - - return { - role: 'assistant', - message: result.choices[0].message.content, - }; - } - - public async audio(optionsArg: { message: string }): Promise { - // Groq does not provide an audio API, so this method is not implemented. - throw new Error('Audio generation is not yet supported by Groq.'); - } - - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - throw new Error('Vision tasks are not yet supported by Groq.'); - } - - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: ChatMessage[]; - }): Promise<{ message: any }> { - throw new Error('Document processing is not yet supported by Groq.'); - } - - public async research(optionsArg: ResearchOptions): Promise { - throw new Error('Research capabilities are not yet supported by Groq provider.'); - } - - /** - * Image generation is not supported by Groq - */ - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - throw new Error('Image generation is not supported by Groq. Please use OpenAI provider for image generation.'); - } - - /** - * Image editing is not supported by Groq - */ - public async imageEdit(optionsArg: ImageEditOptions): Promise { - throw new Error('Image editing is not supported by Groq. Please use OpenAI provider for image editing.'); - } -} \ No newline at end of file diff --git a/ts/provider.mistral.ts b/ts/provider.mistral.ts deleted file mode 100644 index f1940e2..0000000 --- a/ts/provider.mistral.ts +++ /dev/null @@ -1,352 +0,0 @@ -import * as plugins from './plugins.js'; -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ChatOptions, - ChatResponse, - ChatMessage, - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse -} from './abstract.classes.multimodal.js'; - -export interface IMistralProviderOptions { - mistralToken: string; - chatModel?: string; // default: 'mistral-large-latest' - ocrModel?: string; // default: 'mistral-ocr-latest' - tableFormat?: 'markdown' | 'html'; -} - -export class MistralProvider extends MultiModalModel { - private options: IMistralProviderOptions; - public mistralClient: plugins.mistralai.Mistral; - - constructor(optionsArg: IMistralProviderOptions) { - super(); - this.options = optionsArg; - } - - async start() { - await super.start(); - this.mistralClient = new plugins.mistralai.Mistral({ - apiKey: this.options.mistralToken, - }); - } - - async stop() { - await super.stop(); - } - - /** - * Synchronous chat interaction using Mistral's chat API - */ - public async chat(optionsArg: ChatOptions): Promise { - // Convert message history to Mistral format - const messages: Array<{ - role: 'system' | 'user' | 'assistant'; - content: string; - }> = []; - - // Add system message first - if (optionsArg.systemMessage) { - messages.push({ - role: 'system', - content: optionsArg.systemMessage - }); - } - - // Add message history - for (const msg of optionsArg.messageHistory) { - messages.push({ - role: msg.role === 'system' ? 'system' : msg.role === 'assistant' ? 'assistant' : 'user', - content: msg.content - }); - } - - // Add current user message - messages.push({ - role: 'user', - content: optionsArg.userMessage - }); - - const result = await this.mistralClient.chat.complete({ - model: this.options.chatModel || 'mistral-large-latest', - messages: messages, - }); - - // Extract content from response - const choice = result.choices?.[0]; - let content = ''; - - if (choice?.message?.content) { - if (typeof choice.message.content === 'string') { - content = choice.message.content; - } else if (Array.isArray(choice.message.content)) { - // Handle array of content chunks - content = choice.message.content - .map((chunk: any) => { - if (typeof chunk === 'string') return chunk; - if (chunk && typeof chunk === 'object' && 'text' in chunk) return chunk.text; - return ''; - }) - .join(''); - } - } - - return { - role: 'assistant', - message: content, - }; - } - - /** - * Streaming chat using Mistral's streaming API - */ - public async chatStream(input: ReadableStream): Promise> { - const decoder = new TextDecoder(); - let buffer = ''; - const mistralClient = this.mistralClient; - const chatModel = this.options.chatModel || 'mistral-large-latest'; - - const transform = new TransformStream({ - async transform(chunk, controller) { - buffer += decoder.decode(chunk, { stream: true }); - - // Try to parse complete JSON messages from the buffer - while (true) { - const newlineIndex = buffer.indexOf('\n'); - if (newlineIndex === -1) break; - - const line = buffer.slice(0, newlineIndex); - buffer = buffer.slice(newlineIndex + 1); - - if (line.trim()) { - try { - const message = JSON.parse(line); - - // Build messages array - const messages: Array<{ - role: 'system' | 'user' | 'assistant'; - content: string; - }> = []; - - if (message.systemMessage) { - messages.push({ - role: 'system', - content: message.systemMessage - }); - } - - messages.push({ - role: message.role === 'assistant' ? 'assistant' : 'user', - content: message.content - }); - - // Use Mistral streaming - const stream = await mistralClient.chat.stream({ - model: chatModel, - messages: messages, - }); - - // Process streaming events - for await (const event of stream) { - const delta = event.data?.choices?.[0]?.delta; - if (delta?.content) { - if (typeof delta.content === 'string') { - controller.enqueue(delta.content); - } else if (Array.isArray(delta.content)) { - for (const chunk of delta.content) { - if (typeof chunk === 'string') { - controller.enqueue(chunk); - } else if (chunk && typeof chunk === 'object' && 'text' in chunk) { - controller.enqueue((chunk as any).text); - } - } - } - } - } - } catch (e) { - console.error('Failed to parse message:', e); - } - } - } - }, - - flush(controller) { - if (buffer.trim()) { - try { - const message = JSON.parse(buffer); - controller.enqueue(message.content || ''); - } catch (e) { - console.error('Failed to parse remaining buffer:', e); - } - } - } - }); - - return input.pipeThrough(transform); - } - - /** - * Audio generation is not supported by Mistral - */ - public async audio(optionsArg: { message: string }): Promise { - throw new Error('Audio generation is not supported by Mistral. Please use ElevenLabs or OpenAI provider for audio generation.'); - } - - /** - * Vision using Mistral's OCR API for image analysis - */ - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - const base64Image = optionsArg.image.toString('base64'); - - // Detect image type from buffer header - let mimeType = 'image/jpeg'; - if (optionsArg.image[0] === 0x89 && optionsArg.image[1] === 0x50) { - mimeType = 'image/png'; - } else if (optionsArg.image[0] === 0x47 && optionsArg.image[1] === 0x49) { - mimeType = 'image/gif'; - } else if (optionsArg.image[0] === 0x52 && optionsArg.image[1] === 0x49) { - mimeType = 'image/webp'; - } - - // Use OCR API with image data URL - const ocrResult = await this.mistralClient.ocr.process({ - model: this.options.ocrModel || 'mistral-ocr-latest', - document: { - imageUrl: `data:${mimeType};base64,${base64Image}`, - type: 'image_url', - }, - }); - - // Combine markdown from all pages - const extractedText = ocrResult.pages.map(page => page.markdown).join('\n\n'); - - // If a prompt is provided, use chat to analyze the extracted text - if (optionsArg.prompt && optionsArg.prompt.trim()) { - const chatResponse = await this.chat({ - systemMessage: 'You are an assistant analyzing image content. The following is text extracted from an image using OCR.', - userMessage: `${optionsArg.prompt}\n\nExtracted content:\n${extractedText}`, - messageHistory: [], - }); - return chatResponse.message; - } - - return extractedText; - } - - /** - * Document processing using Mistral's OCR API - * PDFs are uploaded via Files API first, then processed with OCR - */ - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: ChatMessage[]; - }): Promise<{ message: any }> { - const extractedTexts: string[] = []; - const uploadedFileIds: string[] = []; - - try { - // Process each PDF document using Mistral OCR - for (let i = 0; i < optionsArg.pdfDocuments.length; i++) { - const pdfDocument = optionsArg.pdfDocuments[i]; - - // Upload the PDF to Mistral's Files API first - const uploadResult = await this.mistralClient.files.upload({ - file: { - fileName: `document_${i + 1}.pdf`, - content: pdfDocument, - }, - purpose: 'ocr', - }); - - uploadedFileIds.push(uploadResult.id); - - // Now use OCR with the uploaded file - const ocrResult = await this.mistralClient.ocr.process({ - model: this.options.ocrModel || 'mistral-ocr-latest', - document: { - type: 'file', - fileId: uploadResult.id, - }, - tableFormat: this.options.tableFormat || 'markdown', - }); - - // Combine all page markdown with page separators - const pageTexts = ocrResult.pages.map((page, index) => { - let pageContent = `--- Page ${index + 1} ---\n${page.markdown}`; - - // Include tables if present - if (page.tables && page.tables.length > 0) { - pageContent += '\n\n**Tables:**\n' + page.tables.map((t: any) => t.markdown || t.html || '').join('\n'); - } - - // Include header/footer if present - if (page.header) { - pageContent = `Header: ${page.header}\n${pageContent}`; - } - if (page.footer) { - pageContent += `\nFooter: ${page.footer}`; - } - - return pageContent; - }).join('\n\n'); - - extractedTexts.push(pageTexts); - } - - // Combine all document texts - const allDocumentText = extractedTexts.length === 1 - ? extractedTexts[0] - : extractedTexts.map((text, i) => `=== Document ${i + 1} ===\n${text}`).join('\n\n'); - - // Use chat API to process the extracted text with the user's query - const chatResponse = await this.chat({ - systemMessage: optionsArg.systemMessage || 'You are a helpful assistant analyzing document content.', - userMessage: `${optionsArg.userMessage}\n\n---\nDocument Content:\n${allDocumentText}`, - messageHistory: optionsArg.messageHistory, - }); - - return { - message: { - role: 'assistant', - content: chatResponse.message - } - }; - } finally { - // Clean up uploaded files - for (const fileId of uploadedFileIds) { - try { - await this.mistralClient.files.delete({ fileId }); - } catch (cleanupError) { - // Ignore cleanup errors - files may have already been auto-deleted - console.warn(`Failed to delete temporary file ${fileId}:`, cleanupError); - } - } - } - } - - /** - * Research is not natively supported by Mistral - */ - public async research(optionsArg: ResearchOptions): Promise { - throw new Error('Research/web search is not supported by Mistral. Please use Perplexity or Anthropic provider for research capabilities.'); - } - - /** - * Image generation is not supported by Mistral - */ - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - throw new Error('Image generation is not supported by Mistral. Please use OpenAI provider for image generation.'); - } - - /** - * Image editing is not supported by Mistral - */ - public async imageEdit(optionsArg: ImageEditOptions): Promise { - throw new Error('Image editing is not supported by Mistral. Please use OpenAI provider for image editing.'); - } -} diff --git a/ts/provider.ollama.ts b/ts/provider.ollama.ts deleted file mode 100644 index 8c92292..0000000 --- a/ts/provider.ollama.ts +++ /dev/null @@ -1,705 +0,0 @@ -import * as plugins from './plugins.js'; -import * as paths from './paths.js'; -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ChatOptions, - ChatResponse, - ChatMessage, - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse, - StreamingChatOptions -} from './abstract.classes.multimodal.js'; - -/** - * Ollama model runtime options - * @see https://github.com/ollama/ollama/blob/main/docs/modelfile.md - */ -export interface IOllamaModelOptions { - num_ctx?: number; // Context window (default: 2048) - temperature?: number; // 0 = deterministic (default: 0.8) - top_k?: number; // Top-k sampling (default: 40) - top_p?: number; // Nucleus sampling (default: 0.9) - repeat_penalty?: number;// Repeat penalty (default: 1.1) - num_predict?: number; // Max tokens to predict - stop?: string[]; // Stop sequences - seed?: number; // Random seed for reproducibility - think?: boolean; // Enable thinking/reasoning mode (for GPT-OSS, QwQ, etc.) -} - -/** - * JSON Schema tool definition for Ollama native tool calling - * @see https://docs.ollama.com/capabilities/tool-calling - */ -export interface IOllamaTool { - type: 'function'; - function: { - name: string; - description: string; - parameters: { - type: 'object'; - properties: Record; - required?: string[]; - }; - }; -} - -/** - * Tool call returned by model in native tool calling mode - */ -export interface IOllamaToolCall { - function: { - name: string; - arguments: Record; - index?: number; - }; -} - -export interface IOllamaProviderOptions { - baseUrl?: string; - model?: string; - visionModel?: string; // Model to use for vision tasks (e.g. 'llava') - defaultOptions?: IOllamaModelOptions; // Default model options - defaultTimeout?: number; // Default timeout in ms (default: 120000) -} - -/** - * Extended chat options with Ollama-specific settings - */ -export interface IOllamaChatOptions extends ChatOptions { - options?: IOllamaModelOptions; // Per-request model options - timeout?: number; // Per-request timeout in ms - model?: string; // Per-request model override - tools?: IOllamaTool[]; // Available tools for native function calling - // images is inherited from ChatOptions -} - -/** - * Chunk emitted during streaming - */ -export interface IOllamaStreamChunk { - content: string; - thinking?: string; // For models with extended thinking - toolCalls?: IOllamaToolCall[]; // Tool calls in streaming mode - done: boolean; - stats?: { - totalDuration?: number; - evalCount?: number; - }; -} - -/** - * Extended chat response with Ollama-specific fields - */ -export interface IOllamaChatResponse extends ChatResponse { - thinking?: string; - toolCalls?: IOllamaToolCall[]; // Tool calls from model (native tool calling) - stats?: { - totalDuration?: number; - evalCount?: number; - }; -} - -export class OllamaProvider extends MultiModalModel { - private options: IOllamaProviderOptions; - private baseUrl: string; - private model: string; - private visionModel: string; - private defaultOptions: IOllamaModelOptions; - private defaultTimeout: number; - - constructor(optionsArg: IOllamaProviderOptions = {}) { - super(); - this.options = optionsArg; - this.baseUrl = optionsArg.baseUrl || 'http://localhost:11434'; - this.model = optionsArg.model || 'llama2'; - this.visionModel = optionsArg.visionModel || 'llava'; - this.defaultOptions = optionsArg.defaultOptions || {}; - this.defaultTimeout = optionsArg.defaultTimeout || 120000; - } - - async start() { - await super.start(); - // Verify Ollama is running - try { - const response = await fetch(`${this.baseUrl}/api/tags`); - if (!response.ok) { - throw new Error('Failed to connect to Ollama server'); - } - } catch (error) { - throw new Error(`Failed to connect to Ollama server at ${this.baseUrl}: ${error.message}`); - } - } - - async stop() { - await super.stop(); - } - - public async chatStream(input: ReadableStream): Promise> { - // Create a TextDecoder to handle incoming chunks - const decoder = new TextDecoder(); - let buffer = ''; - let currentMessage: { role: string; content: string; } | null = null; - - // Create a TransformStream to process the input - const transform = new TransformStream({ - transform: async (chunk, controller) => { - buffer += decoder.decode(chunk, { stream: true }); - - // Try to parse complete JSON messages from the buffer - while (true) { - const newlineIndex = buffer.indexOf('\n'); - if (newlineIndex === -1) break; - - const line = buffer.slice(0, newlineIndex); - buffer = buffer.slice(newlineIndex + 1); - - if (line.trim()) { - try { - const message = JSON.parse(line); - currentMessage = { - role: message.role || 'user', - content: message.content || '', - }; - } catch (e) { - console.error('Failed to parse message:', e); - } - } - } - - // If we have a complete message, send it to Ollama - if (currentMessage) { - const response = await fetch(`${this.baseUrl}/api/chat`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: this.model, - messages: [{ role: currentMessage.role, content: currentMessage.content }], - stream: true, - }), - }); - - // Process each chunk from Ollama - const reader = response.body?.getReader(); - if (reader) { - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - const chunk = new TextDecoder().decode(value); - const lines = chunk.split('\n'); - - for (const line of lines) { - if (line.trim()) { - try { - const parsed = JSON.parse(line); - const content = parsed.message?.content; - if (content) { - controller.enqueue(content); - } - } catch (e) { - console.error('Failed to parse Ollama response:', e); - } - } - } - } - } finally { - reader.releaseLock(); - } - } - - currentMessage = null; - } - }, - - flush(controller) { - if (buffer) { - try { - const message = JSON.parse(buffer); - controller.enqueue(message.content || ''); - } catch (e) { - console.error('Failed to parse remaining buffer:', e); - } - } - } - }); - - // Connect the input to our transform stream - return input.pipeThrough(transform); - } - - // Implementing the synchronous chat interaction - public async chat(optionsArg: ChatOptions): Promise { - // Format messages for Ollama - const historyMessages = optionsArg.messageHistory.map((msg) => { - const formatted: { role: string; content: string; images?: string[]; reasoning?: string } = { - role: msg.role, - content: msg.content, - }; - if (msg.images && msg.images.length > 0) { - formatted.images = msg.images; - } - if (msg.reasoning) { - formatted.reasoning = msg.reasoning; - } - return formatted; - }); - - // Build user message with optional images - const userMessage: { role: string; content: string; images?: string[] } = { - role: 'user', - content: optionsArg.userMessage, - }; - if (optionsArg.images && optionsArg.images.length > 0) { - userMessage.images = optionsArg.images; - } - - const messages = [ - { role: 'system', content: optionsArg.systemMessage }, - ...historyMessages, - userMessage, - ]; - - // Build request body - include think parameter if set - const requestBody: Record = { - model: this.model, - messages: messages, - stream: false, - options: this.defaultOptions, - }; - - // Add think parameter for reasoning models (GPT-OSS, QwQ, etc.) - if (this.defaultOptions.think !== undefined) { - requestBody.think = this.defaultOptions.think; - } - - // Make API call to Ollama with defaultOptions and timeout - const response = await fetch(`${this.baseUrl}/api/chat`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(requestBody), - signal: AbortSignal.timeout(this.defaultTimeout), - }); - - if (!response.ok) { - throw new Error(`Ollama API error: ${response.statusText}`); - } - - const result = await response.json(); - - return { - role: 'assistant' as const, - message: result.message.content, - reasoning: result.message.thinking || result.message.reasoning, - }; - } - - /** - * Streaming chat with token callback (implements MultiModalModel interface) - * Calls onToken for each token generated during the response - */ - public async chatStreaming(optionsArg: StreamingChatOptions): Promise { - const onToken = optionsArg.onToken; - - // Use existing collectStreamResponse with callback, including images - const response = await this.collectStreamResponse( - { - systemMessage: optionsArg.systemMessage, - userMessage: optionsArg.userMessage, - messageHistory: optionsArg.messageHistory, - images: optionsArg.images, - }, - (chunk) => { - if (onToken) { - if (chunk.thinking) onToken(chunk.thinking); - if (chunk.content) onToken(chunk.content); - } - } - ); - - return { - role: 'assistant' as const, - message: response.message, - reasoning: response.thinking, - }; - } - - /** - * Streaming chat with async iteration and options support - */ - public async chatStreamResponse( - optionsArg: IOllamaChatOptions - ): Promise> { - const model = optionsArg.model || this.model; - const timeout = optionsArg.timeout || this.defaultTimeout; - const modelOptions = { ...this.defaultOptions, ...optionsArg.options }; - - // Format history messages with optional images, reasoning, and tool_calls - const historyMessages = optionsArg.messageHistory.map((msg) => { - const formatted: { role: string; content: string; images?: string[]; reasoning?: string; tool_calls?: any[] } = { - role: msg.role, - content: msg.content, - }; - if (msg.images && msg.images.length > 0) { - formatted.images = msg.images; - } - if (msg.reasoning) { - formatted.reasoning = msg.reasoning; - } - // CRITICAL: Include tool_calls in history for native tool calling - // Without this, the model doesn't know it already called a tool and may call it again - if ((msg as any).tool_calls && Array.isArray((msg as any).tool_calls)) { - formatted.tool_calls = (msg as any).tool_calls; - } - return formatted; - }); - - // Build user message with optional images - const userMessage: { role: string; content: string; images?: string[] } = { - role: 'user', - content: optionsArg.userMessage, - }; - if (optionsArg.images && optionsArg.images.length > 0) { - userMessage.images = optionsArg.images; - } - - const messages = [ - { role: 'system', content: optionsArg.systemMessage }, - ...historyMessages, - userMessage, - ]; - - // Build request body with optional tools and think parameters - const requestBody: Record = { - model, - messages, - stream: true, - options: modelOptions, - }; - - // Add think parameter for reasoning models (GPT-OSS, QwQ, etc.) - if (modelOptions.think !== undefined) { - requestBody.think = modelOptions.think; - } - - // Add tools for native function calling - if (optionsArg.tools && optionsArg.tools.length > 0) { - requestBody.tools = optionsArg.tools; - } - - const response = await fetch(`${this.baseUrl}/api/chat`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(requestBody), - signal: AbortSignal.timeout(timeout), - }); - - if (!response.ok) { - throw new Error(`Ollama API error: ${response.status}`); - } - - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - return { - [Symbol.asyncIterator]: async function* () { - let buffer = ''; - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - buffer += decoder.decode(value, { stream: true }); - const lines = buffer.split('\n'); - buffer = lines.pop() || ''; - for (const line of lines) { - if (!line.trim()) continue; - try { - const json = JSON.parse(line); - - // Parse tool_calls from response - let toolCalls: IOllamaToolCall[] | undefined; - if (json.message?.tool_calls && Array.isArray(json.message.tool_calls)) { - toolCalls = json.message.tool_calls.map((tc: any) => ({ - function: { - name: tc.function?.name || '', - arguments: typeof tc.function?.arguments === 'string' - ? JSON.parse(tc.function.arguments) - : tc.function?.arguments || {}, - index: tc.index, - }, - })); - } - - yield { - content: json.message?.content || '', - thinking: json.message?.thinking, - toolCalls, - done: json.done || false, - stats: json.done ? { - totalDuration: json.total_duration, - evalCount: json.eval_count, - } : undefined, - } as IOllamaStreamChunk; - } catch { /* skip malformed */ } - } - } - } finally { - reader.releaseLock(); - } - } - }; - } - - /** - * Stream and collect full response with optional progress callback - */ - public async collectStreamResponse( - optionsArg: IOllamaChatOptions, - onChunk?: (chunk: IOllamaStreamChunk) => void - ): Promise { - const stream = await this.chatStreamResponse(optionsArg); - let content = ''; - let thinking = ''; - let toolCalls: IOllamaToolCall[] = []; - let stats: IOllamaChatResponse['stats']; - - for await (const chunk of stream) { - if (chunk.content) content += chunk.content; - if (chunk.thinking) thinking += chunk.thinking; - if (chunk.toolCalls) toolCalls = toolCalls.concat(chunk.toolCalls); - if (chunk.stats) stats = chunk.stats; - if (onChunk) onChunk(chunk); - } - - return { - role: 'assistant' as const, - message: content, - thinking: thinking || undefined, - toolCalls: toolCalls.length > 0 ? toolCalls : undefined, - stats, - }; - } - - /** - * Non-streaming chat with full options support - */ - public async chatWithOptions(optionsArg: IOllamaChatOptions): Promise { - const model = optionsArg.model || this.model; - const timeout = optionsArg.timeout || this.defaultTimeout; - const modelOptions = { ...this.defaultOptions, ...optionsArg.options }; - - // Format history messages with optional images, reasoning, tool_calls, and tool role - const historyMessages = optionsArg.messageHistory.map((msg) => { - // Handle tool result messages - if ((msg as any).role === 'tool') { - return { - role: 'tool', - content: msg.content, - tool_name: (msg as any).toolName, - }; - } - - const formatted: { role: string; content: string; images?: string[]; reasoning?: string; tool_calls?: any[] } = { - role: msg.role, - content: msg.content, - }; - if (msg.images && msg.images.length > 0) { - formatted.images = msg.images; - } - if (msg.reasoning) { - formatted.reasoning = msg.reasoning; - } - // CRITICAL: Include tool_calls in history for native tool calling - // Without this, the model doesn't know it already called a tool and may call it again - if ((msg as any).tool_calls && Array.isArray((msg as any).tool_calls)) { - formatted.tool_calls = (msg as any).tool_calls; - } - return formatted; - }); - - // Build user message with optional images - const userMessage: { role: string; content: string; images?: string[] } = { - role: 'user', - content: optionsArg.userMessage, - }; - if (optionsArg.images && optionsArg.images.length > 0) { - userMessage.images = optionsArg.images; - } - - const messages = [ - { role: 'system', content: optionsArg.systemMessage }, - ...historyMessages, - userMessage, - ]; - - // Build request body with optional tools and think parameters - const requestBody: Record = { - model, - messages, - stream: false, - options: modelOptions, - }; - - // Add think parameter for reasoning models (GPT-OSS, QwQ, etc.) - if (modelOptions.think !== undefined) { - requestBody.think = modelOptions.think; - } - - // Add tools for native function calling - if (optionsArg.tools && optionsArg.tools.length > 0) { - requestBody.tools = optionsArg.tools; - } - - const response = await fetch(`${this.baseUrl}/api/chat`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(requestBody), - signal: AbortSignal.timeout(timeout), - }); - - if (!response.ok) { - throw new Error(`Ollama API error: ${response.statusText}`); - } - - const result = await response.json(); - - // Parse tool_calls from response - let toolCalls: IOllamaToolCall[] | undefined; - if (result.message?.tool_calls && Array.isArray(result.message.tool_calls)) { - toolCalls = result.message.tool_calls.map((tc: any) => ({ - function: { - name: tc.function?.name || '', - arguments: typeof tc.function?.arguments === 'string' - ? JSON.parse(tc.function.arguments) - : tc.function?.arguments || {}, - index: tc.index, - }, - })); - } - - return { - role: 'assistant' as const, - message: result.message.content || '', - thinking: result.message.thinking, - toolCalls, - stats: { - totalDuration: result.total_duration, - evalCount: result.eval_count, - }, - }; - } - - public async audio(optionsArg: { message: string }): Promise { - throw new Error('Audio generation is not supported by Ollama.'); - } - - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - const base64Image = optionsArg.image.toString('base64'); - - const response = await fetch(`${this.baseUrl}/api/chat`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: this.visionModel, - messages: [{ - role: 'user', - content: optionsArg.prompt, - images: [base64Image] - }], - stream: false - }), - }); - - if (!response.ok) { - throw new Error(`Ollama API error: ${response.statusText}`); - } - - const result = await response.json(); - return result.message.content; - } - - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: ChatMessage[]; - }): Promise<{ message: any }> { - // Ensure SmartPdf is initialized before processing documents - await this.ensureSmartpdfReady(); - - // Convert PDF documents to images using SmartPDF - let documentImageBytesArray: Uint8Array[] = []; - - for (const pdfDocument of optionsArg.pdfDocuments) { - const documentImageArray = await this.smartpdfInstance!.convertPDFToPngBytes(pdfDocument); - documentImageBytesArray = documentImageBytesArray.concat(documentImageArray); - } - - // Convert images to base64 - const base64Images = documentImageBytesArray.map(bytes => Buffer.from(bytes).toString('base64')); - - // Send request to Ollama with images - const response = await fetch(`${this.baseUrl}/api/chat`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: this.visionModel, - messages: [ - { role: 'system', content: optionsArg.systemMessage }, - ...optionsArg.messageHistory, - { - role: 'user', - content: optionsArg.userMessage, - images: base64Images - } - ], - stream: false - }), - }); - - if (!response.ok) { - throw new Error(`Ollama API error: ${response.statusText}`); - } - - const result = await response.json(); - return { - message: { - role: 'assistant', - content: result.message.content - } - }; - } - - public async research(optionsArg: ResearchOptions): Promise { - throw new Error('Research capabilities are not yet supported by Ollama provider.'); - } - - /** - * Image generation is not supported by Ollama - */ - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - throw new Error('Image generation is not supported by Ollama. Please use OpenAI provider for image generation.'); - } - - /** - * Image editing is not supported by Ollama - */ - public async imageEdit(optionsArg: ImageEditOptions): Promise { - throw new Error('Image editing is not supported by Ollama. Please use OpenAI provider for image editing.'); - } -} \ No newline at end of file diff --git a/ts/provider.openai.ts b/ts/provider.openai.ts deleted file mode 100644 index c93ea1d..0000000 --- a/ts/provider.openai.ts +++ /dev/null @@ -1,462 +0,0 @@ -import * as plugins from './plugins.js'; -import * as paths from './paths.js'; -import { Readable } from 'stream'; -import { toFile } from 'openai'; - -// Custom type definition for chat completion messages -export type TChatCompletionRequestMessage = { - role: "system" | "user" | "assistant"; - content: string; -}; - -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse -} from './abstract.classes.multimodal.js'; - -export interface IOpenaiProviderOptions { - openaiToken: string; - chatModel?: string; - audioModel?: string; - visionModel?: string; - researchModel?: string; - imageModel?: string; - enableWebSearch?: boolean; -} - -export class OpenAiProvider extends MultiModalModel { - private options: IOpenaiProviderOptions; - public openAiApiClient: plugins.openai.default; - - constructor(optionsArg: IOpenaiProviderOptions) { - super(); - this.options = optionsArg; - } - - public async start() { - await super.start(); - this.openAiApiClient = new plugins.openai.default({ - apiKey: this.options.openaiToken, - dangerouslyAllowBrowser: true, - }); - } - - public async stop() { - await super.stop(); - } - - public async chatStream(input: ReadableStream): Promise> { - // Create a TextDecoder to handle incoming chunks - const decoder = new TextDecoder(); - let buffer = ''; - let currentMessage: { - role: "function" | "user" | "system" | "assistant" | "tool" | "developer"; - content: string; - } | null = null; - - // Create a TransformStream to process the input - const transform = new TransformStream({ - transform: async (chunk, controller) => { - buffer += decoder.decode(chunk, { stream: true }); - - // Try to parse complete JSON messages from the buffer - while (true) { - const newlineIndex = buffer.indexOf('\n'); - if (newlineIndex === -1) break; - - const line = buffer.slice(0, newlineIndex); - buffer = buffer.slice(newlineIndex + 1); - - if (line.trim()) { - try { - const message = JSON.parse(line); - currentMessage = { - role: (message.role || 'user') as "function" | "user" | "system" | "assistant" | "tool" | "developer", - content: message.content || '', - }; - } catch (e) { - console.error('Failed to parse message:', e); - } - } - } - - // If we have a complete message, send it to OpenAI - if (currentMessage) { - const messageToSend = { role: "user" as const, content: currentMessage.content }; - const chatModel = this.options.chatModel ?? 'gpt-5-mini'; - const requestParams: any = { - model: chatModel, - messages: [messageToSend], - stream: true, - }; - // Temperature is omitted since the model does not support it. - const stream = await this.openAiApiClient.chat.completions.create(requestParams); - // Explicitly cast the stream as an async iterable to satisfy TypeScript. - const streamAsyncIterable = stream as unknown as AsyncIterableIterator; - // Process each chunk from OpenAI - for await (const chunk of streamAsyncIterable) { - const content = chunk.choices[0]?.delta?.content; - if (content) { - controller.enqueue(content); - } - } - currentMessage = null; - } - }, - - flush(controller) { - if (buffer) { - try { - const message = JSON.parse(buffer); - controller.enqueue(message.content || ''); - } catch (e) { - console.error('Failed to parse remaining buffer:', e); - } - } - } - }); - - // Connect the input to our transform stream - return input.pipeThrough(transform); - } - - // Implementing the synchronous chat interaction - public async chat(optionsArg: { - systemMessage: string; - userMessage: string; - messageHistory: { - role: 'assistant' | 'user'; - content: string; - }[]; - }) { - const chatModel = this.options.chatModel ?? 'gpt-5-mini'; - const requestParams: any = { - model: chatModel, - messages: [ - { role: 'system', content: optionsArg.systemMessage }, - ...optionsArg.messageHistory, - { role: 'user', content: optionsArg.userMessage }, - ], - }; - // Temperature parameter removed to avoid unsupported error. - const result = await this.openAiApiClient.chat.completions.create(requestParams); - return { - role: result.choices[0].message.role as 'assistant', - message: result.choices[0].message.content, - }; - } - - public async audio(optionsArg: { message: string }): Promise { - const done = plugins.smartpromise.defer(); - const result = await this.openAiApiClient.audio.speech.create({ - model: this.options.audioModel ?? 'tts-1-hd', - input: optionsArg.message, - voice: 'nova', - response_format: 'mp3', - speed: 1, - }); - const stream = result.body; - const nodeStream = Readable.fromWeb(stream as any); - done.resolve(nodeStream); - return done.promise; - } - - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: { - role: 'assistant' | 'user'; - content: any; - }[]; - }) { - // Ensure SmartPdf is initialized before processing documents - await this.ensureSmartpdfReady(); - - let pdfDocumentImageBytesArray: Uint8Array[] = []; - - // Convert each PDF into one or more image byte arrays. - for (const pdfDocument of optionsArg.pdfDocuments) { - const documentImageArray = await this.smartpdfInstance!.convertPDFToPngBytes(pdfDocument); - pdfDocumentImageBytesArray = pdfDocumentImageBytesArray.concat(documentImageArray); - } - - console.log(`image smartfile array`); - console.log(pdfDocumentImageBytesArray.map((smartfile) => smartfile.length)); - - // Filter out any empty buffers to avoid sending invalid image URLs. - const validImageBytesArray = pdfDocumentImageBytesArray.filter(imageBytes => imageBytes && imageBytes.length > 0); - const imageAttachments = validImageBytesArray.map(imageBytes => ({ - type: 'image_url', - image_url: { - url: 'data:image/png;base64,' + Buffer.from(imageBytes).toString('base64'), - }, - })); - - const chatModel = this.options.chatModel ?? 'gpt-5-mini'; - const requestParams: any = { - model: chatModel, - messages: [ - { role: 'system', content: optionsArg.systemMessage }, - ...optionsArg.messageHistory, - { - role: 'user', - content: [ - { type: 'text', text: optionsArg.userMessage }, - ...imageAttachments, - ], - }, - ], - }; - // Temperature parameter removed. - const result = await this.openAiApiClient.chat.completions.create(requestParams); - return { - message: result.choices[0].message, - }; - } - - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - const visionModel = this.options.visionModel ?? '04-mini'; - const requestParams: any = { - model: visionModel, - messages: [ - { - role: 'user', - content: [ - { type: 'text', text: optionsArg.prompt }, - { - type: 'image_url', - image_url: { - url: `data:image/jpeg;base64,${optionsArg.image.toString('base64')}` - } - } - ] - } - ], - max_tokens: 300 - }; - const result = await this.openAiApiClient.chat.completions.create(requestParams); - return result.choices[0].message.content || ''; - } - - public async research(optionsArg: ResearchOptions): Promise { - // Determine which model to use - Deep Research API requires specific models - let model: string; - if (optionsArg.searchDepth === 'deep') { - model = this.options.researchModel || 'o4-mini-deep-research-2025-06-26'; - } else { - // For basic/advanced, still use deep research models if web search is needed - if (optionsArg.includeWebSearch) { - model = this.options.researchModel || 'o4-mini-deep-research-2025-06-26'; - } else { - model = this.options.chatModel || 'gpt-5-mini'; - } - } - - const systemMessage = 'You are a research assistant. Provide comprehensive answers with citations and sources when available.'; - - // Prepare request parameters using Deep Research API format - const requestParams: any = { - model, - instructions: systemMessage, - input: optionsArg.query - }; - - // Add web search tool if requested - if (optionsArg.includeWebSearch || optionsArg.searchDepth === 'deep') { - requestParams.tools = [ - { - type: 'web_search_preview', - search_context_size: optionsArg.searchDepth === 'deep' ? 'high' : - optionsArg.searchDepth === 'advanced' ? 'medium' : 'low' - } - ]; - } - - // Add background flag for deep research - if (optionsArg.background && optionsArg.searchDepth === 'deep') { - requestParams.background = true; - } - - try { - // Execute the research request using Deep Research API - const result = await this.openAiApiClient.responses.create(requestParams); - - // Extract the answer from output items - let answer = ''; - const sources: Array<{ url: string; title: string; snippet: string }> = []; - const searchQueries: string[] = []; - - // Process output items - for (const item of result.output || []) { - // Extract message content - if (item.type === 'message' && 'content' in item) { - const messageItem = item as any; - for (const contentItem of messageItem.content || []) { - if (contentItem.type === 'output_text' && 'text' in contentItem) { - answer += contentItem.text; - } - } - } - - // Extract web search queries - if (item.type === 'web_search_call' && 'action' in item) { - const searchItem = item as any; - if (searchItem.action && searchItem.action.type === 'search' && 'query' in searchItem.action) { - searchQueries.push(searchItem.action.query); - } - } - } - - // Parse sources from markdown links in the answer - const urlRegex = /\[([^\]]+)\]\(([^)]+)\)/g; - let match: RegExpExecArray | null; - - while ((match = urlRegex.exec(answer)) !== null) { - sources.push({ - title: match[1], - url: match[2], - snippet: '' - }); - } - - return { - answer, - sources, - searchQueries: searchQueries.length > 0 ? searchQueries : undefined, - metadata: { - model, - searchDepth: optionsArg.searchDepth || 'basic', - tokensUsed: result.usage?.total_tokens - } - }; - } catch (error) { - console.error('Research API error:', error); - throw new Error(`Failed to perform research: ${error.message}`); - } - } - - /** - * Image generation using OpenAI's gpt-image-1 or DALL-E models - */ - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - const model = optionsArg.model || this.options.imageModel || 'gpt-image-1'; - - try { - const requestParams: any = { - model, - prompt: optionsArg.prompt, - n: optionsArg.n || 1, - }; - - // Add gpt-image-1 specific parameters - if (model === 'gpt-image-1') { - if (optionsArg.quality) requestParams.quality = optionsArg.quality; - if (optionsArg.size) requestParams.size = optionsArg.size; - if (optionsArg.background) requestParams.background = optionsArg.background; - if (optionsArg.outputFormat) requestParams.output_format = optionsArg.outputFormat; - if (optionsArg.outputCompression !== undefined) requestParams.output_compression = optionsArg.outputCompression; - if (optionsArg.moderation) requestParams.moderation = optionsArg.moderation; - if (optionsArg.stream !== undefined) requestParams.stream = optionsArg.stream; - if (optionsArg.partialImages !== undefined) requestParams.partial_images = optionsArg.partialImages; - } else if (model === 'dall-e-3') { - // DALL-E 3 specific parameters - if (optionsArg.quality) requestParams.quality = optionsArg.quality; - if (optionsArg.size) requestParams.size = optionsArg.size; - if (optionsArg.style) requestParams.style = optionsArg.style; - requestParams.response_format = 'b64_json'; // Always use base64 for consistency - } else if (model === 'dall-e-2') { - // DALL-E 2 specific parameters - if (optionsArg.size) requestParams.size = optionsArg.size; - requestParams.response_format = 'b64_json'; - } - - const result = await this.openAiApiClient.images.generate(requestParams); - - const images = (result.data || []).map(img => ({ - b64_json: img.b64_json, - url: img.url, - revisedPrompt: img.revised_prompt - })); - - return { - images, - metadata: { - model, - quality: result.quality, - size: result.size, - outputFormat: result.output_format, - tokensUsed: result.usage?.total_tokens - } - }; - } catch (error) { - console.error('Image generation error:', error); - throw new Error(`Failed to generate image: ${error.message}`); - } - } - - /** - * Image editing using OpenAI's gpt-image-1 or DALL-E 2 models - */ - public async imageEdit(optionsArg: ImageEditOptions): Promise { - const model = optionsArg.model || this.options.imageModel || 'gpt-image-1'; - - try { - // Convert Buffer to uploadable file format for OpenAI API - const imageFile = await toFile(optionsArg.image, 'image.png', { type: 'image/png' }); - - const requestParams: any = { - model, - image: imageFile, - prompt: optionsArg.prompt, - n: optionsArg.n || 1, - }; - - // Add mask if provided (also convert to file format) - if (optionsArg.mask) { - requestParams.mask = await toFile(optionsArg.mask, 'mask.png', { type: 'image/png' }); - } - - // Add gpt-image-1 specific parameters - if (model === 'gpt-image-1') { - if (optionsArg.quality) requestParams.quality = optionsArg.quality; - if (optionsArg.size) requestParams.size = optionsArg.size; - if (optionsArg.background) requestParams.background = optionsArg.background; - if (optionsArg.outputFormat) requestParams.output_format = optionsArg.outputFormat; - if (optionsArg.outputCompression !== undefined) requestParams.output_compression = optionsArg.outputCompression; - if (optionsArg.stream !== undefined) requestParams.stream = optionsArg.stream; - if (optionsArg.partialImages !== undefined) requestParams.partial_images = optionsArg.partialImages; - } else if (model === 'dall-e-2') { - // DALL-E 2 specific parameters - if (optionsArg.size) requestParams.size = optionsArg.size; - requestParams.response_format = 'b64_json'; - } - - const result = await this.openAiApiClient.images.edit(requestParams); - - const images = (result.data || []).map(img => ({ - b64_json: img.b64_json, - url: img.url, - revisedPrompt: img.revised_prompt - })); - - return { - images, - metadata: { - model, - quality: result.quality, - size: result.size, - outputFormat: result.output_format, - tokensUsed: result.usage?.total_tokens - } - }; - } catch (error) { - console.error('Image edit error:', error); - throw new Error(`Failed to edit image: ${error.message}`); - } - } -} \ No newline at end of file diff --git a/ts/provider.perplexity.ts b/ts/provider.perplexity.ts deleted file mode 100644 index 8a08960..0000000 --- a/ts/provider.perplexity.ts +++ /dev/null @@ -1,259 +0,0 @@ -import * as plugins from './plugins.js'; -import * as paths from './paths.js'; -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ChatOptions, - ChatResponse, - ChatMessage, - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse -} from './abstract.classes.multimodal.js'; - -export interface IPerplexityProviderOptions { - perplexityToken: string; -} - -export class PerplexityProvider extends MultiModalModel { - private options: IPerplexityProviderOptions; - - constructor(optionsArg: IPerplexityProviderOptions) { - super(); - this.options = optionsArg; - } - - async start() { - // Initialize any necessary clients or resources - } - - async stop() {} - - public async chatStream(input: ReadableStream): Promise> { - // Create a TextDecoder to handle incoming chunks - const decoder = new TextDecoder(); - let buffer = ''; - let currentMessage: { role: string; content: string; } | null = null; - - // Create a TransformStream to process the input - const transform = new TransformStream({ - async transform(chunk, controller) { - buffer += decoder.decode(chunk, { stream: true }); - - // Try to parse complete JSON messages from the buffer - while (true) { - const newlineIndex = buffer.indexOf('\n'); - if (newlineIndex === -1) break; - - const line = buffer.slice(0, newlineIndex); - buffer = buffer.slice(newlineIndex + 1); - - if (line.trim()) { - try { - const message = JSON.parse(line); - currentMessage = { - role: message.role || 'user', - content: message.content || '', - }; - } catch (e) { - console.error('Failed to parse message:', e); - } - } - } - - // If we have a complete message, send it to Perplexity - if (currentMessage) { - const response = await fetch('https://api.perplexity.ai/chat/completions', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${this.options.perplexityToken}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: 'mixtral-8x7b-instruct', - messages: [{ role: currentMessage.role, content: currentMessage.content }], - stream: true, - }), - }); - - // Process each chunk from Perplexity - const reader = response.body?.getReader(); - if (reader) { - try { - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - const chunk = new TextDecoder().decode(value); - const lines = chunk.split('\n'); - - for (const line of lines) { - if (line.startsWith('data: ')) { - const data = line.slice(6); - if (data === '[DONE]') break; - - try { - const parsed = JSON.parse(data); - const content = parsed.choices[0]?.delta?.content; - if (content) { - controller.enqueue(content); - } - } catch (e) { - console.error('Failed to parse SSE data:', e); - } - } - } - } - } finally { - reader.releaseLock(); - } - } - - currentMessage = null; - } - }, - - flush(controller) { - if (buffer) { - try { - const message = JSON.parse(buffer); - controller.enqueue(message.content || ''); - } catch (e) { - console.error('Failed to parse remaining buffer:', e); - } - } - } - }); - - // Connect the input to our transform stream - return input.pipeThrough(transform); - } - - // Implementing the synchronous chat interaction - public async chat(optionsArg: ChatOptions): Promise { - // Make API call to Perplexity - const response = await fetch('https://api.perplexity.ai/chat/completions', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${this.options.perplexityToken}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: 'mixtral-8x7b-instruct', // Using Mixtral model - messages: [ - { role: 'system', content: optionsArg.systemMessage }, - ...optionsArg.messageHistory, - { role: 'user', content: optionsArg.userMessage } - ], - }), - }); - - if (!response.ok) { - throw new Error(`Perplexity API error: ${response.statusText}`); - } - - const result = await response.json(); - - return { - role: 'assistant' as const, - message: result.choices[0].message.content, - }; - } - - public async audio(optionsArg: { message: string }): Promise { - throw new Error('Audio generation is not supported by Perplexity.'); - } - - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - throw new Error('Vision tasks are not supported by Perplexity.'); - } - - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: ChatMessage[]; - }): Promise<{ message: any }> { - throw new Error('Document processing is not supported by Perplexity.'); - } - - public async research(optionsArg: ResearchOptions): Promise { - // Perplexity has Sonar models that are optimized for search - // sonar models: sonar, sonar-pro - const model = optionsArg.searchDepth === 'deep' ? 'sonar-pro' : 'sonar'; - - try { - const response = await fetch('https://api.perplexity.ai/chat/completions', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${this.options.perplexityToken}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model, - messages: [ - { - role: 'system', - content: 'You are a helpful research assistant. Provide accurate information with sources.' - }, - { - role: 'user', - content: optionsArg.query - } - ], - temperature: 0.7, - max_tokens: 4000 - }), - }); - - if (!response.ok) { - throw new Error(`Perplexity API error: ${response.statusText}`); - } - - const result = await response.json(); - const answer = result.choices[0].message.content; - - // Parse citations from the response - const sources: Array<{ url: string; title: string; snippet: string }> = []; - - // Perplexity includes citations in the format [1], [2], etc. with sources listed - // This is a simplified parser - could be enhanced based on actual Perplexity response format - if (result.citations) { - for (const citation of result.citations) { - sources.push({ - url: citation.url || '', - title: citation.title || '', - snippet: citation.snippet || '' - }); - } - } - - return { - answer, - sources, - metadata: { - model, - searchDepth: optionsArg.searchDepth || 'basic' - } - }; - } catch (error) { - console.error('Perplexity research error:', error); - throw new Error(`Failed to perform research: ${error.message}`); - } - } - - /** - * Image generation is not supported by Perplexity - */ - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - throw new Error('Image generation is not supported by Perplexity. Please use OpenAI provider for image generation.'); - } - - /** - * Image editing is not supported by Perplexity - */ - public async imageEdit(optionsArg: ImageEditOptions): Promise { - throw new Error('Image editing is not supported by Perplexity. Please use OpenAI provider for image editing.'); - } -} \ No newline at end of file diff --git a/ts/provider.xai.ts b/ts/provider.xai.ts deleted file mode 100644 index 4b8e148..0000000 --- a/ts/provider.xai.ts +++ /dev/null @@ -1,214 +0,0 @@ -import * as plugins from './plugins.js'; -import * as paths from './paths.js'; -import { MultiModalModel } from './abstract.classes.multimodal.js'; -import type { - ChatOptions, - ChatResponse, - ChatMessage, - ResearchOptions, - ResearchResponse, - ImageGenerateOptions, - ImageEditOptions, - ImageResponse -} from './abstract.classes.multimodal.js'; -import type { ChatCompletionMessageParam } from 'openai/resources/chat/completions'; - -export interface IXAIProviderOptions { - xaiToken: string; -} - -export class XAIProvider extends MultiModalModel { - private options: IXAIProviderOptions; - public openAiApiClient: plugins.openai.default; - - constructor(optionsArg: IXAIProviderOptions) { - super(); - this.options = optionsArg; - } - - public async start() { - await super.start(); - this.openAiApiClient = new plugins.openai.default({ - apiKey: this.options.xaiToken, - baseURL: 'https://api.x.ai/v1', - }); - } - - public async stop() { - await super.stop(); - } - - public async chatStream(input: ReadableStream): Promise> { - // Create a TextDecoder to handle incoming chunks - const decoder = new TextDecoder(); - let buffer = ''; - let currentMessage: { role: string; content: string; } | null = null; - - // Create a TransformStream to process the input - const transform = new TransformStream({ - async transform(chunk, controller) { - buffer += decoder.decode(chunk, { stream: true }); - - // Try to parse complete JSON messages from the buffer - while (true) { - const newlineIndex = buffer.indexOf('\n'); - if (newlineIndex === -1) break; - - const line = buffer.slice(0, newlineIndex); - buffer = buffer.slice(newlineIndex + 1); - - if (line.trim()) { - try { - const message = JSON.parse(line); - currentMessage = { - role: message.role || 'user', - content: message.content || '', - }; - } catch (e) { - console.error('Failed to parse message:', e); - } - } - } - - // If we have a complete message, send it to X.AI - if (currentMessage) { - const stream = await this.openAiApiClient.chat.completions.create({ - model: 'grok-2-latest', - messages: [{ role: currentMessage.role, content: currentMessage.content }], - stream: true, - }); - - // Process each chunk from X.AI - for await (const chunk of stream) { - const content = chunk.choices[0]?.delta?.content; - if (content) { - controller.enqueue(content); - } - } - - currentMessage = null; - } - }, - - flush(controller) { - if (buffer) { - try { - const message = JSON.parse(buffer); - controller.enqueue(message.content || ''); - } catch (e) { - console.error('Failed to parse remaining buffer:', e); - } - } - } - }); - - // Connect the input to our transform stream - return input.pipeThrough(transform); - } - - public async chat(optionsArg: { - systemMessage: string; - userMessage: string; - messageHistory: { role: string; content: string; }[]; - }): Promise<{ role: 'assistant'; message: string; }> { - // Prepare messages array with system message, history, and user message - const messages: ChatCompletionMessageParam[] = [ - { role: 'system', content: optionsArg.systemMessage }, - ...optionsArg.messageHistory.map(msg => ({ - role: msg.role as 'system' | 'user' | 'assistant', - content: msg.content - })), - { role: 'user', content: optionsArg.userMessage } - ]; - - // Call X.AI's chat completion API - const completion = await this.openAiApiClient.chat.completions.create({ - model: 'grok-2-latest', - messages: messages, - stream: false, - }); - - // Return the assistant's response - return { - role: 'assistant', - message: completion.choices[0]?.message?.content || '' - }; - } - - public async audio(optionsArg: { message: string }): Promise { - throw new Error('Audio generation is not supported by X.AI'); - } - - public async vision(optionsArg: { image: Buffer; prompt: string }): Promise { - throw new Error('Vision tasks are not supported by X.AI'); - } - - public async document(optionsArg: { - systemMessage: string; - userMessage: string; - pdfDocuments: Uint8Array[]; - messageHistory: { role: string; content: string; }[]; - }): Promise<{ message: any }> { - // Ensure SmartPdf is initialized before processing documents - await this.ensureSmartpdfReady(); - - // First convert PDF documents to images - let pdfDocumentImageBytesArray: Uint8Array[] = []; - - for (const pdfDocument of optionsArg.pdfDocuments) { - const documentImageArray = await this.smartpdfInstance!.convertPDFToPngBytes(pdfDocument); - pdfDocumentImageBytesArray = pdfDocumentImageBytesArray.concat(documentImageArray); - } - - // Convert images to base64 for inclusion in the message - const imageBase64Array = pdfDocumentImageBytesArray.map(bytes => - Buffer.from(bytes).toString('base64') - ); - - // Combine document images into the user message - const enhancedUserMessage = ` - ${optionsArg.userMessage} - - Document contents (as images): - ${imageBase64Array.map((img, i) => `Image ${i + 1}: `).join('\n')} - `; - - // Use chat completion to analyze the documents - const messages: ChatCompletionMessageParam[] = [ - { role: 'system', content: optionsArg.systemMessage }, - ...optionsArg.messageHistory.map(msg => ({ - role: msg.role as 'system' | 'user' | 'assistant', - content: msg.content - })), - { role: 'user', content: enhancedUserMessage } - ]; - - const completion = await this.openAiApiClient.chat.completions.create({ - model: 'grok-2-latest', - messages: messages, - stream: false, - }); - - return { - message: completion.choices[0]?.message?.content || '' - }; - } - - public async research(optionsArg: ResearchOptions): Promise { - throw new Error('Research capabilities are not yet supported by xAI provider.'); - } - - /** - * Image generation is not supported by xAI - */ - public async imageGenerate(optionsArg: ImageGenerateOptions): Promise { - throw new Error('Image generation is not supported by xAI. Please use OpenAI provider for image generation.'); - } - - /** - * Image editing is not supported by xAI - */ - public async imageEdit(optionsArg: ImageEditOptions): Promise { - throw new Error('Image editing is not supported by xAI. Please use OpenAI provider for image editing.'); - } -} diff --git a/ts/smartai.classes.smartai.ts b/ts/smartai.classes.smartai.ts new file mode 100644 index 0000000..90fc97a --- /dev/null +++ b/ts/smartai.classes.smartai.ts @@ -0,0 +1,51 @@ +import * as plugins from './plugins.js'; +import type { ISmartAiOptions, LanguageModelV3 } from './smartai.interfaces.js'; +import { createOllamaModel } from './smartai.provider.ollama.js'; +import { createAnthropicCachingMiddleware } from './smartai.middleware.anthropic.js'; + +/** + * Returns a LanguageModelV3 for the given provider and model. + * This is the primary API — consumers use the returned model with AI SDK's + * generateText(), streamText(), etc. + */ +export function getModel(options: ISmartAiOptions): LanguageModelV3 { + switch (options.provider) { + case 'anthropic': { + const p = plugins.createAnthropic({ apiKey: options.apiKey }); + const base = p(options.model) as LanguageModelV3; + if (options.promptCaching === false) return base; + return plugins.wrapLanguageModel({ + model: base, + middleware: createAnthropicCachingMiddleware(), + }) as unknown as LanguageModelV3; + } + case 'openai': { + const p = plugins.createOpenAI({ apiKey: options.apiKey }); + return p(options.model) as LanguageModelV3; + } + case 'google': { + const p = plugins.createGoogleGenerativeAI({ apiKey: options.apiKey }); + return p(options.model) as LanguageModelV3; + } + case 'groq': { + const p = plugins.createGroq({ apiKey: options.apiKey }); + return p(options.model) as LanguageModelV3; + } + case 'mistral': { + const p = plugins.createMistral({ apiKey: options.apiKey }); + return p(options.model) as LanguageModelV3; + } + case 'xai': { + const p = plugins.createXai({ apiKey: options.apiKey }); + return p(options.model) as LanguageModelV3; + } + case 'perplexity': { + const p = plugins.createPerplexity({ apiKey: options.apiKey }); + return p(options.model) as LanguageModelV3; + } + case 'ollama': + return createOllamaModel(options); + default: + throw new Error(`Unknown provider: ${(options as ISmartAiOptions).provider}`); + } +} diff --git a/ts/smartai.interfaces.ts b/ts/smartai.interfaces.ts new file mode 100644 index 0000000..65b56a0 --- /dev/null +++ b/ts/smartai.interfaces.ts @@ -0,0 +1,53 @@ +import type { LanguageModelV3 } from '@ai-sdk/provider'; + +export type TProvider = + | 'anthropic' + | 'openai' + | 'google' + | 'groq' + | 'mistral' + | 'xai' + | 'perplexity' + | 'ollama'; + +export interface ISmartAiOptions { + provider: TProvider; + model: string; + apiKey?: string; + /** For Ollama: base URL of the local server. Default: http://localhost:11434 */ + baseUrl?: string; + /** + * Ollama-specific model runtime options. + * Only used when provider === 'ollama'. + */ + ollamaOptions?: IOllamaModelOptions; + /** + * Enable Anthropic prompt caching on system + recent messages. + * Only used when provider === 'anthropic'. Default: true. + */ + promptCaching?: boolean; +} + +/** + * Ollama model runtime options passed in the request body `options` field. + * @see https://github.com/ollama/ollama/blob/main/docs/modelfile.md + */ +export interface IOllamaModelOptions { + /** Context window size. Default: 2048. */ + num_ctx?: number; + /** 0 = deterministic. Default: 0.8. For Qwen models use 0.55. */ + temperature?: number; + top_k?: number; + top_p?: number; + repeat_penalty?: number; + num_predict?: number; + stop?: string[]; + seed?: number; + /** + * Enable thinking/reasoning mode (Qwen3, QwQ, DeepSeek-R1 etc.). + * The custom Ollama provider handles this directly. + */ + think?: boolean; +} + +export type { LanguageModelV3 }; diff --git a/ts/smartai.middleware.anthropic.ts b/ts/smartai.middleware.anthropic.ts new file mode 100644 index 0000000..6a58fc3 --- /dev/null +++ b/ts/smartai.middleware.anthropic.ts @@ -0,0 +1,38 @@ +import type { LanguageModelV3Middleware, LanguageModelV3Prompt } from '@ai-sdk/provider'; + +/** + * 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 }; + }, + }; +} diff --git a/ts/smartai.provider.ollama.ts b/ts/smartai.provider.ollama.ts new file mode 100644 index 0000000..8af4348 --- /dev/null +++ b/ts/smartai.provider.ollama.ts @@ -0,0 +1,426 @@ +import type { + LanguageModelV3, + LanguageModelV3CallOptions, + LanguageModelV3GenerateResult, + LanguageModelV3StreamResult, + LanguageModelV3StreamPart, + LanguageModelV3Prompt, + LanguageModelV3Content, + LanguageModelV3Usage, + LanguageModelV3FinishReason, +} from '@ai-sdk/provider'; +import type { ISmartAiOptions, IOllamaModelOptions } from './smartai.interfaces.js'; + +interface IOllamaMessage { + role: string; + content: string; + images?: string[]; + tool_calls?: Array<{ + function: { name: string; arguments: Record }; + }>; + thinking?: string; +} + +interface IOllamaTool { + type: 'function'; + function: { + name: string; + description: string; + parameters: Record; + }; +} + +/** + * Convert AI SDK V3 prompt messages to Ollama's message format. + */ +function convertPromptToOllamaMessages(prompt: LanguageModelV3Prompt): IOllamaMessage[] { + const messages: IOllamaMessage[] = []; + + for (const msg of prompt) { + if (msg.role === 'system') { + // System message content is a plain string in V3 + messages.push({ role: 'system', content: msg.content }); + } else if (msg.role === 'user') { + let text = ''; + const images: string[] = []; + for (const part of msg.content) { + if (part.type === 'text') { + text += part.text; + } else if (part.type === 'file' && part.mediaType?.startsWith('image/')) { + // Handle image files — Ollama expects base64 images + if (typeof part.data === 'string') { + images.push(part.data); + } else if (part.data instanceof Uint8Array) { + images.push(Buffer.from(part.data).toString('base64')); + } + } + } + const m: IOllamaMessage = { role: 'user', content: text }; + if (images.length > 0) m.images = images; + messages.push(m); + } else if (msg.role === 'assistant') { + let text = ''; + let thinking = ''; + const toolCalls: IOllamaMessage['tool_calls'] = []; + for (const part of msg.content) { + if (part.type === 'text') { + text += part.text; + } else if (part.type === 'reasoning') { + thinking += part.text; + } else if (part.type === 'tool-call') { + const args = typeof part.input === 'string' + ? JSON.parse(part.input as string) + : (part.input as Record); + toolCalls.push({ + function: { + name: part.toolName, + arguments: args, + }, + }); + } + } + const m: IOllamaMessage = { role: 'assistant', content: text }; + if (toolCalls.length > 0) m.tool_calls = toolCalls; + if (thinking) m.thinking = thinking; + messages.push(m); + } else if (msg.role === 'tool') { + for (const part of msg.content) { + if (part.type === 'tool-result') { + let resultContent = ''; + if (part.output) { + if (part.output.type === 'text') { + resultContent = part.output.value; + } else if (part.output.type === 'json') { + resultContent = JSON.stringify(part.output.value); + } + } + messages.push({ role: 'tool', content: resultContent }); + } + } + } + } + + return messages; +} + +/** + * Convert AI SDK V3 tools to Ollama's tool format. + */ +function convertToolsToOllamaTools(tools: LanguageModelV3CallOptions['tools']): IOllamaTool[] | undefined { + if (!tools || tools.length === 0) return undefined; + + return tools + .filter((t): t is Extract => t.type === 'function') + .map(t => ({ + type: 'function' as const, + function: { + name: t.name, + description: t.description ?? '', + parameters: t.inputSchema as Record, + }, + })); +} + +function makeUsage(promptTokens?: number, completionTokens?: number): LanguageModelV3Usage { + return { + inputTokens: { + total: promptTokens, + noCache: undefined, + cacheRead: undefined, + cacheWrite: undefined, + }, + outputTokens: { + total: completionTokens, + text: completionTokens, + reasoning: undefined, + }, + }; +} + +function makeFinishReason(reason?: string): LanguageModelV3FinishReason { + if (reason === 'tool_calls' || reason === 'tool-calls') { + return { unified: 'tool-calls', raw: reason }; + } + return { unified: 'stop', raw: reason ?? 'stop' }; +} + +let idCounter = 0; +function generateId(): string { + return `ollama-${Date.now()}-${idCounter++}`; +} + +/** + * Custom LanguageModelV3 implementation for Ollama. + * Calls Ollama's native /api/chat endpoint directly to support + * think, num_ctx, temperature, and other model options. + */ +export function createOllamaModel(options: ISmartAiOptions): LanguageModelV3 { + const baseUrl = options.baseUrl ?? 'http://localhost:11434'; + const modelId = options.model; + const ollamaOpts: IOllamaModelOptions = { ...options.ollamaOptions }; + + // Apply default temperature of 0.55 for Qwen models + if (modelId.toLowerCase().includes('qwen') && ollamaOpts.temperature === undefined) { + ollamaOpts.temperature = 0.55; + } + + const model: LanguageModelV3 = { + specificationVersion: 'v3', + provider: 'ollama', + modelId, + supportedUrls: {}, + + async doGenerate(callOptions: LanguageModelV3CallOptions): Promise { + const messages = convertPromptToOllamaMessages(callOptions.prompt); + const tools = convertToolsToOllamaTools(callOptions.tools); + + const ollamaModelOptions: Record = { ...ollamaOpts }; + // Override with call-level options if provided + if (callOptions.temperature !== undefined) ollamaModelOptions.temperature = callOptions.temperature; + if (callOptions.topP !== undefined) ollamaModelOptions.top_p = callOptions.topP; + if (callOptions.topK !== undefined) ollamaModelOptions.top_k = callOptions.topK; + if (callOptions.maxOutputTokens !== undefined) ollamaModelOptions.num_predict = callOptions.maxOutputTokens; + if (callOptions.seed !== undefined) ollamaModelOptions.seed = callOptions.seed; + if (callOptions.stopSequences) ollamaModelOptions.stop = callOptions.stopSequences; + // Remove think from options — it goes at the top level + const { think, ...modelOpts } = ollamaModelOptions; + + const requestBody: Record = { + model: modelId, + messages, + stream: false, + options: modelOpts, + }; + + // Add think parameter at the top level (Ollama API requirement) + if (ollamaOpts.think !== undefined) { + requestBody.think = ollamaOpts.think; + } + + if (tools) requestBody.tools = tools; + + const response = await fetch(`${baseUrl}/api/chat`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(requestBody), + signal: callOptions.abortSignal, + }); + + if (!response.ok) { + const body = await response.text(); + throw new Error(`Ollama API error ${response.status}: ${body}`); + } + + const result = await response.json() as Record; + const message = result.message as Record; + + // Build content array + const content: LanguageModelV3Content[] = []; + + // Add reasoning if present + if (message.thinking && typeof message.thinking === 'string') { + content.push({ type: 'reasoning', text: message.thinking }); + } + + // Add text content + if (message.content && typeof message.content === 'string') { + content.push({ type: 'text', text: message.content }); + } + + // Add tool calls if present + if (Array.isArray(message.tool_calls)) { + for (const tc of message.tool_calls as Array>) { + const fn = tc.function as Record; + content.push({ + type: 'tool-call', + toolCallId: generateId(), + toolName: fn.name as string, + input: JSON.stringify(fn.arguments), + }); + } + } + + const finishReason = Array.isArray(message.tool_calls) && (message.tool_calls as unknown[]).length > 0 + ? makeFinishReason('tool_calls') + : makeFinishReason('stop'); + + return { + content, + finishReason, + usage: makeUsage( + (result.prompt_eval_count as number) ?? undefined, + (result.eval_count as number) ?? undefined, + ), + warnings: [], + request: { body: requestBody }, + }; + }, + + async doStream(callOptions: LanguageModelV3CallOptions): Promise { + const messages = convertPromptToOllamaMessages(callOptions.prompt); + const tools = convertToolsToOllamaTools(callOptions.tools); + + const ollamaModelOptions: Record = { ...ollamaOpts }; + if (callOptions.temperature !== undefined) ollamaModelOptions.temperature = callOptions.temperature; + if (callOptions.topP !== undefined) ollamaModelOptions.top_p = callOptions.topP; + if (callOptions.topK !== undefined) ollamaModelOptions.top_k = callOptions.topK; + if (callOptions.maxOutputTokens !== undefined) ollamaModelOptions.num_predict = callOptions.maxOutputTokens; + if (callOptions.seed !== undefined) ollamaModelOptions.seed = callOptions.seed; + if (callOptions.stopSequences) ollamaModelOptions.stop = callOptions.stopSequences; + const { think, ...modelOpts } = ollamaModelOptions; + + const requestBody: Record = { + model: modelId, + messages, + stream: true, + options: modelOpts, + }; + + if (ollamaOpts.think !== undefined) { + requestBody.think = ollamaOpts.think; + } + + if (tools) requestBody.tools = tools; + + const response = await fetch(`${baseUrl}/api/chat`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(requestBody), + signal: callOptions.abortSignal, + }); + + if (!response.ok) { + const body = await response.text(); + throw new Error(`Ollama API error ${response.status}: ${body}`); + } + + const reader = response.body!.getReader(); + const decoder = new TextDecoder(); + + const textId = generateId(); + const reasoningId = generateId(); + let textStarted = false; + let reasoningStarted = false; + let hasToolCalls = false; + let closed = false; + + const stream = new ReadableStream({ + async pull(controller) { + if (closed) return; + + const processLine = (line: string) => { + if (!line.trim()) return; + let json: Record; + try { + json = JSON.parse(line); + } catch { + return; + } + + const msg = json.message as Record | undefined; + + // Handle thinking/reasoning content + if (msg?.thinking && typeof msg.thinking === 'string') { + if (!reasoningStarted) { + reasoningStarted = true; + controller.enqueue({ type: 'reasoning-start', id: reasoningId }); + } + controller.enqueue({ type: 'reasoning-delta', id: reasoningId, delta: msg.thinking }); + } + + // Handle text content + if (msg?.content && typeof msg.content === 'string') { + if (reasoningStarted && !textStarted) { + controller.enqueue({ type: 'reasoning-end', id: reasoningId }); + } + if (!textStarted) { + textStarted = true; + controller.enqueue({ type: 'text-start', id: textId }); + } + controller.enqueue({ type: 'text-delta', id: textId, delta: msg.content }); + } + + // Handle tool calls + if (Array.isArray(msg?.tool_calls)) { + hasToolCalls = true; + for (const tc of msg!.tool_calls as Array>) { + const fn = tc.function as Record; + const callId = generateId(); + controller.enqueue({ + type: 'tool-call', + toolCallId: callId, + toolName: fn.name as string, + input: JSON.stringify(fn.arguments), + }); + } + } + + // Handle done + if (json.done) { + if (reasoningStarted && !textStarted) { + controller.enqueue({ type: 'reasoning-end', id: reasoningId }); + } + if (textStarted) { + controller.enqueue({ type: 'text-end', id: textId }); + } + controller.enqueue({ + type: 'finish', + finishReason: hasToolCalls + ? makeFinishReason('tool_calls') + : makeFinishReason('stop'), + usage: makeUsage( + (json.prompt_eval_count as number) ?? undefined, + (json.eval_count as number) ?? undefined, + ), + }); + closed = true; + controller.close(); + } + }; + + try { + let buffer = ''; + while (true) { + const { done, value } = await reader.read(); + if (done) { + if (buffer.trim()) processLine(buffer); + if (!closed) { + controller.enqueue({ + type: 'finish', + finishReason: makeFinishReason('stop'), + usage: makeUsage(undefined, undefined), + }); + closed = true; + controller.close(); + } + return; + } + + buffer += decoder.decode(value, { stream: true }); + const lines = buffer.split('\n'); + buffer = lines.pop() || ''; + for (const line of lines) { + processLine(line); + if (closed) return; + } + } + } catch (error) { + if (!closed) { + controller.error(error); + closed = true; + } + } finally { + reader.releaseLock(); + } + }, + }); + + return { + stream, + request: { body: requestBody }, + }; + }, + }; + + return model; +} diff --git a/ts_audio/index.ts b/ts_audio/index.ts new file mode 100644 index 0000000..e29cdd1 --- /dev/null +++ b/ts_audio/index.ts @@ -0,0 +1,24 @@ +import * as plugins from './plugins.js'; +import { Readable } from 'stream'; + +export interface IOpenAiTtsOptions { + apiKey: string; + text: string; + voice?: 'alloy' | 'echo' | 'fable' | 'onyx' | 'nova' | 'shimmer'; + model?: 'tts-1' | 'tts-1-hd'; + responseFormat?: 'mp3' | 'opus' | 'aac' | 'flac'; + speed?: number; +} + +export async function textToSpeech(options: IOpenAiTtsOptions): Promise { + const client = new plugins.OpenAI({ apiKey: options.apiKey }); + const result = await client.audio.speech.create({ + model: options.model ?? 'tts-1', + voice: options.voice ?? 'alloy', + input: options.text, + response_format: options.responseFormat ?? 'mp3', + speed: options.speed ?? 1, + }); + const stream = result.body; + return Readable.fromWeb(stream as any); +} diff --git a/ts_audio/plugins.ts b/ts_audio/plugins.ts new file mode 100644 index 0000000..d7563b9 --- /dev/null +++ b/ts_audio/plugins.ts @@ -0,0 +1,2 @@ +import OpenAI from 'openai'; +export { OpenAI }; diff --git a/ts_document/index.ts b/ts_document/index.ts new file mode 100644 index 0000000..4deb7c4 --- /dev/null +++ b/ts_document/index.ts @@ -0,0 +1,61 @@ +import * as plugins from './plugins.js'; +import type { LanguageModelV3 } from '@ai-sdk/provider'; +import type { ModelMessage } from 'ai'; + +let smartpdfInstance: InstanceType | null = null; + +async function ensureSmartpdf(): Promise> { + if (!smartpdfInstance) { + smartpdfInstance = new plugins.smartpdf.SmartPdf(); + await smartpdfInstance.start(); + } + return smartpdfInstance; +} + +export interface IDocumentOptions { + model: LanguageModelV3; + systemMessage?: string; + userMessage: string; + pdfDocuments: Uint8Array[]; + messageHistory?: ModelMessage[]; +} + +export async function analyzeDocuments(options: IDocumentOptions): Promise { + const pdf = await ensureSmartpdf(); + + const imagePages: Uint8Array[] = []; + for (const doc of options.pdfDocuments) { + const pages = await pdf.convertPDFToPngBytes(doc); + imagePages.push(...pages); + } + + // Filter out empty buffers + const validPages = imagePages.filter(page => page && page.length > 0); + + const result = await plugins.generateText({ + model: options.model, + system: options.systemMessage, + messages: [ + ...(options.messageHistory ?? []), + { + role: 'user', + content: [ + { type: 'text', text: options.userMessage }, + ...validPages.map(page => ({ + type: 'image' as const, + image: page, + mimeType: 'image/png' as const, + })), + ], + }, + ], + }); + return result.text; +} + +export async function stopSmartpdf(): Promise { + if (smartpdfInstance) { + await smartpdfInstance.stop(); + smartpdfInstance = null; + } +} diff --git a/ts_document/plugins.ts b/ts_document/plugins.ts new file mode 100644 index 0000000..8aa49e7 --- /dev/null +++ b/ts_document/plugins.ts @@ -0,0 +1,3 @@ +import { generateText } from 'ai'; +import * as smartpdf from '@push.rocks/smartpdf'; +export { generateText, smartpdf }; diff --git a/ts_image/index.ts b/ts_image/index.ts new file mode 100644 index 0000000..6dd32ee --- /dev/null +++ b/ts_image/index.ts @@ -0,0 +1,147 @@ +import * as plugins from './plugins.js'; + +export interface IImageGenerateOptions { + apiKey: string; + prompt: string; + model?: 'gpt-image-1' | 'dall-e-3' | 'dall-e-2'; + quality?: 'low' | 'medium' | 'high' | 'standard' | 'hd' | 'auto'; + size?: '256x256' | '512x512' | '1024x1024' | '1536x1024' | '1024x1536' | '1792x1024' | '1024x1792' | 'auto'; + style?: 'vivid' | 'natural'; + background?: 'transparent' | 'opaque' | 'auto'; + outputFormat?: 'png' | 'jpeg' | 'webp'; + outputCompression?: number; + moderation?: 'low' | 'auto'; + n?: number; + stream?: boolean; + partialImages?: number; +} + +export interface IImageEditOptions { + apiKey: string; + image: Buffer; + prompt: string; + mask?: Buffer; + model?: 'gpt-image-1' | 'dall-e-2'; + quality?: 'low' | 'medium' | 'high' | 'standard' | 'auto'; + size?: '256x256' | '512x512' | '1024x1024' | '1536x1024' | '1024x1536' | 'auto'; + background?: 'transparent' | 'opaque' | 'auto'; + outputFormat?: 'png' | 'jpeg' | 'webp'; + outputCompression?: number; + n?: number; + stream?: boolean; + partialImages?: number; +} + +export interface IImageResponse { + images: Array<{ + b64_json?: string; + url?: string; + revisedPrompt?: string; + }>; + metadata?: { + model: string; + quality?: string; + size?: string; + outputFormat?: string; + tokensUsed?: number; + }; +} + +export async function generateImage(options: IImageGenerateOptions): Promise { + const client = new plugins.OpenAI({ apiKey: options.apiKey }); + const model = options.model || 'gpt-image-1'; + + const requestParams: Record = { + model, + prompt: options.prompt, + n: options.n || 1, + }; + + if (model === 'gpt-image-1') { + if (options.quality) requestParams.quality = options.quality; + if (options.size) requestParams.size = options.size; + if (options.background) requestParams.background = options.background; + if (options.outputFormat) requestParams.output_format = options.outputFormat; + if (options.outputCompression !== undefined) requestParams.output_compression = options.outputCompression; + if (options.moderation) requestParams.moderation = options.moderation; + if (options.stream !== undefined) requestParams.stream = options.stream; + if (options.partialImages !== undefined) requestParams.partial_images = options.partialImages; + } else if (model === 'dall-e-3') { + if (options.quality) requestParams.quality = options.quality; + if (options.size) requestParams.size = options.size; + if (options.style) requestParams.style = options.style; + requestParams.response_format = 'b64_json'; + } else if (model === 'dall-e-2') { + if (options.size) requestParams.size = options.size; + requestParams.response_format = 'b64_json'; + } + + const result: any = await client.images.generate(requestParams as any); + + const images = (result.data || []).map((img: any) => ({ + b64_json: img.b64_json, + url: img.url, + revisedPrompt: img.revised_prompt, + })); + + return { + images, + metadata: { + model, + quality: result.quality, + size: result.size, + outputFormat: result.output_format, + tokensUsed: result.usage?.total_tokens, + }, + }; +} + +export async function editImage(options: IImageEditOptions): Promise { + const client = new plugins.OpenAI({ apiKey: options.apiKey }); + const model = options.model || 'gpt-image-1'; + + const imageFile = await plugins.toFile(options.image, 'image.png', { type: 'image/png' }); + + const requestParams: Record = { + model, + image: imageFile, + prompt: options.prompt, + n: options.n || 1, + }; + + if (options.mask) { + requestParams.mask = await plugins.toFile(options.mask, 'mask.png', { type: 'image/png' }); + } + + if (model === 'gpt-image-1') { + if (options.quality) requestParams.quality = options.quality; + if (options.size) requestParams.size = options.size; + if (options.background) requestParams.background = options.background; + if (options.outputFormat) requestParams.output_format = options.outputFormat; + if (options.outputCompression !== undefined) requestParams.output_compression = options.outputCompression; + if (options.stream !== undefined) requestParams.stream = options.stream; + if (options.partialImages !== undefined) requestParams.partial_images = options.partialImages; + } else if (model === 'dall-e-2') { + if (options.size) requestParams.size = options.size; + requestParams.response_format = 'b64_json'; + } + + const result: any = await client.images.edit(requestParams as any); + + const images = (result.data || []).map((img: any) => ({ + b64_json: img.b64_json, + url: img.url, + revisedPrompt: img.revised_prompt, + })); + + return { + images, + metadata: { + model, + quality: result.quality, + size: result.size, + outputFormat: result.output_format, + tokensUsed: result.usage?.total_tokens, + }, + }; +} diff --git a/ts_image/plugins.ts b/ts_image/plugins.ts new file mode 100644 index 0000000..f4bf560 --- /dev/null +++ b/ts_image/plugins.ts @@ -0,0 +1,3 @@ +import OpenAI from 'openai'; +import { toFile } from 'openai'; +export { OpenAI, toFile }; diff --git a/ts_research/index.ts b/ts_research/index.ts new file mode 100644 index 0000000..33cfe88 --- /dev/null +++ b/ts_research/index.ts @@ -0,0 +1,120 @@ +import * as plugins from './plugins.js'; + +export interface IResearchOptions { + apiKey: string; + query: string; + searchDepth?: 'basic' | 'advanced' | 'deep'; + maxSources?: number; + allowedDomains?: string[]; + blockedDomains?: string[]; +} + +export interface IResearchResponse { + answer: string; + sources: Array<{ url: string; title: string; snippet: string }>; + searchQueries?: string[]; + metadata?: Record; +} + +export async function research(options: IResearchOptions): Promise { + const client = new plugins.Anthropic({ apiKey: options.apiKey }); + + const systemMessage = `You are a research assistant with web search capabilities. +Provide comprehensive, well-researched answers with citations and sources. +When searching the web, be thorough and cite your sources accurately.`; + + // Build web search tool config + const webSearchTool: any = { + type: 'web_search_20250305', + name: 'web_search', + }; + + if (options.maxSources) { + webSearchTool.max_uses = options.maxSources; + } + if (options.allowedDomains?.length) { + webSearchTool.allowed_domains = options.allowedDomains; + } else if (options.blockedDomains?.length) { + webSearchTool.blocked_domains = options.blockedDomains; + } + + const result = await client.messages.create({ + model: 'claude-sonnet-4-5-20250929', + system: systemMessage, + messages: [ + { role: 'user' as const, content: options.query }, + ], + max_tokens: 20000, + temperature: 0.7, + tools: [webSearchTool], + }); + + // Extract answer, sources, and search queries + let answer = ''; + const sources: Array<{ url: string; title: string; snippet: string }> = []; + const searchQueries: string[] = []; + + for (const block of result.content) { + const b: any = block; + if ('text' in b) { + answer += b.text; + + // Extract citations if present + if (b.citations && Array.isArray(b.citations)) { + for (const citation of b.citations) { + if (citation.type === 'web_search_result_location') { + sources.push({ + title: citation.title || '', + url: citation.url || '', + snippet: citation.cited_text || '', + }); + } + } + } + } else if (b.type === 'server_tool_use') { + if (b.name === 'web_search' && b.input?.query) { + searchQueries.push(b.input.query); + } + } else if (b.type === 'web_search_tool_result') { + if (Array.isArray(b.content)) { + for (const item of b.content) { + if (item.type === 'web_search_result') { + if (!sources.some(s => s.url === item.url)) { + sources.push({ + title: item.title || '', + url: item.url || '', + snippet: '', + }); + } + } + } + } + } + } + + // Fallback: parse markdown links if no citations found + if (sources.length === 0) { + const urlRegex = /\[([^\]]+)\]\(([^)]+)\)/g; + let match: RegExpExecArray | null; + while ((match = urlRegex.exec(answer)) !== null) { + sources.push({ + title: match[1], + url: match[2], + snippet: '', + }); + } + } + + const usage: any = result.usage; + return { + answer, + sources, + searchQueries: searchQueries.length > 0 ? searchQueries : undefined, + metadata: { + model: 'claude-sonnet-4-5-20250929', + searchDepth: options.searchDepth || 'basic', + tokensUsed: usage?.output_tokens, + webSearchesPerformed: usage?.server_tool_use?.web_search_requests ?? 0, + }, + }; +} diff --git a/ts_research/plugins.ts b/ts_research/plugins.ts new file mode 100644 index 0000000..b69389c --- /dev/null +++ b/ts_research/plugins.ts @@ -0,0 +1,2 @@ +import Anthropic from '@anthropic-ai/sdk'; +export { Anthropic }; diff --git a/ts_vision/index.ts b/ts_vision/index.ts new file mode 100644 index 0000000..d34dcc5 --- /dev/null +++ b/ts_vision/index.ts @@ -0,0 +1,29 @@ +import * as plugins from './plugins.js'; +import type { LanguageModelV3 } from '@ai-sdk/provider'; + +export interface IVisionOptions { + model: LanguageModelV3; + image: Buffer | Uint8Array; + prompt: string; + mediaType?: 'image/jpeg' | 'image/png' | 'image/webp' | 'image/gif'; +} + +export async function analyzeImage(options: IVisionOptions): Promise { + const result = await plugins.generateText({ + model: options.model, + messages: [ + { + role: 'user', + content: [ + { type: 'text', text: options.prompt }, + { + type: 'image', + image: options.image, + mediaType: options.mediaType ?? 'image/jpeg', + }, + ], + }, + ], + }); + return result.text; +} diff --git a/ts_vision/plugins.ts b/ts_vision/plugins.ts new file mode 100644 index 0000000..a6abbb0 --- /dev/null +++ b/ts_vision/plugins.ts @@ -0,0 +1,2 @@ +import { generateText } from 'ai'; +export { generateText };