diff --git a/.claude/commands/checkpoint.md b/.claude/commands/checkpoint.md index baecb50..b6c06e8 100644 --- a/.claude/commands/checkpoint.md +++ b/.claude/commands/checkpoint.md @@ -1,2 +1,32 @@ -Please commit all changes and provide a suitable comment for the commit. -Run git init if git has not been instantiated for the project as yet. +Please create a comprehensive checkpoint commit with the following steps: + +1. **Initialize Git if needed**: Run `git init` if git has not been instantiated for the project yet. + +2. **Analyze all changes**: + - Run `git status` to see all tracked and untracked files + - Run `git diff` to see detailed changes in tracked files + - Run `git log -5 --oneline` to understand the commit message style of this repository + +3. **Stage everything**: + - Add ALL tracked changes (modified and deleted files) + - Add ALL untracked files (new files) + - Use `git add -A` or `git add .` to stage everything + +4. **Create a detailed commit message**: + - **First line**: Write a clear, concise summary (50-72 chars) describing the primary change + - Use imperative mood (e.g., "Add feature" not "Added feature") + - Examples: "feat: add user authentication", "fix: resolve database connection issue", "refactor: improve API route structure" + - **Body**: Provide a detailed description including: + - What changes were made (list of key modifications) + - Why these changes were made (purpose/motivation) + - Any important technical details or decisions + - Breaking changes or migration notes if applicable + - **Footer**: Include co-author attribution as shown in the Git Safety Protocol + +5. **Execute the commit**: Create the commit with the properly formatted message following this repository's conventions. + +IMPORTANT: +- Do NOT skip any files - include everything +- Make the commit message descriptive enough that someone reviewing the git log can understand what was accomplished +- Follow the project's existing commit message conventions (check git log first) +- Include the Claude Code co-author attribution in the commit message diff --git a/CLAUDE.md b/CLAUDE.md index 7e01793..d2360bc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,3 +1,225 @@ -- Always run the LINT and TYPESCHECK scripts after completing your changes. This is to check for any issues. -- NEVER start the dev server yourself. If you need something from the terminal, ask the user to provide it to you. -- Avoid using custom colors unless very specifically instructed to do so. Stick to standard tailwind and shadcn colors, styles and tokens. +# Agentic Coding Boilerplate - AI Assistant Guidelines + +## Project Overview + +This is a Next.js 15 boilerplate for building AI-powered applications with authentication, database, and modern UI components. + +### Tech Stack + +- **Framework**: Next.js 15 with App Router, React 19, TypeScript +- **AI Integration**: Vercel AI SDK 5 + OpenRouter (access to 100+ AI models) +- **Authentication**: BetterAuth with Google OAuth +- **Database**: PostgreSQL with Drizzle ORM +- **UI**: shadcn/ui components with Tailwind CSS 4 +- **Styling**: Tailwind CSS with dark mode support (next-themes) + +## AI Integration with OpenRouter + +### Key Points + +- This project uses **OpenRouter** as the AI provider, NOT direct OpenAI +- OpenRouter provides access to 100+ AI models through a single unified API +- Default model: `openai/gpt-5-mini` (configurable via `OPENROUTER_MODEL` env var) +- Users browse models at: https://openrouter.ai/models +- Users get API keys from: https://openrouter.ai/settings/keys + +### AI Implementation Files + +- `src/app/api/chat/route.ts` - Chat API endpoint using OpenRouter +- Package: `@openrouter/ai-sdk-provider` (not `@ai-sdk/openai`) +- Import: `import { openrouter } from "@openrouter/ai-sdk-provider"` + +## Project Structure + +``` +src/ +├── app/ # Next.js App Router +│ ├── api/ +│ │ ├── auth/[...all]/ # Better Auth catch-all route +│ │ ├── chat/route.ts # AI chat endpoint (OpenRouter) +│ │ └── diagnostics/ # System diagnostics +│ ├── chat/page.tsx # AI chat interface (protected) +│ ├── dashboard/page.tsx # User dashboard (protected) +│ ├── profile/page.tsx # User profile (protected) +│ ├── page.tsx # Home/landing page +│ └── layout.tsx # Root layout +├── components/ +│ ├── auth/ # Authentication components +│ │ ├── sign-in-button.tsx +│ │ ├── sign-out-button.tsx +│ │ └── user-profile.tsx +│ ├── ui/ # shadcn/ui components +│ │ ├── button.tsx +│ │ ├── card.tsx +│ │ ├── dialog.tsx +│ │ ├── dropdown-menu.tsx +│ │ ├── avatar.tsx +│ │ ├── badge.tsx +│ │ ├── separator.tsx +│ │ ├── mode-toggle.tsx # Dark/light mode toggle +│ │ └── github-stars.tsx +│ ├── site-header.tsx # Main navigation header +│ ├── site-footer.tsx # Footer component +│ ├── theme-provider.tsx # Dark mode provider +│ ├── setup-checklist.tsx # Setup guide component +│ └── starter-prompt-modal.tsx # Starter prompts modal +└── lib/ + ├── auth.ts # Better Auth server config + ├── auth-client.ts # Better Auth client hooks + ├── db.ts # Database connection + ├── schema.ts # Drizzle schema (users, sessions, etc.) + └── utils.ts # Utility functions (cn, etc.) +``` + +## Environment Variables + +Required environment variables (see `env.example`): + +```env +# Database +POSTGRES_URL=postgresql://user:password@localhost:5432/db_name + +# Better Auth +BETTER_AUTH_SECRET=32-char-random-string + +# Google OAuth +GOOGLE_CLIENT_ID=your-google-client-id +GOOGLE_CLIENT_SECRET=your-google-client-secret + +# AI via OpenRouter +OPENROUTER_API_KEY=sk-or-v1-your-key +OPENROUTER_MODEL=openai/gpt-5-mini # or any model from openrouter.ai/models + +# App +NEXT_PUBLIC_APP_URL=http://localhost:3000 +``` + +## Available Scripts + +```bash +npm run dev # Start dev server (DON'T run this yourself - ask user) +npm run build # Build for production (runs db:migrate first) +npm run start # Start production server +npm run lint # Run ESLint (ALWAYS run after changes) +npm run typecheck # TypeScript type checking (ALWAYS run after changes) +npm run db:generate # Generate database migrations +npm run db:migrate # Run database migrations +npm run db:push # Push schema changes to database +npm run db:studio # Open Drizzle Studio (database GUI) +npm run db:dev # Push schema for development +npm run db:reset # Reset database (drop all tables) +``` + +## Documentation Files + +The project includes technical documentation in `docs/`: + +- `docs/technical/ai/streaming.md` - AI streaming implementation guide +- `docs/technical/ai/structured-data.md` - Structured data extraction +- `docs/technical/react-markdown.md` - Markdown rendering guide +- `docs/technical/betterauth/polar.md` - Polar payment integration +- `docs/business/starter-prompt.md` - Business context for AI prompts + +## Guidelines for AI Assistants + +### CRITICAL RULES + +1. **ALWAYS run lint and typecheck** after completing changes: + + ```bash + npm run lint && npm run typecheck + ``` + +2. **NEVER start the dev server yourself** + + - If you need dev server output, ask the user to provide it + - Don't run `npm run dev` or `pnpm dev` + +3. **Use OpenRouter, NOT OpenAI directly** + + - Import from `@openrouter/ai-sdk-provider` + - Use `openrouter()` function, not `openai()` + - Model names follow OpenRouter format: `provider/model-name` + +4. **Styling Guidelines** + + - Stick to standard Tailwind CSS utility classes + - Use shadcn/ui color tokens (e.g., `bg-background`, `text-foreground`) + - Avoid custom colors unless explicitly requested + - Support dark mode with appropriate Tailwind classes + +5. **Authentication** + + - Server-side: Import from `@/lib/auth` (Better Auth instance) + - Client-side: Import hooks from `@/lib/auth-client` + - Protected routes should check session in Server Components + - Use existing auth components from `src/components/auth/` + +6. **Database Operations** + + - Use Drizzle ORM (imported from `@/lib/db`) + - Schema is defined in `@/lib/schema` + - Always run migrations after schema changes + - PostgreSQL is the database (not SQLite, MySQL, etc.) + +7. **Component Creation** + + - Use existing shadcn/ui components when possible + - Follow the established patterns in `src/components/ui/` + - Support both light and dark modes + - Use TypeScript with proper types + +8. **API Routes** + - Follow Next.js 15 App Router conventions + - Use Route Handlers (route.ts files) + - Return Response objects + - Handle errors appropriately + +### Best Practices + +- Read existing code patterns before creating new features +- Maintain consistency with established file structure +- Use the documentation files when implementing related features +- Test changes with lint and typecheck before considering complete +- When modifying AI functionality, refer to `docs/technical/ai/` guides + +### Common Tasks + +**Adding a new page:** + +1. Create in `src/app/[route]/page.tsx` +2. Use Server Components by default +3. Add to navigation if needed + +**Adding a new API route:** + +1. Create in `src/app/api/[route]/route.ts` +2. Export HTTP method handlers (GET, POST, etc.) +3. Use proper TypeScript types + +**Adding authentication to a page:** + +1. Import auth instance: `import { auth } from "@/lib/auth"` +2. Get session: `const session = await auth.api.getSession({ headers: await headers() })` +3. Check session and redirect if needed + +**Working with the database:** + +1. Update schema in `src/lib/schema.ts` +2. Generate migration: `npm run db:generate` +3. Apply migration: `npm run db:migrate` +4. Import `db` from `@/lib/db` to query + +**Modifying AI chat:** + +1. Backend: `src/app/api/chat/route.ts` +2. Frontend: `src/app/chat/page.tsx` +3. Reference streaming docs: `docs/technical/ai/streaming.md` +4. Remember to use OpenRouter, not direct OpenAI + +## Package Manager + +This project uses **pnpm** (see `pnpm-lock.yaml`). When running commands: + +- Use `pnpm` instead of `npm` when possible +- Scripts defined in package.json work with `pnpm run [script]` diff --git a/README.md b/README.md index 6804274..49815af 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A complete agentic coding boilerplate with authentication, PostgreSQL database, - **🔐 Authentication**: Better Auth with Google OAuth integration - **🗃️ Database**: Drizzle ORM with PostgreSQL -- **🤖 AI Integration**: Vercel AI SDK with OpenAI support +- **🤖 AI Integration**: Vercel AI SDK with OpenRouter (access to 100+ AI models) - **🎨 UI Components**: shadcn/ui with Tailwind CSS - **⚡ Modern Stack**: Next.js 15, React 19, TypeScript - **📱 Responsive**: Mobile-first design approach @@ -105,9 +105,11 @@ BETTER_AUTH_SECRET="your-random-32-character-secret-key-here" GOOGLE_CLIENT_ID="your-google-client-id" GOOGLE_CLIENT_SECRET="your-google-client-secret" -# AI Integration (Optional - for chat functionality) -OPENAI_API_KEY="sk-your-openai-api-key-here" -OPENAI_MODEL="gpt-5-mini" +# AI Integration via OpenRouter (Optional - for chat functionality) +# Get your API key from: https://openrouter.ai/settings/keys +# View available models at: https://openrouter.ai/models +OPENROUTER_API_KEY="sk-or-v1-your-openrouter-api-key-here" +OPENROUTER_MODEL="openai/gpt-5-mini" # App URL (for production deployments) NEXT_PUBLIC_APP_URL="http://localhost:3000" @@ -152,13 +154,14 @@ Your application will be available at [http://localhost:3000](http://localhost:3 - `https://yourdomain.com/api/auth/callback/google` (production) 6. Copy the **Client ID** and **Client Secret** to your `.env` file -### OpenAI API Key +### OpenRouter API Key -1. Go to OpenAI Platform -2. Navigate to **API Keys** in the sidebar -3. Click **Create new secret key** -4. Give it a name and copy the key -5. Add it to your `.env` file as `OPENAI_API_KEY` +1. Go to OpenRouter +2. Sign up or log in to your account +3. Navigate to **Settings** → **Keys** or visit Keys Settings +4. Click **Create Key** and give it a name +5. Copy the API key and add it to your `.env` file as `OPENROUTER_API_KEY` +6. Browse available models at OpenRouter Models ## 🗂️ Project Structure @@ -201,7 +204,7 @@ npm run db:reset # Reset database (drop all tables) - **Home (`/`)**: Landing page with setup instructions and features overview - **Dashboard (`/dashboard`)**: Protected user dashboard with profile information -- **Chat (`/chat`)**: AI-powered chat interface using OpenAI (requires authentication) +- **Chat (`/chat`)**: AI-powered chat interface using OpenRouter (requires authentication) ## 🚀 Deployment @@ -230,8 +233,8 @@ Ensure these are set in your production environment: - `BETTER_AUTH_SECRET` - Secure random 32+ character string - `GOOGLE_CLIENT_ID` - Google OAuth Client ID - `GOOGLE_CLIENT_SECRET` - Google OAuth Client Secret -- `OPENAI_API_KEY` - OpenAI API key (optional) -- `OPENAI_MODEL` - OpenAI model name (optional, defaults to gpt-5-mini) +- `OPENROUTER_API_KEY` - OpenRouter API key (optional, for AI chat functionality) +- `OPENROUTER_MODEL` - Model name from OpenRouter (optional, defaults to openai/gpt-5-mini) - `NEXT_PUBLIC_APP_URL` - Your production domain ## 🎥 Tutorial Video diff --git a/create-agentic-app/package.json b/create-agentic-app/package.json index 4317783..bf61362 100644 --- a/create-agentic-app/package.json +++ b/create-agentic-app/package.json @@ -1,6 +1,6 @@ { "name": "create-agentic-app", - "version": "1.0.0", + "version": "1.0.1", "description": "Scaffold a new agentic AI application with Next.js, Better Auth, and AI SDK", "type": "module", "bin": { diff --git a/create-agentic-app/template/CLAUDE.md b/create-agentic-app/template/CLAUDE.md index 7e01793..d2360bc 100644 --- a/create-agentic-app/template/CLAUDE.md +++ b/create-agentic-app/template/CLAUDE.md @@ -1,3 +1,225 @@ -- Always run the LINT and TYPESCHECK scripts after completing your changes. This is to check for any issues. -- NEVER start the dev server yourself. If you need something from the terminal, ask the user to provide it to you. -- Avoid using custom colors unless very specifically instructed to do so. Stick to standard tailwind and shadcn colors, styles and tokens. +# Agentic Coding Boilerplate - AI Assistant Guidelines + +## Project Overview + +This is a Next.js 15 boilerplate for building AI-powered applications with authentication, database, and modern UI components. + +### Tech Stack + +- **Framework**: Next.js 15 with App Router, React 19, TypeScript +- **AI Integration**: Vercel AI SDK 5 + OpenRouter (access to 100+ AI models) +- **Authentication**: BetterAuth with Google OAuth +- **Database**: PostgreSQL with Drizzle ORM +- **UI**: shadcn/ui components with Tailwind CSS 4 +- **Styling**: Tailwind CSS with dark mode support (next-themes) + +## AI Integration with OpenRouter + +### Key Points + +- This project uses **OpenRouter** as the AI provider, NOT direct OpenAI +- OpenRouter provides access to 100+ AI models through a single unified API +- Default model: `openai/gpt-5-mini` (configurable via `OPENROUTER_MODEL` env var) +- Users browse models at: https://openrouter.ai/models +- Users get API keys from: https://openrouter.ai/settings/keys + +### AI Implementation Files + +- `src/app/api/chat/route.ts` - Chat API endpoint using OpenRouter +- Package: `@openrouter/ai-sdk-provider` (not `@ai-sdk/openai`) +- Import: `import { openrouter } from "@openrouter/ai-sdk-provider"` + +## Project Structure + +``` +src/ +├── app/ # Next.js App Router +│ ├── api/ +│ │ ├── auth/[...all]/ # Better Auth catch-all route +│ │ ├── chat/route.ts # AI chat endpoint (OpenRouter) +│ │ └── diagnostics/ # System diagnostics +│ ├── chat/page.tsx # AI chat interface (protected) +│ ├── dashboard/page.tsx # User dashboard (protected) +│ ├── profile/page.tsx # User profile (protected) +│ ├── page.tsx # Home/landing page +│ └── layout.tsx # Root layout +├── components/ +│ ├── auth/ # Authentication components +│ │ ├── sign-in-button.tsx +│ │ ├── sign-out-button.tsx +│ │ └── user-profile.tsx +│ ├── ui/ # shadcn/ui components +│ │ ├── button.tsx +│ │ ├── card.tsx +│ │ ├── dialog.tsx +│ │ ├── dropdown-menu.tsx +│ │ ├── avatar.tsx +│ │ ├── badge.tsx +│ │ ├── separator.tsx +│ │ ├── mode-toggle.tsx # Dark/light mode toggle +│ │ └── github-stars.tsx +│ ├── site-header.tsx # Main navigation header +│ ├── site-footer.tsx # Footer component +│ ├── theme-provider.tsx # Dark mode provider +│ ├── setup-checklist.tsx # Setup guide component +│ └── starter-prompt-modal.tsx # Starter prompts modal +└── lib/ + ├── auth.ts # Better Auth server config + ├── auth-client.ts # Better Auth client hooks + ├── db.ts # Database connection + ├── schema.ts # Drizzle schema (users, sessions, etc.) + └── utils.ts # Utility functions (cn, etc.) +``` + +## Environment Variables + +Required environment variables (see `env.example`): + +```env +# Database +POSTGRES_URL=postgresql://user:password@localhost:5432/db_name + +# Better Auth +BETTER_AUTH_SECRET=32-char-random-string + +# Google OAuth +GOOGLE_CLIENT_ID=your-google-client-id +GOOGLE_CLIENT_SECRET=your-google-client-secret + +# AI via OpenRouter +OPENROUTER_API_KEY=sk-or-v1-your-key +OPENROUTER_MODEL=openai/gpt-5-mini # or any model from openrouter.ai/models + +# App +NEXT_PUBLIC_APP_URL=http://localhost:3000 +``` + +## Available Scripts + +```bash +npm run dev # Start dev server (DON'T run this yourself - ask user) +npm run build # Build for production (runs db:migrate first) +npm run start # Start production server +npm run lint # Run ESLint (ALWAYS run after changes) +npm run typecheck # TypeScript type checking (ALWAYS run after changes) +npm run db:generate # Generate database migrations +npm run db:migrate # Run database migrations +npm run db:push # Push schema changes to database +npm run db:studio # Open Drizzle Studio (database GUI) +npm run db:dev # Push schema for development +npm run db:reset # Reset database (drop all tables) +``` + +## Documentation Files + +The project includes technical documentation in `docs/`: + +- `docs/technical/ai/streaming.md` - AI streaming implementation guide +- `docs/technical/ai/structured-data.md` - Structured data extraction +- `docs/technical/react-markdown.md` - Markdown rendering guide +- `docs/technical/betterauth/polar.md` - Polar payment integration +- `docs/business/starter-prompt.md` - Business context for AI prompts + +## Guidelines for AI Assistants + +### CRITICAL RULES + +1. **ALWAYS run lint and typecheck** after completing changes: + + ```bash + npm run lint && npm run typecheck + ``` + +2. **NEVER start the dev server yourself** + + - If you need dev server output, ask the user to provide it + - Don't run `npm run dev` or `pnpm dev` + +3. **Use OpenRouter, NOT OpenAI directly** + + - Import from `@openrouter/ai-sdk-provider` + - Use `openrouter()` function, not `openai()` + - Model names follow OpenRouter format: `provider/model-name` + +4. **Styling Guidelines** + + - Stick to standard Tailwind CSS utility classes + - Use shadcn/ui color tokens (e.g., `bg-background`, `text-foreground`) + - Avoid custom colors unless explicitly requested + - Support dark mode with appropriate Tailwind classes + +5. **Authentication** + + - Server-side: Import from `@/lib/auth` (Better Auth instance) + - Client-side: Import hooks from `@/lib/auth-client` + - Protected routes should check session in Server Components + - Use existing auth components from `src/components/auth/` + +6. **Database Operations** + + - Use Drizzle ORM (imported from `@/lib/db`) + - Schema is defined in `@/lib/schema` + - Always run migrations after schema changes + - PostgreSQL is the database (not SQLite, MySQL, etc.) + +7. **Component Creation** + + - Use existing shadcn/ui components when possible + - Follow the established patterns in `src/components/ui/` + - Support both light and dark modes + - Use TypeScript with proper types + +8. **API Routes** + - Follow Next.js 15 App Router conventions + - Use Route Handlers (route.ts files) + - Return Response objects + - Handle errors appropriately + +### Best Practices + +- Read existing code patterns before creating new features +- Maintain consistency with established file structure +- Use the documentation files when implementing related features +- Test changes with lint and typecheck before considering complete +- When modifying AI functionality, refer to `docs/technical/ai/` guides + +### Common Tasks + +**Adding a new page:** + +1. Create in `src/app/[route]/page.tsx` +2. Use Server Components by default +3. Add to navigation if needed + +**Adding a new API route:** + +1. Create in `src/app/api/[route]/route.ts` +2. Export HTTP method handlers (GET, POST, etc.) +3. Use proper TypeScript types + +**Adding authentication to a page:** + +1. Import auth instance: `import { auth } from "@/lib/auth"` +2. Get session: `const session = await auth.api.getSession({ headers: await headers() })` +3. Check session and redirect if needed + +**Working with the database:** + +1. Update schema in `src/lib/schema.ts` +2. Generate migration: `npm run db:generate` +3. Apply migration: `npm run db:migrate` +4. Import `db` from `@/lib/db` to query + +**Modifying AI chat:** + +1. Backend: `src/app/api/chat/route.ts` +2. Frontend: `src/app/chat/page.tsx` +3. Reference streaming docs: `docs/technical/ai/streaming.md` +4. Remember to use OpenRouter, not direct OpenAI + +## Package Manager + +This project uses **pnpm** (see `pnpm-lock.yaml`). When running commands: + +- Use `pnpm` instead of `npm` when possible +- Scripts defined in package.json work with `pnpm run [script]` diff --git a/create-agentic-app/template/README.md b/create-agentic-app/template/README.md index 6804274..49815af 100644 --- a/create-agentic-app/template/README.md +++ b/create-agentic-app/template/README.md @@ -6,7 +6,7 @@ A complete agentic coding boilerplate with authentication, PostgreSQL database, - **🔐 Authentication**: Better Auth with Google OAuth integration - **🗃️ Database**: Drizzle ORM with PostgreSQL -- **🤖 AI Integration**: Vercel AI SDK with OpenAI support +- **🤖 AI Integration**: Vercel AI SDK with OpenRouter (access to 100+ AI models) - **🎨 UI Components**: shadcn/ui with Tailwind CSS - **⚡ Modern Stack**: Next.js 15, React 19, TypeScript - **📱 Responsive**: Mobile-first design approach @@ -105,9 +105,11 @@ BETTER_AUTH_SECRET="your-random-32-character-secret-key-here" GOOGLE_CLIENT_ID="your-google-client-id" GOOGLE_CLIENT_SECRET="your-google-client-secret" -# AI Integration (Optional - for chat functionality) -OPENAI_API_KEY="sk-your-openai-api-key-here" -OPENAI_MODEL="gpt-5-mini" +# AI Integration via OpenRouter (Optional - for chat functionality) +# Get your API key from: https://openrouter.ai/settings/keys +# View available models at: https://openrouter.ai/models +OPENROUTER_API_KEY="sk-or-v1-your-openrouter-api-key-here" +OPENROUTER_MODEL="openai/gpt-5-mini" # App URL (for production deployments) NEXT_PUBLIC_APP_URL="http://localhost:3000" @@ -152,13 +154,14 @@ Your application will be available at [http://localhost:3000](http://localhost:3 - `https://yourdomain.com/api/auth/callback/google` (production) 6. Copy the **Client ID** and **Client Secret** to your `.env` file -### OpenAI API Key +### OpenRouter API Key -1. Go to OpenAI Platform -2. Navigate to **API Keys** in the sidebar -3. Click **Create new secret key** -4. Give it a name and copy the key -5. Add it to your `.env` file as `OPENAI_API_KEY` +1. Go to OpenRouter +2. Sign up or log in to your account +3. Navigate to **Settings** → **Keys** or visit Keys Settings +4. Click **Create Key** and give it a name +5. Copy the API key and add it to your `.env` file as `OPENROUTER_API_KEY` +6. Browse available models at OpenRouter Models ## 🗂️ Project Structure @@ -201,7 +204,7 @@ npm run db:reset # Reset database (drop all tables) - **Home (`/`)**: Landing page with setup instructions and features overview - **Dashboard (`/dashboard`)**: Protected user dashboard with profile information -- **Chat (`/chat`)**: AI-powered chat interface using OpenAI (requires authentication) +- **Chat (`/chat`)**: AI-powered chat interface using OpenRouter (requires authentication) ## 🚀 Deployment @@ -230,8 +233,8 @@ Ensure these are set in your production environment: - `BETTER_AUTH_SECRET` - Secure random 32+ character string - `GOOGLE_CLIENT_ID` - Google OAuth Client ID - `GOOGLE_CLIENT_SECRET` - Google OAuth Client Secret -- `OPENAI_API_KEY` - OpenAI API key (optional) -- `OPENAI_MODEL` - OpenAI model name (optional, defaults to gpt-5-mini) +- `OPENROUTER_API_KEY` - OpenRouter API key (optional, for AI chat functionality) +- `OPENROUTER_MODEL` - Model name from OpenRouter (optional, defaults to openai/gpt-5-mini) - `NEXT_PUBLIC_APP_URL` - Your production domain ## 🎥 Tutorial Video diff --git a/create-agentic-app/template/env.example b/create-agentic-app/template/env.example index c71be99..1854928 100644 --- a/create-agentic-app/template/env.example +++ b/create-agentic-app/template/env.example @@ -10,9 +10,11 @@ BETTER_AUTH_SECRET=qtD4Ssa0t5jY7ewALgai97sKhAtn7Ysc GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= -# AI Integration (Optional - for chat functionality) -OPENAI_API_KEY= -OPENAI_MODEL="gpt-5-mini" +# AI Integration via OpenRouter (Optional - for chat functionality) +# Get your API key from: https://openrouter.ai/settings/keys +# View available models at: https://openrouter.ai/models +OPENROUTER_API_KEY= +OPENROUTER_MODEL="openai/gpt-5-mini" # Optional - for vector search only OPENAI_EMBEDDING_MODEL="text-embedding-3-large" diff --git a/create-agentic-app/template/package.json b/create-agentic-app/template/package.json index 142bbdc..453f4ca 100644 --- a/create-agentic-app/template/package.json +++ b/create-agentic-app/template/package.json @@ -1,6 +1,6 @@ { "name": "agentic-coding-starter-kit", - "version": "0.1.0", + "version": "0.1.1", "scripts": { "dev": "next dev --turbopack", "build": "pnpm run db:migrate && next build", @@ -15,14 +15,15 @@ "db:reset": "drizzle-kit drop && drizzle-kit push" }, "dependencies": { - "@ai-sdk/openai": "^2.0.53", - "@ai-sdk/react": "^2.0.78", + "@ai-sdk/openai": "^2.0.60", + "@ai-sdk/react": "^2.0.86", + "@openrouter/ai-sdk-provider": "^1.2.0", "@radix-ui/react-avatar": "^1.1.10", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-slot": "^1.2.3", - "ai": "^5.0.78", - "better-auth": "^1.3.29", + "ai": "^5.0.86", + "better-auth": "^1.3.34", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "drizzle-orm": "^0.44.7", @@ -40,12 +41,12 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@tailwindcss/postcss": "^4.1.16", - "@types/node": "^20.19.23", - "@types/pg": "^8.15.5", + "@types/node": "^20.19.24", + "@types/pg": "^8.15.6", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "drizzle-kit": "^0.31.5", - "eslint": "^9.38.0", + "drizzle-kit": "^0.31.6", + "eslint": "^9.39.0", "eslint-config-next": "15.4.6", "shadcn": "^3.5.0", "tailwindcss": "^4.1.16", diff --git a/create-agentic-app/template/src/app/api/chat/route.ts b/create-agentic-app/template/src/app/api/chat/route.ts index 68ee73f..794e714 100644 --- a/create-agentic-app/template/src/app/api/chat/route.ts +++ b/create-agentic-app/template/src/app/api/chat/route.ts @@ -1,11 +1,11 @@ -import { openai } from "@ai-sdk/openai"; +import { openrouter } from "@openrouter/ai-sdk-provider"; import { streamText, UIMessage, convertToModelMessages } from "ai"; export async function POST(req: Request) { const { messages }: { messages: UIMessage[] } = await req.json(); const result = streamText({ - model: openai(process.env.OPENAI_MODEL || "gpt-5-mini"), + model: openrouter(process.env.OPENROUTER_MODEL || "openai/gpt-5-mini"), messages: convertToModelMessages(messages), }); diff --git a/env.example b/env.example index c71be99..1854928 100644 --- a/env.example +++ b/env.example @@ -10,9 +10,11 @@ BETTER_AUTH_SECRET=qtD4Ssa0t5jY7ewALgai97sKhAtn7Ysc GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= -# AI Integration (Optional - for chat functionality) -OPENAI_API_KEY= -OPENAI_MODEL="gpt-5-mini" +# AI Integration via OpenRouter (Optional - for chat functionality) +# Get your API key from: https://openrouter.ai/settings/keys +# View available models at: https://openrouter.ai/models +OPENROUTER_API_KEY= +OPENROUTER_MODEL="openai/gpt-5-mini" # Optional - for vector search only OPENAI_EMBEDDING_MODEL="text-embedding-3-large" diff --git a/package.json b/package.json index 856f37b..ffa2a7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "agentic-coding-starter-kit", - "version": "0.1.0", + "version": "0.1.1", "private": true, "scripts": { "dev": "next dev --turbopack", @@ -17,14 +17,15 @@ "sync-template": "node create-agentic-app/scripts/sync-templates.js" }, "dependencies": { - "@ai-sdk/openai": "^2.0.53", - "@ai-sdk/react": "^2.0.78", + "@ai-sdk/openai": "^2.0.60", + "@ai-sdk/react": "^2.0.86", + "@openrouter/ai-sdk-provider": "^1.2.0", "@radix-ui/react-avatar": "^1.1.10", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-slot": "^1.2.3", - "ai": "^5.0.78", - "better-auth": "^1.3.29", + "ai": "^5.0.86", + "better-auth": "^1.3.34", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "drizzle-orm": "^0.44.7", @@ -42,12 +43,12 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.1", "@tailwindcss/postcss": "^4.1.16", - "@types/node": "^20.19.23", - "@types/pg": "^8.15.5", + "@types/node": "^20.19.24", + "@types/pg": "^8.15.6", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "drizzle-kit": "^0.31.5", - "eslint": "^9.38.0", + "drizzle-kit": "^0.31.6", + "eslint": "^9.39.0", "eslint-config-next": "15.4.6", "shadcn": "^3.5.0", "tailwindcss": "^4.1.16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99b8958..7c0b097 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,14 @@ importers: .: dependencies: '@ai-sdk/openai': - specifier: ^2.0.53 - version: 2.0.53(zod@4.1.12) + specifier: ^2.0.60 + version: 2.0.60(zod@4.1.12) '@ai-sdk/react': - specifier: ^2.0.78 - version: 2.0.78(react@19.1.0)(zod@4.1.12) + specifier: ^2.0.86 + version: 2.0.86(react@19.1.0)(zod@4.1.12) + '@openrouter/ai-sdk-provider': + specifier: ^1.2.0 + version: 1.2.0(ai@5.0.86(zod@4.1.12))(zod@4.1.12) '@radix-ui/react-avatar': specifier: ^1.1.10 version: 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -27,11 +30,11 @@ importers: specifier: ^1.2.3 version: 1.2.3(@types/react@19.2.2)(react@19.1.0) ai: - specifier: ^5.0.78 - version: 5.0.78(zod@4.1.12) + specifier: ^5.0.86 + version: 5.0.86(zod@4.1.12) better-auth: - specifier: ^1.3.29 - version: 1.3.29(next@15.4.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^1.3.34 + version: 1.3.34(next@15.4.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -40,7 +43,7 @@ importers: version: 2.1.1 drizzle-orm: specifier: ^0.44.7 - version: 0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(pg@8.16.3)(postgres@3.4.7) + version: 0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.8)(pg@8.16.3)(postgres@3.4.7) lucide-react: specifier: ^0.539.0 version: 0.539.0(react@19.1.0) @@ -79,11 +82,11 @@ importers: specifier: ^4.1.16 version: 4.1.16 '@types/node': - specifier: ^20.19.23 - version: 20.19.23 + specifier: ^20.19.24 + version: 20.19.24 '@types/pg': - specifier: ^8.15.5 - version: 8.15.5 + specifier: ^8.15.6 + version: 8.15.6 '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -91,17 +94,17 @@ importers: specifier: ^19.2.2 version: 19.2.2(@types/react@19.2.2) drizzle-kit: - specifier: ^0.31.5 - version: 0.31.5 + specifier: ^0.31.6 + version: 0.31.6 eslint: - specifier: ^9.38.0 - version: 9.38.0(jiti@2.6.1) + specifier: ^9.39.0 + version: 9.39.0(jiti@2.6.1) eslint-config-next: specifier: 15.4.6 - version: 15.4.6(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 15.4.6(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) shadcn: specifier: ^3.5.0 - version: 3.5.0(@types/node@20.19.23)(typescript@5.9.3) + version: 3.5.0(@types/node@20.19.24)(typescript@5.9.3) tailwindcss: specifier: ^4.1.16 version: 4.1.16 @@ -114,20 +117,20 @@ importers: packages: - '@ai-sdk/gateway@2.0.1': - resolution: {integrity: sha512-vPVIbnP35ZnayS937XLo85vynR85fpBQWHCdUweq7apzqFOTU2YkUd4V3msebEHbQ2Zro60ZShDDy9SMiyWTqA==} + '@ai-sdk/gateway@2.0.5': + resolution: {integrity: sha512-5TTDSl0USWY6YGnb4QmJGplFZhk+p9OT7hZevAaER6OGiZ17LB1GypsGYDpNo/MiVMklk8kX4gk6p1/R/EiJ8Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@2.0.53': - resolution: {integrity: sha512-GIkR3+Fyif516ftXv+YPSPstnAHhcZxNoR2s8uSHhQ1yBT7I7aQYTVwpjAuYoT3GR+TeP50q7onj2/nDRbT2FQ==} + '@ai-sdk/openai@2.0.60': + resolution: {integrity: sha512-h7Bg3nY4UYyBj2HDmsFzPxuBhK4ZGGkC2ssZGXOov+81DVSiRJXR4NFfsxbWW/7c6uMCP/YmZ8MiWtvsKMSCHg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.12': - resolution: {integrity: sha512-ZtbdvYxdMoria+2SlNarEk6Hlgyf+zzcznlD55EAl+7VZvJaSg2sqPvwArY7L6TfDEDJsnCq0fdhBSkYo0Xqdg==} + '@ai-sdk/provider-utils@3.0.15': + resolution: {integrity: sha512-kOc6Pxb7CsRlNt+sLZKL7/VGQUd7ccl3/tIK+Bqf5/QhHR0Qm3qRBMz1IwU1RmjJEZA73x+KB5cUckbDl2WF7Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -136,8 +139,8 @@ packages: resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/react@2.0.78': - resolution: {integrity: sha512-f5inDBHJyUEzbtNxc9HiTxbcGjtot0uuc//0/khGrl8IZlLxw+yTxO/T1Qq95Rw5QPwTx9/Aw7wIZei3qws9hA==} + '@ai-sdk/react@2.0.86': + resolution: {integrity: sha512-vqxbbMOKMpYFHZy0aYEO4jtDcKaFCHL/rEtTqAIDlH14GT0uusSjN99gkDHHG3EnbyJSQmk9gqtqbd1GDwlRRg==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -283,8 +286,8 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@better-auth/core@1.3.29': - resolution: {integrity: sha512-Ka2mg4qZACFaLY7DOGFXv1Ma8CkF17k0ClUd2U/ZJbbSoEPI5gnVguEmakJB6HFYswszeZh2295IFORtW9wf7A==} + '@better-auth/core@1.3.34': + resolution: {integrity: sha512-rt/Bgl0Xa8OQ2DUMKCZEJ8vL9kUw4NCJsBP9Sj9uRhbsK8NEMPiznUOFMkUY2FvrslvfKN7H/fivwyHz9c7HzQ==} peerDependencies: '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.18 @@ -293,8 +296,8 @@ packages: kysely: ^0.28.5 nanostores: ^1.0.1 - '@better-auth/telemetry@1.3.29': - resolution: {integrity: sha512-1BFh3YulYDrwWcUkfEWddcrcApACyI4wtrgq3NBd9y+tilBRjWTCWEPuRqJrfM3a5F1ZSqsvOYfFG1XZbkxlVw==} + '@better-auth/telemetry@1.3.34': + resolution: {integrity: sha512-aQZ3wN90YMqV49diWxAMe1k7s2qb55KCsedCZne5PlgCjU4s3YtnqyjC5FEpzw2KY8l8rvR7DMAsDl13NjObKA==} '@better-auth/utils@0.3.0': resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==} @@ -315,11 +318,11 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@emnapi/core@1.6.0': - resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + '@emnapi/core@1.7.0': + resolution: {integrity: sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==} - '@emnapi/runtime@1.6.0': - resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + '@emnapi/runtime@1.7.0': + resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -332,8 +335,8 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} deprecated: 'Merged into tsx: https://tsx.is' - '@esbuild/aix-ppc64@0.25.11': - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -344,8 +347,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.11': - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -356,8 +359,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -368,8 +371,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.11': - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -380,8 +383,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.11': - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -392,8 +395,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.11': - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -404,8 +407,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.11': - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -416,8 +419,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -428,8 +431,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -440,8 +443,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -452,8 +455,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.11': - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -464,8 +467,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -476,8 +479,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -488,8 +491,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.11': - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -500,8 +503,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -512,8 +515,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.11': - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -524,14 +527,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.11': - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -542,14 +545,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -560,14 +563,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': - resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -578,8 +581,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.11': - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -590,8 +593,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.11': - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -602,8 +605,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -614,8 +617,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.11': - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -634,28 +637,28 @@ packages: resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.4.1': - resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.16.0': - resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.38.0': - resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} + '@eslint/js@9.39.0': + resolution: {integrity: sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.4.0': - resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@1.7.3': @@ -990,6 +993,13 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@openrouter/ai-sdk-provider@1.2.0': + resolution: {integrity: sha512-stuIwq7Yb7DNmk3GuCtz+oS3nZOY4TXEV3V5KsknDGQN7Fpu3KRMQVWRc1J073xKdf0FC9EHOctSyzsACmp5Ag==} + engines: {node: '>=18'} + peerDependencies: + ai: ^5.0.0 + zod: ^3.24.1 || ^v4 + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} @@ -1334,8 +1344,8 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.14.0': - resolution: {integrity: sha512-WJFej426qe4RWOm9MMtP4V3CV4AucXolQty+GRgAWLgQXmpCuwzs7hEpxxhSc/znXUSxum9d/P/32MW0FlAAlA==} + '@rushstack/eslint-patch@1.14.1': + resolution: {integrity: sha512-jGTk8UD/RdjsNZW8qq10r0RBvxL8OWtoT+kImlzPDFilmozzM+9QmIJsmze9UiSBrFU45ZxhTYBypn9q9z/VfQ==} '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -1475,11 +1485,11 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.19.23': - resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} + '@types/node@20.19.24': + resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==} - '@types/pg@8.15.5': - resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} + '@types/pg@8.15.6': + resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} '@types/react-dom@19.2.2': resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} @@ -1677,8 +1687,8 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@5.0.78: - resolution: {integrity: sha512-ec77fmQwJGLduswMrW4AAUGSOiu8dZaIwMmWHHGKsrMUFFS6ugfkTyx0srtuKYHNRRLRC2dT7cPirnUl98VnxA==} + ai@5.0.86: + resolution: {integrity: sha512-ooHwNTkLdedFf98iQhtSc5btc/P4UuXuOpYneoifq0190vqosLunNdW8Hs6CiE0Am7YOGNplDK56JIPlHZIL4w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1778,12 +1788,12 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.8.20: - resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==} + baseline-browser-mapping@2.8.23: + resolution: {integrity: sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==} hasBin: true - better-auth@1.3.29: - resolution: {integrity: sha512-1va1XZLTQme3DX33PgHqwwVyOJya5H0+ozT6BhOjTnwecC50I75F0OqqTwINq4XZ0+GuD3bl3I55RiFP49jStw==} + better-auth@1.3.34: + resolution: {integrity: sha512-LWA52SlvnUBJRbN8VLSTLILPomZY3zZAiLxVJCeSQ5uVmaIKkMBhERitkfJcXB9RJcfl4uP+3EqKkb6hX1/uiw==} peerDependencies: '@lynx-js/react': '*' '@sveltejs/kit': '*' @@ -1856,8 +1866,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001751: - resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} + caniuse-lite@1.0.30001753: + resolution: {integrity: sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1925,8 +1935,8 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@14.0.1: - resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} concat-map@0.0.1: @@ -2070,8 +2080,8 @@ packages: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} - drizzle-kit@0.31.5: - resolution: {integrity: sha512-+CHgPFzuoTQTt7cOYCV6MOw2w8vqEn/ap1yv4bpZOWL03u7rlVRQhUY0WYT3rHsgVTXwYQDZaSUJSQrMBUKuWg==} + drizzle-kit@0.31.6: + resolution: {integrity: sha512-/B4e/4pwnx25QwD5xXgdpo1S+077a2VZdosXbItE/oNmUgQwZydGDz9qJYmnQl/b+5IX0rLfwRhrPnroGtrg8Q==} hasBin: true drizzle-orm@0.44.7: @@ -2177,8 +2187,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.240: - resolution: {integrity: sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==} + electron-to-chromium@1.5.244: + resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2246,8 +2256,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.11: - resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true @@ -2348,8 +2358,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.38.0: - resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} + eslint@9.39.0: + resolution: {integrity: sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2588,8 +2598,8 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql@16.11.0: - resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} has-bigints@1.1.0: @@ -2674,8 +2684,8 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-parser@0.2.6: + resolution: {integrity: sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==} internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} @@ -3163,8 +3173,8 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -3251,8 +3261,8 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-releases@2.0.26: - resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} @@ -3492,9 +3502,9 @@ packages: pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} - pvutils@1.1.3: - resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} - engines: {node: '>=6.0.0'} + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} @@ -3659,8 +3669,8 @@ packages: resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} engines: {node: '>= 18'} - set-cookie-parser@2.7.1: - resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -3821,11 +3831,11 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - style-to-js@1.1.18: - resolution: {integrity: sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==} + style-to-js@1.1.19: + resolution: {integrity: sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ==} - style-to-object@1.0.11: - resolution: {integrity: sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==} + style-to-object@1.0.12: + resolution: {integrity: sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw==} styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} @@ -4146,20 +4156,20 @@ packages: snapshots: - '@ai-sdk/gateway@2.0.1(zod@4.1.12)': + '@ai-sdk/gateway@2.0.5(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.15(zod@4.1.12) '@vercel/oidc': 3.0.3 zod: 4.1.12 - '@ai-sdk/openai@2.0.53(zod@4.1.12)': + '@ai-sdk/openai@2.0.60(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.15(zod@4.1.12) zod: 4.1.12 - '@ai-sdk/provider-utils@3.0.12(zod@4.1.12)': + '@ai-sdk/provider-utils@3.0.15(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.0.0 @@ -4170,10 +4180,10 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@2.0.78(react@19.1.0)(zod@4.1.12)': + '@ai-sdk/react@2.0.86(react@19.1.0)(zod@4.1.12)': dependencies: - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - ai: 5.0.78(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.15(zod@4.1.12) + ai: 5.0.86(zod@4.1.12) react: 19.1.0 swr: 2.3.6(react@19.1.0) throttleit: 2.1.0 @@ -4375,7 +4385,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@better-auth/core@1.3.29(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.18)(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1)': + '@better-auth/core@1.3.34(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.18)(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1)': dependencies: '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.18 @@ -4385,9 +4395,9 @@ snapshots: nanostores: 1.0.1 zod: 4.1.12 - '@better-auth/telemetry@1.3.29(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1)': + '@better-auth/telemetry@1.3.34(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1)': dependencies: - '@better-auth/core': 1.3.29(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.18)(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1) + '@better-auth/core': 1.3.34(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.18)(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.18 transitivePeerDependencies: @@ -4418,13 +4428,13 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@emnapi/core@1.6.0': + '@emnapi/core@1.7.0': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.6.0': + '@emnapi/runtime@1.7.0': dependencies: tslib: 2.8.1 optional: true @@ -4444,153 +4454,153 @@ snapshots: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.13.0 - '@esbuild/aix-ppc64@0.25.11': + '@esbuild/aix-ppc64@0.25.12': optional: true '@esbuild/android-arm64@0.18.20': optional: true - '@esbuild/android-arm64@0.25.11': + '@esbuild/android-arm64@0.25.12': optional: true '@esbuild/android-arm@0.18.20': optional: true - '@esbuild/android-arm@0.25.11': + '@esbuild/android-arm@0.25.12': optional: true '@esbuild/android-x64@0.18.20': optional: true - '@esbuild/android-x64@0.25.11': + '@esbuild/android-x64@0.25.12': optional: true '@esbuild/darwin-arm64@0.18.20': optional: true - '@esbuild/darwin-arm64@0.25.11': + '@esbuild/darwin-arm64@0.25.12': optional: true '@esbuild/darwin-x64@0.18.20': optional: true - '@esbuild/darwin-x64@0.25.11': + '@esbuild/darwin-x64@0.25.12': optional: true '@esbuild/freebsd-arm64@0.18.20': optional: true - '@esbuild/freebsd-arm64@0.25.11': + '@esbuild/freebsd-arm64@0.25.12': optional: true '@esbuild/freebsd-x64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.25.11': + '@esbuild/freebsd-x64@0.25.12': optional: true '@esbuild/linux-arm64@0.18.20': optional: true - '@esbuild/linux-arm64@0.25.11': + '@esbuild/linux-arm64@0.25.12': optional: true '@esbuild/linux-arm@0.18.20': optional: true - '@esbuild/linux-arm@0.25.11': + '@esbuild/linux-arm@0.25.12': optional: true '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/linux-ia32@0.25.11': + '@esbuild/linux-ia32@0.25.12': optional: true '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/linux-loong64@0.25.11': + '@esbuild/linux-loong64@0.25.12': optional: true '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-mips64el@0.25.11': + '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-ppc64@0.18.20': optional: true - '@esbuild/linux-ppc64@0.25.11': + '@esbuild/linux-ppc64@0.25.12': optional: true '@esbuild/linux-riscv64@0.18.20': optional: true - '@esbuild/linux-riscv64@0.25.11': + '@esbuild/linux-riscv64@0.25.12': optional: true '@esbuild/linux-s390x@0.18.20': optional: true - '@esbuild/linux-s390x@0.25.11': + '@esbuild/linux-s390x@0.25.12': optional: true '@esbuild/linux-x64@0.18.20': optional: true - '@esbuild/linux-x64@0.25.11': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.11': + '@esbuild/netbsd-arm64@0.25.12': optional: true '@esbuild/netbsd-x64@0.18.20': optional: true - '@esbuild/netbsd-x64@0.25.11': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.11': + '@esbuild/openbsd-arm64@0.25.12': optional: true '@esbuild/openbsd-x64@0.18.20': optional: true - '@esbuild/openbsd-x64@0.25.11': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.11': + '@esbuild/openharmony-arm64@0.25.12': optional: true '@esbuild/sunos-x64@0.18.20': optional: true - '@esbuild/sunos-x64@0.25.11': + '@esbuild/sunos-x64@0.25.12': optional: true '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.25.11': + '@esbuild/win32-arm64@0.25.12': optional: true '@esbuild/win32-ia32@0.18.20': optional: true - '@esbuild/win32-ia32@0.25.11': + '@esbuild/win32-ia32@0.25.12': optional: true '@esbuild/win32-x64@0.18.20': optional: true - '@esbuild/win32-x64@0.25.11': + '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.0(jiti@2.6.1))': dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -4603,11 +4613,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.1': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 - '@eslint/core@0.16.0': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 @@ -4625,13 +4635,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.38.0': {} + '@eslint/js@9.39.0': {} '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.4.0': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 levn: 0.4.1 '@floating-ui/core@1.7.3': @@ -4741,7 +4751,7 @@ snapshots: '@img/sharp-wasm32@0.34.4': dependencies: - '@emnapi/runtime': 1.6.0 + '@emnapi/runtime': 1.7.0 optional: true '@img/sharp-win32-arm64@0.34.4': @@ -4755,31 +4765,31 @@ snapshots: '@inquirer/ansi@1.0.1': {} - '@inquirer/confirm@5.1.19(@types/node@20.19.23)': + '@inquirer/confirm@5.1.19(@types/node@20.19.24)': dependencies: - '@inquirer/core': 10.3.0(@types/node@20.19.23) - '@inquirer/type': 3.0.9(@types/node@20.19.23) + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.24 - '@inquirer/core@10.3.0(@types/node@20.19.23)': + '@inquirer/core@10.3.0(@types/node@20.19.24)': dependencies: '@inquirer/ansi': 1.0.1 '@inquirer/figures': 1.0.14 - '@inquirer/type': 3.0.9(@types/node@20.19.23) + '@inquirer/type': 3.0.9(@types/node@20.19.24) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.24 '@inquirer/figures@1.0.14': {} - '@inquirer/type@3.0.9(@types/node@20.19.23)': + '@inquirer/type@3.0.9(@types/node@20.19.24)': optionalDependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.24 '@isaacs/balanced-match@4.0.1': {} @@ -4836,8 +4846,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.6.0 - '@emnapi/runtime': 1.6.0 + '@emnapi/core': 1.7.0 + '@emnapi/runtime': 1.7.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -4906,6 +4916,11 @@ snapshots: '@open-draft/until@2.1.0': {} + '@openrouter/ai-sdk-provider@1.2.0(ai@5.0.86(zod@4.1.12))(zod@4.1.12)': + dependencies: + ai: 5.0.86(zod@4.1.12) + zod: 4.1.12 + '@opentelemetry/api@1.9.0': {} '@peculiar/asn1-android@2.5.0': @@ -5288,7 +5303,7 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.14.0': {} + '@rushstack/eslint-patch@1.14.1': {} '@sec-ant/readable-stream@0.4.1': {} @@ -5385,7 +5400,7 @@ snapshots: '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 - minimatch: 10.0.3 + minimatch: 10.1.1 path-browserify: 1.0.1 '@tybys/wasm-util@0.10.1': @@ -5417,13 +5432,13 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@20.19.23': + '@types/node@20.19.24': dependencies: undici-types: 6.21.0 - '@types/pg@8.15.5': + '@types/pg@8.15.6': dependencies: - '@types/node': 20.19.23 + '@types/node': 20.19.24 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -5441,15 +5456,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.2 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -5458,14 +5473,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.2 debug: 4.4.3 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5488,13 +5503,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -5518,13 +5533,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5610,11 +5625,11 @@ snapshots: agent-base@7.1.4: {} - ai@5.0.78(zod@4.1.12): + ai@5.0.86(zod@4.1.12): dependencies: - '@ai-sdk/gateway': 2.0.1(zod@4.1.12) + '@ai-sdk/gateway': 2.0.5(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.15(zod@4.1.12) '@opentelemetry/api': 1.9.0 zod: 4.1.12 @@ -5713,7 +5728,7 @@ snapshots: asn1js@3.0.6: dependencies: pvtsutils: 1.3.6 - pvutils: 1.1.3 + pvutils: 1.1.5 tslib: 2.8.1 ast-types-flow@0.0.8: {} @@ -5736,12 +5751,12 @@ snapshots: balanced-match@1.0.2: {} - baseline-browser-mapping@2.8.20: {} + baseline-browser-mapping@2.8.23: {} - better-auth@1.3.29(next@15.4.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + better-auth@1.3.34(next@15.4.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - '@better-auth/core': 1.3.29(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.18)(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1) - '@better-auth/telemetry': 1.3.29(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1) + '@better-auth/core': 1.3.34(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.18)(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1) + '@better-auth/telemetry': 1.3.34(better-call@1.0.19)(jose@6.1.0)(kysely@0.28.8)(nanostores@1.0.1) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.18 '@noble/ciphers': 2.0.1 @@ -5764,7 +5779,7 @@ snapshots: '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.18 rou3: 0.5.1 - set-cookie-parser: 2.7.1 + set-cookie-parser: 2.7.2 uncrypto: 0.1.3 body-parser@2.2.0: @@ -5796,10 +5811,10 @@ snapshots: browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.20 - caniuse-lite: 1.0.30001751 - electron-to-chromium: 1.5.240 - node-releases: 2.0.26 + baseline-browser-mapping: 2.8.23 + caniuse-lite: 1.0.30001753 + electron-to-chromium: 1.5.244 + node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.27.0) buffer-from@1.1.2: {} @@ -5825,7 +5840,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001751: {} + caniuse-lite@1.0.30001753: {} ccount@2.0.1: {} @@ -5878,7 +5893,7 @@ snapshots: commander@11.1.0: {} - commander@14.0.1: {} + commander@14.0.2: {} concat-map@0.0.1: {} @@ -5992,19 +6007,19 @@ snapshots: dotenv@17.2.3: {} - drizzle-kit@0.31.5: + drizzle-kit@0.31.6: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.25.11 - esbuild-register: 3.6.0(esbuild@0.25.11) + esbuild: 0.25.12 + esbuild-register: 3.6.0(esbuild@0.25.12) transitivePeerDependencies: - supports-color - drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(kysely@0.28.8)(pg@8.16.3)(postgres@3.4.7): + drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.8)(pg@8.16.3)(postgres@3.4.7): optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/pg': 8.15.5 + '@types/pg': 8.15.6 kysely: 0.28.8 pg: 8.16.3 postgres: 3.4.7 @@ -6024,7 +6039,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.240: {} + electron-to-chromium@1.5.244: {} emoji-regex@10.6.0: {} @@ -6146,10 +6161,10 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-register@3.6.0(esbuild@0.25.11): + esbuild-register@3.6.0(esbuild@0.25.12): dependencies: debug: 4.4.3 - esbuild: 0.25.11 + esbuild: 0.25.12 transitivePeerDependencies: - supports-color @@ -6178,34 +6193,34 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - esbuild@0.25.11: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.11 - '@esbuild/android-arm': 0.25.11 - '@esbuild/android-arm64': 0.25.11 - '@esbuild/android-x64': 0.25.11 - '@esbuild/darwin-arm64': 0.25.11 - '@esbuild/darwin-x64': 0.25.11 - '@esbuild/freebsd-arm64': 0.25.11 - '@esbuild/freebsd-x64': 0.25.11 - '@esbuild/linux-arm': 0.25.11 - '@esbuild/linux-arm64': 0.25.11 - '@esbuild/linux-ia32': 0.25.11 - '@esbuild/linux-loong64': 0.25.11 - '@esbuild/linux-mips64el': 0.25.11 - '@esbuild/linux-ppc64': 0.25.11 - '@esbuild/linux-riscv64': 0.25.11 - '@esbuild/linux-s390x': 0.25.11 - '@esbuild/linux-x64': 0.25.11 - '@esbuild/netbsd-arm64': 0.25.11 - '@esbuild/netbsd-x64': 0.25.11 - '@esbuild/openbsd-arm64': 0.25.11 - '@esbuild/openbsd-x64': 0.25.11 - '@esbuild/openharmony-arm64': 0.25.11 - '@esbuild/sunos-x64': 0.25.11 - '@esbuild/win32-arm64': 0.25.11 - '@esbuild/win32-ia32': 0.25.11 - '@esbuild/win32-x64': 0.25.11 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 escalade@3.2.0: {} @@ -6213,19 +6228,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.4.6(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): + eslint-config-next@15.4.6(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 15.4.6 - '@rushstack/eslint-patch': 1.14.0 - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + '@rushstack/eslint-patch': 1.14.1 + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.38.0(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.38.0(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.38.0(jiti@2.6.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.38.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.0(jiti@2.6.1)) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -6241,33 +6256,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.0(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) get-tsconfig: 4.13.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.38.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -6276,9 +6291,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -6290,13 +6305,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.0(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -6306,7 +6321,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -6315,11 +6330,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.0(jiti@2.6.1)): dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.0(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -6327,7 +6342,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.0(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -6350,16 +6365,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.38.0(jiti@2.6.1): + eslint@9.39.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.1 - '@eslint/core': 0.16.0 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.38.0 - '@eslint/plugin-kit': 0.4.0 + '@eslint/js': 9.39.0 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -6659,7 +6674,7 @@ snapshots: graphemer@1.4.0: {} - graphql@16.11.0: {} + graphql@16.12.0: {} has-bigints@1.1.0: {} @@ -6697,7 +6712,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.18 + style-to-js: 1.1.19 unist-util-position: 5.0.0 vfile-message: 4.0.3 transitivePeerDependencies: @@ -6751,7 +6766,7 @@ snapshots: inherits@2.0.4: {} - inline-style-parser@0.2.4: {} + inline-style-parser@0.2.6: {} internal-slot@1.1.0: dependencies: @@ -7312,7 +7327,7 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.0.3: + minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -7328,14 +7343,14 @@ snapshots: ms@2.1.3: {} - msw@2.11.6(@types/node@20.19.23)(typescript@5.9.3): + msw@2.11.6(@types/node@20.19.24)(typescript@5.9.3): dependencies: - '@inquirer/confirm': 5.1.19(@types/node@20.19.23) + '@inquirer/confirm': 5.1.19(@types/node@20.19.24) '@mswjs/interceptors': 0.40.0 '@open-draft/deferred-promise': 2.2.0 '@types/statuses': 2.0.6 cookie: 1.0.2 - graphql: 16.11.0 + graphql: 16.12.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 @@ -7374,7 +7389,7 @@ snapshots: dependencies: '@next/env': 15.4.6 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001751 + caniuse-lite: 1.0.30001753 postcss: 8.4.31 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -7402,7 +7417,7 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-releases@2.0.26: {} + node-releases@2.0.27: {} npm-run-path@4.0.1: dependencies: @@ -7650,7 +7665,7 @@ snapshots: dependencies: tslib: 2.8.1 - pvutils@1.1.3: {} + pvutils@1.1.5: {} qs@6.14.0: dependencies: @@ -7865,7 +7880,7 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@2.7.1: {} + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: dependencies: @@ -7891,7 +7906,7 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@3.5.0(@types/node@20.19.23)(typescript@5.9.3): + shadcn@3.5.0(@types/node@20.19.24)(typescript@5.9.3): dependencies: '@antfu/ni': 25.0.0 '@babel/core': 7.28.5 @@ -7901,7 +7916,7 @@ snapshots: '@dotenvx/dotenvx': 1.51.0 '@modelcontextprotocol/sdk': 1.20.2 browserslist: 4.27.0 - commander: 14.0.1 + commander: 14.0.2 cosmiconfig: 9.0.0(typescript@5.9.3) dedent: 1.7.0 deepmerge: 4.3.1 @@ -7912,7 +7927,7 @@ snapshots: fuzzysort: 3.1.0 https-proxy-agent: 7.0.6 kleur: 4.1.5 - msw: 2.11.6(@types/node@20.19.23)(typescript@5.9.3) + msw: 2.11.6(@types/node@20.19.24)(typescript@5.9.3) node-fetch: 3.3.2 ora: 8.2.0 postcss: 8.5.6 @@ -8116,13 +8131,13 @@ snapshots: strip-json-comments@3.1.1: {} - style-to-js@1.1.18: + style-to-js@1.1.19: dependencies: - style-to-object: 1.0.11 + style-to-object: 1.0.12 - style-to-object@1.0.11: + style-to-object@1.0.12: dependencies: - inline-style-parser: 0.2.4 + inline-style-parser: 0.2.6 styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.1.0): dependencies: diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index 68ee73f..794e714 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -1,11 +1,11 @@ -import { openai } from "@ai-sdk/openai"; +import { openrouter } from "@openrouter/ai-sdk-provider"; import { streamText, UIMessage, convertToModelMessages } from "ai"; export async function POST(req: Request) { const { messages }: { messages: UIMessage[] } = await req.json(); const result = streamText({ - model: openai(process.env.OPENAI_MODEL || "gpt-5-mini"), + model: openrouter(process.env.OPENROUTER_MODEL || "openai/gpt-5-mini"), messages: convertToModelMessages(messages), });