diff --git a/.env.example b/.env.example index 6f6aa6e1..f0f6f16f 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,9 @@ +# Required for a successful lint/build: +# - DATABASE_URL +# - NEXTAUTH_URL +# - AUTH_SECRET +# Provide OPENROUTER_API_KEY or other model keys if you want inference/image features. + # ---------- # DATABASE # ---------- diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ffd0ee7b..8cc43938 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: run: pnpm run format:check - name: Run linting and type check - run: SKIP_ENV_VALIDATION=1 pnpm run check + run: pnpm run check - name: Build project - run: SKIP_ENV_VALIDATION=1 pnpm run build-pure + run: pnpm run build-pure diff --git a/.gitignore b/.gitignore index 790978dc..8a340bae 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +.pnpm-store/ # testing /coverage @@ -32,6 +33,9 @@ yarn-error.log* .pnpm-debug.log* pnpm-workspace.yaml +# pnpm store (cache) - don't commit +.pnpm-store/ + # local env files # do not commit any .env files to git, except for the .env.example file. https://create.t3.gg/en/usage/env-variables#using-environment-variables .env @@ -45,4 +49,4 @@ pnpm-workspace.yaml *.tsbuildinfo # idea files -.idea \ No newline at end of file +.idea diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..f89630f8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,21 @@ +# Changelog + +## 2025-08-16 + +- Build and type fixes following ai v5/@ai-sdk/react v2 migration: + - Correctly type `UseChatHelpers` in chat input/components. + - Guard undefined `toolName` and fix `append` signature in MessageTool. + - Safe reasoning text extraction and switch to `??` to satisfy ESLint. +- API: Fix file-part type narrowing in `/api/chat` to match zod schema (resolves type predicate error in build). +- Prisma: Add `binaryTargets = ["native", "debian-openssl-1.1.x", "debian-openssl-3.0.x"]` to resolve query engine mismatch; regenerated client. +- Build: Verified `next build` passes lint and type checks. +- Action item: After pulling, run `pnpm prisma generate` to refresh the Prisma Client for your platform. + +## 2025-08-15 + +- Migrate to ai v5 and @ai-sdk/react v2. +- Switch to parts-based UIMessage (text, file, reasoning, tool-invocation). +- Server streaming refactor using result.toUIMessageStream. +- Removed experimental_attachments in favor of file parts. +- Preserved DB persistence and resumable streaming. +- Improved setup resiliency (Docker/DB optional in dev). diff --git a/README.md b/README.md index e94a5c64..77aee036 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,17 @@ The setup script will: - Run database migrations - Run the app +#### Remote Database Override + +By default, local migrations are only executed for a localhost / 127.0.0.1 `DATABASE_URL`. +If you intentionally point `DATABASE_URL` to a remote managed database during development and want to skip local migrations, set: + +``` +REMOTE_DB=1 +``` + +This makes the skip explicit; otherwise the setup will fail fast to prevent accidentally targeting production. + ### Manual Setup If you prefer to set up manually: @@ -136,6 +147,10 @@ LUMA_API_KEY= ## Development +### AI SDK v5 Upgrade + +This project uses ai v5 and @ai-sdk/react v2. Messages are parts-based (text, file, reasoning, tool-invocation) and server streaming uses result.toUIMessageStream. Client submits files as file parts; experimental_attachments is no longer used. + ### Project Structure ``` diff --git a/eslint.config.js b/eslint.config.js index 5cfc93e9..e7ce0e22 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -36,11 +36,7 @@ export default tseslint.config( }, }, { - files: ["src/components/ui/**/*.ts", "src/components/ui/**/*.tsx"], - rules: { - "@typescript-eslint/no-unused-vars": "off", - "react/no-unescaped-entities": "off", - }, + // Strict configuration: no per-folder relaxations (UI components included). }, { linterOptions: { diff --git a/package.json b/package.json index 5616cf0b..6ccfc9bc 100644 --- a/package.json +++ b/package.json @@ -25,16 +25,16 @@ "shiki:generate": "pnpm dlx tsx src/components/ui/code/codegen.ts && pnpm format:write" }, "dependencies": { - "@ai-sdk/anthropic": "^1.2.12", - "@ai-sdk/fal": "^0.1.12", - "@ai-sdk/fireworks": "^0.2.16", - "@ai-sdk/google": "^1.2.19", - "@ai-sdk/groq": "^1.2.9", - "@ai-sdk/luma": "^0.1.8", - "@ai-sdk/openai": "^1.3.22", - "@ai-sdk/perplexity": "^1.1.9", - "@ai-sdk/react": "^1.2.12", - "@ai-sdk/xai": "^1.2.16", + "@ai-sdk/anthropic": "^2.0.0", + "@ai-sdk/fal": "^1.0.6", + "@ai-sdk/fireworks": "^1.0.7", + "@ai-sdk/google": "^2.0.0", + "@ai-sdk/groq": "^2.0.0", + "@ai-sdk/luma": "^1.0.3", + "@ai-sdk/openai": "^2.0.0", + "@ai-sdk/perplexity": "^2.0.0", + "@ai-sdk/react": "^2.0.0", + "@ai-sdk/xai": "^2.0.0", "@auth/prisma-adapter": "^2.7.2", "@discordjs/rest": "^2.5.1", "@e2b/code-interpreter": "^1.5.1", @@ -45,7 +45,9 @@ "@llm-ui/react": "^0.13.3", "@modelcontextprotocol/sdk": "^1.12.0", "@notionhq/client": "^3.1.3", - "@openrouter/ai-sdk-provider": "^0.7.2", + "@openrouter/ai-sdk-provider": "^1.1.2", + "@ai-sdk/provider": "^2.0.0", + "@ai-sdk/provider-utils": "^3.0.0", "@prisma/client": "^6.13.0", "@radix-ui/react-accordion": "^1.2.11", "@radix-ui/react-alert-dialog": "^1.1.14", @@ -76,13 +78,13 @@ "@vercel/mcp-adapter": "^0.11.1", "@vercel/speed-insights": "^1.2.0", "@xyflow/react": "^12.8.2", - "ai": "^4.3.16", + "ai": "^5.0.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "cookies-next": "^6.0.0", "date-fns": "^4.1.0", - "etsy-ts": "^4.2.0", + "etsy-ts": "^4.2.0", "discord-api-types": "^0.38.17", "exa-js": "^1.8.8", "fast-deep-equal": "^3.1.3", @@ -118,7 +120,7 @@ "usehooks-ts": "^3.1.1", "uuid": "^11.1.0", "vaul": "^1.1.2", - "zod": "^3.25.56" + "zod": "^3.25.76" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", @@ -132,7 +134,7 @@ "postcss": "^8.5.3", "prettier": "^3.5.3", "prettier-plugin-tailwindcss": "^0.6.11", - "prisma": "^6.5.0", + "prisma": "^6.13.0", "shiki-codegen": "^3.9.2", "tailwindcss": "^4.0.15", "tsx": "^4.7.1", @@ -143,6 +145,7 @@ "ct3aMetadata": { "initVersion": "7.39.3" }, + "packageManager": "pnpm@10.3.0", "devEngines": { "runtime": { "name": "node", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9cafcd36..47db2c12 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,38 +9,44 @@ importers: .: dependencies: '@ai-sdk/anthropic': - specifier: ^1.2.12 - version: 1.2.12(zod@3.25.56) + specifier: ^2.0.0 + version: 2.0.4(zod@3.25.76) '@ai-sdk/fal': - specifier: ^0.1.12 - version: 0.1.12(zod@3.25.56) + specifier: ^1.0.6 + version: 1.0.6(zod@3.25.76) '@ai-sdk/fireworks': - specifier: ^0.2.16 - version: 0.2.16(zod@3.25.56) + specifier: ^1.0.7 + version: 1.0.7(zod@3.25.76) '@ai-sdk/google': - specifier: ^1.2.19 - version: 1.2.19(zod@3.25.56) + specifier: ^2.0.0 + version: 2.0.6(zod@3.25.76) '@ai-sdk/groq': - specifier: ^1.2.9 - version: 1.2.9(zod@3.25.56) + specifier: ^2.0.0 + version: 2.0.9(zod@3.25.76) '@ai-sdk/luma': - specifier: ^0.1.8 - version: 0.1.8(zod@3.25.56) + specifier: ^1.0.3 + version: 1.0.3(zod@3.25.76) '@ai-sdk/openai': - specifier: ^1.3.22 - version: 1.3.22(zod@3.25.56) + specifier: ^2.0.0 + version: 2.0.14(zod@3.25.76) '@ai-sdk/perplexity': - specifier: ^1.1.9 - version: 1.1.9(zod@3.25.56) + specifier: ^2.0.0 + version: 2.0.3(zod@3.25.76) + '@ai-sdk/provider': + specifier: ^2.0.0 + version: 2.0.0 + '@ai-sdk/provider-utils': + specifier: ^3.0.0 + version: 3.0.3(zod@3.25.76) '@ai-sdk/react': - specifier: ^1.2.12 - version: 1.2.12(react@19.1.0)(zod@3.25.56) + specifier: ^2.0.0 + version: 2.0.14(react@19.1.0)(zod@3.25.76) '@ai-sdk/xai': - specifier: ^1.2.16 - version: 1.2.16(zod@3.25.56) + specifier: ^2.0.0 + version: 2.0.7(zod@3.25.76) '@auth/prisma-adapter': specifier: ^2.7.2 - version: 2.9.1(@prisma/client@6.13.0(prisma@6.9.0(typescript@5.8.3))(typescript@5.8.3)) + version: 2.9.1(@prisma/client@6.13.0(prisma@6.14.0(typescript@5.8.3))(typescript@5.8.3)) '@discordjs/rest': specifier: ^2.5.1 version: 2.5.1 @@ -69,11 +75,11 @@ importers: specifier: ^3.1.3 version: 3.1.3 '@openrouter/ai-sdk-provider': - specifier: ^0.7.2 - version: 0.7.2(ai@4.3.16(react@19.1.0)(zod@3.25.56))(zod@3.25.56) + specifier: ^1.1.2 + version: 1.1.2(ai@5.0.14(zod@3.25.76))(zod@3.25.76) '@prisma/client': specifier: ^6.13.0 - version: 6.13.0(prisma@6.9.0(typescript@5.8.3))(typescript@5.8.3) + version: 6.13.0(prisma@6.14.0(typescript@5.8.3))(typescript@5.8.3) '@radix-ui/react-accordion': specifier: ^1.2.11 version: 1.2.11(@types/react-dom@19.1.6(@types/react@19.1.6))(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -130,7 +136,7 @@ importers: version: 1.2.0 '@t3-oss/env-nextjs': specifier: ^0.12.0 - version: 0.12.0(typescript@5.8.3)(zod@3.25.56) + version: 0.12.0(typescript@5.8.3)(zod@3.25.76) '@tanstack/react-query': specifier: ^5.69.0 version: 5.80.6(react@19.1.0) @@ -162,8 +168,8 @@ importers: specifier: ^12.8.2 version: 12.8.2(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) ai: - specifier: ^4.3.16 - version: 4.3.16(react@19.1.0)(zod@3.25.56) + specifier: ^5.0.0 + version: 5.0.14(zod@3.25.76) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -179,15 +185,15 @@ importers: date-fns: specifier: ^4.1.0 version: 4.1.0 - etsy-ts: - specifier: ^4.2.0 - version: 4.2.0 discord-api-types: specifier: ^0.38.17 version: 0.38.18 + etsy-ts: + specifier: ^4.2.0 + version: 4.2.0 exa-js: specifier: ^1.8.8 - version: 1.8.8(encoding@0.1.13)(ws@8.18.3)(zod@3.25.56) + version: 1.8.8(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76) fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 @@ -211,7 +217,7 @@ importers: version: 1.16.0(encoding@0.1.13) mem0ai: specifier: ^2.1.30 - version: 2.1.30(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@cloudflare/workers-types@4.20250614.0)(@google/genai@1.5.1(@modelcontextprotocol/sdk@1.12.2)(encoding@0.1.13))(@langchain/core@0.3.58(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.56)))(@mistralai/mistralai@1.7.2(zod@3.25.56))(@qdrant/js-client-rest@1.13.0(typescript@5.8.3))(@supabase/supabase-js@2.50.0)(@types/jest@29.5.14)(@types/pg@8.11.0)(@types/sqlite3@3.1.11)(cloudflare@4.3.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.1)(ollama@0.5.16)(pg@8.11.3)(redis@5.5.6)(sqlite3@5.1.7)(ws@8.18.3) + version: 2.1.30(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@cloudflare/workers-types@4.20250614.0)(@google/genai@1.5.1(@modelcontextprotocol/sdk@1.12.2)(encoding@0.1.13))(@langchain/core@0.3.58(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.76)))(@mistralai/mistralai@1.7.2(zod@3.25.76))(@qdrant/js-client-rest@1.13.0(typescript@5.8.3))(@supabase/supabase-js@2.50.0)(@types/jest@29.5.14)(@types/pg@8.11.0)(@types/sqlite3@3.1.11)(cloudflare@4.3.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.1)(ollama@0.5.16)(pg@8.11.3)(redis@5.5.6)(sqlite3@5.1.7)(ws@8.18.3) motion: specifier: ^12.16.0 version: 12.16.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -288,8 +294,8 @@ importers: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@19.1.6(@types/react@19.1.6))(@types/react@19.1.6)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) zod: - specifier: ^3.25.56 - version: 3.25.56 + specifier: ^3.25.76 + version: 3.25.76 devDependencies: '@eslint/eslintrc': specifier: ^3.3.1 @@ -325,8 +331,8 @@ importers: specifier: ^0.6.11 version: 0.6.12(prettier@3.5.3) prisma: - specifier: ^6.5.0 - version: 6.9.0(typescript@5.8.3) + specifier: ^6.13.0 + version: 6.14.0(typescript@5.8.3) shiki-codegen: specifier: ^3.9.2 version: 3.9.2 @@ -348,97 +354,91 @@ importers: packages: - '@ai-sdk/anthropic@1.2.12': - resolution: {integrity: sha512-YSzjlko7JvuiyQFmI9RN1tNZdEiZxc+6xld/0tq/VkJaHpEzGAb1yiNxxvmYVcjvfu/PcvCxAAYXmTYQQ63IHQ==} + '@ai-sdk/anthropic@2.0.4': + resolution: {integrity: sha512-ii2bZEUPwBitUiK1dpX+HsOarcDGY71G9TVdSJqbfXSVqa+speJNZ8PA/bjuNMml0NyX8VxNsaMg3SwBUCZspA==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/fal@0.1.12': - resolution: {integrity: sha512-Z0pUUR3qwLTj4HXgGJSes5fwjUbSowsMiKbpYKGl6V51sQeUk2EjZctdN4+a+GBuDNCP6Y32Wi8ejM54OMee+w==} + '@ai-sdk/fal@1.0.6': + resolution: {integrity: sha512-5hUqCm4kRnWLK6UUuSmitdpZyoVaniqQay/MBrhfoTTkF8Xsd04G1/GeNGCWdJkSGZHSa35do4zZN9zb5KEiSQ==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/fireworks@0.2.16': - resolution: {integrity: sha512-YHUqW9QHMNjEg5vF0cmhnlAQJCMljWVWNAAFmKCPX31Dj4JaoCjOrIInrNEFerFRaO64hEffhlhuC1EmuO2Lyg==} + '@ai-sdk/fireworks@1.0.7': + resolution: {integrity: sha512-SI2s5PuWs04ZyiFu+ZowdWUm2KjGqdIdWntQcjobu3HmdXPCEdZ928ZcRoRbOB8sd/+2PICfl6AtzLaW6mN0Ew==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/google@1.2.19': - resolution: {integrity: sha512-Xgl6eftIRQ4srUdCzxM112JuewVMij5q4JLcNmHcB68Bxn9dpr3MVUSPlJwmameuiQuISIA8lMB+iRiRbFsaqA==} + '@ai-sdk/gateway@1.0.6': + resolution: {integrity: sha512-JuSj1MtTr4vw2VBBth4wlbciQnQIV0o1YV9qGLFA+r85nR5H+cJp3jaYE0nprqfzC9rYG8w9c6XGHB3SDKgcgA==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/groq@1.2.9': - resolution: {integrity: sha512-7MoDaxm8yWtiRbD1LipYZG0kBl+Xe0sv/EeyxnHnGPZappXdlgtdOgTZVjjXkT3nWP30jjZi9A45zoVrBMb3Xg==} + '@ai-sdk/google@2.0.6': + resolution: {integrity: sha512-8acuseWJI+RRH99JDWM/n7IJRuuGNa4YzLXB/leqE/ZByHyIiVWGADjJi/vfnJnmdM5fQnezJ6SRTF6feI5rSQ==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/luma@0.1.8': - resolution: {integrity: sha512-6FmUOwZKKldzbTYzS+dNq4LuNb+27gTb/7XQZak46OIUSbBD8FHJm4W/OcUmubuuZ//VHanyyb/QWElipZ/O9w==} + '@ai-sdk/groq@2.0.9': + resolution: {integrity: sha512-qrSHXGLxgNcdRA6muNd4IYP8ZHi8MOcUJ46OKZwKEQCL12cqASv82sldYh8puJC7KbxwC/LV8PwcOzfNbMRMDw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/openai-compatible@0.2.14': - resolution: {integrity: sha512-icjObfMCHKSIbywijaoLdZ1nSnuRnWgMEMLgwoxPJgxsUHMx0aVORnsLUid4SPtdhHI3X2masrt6iaEQLvOSFw==} + '@ai-sdk/luma@1.0.3': + resolution: {integrity: sha512-nYJNqruBNVr5Dff9H+GGyNPheo+MRQvie50zm6hQyWfm8BiXMJTGG8NPSu9F0y7x8WUweqcWo1x1DxOpfznjxA==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/openai-compatible@0.2.16': - resolution: {integrity: sha512-LkvfcM8slJedRyJa/MiMiaOzcMjV1zNDwzTHEGz7aAsgsQV0maLfmJRi/nuSwf5jmp0EouC+JXXDUj2l94HgQw==} + '@ai-sdk/openai-compatible@1.0.7': + resolution: {integrity: sha512-mH+0yoJCvPQZBwwyw8ALil0cA40dQAPc+YhaANFxpjDJKqtATpHXPxq7u2SiMNkbqV26jO92etHPM+EP2+p2VA==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/openai@1.3.22': - resolution: {integrity: sha512-QwA+2EkG0QyjVR+7h6FE7iOu2ivNqAVMm9UJZkVxxTk5OIq5fFJDTEI/zICEMuHImTTXR2JjsL6EirJ28Jc4cw==} + '@ai-sdk/openai@2.0.14': + resolution: {integrity: sha512-u/wi1ixcvcg29wAJySjO803HlXpyCl6mkcOHn+Zn7DA+CtjuQNkKikJ4pZBc7I3Qhi90kA4XnOfKikhBXh4c4Q==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/perplexity@1.1.9': - resolution: {integrity: sha512-Ytolh/v2XupXbTvjE18EFBrHLoNMH0Ueji3lfSPhCoRUfkwrgZ2D9jlNxvCNCCRiGJG5kfinSHvzrH5vGDklYA==} + '@ai-sdk/perplexity@2.0.3': + resolution: {integrity: sha512-rHF/1FEmV57VJ24qfWHoTz1ktQU7ZsgehY1UTgz+shTzNjnLjX+P9h2HRweLkvxPhB3/sNX8zl6Y2dUbSnA5gw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 - '@ai-sdk/provider-utils@2.2.8': - resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + '@ai-sdk/provider-utils@3.0.3': + resolution: {integrity: sha512-kAxIw1nYmFW1g5TvE54ZB3eNtgZna0RnLjPUp1ltz1+t9xkXJIuDT4atrwfau9IbS0BOef38wqrI8CjFfQrxhw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 + zod: ^3.25.76 || ^4 - '@ai-sdk/provider@1.1.3': - resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/react@1.2.12': - resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} + '@ai-sdk/react@2.0.14': + resolution: {integrity: sha512-CDiQ8/nnl8pOuqZzMpvZ1LNeLfDwjCYeyIniv4RiLH2419cv9f+FO0wctHAsxAvHBp/WnlsYudzxmFv09lcmGA==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 + zod: ^3.25.76 || ^4 peerDependenciesMeta: zod: optional: true - '@ai-sdk/ui-utils@1.2.11': - resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} + '@ai-sdk/xai@2.0.7': + resolution: {integrity: sha512-XVrQZwxOGRik8c32d6XACnTqxBvHNBcMxyEH5Ep0awgyX23w1hIjBynR+UbGx1ARjLPwxB0EgJASz53Z0AJJ3w==} engines: {node: '>=18'} peerDependencies: - zod: ^3.23.8 - - '@ai-sdk/xai@1.2.16': - resolution: {integrity: sha512-UOZT8td9PWwMi2dF9a0U44t/Oltmf6QmIJdSvrOcLG4mvpRc1UJn6YJaR0HtXs3YnW6SvY1zRdIDrW4GFpv4NA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 + zod: ^3.25.76 || ^4 '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} @@ -1164,12 +1164,12 @@ packages: resolution: {integrity: sha512-16TtZXNOfH8RaRsV+iag5dTYeJvdOdZDBcpEPCULdKS3eTRJqAYxBNZPFaDJ3cx3WNyvbaQ0IxsPpnaR/tgGFA==} engines: {node: '>= 20'} - '@openrouter/ai-sdk-provider@0.7.2': - resolution: {integrity: sha512-Fry2mV7uGGJRmP9JntTZRc8ElESIk7AJNTacLbF6Syoeb5k8d7HPGkcK9rTXDlqBb8HgU1hOKtz23HojesTmnw==} + '@openrouter/ai-sdk-provider@1.1.2': + resolution: {integrity: sha512-cfiKVpNygGFaJojBHFvtTf7UiF458Xh9yPcTg4FXF7bGYN5V33Rxx9dXNE12fjv6lHeC5C7jwQHDrzUIFol1iQ==} engines: {node: '>=18'} peerDependencies: - ai: ^4.3.16 - zod: ^3.25.34 + ai: ^5.0.0 + zod: ^3.24.1 || ^v4 '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} @@ -1190,23 +1190,23 @@ packages: typescript: optional: true - '@prisma/config@6.9.0': - resolution: {integrity: sha512-Wcfk8/lN3WRJd5w4jmNQkUwhUw0eksaU/+BlAJwPQKW10k0h0LC9PD/6TQFmqKVbHQL0vG2z266r0S1MPzzhbA==} + '@prisma/config@6.14.0': + resolution: {integrity: sha512-IwC7o5KNNGhmblLs23swnfBjADkacBb7wvyDXUWLwuvUQciKJZqyecU0jw0d7JRkswrj+XTL8fdr0y2/VerKQQ==} - '@prisma/debug@6.9.0': - resolution: {integrity: sha512-bFeur/qi/Q+Mqk4JdQ3R38upSYPebv5aOyD1RKywVD+rAMLtRkmTFn28ZuTtVOnZHEdtxnNOCH+bPIeSGz1+Fg==} + '@prisma/debug@6.14.0': + resolution: {integrity: sha512-j4Lf+y+5QIJgQD4sJWSbkOD7geKx9CakaLp/TyTy/UDu9Wo0awvWCBH/BAxTHUaCpIl9USA5VS/KJhDqKJSwug==} - '@prisma/engines-version@6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e': - resolution: {integrity: sha512-Qp9gMoBHgqhKlrvumZWujmuD7q4DV/gooEyPCLtbkc13EZdSz2RsGUJ5mHb3RJgAbk+dm6XenqG7obJEhXcJ6Q==} + '@prisma/engines-version@6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49': + resolution: {integrity: sha512-EgN9ODJpiX45yvwcngoStp3uQPJ3l+AEVoQ6dMMO2QvmwIlnxfApzKmJQExzdo7/hqQANrz5txHJdGYHzOnGHA==} - '@prisma/engines@6.9.0': - resolution: {integrity: sha512-im0X0bwDLA0244CDf8fuvnLuCQcBBdAGgr+ByvGfQY9wWl6EA+kRGwVk8ZIpG65rnlOwtaWIr/ZcEU5pNVvq9g==} + '@prisma/engines@6.14.0': + resolution: {integrity: sha512-LhJjqsALFEcoAtF07nSaOkVguaxw/ZsgfROIYZ8bAZDobe7y8Wy+PkYQaPOK1iLSsFgV2MhCO/eNrI1gdSOj6w==} - '@prisma/fetch-engine@6.9.0': - resolution: {integrity: sha512-PMKhJdl4fOdeE3J3NkcWZ+tf3W6rx3ht/rLU8w4SXFRcLhd5+3VcqY4Kslpdm8osca4ej3gTfB3+cSk5pGxgFg==} + '@prisma/fetch-engine@6.14.0': + resolution: {integrity: sha512-MPzYPOKMENYOaY3AcAbaKrfvXVlvTc6iHmTXsp9RiwCX+bPyfDMqMFVUSVXPYrXnrvEzhGHfyiFy0PRLHPysNg==} - '@prisma/get-platform@6.9.0': - resolution: {integrity: sha512-/B4n+5V1LI/1JQcHp+sUpyRT1bBgZVPHbsC4lt4/19Xp4jvNIVcq5KYNtQDk5e/ukTSjo9PZVAxxy9ieFtlpTQ==} + '@prisma/get-platform@6.14.0': + resolution: {integrity: sha512-7VjuxKNwjnBhKfqPpMeWiHEa2sVjYzmHdl1slW6STuUCe9QnOY0OY1ljGSvz6wpG4U8DfbDqkG1yofd/1GINww==} '@qdrant/js-client-rest@1.13.0': resolution: {integrity: sha512-bewMtnXlGvhhnfXsp0sLoLXOGvnrCM15z9lNlG0Snp021OedNAnRtKkerjk5vkOcbQWUmJHXYCuxDfcT93aSkA==} @@ -1801,6 +1801,9 @@ packages: '@spotify/web-api-ts-sdk@1.2.0': resolution: {integrity: sha512-JUaebva3Ohwo5I5tuTqyW/FKGOMbb40YevJMySAOINRxP7qQ/AMjBzfJx0zeO6yS+wAPfQSoGNsZaUggHw8vsA==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -2043,9 +2046,6 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/diff-match-patch@1.0.36': - resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -2401,15 +2401,11 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ai@4.3.16: - resolution: {integrity: sha512-KUDwlThJ5tr2Vw0A1ZkbDKNME3wzWhuVfAOwIvFUzl1TPVDFAXDFTXio3p+jaKneB+dKNCvFFlolYmmgHttG1g==} + ai@5.0.14: + resolution: {integrity: sha512-xiujFa879skB7YxGzbeHAxepsr6AEaWcHPXrc5a9MRM6p4WdVAwn6mGwVZkBnhqGfZtXFr4LUnU2ayvcjWp5ig==} engines: {node: '>=18'} peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - react: - optional: true + zod: ^3.25.76 || ^4 ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2572,6 +2568,14 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c12@3.1.0: + resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2629,6 +2633,10 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -2644,6 +2652,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -2713,6 +2724,13 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} @@ -2892,6 +2910,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -2900,6 +2922,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -2915,6 +2940,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} @@ -2925,9 +2953,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2970,6 +2995,10 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2984,12 +3013,19 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + effect@3.16.12: + resolution: {integrity: sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -3208,6 +3244,10 @@ packages: resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} engines: {node: '>=18.0.0'} + eventsource-parser@3.0.3: + resolution: {integrity: sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==} + engines: {node: '>=20.0.0'} + eventsource@3.0.7: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} @@ -3233,9 +3273,16 @@ packages: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} engines: {node: '>= 18'} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} + fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} @@ -3424,6 +3471,10 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -3879,11 +3930,6 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true - jsondiffpatch@0.6.0: - resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -4425,6 +4471,9 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-fetch@2.6.6: resolution: {integrity: sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==} engines: {node: 4.x || >=6.0.0} @@ -4457,6 +4506,11 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + nypm@0.6.1: + resolution: {integrity: sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + oauth4webapi@3.5.2: resolution: {integrity: sha512-VYz5BaP3izIrUc1GAVzIoz4JnljiW0YAUFObMBwsqDnfHxz2sjLu3W7/8vE8Ms9IbMewN9+1kcvhY3tMscAeGQ==} @@ -4499,6 +4553,9 @@ packages: resolution: {integrity: sha512-+bwYsAIRmYv30NTmBysPIlgH23ekVDriB07oRxlPIAH5PI0yTMSxg5i5Xy0OetcnZw+nk/caD4szD7a9YZ3QyQ==} engines: {node: '>= 20'} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + ollama@0.5.16: resolution: {integrity: sha512-OEbxxOIUZtdZgOaTPAULo051F5y+Z1vosxEYOoABPnQKeW7i4O8tJNlxCB+xioyoorVqgjkdj+TA1f1Hy2ug/w==} @@ -4617,6 +4674,12 @@ packages: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + pg-cloudflare@1.2.7: resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} @@ -4674,6 +4737,9 @@ packages: resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} engines: {node: '>=16.20.0'} + pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} @@ -4821,8 +4887,8 @@ packages: pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - prisma@6.9.0: - resolution: {integrity: sha512-resJAwMyZREC/I40LF6FZ6rZTnlrlrYrb63oW37Gq+U+9xHwbyMSPJjKtM7VZf3gTO86t/Oyz+YeSXr3CmAY1Q==} + prisma@6.14.0: + resolution: {integrity: sha512-QEuCwxu+Uq9BffFw7in8In+WfbSUN0ewnaSUKloLkbJd42w6EyFckux4M0f7VwwHlM3A8ssaz4OyniCXlsn0WA==} engines: {node: '>=18.18'} hasBin: true peerDependencies: @@ -4863,6 +4929,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} @@ -4878,6 +4947,9 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4958,6 +5030,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} @@ -5080,9 +5156,6 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -5358,6 +5431,9 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -5672,9 +5748,6 @@ packages: peerDependencies: zod: ^3.24.1 - zod@3.25.56: - resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==} - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -5698,101 +5771,95 @@ packages: snapshots: - '@ai-sdk/anthropic@1.2.12(zod@3.25.56)': + '@ai-sdk/anthropic@2.0.4(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/fal@0.1.12(zod@3.25.56)': + '@ai-sdk/fal@1.0.6(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/fireworks@0.2.16(zod@3.25.56)': + '@ai-sdk/fireworks@1.0.7(zod@3.25.76)': dependencies: - '@ai-sdk/openai-compatible': 0.2.16(zod@3.25.56) - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/openai-compatible': 1.0.7(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/google@1.2.19(zod@3.25.56)': + '@ai-sdk/gateway@1.0.6(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/groq@1.2.9(zod@3.25.56)': + '@ai-sdk/google@2.0.6(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/luma@0.1.8(zod@3.25.56)': + '@ai-sdk/groq@2.0.9(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/openai-compatible@0.2.14(zod@3.25.56)': + '@ai-sdk/luma@1.0.3(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/openai-compatible@0.2.16(zod@3.25.56)': + '@ai-sdk/openai-compatible@1.0.7(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/openai@1.3.22(zod@3.25.56)': + '@ai-sdk/openai@2.0.14(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/perplexity@1.1.9(zod@3.25.56)': + '@ai-sdk/perplexity@2.0.3(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/provider-utils@2.2.8(zod@3.25.56)': + '@ai-sdk/provider-utils@3.0.3(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.11 - secure-json-parse: 2.7.0 - zod: 3.25.56 + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) - '@ai-sdk/provider@1.1.3': + '@ai-sdk/provider@2.0.0': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@1.2.12(react@19.1.0)(zod@3.25.56)': + '@ai-sdk/react@2.0.14(react@19.1.0)(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.56) + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + ai: 5.0.14(zod@3.25.76) react: 19.1.0 swr: 2.3.3(react@19.1.0) throttleit: 2.1.0 optionalDependencies: - zod: 3.25.56 - - '@ai-sdk/ui-utils@1.2.11(zod@3.25.56)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 - zod-to-json-schema: 3.24.5(zod@3.25.56) + zod: 3.25.76 - '@ai-sdk/xai@1.2.16(zod@3.25.56)': + '@ai-sdk/xai@2.0.7(zod@3.25.76)': dependencies: - '@ai-sdk/openai-compatible': 0.2.14(zod@3.25.56) - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - zod: 3.25.56 + '@ai-sdk/openai-compatible': 1.0.7(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) + zod: 3.25.76 '@alloc/quick-lru@5.2.0': {} @@ -5831,10 +5898,10 @@ snapshots: preact: 10.24.3 preact-render-to-string: 6.5.11(preact@10.24.3) - '@auth/prisma-adapter@2.9.1(@prisma/client@6.13.0(prisma@6.9.0(typescript@5.8.3))(typescript@5.8.3))': + '@auth/prisma-adapter@2.9.1(@prisma/client@6.13.0(prisma@6.14.0(typescript@5.8.3))(typescript@5.8.3))': dependencies: '@auth/core': 0.39.1 - '@prisma/client': 6.13.0(prisma@6.9.0(typescript@5.8.3))(typescript@5.8.3) + '@prisma/client': 6.13.0(prisma@6.14.0(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - '@simplewebauthn/browser' - '@simplewebauthn/server' @@ -6197,14 +6264,14 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@langchain/core@0.3.58(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.56))': + '@langchain/core@0.3.58(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.76))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.20 - langsmith: 0.3.50(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.56)) + langsmith: 0.3.50(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.76)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -6248,10 +6315,10 @@ snapshots: transitivePeerDependencies: - react - '@mistralai/mistralai@1.7.2(zod@3.25.56)': + '@mistralai/mistralai@1.7.2(zod@3.25.76)': dependencies: - zod: 3.25.56 - zod-to-json-schema: 3.24.6(zod@3.25.56) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) '@modelcontextprotocol/sdk@1.12.2': dependencies: @@ -6264,8 +6331,8 @@ snapshots: express-rate-limit: 7.5.0(express@5.1.0) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.25.56 - zod-to-json-schema: 3.24.5(zod@3.25.56) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -6481,46 +6548,49 @@ snapshots: '@octokit/request-error': 7.0.0 '@octokit/webhooks-methods': 6.0.0 - '@openrouter/ai-sdk-provider@0.7.2(ai@4.3.16(react@19.1.0)(zod@3.25.56))(zod@3.25.56)': + '@openrouter/ai-sdk-provider@1.1.2(ai@5.0.14(zod@3.25.76))(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - ai: 4.3.16(react@19.1.0)(zod@3.25.56) - zod: 3.25.56 + ai: 5.0.14(zod@3.25.76) + zod: 3.25.76 '@opentelemetry/api@1.9.0': {} '@panva/hkdf@1.2.1': {} - '@prisma/client@6.13.0(prisma@6.9.0(typescript@5.8.3))(typescript@5.8.3)': + '@prisma/client@6.13.0(prisma@6.14.0(typescript@5.8.3))(typescript@5.8.3)': optionalDependencies: - prisma: 6.9.0(typescript@5.8.3) + prisma: 6.14.0(typescript@5.8.3) typescript: 5.8.3 - '@prisma/config@6.9.0': + '@prisma/config@6.14.0': dependencies: - jiti: 2.4.2 + c12: 3.1.0 + deepmerge-ts: 7.1.5 + effect: 3.16.12 + empathic: 2.0.0 + transitivePeerDependencies: + - magicast - '@prisma/debug@6.9.0': {} + '@prisma/debug@6.14.0': {} - '@prisma/engines-version@6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e': {} + '@prisma/engines-version@6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49': {} - '@prisma/engines@6.9.0': + '@prisma/engines@6.14.0': dependencies: - '@prisma/debug': 6.9.0 - '@prisma/engines-version': 6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e - '@prisma/fetch-engine': 6.9.0 - '@prisma/get-platform': 6.9.0 + '@prisma/debug': 6.14.0 + '@prisma/engines-version': 6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49 + '@prisma/fetch-engine': 6.14.0 + '@prisma/get-platform': 6.14.0 - '@prisma/fetch-engine@6.9.0': + '@prisma/fetch-engine@6.14.0': dependencies: - '@prisma/debug': 6.9.0 - '@prisma/engines-version': 6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e - '@prisma/get-platform': 6.9.0 + '@prisma/debug': 6.14.0 + '@prisma/engines-version': 6.14.0-25.717184b7b35ea05dfa71a3236b7af656013e1e49 + '@prisma/get-platform': 6.14.0 - '@prisma/get-platform@6.9.0': + '@prisma/get-platform@6.14.0': dependencies: - '@prisma/debug': 6.9.0 + '@prisma/debug': 6.14.0 '@qdrant/js-client-rest@1.13.0(typescript@5.8.3)': dependencies: @@ -7114,6 +7184,8 @@ snapshots: '@spotify/web-api-ts-sdk@1.2.0': {} + '@standard-schema/spec@1.0.0': {} + '@standard-schema/utils@0.3.0': {} '@supabase/auth-js@2.70.0': @@ -7164,17 +7236,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@t3-oss/env-core@0.12.0(typescript@5.8.3)(zod@3.25.56)': + '@t3-oss/env-core@0.12.0(typescript@5.8.3)(zod@3.25.76)': optionalDependencies: typescript: 5.8.3 - zod: 3.25.56 + zod: 3.25.76 - '@t3-oss/env-nextjs@0.12.0(typescript@5.8.3)(zod@3.25.56)': + '@t3-oss/env-nextjs@0.12.0(typescript@5.8.3)(zod@3.25.76)': dependencies: - '@t3-oss/env-core': 0.12.0(typescript@5.8.3)(zod@3.25.56) + '@t3-oss/env-core': 0.12.0(typescript@5.8.3)(zod@3.25.76) optionalDependencies: typescript: 5.8.3 - zod: 3.25.56 + zod: 3.25.76 '@tailwindcss/node@4.1.8': dependencies: @@ -7336,8 +7408,6 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/diff-match-patch@1.0.36': {} - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -7378,7 +7448,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: '@types/node': 20.19.0 - form-data: 4.0.3 + form-data: 4.0.4 '@types/node-fetch@2.6.13': dependencies: @@ -7677,17 +7747,13 @@ snapshots: indent-string: 4.0.0 optional: true - ai@4.3.16(react@19.1.0)(zod@3.25.56): + ai@5.0.14(zod@3.25.76): dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.56) - '@ai-sdk/react': 1.2.12(react@19.1.0)(zod@3.25.56) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.56) + '@ai-sdk/gateway': 1.0.6(zod@3.25.76) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.3(zod@3.25.76) '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - zod: 3.25.56 - optionalDependencies: - react: 19.1.0 + zod: 3.25.76 ajv@6.12.6: dependencies: @@ -7812,7 +7878,7 @@ snapshots: axios@1.7.7: dependencies: follow-redirects: 1.15.9 - form-data: 4.0.3 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -7890,6 +7956,21 @@ snapshots: bytes@3.1.2: {} + c12@3.1.0: + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 16.6.1 + exsolve: 1.0.7 + giget: 2.0.0 + jiti: 2.4.2 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.2.0 + rc9: 2.1.2 + cac@6.7.14: {} cacache@15.3.0: @@ -7958,6 +8039,10 @@ snapshots: charenc@0.0.2: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@1.1.4: {} chownr@2.0.0: {} @@ -7966,6 +8051,10 @@ snapshots: ci-info@3.9.0: {} + citty@0.1.6: + dependencies: + consola: 3.4.2 + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -8040,6 +8129,10 @@ snapshots: concat-map@0.0.1: {} + confbox@0.2.2: {} + + consola@3.4.2: {} + console-control-strings@1.1.0: optional: true @@ -8202,6 +8295,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge-ts@7.1.5: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -8214,6 +8309,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.4: {} + delayed-stream@1.0.0: {} delegates@1.0.0: @@ -8223,6 +8320,8 @@ snapshots: dequal@2.0.3: {} + destr@2.0.5: {} + detect-libc@2.0.4: {} detect-node-es@1.1.0: {} @@ -8231,8 +8330,6 @@ snapshots: dependencies: dequal: 2.0.3 - diff-match-patch@1.0.5: {} - diff-sequences@29.6.3: {} digest-fetch@1.3.0: @@ -8280,6 +8377,8 @@ snapshots: dotenv@16.4.7: {} + dotenv@16.6.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -8301,11 +8400,18 @@ snapshots: ee-first@1.1.1: {} + effect@3.16.12: + dependencies: + '@standard-schema/spec': 1.0.0 + fast-check: 3.23.2 + emoji-regex@8.0.0: optional: true emoji-regex@9.2.2: {} + empathic@2.0.0: {} + encodeurl@2.0.0: {} encoding@0.1.13: @@ -8674,7 +8780,7 @@ snapshots: dependencies: axios: 1.7.7 axios-auth-refresh: 3.3.6(axios@1.7.7) - form-data: 4.0.3 + form-data: 4.0.4 tslib: 2.8.1 transitivePeerDependencies: - debug @@ -8685,15 +8791,17 @@ snapshots: eventsource-parser@3.0.2: {} + eventsource-parser@3.0.3: {} + eventsource@3.0.7: dependencies: eventsource-parser: 3.0.2 - exa-js@1.8.8(encoding@0.1.13)(ws@8.18.3)(zod@3.25.56): + exa-js@1.8.8(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76): dependencies: cross-fetch: 4.1.0(encoding@0.1.13) dotenv: 16.4.7 - openai: 5.3.0(ws@8.18.3)(zod@3.25.56) + openai: 5.3.0(ws@8.18.3)(zod@3.25.76) transitivePeerDependencies: - encoding - ws @@ -8745,8 +8853,14 @@ snapshots: transitivePeerDependencies: - supports-color + exsolve@1.0.7: {} + extend@3.0.2: {} + fast-check@3.23.2: + dependencies: + pure-rand: 6.1.0 + fast-content-type-parse@3.0.0: {} fast-deep-equal@3.1.3: {} @@ -8970,6 +9084,15 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.7 + nypm: 0.6.1 + pathe: 2.0.3 + github-from-package@0.0.0: {} glob-parent@5.1.2: @@ -9542,12 +9665,6 @@ snapshots: dependencies: minimist: 1.2.8 - jsondiffpatch@0.6.0: - dependencies: - '@types/diff-match-patch': 1.0.36 - chalk: 5.4.1 - diff-match-patch: 1.0.5 - jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -9574,7 +9691,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - langsmith@0.3.50(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.56)): + langsmith@0.3.50(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.76)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -9585,7 +9702,7 @@ snapshots: uuid: 10.0.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - openai: 5.3.0(ws@8.18.3)(zod@3.25.56) + openai: 5.3.0(ws@8.18.3)(zod@3.25.76) language-subtag-registry@0.3.23: {} @@ -9894,13 +10011,13 @@ snapshots: media-typer@1.1.0: {} - mem0ai@2.1.30(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@cloudflare/workers-types@4.20250614.0)(@google/genai@1.5.1(@modelcontextprotocol/sdk@1.12.2)(encoding@0.1.13))(@langchain/core@0.3.58(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.56)))(@mistralai/mistralai@1.7.2(zod@3.25.56))(@qdrant/js-client-rest@1.13.0(typescript@5.8.3))(@supabase/supabase-js@2.50.0)(@types/jest@29.5.14)(@types/pg@8.11.0)(@types/sqlite3@3.1.11)(cloudflare@4.3.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.1)(ollama@0.5.16)(pg@8.11.3)(redis@5.5.6)(sqlite3@5.1.7)(ws@8.18.3): + mem0ai@2.1.30(@anthropic-ai/sdk@0.40.1(encoding@0.1.13))(@cloudflare/workers-types@4.20250614.0)(@google/genai@1.5.1(@modelcontextprotocol/sdk@1.12.2)(encoding@0.1.13))(@langchain/core@0.3.58(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.76)))(@mistralai/mistralai@1.7.2(zod@3.25.76))(@qdrant/js-client-rest@1.13.0(typescript@5.8.3))(@supabase/supabase-js@2.50.0)(@types/jest@29.5.14)(@types/pg@8.11.0)(@types/sqlite3@3.1.11)(cloudflare@4.3.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@0.3.0(encoding@0.1.13))(neo4j-driver@5.28.1)(ollama@0.5.16)(pg@8.11.3)(redis@5.5.6)(sqlite3@5.1.7)(ws@8.18.3): dependencies: '@anthropic-ai/sdk': 0.40.1(encoding@0.1.13) '@cloudflare/workers-types': 4.20250614.0 '@google/genai': 1.5.1(@modelcontextprotocol/sdk@1.12.2)(encoding@0.1.13) - '@langchain/core': 0.3.58(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.56)) - '@mistralai/mistralai': 1.7.2(zod@3.25.56) + '@langchain/core': 0.3.58(@opentelemetry/api@1.9.0)(openai@5.3.0(ws@8.18.3)(zod@3.25.76)) + '@mistralai/mistralai': 1.7.2(zod@3.25.76) '@qdrant/js-client-rest': 1.13.0(typescript@5.8.3) '@supabase/supabase-js': 2.50.0 '@types/jest': 29.5.14 @@ -9911,12 +10028,12 @@ snapshots: groq-sdk: 0.3.0(encoding@0.1.13) neo4j-driver: 5.28.1 ollama: 0.5.16 - openai: 4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.56) + openai: 4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76) pg: 8.11.3 redis: 5.5.6 sqlite3: 5.1.7 uuid: 9.0.1 - zod: 3.25.56 + zod: 3.25.76 transitivePeerDependencies: - debug - encoding @@ -10298,6 +10415,8 @@ snapshots: node-domexception@1.0.0: {} + node-fetch-native@1.6.7: {} + node-fetch@2.6.6: dependencies: whatwg-url: 5.0.0 @@ -10344,6 +10463,14 @@ snapshots: set-blocking: 2.0.0 optional: true + nypm@0.6.1: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.2.0 + tinyexec: 1.0.1 + oauth4webapi@3.5.2: {} object-assign@4.1.1: {} @@ -10404,6 +10531,8 @@ snapshots: '@octokit/types': 14.1.0 '@octokit/webhooks': 14.0.2 + ohash@2.0.11: {} + ollama@0.5.16: dependencies: whatwg-fetch: 3.6.20 @@ -10424,7 +10553,7 @@ snapshots: regex: 6.0.1 regex-recursion: 6.0.2 - openai@4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.56): + openai@4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76): dependencies: '@types/node': 18.19.111 '@types/node-fetch': 2.6.12 @@ -10435,14 +10564,14 @@ snapshots: node-fetch: 2.7.0(encoding@0.1.13) optionalDependencies: ws: 8.18.3 - zod: 3.25.56 + zod: 3.25.76 transitivePeerDependencies: - encoding - openai@5.3.0(ws@8.18.3)(zod@3.25.56): + openai@5.3.0(ws@8.18.3)(zod@3.25.76): optionalDependencies: ws: 8.18.3 - zod: 3.25.56 + zod: 3.25.76 openapi-fetch@0.9.8: dependencies: @@ -10527,6 +10656,10 @@ snapshots: path-to-regexp@8.2.0: {} + pathe@2.0.3: {} + + perfect-debounce@1.0.0: {} + pg-cloudflare@1.2.7: optional: true @@ -10584,6 +10717,12 @@ snapshots: pkce-challenge@5.0.0: {} + pkg-types@2.2.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + platform@1.3.6: {} possible-typed-array-names@1.1.0: {} @@ -10668,12 +10807,14 @@ snapshots: pretty-format@3.8.0: {} - prisma@6.9.0(typescript@5.8.3): + prisma@6.14.0(typescript@5.8.3): dependencies: - '@prisma/config': 6.9.0 - '@prisma/engines': 6.9.0 + '@prisma/config': 6.14.0 + '@prisma/engines': 6.14.0 optionalDependencies: typescript: 5.8.3 + transitivePeerDependencies: + - magicast promise-inflight@1.0.1: optional: true @@ -10706,6 +10847,8 @@ snapshots: punycode@2.3.1: {} + pure-rand@6.1.0: {} + qs@6.14.0: dependencies: side-channel: 1.1.0 @@ -10721,6 +10864,11 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -10813,6 +10961,8 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@4.1.2: {} + recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 @@ -11005,8 +11155,6 @@ snapshots: scheduler@0.26.0: {} - secure-json-parse@2.7.0: {} - semver@6.3.1: {} semver@7.7.2: {} @@ -11385,6 +11533,8 @@ snapshots: tiny-invariant@1.3.3: {} + tinyexec@1.0.1: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.5(picomatch@4.0.2) @@ -11749,20 +11899,14 @@ snapshots: yocto-queue@0.1.0: {} - zod-to-json-schema@3.24.5(zod@3.25.56): + zod-to-json-schema@3.24.5(zod@3.25.76): dependencies: - zod: 3.25.56 - - zod-to-json-schema@3.24.6(zod@3.25.56): - dependencies: - zod: 3.25.56 + zod: 3.25.76 zod-to-json-schema@3.24.6(zod@3.25.76): dependencies: zod: 3.25.76 - zod@3.25.56: {} - zod@3.25.76: {} zustand@4.5.7(@types/react@19.1.6)(react@19.1.0): diff --git a/setup/index.ts b/setup/index.ts index 747f5064..71349f71 100644 --- a/setup/index.ts +++ b/setup/index.ts @@ -40,7 +40,7 @@ async function main(): Promise { for (let i = 0; i < steps.length; i++) { const step = steps[i]!; logStep(`Step ${i + 1}/${steps.length}`, `${step.name}...`); - step.step(); + await step.step(); } } catch (error) { logError("Setup failed: " + (error as Error).message); diff --git a/setup/steps/1_environment.ts b/setup/steps/1_environment.ts index e4672260..6cefe199 100644 --- a/setup/steps/1_environment.ts +++ b/setup/steps/1_environment.ts @@ -43,7 +43,7 @@ export function createEnvFile() { stdio: ["pipe", "ignore", "ignore"], }); logSuccess("Generated AUTH_SECRET"); - } catch (e) { + } catch { logWarning( `Failed to generate AUTH_SECRET with '${getPackageRunner()} auth secret'. Please run it manually and add the value to .env.local.`, ); diff --git a/setup/steps/3_docker.ts b/setup/steps/3_docker.ts index aafd04cb..aa1f8a97 100644 --- a/setup/steps/3_docker.ts +++ b/setup/steps/3_docker.ts @@ -2,28 +2,18 @@ import { execSync } from "child_process"; import { existsSync } from "fs"; import { join } from "path"; -import { - logInfo, - logSuccess, - logError, - getProjectRoot, - checkDocker, - dockerDaemonRunning, -} from "../utils"; +import { logInfo, logSuccess, getProjectRoot, checkDocker, dockerDaemonRunning } from "../utils"; +import { STEP_FAILURE } from "../types"; // Start Docker Compose services export function startDockerServices(): void { try { + // Strict: do not allow skipping; environment must support required services. + // Check if Docker is available const dockerCommand = checkDocker(); if (!dockerCommand) { - logError( - "Docker or Podman is not installed. Please install Docker or Podman first.", - ); - logInfo( - "You can install Docker Desktop for free from https://www.docker.com/products/docker-desktop/", - ); - throw new Error("Docker not found"); + throw new STEP_FAILURE("Docker/Podman not found. Install Docker to continue."); } logInfo(`Using ${dockerCommand} as container runtime`); @@ -33,14 +23,12 @@ export function startDockerServices(): void { const dockerComposePath = join(projectRoot, "docker-compose.yml"); if (!existsSync(dockerComposePath)) { - logError("docker-compose.yml not found in project root"); - throw new Error("Docker Compose file not found"); + throw new STEP_FAILURE("docker-compose.yml not found. Ensure it exists and is valid."); } - if (!dockerDaemonRunning(dockerCommand)) { - throw new Error( - `${dockerCommand} daemon is not running. Please start ${dockerCommand} Desktop.`, - ); + const daemonRunning = dockerDaemonRunning(dockerCommand); + if (!daemonRunning) { + throw new STEP_FAILURE(`${dockerCommand} daemon is not running. Start it and rerun setup.`); } // Start Docker Compose services in detached mode @@ -52,10 +40,10 @@ export function startDockerServices(): void { logSuccess("Docker services started successfully"); } catch (error) { - logError("Failed to start Docker services"); - if (error instanceof Error) { - logError(error.message); + if (error instanceof STEP_FAILURE) { + throw error; // propagate strict failure } - throw error; + const message = error instanceof Error ? error.message : String(error); + throw new STEP_FAILURE(`Error starting Docker services: ${message}`); } } diff --git a/setup/steps/4_database.ts b/setup/steps/4_database.ts index 9c550318..a38e35f6 100644 --- a/setup/steps/4_database.ts +++ b/setup/steps/4_database.ts @@ -1,13 +1,45 @@ import { execSync } from "child_process"; +import { existsSync, readFileSync } from "fs"; +import { join } from "path"; -import { logSuccess, logError, getPackageManager } from "../utils"; +import { logSuccess, logInfo, getPackageManager, getProjectRoot } from "../utils"; +import { STEP_FAILURE } from "../types"; export function runMigrations(): void { try { + const envPath = join(getProjectRoot(), ".env.local"); + if (!existsSync(envPath)) { + throw new STEP_FAILURE(".env.local not found. Create it and define DATABASE_URL."); + } + + let dbUrl: string | undefined; + const envContents = readFileSync(envPath, "utf8"); + const dbUrlLine = envContents + .split(/\r?\n/) + .find((l) => /^\s*DATABASE_URL\s*=/.test(l) && !/^\s*#/.test(l)); + dbUrl = dbUrlLine?.split("=").slice(1).join("=").trim(); + + if (!dbUrl) { + throw new STEP_FAILURE("DATABASE_URL missing in .env.local"); + } + + const isLocal = /localhost|127\.0\.0\.1/.test(dbUrl); + const allowRemoteSkip = process.env.REMOTE_DB === "1"; + if (!isLocal && allowRemoteSkip) { + logInfo("REMOTE_DB=1 set and remote DATABASE_URL detected; skipping local migrations."); + return; // explicit remote skip path + } + if (!isLocal && !allowRemoteSkip) { + throw new STEP_FAILURE("Remote DATABASE_URL detected. Set REMOTE_DB=1 to explicitly allow skipping local migrations."); + } + execSync(`${getPackageManager()} db:generate`, { stdio: "ignore" }); logSuccess("Database migrations completed successfully"); } catch (error) { - logError("Failed to run database migrations"); - throw error; + if (error instanceof STEP_FAILURE) { + throw error; + } + const message = error instanceof Error ? error.message : String(error); + throw new STEP_FAILURE(`Database migration step failed: ${message}`); } } diff --git a/setup/types.ts b/setup/types.ts index fd99fdac..39880da2 100644 --- a/setup/types.ts +++ b/setup/types.ts @@ -30,3 +30,12 @@ export interface SetupStep { description: string; execute: () => Promise; } + +// Custom error type to indicate a hard failure for a setup step. +// Using a class (not just Error alias) so instanceof checks work reliably. +export class STEP_FAILURE extends Error { + constructor(message: string) { + super(message); + this.name = "STEP_FAILURE"; + } +} diff --git a/src/ai/image/generate.ts b/src/ai/image/generate.ts index e3f4345c..b9ee90ac 100644 --- a/src/ai/image/generate.ts +++ b/src/ai/image/generate.ts @@ -1,17 +1,39 @@ -import { experimental_generateImage as baseGenerateImage } from "ai"; +import { experimental_generateImage as sdkGenerateImage } from "ai"; +import type { ImageModel } from "ai"; +import { openai } from "@ai-sdk/openai"; +import { xai } from "@ai-sdk/xai"; +import { fal } from "@ai-sdk/fal"; +import { fireworks } from "@ai-sdk/fireworks"; +import { luma } from "@ai-sdk/luma"; -import { imageModelRegistry } from "./registry"; +/** + * Maps provider id to a function that returns a configured image model factory. + * We only support providers that are installed. Extend here to add more. + */ +type ImageModelFactory = (model: string) => ImageModel; // SDK returns model descriptor +const providerMap: Record = { + openai: (m: string) => openai.image(m), + xai: (m: string) => xai.image(m), + fal: (m: string) => fal.image(m), + fireworks: (m: string) => fireworks.image(m), + luma: (m: string) => luma.image(m), +}; -import type { ImageModelProvider } from "./types"; +/** + * Generates a single image using the Vercel AI SDK v5 experimental image API. + * Keeps a minimal return shape expected by the image toolkit server tool. + */ +export type GenerateImageResult = Awaited>; -export const generateImage = async ( - model: `${ImageModelProvider}:${string}`, - prompt: string, -) => { - const { image } = await baseGenerateImage({ - model: imageModelRegistry.imageModel(model), +export async function generateImage(model: string, prompt: string): Promise { + const [provider, providerModel] = model.split(":"); + if (!provider || !providerModel) { + throw new Error("Image model must be in ':' format"); + } + const factory = providerMap[provider]; + if (!factory) throw new Error(`Unsupported image provider: ${provider}`); + return sdkGenerateImage({ + model: factory(providerModel), prompt, }); - - return image; -}; +} diff --git a/src/ai/language/types.ts b/src/ai/language/types.ts index 05d952af..52baee8b 100644 --- a/src/ai/language/types.ts +++ b/src/ai/language/types.ts @@ -18,5 +18,5 @@ export type LanguageModel = { bestFor?: string[]; contextLength?: number; isNew?: boolean; - providerOptions?: ProviderMetadata; + providerOptions?: ProviderMetadata; // use SDK type directly (no alias masking) }; diff --git a/src/app/(general)/_components/chat/index.tsx b/src/app/(general)/_components/chat/index.tsx index e617820a..3b67fe35 100644 --- a/src/app/(general)/_components/chat/index.tsx +++ b/src/app/(general)/_components/chat/index.tsx @@ -2,7 +2,7 @@ import { db } from "@/server/db"; import { ChatProvider } from "@/app/(general)/_contexts/chat-context"; import type { Message, Workbench } from "@prisma/client"; import { ChatLayout } from "./layout"; -import type { Attachment, UIMessage } from "ai"; +import type { UIMessage } from "ai"; import { languageModels } from "@/ai/language"; import { ChatContent } from "./chat"; import { serverCookieUtils } from "@/lib/cookies/server"; @@ -76,8 +76,7 @@ export const Chat = async ({ // Note: content will soon be deprecated in @ai-sdk/react content: "", createdAt: message.createdAt, - experimental_attachments: - (message.attachments as unknown as Array) ?? [], + // attachments are represented via file parts in v5; no experimental_attachments annotations: message.modelId ? [ { diff --git a/src/app/(general)/_components/chat/input/index.tsx b/src/app/(general)/_components/chat/input/index.tsx index 29428372..c88926d1 100644 --- a/src/app/(general)/_components/chat/input/index.tsx +++ b/src/app/(general)/_components/chat/input/index.tsx @@ -28,8 +28,9 @@ import { cn } from "@/lib/utils"; import { ModelSelect } from "./model-select"; import { useChatContext } from "@/app/(general)/_contexts/chat-context"; -import type { Attachment } from "ai"; +type Attachment = { url: string; name?: string; contentType?: string }; import type { UseChatHelpers } from "@ai-sdk/react"; +import type { UIMessage } from "ai"; import { ToolsSelect } from "./tools"; import type { File as DbFile } from "@prisma/client"; import { LanguageModelCapability } from "@/ai/language/types"; @@ -175,9 +176,7 @@ const PureMultimodalInput: React.FC = ({ window.history.replaceState({}, "", `/${chatId}`); } - handleSubmit(undefined, { - experimental_attachments: attachments, - }); + handleSubmit(); setAttachments([]); setLocalStorageInput(""); @@ -189,7 +188,6 @@ const PureMultimodalInput: React.FC = ({ }, [ selectedChatModel, submitDisabledString, - attachments, handleSubmit, setAttachments, setLocalStorageInput, @@ -199,7 +197,7 @@ const PureMultimodalInput: React.FC = ({ ]); const uploadFile = useCallback( - async (file: File): Promise => { + async (file: File): Promise => { const formData = new FormData(); formData.append("file", file); @@ -508,7 +506,7 @@ function PureAttachmentsButton({ disabledString, }: { fileInputRef: React.MutableRefObject; - status: UseChatHelpers["status"]; + status: UseChatHelpers["status"]; disabledString: string; }) { const button = ( @@ -554,7 +552,7 @@ function PureStopButton({ setMessages, }: { stop: () => void; - setMessages: UseChatHelpers["setMessages"]; + setMessages: UseChatHelpers["setMessages"]; }) { return (