diff --git a/.github/workflows/migrate-database.yml b/.github/workflows/migrate-database.yml
index 31d67505..4a3a78c1 100644
--- a/.github/workflows/migrate-database.yml
+++ b/.github/workflows/migrate-database.yml
@@ -16,6 +16,11 @@ on:
- 'db/migrations/**'
- 'drizzle.config.ts'
+permissions:
+ contents: read
+ pull-requests: write
+ issues: write
+
jobs:
# Dry-run: Verify migrations can be generated on PRs
dry-run:
@@ -49,6 +54,7 @@ jobs:
- name: Comment on PR
if: always()
+ continue-on-error: true
uses: actions/github-script@v7
with:
script: |
diff --git a/.gitignore b/.gitignore
index e40cc71f..95d7932a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,3 +56,4 @@ terraform/terraform.tfstate.backup
.cursor/mcp.json
.claude
+terraform/tfplan
diff --git a/AGENTS.md b/AGENTS.md
new file mode 120000
index 00000000..681311eb
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1 @@
+CLAUDE.md
\ No newline at end of file
diff --git a/CLAUDE.md b/CLAUDE.md
index 2ee0eb33..25bdda76 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,405 +1,49 @@
# CLAUDE.md
-This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+AI-powered interview practice platform with real-time voice-to-voice simulation (Hume AI), prosody analysis, serving B2C (job seekers) and B2B (recruiters).
-## Project Overview
+## Package Manager
-Interview Optimiser is an AI-powered interview practice platform serving both B2C (job seekers) and B2B (recruiters/HR professionals) markets. It provides real-time voice-to-voice AI interview simulations with advanced feedback and analysis.
+Bun exclusively. Never npm/yarn. Use `bun`, `bunx`, `bun run`.
-### Key Context
-
-- **B2C Market**: Job seekers practicing interviews with AI-powered voice simulation
-- **B2B Market**: Recruiters/HR professionals evaluating candidates
-- **Core Technology**: Real-time voice-to-voice AI using Hume AI SDK
-- **Differentiator**: Prosody analysis (tone, hesitation, enthusiasm) beyond just content
-
-## Development Commands
-
-### Essential Commands
+## Commands
```bash
-# Start development server with Doppler secrets
-bun run dev
-
-# Run tests
-bun run test
+bun run dev # Dev server (uses Doppler for secrets)
+bun run build # Production build
+bun run build:check # Typecheck + build
+bun run typecheck # TypeScript check
+bun run lint # Biome lint
+bun run lint:fix # Biome fix
+bun run check # Biome check + fix
+bun run test # Run tests
bun run test:watch # Watch mode
bun run test:coverage # With coverage
-
-# Type checking and linting
-bun run typecheck # Check TypeScript types
-bun run lint # Run Biome linter
-bun run lint:fix # Fix linting issues
-bun run check # Run Biome check and fix
-
-# Build and production
-bun run build # Production build
-bun run build:check # Type check + build
-```
-
-### Database Commands
-
-```bash
-# Database operations (uses Doppler for env vars)
bun run db:generate # Generate Drizzle migrations
-bun run db:migrate:dev # Run migrations (development)
-bun run db:studio # Open Drizzle Studio GUI
-```
-
-### Email Development
-
-```bash
-bun run email:dev # Start React Email development server
-bun run email:build # Build email templates
-```
-
-## Architecture Overview
-
-### Tech Stack
-
-- **Frontend**: Next.js 15+ (App Router), React 19, TailwindCSS, ShadCN/UI
-- **Backend**: PostgreSQL with Drizzle ORM, Next.js API Routes
-- **AI/Voice**: OpenAI SDK, Hume AI Voice React
-- **Authentication**: Clerk
-- **State Management**: Zustand
-- **Forms**: React Hook Form + Zod validation
-- **Data Fetching**: TanStack React Query
-- **Email**: ReactEmail + Resend
-- **Monitoring**: Sentry, PostHog
-- **Infrastructure**: AWS (S3, CloudFront, Lambda), Terraform
-- **Package Manager**: Bun
-
-### Project Structure
-
-```text
-src/
-├── app/ # Next.js 15 app router
-│ ├── (auth)/ # Authentication pages
-│ ├── (marketing)/ # Public marketing pages
-│ ├── api/ # API routes
-│ └── dashboard/ # Protected dashboard
-├── components/ # Reusable UI components
-├── lib/ # Core utilities and business logic
-│ ├── ai/ # AI integration (OpenAI, Hume)
-│ ├── auth/ # Authentication helpers
-│ └── db/ # Database utilities
-├── emails/ # React Email templates
-└── hooks/ # Custom React hooks
-
-db/ # Database schema and migrations
-functions/ # AWS Lambda functions
-docs/ # Project documentation
-```
-
-## Development Guidelines
-
-### General Rules
-
-1. **Always reference .cursorrules**: Start responses with (Cursorrules referenced...)
-2. **Use Bun**: All commands use `bun`, not `npm` or `yarn`
-3. **Documentation sync**: Update `/docs` after code changes to prevent drift
-4. **Minimize file creation**: Always prefer editing existing files
-5. **No unnecessary documentation**: Don't create README/docs unless explicitly requested
-
-### Code Style
-
-- **Variable naming**: Use auxiliary verbs (isLoading, hasError, canEdit)
-- **Exports**: Favor named exports for components
-- **Styling**: Use ShadCN/UI and Tailwind CSS only
-- **Responsive**: Mobile-first approach
-- **Special chars**: Use HTML entities (', ", &, <, >)
-
-### Key Patterns
-
-#### API Routes
-
-**CRITICAL: Dynamic params are async in Next.js 15!**
-
-```typescript
-// ❌ WRONG - Will cause build errors
-export async function POST(
- request: NextRequest,
- { params }: { params: { jobId: string } }
-) {
- // This pattern is deprecated in Next.js 15
-}
-
-// ✅ CORRECT - Always use this pattern
-export async function POST(
- request: NextRequest,
- props: { params: Promise<{ jobId: string }> }
-) {
- const params = await props.params;
- const { jobId } = params;
- // Now you can use jobId
-}
-```
-
-#### Standard API Pattern
-
-```typescript
-import { getUserFromClerkId } from "@/lib/auth";
-import { formatEntity, formatErrorEntity } from "@/lib/utils";
-
-export async function POST(request: NextRequest) {
- try {
- const user = await getUserFromClerkId();
- const body = await request.json();
- const validated = schema.parse(body);
-
- // Business logic here
-
- return NextResponse.json(formatEntity(data));
- } catch (error) {
- logger.error({ error }, "API error");
- return NextResponse.json(formatErrorEntity(error), { status: 500 });
- }
-}
-```
-
-#### Database Access
-
-- Use Drizzle ORM for all database operations
-- Schema defined in `db/schema/index.ts`
-- Snake_case naming convention for database fields
-- Always use transactions for multi-table operations
-- Index performance-critical queries
-- Handle cascade deletes properly
-
-#### Component Development
-
-- Server Components by default
-- Use 'use client' only when necessary
-- Prefer named exports
-- Mobile-first responsive design with Tailwind
-- Use ShadCN/UI components as base
-- Implement loading states with skeletons
-- Add proper TypeScript types
-
-#### Standard Component Pattern
-
-```tsx
-export function ComponentName({ prop1, prop2 }: ComponentProps) {
- const { data, isLoading } = useQuery({
- queryKey: ["resource", "id"],
- queryFn: fetchFunction,
- });
-
- if (isLoading) return ;
-
- return
{/* Component content */}
;
-}
-```
-
-#### Form Handling
-
-```tsx
-// Use React Hook Form with Zod validation
-const form = useForm({
- resolver: zodResolver(formSchema),
-});
-
-// Validate on server as well
-const validatedData = formSchema.parse(formData);
+bun run db:migrate:dev # Apply migrations
+bun run db:studio # Drizzle Studio GUI
+bun run email:dev # React Email dev server
```
-#### State Management
-
-- Use Zustand for global client state and complex forms
-- Server state via TanStack Query - DO NOT use useEffect for data fetching
-- Form state via React Hook Form
-- Query keys pattern: [resource, id, params]
-
-#### Data Fetching Patterns
-
-**Always use React Query for network requests:**
-
-```tsx
-// ✅ CORRECT
-const { data, isLoading } = useQuery({
- queryKey: ["jobs", jobId],
- queryFn: () => fetchJob(jobId),
- staleTime: 5 * 60 * 1000, // 5 minutes
-});
-
-// ❌ WRONG - Don't use useEffect
-useEffect(() => {
- fetch('/api/jobs').then(...);
-}, []);
-```
-
-## Testing Guidelines
-
-### Framework & Setup
-
-- **Test Runner**: Vitest with React Testing Library
-- **Command**: `bun run test` (not npm/yarn)
-- **Test files**: `*.test.ts`, `*.test.tsx`
-- **Environment**: jsdom for React components
-
-### Testing Restrictions
-
-**IMPORTANT: Do NOT create tests for:**
-
-- API route files (`route.ts`, `route.tsx`)
-- Page component files (`page.tsx`)
-
-**Rationale**: These are Next.js framework endpoints that should be tested through integration/E2E tests.
-
-**What TO test instead:**
-
-- Extract business logic into utility functions in `lib/`
-- Create separate components for complex UI logic
-- Test utilities and components independently
-
-### Test Patterns
-
-```typescript
-// Business logic testing
-const result = calculateInterviewScore(data);
-expect(result.score).toBe(85);
-
-// Async operations
-await expect(processInterview()).resolves.toBe(expected);
-await expect(failingOperation()).rejects.toThrow("Error");
-
-// Validation testing
-const errors = validateInterviewData(invalidData);
-expect(errors).toContain("Duration must be positive");
-```
-
-## Important Constraints
-
-- Use Doppler for environment variables
-- Never commit secrets or API keys
-- Always use encoded HTML entities in JSX (', ", etc.)
-- Follow existing code patterns and conventions
-- Update documentation when making changes
-- Run tests after changes: `bun run test`
-- Always run linting: `bun run lint:fix`
-- Type check before committing: `bun run typecheck`
-
-## Naming Conventions
-
-- **Files**: kebab-case (`interview-report.ts`, `job-details.tsx`)
-- **Components**: PascalCase (`InterviewContainer`, `DashboardStats`)
-- **Functions**: camelCase (`fetchInterviewData`, `calculateScore`)
-- **Database**: snake_case plural (`interview_reports`, `job_applications`)
-- **API Routes**: RESTful kebab-case (`/api/interview-reports`)
-- **IDs**: Hashids for public-facing IDs
-
-## Common Workflows
-
-### 1. Creating New API Endpoints
-
-1. Create route file in `app/api/` following REST conventions
-2. Define Zod schema for validation
-3. Implement handler with error handling pattern
-4. Use `formatEntity()` for responses
-5. Add structured logging with Pino
-
-### 2. Adding Database Tables
-
-1. Create schema in `db/schema/`
-2. Run: `bun run db:generate && bun run db:migrate:dev`
-3. Update `db/schema/index.ts` exports
-4. Create type-safe queries using Drizzle
-
-### 3. Building UI Components
-
-1. Use ShadCN/UI components as base
-2. Mobile-first responsive design
-3. Tailwind CSS only (no custom CSS)
-4. Loading states with skeletons
-5. Proper TypeScript types
-
-### 4. Multi-step Forms
-
-1. Create Zustand store for form state
-2. Implement step components
-3. Validate at each step with Zod
-4. Use server actions for file processing
-5. Show progress indicators
-
-## Voice Interview Flow
-
-1. User uploads CV and job description
-2. AI extracts and analyzes content
-3. Real-time voice interview via Hume AI
-4. Interview recorded and transcribed
-5. AI generates detailed performance report with prosody analysis
-6. Results stored and accessible via dashboard
-
-## Key Features
-
-### B2C Features (Job Seekers)
-
-- Real-time voice-to-voice AI interviews
-- Prosody analysis (tone, hesitation, enthusiasm)
-- Detailed performance reports
-- Interview history and progress tracking
-- Practice mode with various difficulty levels
-
-### B2B Features (Recruiters)
-
-- Organization/team management
-- Custom interview templates
-- Candidate tracking and comparison
-- Bulk interview management
-- Analytics and reporting dashboards
-- Integration with ATS systems
-
-## Database Schema (Key Entities)
-
-- `users`: User accounts with Clerk integration
-- `organizations`: Multi-tenant support
-- `jobs`: Job postings with descriptions
-- `interviews`: Voice conversation sessions
-- `reports`: AI-generated performance analysis
-- `customizations`: User preferences and settings
-- `questions`: Question banks and templates
-
-## Rate Limiting
-
-The application implements rate limiting to protect against DoS attacks and API abuse.
-
-### Configuration
-
-Rate limiting uses Vercel KV (Redis-compatible). Required environment variables:
-
-```bash
-KV_REST_API_URL=your_vercel_kv_url
-KV_REST_API_TOKEN=your_vercel_kv_token
-```
-
-### Rate Limits by Endpoint Type
-
-| Endpoint Type | Requests | Window | Examples |
-|--------------|----------|---------|----------|
-| Auth Webhooks | 10 | 15 min | `/api/webhooks/auth` |
-| Webhooks | 100 | 1 min | `/api/webhooks/stripe` |
-| API Routes | 60 | 1 min | `/api/jobs/*` |
-| Public API | 30 | 1 min | `/api/public/*` |
-| File Upload | 10 | 10 min | `/api/extract`, `/api/upload` |
-| Reports | 20 | 10 min | `/api/reports/*` |
-| AI Operations | 20 | 10 min | `/api/interviews/*` |
-
-### Implementation
-
-- Integrated in Next.js middleware (`src/middleware.ts`)
-- Uses sliding window algorithm
-- Returns 429 status when limit exceeded
-- Includes rate limit headers in responses
+## Key Rules
----
+- Use Doppler for env vars, never commit secrets
+- Use HTML entities in JSX: `'` `"` `&` `<` `>`
+- Next.js 15: dynamic route params are async -- always `await props.params`
+- Database fields use snake_case, TypeScript uses camelCase
+- Use transactions for multi-table DB operations
+- All API responses use `formatEntity()` / `formatErrorEntity()` helpers
+- Use React Query for data fetching, never useEffect
+- Public-facing IDs use Hashids encoding
+- Naming: files kebab-case, components PascalCase, functions camelCase, DB tables snake_case plural
-## 🚨 GIT COMMIT PROTOCOL - CRITICAL
+## Testing Rules
-### ABSOLUTE RULES FOR ALL COMMITS:
+- Do NOT test API route files (`route.ts`) or page files (`page.tsx`) directly
+- Extract business logic to `lib/` and test that instead
+- Vitest + React Testing Library
-1. **NO Claude Code attribution** - NEVER add footer
-2. **NO Co-Authored-By lines** - NEVER add co-author
-3. **ONLY user as author** - Clean commits only
-4. **Format**: `: \n\n[optional body]`
+## Git Commits
-**No footers, no attribution, no co-authors. Period.**
+NO Claude Code attribution. NO Co-Authored-By. ONLY user as author.
+Format: `type: description` with optional body. No footers.
diff --git a/bun.lock b/bun.lock
index 6222c528..45a1b411 100644
--- a/bun.lock
+++ b/bun.lock
@@ -1,10 +1,12 @@
{
"lockfileVersion": 1,
+ "configVersion": 0,
"workspaces": {
"": {
"name": "interviewoptimiser",
"dependencies": {
- "@ai-sdk/openai": "^1.2.6",
+ "@ai-sdk/openai": "^3.0.41",
+ "@ai-sdk/provider": "^3.0.8",
"@aws-sdk/client-lambda": "^3.682.0",
"@aws-sdk/client-s3": "^3.803.0",
"@aws-sdk/client-sqs": "^3.682.0",
@@ -14,8 +16,9 @@
"@discordjs/rest": "^2.4.0",
"@heroicons/react": "^2.2.0",
"@hookform/resolvers": "^5.0.1",
- "@humeai/voice-react": "^0.2.1",
+ "@humeai/voice-react": "^0.2.14",
"@mdxeditor/editor": "^3.15.0",
+ "@openrouter/ai-sdk-provider": "^2.2.3",
"@radix-ui/react-accordion": "^1.2.1",
"@radix-ui/react-alert-dialog": "^1.1.2",
"@radix-ui/react-avatar": "^1.1.9",
@@ -52,7 +55,7 @@
"@vercel/kv": "^3.0.0",
"@vercel/ncc": "^0.38.3",
"@vercel/speed-insights": "^1.0.14",
- "ai": "^4.1.63",
+ "ai": "^6.0.116",
"aws-lambda": "^1.0.7",
"case": "^1.6.3",
"cheerio": "^1.0.0",
@@ -77,12 +80,13 @@
"hume": "^0.12.1",
"immer": "^10.1.1",
"import-in-the-middle": "^1.11.2",
+ "inngest": "^3.52.6",
"isomorphic-dompurify": "^2.22.0",
"lodash": "^4.17.21",
"lottie-react": "^2.4.1",
"lucide-react": "^0.525.0",
"mammoth": "^1.8.0",
- "next": "15.0.2",
+ "next": "15.0.5",
"next-themes": "^0.4.6",
"nextjs-toploader": "^3.7.15",
"openai": "^4.71.0",
@@ -164,15 +168,13 @@
"packages": {
"@adobe/css-tools": ["@adobe/css-tools@4.4.4", "", {}, "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg=="],
- "@ai-sdk/openai": ["@ai-sdk/openai@1.3.24", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-GYXnGJTHRTZc4gJMSmFRgEQudjqd4PUN0ZjQhPwOAYH1yOAvQoG/Ikqs+HyISRbLPCrhbZnPKCNHuRU4OfpW0Q=="],
+ "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.66", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A=="],
- "@ai-sdk/provider": ["@ai-sdk/provider@1.1.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg=="],
+ "@ai-sdk/openai": ["@ai-sdk/openai@3.0.41", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-IZ42A+FO+vuEQCVNqlnAPYQnnUpUfdJIwn1BEDOBywiEHa23fw7PahxVtlX9zm3/zMvTW4JKPzWyvAgDu+SQ2A=="],
- "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.8", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA=="],
+ "@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="],
- "@ai-sdk/react": ["@ai-sdk/react@1.2.12", "", { "dependencies": { "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/ui-utils": "1.2.11", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["zod"] }, "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g=="],
-
- "@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.2.11", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w=="],
+ "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="],
"@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
@@ -472,6 +474,8 @@
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="],
+ "@bufbuild/protobuf": ["@bufbuild/protobuf@2.11.0", "", {}, "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ=="],
+
"@clerk/backend": ["@clerk/backend@2.12.1", "", { "dependencies": { "@clerk/shared": "^3.24.1", "@clerk/types": "^4.84.1", "cookie": "1.0.2", "standardwebhooks": "^1.0.0", "tslib": "2.8.1" } }, "sha512-itpMTMrPaitY8wU6gvmG5GMLecAmyvWnNZB3FHntIhyS/na+bHcdYRyNlCksvh7s39f3wXuS2lwoUCanXEs7yg=="],
"@clerk/clerk-react": ["@clerk/clerk-react@5.46.1", "", { "dependencies": { "@clerk/shared": "^3.24.1", "@clerk/types": "^4.84.1", "tslib": "2.8.1" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-0", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-0" } }, "sha512-vKtIU3SHfIfsPFcLlw+I+El3VxN/io2aekGzAP7cKoClRPB4bE8GKsLvLIA326ff7yTDnvyrdxfEFY4ieyq5zg=="],
@@ -656,6 +660,10 @@
"@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="],
+ "@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="],
+
+ "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="],
+
"@heroicons/react": ["@heroicons/react@2.2.0", "", { "peerDependencies": { "react": ">= 16 || ^19.0.0-rc" } }, "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ=="],
"@hookform/resolvers": ["@hookform/resolvers@5.2.1", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-u0+6X58gkjMcxur1wRWokA7XsiiBJ6aK17aPZxhkoYiK5J+HcTx0Vhu9ovXe6H+dVpO6cjrn2FkJTryXEMlryQ=="],
@@ -668,7 +676,7 @@
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
- "@humeai/voice-react": ["@humeai/voice-react@0.2.3", "", { "dependencies": { "date-fns": "^3.6.0", "hume": "0.13.3", "react": "^18.2.0", "react-dom": "^18.2.0", "type-fest": "^4.26.0", "zod": "^3.22.4" } }, "sha512-Fbi8KSST0ILl2m1wLgNK9jiVYw/BsuTdYb/2ugqw8FaKuB/ue+4k8cTVEEemkzngzZOzrnEY7TyriEk3XQf5aw=="],
+ "@humeai/voice-react": ["@humeai/voice-react@0.2.14", "", { "dependencies": { "date-fns": "^3.6.0", "hume": "0.15.13", "react": "^18.2.0", "react-dom": "^18.2.0", "type-fest": "^4.26.0", "zod": "^3.22.4" } }, "sha512-znIffv97PurkYbtsCP/gl/+jYvepfwLNHm5f3ZZ1JHXwSn8GWpF7AdKzFjh4ZlmHUa2kWm1MBRAobv44uN4GtQ=="],
"@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="],
@@ -708,6 +716,8 @@
"@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="],
+ "@inngest/ai": ["@inngest/ai@0.1.7", "", { "dependencies": { "@types/node": "^22.10.5", "typescript": "^5.7.3" } }, "sha512-5xWatW441jacGf9czKEZdgAmkvoy7GS2tp7X8GSbdGeRXzjisHR6vM+q8DQbv6rqRsmQoCQ5iShh34MguELvUQ=="],
+
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
"@jest/expect-utils": ["@jest/expect-utils@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3" } }, "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA=="],
@@ -716,6 +726,8 @@
"@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="],
+ "@jpwilliams/waitgroup": ["@jpwilliams/waitgroup@2.1.1", "", {}, "sha512-0CxRhNfkvFCTLZBKGvKxY2FYtYW1yWhO2McLqBL0X5UWvYjIf9suH8anKW/DNutl369A75Ewyoh2iJMwBZ2tRg=="],
+
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
@@ -728,6 +740,8 @@
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="],
+ "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="],
+
"@lexical/clipboard": ["@lexical/clipboard@0.33.1", "", { "dependencies": { "@lexical/html": "0.33.1", "@lexical/list": "0.33.1", "@lexical/selection": "0.33.1", "@lexical/utils": "0.33.1", "lexical": "0.33.1" } }, "sha512-Qd3/Cm3TW2DFQv58kMtLi86u5YOgpBdf+o7ySbXz55C613SLACsYQBB3X5Vu5hTx/t/ugYOpII4HkiatW6d9zA=="],
"@lexical/code": ["@lexical/code@0.33.1", "", { "dependencies": { "@lexical/utils": "0.33.1", "lexical": "0.33.1", "prismjs": "^1.30.0" } }, "sha512-E0Y/+1znkqVpP52Y6blXGAduoZek9SSehJN+vbH+4iQKyFwTA7JB+jd5C5/K0ik55du9X7SN/oTynByg7lbcAA=="],
@@ -814,27 +828,27 @@
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
- "@next/env": ["@next/env@15.0.2", "", {}, "sha512-c0Zr0ModK5OX7D4ZV8Jt/wqoXtitLNPwUfG9zElCZztdaZyNVnN40rDXVZ/+FGuR4CcNV5AEfM6N8f+Ener7Dg=="],
+ "@next/env": ["@next/env@15.0.5", "", {}, "sha512-rDeqk/QF6OxTSvQItPdtyR0O4QN5L2a794F4+i8/syHN92DqFXcLNhZgLtYhW3rrJ23vRR7B5wIamsgGM4I6UQ=="],
"@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.0.2", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-R9Jc7T6Ge0txjmqpPwqD8vx6onQjynO9JT73ArCYiYPvSrwYXepH/UY/WdKDY8JPWJl72sAE4iGMHPeQ5xdEWg=="],
- "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GK+8w88z+AFlmt+ondytZo2xpwlfAR8U6CRwXancHImh6EdGfHMIrTSCcx5sOSBei00GyLVL0ioo1JLKTfprgg=="],
+ "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.0.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BrNm/9BZoV6QEFKFZdgZRyYwhdhxV8GhW+U4D5cdkT4Wefj7YflAUZNx2FWyBPp7utBPCgJXnVbVLhlDoIfKFg=="],
- "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-KUpBVxIbjzFiUZhiLIpJiBoelqzQtVZbdNNsehhUn36e2YzKHphnK8eTUW1s/4aPy5kH/UTid8IuVbaOpedhpw=="],
+ "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.0.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-SkpRdqyJLhmU6Ip0dHrZ5mLMQgTU0MlTASRwqCj6NXQJ04eS4QzBgEUUOPX+tsUOQ+KSVMgX/iQaWgQHNMyyCQ=="],
- "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-9J7TPEcHNAZvwxXRzOtiUvwtTD+fmuY0l7RErf8Yyc7kMpE47MIQakl+3jecmkhOoIyi/Rp+ddq7j4wG6JDskQ=="],
+ "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.0.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-nk+6BAIkIHTeQg+U1uqGpZ8K1KSAbhq80EkSgpgPC6wBmRkEeBitn4yL9C0fUiEPeZ3zN4yrvI635GG/H2QmSQ=="],
- "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-BjH4ZSzJIoTTZRh6rG+a/Ry4SW0HlizcPorqNBixBWc3wtQtj4Sn9FnRZe22QqrPnzoaW0ctvSz4FaH4eGKMww=="],
+ "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.0.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-CozywhydLroNNz1AMKdKKVBuRc0UIBG7TlVgXXn51MdZo4sMbfApOlQFUyuAbKJbe67vd39Yib2lVVVDfLTtfw=="],
- "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-i3U2TcHgo26sIhcwX/Rshz6avM6nizrZPvrDVDY1bXcLH1ndjbO8zuC7RoHp0NSK7wjJMPYzm7NYL1ksSKFreA=="],
+ "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.0.5", "", { "os": "linux", "cpu": "x64" }, "sha512-VWfvl8toyC/5Rn1GgKfiASYgssCsxz4GtwK2cFKmmnyGfoKubFc6DfCI5MzBoe2Q2gzd2CeZDoT1BhuutSiL7A=="],
- "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-AMfZfSVOIR8fa+TXlAooByEF4OB00wqnms1sJ1v+iu8ivwvtPvnkwdzzFMpsK5jA2S9oNeeQ04egIWVb4QWmtQ=="],
+ "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.0.5", "", { "os": "linux", "cpu": "x64" }, "sha512-xCD/V4Z55eFtG2SNyXgG3ciIikcxNe4FgmgcW4xTaEcLY59ZJVLxx4PLve2vDgp7xqvwDD4vvUsJuFMuQ12oGg=="],
- "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-JkXysDT0/hEY47O+Hvs8PbZAeiCQVxKfGtr4GUpNAhlG2E0Mkjibuo8ryGD29Qb5a3IOnKYNoZlh/MyKd2Nbww=="],
+ "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.0.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-OmKXP/mUzY+AiDFk9PR3RoM6YfgzNYhtSbfvTUDk3PxoCLKnwTZ8xsFoWX2ph/RFC25QucTeAFepouGGsdBPAg=="],
"@next/swc-win32-ia32-msvc": ["@next/swc-win32-ia32-msvc@13.5.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-BLiPKJomaPrTAb7ykjA0LPcuuNMLDVK177Z1xe0nAem33+9FIayU4k/OWrtSn9SAJW/U60+1hoey5z+KCHdRLQ=="],
- "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-foaUL0NqJY/dX0Pi/UcZm5zsmSk5MtP/gxx3xOPyREkMFN+CTjctPfu3QaqrQHinaKdPnMWPJDKt4VjDfTBe/Q=="],
+ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.0.5", "", { "os": "win32", "cpu": "x64" }, "sha512-O34P9asvZtdNQ+4sEczSLruYvM7XEQKY/FCwRAeQQnrWW3tol3VEuv2GtnFb1YHsP3lZtagd11UYJqrs0Y0r2A=="],
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
@@ -854,14 +868,42 @@
"@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],
+ "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@2.2.3", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-NovC+BaCfEeJwhToDrs8JeDYXXlJdEyz7lcxkjtyePSE4eoAKik872SyDK0MzXKcz8MRkv7XlNhPI6zz4TQp0g=="],
+
"@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],
"@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.56.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Wr39+94UNNG3Ei9nv3pHd4AJ63gq5nSemMRpCd8fPwDL9rN3vK26lzxfH27mw16XzOSO+TpyQwBAMaLxaPWG0g=="],
- "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="],
+ "@opentelemetry/auto-instrumentations-node": ["@opentelemetry/auto-instrumentations-node@0.71.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/instrumentation-amqplib": "^0.60.0", "@opentelemetry/instrumentation-aws-lambda": "^0.65.0", "@opentelemetry/instrumentation-aws-sdk": "^0.68.0", "@opentelemetry/instrumentation-bunyan": "^0.58.0", "@opentelemetry/instrumentation-cassandra-driver": "^0.58.0", "@opentelemetry/instrumentation-connect": "^0.56.0", "@opentelemetry/instrumentation-cucumber": "^0.29.0", "@opentelemetry/instrumentation-dataloader": "^0.30.0", "@opentelemetry/instrumentation-dns": "^0.56.0", "@opentelemetry/instrumentation-express": "^0.61.0", "@opentelemetry/instrumentation-fastify": "^0.57.0", "@opentelemetry/instrumentation-fs": "^0.32.0", "@opentelemetry/instrumentation-generic-pool": "^0.56.0", "@opentelemetry/instrumentation-graphql": "^0.61.0", "@opentelemetry/instrumentation-grpc": "^0.213.0", "@opentelemetry/instrumentation-hapi": "^0.59.0", "@opentelemetry/instrumentation-http": "^0.213.0", "@opentelemetry/instrumentation-ioredis": "^0.61.0", "@opentelemetry/instrumentation-kafkajs": "^0.22.0", "@opentelemetry/instrumentation-knex": "^0.57.0", "@opentelemetry/instrumentation-koa": "^0.61.0", "@opentelemetry/instrumentation-lru-memoizer": "^0.57.0", "@opentelemetry/instrumentation-memcached": "^0.56.0", "@opentelemetry/instrumentation-mongodb": "^0.66.0", "@opentelemetry/instrumentation-mongoose": "^0.59.0", "@opentelemetry/instrumentation-mysql": "^0.59.0", "@opentelemetry/instrumentation-mysql2": "^0.59.0", "@opentelemetry/instrumentation-nestjs-core": "^0.59.0", "@opentelemetry/instrumentation-net": "^0.57.0", "@opentelemetry/instrumentation-openai": "^0.11.0", "@opentelemetry/instrumentation-oracledb": "^0.38.0", "@opentelemetry/instrumentation-pg": "^0.65.0", "@opentelemetry/instrumentation-pino": "^0.59.0", "@opentelemetry/instrumentation-redis": "^0.61.0", "@opentelemetry/instrumentation-restify": "^0.58.0", "@opentelemetry/instrumentation-router": "^0.57.0", "@opentelemetry/instrumentation-runtime-node": "^0.26.0", "@opentelemetry/instrumentation-socket.io": "^0.60.0", "@opentelemetry/instrumentation-tedious": "^0.32.0", "@opentelemetry/instrumentation-undici": "^0.23.0", "@opentelemetry/instrumentation-winston": "^0.57.0", "@opentelemetry/resource-detector-alibaba-cloud": "^0.33.3", "@opentelemetry/resource-detector-aws": "^2.13.0", "@opentelemetry/resource-detector-azure": "^0.21.0", "@opentelemetry/resource-detector-container": "^0.8.4", "@opentelemetry/resource-detector-gcp": "^0.48.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-node": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.4.1", "@opentelemetry/core": "^2.0.0" } }, "sha512-umqazfIujHj9fE+p3skrPMO9uCsDodSUqIgVRtELaPX036HhGkVaI7MwCQL3/kiyqrXRsKYSow2vCBR4CVsnOA=="],
+
+ "@opentelemetry/configuration": ["@opentelemetry/configuration@0.213.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "yaml": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0" } }, "sha512-MfVgZiUuwL1d3bPPvXcEkVHGTGNUGoqGK97lfwBuRoKttcVGGqDyxTCCVa5MGbirtBQkUTysXMBUVWPaq7zbWw=="],
+
+ "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.6.0", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q=="],
"@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="],
+ "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.213.0", "", { "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-grpc-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/sdk-logs": "0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-QiRZzvayEOFnenSXi85Eorgy5WTqyNQ+E7gjl6P6r+W3IUIwAIH8A9/BgMWfP056LwmdrBL6+qvnwaIEmug6Yg=="],
+
+ "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/sdk-logs": "0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-vqDVSpLp09ZzcFIdb7QZrEFPxUlO3GzdhBKLstq3jhYB5ow3+ZtV5V0ngSdi/0BZs+J5WPiN1+UDV4X5zD/GzA=="],
+
+ "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-logs": "0.213.0", "@opentelemetry/sdk-trace-base": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-gQk41nqfK3KhDk8jbSo3LR/fQBlV7f6Q5xRcfDmL1hZlbgXQPdVFV9/rIfYUrCoq1OM+2NnKnFfGjBt6QpLSsA=="],
+
+ "@opentelemetry/exporter-metrics-otlp-grpc": ["@opentelemetry/exporter-metrics-otlp-grpc@0.213.0", "", { "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.6.0", "@opentelemetry/exporter-metrics-otlp-http": "0.213.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-grpc-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-metrics": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Z8gYKUAU48qwm+a1tjnGv9xbE7a5lukVIwgF6Z5i3VPXPVMe4Sjra0nN3zU7m277h+V+ZpsPGZJ2Xf0OTkL7/w=="],
+
+ "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.213.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-metrics": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-yw3fTIw4KQIRXC/ZyYQq5gtA3Ogfdfz/g5HVgleobQAcjUUE8Nj3spGMx8iQPp+S+u6/js7BixufRkXhzLmpJA=="],
+
+ "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.213.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/exporter-metrics-otlp-http": "0.213.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-metrics": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-geHF+zZaDb0/WRkJTxR8o8dG4fCWT/Wq7HBdNZCxwH5mxhwRi/5f37IDYH7nvU+dwU6IeY4Pg8TPI435JCiNkg=="],
+
+ "@opentelemetry/exporter-prometheus": ["@opentelemetry/exporter-prometheus@0.213.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-metrics": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-FyV3/JfKGAgx+zJUwCHdjQHbs+YeGd2fOWvBHYrW6dmfv/w89lb8WhJTSZEoWgP525jwv/gFeBttlGu1flebdA=="],
+
+ "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.213.0", "", { "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-grpc-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-trace-base": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-L8y6piP4jBIIx1Nv7/9hkx25ql6/Cro/kQrs+f9e8bPF0Ar5Dm991v7PnbtubKz6Q4fT872H56QXUWVnz/Cs4Q=="],
+
+ "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.213.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-trace-base": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-tnRmJD39aWrE/Sp7F6AbRNAjKHToDkAqBi6i0lESpGWz3G+f4bhVAV6mgSXH2o18lrDVJXo6jf9bAywQw43wRA=="],
+
+ "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.213.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-trace-base": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-six3vPq3sL+ge1iZOfKEg+RHuFQhGb8ZTdlvD234w/0gi8ty/qKD46qoGpKvM3amy5yYunWBKiFBW47WaVS26w=="],
+
+ "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@2.6.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-trace-base": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-AFP77OQMLfw/Jzh6WT2PtrywstNjdoyT9t9lYrYdk1s4igsvnMZ8DkZKCwxsItC01D+4Lydgrb+Wy0bAvpp8xg=="],
+
"@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.56.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.56.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-2KkGBKE+FPXU1F0zKww+stnlUxUTlBvLCiWdP63Z9sqXYeNI/ziNzsxAp4LAdUcTQmXjw1IWgvm5CAb/BHy99w=="],
"@opentelemetry/instrumentation-amqplib": ["@opentelemetry/instrumentation-amqplib@0.46.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ=="],
@@ -870,10 +912,18 @@
"@opentelemetry/instrumentation-aws-sdk": ["@opentelemetry/instrumentation-aws-sdk@0.48.0", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.56.0", "@opentelemetry/propagation-utils": "^0.30.14", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Bl4geb9DS5Zxr5mOsDcDTLjwrfipQ4KDl1ZT5gmoOvVuZPp308reGdtnO1QmqbvMwcgMxD2aBdWUoYgtx1WgWw=="],
+ "@opentelemetry/instrumentation-bunyan": ["@opentelemetry/instrumentation-bunyan@0.58.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.213.0", "@opentelemetry/instrumentation": "^0.213.0", "@types/bunyan": "1.8.11" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-vxotqOCzUQf2C4Dlrv+feY9XhQSa2wG/R+0S/JZ/axhbW0/yJeNKWsWWQ1FUFZQkUlZUS5nyWM8ePvgVmPq/Kg=="],
+
+ "@opentelemetry/instrumentation-cassandra-driver": ["@opentelemetry/instrumentation-cassandra-driver@0.58.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.37.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-qPzEANo6IVz02sctrbihMwcNGq+LUUrISnzFitUmFzBz5SjPp5iEPy59KFNqpNa9k/oas5B7650OWB/z2Ld7qQ=="],
+
"@opentelemetry/instrumentation-connect": ["@opentelemetry/instrumentation-connect@0.43.0", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/connect": "3.4.36" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Q57JGpH6T4dkYHo9tKXONgLtxzsh1ZEW5M9A/OwKrZFyEpLqWgjhcZ3hIuVvDlhb426iDF1f9FPToV/mi5rpeA=="],
+ "@opentelemetry/instrumentation-cucumber": ["@opentelemetry/instrumentation-cucumber@0.29.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-u3bECWikRK/nHQemb5TJbfht/eC70sVUwzkhAOTuXHAU+QAtUV9XLy6snjtGSJ1RLgOXU26tb4SqNplLa26COA=="],
+
"@opentelemetry/instrumentation-dataloader": ["@opentelemetry/instrumentation-dataloader@0.16.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-88+qCHZC02up8PwKHk0UQKLLqGGURzS3hFQBZC7PnGwReuoKjHXS1o29H58S+QkXJpkTr2GACbx8j6mUoGjNPA=="],
+ "@opentelemetry/instrumentation-dns": ["@opentelemetry/instrumentation-dns@0.56.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-u2E07CxapafcgNkTH5V0XSeE7xm3VA19HpKVEcwV+j9S7lKb9CE1j42dAM6nT7NgIQocIyyon1vFU2ubS0ukpA=="],
+
"@opentelemetry/instrumentation-express": ["@opentelemetry/instrumentation-express@0.47.0", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-XFWVx6k0XlU8lu6cBlCa29ONtVt6ADEjmxtyAyeF2+rifk8uBJbk1La0yIVfI0DoKURGbaEDTNelaXG9l/lNNQ=="],
"@opentelemetry/instrumentation-fastify": ["@opentelemetry/instrumentation-fastify@0.44.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-RoVeMGKcNttNfXMSl6W4fsYoCAYP1vi6ZAWIGhBY+o7R9Y0afA7f9JJL0j8LHbyb0P0QhSYk+6O56OwI2k4iRQ=="],
@@ -884,6 +934,8 @@
"@opentelemetry/instrumentation-graphql": ["@opentelemetry/instrumentation-graphql@0.47.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Cc8SMf+nLqp0fi8oAnooNEfwZWFnzMiBHCGmDFYqmgjPylyLmi83b+NiTns/rKGwlErpW0AGPt0sMpkbNlzn8w=="],
+ "@opentelemetry/instrumentation-grpc": ["@opentelemetry/instrumentation-grpc@0.213.0", "", { "dependencies": { "@opentelemetry/instrumentation": "0.213.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-GT53wIJnEffHcWlDUXRodTSUUspy57PNBZXc46z9rfy3Ee+VeM5XqWnieF1yefCd01QTaISYB49LXNc2SayIBQ=="],
+
"@opentelemetry/instrumentation-hapi": ["@opentelemetry/instrumentation-hapi@0.45.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-VH6mU3YqAKTePPfUPwfq4/xr049774qWtfTuJqVHoVspCLiT3bW+fCQ1toZxt6cxRPYASoYaBsMA3CWo8B8rcw=="],
"@opentelemetry/instrumentation-http": ["@opentelemetry/instrumentation-http@0.57.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/instrumentation": "0.57.1", "@opentelemetry/semantic-conventions": "1.28.0", "forwarded-parse": "2.1.2", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ThLmzAQDs7b/tdKI3BV2+yawuF09jF111OFsovqT1Qj3D8vjwKBwhi/rDE5xethwn4tSXtZcJ9hBsVAlWFQZ7g=="],
@@ -898,6 +950,8 @@
"@opentelemetry/instrumentation-lru-memoizer": ["@opentelemetry/instrumentation-lru-memoizer@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Tn7emHAlvYDFik3vGU0mdwvWJDwtITtkJ+5eT2cUquct6nIs+H8M47sqMJkCpyPe5QIBJoTOHxmc6mj9lz6zDw=="],
+ "@opentelemetry/instrumentation-memcached": ["@opentelemetry/instrumentation-memcached@0.56.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0", "@types/memcached": "^2.2.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-rU5kc6g465SgG52uUl2Qlf5OiNopYleqzNgJCDPokPdEeUb3Hpj3O7kqjAJ5bKEVMZVG9UC1MBp2TQwGv60byw=="],
+
"@opentelemetry/instrumentation-mongodb": ["@opentelemetry/instrumentation-mongodb@0.51.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-cMKASxCX4aFxesoj3WK8uoQ0YUrRvnfxaO72QWI2xLu5ZtgX/QvdGBlU3Ehdond5eb74c2s1cqRQUIptBnKz1g=="],
"@opentelemetry/instrumentation-mongoose": ["@opentelemetry/instrumentation-mongoose@0.46.0", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-mtVv6UeaaSaWTeZtLo4cx4P5/ING2obSqfWGItIFSunQBrYROfhuVe7wdIrFUs2RH1tn2YYpAJyMaRe/bnTTIQ=="],
@@ -908,21 +962,69 @@
"@opentelemetry/instrumentation-nestjs-core": ["@opentelemetry/instrumentation-nestjs-core@0.44.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-t16pQ7A4WYu1yyQJZhRKIfUNvl5PAaF2pEteLvgJb/BWdd1oNuU1rOYt4S825kMy+0q4ngiX281Ss9qiwHfxFQ=="],
+ "@opentelemetry/instrumentation-net": ["@opentelemetry/instrumentation-net@0.57.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-UUb59z83btvU8q9sQFOc3wr6dsxZP9O17dPlqRUxl1gVrxx8+CIajEGFP+KhJNdlkGyRjH09UfMRvWvCtJdakw=="],
+
+ "@opentelemetry/instrumentation-openai": ["@opentelemetry/instrumentation-openai@0.11.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.213.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.36.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-dlE35fB8xUFBFvlVOQcaMMii+mKk6kWeQbwQEePOLBp2U4oQd2wGGeVPYyihMnTFLVhQdQm2k5DVPFc2Gcllow=="],
+
+ "@opentelemetry/instrumentation-oracledb": ["@opentelemetry/instrumentation-oracledb@0.38.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.34.0", "@types/oracledb": "6.5.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-xPVEN9jO5pdpuzRYY8d7JTMEk2sPA3KShzoK4mBQgfLvM2BR3k0XwtyyX/FmWYSrjE7oxnO30HlhuyfkEd6o5A=="],
+
"@opentelemetry/instrumentation-pg": ["@opentelemetry/instrumentation-pg@0.50.0", "", { "dependencies": { "@opentelemetry/core": "^1.26.0", "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "1.27.0", "@opentelemetry/sql-common": "^0.40.1", "@types/pg": "8.6.1", "@types/pg-pool": "2.0.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-TtLxDdYZmBhFswm8UIsrDjh/HFBeDXd4BLmE8h2MxirNHewLJ0VS9UUddKKEverb5Sm2qFVjqRjcU+8Iw4FJ3w=="],
+ "@opentelemetry/instrumentation-pino": ["@opentelemetry/instrumentation-pino@0.59.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.213.0", "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IgImVFtWjfMmqxc0NIe3iSjp+J3Asf9lLX8reouUFUk3Aa/qJQO5PEvOtO3sNQtJBkC9bAd1OQdFaFWSFQc03g=="],
+
+ "@opentelemetry/instrumentation-redis": ["@opentelemetry/instrumentation-redis@0.61.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/redis-common": "^0.38.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-JnPexA034/0UJRsvH96B0erQoNOqKJZjE2ZRSw9hiTSC23LzE0nJE/u6D+xqOhgUhRnhhcPHq4MdYtmUdYTF+Q=="],
+
"@opentelemetry/instrumentation-redis-4": ["@opentelemetry/instrumentation-redis-4@0.46.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-aTUWbzbFMFeRODn3720TZO0tsh/49T8H3h8vVnVKJ+yE36AeW38Uj/8zykQ/9nO8Vrtjr5yKuX3uMiG/W8FKNw=="],
+ "@opentelemetry/instrumentation-restify": ["@opentelemetry/instrumentation-restify@0.58.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-E8pEjW9d5rd6xxLhgHiQTwUG6YBOBeWzH/pe/IkdIGwkDzm1NVoExjSCVtMLQ8dRZbVo0nSdv2TqzyDcysuiSQ=="],
+
+ "@opentelemetry/instrumentation-router": ["@opentelemetry/instrumentation-router@0.57.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-iWhLFvNee9ZX5QhFbXZeGdoT966QemUfd1i+zxPWceE58P22qf9va6x662LbrNhcvJfXnf7hoW7BU9tzaBLmYg=="],
+
+ "@opentelemetry/instrumentation-runtime-node": ["@opentelemetry/instrumentation-runtime-node@0.26.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Q6xlV3o/ogtAJ1stWNNqL7kKFD6sMEDyC3Rb9GqnMQ5uH1wfnXO189F2XwMNt7Xe52asNU1WCrqiGa0iSrkq1g=="],
+
+ "@opentelemetry/instrumentation-socket.io": ["@opentelemetry/instrumentation-socket.io@0.60.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-gzIkrN+hJzuQR87CA1zVCUQASOuuz0uC7kk7qDt9E/4sNvWrCIfI0YYa8ZTPgbaofqZE1fGWt0UqzIzQTb5BWQ=="],
+
"@opentelemetry/instrumentation-tedious": ["@opentelemetry/instrumentation-tedious@0.18.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/tedious": "^4.0.14" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-9zhjDpUDOtD+coeADnYEJQ0IeLVCj7w/hqzIutdp5NqS1VqTAanaEfsEcSypyvYv5DX3YOsTUoF+nr2wDXPETA=="],
"@opentelemetry/instrumentation-undici": ["@opentelemetry/instrumentation-undici@0.10.0", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.7.0" } }, "sha512-vm+V255NGw9gaSsPD6CP0oGo8L55BffBc8KnxqsMuc6XiAD1L8SFNzsW0RHhxJFqy9CJaJh+YiJ5EHXuZ5rZBw=="],
+ "@opentelemetry/instrumentation-winston": ["@opentelemetry/instrumentation-winston@0.57.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.213.0", "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-0MEeeyTd55OcXEd3SRkDwPvpb2equZ4kIADI7boVB9OYyaxAR2TB7jPX1IGORn1n/V+FXVWlYn9pQc2GuboJ+w=="],
+
+ "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.213.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-transformer": "0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-MegxAP1/n09Ob2dQvY5NBDVjAFkZRuKtWKxYev1R2M8hrsgXzQGkaMgoEKeUOyQ0FUyYcO29UOnYdQWmWa0PXg=="],
+
+ "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.213.0", "", { "dependencies": { "@grpc/grpc-js": "^1.14.3", "@opentelemetry/core": "2.6.0", "@opentelemetry/otlp-exporter-base": "0.213.0", "@opentelemetry/otlp-transformer": "0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-XgRGuLE9usFNlnw2lgMIM4HTwpcIyjdU/xPoJ8v3LbBLBfjaDkIugjc9HoWa7ZSJ/9Bhzgvm/aD0bGdYUFgnTw=="],
+
+ "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "@opentelemetry/core": "2.6.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-logs": "0.213.0", "@opentelemetry/sdk-metrics": "2.6.0", "@opentelemetry/sdk-trace-base": "2.6.0", "protobufjs": "^7.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-RSuAlxFFPjeK4d5Y6ps8L2WhaQI6CXWllIjvo5nkAlBpmq2XdYWEBGiAbOF4nDs8CX4QblJDv5BbMUft3sEfDw=="],
+
"@opentelemetry/propagation-utils": ["@opentelemetry/propagation-utils@0.30.16", "", { "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw=="],
+ "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@2.6.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-SguK4jMmRvQ0c0dxAMl6K+Eu1+01X0OP7RLiIuHFjOS8hlB23ZYNnhnbAdSQEh5xVXQmH0OAS0TnmVI+6vB2Kg=="],
+
+ "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@2.6.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-KGWJuvp9X8X36bhHgIhWEnHAzXDInFr+Fvo9IQhhuu6pXLT8mF7HzFyx/X+auZUITvPaZhM39Phj3vK12MbhwA=="],
+
"@opentelemetry/redis-common": ["@opentelemetry/redis-common@0.36.2", "", {}, "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g=="],
- "@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="],
+ "@opentelemetry/resource-detector-alibaba-cloud": ["@opentelemetry/resource-detector-alibaba-cloud@0.33.3", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-Ep3LDWALU+wCgGzAa1rgFXh3TObahN7HaQZntAeVQnnNhZ3VSXnBniRGeSCTIRvRr7YdZvq+G+rstixtAN5Ugw=="],
+
+ "@opentelemetry/resource-detector-aws": ["@opentelemetry/resource-detector-aws@2.13.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-ZPCn7gZhGqUYUoD+RCHIlayoHBMaJaEjfqlgz2EPKoXJ4y7Ru7CUm+Tm3yJVMKF92cN9xUQR0j5KALyF0fg9aw=="],
+
+ "@opentelemetry/resource-detector-azure": ["@opentelemetry/resource-detector-azure@0.21.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.37.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-gAjK+lKeywMcRk9X/DjJsK9aPrQo+tM9vcp6AKpAAHRN5hNwzO/vAaW/Ezdodu76BK4ELo/O77y/b9qP+uU7vg=="],
+
+ "@opentelemetry/resource-detector-container": ["@opentelemetry/resource-detector-container@0.8.4", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-kIvGHkMSacp+kb7btTuXbOAIWLyOCO+P/h/8xxaeLcp5ptmHRZ67uEdLAQo61ApdayFB/uqjJ9gY4x2/i/KsoA=="],
+
+ "@opentelemetry/resource-detector-gcp": ["@opentelemetry/resource-detector-gcp@0.48.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/resources": "^2.0.0", "gcp-metadata": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-kT/iG9zjlbWYaj22ixQ+vso0fXKCSKLH0loTb0Xfq+nQpu19MBTAa63IdITGCfqjcffh8/aB4hdyExypwAC16A=="],
+
+ "@opentelemetry/resources": ["@opentelemetry/resources@2.6.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ=="],
+
+ "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "@opentelemetry/core": "2.6.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-00xlU3GZXo3kXKve4DLdrAL0NAFUaZ9appU/mn00S/5kSUdAvyYsORaDUfR04Mp2CLagAOhrzfUvYozY/EZX2g=="],
- "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="],
+ "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.6.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/resources": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-CicxWZxX6z35HR83jl+PLgtFgUrKRQ9LCXyxgenMnz5A1lgYWfAog7VtdOvGkJYyQgMNPhXQwkYrDLujk7z1Iw=="],
+
+ "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "@opentelemetry/configuration": "0.213.0", "@opentelemetry/context-async-hooks": "2.6.0", "@opentelemetry/core": "2.6.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.213.0", "@opentelemetry/exporter-logs-otlp-http": "0.213.0", "@opentelemetry/exporter-logs-otlp-proto": "0.213.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.213.0", "@opentelemetry/exporter-metrics-otlp-http": "0.213.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.213.0", "@opentelemetry/exporter-prometheus": "0.213.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.213.0", "@opentelemetry/exporter-trace-otlp-http": "0.213.0", "@opentelemetry/exporter-trace-otlp-proto": "0.213.0", "@opentelemetry/exporter-zipkin": "2.6.0", "@opentelemetry/instrumentation": "0.213.0", "@opentelemetry/propagator-b3": "2.6.0", "@opentelemetry/propagator-jaeger": "2.6.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/sdk-logs": "0.213.0", "@opentelemetry/sdk-metrics": "2.6.0", "@opentelemetry/sdk-trace-base": "2.6.0", "@opentelemetry/sdk-trace-node": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-8s7SQtY8DIAjraXFrUf0+I90SBAUQbsMWMtUGKmusswRHWXtKJx42aJQMoxEtC82Csqj+IlBH6FoP8XmmUDSrQ=="],
+
+ "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.6.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/resources": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ=="],
+
+ "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.6.0", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.6.0", "@opentelemetry/core": "2.6.0", "@opentelemetry/sdk-trace-base": "2.6.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-YhswtasmsbIGEFvLGvR9p/y3PVRTfFf+mgY8van4Ygpnv4sA3vooAjvh+qAn9PNWxs4/IwGGqiQS0PPsaRJ0vQ=="],
"@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.37.0", "", {}, "sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA=="],
@@ -950,6 +1052,26 @@
"@prisma/instrumentation": ["@prisma/instrumentation@5.22.0", "", { "dependencies": { "@opentelemetry/api": "^1.8", "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0 || ^0.53.0", "@opentelemetry/sdk-trace-base": "^1.22" } }, "sha512-LxccF392NN37ISGxIurUljZSh1YWnphO34V5a0+T7FVQG2u9bhAXRTJpgmQ3483woVhkraQZFF7cbRrpbw/F4Q=="],
+ "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="],
+
+ "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="],
+
+ "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="],
+
+ "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="],
+
+ "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="],
+
+ "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="],
+
+ "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="],
+
+ "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="],
+
+ "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="],
+
+ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="],
+
"@puppeteer/browsers": ["@puppeteer/browsers@2.6.1", "", { "dependencies": { "debug": "^4.4.0", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg=="],
"@radix-ui/colors": ["@radix-ui/colors@3.0.0", "", {}, "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg=="],
@@ -1334,6 +1456,8 @@
"@stablelib/base64": ["@stablelib/base64@1.0.1", "", {}, "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="],
+ "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
+
"@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="],
"@stitches/core": ["@stitches/core@1.2.8", "", {}, "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg=="],
@@ -1368,6 +1492,10 @@
"@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="],
+ "@traceloop/ai-semantic-conventions": ["@traceloop/ai-semantic-conventions@0.20.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0" } }, "sha512-bvivhZU6U8TW4TKktYnjdTi+7GE4WxI8epaGjawalSKDunmxaA+4UVFQ+4tSCBvp2Scby+gnYNaTZSrtABfOlQ=="],
+
+ "@traceloop/instrumentation-anthropic": ["@traceloop/instrumentation-anthropic@0.20.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^2.0.1", "@opentelemetry/instrumentation": "^0.203.0", "@opentelemetry/semantic-conventions": "^1.36.0", "@traceloop/ai-semantic-conventions": "0.20.0", "tslib": "^2.8.1" } }, "sha512-xQcPxVrKr3yT9+ZEM3skYXikJc/ocZlGDIcsBQ3mMwL3Weq1QL7jx/uGLXvrSO2Yh0DWUjWI6Q/oiRCEUM6P8w=="],
+
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="],
"@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="],
@@ -1384,6 +1512,8 @@
"@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="],
+ "@types/bunyan": ["@types/bunyan@1.8.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ=="],
+
"@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="],
"@types/codemirror": ["@types/codemirror@5.60.16", "", { "dependencies": { "@types/tern": "*" } }, "sha512-V/yHdamffSS075jit+fDxaOAmdP2liok8NSNJnAZfDJErzOheuygHZEhAJrfmk5TEyM32MhkZjwo/idX791yxw=="],
@@ -1414,8 +1544,6 @@
"@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
- "@types/diff-match-patch": ["@types/diff-match-patch@1.0.36", "", {}, "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg=="],
-
"@types/dompurify": ["@types/dompurify@3.2.0", "", { "dependencies": { "dompurify": "*" } }, "sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg=="],
"@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="],
@@ -1456,6 +1584,8 @@
"@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+ "@types/memcached": ["@types/memcached@2.2.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg=="],
+
"@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="],
"@types/minimatch": ["@types/minimatch@6.0.0", "", { "dependencies": { "minimatch": "*" } }, "sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA=="],
@@ -1470,6 +1600,8 @@
"@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="],
+ "@types/oracledb": ["@types/oracledb@6.5.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ=="],
+
"@types/pg": ["@types/pg@8.6.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w=="],
"@types/pg-pool": ["@types/pg-pool@2.0.6", "", { "dependencies": { "@types/pg": "*" } }, "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ=="],
@@ -1586,6 +1718,8 @@
"@vercel/ncc": ["@vercel/ncc@0.38.3", "", { "bin": { "ncc": "dist/ncc/cli.js" } }, "sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA=="],
+ "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
+
"@vercel/speed-insights": ["@vercel/speed-insights@1.2.0", "", { "peerDependencies": { "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@sveltejs/kit", "next", "react", "svelte", "vue", "vue-router"] }, "sha512-y9GVzrUJ2xmgtQlzFP2KhVRoCglwfRQgjyfY607aU0hh0Un6d0OUyrJkjuAlsV18qR4zfoFPs/BiIj9YDS6Wzw=="],
"@vitejs/plugin-react": ["@vitejs/plugin-react@5.0.4", "", { "dependencies": { "@babel/core": "^7.28.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.38", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA=="],
@@ -1658,7 +1792,7 @@
"agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="],
- "ai": ["ai@4.3.19", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/react": "1.2.12", "@ai-sdk/ui-utils": "1.2.11", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q=="],
+ "ai": ["ai@6.0.116", "", { "dependencies": { "@ai-sdk/gateway": "3.0.66", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA=="],
"ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
@@ -1670,7 +1804,7 @@
"ansi-escapes": ["ansi-escapes@7.0.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw=="],
- "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+ "ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="],
"ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
@@ -1770,6 +1904,8 @@
"big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="],
+ "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
+
"binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
"bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="],
@@ -1814,6 +1950,8 @@
"caniuse-lite": ["caniuse-lite@1.0.30001741", "", {}, "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw=="],
+ "canonicalize": ["canonicalize@1.0.8", "", {}, "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A=="],
+
"case": ["case@1.6.3", "", {}, "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ=="],
"ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
@@ -1920,6 +2058,8 @@
"crelt": ["crelt@1.0.6", "", {}, "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="],
+ "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="],
+
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
"crypto-random-string": ["crypto-random-string@2.0.0", "", {}, "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="],
@@ -2018,8 +2158,6 @@
"diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="],
- "diff-match-patch": ["diff-match-patch@1.0.5", "", {}, "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw=="],
-
"diff-sequences": ["diff-sequences@29.6.3", "", {}, "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="],
"dingbat-to-unicode": ["dingbat-to-unicode@1.0.1", "", {}, "sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w=="],
@@ -2194,6 +2332,8 @@
"events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
+ "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
+
"execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="],
"expect": ["expect@29.7.0", "", { "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw=="],
@@ -2238,6 +2378,8 @@
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
+
"fflate": ["fflate@0.4.8", "", {}, "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="],
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
@@ -2272,6 +2414,8 @@
"formdata-node": ["formdata-node@4.4.1", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="],
+ "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
+
"forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="],
"framer-motion": ["framer-motion@12.23.12", "", { "dependencies": { "motion-dom": "^12.23.12", "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg=="],
@@ -2290,6 +2434,10 @@
"functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
+ "gaxios": ["gaxios@7.1.4", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA=="],
+
+ "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="],
+
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
@@ -2326,6 +2474,8 @@
"globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
+ "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="],
+
"gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
@@ -2344,6 +2494,8 @@
"has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
+ "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="],
+
"hashids": ["hashids@2.3.0", "", {}, "sha512-ljM73TE/avEhNnazxaj0Dw3BbEUuLC5yYCQ9RSkSUcT4ZSU6ZebdKCIBJ+xT/DnSYW36E9k82GH1Q6MydSIosQ=="],
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
@@ -2420,6 +2572,8 @@
"inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="],
+ "inngest": ["inngest@3.52.6", "", { "dependencies": { "@bufbuild/protobuf": "^2.2.3", "@inngest/ai": "^0.1.3", "@jpwilliams/waitgroup": "^2.1.1", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": ">=0.66.0 <1.0.0", "@opentelemetry/context-async-hooks": ">=2.0.0 <3.0.0", "@opentelemetry/exporter-trace-otlp-http": ">=0.200.0 <0.300.0", "@opentelemetry/instrumentation": ">=0.200.0 <0.300.0", "@opentelemetry/resources": ">=2.0.0 <3.0.0", "@opentelemetry/sdk-trace-base": ">=2.0.0 <3.0.0", "@standard-schema/spec": "^1.0.0", "@traceloop/instrumentation-anthropic": "^0.20.0", "@types/debug": "^4.1.12", "@types/ms": "~2.1.0", "canonicalize": "^1.0.8", "chalk": "^4.1.2", "cross-fetch": "^4.0.0", "debug": "^4.3.4", "hash.js": "^1.1.7", "json-stringify-safe": "^5.0.1", "ms": "^2.1.3", "serialize-error-cjs": "^0.1.3", "strip-ansi": "^5.2.0", "temporal-polyfill": "^0.2.5", "ulid": "^2.3.0", "zod": "^3.25.0" }, "peerDependencies": { "@sveltejs/kit": ">=1.27.3", "@vercel/node": ">=2.15.9", "aws-lambda": ">=1.0.7", "express": ">=4.19.2", "fastify": ">=4.21.0", "h3": ">=1.8.1", "hono": ">=4.2.7", "koa": ">=2.14.2", "next": ">=12.0.0", "typescript": ">=5.8.0" }, "optionalPeers": ["@sveltejs/kit", "@vercel/node", "aws-lambda", "express", "fastify", "h3", "hono", "koa", "next", "typescript"] }, "sha512-wDxA1I5CIL7anqyX3Vr0T/5kOHkWN8W5oeqbHhFKFbsFrM+M/J3OEFiRRgcdiGyhNHxPvWaRdQb4N2mfgwc7PQ=="],
+
"internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
"internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
@@ -2564,6 +2718,8 @@
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+ "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="],
+
"json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
"json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
@@ -2574,9 +2730,9 @@
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
- "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
+ "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="],
- "jsondiffpatch": ["jsondiffpatch@0.6.0", "", { "dependencies": { "@types/diff-match-patch": "^1.0.36", "chalk": "^5.3.0", "diff-match-patch": "^1.0.5" }, "bin": { "jsondiffpatch": "bin/jsondiffpatch.js" } }, "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ=="],
+ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
"jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
@@ -2644,6 +2800,8 @@
"lodash._root": ["lodash._root@3.0.1", "", {}, "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ=="],
+ "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],
+
"lodash.castarray": ["lodash.castarray@4.4.0", "", {}, "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q=="],
"lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="],
@@ -2674,6 +2832,8 @@
"log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
+ "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
+
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
"loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
@@ -2840,6 +3000,8 @@
"min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="],
+ "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="],
+
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
@@ -2874,7 +3036,7 @@
"netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="],
- "next": ["next@15.0.2", "", { "dependencies": { "@next/env": "15.0.2", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.13", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.0.2", "@next/swc-darwin-x64": "15.0.2", "@next/swc-linux-arm64-gnu": "15.0.2", "@next/swc-linux-arm64-musl": "15.0.2", "@next/swc-linux-x64-gnu": "15.0.2", "@next/swc-linux-x64-musl": "15.0.2", "@next/swc-win32-arm64-msvc": "15.0.2", "@next/swc-win32-x64-msvc": "15.0.2", "sharp": "^0.33.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-02c0e824-20241028", "react-dom": "^18.2.0 || 19.0.0-rc-02c0e824-20241028", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-rxIWHcAu4gGSDmwsELXacqAPUk+j8dV/A9cDF5fsiCMpkBDYkO2AEaL1dfD+nNmDiU6QMCFN8Q30VEKapT9UHQ=="],
+ "next": ["next@15.0.5", "", { "dependencies": { "@next/env": "15.0.5", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.13", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.0.5", "@next/swc-darwin-x64": "15.0.5", "@next/swc-linux-arm64-gnu": "15.0.5", "@next/swc-linux-arm64-musl": "15.0.5", "@next/swc-linux-x64-gnu": "15.0.5", "@next/swc-linux-x64-musl": "15.0.5", "@next/swc-win32-arm64-msvc": "15.0.5", "@next/swc-win32-x64-msvc": "15.0.5", "sharp": "^0.33.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-WTh/Rmxkn4J4vwSYiqEZGzoxjid83iCyN0qg7oJFKzHjYCzy5mwBRqWVlFotM9nAnxGGv5MzbMa4gMu88qeGLA=="],
"next-pwa": ["next-pwa@5.6.0", "", { "dependencies": { "babel-loader": "^8.2.5", "clean-webpack-plugin": "^4.0.0", "globby": "^11.0.4", "terser-webpack-plugin": "^5.3.3", "workbox-webpack-plugin": "^6.5.4", "workbox-window": "^6.5.4" }, "peerDependencies": { "next": ">=9.0.0" } }, "sha512-XV8g8C6B7UmViXU8askMEYhWwQ4qc/XqJGnexbLV68hzKaGHZDMtHsm2TNxFcbR7+ypVuth/wwpiIlMwpRJJ5A=="],
@@ -3076,6 +3238,8 @@
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+ "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="],
+
"proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="],
"proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
@@ -3242,6 +3406,8 @@
"semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+ "serialize-error-cjs": ["serialize-error-cjs@0.1.4", "", {}, "sha512-6a6dNqipzbCPlTFgztfNP2oG+IGcflMe/01zSzGrQcxGMKbIjOemBBD85pH92klWaJavAUWxAh9Z0aU28zxW6A=="],
+
"serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="],
"server-only": ["server-only@0.0.1", "", {}, "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA=="],
@@ -3360,7 +3526,7 @@
"stringify-object": ["stringify-object@3.3.0", "", { "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" } }, "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw=="],
- "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+ "strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="],
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
@@ -3416,6 +3582,10 @@
"temp-dir": ["temp-dir@2.0.0", "", {}, "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg=="],
+ "temporal-polyfill": ["temporal-polyfill@0.2.5", "", { "dependencies": { "temporal-spec": "^0.2.4" } }, "sha512-ye47xp8Cb0nDguAhrrDS1JT1SzwEV9e26sSsrWzVu+yPZ7LzceEcH0i2gci9jWfOfSCCgM3Qv5nOYShVUUFUXA=="],
+
+ "temporal-spec": ["temporal-spec@0.2.4", "", {}, "sha512-lDMFv4nKQrSjlkHKAlHVqKrBG4DyFfa9F74cmBZ3Iy3ed8yvWnlWSIdi4IKfSqwmazAohBNwiN64qGx4y5Q3IQ=="],
+
"tempy": ["tempy@0.6.0", "", { "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", "type-fest": "^0.16.0", "unique-string": "^2.0.0" } }, "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw=="],
"terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="],
@@ -3430,8 +3600,6 @@
"thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="],
- "throttleit": ["throttleit@2.1.0", "", {}, "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw=="],
-
"through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="],
"tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
@@ -3492,6 +3660,8 @@
"typo-js": ["typo-js@1.3.1", "", {}, "sha512-elJkpCL6Z77Ghw0Lv0lGnhBAjSTOQ5FhiVOCfOuxhaoTT2xtLVbqikYItK5HHchzPbHEUFAcjOH669T2ZzeCbg=="],
+ "ulid": ["ulid@2.4.0", "", { "bin": { "ulid": "bin/cli.js" } }, "sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg=="],
+
"unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
"unbzip2-stream": ["unbzip2-stream@1.4.3", "", { "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg=="],
@@ -3696,8 +3866,6 @@
"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
- "zod-to-json-schema": ["zod-to-json-schema@3.24.6", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg=="],
-
"zod-validation-error": ["zod-validation-error@3.5.3", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-OT5Y8lbUadqVZCsnyFaTQ4/O2mys4tj7PqhdbBCp7McPwvIEKfPtdA6QfPeFQK2/Rz5LgwmAXRJTugBNBi0btw=="],
"zustand": ["zustand@5.0.6", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A=="],
@@ -3762,7 +3930,7 @@
"@humeai/voice-react/date-fns": ["date-fns@3.6.0", "", {}, "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww=="],
- "@humeai/voice-react/hume": ["hume@0.13.3", "", { "dependencies": { "node-fetch": "^2.7.0", "qs": "^6.13.1", "readable-stream": "^4.5.2", "url-join": "4.0.1", "uuid": "9.0.1", "ws": "^8.14.2", "zod": "^3.23.8" } }, "sha512-/wS3LVpmSggjRLaKGKA7RtNmOYlUH8XoK4jNmx4rMev/KP4C3azqE+bIVNco1W87dhFEs8hI7Wbc3AmhtIBvkA=="],
+ "@humeai/voice-react/hume": ["hume@0.15.13", "", { "dependencies": { "uuid": "9.0.1", "ws": "^8.16.0", "zod": "^3.23.8" } }, "sha512-ZMdC6t1nUSxhbjPL+7luyszDVmqenvR2IPncsYc66iWztESlcsg8hqM2mSXoiw9a+SJHJWidZ1WFmup9ULplWQ=="],
"@humeai/voice-react/react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
@@ -3782,18 +3950,110 @@
"@oozcitak/url/@oozcitak/util": ["@oozcitak/util@1.0.2", "", {}, "sha512-4n8B1cWlJleSOSba5gxsMcN4tO8KkkcvXhNWW+ADqvq9Xj+Lrl9uCa90GRpjekqQJyt84aUX015DG81LFpZYXA=="],
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-amqplib": ["@opentelemetry/instrumentation-amqplib@0.60.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-q/B2IvoVXRm1M00MvhnzpMN6rKYOszPXVsALi6u0ss4AYHe+TidZEtLW9N1ZhrobI1dSriHnBqqtAOZVAv07sg=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-aws-lambda": ["@opentelemetry/instrumentation-aws-lambda@0.65.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/aws-lambda": "^8.10.155" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-7SiaXnyEH0abDi61r72YCpkeQr27ePiCK3SaE2uFEF/riAUwk18r6vDXQKPZczWv3BGrGpk1YDc4qYYlY0uomA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-aws-sdk": ["@opentelemetry/instrumentation-aws-sdk@0.68.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.34.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-nHXSRX3iYSE9MaiPE+jIovuNA8dTmleeg0vdLHkk5nvWCYFf/I9kMdqA3KcfKCPonVc5+NtSTft6OVtuGtawIA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-connect": ["@opentelemetry/instrumentation-connect@0.56.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/connect": "3.4.38" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-PKp+sSZ7AfzMvGgO3VCyo1inwNu+q7A1k9X88WK4PQ+S6Hp7eFk8pie+sWHDTaARovmqq5V2osav3lQej2B0nw=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-dataloader": ["@opentelemetry/instrumentation-dataloader@0.30.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-MXHP2Q38cd2OhzEBKAIXUi9uBlPEYzF6BNJbyjUXBQ6kLaf93kRC41vNMIz0Nl5mnuwK7fDvKT+/lpx7BXRwdg=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-express": ["@opentelemetry/instrumentation-express@0.61.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Xdmqo9RZuZlL29Flg8QdwrrX7eW1CZ7wFQPKHyXljNymgKhN1MCsYuqQ/7uxavhSKwAl7WxkTzKhnqpUApLMvQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-fastify": ["@opentelemetry/instrumentation-fastify@0.57.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-D+rwRtbiOediYocpKGvY/RQTpuLsLdCVwaOREyqWViwItJGibWI7O/wgd9xIV63pMP0D9IdSy27wnARfUaotKg=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-fs": ["@opentelemetry/instrumentation-fs@0.32.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-koR6apx0g0wX6RRiPpjA4AFQUQUbXrK16kq4/SZjVp7u5cffJhNkY4TnITxcGA4acGSPYAfx3NHRIv4Khn1axQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-generic-pool": ["@opentelemetry/instrumentation-generic-pool@0.56.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-fg+Jffs6fqrf0uQS0hom7qBFKsbtpBiBl8+Vkc63Gx8xh6pVh+FhagmiO6oM0m3vyb683t1lP7yGYq22SiDnqg=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-graphql": ["@opentelemetry/instrumentation-graphql@0.61.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-pUiVASv6nh2XrerTvlbVHh7vKFzscpgwiQ/xvnZuAIzQ5lRjWVdRPUuXbvZJ/Yq79QsE81TZdJ7z9YsXiss1ew=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-hapi": ["@opentelemetry/instrumentation-hapi@0.59.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-33wa4mEr+9+ztwdgLor1SeBu4Opz4IsmpcLETXAd3VmBrOjez8uQtrsOhPCa5Vhbm5gzDlMYTgFRLQzf8/YHFA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-http": ["@opentelemetry/instrumentation-http@0.213.0", "", { "dependencies": { "@opentelemetry/core": "2.6.0", "@opentelemetry/instrumentation": "0.213.0", "@opentelemetry/semantic-conventions": "^1.29.0", "forwarded-parse": "2.1.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-B978Xsm5XEPGhm1P07grDoaOFLHapJPkOG9h016cJsyWWxmiLnPu2M/4Nrm7UCkHSiLnkXgC+zVGUAIahy8EEA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-ioredis": ["@opentelemetry/instrumentation-ioredis@0.61.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/redis-common": "^0.38.2", "@opentelemetry/semantic-conventions": "^1.33.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-hsHDadUtAFbws1YSDc1XW0svGFKiUbqv2td1Cby+UAiwvojm1NyBo/taifH0t8CuFZ0x/2SDm0iuTwrM5pnVOg=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-kafkajs": ["@opentelemetry/instrumentation-kafkajs@0.22.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.30.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-wJU4IBQMUikdJAcTChLFqK5lo+flo7pahqd8DSLv7uMxsdOdAHj6RzKYAm8pPfUS6ItKYutYyuicwKaFwQKsoA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-knex": ["@opentelemetry/instrumentation-knex@0.57.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-vMCSh8kolEm5rRsc+FZeTZymWmIJwc40hjIKnXH4O0Dv/gAkJJIRXCsPX5cPbe0c0j/34+PsENd0HqKruwhVYw=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-koa": ["@opentelemetry/instrumentation-koa@0.61.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.36.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0" } }, "sha512-lvrfWe9ShK/D2X4brmx8ZqqeWPfRl8xekU0FCn7C1dHm5k6+rTOOi36+4fnaHAP8lig9Ux6XQ1D4RNIpPCt1WQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-lru-memoizer": ["@opentelemetry/instrumentation-lru-memoizer@0.57.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-cEqpUocSKJfwDtLYTTJehRLWzkZ2eoePCxfVIgGkGkb83fMB71O+y4MvRHJPbeV2bdoWdOVrl8uO0+EynWhTEA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-mongodb": ["@opentelemetry/instrumentation-mongodb@0.66.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-d7m9QnAY+4TCWI4q1QRkfrc6fo/92VwssaB1DzQfXNRvu51b78P+HJlWP7Qg6N6nkwdb9faMZNBCZJfftmszkw=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-mongoose": ["@opentelemetry/instrumentation-mongoose@0.59.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-6/jWU+c1NgznkVLDU/2y0bXV2nJo3o9FWZ9mZ9nN6T/JBNRoMnVXZl2FdBmgH+a5MwaWLs5kmRJTP5oUVGIkPw=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-mysql": ["@opentelemetry/instrumentation-mysql@0.59.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0", "@types/mysql": "2.15.27" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-r+V/Fh0sm7Ga8/zk/TI5H5FQRAjwr0RrpfPf8kNIehlsKf12XnvIaZi8ViZkpX0gyPEpLXqzqWD6QHlgObgzZw=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-mysql2": ["@opentelemetry/instrumentation-mysql2@0.59.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0", "@opentelemetry/sql-common": "^0.41.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-n9/xrVCRBfG9egVbffnlU1uhr+HX0vF4GgtAB/Bvm48wpFgRidqD8msBMiym1kRYzmpWvJqTxNT47u1MkgBEdw=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-nestjs-core": ["@opentelemetry/instrumentation-nestjs-core@0.59.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.30.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-tt2cFTENV8XB3D3xjhOz0q4hLc1eqkMZS5UyT9nnHF5FfYH94S2vAGdssvsMv+pFtA6/PmhPUZd4onUN1O7STg=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-pg": ["@opentelemetry/instrumentation-pg@0.65.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.34.0", "@opentelemetry/sql-common": "^0.41.2", "@types/pg": "8.15.6", "@types/pg-pool": "2.0.7" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-W0zpHEIEuyZ8zvb3njaX9AAbHgPYOsSWVOoWmv1sjVRSF6ZpBqtlxBWbU+6hhq1TFWBeWJOXZ8nZS/PUFpLJYQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-tedious": ["@opentelemetry/instrumentation-tedious@0.32.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.33.0", "@types/tedious": "^4.0.14" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BQS6gG8RJ1foEqfEZ+wxoqlwfCAzb1ZVG0ad8Gfe4x8T658HJCLGLd4E4NaoQd8EvPfLqOXgzGaE/2U4ytDSWA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-undici": ["@opentelemetry/instrumentation-undici@0.23.0", "", { "dependencies": { "@opentelemetry/core": "^2.0.0", "@opentelemetry/instrumentation": "^0.213.0", "@opentelemetry/semantic-conventions": "^1.24.0" }, "peerDependencies": { "@opentelemetry/api": "^1.7.0" } }, "sha512-LL0VySzKVR2cJSFVZaTYpZl1XTpBGnfzoQPe2W7McS2267ldsaEIqtQY6VXs2KCXN0poFjze5110PIpxHDaDGg=="],
+
+ "@opentelemetry/configuration/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
"@opentelemetry/core/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
+ "@opentelemetry/exporter-logs-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-logs-otlp-http/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/exporter-logs-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/exporter-logs-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-metrics-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-metrics-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-metrics-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-prometheus/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/exporter-zipkin/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
"@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
"@opentelemetry/instrumentation-amqplib/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
"@opentelemetry/instrumentation-aws-lambda/@types/aws-lambda": ["@types/aws-lambda@8.10.143", "", {}, "sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg=="],
+ "@opentelemetry/instrumentation-bunyan/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-bunyan/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/instrumentation-cassandra-driver/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
"@opentelemetry/instrumentation-connect/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
+ "@opentelemetry/instrumentation-cucumber/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
"@opentelemetry/instrumentation-dataloader/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
+ "@opentelemetry/instrumentation-dns/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
"@opentelemetry/instrumentation-express/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
"@opentelemetry/instrumentation-fastify/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
@@ -3804,6 +4064,8 @@
"@opentelemetry/instrumentation-graphql/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
+ "@opentelemetry/instrumentation-grpc/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
"@opentelemetry/instrumentation-hapi/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
"@opentelemetry/instrumentation-http/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.1", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-SgHEKXoVxOjc20ZYusPG3Fh+RLIZTSa4x8QtD3NfgAUDyqdFFS9W1F2ZVbZkqDCdyMcQG02Ok4duUGLHJXHgbA=="],
@@ -3822,6 +4084,8 @@
"@opentelemetry/instrumentation-lru-memoizer/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
+ "@opentelemetry/instrumentation-memcached/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
"@opentelemetry/instrumentation-mongodb/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
"@opentelemetry/instrumentation-mongoose/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
@@ -3832,22 +4096,92 @@
"@opentelemetry/instrumentation-nestjs-core/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
+ "@opentelemetry/instrumentation-net/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/instrumentation-openai/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-openai/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/instrumentation-oracledb/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
"@opentelemetry/instrumentation-pg/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
"@opentelemetry/instrumentation-pg/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.27.0", "", {}, "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg=="],
+ "@opentelemetry/instrumentation-pino/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-pino/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/instrumentation-pino/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/instrumentation-redis/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/instrumentation-redis/@opentelemetry/redis-common": ["@opentelemetry/redis-common@0.38.2", "", {}, "sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA=="],
+
"@opentelemetry/instrumentation-redis-4/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
+ "@opentelemetry/instrumentation-restify/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/instrumentation-restify/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/instrumentation-router/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/instrumentation-runtime-node/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/instrumentation-socket.io/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
"@opentelemetry/instrumentation-tedious/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
"@opentelemetry/instrumentation-undici/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
- "@opentelemetry/resources/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
+ "@opentelemetry/instrumentation-winston/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
- "@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
+ "@opentelemetry/instrumentation-winston/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/otlp-exporter-base/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/otlp-grpc-exporter-base/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/otlp-transformer/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/otlp-transformer/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/propagator-b3/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/propagator-jaeger/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/resource-detector-alibaba-cloud/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/resource-detector-aws/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/resource-detector-azure/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/resource-detector-container/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/resource-detector-gcp/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/resources/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/sdk-logs/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/sdk-logs/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/sdk-metrics/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/sdk-node/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/sdk-node/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/sdk-node/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
+ "@opentelemetry/sdk-trace-base/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@opentelemetry/sdk-trace-node/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
"@prisma/instrumentation/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.53.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.53.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A=="],
+ "@prisma/instrumentation/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="],
+
"@puppeteer/browsers/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
"@puppeteer/browsers/tar-fs": ["tar-fs@3.1.0", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w=="],
@@ -3886,10 +4220,20 @@
"@sentry/nextjs/resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="],
+ "@sentry/node/@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="],
+
"@sentry/node/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
+ "@sentry/node/@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="],
+
+ "@sentry/node/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="],
+
+ "@sentry/opentelemetry/@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="],
+
"@sentry/opentelemetry/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
+ "@sentry/opentelemetry/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="],
+
"@sentry/serverless/@sentry/core": ["@sentry/core@7.120.4", "", { "dependencies": { "@sentry/types": "7.120.4", "@sentry/utils": "7.120.4" } }, "sha512-TXu3Q5kKiq8db9OXGkWyXUbIxMMuttB5vJ031yolOl5T/B69JRyAoKuojLBjRv1XX583gS1rSSoX8YXX7ATFGA=="],
"@sentry/serverless/@sentry/node": ["@sentry/node@7.120.4", "", { "dependencies": { "@sentry-internal/tracing": "7.120.4", "@sentry/core": "7.120.4", "@sentry/integrations": "7.120.4", "@sentry/types": "7.120.4", "@sentry/utils": "7.120.4" } }, "sha512-qq3wZAXXj2SRWhqErnGCSJKUhPSlZ+RGnCZjhfjHpP49KNpcd9YdPTIUsFMgeyjdh6Ew6aVCv23g1hTP0CHpYw=="],
@@ -3918,6 +4262,10 @@
"@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="],
+ "@traceloop/instrumentation-anthropic/@opentelemetry/core": ["@opentelemetry/core@2.6.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg=="],
+
+ "@traceloop/instrumentation-anthropic/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.203.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.203.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ=="],
+
"@types/minimatch/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
"@types/next-pwa/next": ["next@13.5.11", "", { "dependencies": { "@next/env": "13.5.11", "@swc/helpers": "0.5.2", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.31", "styled-jsx": "5.1.1", "watchpack": "2.4.0" }, "optionalDependencies": { "@next/swc-darwin-arm64": "13.5.9", "@next/swc-darwin-x64": "13.5.9", "@next/swc-linux-arm64-gnu": "13.5.9", "@next/swc-linux-arm64-musl": "13.5.9", "@next/swc-linux-x64-gnu": "13.5.9", "@next/swc-linux-x64-musl": "13.5.9", "@next/swc-win32-arm64-msvc": "13.5.9", "@next/swc-win32-ia32-msvc": "13.5.9", "@next/swc-win32-x64-msvc": "13.5.9" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-WUPJ6WbAX9tdC86kGTu92qkrRdgRqVrY++nwM+shmWQwmyxt4zhZfR59moXSI4N8GDYCBY3lIAqhzjDd4rTC8Q=="],
@@ -3956,6 +4304,8 @@
"cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+ "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
"cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
"del/globby": ["globby@6.1.0", "", { "dependencies": { "array-union": "^1.0.1", "glob": "^7.0.3", "object-assign": "^4.0.1", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" } }, "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw=="],
@@ -3992,8 +4342,12 @@
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+ "fetch-blob/web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
+
"filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="],
+ "gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
+
"glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
"hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
@@ -4008,6 +4362,8 @@
"hume/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
+ "inngest/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.213.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.213.0", "import-in-the-middle": "^3.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3i9NdkET/KvQomeh7UaR/F4r9P25Rx6ooALlWXPIjypcEOUxksCmVu0zA70NBJWlrMW1rPr/LRidFAflLI+s/w=="],
+
"is-bun-module/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
"jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
@@ -4016,8 +4372,6 @@
"js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
- "jsondiffpatch/chalk": ["chalk@5.6.0", "", {}, "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ=="],
-
"lambdafs/b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="],
"lambdafs/bare-events": ["bare-events@2.6.1", "", {}, "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g=="],
@@ -4082,6 +4436,8 @@
"openai-realtime-api/nanoid": ["nanoid@5.1.5", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw=="],
+ "ora/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
"parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
"path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
@@ -4154,6 +4510,10 @@
"string-width-cjs/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+ "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
"strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="],
"sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
@@ -4208,6 +4568,8 @@
"wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
"xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="],
"xmlbuilder2/@oozcitak/dom": ["@oozcitak/dom@1.15.5", "", { "dependencies": { "@oozcitak/infra": "1.0.5", "@oozcitak/url": "1.0.0", "@oozcitak/util": "8.0.0" } }, "sha512-L6v3Mwb0TaYBYgeYlIeBaHnc+2ZEaDSbFiRm5KmqZQSoBlbPlf+l6aIH/sD5GUf2MYwULw00LT7+dOnEuAEC0A=="],
@@ -4280,18 +4642,52 @@
"@oozcitak/url/@oozcitak/infra/@oozcitak/util": ["@oozcitak/util@1.0.1", "", {}, "sha512-dFwFqcKrQnJ2SapOmRD1nQWEZUtbtIy9Y6TyJquzsalWNJsKIPxmTI0KG6Ypyl8j7v89L2wixH9fQDNrF78hKg=="],
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-aws-lambda/@types/aws-lambda": ["@types/aws-lambda@8.10.161", "", {}, "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-connect/@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-ioredis/@opentelemetry/redis-common": ["@opentelemetry/redis-common@0.38.2", "", {}, "sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-mysql/@types/mysql": ["@types/mysql@2.15.27", "", { "dependencies": { "@types/node": "*" } }, "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-mysql2/@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.41.2", "", { "dependencies": { "@opentelemetry/core": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-pg/@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.41.2", "", { "dependencies": { "@opentelemetry/core": "^2.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-pg/@types/pg": ["@types/pg@8.15.6", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ=="],
+
+ "@opentelemetry/auto-instrumentations-node/@opentelemetry/instrumentation-pg/@types/pg-pool": ["@types/pg-pool@2.0.7", "", { "dependencies": { "@types/pg": "*" } }, "sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng=="],
+
"@opentelemetry/instrumentation-amqplib/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-amqplib/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-bunyan/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/instrumentation-cassandra-driver/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-cassandra-driver/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@opentelemetry/instrumentation-connect/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-connect/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-cucumber/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-cucumber/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@opentelemetry/instrumentation-dataloader/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-dataloader/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-dns/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-dns/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@opentelemetry/instrumentation-express/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-express/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
@@ -4312,6 +4708,10 @@
"@opentelemetry/instrumentation-graphql/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-grpc/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-grpc/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@opentelemetry/instrumentation-hapi/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-hapi/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
@@ -4338,6 +4738,10 @@
"@opentelemetry/instrumentation-lru-memoizer/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-memcached/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-memcached/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@opentelemetry/instrumentation-mongodb/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-mongodb/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
@@ -4358,14 +4762,46 @@
"@opentelemetry/instrumentation-nestjs-core/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-net/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-net/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/instrumentation-openai/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/instrumentation-oracledb/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-oracledb/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@opentelemetry/instrumentation-pg/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-pg/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-pino/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@opentelemetry/instrumentation-redis-4/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-redis-4/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-redis/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-redis/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/instrumentation-restify/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-restify/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/instrumentation-router/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-router/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/instrumentation-runtime-node/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-runtime-node/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/instrumentation-socket.io/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "@opentelemetry/instrumentation-socket.io/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@opentelemetry/instrumentation-tedious/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation-tedious/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
@@ -4374,10 +4810,18 @@
"@opentelemetry/instrumentation-undici/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@opentelemetry/instrumentation-winston/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
+ "@opentelemetry/sdk-node/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"@prisma/instrumentation/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.53.0", "", { "dependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw=="],
"@prisma/instrumentation/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@prisma/instrumentation/@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="],
+
+ "@prisma/instrumentation/@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
+
"@puppeteer/browsers/tar-fs/tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="],
"@rollup/plugin-babel/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="],
@@ -4410,10 +4854,18 @@
"@sentry/node/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@sentry/node/@opentelemetry/resources/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
+
+ "@sentry/node/@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
+
"@sentry/opentelemetry/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@sentry/opentelemetry/@opentelemetry/instrumentation/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "@sentry/opentelemetry/@opentelemetry/sdk-trace-base/@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="],
+
+ "@sentry/opentelemetry/@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
+
"@sentry/webpack-plugin/@sentry/bundler-plugin-core/@sentry/babel-plugin-component-annotate": ["@sentry/babel-plugin-component-annotate@2.22.7", "", {}, "sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ=="],
"@sentry/webpack-plugin/@sentry/bundler-plugin-core/@sentry/cli": ["@sentry/cli@2.39.1", "", { "dependencies": { "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", "progress": "^2.0.3", "proxy-from-env": "^1.1.0", "which": "^2.0.2" }, "optionalDependencies": { "@sentry/cli-darwin": "2.39.1", "@sentry/cli-linux-arm": "2.39.1", "@sentry/cli-linux-arm64": "2.39.1", "@sentry/cli-linux-i686": "2.39.1", "@sentry/cli-linux-x64": "2.39.1", "@sentry/cli-win32-i686": "2.39.1", "@sentry/cli-win32-x64": "2.39.1" }, "bin": { "sentry-cli": "bin/sentry-cli" } }, "sha512-JIb3e9vh0+OmQ0KxmexMXg9oZsR/G7HMwxt5BUIKAXZ9m17Xll4ETXTRnRUBT3sf7EpNGAmlQk1xEmVN9pYZYQ=="],
@@ -4424,8 +4876,12 @@
"@sparticuz/chromium/tar-fs/tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="],
+ "@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
"@testing-library/dom/pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="],
+ "@traceloop/instrumentation-anthropic/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.203.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ=="],
+
"@types/minimatch/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
"@types/next-pwa/next/@next/env": ["@next/env@13.5.11", "", {}, "sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg=="],
@@ -4466,6 +4922,8 @@
"cliui/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
"cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
"del/globby/array-union": ["array-union@1.0.2", "", { "dependencies": { "array-uniq": "^1.0.1" } }, "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng=="],
@@ -4528,6 +4986,8 @@
"filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+ "gaxios/node-fetch/data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
+
"glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
"html-docx-js/lodash.merge/lodash.isplainobject": ["lodash.isplainobject@3.2.0", "", { "dependencies": { "lodash._basefor": "^3.0.0", "lodash.isarguments": "^3.0.0", "lodash.keysin": "^3.0.0" } }, "sha512-P4wZnho5curNqeEq/x292Pb57e1v+woR7DJ84DURelKB46lby8aDEGVobSaYtzHdQBWQrJSdxcCwjlGOvvdIyg=="],
@@ -4546,6 +5006,10 @@
"html-to-vdom/htmlparser2/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
+ "inngest/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
+
+ "inngest/@opentelemetry/instrumentation/require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="],
+
"log-update/cli-cursor/restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
"log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
@@ -4562,6 +5026,8 @@
"openai/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
+ "ora/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
"pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
"react-email/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ=="],
@@ -4642,6 +5108,8 @@
"source-map/whatwg-url/webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="],
+ "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
"string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.0", "", {}, "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg=="],
"sucrase/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
@@ -4728,6 +5196,8 @@
"wrap-ansi-cjs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+ "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
"wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.0", "", {}, "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg=="],
"xmlbuilder2/@oozcitak/dom/@oozcitak/util": ["@oozcitak/util@8.0.0", "", {}, "sha512-+9Hq6yuoq/3TRV/n/xcpydGBq2qN2/DEDMqNTG7rm95K6ZE2/YY/sPyx62+1n8QsE9O26e5M1URlXsk+AnN9Jw=="],
@@ -4736,6 +5206,8 @@
"yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
"@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
"@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
@@ -4788,6 +5260,8 @@
"webpack/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+ "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
"@sentry/webpack-plugin/@sentry/bundler-plugin-core/@sentry/cli/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
"@sentry/webpack-plugin/@sentry/bundler-plugin-core/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
diff --git a/db/migrations/0010_damp_lightspeed.sql b/db/migrations/0010_damp_lightspeed.sql
new file mode 100644
index 00000000..f7e19215
--- /dev/null
+++ b/db/migrations/0010_damp_lightspeed.sql
@@ -0,0 +1,2 @@
+ALTER TABLE "users" ADD COLUMN "default_cv_text" text;--> statement-breakpoint
+ALTER TABLE "users" ADD COLUMN "default_cv_filename" varchar(255);
\ No newline at end of file
diff --git a/db/migrations/meta/0010_snapshot.json b/db/migrations/meta/0010_snapshot.json
new file mode 100644
index 00000000..a4d80e00
--- /dev/null
+++ b/db/migrations/meta/0010_snapshot.json
@@ -0,0 +1,2489 @@
+{
+ "id": "18ea816d-9878-4116-aa19-e9271d43ade0",
+ "prevId": "08a6f8d2-f678-40c4-bf09-783a40709664",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.candidate_details": {
+ "name": "candidate_details",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "job_id": {
+ "name": "job_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "phone": {
+ "name": "phone",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "location": {
+ "name": "location",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "current_role": {
+ "name": "current_role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "professional_summary": {
+ "name": "professional_summary",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linkedin_url": {
+ "name": "linkedin_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "portfolio_url": {
+ "name": "portfolio_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "other_urls": {
+ "name": "other_urls",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "candidate_details_job_id_idx": {
+ "name": "candidate_details_job_id_idx",
+ "columns": [
+ {
+ "expression": "job_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "candidate_details_job_id_jobs_id_fk": {
+ "name": "candidate_details_job_id_jobs_id_fk",
+ "tableFrom": "candidate_details",
+ "tableTo": "jobs",
+ "columnsFrom": ["job_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.changelogs": {
+ "name": "changelogs",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "date": {
+ "name": "date",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "title": {
+ "name": "title",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "likes": {
+ "name": "likes",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "changelogs_date_idx": {
+ "name": "changelogs_date_idx",
+ "columns": [
+ {
+ "expression": "date",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.countries": {
+ "name": "countries",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "iso_code": {
+ "name": "iso_code",
+ "type": "varchar(2)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "continent": {
+ "name": "continent",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "countries_iso_code_idx": {
+ "name": "countries_iso_code_idx",
+ "columns": [
+ {
+ "expression": "iso_code",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "countries_isoCode_unique": {
+ "name": "countries_isoCode_unique",
+ "nullsNotDistinct": false,
+ "columns": ["iso_code"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.customisations": {
+ "name": "customisations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "address": {
+ "name": "address",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "phone": {
+ "name": "phone",
+ "type": "varchar(50)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "custom_instructions": {
+ "name": "custom_instructions",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "customisations_user_id_idx": {
+ "name": "customisations_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "customisations_user_id_users_id_fk": {
+ "name": "customisations_user_id_users_id_fk",
+ "tableFrom": "customisations",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.deleted_users": {
+ "name": "deleted_users",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "email_hash": {
+ "name": "email_hash",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "deleted_at": {
+ "name": "deleted_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "clerk_user_id": {
+ "name": "clerk_user_id",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "has_used_free_minutes": {
+ "name": "has_used_free_minutes",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ }
+ },
+ "indexes": {
+ "deleted_users_email_hash_idx": {
+ "name": "deleted_users_email_hash_idx",
+ "columns": [
+ {
+ "expression": "email_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.feature_request_likes": {
+ "name": "feature_request_likes",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "feature_request_id": {
+ "name": "feature_request_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "feature_request_likes_user_id_idx": {
+ "name": "feature_request_likes_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "feature_request_likes_feature_request_id_idx": {
+ "name": "feature_request_likes_feature_request_id_idx",
+ "columns": [
+ {
+ "expression": "feature_request_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "feature_request_likes_user_feature_request_uidx": {
+ "name": "feature_request_likes_user_feature_request_uidx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "feature_request_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "feature_request_likes_user_id_users_id_fk": {
+ "name": "feature_request_likes_user_id_users_id_fk",
+ "tableFrom": "feature_request_likes",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "feature_request_likes_feature_request_id_feature_requests_id_fk": {
+ "name": "feature_request_likes_feature_request_id_feature_requests_id_fk",
+ "tableFrom": "feature_request_likes",
+ "tableTo": "feature_requests",
+ "columnsFrom": ["feature_request_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.feature_requests": {
+ "name": "feature_requests",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "title": {
+ "name": "title",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content": {
+ "name": "content",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "feature_request_status",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'submitted'"
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "feature_requests_user_id_idx": {
+ "name": "feature_requests_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "feature_requests_user_id_users_id_fk": {
+ "name": "feature_requests_user_id_users_id_fk",
+ "tableFrom": "feature_requests",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.file_extraction_cache": {
+ "name": "file_extraction_cache",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "varchar(255)",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "file_hash": {
+ "name": "file_hash",
+ "type": "varchar(64)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "file_type": {
+ "name": "file_type",
+ "type": "varchar(100)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "file_name": {
+ "name": "file_name",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "file_size": {
+ "name": "file_size",
+ "type": "varchar(20)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "extracted_text": {
+ "name": "extracted_text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "extraction_type": {
+ "name": "extraction_type",
+ "type": "varchar(50)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "hit_count": {
+ "name": "hit_count",
+ "type": "varchar(10)",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'0'"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "file_extraction_cache_file_hash_idx": {
+ "name": "file_extraction_cache_file_hash_idx",
+ "columns": [
+ {
+ "expression": "file_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "file_extraction_cache_created_at_idx": {
+ "name": "file_extraction_cache_created_at_idx",
+ "columns": [
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "file_extraction_cache_extraction_type_idx": {
+ "name": "file_extraction_cache_extraction_type_idx",
+ "columns": [
+ {
+ "expression": "extraction_type",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "file_extraction_cache_file_hash_unique": {
+ "name": "file_extraction_cache_file_hash_unique",
+ "nullsNotDistinct": false,
+ "columns": ["file_hash"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.images": {
+ "name": "images",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "prompt_id": {
+ "name": "prompt_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "cloudinary_public_id": {
+ "name": "cloudinary_public_id",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "url": {
+ "name": "url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "format": {
+ "name": "format",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "original_filename": {
+ "name": "original_filename",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ }
+ },
+ "indexes": {
+ "images_prompt_id_idx": {
+ "name": "images_prompt_id_idx",
+ "columns": [
+ {
+ "expression": "prompt_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "images_cloudinary_public_id_idx": {
+ "name": "images_cloudinary_public_id_idx",
+ "columns": [
+ {
+ "expression": "cloudinary_public_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "images_prompt_id_users_id_fk": {
+ "name": "images_prompt_id_users_id_fk",
+ "tableFrom": "images",
+ "tableTo": "users",
+ "columnsFrom": ["prompt_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "images_cloudinaryPublicId_unique": {
+ "name": "images_cloudinaryPublicId_unique",
+ "nullsNotDistinct": false,
+ "columns": ["cloudinary_public_id"]
+ },
+ "images_url_unique": {
+ "name": "images_url_unique",
+ "nullsNotDistinct": false,
+ "columns": ["url"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.interviews": {
+ "name": "interviews",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "job_id": {
+ "name": "job_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "custom_session_id": {
+ "name": "custom_session_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "transcript": {
+ "name": "transcript",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "chat_group_id": {
+ "name": "chat_group_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "hume_chat_id": {
+ "name": "hume_chat_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "request_id": {
+ "name": "request_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "duration": {
+ "name": "duration",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 15
+ },
+ "type": {
+ "name": "type",
+ "type": "interview_type",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'behavioral'"
+ },
+ "key_questions": {
+ "name": "key_questions",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "actual_time": {
+ "name": "actual_time",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "interviews_job_id_idx": {
+ "name": "interviews_job_id_idx",
+ "columns": [
+ {
+ "expression": "job_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "interviews_job_created_idx": {
+ "name": "interviews_job_created_idx",
+ "columns": [
+ {
+ "expression": "job_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "created_at",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "interviews_job_id_jobs_id_fk": {
+ "name": "interviews_job_id_jobs_id_fk",
+ "tableFrom": "interviews",
+ "tableTo": "jobs",
+ "columnsFrom": ["job_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.invitations": {
+ "name": "invitations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "email": {
+ "name": "email",
+ "type": "varchar",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "organization_id": {
+ "name": "organization_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "status": {
+ "name": "status",
+ "type": "invitation_status",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "expires_at": {
+ "name": "expires_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "is_deleted": {
+ "name": "is_deleted",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ }
+ },
+ "indexes": {
+ "invitations_organization_id_idx": {
+ "name": "invitations_organization_id_idx",
+ "columns": [
+ {
+ "expression": "organization_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "invitations_email_idx": {
+ "name": "invitations_email_idx",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "invitations_status_idx": {
+ "name": "invitations_status_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "invitations_organization_id_organizations_id_fk": {
+ "name": "invitations_organization_id_organizations_id_fk",
+ "tableFrom": "invitations",
+ "tableTo": "organizations",
+ "columnsFrom": ["organization_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.job_descriptions": {
+ "name": "job_descriptions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "job_id": {
+ "name": "job_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "company": {
+ "name": "company",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "required_qualifications": {
+ "name": "required_qualifications",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "required_experience": {
+ "name": "required_experience",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "required_skills": {
+ "name": "required_skills",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "preferred_qualifications": {
+ "name": "preferred_qualifications",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "preferred_skills": {
+ "name": "preferred_skills",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "responsibilities": {
+ "name": "responsibilities",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "benefits": {
+ "name": "benefits",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "location": {
+ "name": "location",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "employment_type": {
+ "name": "employment_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "seniority": {
+ "name": "seniority",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "industry": {
+ "name": "industry",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "key_technologies": {
+ "name": "key_technologies",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "keywords": {
+ "name": "keywords",
+ "type": "text[]",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "job_descriptions_job_id_idx": {
+ "name": "job_descriptions_job_id_idx",
+ "columns": [
+ {
+ "expression": "job_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "job_descriptions_job_id_jobs_id_fk": {
+ "name": "job_descriptions_job_id_jobs_id_fk",
+ "tableFrom": "job_descriptions",
+ "tableTo": "jobs",
+ "columnsFrom": ["job_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.jobs": {
+ "name": "jobs",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "submitted_cv_text": {
+ "name": "submitted_cv_text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "job_description_text": {
+ "name": "job_description_text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "additional_info": {
+ "name": "additional_info",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "candidate": {
+ "name": "candidate",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "company": {
+ "name": "company",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "role": {
+ "name": "role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "completed": {
+ "name": "completed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "jobs_user_id_idx": {
+ "name": "jobs_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "jobs_user_id_users_id_fk": {
+ "name": "jobs_user_id_users_id_fk",
+ "tableFrom": "jobs",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.organization_members": {
+ "name": "organization_members",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "organization_id": {
+ "name": "organization_id",
+ "type": "serial",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "serial",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "role": {
+ "name": "role",
+ "type": "varchar(50)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_active": {
+ "name": "is_active",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "organization_members_organization_id_idx": {
+ "name": "organization_members_organization_id_idx",
+ "columns": [
+ {
+ "expression": "organization_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "organization_members_user_id_idx": {
+ "name": "organization_members_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "organization_members_active_idx": {
+ "name": "organization_members_active_idx",
+ "columns": [
+ {
+ "expression": "organization_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "is_active",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "organization_members_organization_id_organizations_id_fk": {
+ "name": "organization_members_organization_id_organizations_id_fk",
+ "tableFrom": "organization_members",
+ "tableTo": "organizations",
+ "columnsFrom": ["organization_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ },
+ "organization_members_user_id_users_id_fk": {
+ "name": "organization_members_user_id_users_id_fk",
+ "tableFrom": "organization_members",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.organizations": {
+ "name": "organizations",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "description": {
+ "name": "description",
+ "type": "varchar(1000)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "website": {
+ "name": "website",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "industry": {
+ "name": "industry",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "size": {
+ "name": "size",
+ "type": "varchar(50)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "is_deleted": {
+ "name": "is_deleted",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "organizations_name_idx": {
+ "name": "organizations_name_idx",
+ "columns": [
+ {
+ "expression": "name",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "organizations_is_deleted_idx": {
+ "name": "organizations_is_deleted_idx",
+ "columns": [
+ {
+ "expression": "is_deleted",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.page_settings": {
+ "name": "page_settings",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "report_id": {
+ "name": "report_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "paper_size": {
+ "name": "paper_size",
+ "type": "paper_size",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "heading_font": {
+ "name": "heading_font",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "body_font": {
+ "name": "body_font",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "margin_size": {
+ "name": "margin_size",
+ "type": "margin_size",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "layout": {
+ "name": "layout",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "page_settings_report_id_idx": {
+ "name": "page_settings_report_id_idx",
+ "columns": [
+ {
+ "expression": "report_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "page_settings_report_id_reports_id_fk": {
+ "name": "page_settings_report_id_reports_id_fk",
+ "tableFrom": "page_settings",
+ "tableTo": "reports",
+ "columnsFrom": ["report_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.question_analysis": {
+ "name": "question_analysis",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "report_id": {
+ "name": "report_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "question": {
+ "name": "question",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "analysis": {
+ "name": "analysis",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "score": {
+ "name": "score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "is_key_question": {
+ "name": "is_key_question",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "question_analysis_report_id_idx": {
+ "name": "question_analysis_report_id_idx",
+ "columns": [
+ {
+ "expression": "report_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "question_analysis_report_id_reports_id_fk": {
+ "name": "question_analysis_report_id_reports_id_fk",
+ "tableFrom": "question_analysis",
+ "tableTo": "reports",
+ "columnsFrom": ["report_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reports": {
+ "name": "reports",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "interview_id": {
+ "name": "interview_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "general_assessment": {
+ "name": "general_assessment",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "overall_score": {
+ "name": "overall_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "fitness_for_role": {
+ "name": "fitness_for_role",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "''"
+ },
+ "fitness_for_role_score": {
+ "name": "fitness_for_role_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "speaking_skills": {
+ "name": "speaking_skills",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "speaking_skills_score": {
+ "name": "speaking_skills_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "communication_skills": {
+ "name": "communication_skills",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "communication_skills_score": {
+ "name": "communication_skills_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problem_solving_skills": {
+ "name": "problem_solving_skills",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "problem_solving_skills_score": {
+ "name": "problem_solving_skills_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "technical_knowledge": {
+ "name": "technical_knowledge",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "technical_knowledge_score": {
+ "name": "technical_knowledge_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "teamwork": {
+ "name": "teamwork",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "teamwork_score": {
+ "name": "teamwork_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "adaptability": {
+ "name": "adaptability",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "adaptability_score": {
+ "name": "adaptability_score",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "areas_of_strength": {
+ "name": "areas_of_strength",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "areas_for_improvement": {
+ "name": "areas_for_improvement",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "interview_audio_url": {
+ "name": "interview_audio_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "actionable_next_steps": {
+ "name": "actionable_next_steps",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "is_public": {
+ "name": "is_public",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "is_completed": {
+ "name": "is_completed",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "reports_interview_id_idx": {
+ "name": "reports_interview_id_idx",
+ "columns": [
+ {
+ "expression": "interview_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "reports_is_completed_idx": {
+ "name": "reports_is_completed_idx",
+ "columns": [
+ {
+ "expression": "is_completed",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "reports_interview_id_interviews_id_fk": {
+ "name": "reports_interview_id_interviews_id_fk",
+ "tableFrom": "reports",
+ "tableTo": "interviews",
+ "columnsFrom": ["interview_id"],
+ "columnsTo": ["id"],
+ "onDelete": "cascade",
+ "onUpdate": "cascade"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.reviews": {
+ "name": "reviews",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "user_id": {
+ "name": "user_id",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "name": {
+ "name": "name",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "rating": {
+ "name": "rating",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "comment": {
+ "name": "comment",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "image_url": {
+ "name": "image_url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "twitter_username": {
+ "name": "twitter_username",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "linkedin_url": {
+ "name": "linkedin_url",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "show_on_landing": {
+ "name": "show_on_landing",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "is_published": {
+ "name": "is_published",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": false
+ },
+ "processed_at": {
+ "name": "processed_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "reviews_user_id_idx": {
+ "name": "reviews_user_id_idx",
+ "columns": [
+ {
+ "expression": "user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "reviews_show_on_landing_idx": {
+ "name": "reviews_show_on_landing_idx",
+ "columns": [
+ {
+ "expression": "show_on_landing",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "reviews_is_published_idx": {
+ "name": "reviews_is_published_idx",
+ "columns": [
+ {
+ "expression": "is_published",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "reviews_user_id_users_id_fk": {
+ "name": "reviews_user_id_users_id_fk",
+ "tableFrom": "reviews",
+ "tableTo": "users",
+ "columnsFrom": ["user_id"],
+ "columnsTo": ["id"],
+ "onDelete": "no action",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.statistics": {
+ "name": "statistics",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "interviews_count": {
+ "name": "interviews_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "minutes_count": {
+ "name": "minutes_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "users_count": {
+ "name": "users_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {},
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.users": {
+ "name": "users",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "serial",
+ "primaryKey": true,
+ "notNull": true
+ },
+ "username": {
+ "name": "username",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "firstname": {
+ "name": "firstname",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "lastname": {
+ "name": "lastname",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "role": {
+ "name": "role",
+ "type": "role",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'user'"
+ },
+ "stripe_customer_id": {
+ "name": "stripe_customer_id",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stripe_subscription_id": {
+ "name": "stripe_subscription_id",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stripe_subscription_interval": {
+ "name": "stripe_subscription_interval",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stripe_price_id": {
+ "name": "stripe_price_id",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "stripe_plan_id": {
+ "name": "stripe_plan_id",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "trial_used": {
+ "name": "trial_used",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "is_deleted": {
+ "name": "is_deleted",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": false,
+ "default": false
+ },
+ "clerk_user_id": {
+ "name": "clerk_user_id",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "email": {
+ "name": "email",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "minutes": {
+ "name": "minutes",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 2
+ },
+ "default_cv_text": {
+ "name": "default_cv_text",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "default_cv_filename": {
+ "name": "default_cv_filename",
+ "type": "varchar(255)",
+ "primaryKey": false,
+ "notNull": false
+ }
+ },
+ "indexes": {
+ "users_username_idx": {
+ "name": "users_username_idx",
+ "columns": [
+ {
+ "expression": "username",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "users_stripe_customer_id_idx": {
+ "name": "users_stripe_customer_id_idx",
+ "columns": [
+ {
+ "expression": "stripe_customer_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "users_email_idx": {
+ "name": "users_email_idx",
+ "columns": [
+ {
+ "expression": "email",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "users_clerk_user_id_idx": {
+ "name": "users_clerk_user_id_idx",
+ "columns": [
+ {
+ "expression": "clerk_user_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {
+ "users_username_unique": {
+ "name": "users_username_unique",
+ "nullsNotDistinct": false,
+ "columns": ["username"]
+ },
+ "users_email_unique": {
+ "name": "users_email_unique",
+ "nullsNotDistinct": false,
+ "columns": ["email"]
+ }
+ },
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {
+ "public.feature_request_status": {
+ "name": "feature_request_status",
+ "schema": "public",
+ "values": ["submitted", "triaged", "in_progress", "completed", "declined"]
+ },
+ "public.interview_type": {
+ "name": "interview_type",
+ "schema": "public",
+ "values": [
+ "behavioral",
+ "situational",
+ "technical",
+ "case_study",
+ "competency_based",
+ "stress",
+ "cultural_fit"
+ ]
+ },
+ "public.invitation_status": {
+ "name": "invitation_status",
+ "schema": "public",
+ "values": ["pending", "accepted", "rejected", "expired", "revoked"]
+ },
+ "public.margin_size": {
+ "name": "margin_size",
+ "schema": "public",
+ "values": ["Normal", "Narrow", "Wide"]
+ },
+ "public.paper_size": {
+ "name": "paper_size",
+ "schema": "public",
+ "values": ["A4", "Letter", "Legal"]
+ },
+ "public.role": {
+ "name": "role",
+ "schema": "public",
+ "values": ["user", "admin", "recruiter"]
+ }
+ },
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
diff --git a/db/migrations/meta/_journal.json b/db/migrations/meta/_journal.json
index 4e01264d..e78bf000 100644
--- a/db/migrations/meta/_journal.json
+++ b/db/migrations/meta/_journal.json
@@ -71,6 +71,13 @@
"when": 1760290327482,
"tag": "0009_first_hellfire_club",
"breakpoints": true
+ },
+ {
+ "idx": 10,
+ "version": "7",
+ "when": 1772761966652,
+ "tag": "0010_damp_lightspeed",
+ "breakpoints": true
}
]
}
diff --git a/db/schema/users.ts b/db/schema/users.ts
index 9db02a92..d330ee56 100644
--- a/db/schema/users.ts
+++ b/db/schema/users.ts
@@ -32,6 +32,8 @@ export const users = pgTable(
.$default(() => new Date())
.notNull(),
minutes: p.integer().notNull().default(2),
+ defaultCvText: p.text(),
+ defaultCvFilename: p.varchar({ length: 255 }),
}),
(users) => [
uniqueIndex("users_username_idx").on(users.username),
diff --git a/lib/ai/__tests__/extract-candidate-details.test.ts b/lib/ai/__tests__/extract-candidate-details.test.ts
index 6ba09745..91345f84 100644
--- a/lib/ai/__tests__/extract-candidate-details.test.ts
+++ b/lib/ai/__tests__/extract-candidate-details.test.ts
@@ -45,8 +45,8 @@ vi.mock("ai", () => ({
otherUrls: ["https://github.com/johnsmith"],
},
usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
+ inputTokens: mockUsage.prompt_tokens,
+ outputTokens: mockUsage.completion_tokens,
totalTokens: mockUsage.total_tokens,
},
};
diff --git a/lib/ai/__tests__/extract-job-description.test.ts b/lib/ai/__tests__/extract-job-description.test.ts
index 59b74bb8..c88f8dcf 100644
--- a/lib/ai/__tests__/extract-job-description.test.ts
+++ b/lib/ai/__tests__/extract-job-description.test.ts
@@ -61,8 +61,8 @@ vi.mock("ai", () => {
keyTechnologies: ["React", "TypeScript", "Node.js"],
},
usage: {
- promptTokens: 100,
- completionTokens: 200,
+ inputTokens: 100,
+ outputTokens: 200,
},
}),
};
diff --git a/lib/ai/__tests__/extract-original-cv.test.ts b/lib/ai/__tests__/extract-original-cv.test.ts
index 417c8f1d..a2b22507 100644
--- a/lib/ai/__tests__/extract-original-cv.test.ts
+++ b/lib/ai/__tests__/extract-original-cv.test.ts
@@ -98,8 +98,8 @@ vi.mock("ai", () => ({
],
},
usage: {
- promptTokens: 100,
- completionTokens: 200,
+ inputTokens: 100,
+ outputTokens: 200,
},
}),
}));
diff --git a/lib/ai/__tests__/test-utils.ts b/lib/ai/__tests__/test-utils.ts
index 60b9b5f1..4149f8ff 100644
--- a/lib/ai/__tests__/test-utils.ts
+++ b/lib/ai/__tests__/test-utils.ts
@@ -1,4 +1,4 @@
-import type { LanguageModelV1 } from "@ai-sdk/provider";
+import type { LanguageModel } from "ai";
import type { CompletionUsage } from "openai/resources/completions";
export const mockUsage: CompletionUsage = {
@@ -7,19 +7,20 @@ export const mockUsage: CompletionUsage = {
total_tokens: 150,
};
-const baseModel: LanguageModelV1 = {
- specificationVersion: "v1" as const,
+// In AI SDK v6, LanguageModel is a complex interface (LanguageModelV3).
+// For tests that mock generateText/generateObject at the module level,
+// we only need a token model reference — the actual doGenerate is never called.
+const baseModelObj = {
+ specificationVersion: "v3" as const,
provider: "openai" as const,
modelId: "gpt-4",
defaultObjectGenerationMode: "json" as const,
- doGenerate: async (
- _options: Parameters[0]
- ): Promise>> => ({
+ doGenerate: async () => ({
text: "",
finishReason: "stop",
usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
+ inputTokens: mockUsage.prompt_tokens,
+ outputTokens: mockUsage.completion_tokens,
},
rawCall: { rawPrompt: null, rawSettings: {} },
}),
@@ -29,32 +30,44 @@ const baseModel: LanguageModelV1 = {
};
export const mockEvaluateModel = {
- ...baseModel,
- doGenerate: async (options: Parameters[0]) => ({
- ...(await baseModel.doGenerate(options)),
+ ...baseModelObj,
+ doGenerate: async () => ({
text: JSON.stringify(mockEvaluation),
+ finishReason: "stop",
+ usage: {
+ inputTokens: mockUsage.prompt_tokens,
+ outputTokens: mockUsage.completion_tokens,
+ },
+ rawCall: { rawPrompt: null, rawSettings: {} },
}),
-};
+} as unknown as LanguageModel;
export const mockOptimiseModel = {
- ...baseModel,
- doGenerate: async (options: Parameters[0]) => ({
- ...(await baseModel.doGenerate(options)),
+ ...baseModelObj,
+ doGenerate: async () => ({
text: JSON.stringify(mockCV),
+ finishReason: "stop",
+ usage: {
+ inputTokens: mockUsage.prompt_tokens,
+ outputTokens: mockUsage.completion_tokens,
+ },
+ rawCall: { rawPrompt: null, rawSettings: {} },
}),
-};
+} as unknown as LanguageModel;
export const mockCoverLetterModel = {
- ...baseModel,
- doGenerate: async (options: any) => {
- const result = await baseModel.doGenerate(options);
- return {
- ...result,
- text: JSON.stringify(mockCoverLetter),
- object: mockCoverLetter,
- };
- },
-};
+ ...baseModelObj,
+ doGenerate: async () => ({
+ text: JSON.stringify(mockCoverLetter),
+ object: mockCoverLetter,
+ finishReason: "stop",
+ usage: {
+ inputTokens: mockUsage.prompt_tokens,
+ outputTokens: mockUsage.completion_tokens,
+ },
+ rawCall: { rawPrompt: null, rawSettings: {} },
+ }),
+} as unknown as LanguageModel;
// Mock data
export const mockCV = {
diff --git a/lib/ai/__tests__/utils.test.ts b/lib/ai/__tests__/utils.test.ts
index af173bd5..3e1afc54 100644
--- a/lib/ai/__tests__/utils.test.ts
+++ b/lib/ai/__tests__/utils.test.ts
@@ -1,5 +1,4 @@
-import type { LanguageModelV1, LanguageModelV1FinishReason } from "@ai-sdk/provider";
-import type { GenerateObjectResult, GenerateTextResult, JSONValue } from "ai";
+import type { LanguageModel } from "ai";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { z } from "zod";
import { logger } from "~/lib/logger";
@@ -29,50 +28,79 @@ vi.mock("ai", () => ({
generateObject: vi.fn(),
}));
-describe("twoStepAIProcess", () => {
- const mockSchema = z.object({
- field: z.string(),
- });
+// AI SDK v6 mock helpers — use `as any` since we mock at the module level
+const mockModel = {
+ specificationVersion: "v3",
+ provider: "openai",
+ modelId: "gpt-5-mini",
+} as unknown as LanguageModel;
- const mockInitialModel: LanguageModelV1 = {
- specificationVersion: "v1" as const,
- provider: "openai" as const,
- modelId: "o4-mini",
- defaultObjectGenerationMode: "json" as const,
- doGenerate: async () => ({
- text: "",
- finishReason: "stop" as LanguageModelV1FinishReason,
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- rawCall: { rawPrompt: null, rawSettings: {} },
- }),
- doStream: async () => {
- throw new Error("Not implemented");
+function mockUsageV6() {
+ return {
+ inputTokens: mockUsage.prompt_tokens,
+ outputTokens: mockUsage.completion_tokens,
+ totalTokens: mockUsage.total_tokens,
+ inputTokenDetails: {
+ noCacheTokens: undefined,
+ cacheReadTokens: undefined,
+ cacheWriteTokens: undefined,
},
+ outputTokenDetails: { reasoningTokens: undefined },
};
+}
- const mockGpt4oMini: LanguageModelV1 = {
- specificationVersion: "v1" as const,
- provider: "openai" as const,
- modelId: "o4-mini",
- defaultObjectGenerationMode: "json" as const,
- doGenerate: async () => ({
- text: "",
- finishReason: "stop" as LanguageModelV1FinishReason,
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- rawCall: { rawPrompt: null, rawSettings: {} },
- }),
- doStream: async () => {
- throw new Error("Not implemented");
+function mockTextResult(overrides: Record = {}) {
+ return {
+ text: "Generated text",
+ reasoning: [],
+ sources: [],
+ files: [],
+ experimental_output: null,
+ toolCalls: [],
+ reasoningDetails: [],
+ finishReason: "stop",
+ usage: mockUsageV6(),
+ request: {},
+ response: {
+ id: "res_1",
+ timestamp: new Date(),
+ modelId: "gpt-5-mini",
+ messages: [],
},
- };
+ warnings: [],
+ toolResults: [],
+ steps: [],
+ logprobs: undefined,
+ providerMetadata: {},
+ experimental_providerMetadata: {},
+ ...overrides,
+ } as any;
+}
+
+function mockObjectResult(object: unknown, overrides: Record = {}) {
+ return {
+ object,
+ finishReason: "stop",
+ warnings: [],
+ request: {},
+ response: {
+ id: "res_2",
+ timestamp: new Date(),
+ modelId: "gpt-5-mini",
+ },
+ usage: mockUsageV6(),
+ logprobs: undefined,
+ providerMetadata: {},
+ experimental_providerMetadata: {},
+ toJsonResponse: () => new Response(JSON.stringify(object)),
+ ...overrides,
+ } as any;
+}
+
+describe("twoStepAIProcess", () => {
+ const mockSchema = z.object({
+ field: z.string(),
+ });
beforeEach(() => {
vi.clearAllMocks();
@@ -82,62 +110,12 @@ describe("twoStepAIProcess", () => {
const { generateText, generateObject } = await import("ai");
const { openai } = await import("@ai-sdk/openai");
- const mockTextResult: GenerateTextResult, JSONValue> = {
- text: "Generated text",
- reasoning: "",
- sources: [],
- files: [],
- experimental_output: null,
- toolCalls: [],
- reasoningDetails: [],
- finishReason: "stop" as LanguageModelV1FinishReason,
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- request: {},
- response: {
- id: "res_1",
- timestamp: new Date(),
- modelId: "o4-mini",
- messages: [],
- },
- warnings: [],
- toolResults: [],
- steps: [],
- logprobs: undefined,
- providerMetadata: {},
- experimental_providerMetadata: {},
- };
-
- const mockObjectResult: GenerateObjectResult = {
- object: { field: "Structured output" },
- finishReason: "stop" as LanguageModelV1FinishReason,
- warnings: [],
- request: {},
- response: {
- id: "res_2",
- timestamp: new Date(),
- modelId: "o4-mini",
- },
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- logprobs: undefined,
- providerMetadata: {},
- experimental_providerMetadata: {},
- toJsonResponse: () => new Response(JSON.stringify({ field: "Structured output" })),
- };
-
- vi.mocked(generateText).mockResolvedValue(mockTextResult);
- vi.mocked(openai).mockReturnValue(mockGpt4oMini);
- vi.mocked(generateObject).mockResolvedValue(mockObjectResult);
+ vi.mocked(generateText).mockResolvedValue(mockTextResult());
+ vi.mocked(openai).mockReturnValue(mockModel as any);
+ vi.mocked(generateObject).mockResolvedValue(mockObjectResult({ field: "Structured output" }));
const result = await twoStepAIProcess({
- initialModel: mockInitialModel,
+ initialModel: mockModel,
systemPrompt: "System prompt",
userPrompt: "User prompt",
schema: mockSchema,
@@ -161,7 +139,7 @@ describe("twoStepAIProcess", () => {
vi.mocked(generateText).mockRejectedValue(new Error("Text generation failed"));
const result = await twoStepAIProcess({
- initialModel: mockInitialModel,
+ initialModel: mockModel,
systemPrompt: "System prompt",
userPrompt: "User prompt",
schema: mockSchema,
@@ -190,41 +168,12 @@ describe("twoStepAIProcess", () => {
const { generateText, generateObject } = await import("ai");
const { openai } = await import("@ai-sdk/openai");
- const mockTextResult: GenerateTextResult, JSONValue> = {
- text: "Generated text",
- reasoning: "",
- sources: [],
- files: [],
- experimental_output: null,
- toolCalls: [],
- reasoningDetails: [],
- finishReason: "stop" as LanguageModelV1FinishReason,
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- request: {},
- response: {
- id: "res_3",
- timestamp: new Date(),
- modelId: "o4-mini",
- messages: [],
- },
- warnings: [],
- toolResults: [],
- steps: [],
- logprobs: undefined,
- providerMetadata: {},
- experimental_providerMetadata: {},
- };
-
- vi.mocked(generateText).mockResolvedValue(mockTextResult);
- vi.mocked(openai).mockReturnValue(mockGpt4oMini);
+ vi.mocked(generateText).mockResolvedValue(mockTextResult());
+ vi.mocked(openai).mockReturnValue(mockModel as any);
vi.mocked(generateObject).mockRejectedValue(new Error("Structured output generation failed"));
const result = await twoStepAIProcess({
- initialModel: mockInitialModel,
+ initialModel: mockModel,
systemPrompt: "System prompt",
userPrompt: "User prompt",
schema: mockSchema,
@@ -253,62 +202,12 @@ describe("twoStepAIProcess", () => {
const { generateText, generateObject } = await import("ai");
const { openai } = await import("@ai-sdk/openai");
- const mockTextResult: GenerateTextResult, JSONValue> = {
- text: "Generated text",
- reasoning: "",
- sources: [],
- files: [],
- experimental_output: null,
- toolCalls: [],
- reasoningDetails: [],
- finishReason: "stop" as LanguageModelV1FinishReason,
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- request: {},
- response: {
- id: "res_4",
- timestamp: new Date(),
- modelId: "o4-mini",
- messages: [],
- },
- warnings: [],
- toolResults: [],
- steps: [],
- logprobs: undefined,
- providerMetadata: {},
- experimental_providerMetadata: {},
- };
-
- const mockInvalidObjectResult: GenerateObjectResult = {
- object: { wrongField: "Invalid output" },
- finishReason: "stop" as LanguageModelV1FinishReason,
- warnings: [],
- request: {},
- response: {
- id: "res_5",
- timestamp: new Date(),
- modelId: "o4-mini",
- },
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- logprobs: undefined,
- providerMetadata: {},
- experimental_providerMetadata: {},
- toJsonResponse: () => new Response(JSON.stringify({ wrongField: "Invalid output" })),
- };
-
- vi.mocked(generateText).mockResolvedValue(mockTextResult);
- vi.mocked(openai).mockReturnValue(mockGpt4oMini);
- vi.mocked(generateObject).mockResolvedValue(mockInvalidObjectResult);
+ vi.mocked(generateText).mockResolvedValue(mockTextResult());
+ vi.mocked(openai).mockReturnValue(mockModel as any);
+ vi.mocked(generateObject).mockResolvedValue(mockObjectResult({ wrongField: "Invalid output" }));
const result = await twoStepAIProcess({
- initialModel: mockInitialModel,
+ initialModel: mockModel,
systemPrompt: "System prompt",
userPrompt: "User prompt",
schema: mockSchema,
@@ -335,62 +234,12 @@ describe("twoStepAIProcess", () => {
const { generateText, generateObject } = await import("ai");
const { openai } = await import("@ai-sdk/openai");
- const mockTextResult: GenerateTextResult, JSONValue> = {
- text: "Generated text",
- reasoning: "",
- sources: [],
- files: [],
- experimental_output: null,
- toolCalls: [],
- reasoningDetails: [],
- finishReason: "stop" as LanguageModelV1FinishReason,
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- request: {},
- response: {
- id: "res_6",
- timestamp: new Date(),
- modelId: "o4-mini",
- messages: [],
- },
- warnings: [],
- toolResults: [],
- steps: [],
- logprobs: undefined,
- providerMetadata: {},
- experimental_providerMetadata: {},
- };
-
- const mockObjectResult: GenerateObjectResult = {
- object: { field: "Structured output" },
- finishReason: "stop" as LanguageModelV1FinishReason,
- warnings: [],
- request: {},
- response: {
- id: "res_7",
- timestamp: new Date(),
- modelId: "o4-mini",
- },
- usage: {
- promptTokens: mockUsage.prompt_tokens,
- completionTokens: mockUsage.completion_tokens,
- totalTokens: mockUsage.total_tokens,
- },
- logprobs: undefined,
- providerMetadata: {},
- experimental_providerMetadata: {},
- toJsonResponse: () => new Response(JSON.stringify({ field: "Structured output" })),
- };
-
- vi.mocked(generateText).mockResolvedValue(mockTextResult);
- vi.mocked(openai).mockReturnValue(mockGpt4oMini);
- vi.mocked(generateObject).mockResolvedValue(mockObjectResult);
+ vi.mocked(generateText).mockResolvedValue(mockTextResult());
+ vi.mocked(openai).mockReturnValue(mockModel as any);
+ vi.mocked(generateObject).mockResolvedValue(mockObjectResult({ field: "Structured output" }));
await twoStepAIProcess({
- initialModel: mockInitialModel,
+ initialModel: mockModel,
systemPrompt: "System prompt",
userPrompt: "User prompt",
schema: mockSchema,
diff --git a/lib/ai/analyse-interview/sections/actionable-next-steps.ts b/lib/ai/analyse-interview/sections/actionable-next-steps.ts
index ad6d4971..1b1a36a4 100644
--- a/lib/ai/analyse-interview/sections/actionable-next-steps.ts
+++ b/lib/ai/analyse-interview/sections/actionable-next-steps.ts
@@ -109,9 +109,9 @@ Remember that your recommendations should be practical, achievable, and directly
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/adaptability.ts b/lib/ai/analyse-interview/sections/adaptability.ts
index d4247675..545b0457 100644
--- a/lib/ai/analyse-interview/sections/adaptability.ts
+++ b/lib/ai/analyse-interview/sections/adaptability.ts
@@ -113,9 +113,9 @@ Remember to reference specific examples from the transcript for each point in yo
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/areas-for-improvement.ts b/lib/ai/analyse-interview/sections/areas-for-improvement.ts
index dfe63dd0..5174ea72 100644
--- a/lib/ai/analyse-interview/sections/areas-for-improvement.ts
+++ b/lib/ai/analyse-interview/sections/areas-for-improvement.ts
@@ -104,9 +104,9 @@ Remember to maintain the principles of Radical Candor - be honest about developm
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/areas-of-strength.ts b/lib/ai/analyse-interview/sections/areas-of-strength.ts
index 899374db..b210786b 100644
--- a/lib/ai/analyse-interview/sections/areas-of-strength.ts
+++ b/lib/ai/analyse-interview/sections/areas-of-strength.ts
@@ -104,9 +104,9 @@ Remember this section will be one of the most valuable for the candidate. Be spe
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/communication-skills.ts b/lib/ai/analyse-interview/sections/communication-skills.ts
index 8b36377a..5ce95a4f 100644
--- a/lib/ai/analyse-interview/sections/communication-skills.ts
+++ b/lib/ai/analyse-interview/sections/communication-skills.ts
@@ -113,9 +113,9 @@ Remember to reference specific examples from the transcript for each point in yo
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/fitness-for-role.ts b/lib/ai/analyse-interview/sections/fitness-for-role.ts
index 01a3fc4a..ab5d3374 100644
--- a/lib/ai/analyse-interview/sections/fitness-for-role.ts
+++ b/lib/ai/analyse-interview/sections/fitness-for-role.ts
@@ -114,9 +114,9 @@ Your assessment should result in a clear, evidence-based evaluation of how well
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/general-assessment.ts b/lib/ai/analyse-interview/sections/general-assessment.ts
index 8fdc968b..f22f3adc 100644
--- a/lib/ai/analyse-interview/sections/general-assessment.ts
+++ b/lib/ai/analyse-interview/sections/general-assessment.ts
@@ -147,9 +147,9 @@ Remember: This general assessment will serve as the executive summary of the ent
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/problem-solving-skills.ts b/lib/ai/analyse-interview/sections/problem-solving-skills.ts
index 99cfa125..d3bf14e2 100644
--- a/lib/ai/analyse-interview/sections/problem-solving-skills.ts
+++ b/lib/ai/analyse-interview/sections/problem-solving-skills.ts
@@ -109,9 +109,9 @@ Remember to reference specific examples from the transcript for each point in yo
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/question-analysis.ts b/lib/ai/analyse-interview/sections/question-analysis.ts
index 01c17079..e52122d1 100644
--- a/lib/ai/analyse-interview/sections/question-analysis.ts
+++ b/lib/ai/analyse-interview/sections/question-analysis.ts
@@ -77,9 +77,9 @@ FORMAT REQUIREMENTS:
return {
data: result,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/speaking-skills.ts b/lib/ai/analyse-interview/sections/speaking-skills.ts
index 7a2c9c7d..c6f67fc9 100644
--- a/lib/ai/analyse-interview/sections/speaking-skills.ts
+++ b/lib/ai/analyse-interview/sections/speaking-skills.ts
@@ -104,9 +104,9 @@ Remember to reference specific examples from the transcript for each point in yo
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/teamwork.ts b/lib/ai/analyse-interview/sections/teamwork.ts
index 81142680..a5c93fe4 100644
--- a/lib/ai/analyse-interview/sections/teamwork.ts
+++ b/lib/ai/analyse-interview/sections/teamwork.ts
@@ -108,9 +108,9 @@ Remember to reference specific examples from the transcript for each point in yo
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/sections/technical-knowledge.ts b/lib/ai/analyse-interview/sections/technical-knowledge.ts
index 9dc47186..f424e196 100644
--- a/lib/ai/analyse-interview/sections/technical-knowledge.ts
+++ b/lib/ai/analyse-interview/sections/technical-knowledge.ts
@@ -113,9 +113,9 @@ Remember to reference specific examples from the transcript for each point in yo
return {
data: structuredOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/analyse-interview/types.ts b/lib/ai/analyse-interview/types.ts
index 77f415b9..31101b58 100644
--- a/lib/ai/analyse-interview/types.ts
+++ b/lib/ai/analyse-interview/types.ts
@@ -1,4 +1,4 @@
-import type { LanguageModelV1 } from "@ai-sdk/provider";
+import type { LanguageModel } from "ai";
import type { CompletionUsage } from "openai/resources/completions.mjs";
import type { z } from "zod";
import type { Interview } from "~/db/schema";
@@ -23,7 +23,7 @@ export interface BaseAnalyzeParams {
/**
* The language model to use for analysis
*/
- model: LanguageModelV1;
+ model: LanguageModel;
/**
* The parsed interview transcript
*/
@@ -65,7 +65,7 @@ export interface AnalyseInterviewParams {
/**
* The language model to use for analysis
*/
- model: LanguageModelV1;
+ model: LanguageModel;
/**
* The job object containing basic information
*/
diff --git a/lib/ai/extract-candidate-details.ts b/lib/ai/extract-candidate-details.ts
index f491628a..43578feb 100644
--- a/lib/ai/extract-candidate-details.ts
+++ b/lib/ai/extract-candidate-details.ts
@@ -1,4 +1,4 @@
-import type { LanguageModelV1 } from "@ai-sdk/provider";
+import type { LanguageModel } from "ai";
import { generateObject } from "ai";
import type { CompletionUsage } from "openai/resources/completions.mjs";
import { z } from "zod";
@@ -34,7 +34,7 @@ const CandidateDetailsSchema = z.object({
export type CandidateDetails = z.infer;
export interface ExtractCandidateDetailsParams {
- model: LanguageModelV1;
+ model: LanguageModel;
submittedCVText: string;
userEmail?: string;
}
@@ -108,9 +108,9 @@ export async function extractCandidateDetails({
return {
data: validatedOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/extract-from-document.ts b/lib/ai/extract-from-document.ts
index 39ea9840..7a41c8b8 100644
--- a/lib/ai/extract-from-document.ts
+++ b/lib/ai/extract-from-document.ts
@@ -1,10 +1,10 @@
-import type { LanguageModelV1 } from "@ai-sdk/provider";
import * as Sentry from "@sentry/nextjs";
-import { type LanguageModelUsage, generateText } from "ai";
+import type { LanguageModel, LanguageModelUsage } from "ai";
+import { generateText } from "ai";
import { logger } from "~/lib/logger";
export interface ExtractFromDocumentParams {
- model: LanguageModelV1;
+ model: LanguageModel;
fileBuffer: Buffer;
fileType: string;
userEmail?: string;
@@ -95,20 +95,17 @@ export async function extractFromDocument({
mimeType = "image/jpeg";
}
- // Create the data URL
- const dataUrl = `data:${mimeType};base64,${base64Data}`;
-
// Use generateText for text extraction with vision model
// For images, use the "image" type, for PDFs use "file" type
const contentPart = mimeType.startsWith("image/")
? {
type: "image" as const,
- image: dataUrl,
+ image: base64Data,
}
: {
type: "file" as const,
- data: dataUrl,
- mimeType: mimeType,
+ data: base64Data,
+ mediaType: mimeType,
};
const result = await generateText({
@@ -125,7 +122,7 @@ export async function extractFromDocument({
],
},
],
- maxTokens: 8000,
+ maxOutputTokens: 8000,
temperature: 0.1, // Low temperature for accurate extraction
});
diff --git a/lib/ai/extract-job-description.ts b/lib/ai/extract-job-description.ts
index 96c4fae8..3057cac3 100644
--- a/lib/ai/extract-job-description.ts
+++ b/lib/ai/extract-job-description.ts
@@ -1,4 +1,4 @@
-import type { LanguageModelV1 } from "@ai-sdk/provider";
+import type { LanguageModel } from "ai";
import { generateObject } from "ai";
import { createInsertSchema } from "drizzle-zod";
import type { CompletionUsage } from "openai/resources/completions.mjs";
@@ -72,7 +72,7 @@ export const StructuredJobDescriptionSchema = JobDescriptionSchema.extend({
});
export interface ExtractJobDescriptionParams {
- model: LanguageModelV1;
+ model: LanguageModel;
jobDescriptionText: string;
userEmail?: string;
}
@@ -182,9 +182,9 @@ export async function extractJobDescription({
return {
data: validatedOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/extract-key-questions.ts b/lib/ai/extract-key-questions.ts
index 44ffc721..14ddbdb6 100644
--- a/lib/ai/extract-key-questions.ts
+++ b/lib/ai/extract-key-questions.ts
@@ -1,6 +1,6 @@
import type { InterviewTypeDefinition } from "@/fixtures/interview-types";
import { interviewTypes } from "@/fixtures/interview-types";
-import type { LanguageModelV1 } from "@ai-sdk/provider";
+import type { LanguageModel } from "ai";
import { generateObject } from "ai";
import type { CompletionUsage } from "openai/resources/completions.mjs";
import { z } from "zod";
@@ -16,7 +16,7 @@ const KeyQuestionsSchema = z.object({
});
export interface ExtractKeyQuestionsParams {
- model: LanguageModelV1;
+ model: LanguageModel;
jobDescriptionData: JobDescription;
interviewType: string;
userEmail?: string;
@@ -116,9 +116,9 @@ export async function extractKeyQuestions({
return {
data: validatedOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/extract-original-cv.ts b/lib/ai/extract-original-cv.ts
index b6b61d8b..8022c1d3 100644
--- a/lib/ai/extract-original-cv.ts
+++ b/lib/ai/extract-original-cv.ts
@@ -1,4 +1,4 @@
-import type { LanguageModelV1 } from "@ai-sdk/provider";
+import type { LanguageModel } from "ai";
import { generateObject } from "ai";
import type { CompletionUsage } from "openai/resources/completions.mjs";
import { z } from "zod";
@@ -123,7 +123,7 @@ export const StructuredOriginalCVSchema = ExtendedOriginalCVSchema.extend({
});
export interface ExtractOriginalCVParams {
- model: LanguageModelV1;
+ model: LanguageModel;
submittedCVText: string;
userEmail?: string;
}
@@ -216,9 +216,9 @@ export async function extractOriginalCV({
return {
data: validatedOutput,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/ai/models/config.ts b/lib/ai/models/config.ts
new file mode 100644
index 00000000..1b144f1b
--- /dev/null
+++ b/lib/ai/models/config.ts
@@ -0,0 +1,93 @@
+/**
+ * Model Configuration - Single Source of Truth
+ *
+ * Edit this file to change which models are used for which operations.
+ */
+
+export type ModelProvider = "openai" | "openrouter";
+
+export interface ModelRegistryEntry {
+ provider: ModelProvider;
+ displayName: string;
+ modelId: string;
+}
+
+export type AIOperation =
+ | "extract_from_document"
+ | "extract_candidate_details"
+ | "extract_job_description"
+ | "extract_questions"
+ | "extract_original_cv"
+ | "analyse_interview"
+ | "vet_review"
+ | "recruitment_questions";
+
+// =============================================================================
+// AVAILABLE MODELS
+// =============================================================================
+
+export const MODEL_REGISTRY: Record = {
+ // OpenAI
+ "gpt-5": { provider: "openai", displayName: "GPT-5", modelId: "gpt-5" },
+ "gpt-5-mini": { provider: "openai", displayName: "GPT-5 Mini", modelId: "gpt-5-mini" },
+ "o4-mini": { provider: "openai", displayName: "O4 Mini", modelId: "o4-mini" },
+
+ // OpenRouter
+ "grok-4.1-fast": {
+ provider: "openrouter",
+ displayName: "Grok 4.1 Fast",
+ modelId: "x-ai/grok-4.1-fast",
+ },
+ "grok-4-fast": {
+ provider: "openrouter",
+ displayName: "Grok 4 Fast",
+ modelId: "x-ai/grok-4-fast",
+ },
+ "kimi-k2-thinking": {
+ provider: "openrouter",
+ displayName: "Kimi K2 Thinking",
+ modelId: "moonshotai/kimi-k2-thinking",
+ },
+ "glm-4.7": { provider: "openrouter", displayName: "GLM 4.7", modelId: "zhipu-ai/glm-4.7" },
+ "gemini-3-flash": {
+ provider: "openrouter",
+ displayName: "Gemini 3 Flash",
+ modelId: "google/gemini-3-flash",
+ },
+};
+
+// =============================================================================
+// DEFAULT MODEL PER OPERATION
+// =============================================================================
+
+export const OPERATION_MODELS: Record = {
+ // Extraction — fast structured extraction via OpenRouter
+ extract_from_document: "grok-4.1-fast",
+ extract_candidate_details: "grok-4.1-fast",
+ extract_job_description: "grok-4.1-fast",
+ extract_questions: "grok-4.1-fast",
+ extract_original_cv: "grok-4.1-fast",
+
+ // Analysis — reasoning model
+ analyse_interview: "gpt-5-mini",
+
+ // Review — structured parsing
+ vet_review: "gpt-5-mini",
+
+ // Recruitment — general purpose
+ recruitment_questions: "gpt-5-mini",
+};
+
+// =============================================================================
+// FALLBACK MODELS — used when primary fails (rate limits, service issues)
+// =============================================================================
+
+export const FALLBACK_MODELS: Partial> = {
+ "grok-4.1-fast": "glm-4.7",
+ "grok-4-fast": "glm-4.7",
+ "kimi-k2-thinking": "glm-4.7",
+ "gpt-5": "glm-4.7",
+ "gpt-5-mini": "glm-4.7",
+ "o4-mini": "glm-4.7",
+ "gemini-3-flash": "glm-4.7",
+};
diff --git a/lib/ai/models/index.ts b/lib/ai/models/index.ts
new file mode 100644
index 00000000..3f189b37
--- /dev/null
+++ b/lib/ai/models/index.ts
@@ -0,0 +1,12 @@
+export {
+ type AIOperation,
+ type ModelProvider,
+ type ModelRegistryEntry,
+ MODEL_REGISTRY,
+ OPERATION_MODELS,
+ FALLBACK_MODELS,
+} from "./config";
+
+export { createModelInstance, getProviderInstance } from "./providers";
+
+export { getModelForOperation, getModelWithFallback } from "./service";
diff --git a/lib/ai/models/providers.ts b/lib/ai/models/providers.ts
new file mode 100644
index 00000000..ec735c22
--- /dev/null
+++ b/lib/ai/models/providers.ts
@@ -0,0 +1,74 @@
+/**
+ * Model Providers - SDK instance creation
+ *
+ * Handles creating provider SDK instances and model instances.
+ */
+
+import { createOpenAI } from "@ai-sdk/openai";
+import { createOpenRouter } from "@openrouter/ai-sdk-provider";
+import type { LanguageModel } from "ai";
+import { MODEL_REGISTRY, type ModelProvider } from "./config";
+
+export function getProviderInstance(
+ provider: ModelProvider,
+ userEmail?: string
+): ReturnType | ReturnType {
+ const defaultHeaders = {
+ "Helicone-Auth": `Bearer ${process.env.HELICONE_API_KEY}`,
+ "Helicone-Cache-Enabled": "true",
+ "Helicone-Posthog-Key": process.env.POSTHOG_KEY ?? "",
+ "Helicone-Posthog-Host": "https://eu.posthog.com",
+ };
+
+ const headers = userEmail ? { ...defaultHeaders, "Helicone-User-Id": userEmail } : defaultHeaders;
+
+ const customFetch = (url: string | URL | Request, init?: RequestInit) => {
+ const controller = new AbortController();
+ const timeoutId = setTimeout(() => controller.abort(), 170000);
+ return fetch(url, { ...init, signal: controller.signal }).finally(() =>
+ clearTimeout(timeoutId)
+ );
+ };
+
+ switch (provider) {
+ case "openai":
+ return createOpenAI({
+ apiKey: process.env.OPENAI_API_KEY,
+ baseURL: "https://oai.helicone.ai/v1",
+ headers,
+ fetch: customFetch,
+ });
+
+ case "openrouter":
+ return createOpenRouter({
+ apiKey: process.env.OPENROUTER_API_KEY,
+ headers,
+ fetch: customFetch,
+ });
+
+ default:
+ throw new Error(`Unsupported provider: ${provider}`);
+ }
+}
+
+export function createModelInstance(modelName: string, userEmail?: string): LanguageModel {
+ const entry = MODEL_REGISTRY[modelName];
+ if (!entry) {
+ throw new Error(`Model not found in registry: ${modelName}`);
+ }
+
+ const provider = getProviderInstance(entry.provider, userEmail);
+
+ switch (entry.provider) {
+ case "openai": {
+ const openaiProvider = provider as ReturnType;
+ return openaiProvider(entry.modelId);
+ }
+ case "openrouter": {
+ const openrouterProvider = provider as ReturnType;
+ return openrouterProvider(entry.modelId) as unknown as LanguageModel;
+ }
+ default:
+ throw new Error(`Unsupported provider: ${entry.provider}`);
+ }
+}
diff --git a/lib/ai/models/service.ts b/lib/ai/models/service.ts
new file mode 100644
index 00000000..ea617c6a
--- /dev/null
+++ b/lib/ai/models/service.ts
@@ -0,0 +1,45 @@
+/**
+ * Model Service - Runtime model selection with fallback
+ */
+
+import type { LanguageModel } from "ai";
+import { logger } from "~/lib/logger";
+import { type AIOperation, FALLBACK_MODELS, MODEL_REGISTRY, OPERATION_MODELS } from "./config";
+import { createModelInstance } from "./providers";
+
+/**
+ * Get the default model for a specific operation.
+ */
+export function getModelForOperation(operation: AIOperation, userEmail?: string): LanguageModel {
+ const modelName = OPERATION_MODELS[operation];
+ if (!modelName) {
+ throw new Error(`No default model configured for: ${operation}`);
+ }
+ return createModelInstance(modelName, userEmail);
+}
+
+/**
+ * Get model with automatic fallback if primary fails.
+ */
+export function getModelWithFallback(
+ operation: AIOperation,
+ userEmail?: string
+): { model: LanguageModel; modelName: string; getFallback: () => LanguageModel | null } {
+ const modelName = OPERATION_MODELS[operation] || "gpt-5-mini";
+ const model = createModelInstance(modelName, userEmail);
+
+ const getFallback = () => {
+ const fallbackModelName = FALLBACK_MODELS[modelName];
+ if (!fallbackModelName || !MODEL_REGISTRY[fallbackModelName]) {
+ logger.warn({ operation, modelName }, "No fallback model configured");
+ return null;
+ }
+ logger.warn(
+ { operation, primaryModel: modelName, fallbackModel: fallbackModelName },
+ "Using fallback model"
+ );
+ return createModelInstance(fallbackModelName, userEmail);
+ };
+
+ return { model, modelName, getFallback };
+}
diff --git a/lib/ai/utils.ts b/lib/ai/utils.ts
index 2776b4a6..7e0cb6ce 100644
--- a/lib/ai/utils.ts
+++ b/lib/ai/utils.ts
@@ -1,8 +1,8 @@
-import type { LanguageModelV1 } from "@ai-sdk/provider";
+import type { LanguageModel } from "ai";
import { generateObject, generateText } from "ai";
import type { z } from "zod";
+import { getModelForOperation } from "~/lib/ai/models";
import { logger } from "~/lib/logger";
-import { getOpenAiClient } from "~/lib/openai";
/**
* Performs a two-step AI process where Gemini generates initial text and o4-mini structures it.
@@ -18,7 +18,7 @@ export async function twoStepAIProcess({
schemaDescription,
userEmail,
}: {
- initialModel: LanguageModelV1;
+ initialModel: LanguageModel;
systemPrompt: string;
userPrompt: string;
schema: z.ZodType;
@@ -47,7 +47,7 @@ export async function twoStepAIProcess({
});
// Step 2: Structure the output with o4-mini
- const o3Mini = getOpenAiClient(userEmail)("o4-mini");
+ const o3Mini = getModelForOperation("analyse_interview", userEmail);
const { object: structuredOutput, usage: o3MiniUsage } = await generateObject({
model: o3Mini,
schema,
@@ -76,13 +76,13 @@ export async function twoStepAIProcess({
data: null,
error: safeParseResult.success ? undefined : safeParseResult.error,
usage: {
- prompt_tokens: initialUsage.promptTokens + o3MiniUsage.promptTokens,
- completion_tokens: initialUsage.completionTokens + o3MiniUsage.completionTokens,
+ prompt_tokens: (initialUsage.inputTokens ?? 0) + (o3MiniUsage.inputTokens ?? 0),
+ completion_tokens: (initialUsage.outputTokens ?? 0) + (o3MiniUsage.outputTokens ?? 0),
total_tokens:
- initialUsage.promptTokens +
- initialUsage.completionTokens +
- o3MiniUsage.promptTokens +
- o3MiniUsage.completionTokens,
+ (initialUsage.inputTokens ?? 0) +
+ (initialUsage.outputTokens ?? 0) +
+ (o3MiniUsage.inputTokens ?? 0) +
+ (o3MiniUsage.outputTokens ?? 0),
},
};
}
@@ -91,13 +91,13 @@ export async function twoStepAIProcess({
data: parsedOutput,
error: null,
usage: {
- prompt_tokens: initialUsage.promptTokens + o3MiniUsage.promptTokens,
- completion_tokens: initialUsage.completionTokens + o3MiniUsage.completionTokens,
+ prompt_tokens: (initialUsage.inputTokens ?? 0) + (o3MiniUsage.inputTokens ?? 0),
+ completion_tokens: (initialUsage.outputTokens ?? 0) + (o3MiniUsage.outputTokens ?? 0),
total_tokens:
- initialUsage.promptTokens +
- initialUsage.completionTokens +
- o3MiniUsage.promptTokens +
- o3MiniUsage.completionTokens,
+ (initialUsage.inputTokens ?? 0) +
+ (initialUsage.outputTokens ?? 0) +
+ (o3MiniUsage.inputTokens ?? 0) +
+ (o3MiniUsage.outputTokens ?? 0),
},
};
} catch (error) {
@@ -127,7 +127,7 @@ export async function singleStepAIProcess({
schemaDescription,
userEmail,
}: {
- model: LanguageModelV1;
+ model: LanguageModel;
systemPrompt: string;
userPrompt: string;
schema: z.ZodType;
@@ -172,9 +172,9 @@ export async function singleStepAIProcess({
data: null,
error: safeParseResult.success ? undefined : safeParseResult.error,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
}
@@ -183,9 +183,9 @@ export async function singleStepAIProcess({
data: parsedOutput,
error: null,
usage: {
- prompt_tokens: usage.promptTokens,
- completion_tokens: usage.completionTokens,
- total_tokens: usage.promptTokens + usage.completionTokens,
+ prompt_tokens: usage.inputTokens ?? 0,
+ completion_tokens: usage.outputTokens ?? 0,
+ total_tokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),
},
};
} catch (error) {
diff --git a/lib/extraction-store.ts b/lib/extraction-store.ts
new file mode 100644
index 00000000..41ae6ecb
--- /dev/null
+++ b/lib/extraction-store.ts
@@ -0,0 +1,46 @@
+import { Redis } from "@upstash/redis";
+import { logger } from "~/lib/logger";
+
+const EXTRACTION_PREFIX = "extraction:";
+const EXTRACTION_TTL = 300; // 5 minutes
+
+export interface ExtractionResult {
+ status: "pending" | "completed" | "error";
+ extractedText?: string;
+ fileName?: string;
+ fileType?: string;
+ url?: string;
+ characterCount?: number;
+ cached?: boolean;
+ error?: string;
+}
+
+function getRedis(): Redis | null {
+ if (!process.env.KV_REST_API_URL || !process.env.KV_REST_API_TOKEN) {
+ logger.warn("Redis not configured for extraction store");
+ return null;
+ }
+ return Redis.fromEnv();
+}
+
+export async function setExtractionResult(
+ extractionId: string,
+ result: ExtractionResult
+): Promise {
+ const redis = getRedis();
+ if (!redis) return;
+
+ await redis.set(`${EXTRACTION_PREFIX}${extractionId}`, JSON.stringify(result), {
+ ex: EXTRACTION_TTL,
+ });
+}
+
+export async function getExtractionResult(extractionId: string): Promise {
+ const redis = getRedis();
+ if (!redis) return null;
+
+ const result = await redis.get(`${EXTRACTION_PREFIX}${extractionId}`);
+ if (!result) return null;
+
+ return typeof result === "string" ? JSON.parse(result) : (result as ExtractionResult);
+}
diff --git a/lib/inngest.ts b/lib/inngest.ts
new file mode 100644
index 00000000..f7a971d2
--- /dev/null
+++ b/lib/inngest.ts
@@ -0,0 +1,44 @@
+import { EventSchemas, Inngest } from "inngest";
+
+type Events = {
+ "interview/report.requested": {
+ data: {
+ jobId: number;
+ reportId: number;
+ interviewId: number;
+ userId: number;
+ restart?: boolean;
+ };
+ };
+ "interview/audio-save.requested": {
+ data: {
+ reportId: number;
+ interviewId: number;
+ userId: number;
+ };
+ };
+ "interview/extract-file.requested": {
+ data: {
+ extractionId: string;
+ fileBase64: string;
+ fileName: string;
+ fileType: string;
+ fileSize: number;
+ fileHash: string;
+ userId: number;
+ userEmail: string;
+ };
+ };
+ "interview/extract-url.requested": {
+ data: {
+ extractionId: string;
+ url: string;
+ userId: number;
+ };
+ };
+};
+
+export const inngest = new Inngest({
+ id: "interview-optimiser",
+ schemas: new EventSchemas().fromRecord(),
+});
diff --git a/lib/inngest/functions/extract-file.ts b/lib/inngest/functions/extract-file.ts
new file mode 100644
index 00000000..1a1bb252
--- /dev/null
+++ b/lib/inngest/functions/extract-file.ts
@@ -0,0 +1,113 @@
+import mammoth from "mammoth";
+import { extractFromDocument } from "~/lib/ai/extract-from-document";
+import { getModelForOperation } from "~/lib/ai/models";
+import { setExtractionResult } from "~/lib/extraction-store";
+import { getCachedFileExtraction, setCachedFileExtraction } from "~/lib/file-extraction-cache";
+import { inngest } from "~/lib/inngest";
+import { logger } from "~/lib/logger";
+
+export const extractFileFn = inngest.createFunction(
+ {
+ id: "extract-file",
+ retries: 2,
+ concurrency: [{ limit: 20 }],
+ throttle: {
+ limit: 5,
+ period: "1m",
+ key: "event.data.userId",
+ },
+ onFailure: async ({ error, event }) => {
+ const extractionId = event.data.event.data.extractionId;
+ logger.error({ error: error.message, extractionId }, "File extraction failed after retries");
+ await setExtractionResult(extractionId, {
+ status: "error",
+ error: "Failed to extract text from file. Please try pasting the content manually.",
+ });
+ },
+ },
+ { event: "interview/extract-file.requested" },
+ async ({ event, step }) => {
+ const { extractionId, fileBase64, fileName, fileType, fileSize, fileHash, userId, userEmail } =
+ event.data;
+
+ // Step 1: Check cache
+ const cached = await step.run("check-cache", async () => {
+ return getCachedFileExtraction(fileHash);
+ });
+
+ if (cached) {
+ await step.run("broadcast-cached", async () => {
+ await setExtractionResult(extractionId, {
+ status: "completed",
+ extractedText: cached.extractedText,
+ fileName,
+ fileType,
+ characterCount: cached.extractedText.length,
+ cached: true,
+ });
+ });
+ return { cached: true, extractionId };
+ }
+
+ // Step 2: Extract text
+ const extractedText = await step.run("extract-text", async () => {
+ const fileBuffer = Buffer.from(fileBase64, "base64");
+
+ const fileNameLower = fileName.toLowerCase();
+ const extractionType =
+ fileNameLower.includes("cv") || fileNameLower.includes("resume")
+ ? "cv"
+ : fileNameLower.includes("job") || fileNameLower.includes("jd")
+ ? "job_description"
+ : "general";
+
+ if (fileType === "application/pdf" || fileType.startsWith("image/")) {
+ const model = getModelForOperation("extract_from_document", userEmail);
+ const result = await extractFromDocument({
+ model,
+ fileBuffer,
+ fileType,
+ userEmail,
+ extractionType,
+ });
+ return result.data;
+ }
+
+ if (
+ fileType === "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
+ fileType === "application/msword"
+ ) {
+ const result = await mammoth.extractRawText({ buffer: fileBuffer });
+ return result.value?.trim() || "";
+ }
+
+ throw new Error(`Unsupported file type: ${fileType}`);
+ });
+
+ // Step 3: Cache result
+ await step.run("cache-result", async () => {
+ await setCachedFileExtraction({
+ fileHash,
+ fileType,
+ fileName,
+ fileSize,
+ extractedText,
+ extractionType: "general",
+ });
+ });
+
+ // Step 4: Broadcast result
+ await step.run("broadcast-result", async () => {
+ await setExtractionResult(extractionId, {
+ status: "completed",
+ extractedText,
+ fileName,
+ fileType,
+ characterCount: extractedText.length,
+ cached: false,
+ });
+ });
+
+ return { extractionId, textLength: extractedText.length };
+ }
+);
diff --git a/lib/inngest/functions/extract-url.ts b/lib/inngest/functions/extract-url.ts
new file mode 100644
index 00000000..1f08a382
--- /dev/null
+++ b/lib/inngest/functions/extract-url.ts
@@ -0,0 +1,64 @@
+import { cleanUpText } from "@/lib/clean-up-text";
+import { load } from "cheerio";
+import TurndownService from "turndown";
+import { setExtractionResult } from "~/lib/extraction-store";
+import { inngest } from "~/lib/inngest";
+import { logger } from "~/lib/logger";
+
+export const extractUrlFn = inngest.createFunction(
+ {
+ id: "extract-url",
+ retries: 2,
+ concurrency: [{ limit: 10 }],
+ onFailure: async ({ error, event }) => {
+ const extractionId = event.data.event.data.extractionId;
+ logger.error({ error: error.message, extractionId }, "URL extraction failed after retries");
+ await setExtractionResult(extractionId, {
+ status: "error",
+ error: "Failed to extract text from URL. Please try pasting the content manually.",
+ });
+ },
+ },
+ { event: "interview/extract-url.requested" },
+ async ({ event, step }) => {
+ const { extractionId, url, userId } = event.data;
+
+ // Step 1: Fetch URL
+ const html = await step.run("fetch-url", async () => {
+ const response = await fetch(url);
+ if (!response.ok) {
+ throw new Error(`Failed to fetch URL: ${response.status}`);
+ }
+ return response.text();
+ });
+
+ // Step 2: Extract text
+ const extractedText = await step.run("extract-text", async () => {
+ const $ = load(html);
+ $(
+ "script, style, header, footer, nav, aside, noscript, iframe, img, video, audio, svg, canvas"
+ ).remove();
+
+ const bodyContent = $("body").html() || "";
+ const cleanedContent = cleanUpText($(bodyContent).text());
+
+ const turndownService = new TurndownService({
+ headingStyle: "atx",
+ codeBlockStyle: "fenced",
+ });
+ return turndownService.turndown(cleanedContent);
+ });
+
+ // Step 3: Broadcast result
+ await step.run("broadcast-result", async () => {
+ await setExtractionResult(extractionId, {
+ status: "completed",
+ extractedText,
+ url,
+ characterCount: extractedText.length,
+ });
+ });
+
+ return { extractionId, textLength: extractedText.length };
+ }
+);
diff --git a/lib/inngest/functions/generate-missing-audio.ts b/lib/inngest/functions/generate-missing-audio.ts
new file mode 100644
index 00000000..45d1aba3
--- /dev/null
+++ b/lib/inngest/functions/generate-missing-audio.ts
@@ -0,0 +1,89 @@
+import { requestChatAudioReconstruction } from "@/lib/utils/hume-audio-reconstruction";
+import * as Sentry from "@sentry/nextjs";
+import { and, isNull } from "drizzle-orm";
+import { db } from "~/db";
+import { reports } from "~/db/schema";
+import { sendDiscordDM } from "~/lib/discord";
+import { inngest } from "~/lib/inngest";
+import { logger } from "~/lib/logger";
+
+export const generateMissingAudioFn = inngest.createFunction(
+ {
+ id: "generate-missing-audio",
+ retries: 1,
+ },
+ { cron: "*/10 * * * *" },
+ async ({ step }) => {
+ const reportsToProcess = await step.run("find-missing-audio", async () => {
+ const results = await db.query.reports.findMany({
+ where: and(isNull(reports.interviewAudioUrl)),
+ with: {
+ interview: {
+ with: {
+ job: true,
+ },
+ },
+ },
+ });
+
+ logger.info(
+ {
+ message: "MONITORING",
+ count: results.length,
+ unit: "Count",
+ metric: "MissingAudio",
+ },
+ "Missing audio metric"
+ );
+
+ return results;
+ });
+
+ if (reportsToProcess.length === 0) return { processed: 0 };
+
+ await step.run("notify-start", () =>
+ sendDiscordDM({
+ title: "⚠️ Generating missing audio for reports",
+ metadata: {
+ Count: reportsToProcess.length,
+ "Report IDs": reportsToProcess.map((r) => r.id).join(", "),
+ Timestamp: new Date().toISOString(),
+ },
+ })
+ );
+
+ for (const report of reportsToProcess) {
+ if (!report.interview.humeChatId) {
+ logger.warn({ reportId: report.id }, "Skipping audio reconstruction - missing humeChatId");
+ continue;
+ }
+
+ // Request audio reconstruction
+ await step.run(`request-reconstruction-${report.id}`, async () => {
+ try {
+ await requestChatAudioReconstruction(report.interview.humeChatId!);
+ logger.info({ reportId: report.id }, "Audio reconstruction requested");
+ } catch (error) {
+ Sentry.captureException(error);
+ logger.error({ error, reportId: report.id }, "Error requesting audio reconstruction");
+ }
+ });
+
+ // Queue audio save via Inngest event
+ if (report.interview.job.userId) {
+ await step.run(`queue-audio-save-${report.id}`, () =>
+ inngest.send({
+ name: "interview/audio-save.requested",
+ data: {
+ reportId: report.id,
+ interviewId: report.interview.id,
+ userId: report.interview.job.userId!,
+ },
+ })
+ );
+ }
+ }
+
+ return { processed: reportsToProcess.length };
+ }
+);
diff --git a/lib/inngest/functions/generate-report.ts b/lib/inngest/functions/generate-report.ts
new file mode 100644
index 00000000..8d77dbb9
--- /dev/null
+++ b/lib/inngest/functions/generate-report.ts
@@ -0,0 +1,394 @@
+import ReportCompletedEmail from "@/emails/report-completed";
+import { getUserFromId } from "@/lib/auth";
+import { idHandler } from "@/lib/utils/idHandler";
+import * as Sentry from "@sentry/nextjs";
+import { eq, sql } from "drizzle-orm";
+import { config } from "~/config";
+import { db } from "~/db";
+import {
+ candidateDetails,
+ interviews,
+ jobDescriptions,
+ jobs,
+ questionAnalysis,
+ reports,
+ statistics,
+} from "~/db/schema";
+import { analyseInterview } from "~/lib/ai/analyse-interview";
+import { extractCandidateDetails } from "~/lib/ai/extract-candidate-details";
+import { extractJobDescription } from "~/lib/ai/extract-job-description";
+import { extractOriginalCV } from "~/lib/ai/extract-original-cv";
+import { getModelForOperation } from "~/lib/ai/models";
+import { sendDiscordDM } from "~/lib/discord";
+import { inngest } from "~/lib/inngest";
+import { logger } from "~/lib/logger";
+import { resend } from "~/lib/resend";
+
+// Helper function to sanitize strings by removing null characters
+const sanitizeString = (str: string | undefined | null): string | null => {
+ if (typeof str === "string") {
+ return str.replace(/\u0000/g, "");
+ }
+ return str === undefined ? null : str;
+};
+
+export const generateReportFn = inngest.createFunction(
+ {
+ id: "generate-report",
+ retries: 2,
+ concurrency: [{ limit: 10 }],
+ onFailure: async ({ error, event }) => {
+ await sendDiscordDM({
+ title: "❌ Interview Report Generation Failed",
+ description: "Failed to generate interview report after retries",
+ metadata: {
+ "Job ID": event.data.event.data.jobId,
+ "Report ID": event.data.event.data.reportId,
+ Error: error.message,
+ Timestamp: new Date().toISOString(),
+ },
+ });
+ },
+ },
+ { event: "interview/report.requested" },
+ async ({ event, step }) => {
+ const { jobId, interviewId, reportId, userId, restart: isRestart } = event.data;
+
+ // Step 1: Load data
+ const { job, interview, user } = await step.run("load-data", async () => {
+ const user = await getUserFromId(userId);
+
+ const job = await db
+ .select()
+ .from(jobs)
+ .where(eq(jobs.id, jobId))
+ .then(([job]) => job);
+
+ if (!job) throw new Error(`Job not found: ${jobId}`);
+
+ const interview = await db
+ .select()
+ .from(interviews)
+ .where(eq(interviews.id, interviewId))
+ .then(([interview]) => interview);
+
+ if (!interview) throw new Error(`Interview not found: ${interviewId}`);
+
+ return { job, interview, user };
+ });
+
+ // Step 2: Parallel AI extraction
+ const extractionModel = getModelForOperation("extract_original_cv", user?.email);
+
+ const [structuredCV, structuredJobDescription, structuredCandidateDetails] = await Promise.all([
+ step.run("extract-cv", () =>
+ extractOriginalCV({
+ model: extractionModel,
+ submittedCVText: job.submittedCVText ?? "",
+ userEmail: user?.email,
+ }).catch((error) => {
+ logger.error({ error }, "Error extracting structured CV data");
+ return null;
+ })
+ ),
+ step.run("extract-job-description", () =>
+ extractJobDescription({
+ model: getModelForOperation("extract_job_description", user?.email),
+ jobDescriptionText: job.jobDescriptionText ?? "",
+ userEmail: user?.email,
+ }).catch((error) => {
+ logger.error({ error }, "Error extracting structured job description");
+ return null;
+ })
+ ),
+ step.run("extract-candidate-details", () =>
+ extractCandidateDetails({
+ model: getModelForOperation("extract_candidate_details", user?.email),
+ submittedCVText: job.submittedCVText ?? "",
+ userEmail: user?.email,
+ }).catch((error) => {
+ logger.error({ error }, "Error extracting structured candidate details");
+ return null;
+ })
+ ),
+ ]);
+
+ // Step 3: Sanitize extracted data
+ if (structuredJobDescription?.data) {
+ const jdData = structuredJobDescription.data;
+ jdData.company = sanitizeString(jdData.company) ?? "";
+ jdData.role = sanitizeString(jdData.role) ?? "";
+ for (const field of [
+ "requiredQualifications",
+ "requiredExperience",
+ "requiredSkills",
+ "preferredQualifications",
+ "preferredSkills",
+ "responsibilities",
+ "benefits",
+ "keyTechnologies",
+ "keywords",
+ ] as const) {
+ if (Array.isArray(jdData[field])) {
+ (jdData as any)[field] = (jdData[field] as string[]).map((s) => sanitizeString(s) ?? "");
+ } else {
+ (jdData as any)[field] = [];
+ }
+ }
+ jdData.location = sanitizeString(jdData.location) ?? "";
+ jdData.employmentType = sanitizeString(jdData.employmentType) ?? "";
+ jdData.seniority = sanitizeString(jdData.seniority) ?? "";
+ jdData.industry = sanitizeString(jdData.industry) ?? "";
+ }
+
+ if (structuredCandidateDetails?.data) {
+ const cdData = structuredCandidateDetails.data;
+ cdData.name = sanitizeString(cdData.name) ?? "";
+ cdData.email = sanitizeString(cdData.email) ?? "";
+ cdData.phone = sanitizeString(cdData.phone) ?? "";
+ cdData.location = sanitizeString(cdData.location) ?? "";
+ cdData.currentRole = sanitizeString(cdData.currentRole) ?? "";
+ cdData.professionalSummary = sanitizeString(cdData.professionalSummary) ?? "";
+ cdData.linkedinUrl = sanitizeString(cdData.linkedinUrl) ?? "";
+ cdData.portfolioUrl = sanitizeString(cdData.portfolioUrl) ?? "";
+ if (Array.isArray(cdData.otherUrls)) {
+ cdData.otherUrls = cdData.otherUrls.map((s) => sanitizeString(s) ?? "");
+ } else {
+ cdData.otherUrls = [];
+ }
+ }
+
+ // Step 4: Analyse interview
+ // Rehydrate Date fields that were serialized to strings by step.run
+ const rehydratedJob = {
+ ...job,
+ createdAt: new Date(job.createdAt),
+ updatedAt: new Date(job.updatedAt),
+ };
+ const rehydratedInterview = {
+ ...interview,
+ createdAt: new Date(interview.createdAt),
+ updatedAt: new Date(interview.updatedAt),
+ };
+
+ const generatedReport = await step.run("analyse-interview", async () => {
+ const result = await analyseInterview({
+ model: getModelForOperation("analyse_interview", user?.email),
+ job: rehydratedJob,
+ transcriptString: interview.transcript ?? "",
+ userEmail: user?.email,
+ structuredCV: structuredCV?.data,
+ structuredJobDescription: structuredJobDescription?.data,
+ structuredCandidateDetails: structuredCandidateDetails?.data,
+ interview: rehydratedInterview,
+ });
+
+ if (!result?.data) throw new Error("Failed to generate report");
+
+ // Sanitize report data
+ const reportData = result.data;
+ reportData.generalAssessment = sanitizeString(reportData.generalAssessment) ?? "";
+ reportData.candidateName = sanitizeString(reportData.candidateName) ?? "";
+ reportData.companyName = sanitizeString(reportData.companyName) ?? "";
+ reportData.roleName = sanitizeString(reportData.roleName) ?? "";
+ if ("fitnessForRole" in reportData) {
+ reportData.fitnessForRole =
+ sanitizeString(reportData.fitnessForRole as string | null | undefined) ?? "";
+ }
+ reportData.speakingSkills = sanitizeString(reportData.speakingSkills) ?? "";
+ reportData.communicationSkills = sanitizeString(reportData.communicationSkills) ?? "";
+ reportData.problemSolvingSkills = sanitizeString(reportData.problemSolvingSkills) ?? "";
+ reportData.technicalKnowledge = sanitizeString(reportData.technicalKnowledge) ?? "";
+ reportData.teamwork = sanitizeString(reportData.teamwork) ?? "";
+ reportData.adaptability = sanitizeString(reportData.adaptability) ?? "";
+
+ for (const field of [
+ "areasOfStrength",
+ "areasForImprovement",
+ "actionableNextSteps",
+ ] as const) {
+ if (Array.isArray(reportData[field])) {
+ (reportData as any)[field] = (reportData[field] as string[]).map(
+ (item) => sanitizeString(item) ?? ""
+ );
+ } else {
+ (reportData as any)[field] = [];
+ }
+ }
+
+ if (result.questionAnalyses?.length) {
+ result.questionAnalyses = result.questionAnalyses.map((qa) => ({
+ ...qa,
+ question: sanitizeString(qa.question) ?? "",
+ analysis: sanitizeString(qa.analysis) ?? "",
+ }));
+ }
+
+ return result;
+ });
+
+ // Step 5: Save report to DB
+ const reportData = generatedReport.data;
+ const interviewType = interview.type || "Interview";
+ const company = reportData.companyName || job.company || "Company";
+ const role = reportData.roleName || job.role || "Position";
+
+ const updatedReportId = await step.run("save-report", async () => {
+ return db.transaction(async (tx): Promise => {
+ if (structuredJobDescription?.data) {
+ await tx
+ .insert(jobDescriptions)
+ .values({
+ jobId,
+ company: structuredJobDescription.data.company,
+ role: structuredJobDescription.data.role,
+ requiredQualifications: structuredJobDescription.data.requiredQualifications,
+ requiredExperience: structuredJobDescription.data.requiredExperience,
+ requiredSkills: structuredJobDescription.data.requiredSkills,
+ preferredQualifications: structuredJobDescription.data.preferredQualifications,
+ preferredSkills: structuredJobDescription.data.preferredSkills,
+ responsibilities: structuredJobDescription.data.responsibilities,
+ benefits: structuredJobDescription.data.benefits,
+ location: structuredJobDescription.data.location,
+ employmentType: structuredJobDescription.data.employmentType,
+ seniority: structuredJobDescription.data.seniority,
+ industry: structuredJobDescription.data.industry,
+ keyTechnologies: structuredJobDescription.data.keyTechnologies,
+ keywords: structuredJobDescription.data.keywords,
+ })
+ .onConflictDoNothing();
+ }
+
+ if (structuredCandidateDetails?.data) {
+ await tx
+ .insert(candidateDetails)
+ .values({
+ jobId,
+ name: structuredCandidateDetails.data.name,
+ email: structuredCandidateDetails.data.email,
+ phone: structuredCandidateDetails.data.phone,
+ location: structuredCandidateDetails.data.location,
+ currentRole: structuredCandidateDetails.data.currentRole,
+ professionalSummary: structuredCandidateDetails.data.professionalSummary,
+ linkedinUrl: structuredCandidateDetails.data.linkedinUrl,
+ portfolioUrl: structuredCandidateDetails.data.portfolioUrl,
+ otherUrls: structuredCandidateDetails.data.otherUrls,
+ })
+ .onConflictDoNothing();
+ }
+
+ const updatedReport = await tx
+ .update(reports)
+ .set({
+ interviewId,
+ generalAssessment: reportData.generalAssessment,
+ overallScore: reportData.overallScore,
+ speakingSkills: reportData.speakingSkills,
+ speakingSkillsScore: reportData.speakingSkillsScore,
+ communicationSkills: reportData.communicationSkills,
+ communicationSkillsScore: reportData.communicationSkillsScore,
+ problemSolvingSkills: reportData.problemSolvingSkills,
+ problemSolvingSkillsScore: reportData.problemSolvingSkillsScore,
+ technicalKnowledge: reportData.technicalKnowledge,
+ technicalKnowledgeScore: reportData.technicalKnowledgeScore,
+ teamwork: reportData.teamwork,
+ teamworkScore: reportData.teamworkScore,
+ adaptability: reportData.adaptability,
+ adaptabilityScore: reportData.adaptabilityScore,
+ areasOfStrength: JSON.stringify(reportData.areasOfStrength),
+ areasForImprovement: JSON.stringify(reportData.areasForImprovement),
+ actionableNextSteps: JSON.stringify(reportData.actionableNextSteps),
+ isCompleted: true,
+ })
+ .where(eq(reports.id, reportId))
+ .returning({ id: reports.id });
+
+ if (generatedReport.questionAnalyses?.length) {
+ const existingQAs = await tx.query.questionAnalysis.findMany({
+ where: eq(questionAnalysis.reportId, updatedReport[0].id),
+ });
+
+ for (const qa of generatedReport.questionAnalyses) {
+ await tx.insert(questionAnalysis).values({
+ reportId: updatedReport[0].id,
+ question: qa.question,
+ analysis: qa.analysis,
+ score: qa.score,
+ isKeyQuestion: qa.isKeyQuestion,
+ });
+ }
+
+ for (const qa of existingQAs) {
+ await tx.delete(questionAnalysis).where(eq(questionAnalysis.id, qa.id));
+ }
+ }
+
+ await tx
+ .update(jobs)
+ .set({
+ candidate: reportData.candidateName,
+ company: reportData.companyName,
+ role: reportData.roleName,
+ completed: true,
+ })
+ .where(eq(jobs.id, jobId));
+
+ await tx
+ .update(statistics)
+ .set({
+ interviewsCount: sql`${statistics.interviewsCount} + 1`,
+ })
+ .where(eq(statistics.id, 1));
+
+ return updatedReport[0].id;
+ });
+ });
+
+ // Step 6: Send notifications
+ await step.run("send-notifications", async () => {
+ if (user?.email) {
+ try {
+ await resend.emails.send({
+ from: `${config.projectName} `,
+ to: user.email,
+ subject: `Your ${interviewType} Interview Report is Ready`,
+ react: ReportCompletedEmail({
+ firstName: user.firstname ?? "",
+ jobId,
+ interviewId,
+ reportId: updatedReportId,
+ interviewType,
+ role,
+ company,
+ }),
+ });
+ } catch (emailError) {
+ logger.error(
+ { error: emailError instanceof Error ? emailError.message : emailError },
+ "Failed to send report completion email"
+ );
+ Sentry.captureException(emailError);
+ }
+ }
+
+ await sendDiscordDM({
+ title: "✅ Interview Report Generated",
+ metadata: {
+ "User ID": userId,
+ "User Email": user?.email ?? "Unknown",
+ "Interview ID": jobId,
+ "Interview URL": `${config.baseUrl}/dashboard/jobs/${idHandler.encode(
+ jobId
+ )}/interviews/${idHandler.encode(interviewId)}/reports/${idHandler.encode(
+ updatedReportId
+ )}`,
+ Company: reportData.companyName,
+ Role: reportData.roleName,
+ "Overall Score": reportData.overallScore,
+ },
+ });
+ });
+
+ return { reportId: updatedReportId };
+ }
+);
diff --git a/lib/inngest/functions/regenerate-incomplete-reports.ts b/lib/inngest/functions/regenerate-incomplete-reports.ts
new file mode 100644
index 00000000..911dbaef
--- /dev/null
+++ b/lib/inngest/functions/regenerate-incomplete-reports.ts
@@ -0,0 +1,99 @@
+import * as Sentry from "@sentry/nextjs";
+import { db } from "~/db";
+import { sendDiscordDM } from "~/lib/discord";
+import { inngest } from "~/lib/inngest";
+import { logger } from "~/lib/logger";
+
+export const regenerateIncompleteReportsFn = inngest.createFunction(
+ {
+ id: "regenerate-incomplete-reports",
+ retries: 1,
+ },
+ { cron: "0 */6 * * *" },
+ async ({ step }) => {
+ const incompleteReports = await step.run("find-incomplete", async () => {
+ const results = await db.query.reports.findMany({
+ columns: {
+ id: true,
+ interviewId: true,
+ },
+ where: (reports, { eq }) => eq(reports.isCompleted, false),
+ with: {
+ interview: {
+ columns: {
+ jobId: true,
+ id: true,
+ },
+ with: {
+ job: {
+ columns: {
+ userId: true,
+ },
+ },
+ },
+ },
+ },
+ });
+
+ logger.info(
+ {
+ message: "MONITORING",
+ count: results.length,
+ unit: "Count",
+ metric: "MissedReports",
+ },
+ "Missed reports metric"
+ );
+
+ return results;
+ });
+
+ if (incompleteReports.length === 0) return { regenerated: 0 };
+
+ await step.run("notify-start", () =>
+ sendDiscordDM({
+ title: "⚠️ Regenerating incomplete reports",
+ metadata: {
+ Count: incompleteReports.length,
+ "Report IDs": incompleteReports.map((r) => r.id).join(", "),
+ Timestamp: new Date().toISOString(),
+ },
+ })
+ );
+
+ for (const report of incompleteReports) {
+ await step.run(`queue-regenerate-${report.id}`, async () => {
+ try {
+ if (!report.interview.job.userId) {
+ logger.warn({ reportId: report.id }, "Skipping - no userId");
+ return;
+ }
+ await inngest.send({
+ name: "interview/report.requested",
+ data: {
+ jobId: report.interview.jobId,
+ reportId: report.id,
+ interviewId: report.interviewId!,
+ userId: report.interview.job.userId,
+ restart: true,
+ },
+ });
+ logger.info({ reportId: report.id }, "Queued report regeneration");
+ } catch (error) {
+ Sentry.captureException(error);
+ logger.error({ error, reportId: report.id }, "Error queuing report regeneration");
+ await sendDiscordDM({
+ title: "❌ Failed to regenerate report",
+ metadata: {
+ "Report ID": report.id,
+ Error: error instanceof Error ? error.message : String(error),
+ Timestamp: new Date().toISOString(),
+ },
+ });
+ }
+ });
+ }
+
+ return { regenerated: incompleteReports.length };
+ }
+);
diff --git a/lib/inngest/functions/save-audio-to-s3.ts b/lib/inngest/functions/save-audio-to-s3.ts
new file mode 100644
index 00000000..7b7357c7
--- /dev/null
+++ b/lib/inngest/functions/save-audio-to-s3.ts
@@ -0,0 +1,120 @@
+import { getUserFromId } from "@/lib/auth";
+import {
+ downloadAudioFile,
+ requestChatAudioReconstruction,
+} from "@/lib/utils/hume-audio-reconstruction";
+import { idHandler } from "@/lib/utils/idHandler";
+import * as Sentry from "@sentry/nextjs";
+import { eq } from "drizzle-orm";
+import { config } from "~/config";
+import { db } from "~/db";
+import { interviews, reports } from "~/db/schema";
+import { sendDiscordDM } from "~/lib/discord";
+import { inngest } from "~/lib/inngest";
+import { logger } from "~/lib/logger";
+import { uploadAudioToS3 } from "~/lib/utils/s3-audio";
+
+export const saveAudioToS3Fn = inngest.createFunction(
+ {
+ id: "save-audio-to-s3",
+ retries: 2,
+ concurrency: [{ limit: 5 }],
+ onFailure: async ({ error, event }) => {
+ await sendDiscordDM({
+ title: "❌ Interview Audio Save Failed",
+ description: "Failed to save interview audio to S3 after retries",
+ metadata: {
+ "Report ID": event.data.event.data.reportId,
+ "Interview ID": event.data.event.data.interviewId,
+ Error: error.message,
+ Timestamp: new Date().toISOString(),
+ },
+ });
+ },
+ },
+ { event: "interview/audio-save.requested" },
+ async ({ event, step }) => {
+ const { reportId, interviewId, userId } = event.data;
+
+ // Step 1: Load interview data
+ const interview = await step.run("load-interview", async () => {
+ const interview = await db.query.interviews.findFirst({
+ where: eq(interviews.id, interviewId),
+ });
+
+ if (!interview) throw new Error(`Interview not found: ${interviewId}`);
+ return interview;
+ });
+
+ const chatId = interview.humeChatId;
+ if (!chatId) {
+ logger.warn({ interviewId }, "No humeChatId — skipping audio save");
+ return { skipped: true, reason: "no-hume-chat-id" };
+ }
+
+ // Step 2: Poll for audio reconstruction with durable sleep
+ let reconstructionResponse: any = null;
+
+ for (let i = 0; i < 20; i++) {
+ const status = await step.run(`poll-audio-${i}`, () =>
+ requestChatAudioReconstruction(chatId)
+ );
+
+ if (status.status === "COMPLETE") {
+ reconstructionResponse = status;
+ break;
+ }
+
+ if (status.status === "ERROR" || status.status === "CANCELED") {
+ logger.warn(
+ { interviewId, chatId, status: status.status },
+ "Audio reconstruction unavailable — skipping"
+ );
+ return { skipped: true, reason: `hume-status-${status.status.toLowerCase()}` };
+ }
+
+ await step.sleep(`wait-${i}`, "10s");
+ }
+
+ if (!reconstructionResponse?.signed_audio_url) {
+ logger.warn({ interviewId, chatId }, "Audio reconstruction timed out — skipping");
+ return { skipped: true, reason: "timeout" };
+ }
+
+ // Step 3: Download and upload audio (combined to avoid Buffer serialization)
+ const cloudFrontUrl = await step.run("download-and-upload", async () => {
+ const audioData = await downloadAudioFile(reconstructionResponse.signed_audio_url);
+ return uploadAudioToS3(audioData, chatId, reconstructionResponse.filename);
+ });
+
+ // Step 5: Update report in DB
+ await step.run("update-report", async () => {
+ await db
+ .update(reports)
+ .set({
+ interviewAudioUrl: cloudFrontUrl,
+ updatedAt: new Date(),
+ })
+ .where(eq(reports.id, reportId));
+ });
+
+ // Step 6: Send notification
+ await step.run("notify", async () => {
+ const user = await getUserFromId(userId);
+ await sendDiscordDM({
+ title: "✅ Interview Audio Saved",
+ metadata: {
+ "User ID": userId,
+ "User Email": user?.email ?? "Unknown",
+ "Report ID": reportId,
+ "Report URL": `${config.baseUrl}/dashboard/jobs/${idHandler.encode(
+ interview.jobId
+ )}/interviews/${idHandler.encode(interviewId)}/reports/${idHandler.encode(reportId)}`,
+ "Audio URL": cloudFrontUrl,
+ },
+ });
+ });
+
+ return { cloudFrontUrl };
+ }
+);
diff --git a/lib/inngest/functions/vet-review.ts b/lib/inngest/functions/vet-review.ts
new file mode 100644
index 00000000..ad9182ed
--- /dev/null
+++ b/lib/inngest/functions/vet-review.ts
@@ -0,0 +1,137 @@
+import ReviewReportEmail from "@/emails/review-report";
+import * as Sentry from "@sentry/nextjs";
+import { generateObject } from "ai";
+import { format } from "date-fns";
+import { and, eq, isNull } from "drizzle-orm";
+import { z } from "zod";
+import { config } from "~/config";
+import { db } from "~/db";
+import { reviews } from "~/db/schema";
+import { getModelForOperation } from "~/lib/ai/models";
+import { sendDiscordDM } from "~/lib/discord";
+import { inngest } from "~/lib/inngest";
+import { logger } from "~/lib/logger";
+import { resend } from "~/lib/resend";
+
+const ReviewVettingResponseSchema = z.object({
+ isAppropriate: z.boolean(),
+ reason: z.string(),
+});
+
+export const vetReviewFn = inngest.createFunction(
+ {
+ id: "vet-review",
+ retries: 1,
+ },
+ { cron: "0 1 * * *" },
+ async ({ step }) => {
+ const unpublishedReviews = await step.run("find-unpublished", async () => {
+ return db.query.reviews.findMany({
+ where: and(eq(reviews.isPublished, false), isNull(reviews.processedAt)),
+ });
+ });
+
+ if (unpublishedReviews.length === 0) return { published: 0, rejected: 0 };
+
+ const publishedReviews: Array<{
+ id: number;
+ content: string;
+ rating: number;
+ author: string;
+ }> = [];
+ const rejectedReviews: Array<{
+ id: number;
+ content: string;
+ rating: number;
+ author: string;
+ rejectionReason: string;
+ }> = [];
+
+ for (const review of unpublishedReviews) {
+ const result = await step.run(`moderate-${review.id}`, async () => {
+ const prompt = `
+ Please review this testimonial for ${config.projectName} and determine if it's appropriate for public display.
+ Consider the following criteria:
+ 1. Is it relevant to ${config.projectName} or job seeking?
+ 2. Is it free from inappropriate content (NSFW, hate speech, etc.)?
+ 3. Is it a genuine review (not spam or completely unrelated)?
+
+ Note: Do NOT reject negative reviews if they are legitimate feedback about the service.
+
+ Review to evaluate:
+ "${review.comment}"
+ `;
+
+ const model = getModelForOperation("vet_review", config.supportEmail);
+ const { object: response } = await generateObject({
+ model,
+ schema: ReviewVettingResponseSchema,
+ system: `You are a content moderator for a ${config.projectName} website. Your task is to evaluate testimonials for appropriateness and relevance.`,
+ prompt,
+ temperature: 1,
+ });
+
+ if (!response) return null;
+
+ if (response.isAppropriate) {
+ await db
+ .update(reviews)
+ .set({ isPublished: true, processedAt: new Date() })
+ .where(eq(reviews.id, review.id));
+ } else {
+ await db
+ .update(reviews)
+ .set({ isPublished: false, processedAt: new Date() })
+ .where(eq(reviews.id, review.id));
+ }
+
+ return {
+ isAppropriate: response.isAppropriate,
+ reason: response.reason,
+ review: {
+ id: review.id,
+ content: review.comment ?? "",
+ rating: review.rating ?? 0,
+ author: review.name ?? "",
+ },
+ };
+ });
+
+ if (!result) continue;
+
+ if (result.isAppropriate) {
+ publishedReviews.push(result.review);
+ } else {
+ rejectedReviews.push({
+ ...result.review,
+ rejectionReason: result.reason,
+ });
+ }
+ }
+
+ // Send report
+ await step.run("send-report", async () => {
+ await resend.emails.send({
+ from: `${config.projectName} `,
+ to: config.supportEmail,
+ subject: `Review Moderation Report - ${format(new Date(), "yyyy-MM-dd")}`,
+ react: ReviewReportEmail({
+ publishedReviews,
+ rejectedReviews,
+ date: format(new Date(), "MMMM d, yyyy"),
+ }),
+ });
+
+ await sendDiscordDM({
+ title: "📋 Review Moderation Report",
+ metadata: {
+ Date: format(new Date(), "MMMM d, yyyy"),
+ Published: publishedReviews.length,
+ Rejected: rejectedReviews.length,
+ },
+ });
+ });
+
+ return { published: publishedReviews.length, rejected: rejectedReviews.length };
+ }
+);
diff --git a/lib/utils/s3-audio.ts b/lib/utils/s3-audio.ts
new file mode 100644
index 00000000..2b4c60df
--- /dev/null
+++ b/lib/utils/s3-audio.ts
@@ -0,0 +1,78 @@
+import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
+import { logger } from "~/lib/logger";
+
+const s3 = new S3Client({ region: process.env.AWS_REGION });
+
+const AUDIO_BUCKET_NAME = process.env.AUDIO_BUCKET_NAME || "";
+const CLOUDFRONT_DOMAIN = process.env.AUDIO_CDN_DOMAIN || "";
+
+/**
+ * Extract file extension and content type from filename
+ */
+export function getFileTypeFromFilename(filename: string): {
+ extension: string;
+ contentType: string;
+} {
+ const extension = filename.split(".").pop();
+
+ if (!extension) {
+ throw new Error("No file extension found");
+ }
+
+ switch (extension.toLowerCase()) {
+ case "mp4":
+ return { extension: "mp4", contentType: "video/mp4" };
+ case "mp3":
+ return { extension: "mp3", contentType: "audio/mpeg" };
+ case "wav":
+ return { extension: "wav", contentType: "audio/wav" };
+ case "ogg":
+ return { extension: "ogg", contentType: "audio/ogg" };
+ case "m4a":
+ return { extension: "m4a", contentType: "audio/mp4" };
+ case "aac":
+ return { extension: "aac", contentType: "audio/aac" };
+ case "webm":
+ return { extension: "webm", contentType: "audio/webm" };
+ case "flac":
+ return { extension: "flac", contentType: "audio/flac" };
+ default:
+ throw new Error(`Unsupported file type: ${extension}`);
+ }
+}
+
+/**
+ * Upload audio file to S3
+ */
+export async function uploadAudioToS3(
+ audioData: Buffer,
+ chatId: string,
+ filename: string
+): Promise {
+ try {
+ const { extension, contentType } = getFileTypeFromFilename(filename);
+ const key = `interview-recordings/${chatId}.${extension}`;
+
+ await s3.send(
+ new PutObjectCommand({
+ Bucket: AUDIO_BUCKET_NAME,
+ Key: key,
+ Body: audioData,
+ ContentType: contentType,
+ })
+ );
+
+ const cloudFrontUrl = `https://${CLOUDFRONT_DOMAIN}/${key}`;
+ return cloudFrontUrl;
+ } catch (error) {
+ logger.error(
+ {
+ message: error instanceof Error ? error.message : "Unknown error",
+ error,
+ chatId,
+ },
+ "Error uploading audio to S3"
+ );
+ throw error;
+ }
+}
diff --git a/package.json b/package.json
index 777de64c..d4a6513e 100644
--- a/package.json
+++ b/package.json
@@ -37,7 +37,8 @@
"prepare": "husky"
},
"dependencies": {
- "@ai-sdk/openai": "^1.2.6",
+ "@ai-sdk/openai": "^3.0.41",
+ "@ai-sdk/provider": "^3.0.8",
"@aws-sdk/client-lambda": "^3.682.0",
"@aws-sdk/client-s3": "^3.803.0",
"@aws-sdk/client-sqs": "^3.682.0",
@@ -47,8 +48,9 @@
"@discordjs/rest": "^2.4.0",
"@heroicons/react": "^2.2.0",
"@hookform/resolvers": "^5.0.1",
- "@humeai/voice-react": "^0.2.1",
+ "@humeai/voice-react": "^0.2.14",
"@mdxeditor/editor": "^3.15.0",
+ "@openrouter/ai-sdk-provider": "^2.2.3",
"@radix-ui/react-accordion": "^1.2.1",
"@radix-ui/react-alert-dialog": "^1.1.2",
"@radix-ui/react-avatar": "^1.1.9",
@@ -85,7 +87,7 @@
"@vercel/kv": "^3.0.0",
"@vercel/ncc": "^0.38.3",
"@vercel/speed-insights": "^1.0.14",
- "ai": "^4.1.63",
+ "ai": "^6.0.116",
"aws-lambda": "^1.0.7",
"case": "^1.6.3",
"cheerio": "^1.0.0",
@@ -110,6 +112,7 @@
"hume": "^0.12.1",
"immer": "^10.1.1",
"import-in-the-middle": "^1.11.2",
+ "inngest": "^3.52.6",
"isomorphic-dompurify": "^2.22.0",
"lodash": "^4.17.21",
"lottie-react": "^2.4.1",
diff --git a/src/app/api/extract/candidate-details/route.ts b/src/app/api/extract/candidate-details/route.ts
index 36e929dd..de5d0b46 100644
--- a/src/app/api/extract/candidate-details/route.ts
+++ b/src/app/api/extract/candidate-details/route.ts
@@ -7,8 +7,8 @@ import { z } from "zod";
import { db } from "~/db";
import { candidateDetails } from "~/db/schema";
import { extractCandidateDetails } from "~/lib/ai/extract-candidate-details";
+import { getModelForOperation } from "~/lib/ai/models";
import { logger } from "~/lib/logger";
-import { getOpenAiClient } from "~/lib/openai";
export const maxDuration = 300; // 5 minutes timeout
@@ -32,7 +32,7 @@ export const POST = withAuth(
const { jobId: jobIdString, cvText } = extractRequestSchema.parse(body);
const jobId = idHandler.decode(jobIdString);
- const model = getOpenAiClient(email)("o4-mini");
+ const model = getModelForOperation("extract_candidate_details", email);
// Run extractions in parallel
const candidateDetailsResult = await extractCandidateDetails({
diff --git a/src/app/api/extract/file/route.ts b/src/app/api/extract/file/route.ts
index 6bb46e75..00e12976 100644
--- a/src/app/api/extract/file/route.ts
+++ b/src/app/api/extract/file/route.ts
@@ -2,18 +2,13 @@ import { withAuth } from "@/lib/auth-middleware";
import { validateFileSize } from "@/lib/utils/fileValidation";
import { formatEntity, formatErrorEntity } from "@/lib/utils/formatEntity";
import * as Sentry from "@sentry/nextjs";
-import mammoth from "mammoth";
import { type NextRequest, NextResponse } from "next/server";
-import { extractFromDocument } from "~/lib/ai/extract-from-document";
-import {
- getCachedFileExtraction,
- hashFileContent,
- setCachedFileExtraction,
-} from "~/lib/file-extraction-cache";
+import { setExtractionResult } from "~/lib/extraction-store";
+import { getCachedFileExtraction, hashFileContent } from "~/lib/file-extraction-cache";
+import { inngest } from "~/lib/inngest";
import { logger } from "~/lib/logger";
-import { getOpenAiClient } from "~/lib/openai";
-export const maxDuration = 60; // 60 seconds timeout for file processing
+export const maxDuration = 60;
const ALLOWED_FILE_TYPES = [
"application/pdf",
@@ -32,26 +27,17 @@ export const POST = withAuth(
try {
if (!user.id) {
- logger.warn({ userId: user.id }, "User not found in database");
- return NextResponse.json(formatErrorEntity("User not found"), {
- status: 404,
- });
+ return NextResponse.json(formatErrorEntity("User not found"), { status: 404 });
}
- // Parse form data
const formData = await request.formData();
const file = formData.get("file") as File | null;
if (!file) {
- logger.warn({ userId: user.id }, "No file provided");
- return NextResponse.json(formatErrorEntity("No file provided"), {
- status: 400,
- });
+ return NextResponse.json(formatErrorEntity("No file provided"), { status: 400 });
}
- // Validate file type
if (!ALLOWED_FILE_TYPES.includes(file.type)) {
- logger.warn({ userId: user.id, fileType: file.type }, "Unsupported file type");
return NextResponse.json(
formatErrorEntity({
error: "Unsupported file type",
@@ -61,46 +47,21 @@ export const POST = withAuth(
);
}
- // Validate file size
const validation = validateFileSize(file);
if (!validation.isValid) {
- logger.warn({ userId: user.id, fileSize: file.size }, "File validation failed");
return NextResponse.json(formatErrorEntity(validation.error || "File validation failed"), {
status: 400,
});
}
- logger.info(
- {
- userId: user.id,
- fileName: file.name,
- fileType: file.type,
- fileSize: file.size,
- },
- "Starting file extraction"
- );
-
const buffer = await file.arrayBuffer();
- const uint8Array = new Uint8Array(buffer);
- const fileBuffer = Buffer.from(uint8Array);
-
- // Hash the file content for caching
+ const fileBuffer = Buffer.from(new Uint8Array(buffer));
const fileHash = hashFileContent(fileBuffer);
- logger.info({ userId: user.id, fileHash, fileName: file.name }, "File hash generated");
- // Check if extraction is already cached
+ // Return immediately if cached
const cachedExtraction = await getCachedFileExtraction(fileHash);
if (cachedExtraction) {
- logger.info(
- {
- userId: user.id,
- fileHash,
- hitCount: cachedExtraction.hitCount,
- textLength: cachedExtraction.extractedText.length,
- },
- "Returning cached file extraction"
- );
-
+ logger.info({ userId: user.id, fileHash }, "Returning cached file extraction");
return NextResponse.json(
formatEntity(
{
@@ -116,115 +77,44 @@ export const POST = withAuth(
);
}
- // Determine extraction type based on file name
- const fileName = file.name.toLowerCase();
- const extractionType =
- fileName.includes("cv") || fileName.includes("resume")
- ? "cv"
- : fileName.includes("job") || fileName.includes("jd")
- ? "job_description"
- : "general";
-
- let extractedText: string;
-
- // Check if it's a PDF or image that can be processed by Vision API
- if (
- file.type === "application/pdf" ||
- file.type === "image/png" ||
- file.type === "image/jpeg" ||
- file.type === "image/jpg" ||
- file.type === "image/webp" ||
- file.type === "image/gif"
- ) {
- logger.info(`Starting to extract text from ${file.type} using Vision AI`);
-
- // Use vision model (gpt-5-mini) for document extraction
- const model = getOpenAiClient(user.email)("gpt-5-mini");
- const result = await extractFromDocument({
- model: model as any,
- fileBuffer,
- fileType: file.type,
- userEmail: user.email,
- extractionType,
- });
-
- logger.info(
- {
- userId: user.id,
- textLength: result.data?.length,
- method: "vision",
- model: "gpt-5-mini",
- fileType: file.type,
- },
- `Extracted text from ${file.type} using vision model`
- );
+ // Dispatch to Inngest for async processing
+ const extractionId = crypto.randomUUID();
+ const fileBase64 = fileBuffer.toString("base64");
- extractedText = result.data;
- } else if (
- file.type === "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ||
- file.type === "application/msword"
- ) {
- logger.info("starting to extract text from word file");
- const result = await mammoth.extractRawText({ buffer: fileBuffer });
- logger.info(
- { userId: user.id, textLength: result.value?.trim().length },
- "Extracted text from word file"
- );
- extractedText = result.value?.trim() || "";
- } else {
- throw new Error("Unsupported file type");
- }
+ await setExtractionResult(extractionId, { status: "pending" });
- logger.info(
- {
- userId: user.id,
+ await inngest.send({
+ name: "interview/extract-file.requested",
+ data: {
+ extractionId,
+ fileBase64,
fileName: file.name,
- extractedLength: extractedText.length,
+ fileType: file.type,
+ fileSize: file.size,
+ fileHash,
+ userId: user.id,
+ userEmail: user.email ?? "",
},
- "File extraction completed successfully"
- );
-
- // Cache the extraction for future use (async, don't wait)
- setCachedFileExtraction({
- fileHash,
- fileType: file.type,
- fileName: file.name,
- fileSize: file.size,
- extractedText,
- extractionType,
- }).catch((error) => {
- logger.error({ error, fileHash }, "Failed to cache file extraction");
});
- return NextResponse.json(
- formatEntity(
- {
- extractedText,
- fileName: file.name,
- fileType: file.type,
- characterCount: extractedText.length,
- cached: false,
- },
- "generic"
- )
+ logger.info(
+ { userId: user.id, extractionId, fileName: file.name },
+ "File extraction dispatched to Inngest"
);
+
+ return NextResponse.json(formatEntity({ extractionId }, "generic"), { status: 202 });
} catch (error) {
Sentry.withScope((scope) => {
scope.setExtra("context", "POST /api/extract/file");
scope.setExtra("error", error);
- scope.setExtra("message", error instanceof Error ? error.message : error);
Sentry.captureException(error);
});
logger.error(
- {
- message: error instanceof Error ? error.message : "Unknown error",
- error,
- },
+ { message: error instanceof Error ? error.message : "Unknown error", error },
"Error in POST /api/extract/file"
);
- // Don't expose internal error details to client
const message =
error instanceof Error && error.message.includes("extract")
? error.message
diff --git a/src/app/api/extract/job-description/route.ts b/src/app/api/extract/job-description/route.ts
index 616afe50..11e45136 100644
--- a/src/app/api/extract/job-description/route.ts
+++ b/src/app/api/extract/job-description/route.ts
@@ -7,8 +7,8 @@ import { z } from "zod";
import { db } from "~/db";
import { jobDescriptions } from "~/db/schema";
import { extractJobDescription } from "~/lib/ai/extract-job-description";
+import { getModelForOperation } from "~/lib/ai/models";
import { logger } from "~/lib/logger";
-import { getOpenAiClient } from "~/lib/openai";
export const maxDuration = 300; // 5 minutes timeout
@@ -32,7 +32,7 @@ export const POST = withAuth(
const { jobDescriptionText, jobId: jobIdString } = extractRequestSchema.parse(body);
const jobId = idHandler.decode(jobIdString);
- const model = getOpenAiClient(email)("o4-mini");
+ const model = getModelForOperation("extract_job_description", email);
// Run extractions in parallel
const jobDescriptionResult = await extractJobDescription({
diff --git a/src/app/api/extract/questions/route.ts b/src/app/api/extract/questions/route.ts
index 2668364b..1462ac6b 100644
--- a/src/app/api/extract/questions/route.ts
+++ b/src/app/api/extract/questions/route.ts
@@ -8,8 +8,8 @@ import { z } from "zod";
import { db } from "~/db";
import { jobDescriptions } from "~/db/schema";
import { extractKeyQuestions } from "~/lib/ai/extract-key-questions";
+import { getModelForOperation } from "~/lib/ai/models";
import { logger } from "~/lib/logger";
-import { getOpenAiClient } from "~/lib/openai";
export const maxDuration = 300; // 5 minutes timeout
@@ -34,7 +34,7 @@ export const POST = withAuth(
const { jobId: jobIdString, interviewType, duration } = extractRequestSchema.parse(body);
const jobId = idHandler.decode(jobIdString);
- const model = getOpenAiClient(email)("o4-mini");
+ const model = getModelForOperation("extract_questions", email);
const jobDescription = await db.query.jobDescriptions.findFirst({
where: eq(jobDescriptions.jobId, jobId),
diff --git a/src/app/api/extract/url/route.ts b/src/app/api/extract/url/route.ts
index f62f104b..a793b4ec 100644
--- a/src/app/api/extract/url/route.ts
+++ b/src/app/api/extract/url/route.ts
@@ -1,14 +1,13 @@
import { withAuth } from "@/lib/auth-middleware";
-import { cleanUpText } from "@/lib/clean-up-text";
import { formatEntity, formatErrorEntity } from "@/lib/utils/formatEntity";
import * as Sentry from "@sentry/nextjs";
-import { load } from "cheerio";
import { type NextRequest, NextResponse } from "next/server";
-import TurndownService from "turndown";
import { z } from "zod";
+import { setExtractionResult } from "~/lib/extraction-store";
+import { inngest } from "~/lib/inngest";
import { logger } from "~/lib/logger";
-export const maxDuration = 60; // 60 seconds timeout for URL fetching
+export const maxDuration = 60;
const extractUrlRequestSchema = z.object({
url: z.string().url("Invalid URL format"),
@@ -20,81 +19,37 @@ export const POST = withAuth(
try {
if (!user.id) {
- logger.warn({ userId: user.id }, "User not found in database");
- return NextResponse.json(formatErrorEntity("User not found"), {
- status: 404,
- });
+ return NextResponse.json(formatErrorEntity("User not found"), { status: 404 });
}
const body = await request.json();
const { url } = extractUrlRequestSchema.parse(body);
- logger.info({ userId: user.id, url }, "Starting URL extraction");
+ const extractionId = crypto.randomUUID();
- // Fetch the URL
- const response = await fetch(url);
- if (!response.ok) {
- logger.warn({ userId: user.id, url, status: response.status }, "Failed to fetch URL");
- return NextResponse.json(
- formatErrorEntity("Failed to fetch the URL. Please check the URL and try again."),
- { status: 400 }
- );
- }
-
- const html = await response.text();
- logger.info({ userId: user.id }, "Extracted HTML from URL");
-
- // Parse HTML
- const $ = load(html);
-
- // Remove unnecessary elements
- $(
- "script, style, header, footer, nav, aside, noscript, iframe, img, video, audio, svg, canvas"
- ).remove();
-
- // Get the cleaned body content
- const bodyContent = $("body").html() || "";
- const cleanedContent = cleanUpText($(bodyContent).text());
-
- // Convert HTML to Markdown
- const turndownService = new TurndownService({
- headingStyle: "atx",
- codeBlockStyle: "fenced",
- });
- const markdown = turndownService.turndown(cleanedContent);
+ await setExtractionResult(extractionId, { status: "pending" });
- logger.info(
- {
- userId: user.id,
+ await inngest.send({
+ name: "interview/extract-url.requested",
+ data: {
+ extractionId,
url,
- extractedLength: markdown.length,
+ userId: user.id,
},
- "URL extraction completed successfully"
- );
+ });
- return NextResponse.json(
- formatEntity(
- {
- extractedText: markdown,
- url,
- characterCount: markdown.length,
- },
- "generic"
- )
- );
+ logger.info({ userId: user.id, extractionId, url }, "URL extraction dispatched to Inngest");
+
+ return NextResponse.json(formatEntity({ extractionId }, "generic"), { status: 202 });
} catch (error) {
Sentry.withScope((scope) => {
scope.setExtra("context", "POST /api/extract/url");
scope.setExtra("error", error);
- scope.setExtra("message", error instanceof Error ? error.message : error);
Sentry.captureException(error);
});
logger.error(
- {
- message: error instanceof Error ? error.message : "Unknown error",
- error,
- },
+ { message: error instanceof Error ? error.message : "Unknown error", error },
"Error in POST /api/extract/url"
);
diff --git a/src/app/api/extractions/[id]/stream/route.ts b/src/app/api/extractions/[id]/stream/route.ts
new file mode 100644
index 00000000..f5db9478
--- /dev/null
+++ b/src/app/api/extractions/[id]/stream/route.ts
@@ -0,0 +1,70 @@
+import { withAuth } from "@/lib/auth-middleware";
+import { type NextRequest, NextResponse } from "next/server";
+import { getExtractionResult } from "~/lib/extraction-store";
+import { logger } from "~/lib/logger";
+
+export const GET = withAuth<{ id: string }>(
+ async (_request: NextRequest, { params }) => {
+ const extractionId = params?.id;
+
+ if (!extractionId) {
+ return NextResponse.json({ error: "Missing extraction ID" }, { status: 400 });
+ }
+
+ const encoder = new TextEncoder();
+ const stream = new ReadableStream({
+ async start(controller) {
+ const maxPolls = 60; // 60 polls * 1s = 60s max
+ let polls = 0;
+
+ const poll = async () => {
+ try {
+ const result = await getExtractionResult(extractionId);
+
+ if (result?.status === "completed" || result?.status === "error") {
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify(result)}\n\n`));
+ controller.close();
+ return;
+ }
+
+ controller.enqueue(
+ encoder.encode(`data: ${JSON.stringify({ status: "pending" })}\n\n`)
+ );
+
+ polls++;
+ if (polls >= maxPolls) {
+ controller.enqueue(
+ encoder.encode(
+ `data: ${JSON.stringify({ status: "error", error: "Extraction timed out" })}\n\n`
+ )
+ );
+ controller.close();
+ return;
+ }
+
+ setTimeout(poll, 1000);
+ } catch (error) {
+ logger.error({ error, extractionId }, "Error polling extraction result");
+ controller.enqueue(
+ encoder.encode(
+ `data: ${JSON.stringify({ status: "error", error: "Internal error" })}\n\n`
+ )
+ );
+ controller.close();
+ }
+ };
+
+ await poll();
+ },
+ });
+
+ return new Response(stream, {
+ headers: {
+ "Content-Type": "text/event-stream",
+ "Cache-Control": "no-cache",
+ Connection: "keep-alive",
+ },
+ });
+ },
+ { routeName: "GET /api/extractions/[id]/stream" }
+);
diff --git a/src/app/api/inngest/route.ts b/src/app/api/inngest/route.ts
new file mode 100644
index 00000000..003402bc
--- /dev/null
+++ b/src/app/api/inngest/route.ts
@@ -0,0 +1,22 @@
+import { serve } from "inngest/next";
+import { inngest } from "~/lib/inngest";
+import { extractFileFn } from "~/lib/inngest/functions/extract-file";
+import { extractUrlFn } from "~/lib/inngest/functions/extract-url";
+import { generateMissingAudioFn } from "~/lib/inngest/functions/generate-missing-audio";
+import { generateReportFn } from "~/lib/inngest/functions/generate-report";
+import { regenerateIncompleteReportsFn } from "~/lib/inngest/functions/regenerate-incomplete-reports";
+import { saveAudioToS3Fn } from "~/lib/inngest/functions/save-audio-to-s3";
+import { vetReviewFn } from "~/lib/inngest/functions/vet-review";
+
+export const { GET, POST, PUT } = serve({
+ client: inngest,
+ functions: [
+ generateReportFn,
+ saveAudioToS3Fn,
+ generateMissingAudioFn,
+ regenerateIncompleteReportsFn,
+ vetReviewFn,
+ extractFileFn,
+ extractUrlFn,
+ ],
+});
diff --git a/src/app/api/recruitment/questions/route.ts b/src/app/api/recruitment/questions/route.ts
index cc1a01cd..34e6c341 100644
--- a/src/app/api/recruitment/questions/route.ts
+++ b/src/app/api/recruitment/questions/route.ts
@@ -9,8 +9,8 @@ import type { InterviewType } from "~/db/schema/interviews";
import { interviewTypeEnum } from "~/db/schema/interviews";
import type { JobDescription } from "~/db/schema/jobDescriptions";
import { extractKeyQuestions } from "~/lib/ai/extract-key-questions";
+import { getModelForOperation } from "~/lib/ai/models";
import { logger } from "~/lib/logger";
-import { getOpenAiClient } from "~/lib/openai";
const RequestBodySchema = z.object({
jobDescriptionText: z.string().min(50, "Job description must be at least 50 characters long."),
@@ -68,7 +68,7 @@ export const POST = withAuth(
const { jobDescriptionText, interviewType, duration } = validationResult.data;
- const model = getOpenAiClient(userEmail).chat(process.env.OPENAI_CHAT_MODEL || "gpt-4o");
+ const model = getModelForOperation("recruitment_questions", userEmail);
const jobDescriptionData: JobDescription = {
id: 0,
diff --git a/src/app/api/report/route.ts b/src/app/api/report/route.ts
index 0540c470..efa4bbf8 100644
--- a/src/app/api/report/route.ts
+++ b/src/app/api/report/route.ts
@@ -4,15 +4,11 @@ import { idHandler } from "@/lib/utils/idHandler";
import * as Sentry from "@sentry/nextjs";
import { eq } from "drizzle-orm";
import { NextResponse } from "next/server";
-import { config } from "~/config";
import { db } from "~/db";
import { interviews, reports } from "~/db/schema";
+import { inngest } from "~/lib/inngest";
import { logger } from "~/lib/logger";
-const API_GATEWAY_URL = config.apiGatewayUrlAddToQueue;
-
-const API_KEY = process.env.INTERVIEWOPTIMISER_API_KEY;
-
export const POST = withAuth(
async (request, { user }) => {
try {
@@ -83,91 +79,21 @@ export const POST = withAuth(
return NextResponse.json({ error: "Report not found" }, { status: 404 });
}
- // Configure the API requests
- const reportRequest = fetch(API_GATEWAY_URL, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "x-api-key": API_KEY || "",
- },
- body: JSON.stringify({
- data: {
- jobId,
- reportId,
- interviewId,
- },
- userId,
- queueType: "generate-report",
- }),
- });
-
- const audioRequest = fetch(API_GATEWAY_URL, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "x-api-key": API_KEY || "",
+ // Send both events to Inngest
+ logger.info({ jobId, reportId, interviewId }, "Sending events to Inngest");
+ await inngest.send([
+ {
+ name: "interview/report.requested",
+ data: { jobId, reportId, interviewId, userId },
},
- body: JSON.stringify({
- data: {
- jobId,
- reportId,
- interviewId,
- },
- userId,
- queueType: "save-interview-audio-to-s3",
- }),
- });
-
- // Execute both requests in parallel
- logger.info({ jobId, reportId, interviewId }, "Sending parallel requests to API Gateway");
- const [reportResponse, audioResponse] = await Promise.all([reportRequest, audioRequest]);
-
- // Parse the JSON responses in parallel
- const [reportResponseData, audioResponseData] = await Promise.all([
- reportResponse.json(),
- audioResponse.json(),
- ]);
-
- logger.info(
{
- reportStatus: reportResponse.status,
- audioStatus: audioResponse.status,
+ name: "interview/audio-save.requested",
+ data: { reportId, interviewId, userId },
},
- "Received responses from API Gateway"
- );
-
- // Check if either request failed
- if (!reportResponse.ok || !audioResponse.ok) {
- logger.error(
- {
- reportError: reportResponse.ok ? null : reportResponse.statusText,
- reportStatus: reportResponse.status,
- reportBody: reportResponseData,
- audioError: audioResponse.ok ? null : audioResponse.statusText,
- audioStatus: audioResponse.status,
- audioBody: audioResponseData,
- },
- "Failed to queue one or more tasks"
- );
-
- // Return the first error
- if (!reportResponse.ok) {
- return NextResponse.json(reportResponseData, {
- status: reportResponse.status,
- });
- } else {
- return NextResponse.json(audioResponseData, {
- status: audioResponse.status,
- });
- }
- }
+ ]);
return NextResponse.json(
- {
- message: "Report generation and audio reconstruction started",
- reportStatus: reportResponse.status,
- audioStatus: audioResponse.status,
- },
+ { message: "Report generation and audio reconstruction started" },
{ status: 200 }
);
} catch (error) {
diff --git a/src/app/api/users/default-cv/route.ts b/src/app/api/users/default-cv/route.ts
new file mode 100644
index 00000000..f1f2be69
--- /dev/null
+++ b/src/app/api/users/default-cv/route.ts
@@ -0,0 +1,95 @@
+import { withAuth } from "@/lib/auth-middleware";
+import { formatEntity, formatErrorEntity } from "@/lib/utils/formatEntity";
+import { eq } from "drizzle-orm";
+import { type NextRequest, NextResponse } from "next/server";
+import { z } from "zod";
+import { db } from "~/db";
+import { users } from "~/db/schema";
+import { logger } from "~/lib/logger";
+
+const updateDefaultCvSchema = z.object({
+ cvText: z.string().min(1, "CV text is required"),
+ filename: z.string().max(255).optional(),
+});
+
+export const GET = withAuth(
+ async (_request: NextRequest, { user }) => {
+ try {
+ const dbUser = await db.query.users.findFirst({
+ where: eq(users.id, user.id),
+ columns: {
+ defaultCvText: true,
+ defaultCvFilename: true,
+ },
+ });
+
+ if (!dbUser?.defaultCvText) {
+ return NextResponse.json(formatEntity(null, "cv"));
+ }
+
+ return NextResponse.json(
+ formatEntity(
+ {
+ defaultCvText: dbUser.defaultCvText,
+ defaultCvFilename: dbUser.defaultCvFilename,
+ },
+ "cv"
+ )
+ );
+ } catch (error) {
+ logger.error({ error }, "Error fetching default CV");
+ return NextResponse.json(formatErrorEntity("Failed to fetch default CV"), { status: 500 });
+ }
+ },
+ { routeName: "GET /api/users/default-cv" }
+);
+
+export const POST = withAuth(
+ async (request: NextRequest, { user }) => {
+ try {
+ const body = await request.json();
+ const { cvText, filename } = updateDefaultCvSchema.parse(body);
+
+ await db
+ .update(users)
+ .set({
+ defaultCvText: cvText,
+ defaultCvFilename: filename ?? null,
+ updatedAt: new Date(),
+ })
+ .where(eq(users.id, user.id));
+
+ return NextResponse.json(
+ formatEntity({ defaultCvText: cvText, defaultCvFilename: filename ?? null }, "cv")
+ );
+ } catch (error) {
+ if (error instanceof z.ZodError) {
+ return NextResponse.json(formatErrorEntity(error.errors), { status: 400 });
+ }
+ logger.error({ error }, "Error saving default CV");
+ return NextResponse.json(formatErrorEntity("Failed to save default CV"), { status: 500 });
+ }
+ },
+ { routeName: "POST /api/users/default-cv" }
+);
+
+export const DELETE = withAuth(
+ async (_request: NextRequest, { user }) => {
+ try {
+ await db
+ .update(users)
+ .set({
+ defaultCvText: null,
+ defaultCvFilename: null,
+ updatedAt: new Date(),
+ })
+ .where(eq(users.id, user.id));
+
+ return NextResponse.json(formatEntity(null, "cv"));
+ } catch (error) {
+ logger.error({ error }, "Error deleting default CV");
+ return NextResponse.json(formatErrorEntity("Failed to delete default CV"), { status: 500 });
+ }
+ },
+ { routeName: "DELETE /api/users/default-cv" }
+);
diff --git a/src/app/dashboard/create/hooks/useJobSubmission.ts b/src/app/dashboard/create/hooks/useJobSubmission.ts
index 5bbffb7d..0b6d7d31 100644
--- a/src/app/dashboard/create/hooks/useJobSubmission.ts
+++ b/src/app/dashboard/create/hooks/useJobSubmission.ts
@@ -18,6 +18,8 @@ interface UseJobSubmissionProps {
cvText: string;
jobDescriptionText: string;
additionalInfo: string;
+ saveAsDefault?: boolean;
+ cvFilename?: string | null;
}
export function useJobSubmission({
@@ -25,6 +27,8 @@ export function useJobSubmission({
cvText,
jobDescriptionText,
additionalInfo,
+ saveAsDefault,
+ cvFilename,
}: UseJobSubmissionProps) {
const router = useRouter();
const posthog = usePostHog();
@@ -83,11 +87,29 @@ export function useJobSubmission({
return createdJob;
},
- onSuccess: (data) => {
+ onSuccess: async (data) => {
setShowTakeover(true);
+
+ // Save as default CV if checkbox was checked
+ if (saveAsDefault && cvText?.trim()) {
+ try {
+ await secureFetch("/api/users/default-cv", {
+ method: "POST",
+ body: JSON.stringify({
+ cvText,
+ filename: cvFilename ?? undefined,
+ }),
+ });
+ } catch (err) {
+ // Non-blocking — don't prevent navigation on failure
+ Sentry.captureException(err, { extra: { context: "save-default-cv" } });
+ }
+ }
+
setTimeout(() => {
- resetStore();
router.push(`/dashboard/jobs/${clientIdHandler.formatId(data.sys.id)}/interviews/new`);
+ // Reset store after a short delay so takeover stays visible during navigation
+ setTimeout(() => resetStore(), 500);
}, 9000);
},
onError: (error) => {
@@ -115,6 +137,7 @@ export function useJobSubmission({
try {
if (!cvText?.trim() || !jobDescriptionText?.trim()) {
toast.error("Please provide both CV and job description.");
+ setShowTakeover(false);
return;
}
diff --git a/src/app/dashboard/create/page.tsx b/src/app/dashboard/create/page.tsx
index 49f0cc2b..fda52370 100644
--- a/src/app/dashboard/create/page.tsx
+++ b/src/app/dashboard/create/page.tsx
@@ -9,11 +9,13 @@ import {
useCreateJobActions,
useCreateJobAdditionalInfo,
useCreateJobCVText,
+ useCreateJobCvFilename,
useCreateJobErrorMessage,
useCreateJobIsAlertDialogOpen,
useCreateJobIsOutOfMinutesDialogOpen,
useCreateJobIsScheduleErrorDialogOpen,
useCreateJobJobDescriptionText,
+ useCreateJobSaveAsDefault,
useCreateJobShowTakeover,
useCreateJobStep,
} from "@/stores/createJobStore";
@@ -33,6 +35,8 @@ export default function CreateJob() {
const isOutOfMinutesDialogOpen = useCreateJobIsOutOfMinutesDialogOpen();
const isScheduleErrorDialogOpen = useCreateJobIsScheduleErrorDialogOpen();
const errorMessage = useCreateJobErrorMessage();
+ const saveAsDefault = useCreateJobSaveAsDefault();
+ const cvFilename = useCreateJobCvFilename();
const {
setStep,
@@ -69,6 +73,8 @@ export default function CreateJob() {
cvText,
jobDescriptionText,
additionalInfo,
+ saveAsDefault,
+ cvFilename,
});
const handleNextStep = () => {
diff --git a/src/app/dashboard/jobs/[jobId]/interviews/[interviewId]/reports/[reportId]/page.tsx b/src/app/dashboard/jobs/[jobId]/interviews/[interviewId]/reports/[reportId]/page.tsx
index 7f6b0d49..f9f64fc4 100644
--- a/src/app/dashboard/jobs/[jobId]/interviews/[interviewId]/reports/[reportId]/page.tsx
+++ b/src/app/dashboard/jobs/[jobId]/interviews/[interviewId]/reports/[reportId]/page.tsx
@@ -437,8 +437,8 @@ export default function JobReportPage(props: {
className={cn("flex-1 overflow-y-auto overflow-x-hidden p-8 bg-muted", bodyFont)}
ref={containerRef}
style={{
- height: report?.data?.interviewAudioUrl ? "calc(100vh - 134px)" : "calc(100vh - 64px)",
- paddingBottom: report?.data?.interviewAudioUrl ? "76px" : "16px",
+ height: report?.data?.interviewAudioUrl ? "calc(100vh - 166px)" : "calc(100vh - 64px)",
+ paddingBottom: report?.data?.interviewAudioUrl ? "108px" : "16px",
}}
>
+
+
+ Interview recordings are available for 30 days. Download your recording to keep it
+ permanently.
+
+
)}
diff --git a/src/components/create-optimization/Step2CV.tsx b/src/components/create-optimization/Step2CV.tsx
index b6ae145b..28c876a8 100644
--- a/src/components/create-optimization/Step2CV.tsx
+++ b/src/components/create-optimization/Step2CV.tsx
@@ -1,21 +1,36 @@
"use client";
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
+import { Button } from "@/components/ui/button";
+import { Checkbox } from "@/components/ui/checkbox";
import { FileUpload } from "@/components/ui/file-upload";
import { Textarea } from "@/components/ui/textarea";
import { useExtractFile } from "@/hooks/useExtractText";
import { cn } from "@/lib/utils";
-import { useCreateJobActions, useCreateJobCVText } from "@/stores/createJobStore";
+import {
+ useCreateJobActions,
+ useCreateJobCVText,
+ useCreateJobSaveAsDefault,
+} from "@/stores/createJobStore";
import * as Sentry from "@sentry/nextjs";
-import { AlertCircle, FileText, HelpCircle } from "lucide-react";
+import { useQuery } from "@tanstack/react-query";
+import { AlertCircle, FileText, HelpCircle, Upload } from "lucide-react";
import { usePostHog } from "posthog-js/react";
import { useState } from "react";
import { toast } from "sonner";
import { config } from "~/config";
+interface DefaultCvResponse {
+ data: {
+ defaultCvText: string;
+ defaultCvFilename: string | null;
+ } | null;
+}
+
export function Step2CV() {
const cvText = useCreateJobCVText();
- const { setCVText } = useCreateJobActions();
+ const saveAsDefault = useCreateJobSaveAsDefault();
+ const { setCVText, setSaveAsDefault, setCvFilename } = useCreateJobActions();
const [cvFile, setCVFile] = useState(null);
const [showStep2Error, setShowStep2Error] = useState(false);
const posthog = usePostHog();
@@ -23,6 +38,27 @@ export function Step2CV() {
const extractFileMutation = useExtractFile();
const isLoading = extractFileMutation.isPending;
+ const { data: defaultCvData } = useQuery({
+ queryKey: ["default-cv"],
+ queryFn: async () => {
+ const response = await fetch("/api/users/default-cv");
+ if (!response.ok) throw new Error("Failed to fetch default CV");
+ return response.json();
+ },
+ });
+
+ const hasDefaultCv = !!defaultCvData?.data?.defaultCvText;
+
+ const handleLoadDefaultCv = () => {
+ if (defaultCvData?.data?.defaultCvText) {
+ setCVText(defaultCvData.data.defaultCvText);
+ setCvFilename(defaultCvData.data.defaultCvFilename ?? null);
+ setShowStep2Error(false);
+ posthog.capture("default_cv_loaded");
+ toast.success("Default CV loaded");
+ }
+ };
+
const handleFileChange = async (files: File[]) => {
if (files.length === 0) {
setCVFile(null);
@@ -49,9 +85,9 @@ export function Step2CV() {
if (extractedText?.trim()) {
setCVText(extractedText);
setCVFile(file);
+ setCvFilename(file.name);
setShowStep2Error(false);
- // Track successful CV upload
posthog.capture("cv_uploaded", {
fileSize: file.size,
fileType: file.type,
@@ -68,7 +104,6 @@ export function Step2CV() {
}
);
- // Track failed CV parsing
posthog.capture("error_encountered", {
errorType: "cv_parsing_failed",
errorMessage: "Failed to extract text from file",
@@ -85,7 +120,6 @@ export function Step2CV() {
});
toast.error("An error occurred while processing the file. Please try again.");
- // Track CV upload error
posthog.capture("error_encountered", {
errorType: "cv_upload_error",
errorMessage: error instanceof Error ? error.message : "Unknown error",
@@ -97,7 +131,6 @@ export function Step2CV() {
} else {
toast.error("Please upload only PDF or Word documents.");
- // Track invalid file type
posthog.capture("error_encountered", {
errorType: "invalid_file_type",
errorMessage: `Unsupported file type: ${fileType}`,
@@ -125,6 +158,24 @@ export function Step2CV() {
{/* Left Column (Main Content - File Upload & Text Input) - Takes 3/5 of space on lg+ */}
+ {/* Default CV Button */}
+ {hasDefaultCv && !cvText && (
+
+
+
+
Use your saved default CV
+ {defaultCvData?.data?.defaultCvFilename && (
+
+ {defaultCvData.data.defaultCvFilename}
+
+ )}
+
+
+ Use Default CV
+
+
+ )}
+
{/* File Upload Section */}
@@ -180,6 +231,23 @@ export function Step2CV() {
Please provide your CV content before continuing
)}
+
+ {/* Save as Default Checkbox */}
+ {cvText?.trim() && (
+
+ setSaveAsDefault(checked === true)}
+ />
+
+ Save as my default CV for future interviews
+
+
+ )}
diff --git a/src/components/interview-lobby.tsx b/src/components/interview-lobby.tsx
index fce3edfb..ca009825 100644
--- a/src/components/interview-lobby.tsx
+++ b/src/components/interview-lobby.tsx
@@ -1,6 +1,5 @@
"use client";
-import { VoiceProvider } from "@humeai/voice-react";
import { InterviewPlaceholder } from "./interview-placeholder";
export default function InterviewLobby({
@@ -14,9 +13,7 @@ export default function InterviewLobby({
return (
-
-
-
+
);
}
diff --git a/src/components/interview-placeholder.tsx b/src/components/interview-placeholder.tsx
index 384cfd92..0da4c882 100644
--- a/src/components/interview-placeholder.tsx
+++ b/src/components/interview-placeholder.tsx
@@ -10,14 +10,13 @@ import { useJob } from "@/hooks/useJob";
import { useUser } from "@/hooks/useUser";
import { getRepository } from "@/lib/data/repositoryFactory";
import { clientIdHandler } from "@/lib/utils/clientIdHandler";
-import { useVoice } from "@humeai/voice-react";
import * as Sentry from "@sentry/nextjs";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { motion } from "framer-motion";
import { Home, Layout, MessageCircle, X } from "lucide-react";
import Link from "next/link";
import { useParams, useRouter } from "next/navigation";
-import { useEffect, useState } from "react";
+import { useEffect, useMemo, useState } from "react";
import { toast } from "sonner";
import { InterviewStartModal } from "./interview-start-modal";
@@ -131,6 +130,17 @@ export function InterviewPlaceholder({ accessToken, configId }: InterviewPlaceho
}
};
+ const backgroundElements = useMemo(
+ () =>
+ Array.from({ length: 6 }, () => ({
+ width: Math.random() * 400 + 200,
+ height: Math.random() * 400 + 200,
+ left: `${Math.random() * 100}%`,
+ top: `${Math.random() * 100}%`,
+ })),
+ []
+ );
+
if (isLoading || isUserLoading) {
return (
@@ -169,15 +179,15 @@ export function InterviewPlaceholder({ accessToken, configId }: InterviewPlaceho
- {Array.from({ length: 6 }).map((_, i) => (
+ {backgroundElements.map((el, i) => (
{
+ if (
+ status.value === "connected" &&
+ !sessionSettingsSentRef.current &&
+ sessionSettings?.systemPrompt
+ ) {
+ sessionSettingsSentRef.current = true;
+ logger.info("Sending session settings over WebSocket");
+ sendSessionSettings({
+ systemPrompt: sessionSettings.systemPrompt,
+ ...(sessionSettings.context && { context: sessionSettings.context }),
+ });
+ }
+ }, [status.value, sessionSettings, sendSessionSettings]);
useEffect(() => {
// Reset flag if navigating to a different interview
@@ -68,6 +85,7 @@ function InterviewVoiceConnector({
);
hasGlobalConnectionAttempt = false;
lastConnectionInterviewId = interviewId;
+ sessionSettingsSentRef.current = false;
}
// Only attempt connection once globally (survives strict mode remounts for same interview)
@@ -89,29 +107,34 @@ function InterviewVoiceConnector({
// Mark that we've attempted connection globally
hasGlobalConnectionAttempt = true;
- // Connect with auth configuration
- const humeSessionSettings = {
- type: "session_settings" as const,
- systemPrompt: sessionSettings.systemPrompt,
- ...(sessionSettings.context && { context: sessionSettings.context }),
- };
-
- connect({
- auth: authConfig,
- configId,
- sessionSettings: humeSessionSettings,
- }).catch((error) => {
- logger.error({ error }, "Connection failed");
-
- // Notify state machine of connection error
- interviewStateMachine.send({
- type: "CONNECTION_ERROR",
- error: error instanceof Error ? error.message : "Connection failed",
+ // Delay connection slightly to survive React Strict Mode double-mount.
+ // Without this, the first mount starts a WebSocket that gets canceled by
+ // cleanup, and the second mount sees hasGlobalConnectionAttempt=true and skips.
+ const connectTimer = setTimeout(() => {
+ // Connect WITHOUT sessionSettings to avoid URL length limits.
+ // Session settings are sent as a WebSocket message after connection opens.
+ connect({
+ auth: authConfig,
+ configId,
+ }).catch((error) => {
+ logger.error({ error }, "Connection failed");
+
+ // Notify state machine of connection error
+ interviewStateMachine.send({
+ type: "CONNECTION_ERROR",
+ error: error instanceof Error ? error.message : "Connection failed",
+ });
+
+ // Reset so we can retry on error
+ hasGlobalConnectionAttempt = false;
});
+ }, 100);
- // Reset so we can retry on error
+ return () => {
+ clearTimeout(connectTimer);
+ // If canceled before connect fires, allow retry
hasGlobalConnectionAttempt = false;
- });
+ };
}, [connect, authConfig, configId, sessionSettings, status, interviewStateMachine, interviewId]);
return <>{children}>;
diff --git a/src/components/interview/interview-controller.tsx b/src/components/interview/interview-controller.tsx
index 7dda5202..7c5eb784 100644
--- a/src/components/interview/interview-controller.tsx
+++ b/src/components/interview/interview-controller.tsx
@@ -130,12 +130,17 @@ export const InterviewController = React.memo(function InterviewController({
},
});
- // Expose forceSave to parent for AI disconnect handling
+ // Expose forceSave to parent via ref to avoid re-render loop
+ // (forceSave changes every time messages change, which would cause
+ // parent setState → re-render → children re-render → new forceSave → loop)
+ const forceSaveRef = useRef(forceSave);
+ forceSaveRef.current = forceSave;
+
React.useEffect(() => {
- if (onForceSaveReady && forceSave) {
- onForceSaveReady(forceSave);
+ if (onForceSaveReady) {
+ onForceSaveReady(() => forceSaveRef.current());
}
- }, [onForceSaveReady, forceSave]);
+ }, [onForceSaveReady]);
// End of interview mutation
const { mutate: endInterview } = useMutation({
diff --git a/src/hooks/useExtractText.ts b/src/hooks/useExtractText.ts
index d51ec82d..d4a2743d 100644
--- a/src/hooks/useExtractText.ts
+++ b/src/hooks/useExtractText.ts
@@ -17,8 +17,48 @@ interface ExtractUrlResponse {
};
}
+interface AsyncExtractionResponse {
+ data: {
+ extractionId: string;
+ };
+}
+
+interface ExtractionStreamResult {
+ status: "pending" | "completed" | "error";
+ extractedText?: string;
+ fileName?: string;
+ fileType?: string;
+ url?: string;
+ characterCount?: number;
+ error?: string;
+}
+
+async function pollExtractionStream(extractionId: string): Promise {
+ return new Promise((resolve, reject) => {
+ const eventSource = new EventSource(`/api/extractions/${extractionId}/stream`);
+
+ eventSource.onmessage = (event) => {
+ const data: ExtractionStreamResult = JSON.parse(event.data);
+
+ if (data.status === "completed") {
+ eventSource.close();
+ resolve(data);
+ } else if (data.status === "error") {
+ eventSource.close();
+ reject(new Error(data.error || "Extraction failed"));
+ }
+ };
+
+ eventSource.onerror = () => {
+ eventSource.close();
+ reject(new Error("Connection to extraction stream failed"));
+ };
+ });
+}
+
/**
* Hook to extract text from a file (PDF, Word, or images)
+ * Handles both cached (immediate) and async (Inngest) responses
*/
export function useExtractFile() {
return useMutation({
@@ -33,13 +73,32 @@ export function useExtractFile() {
throw new Error(errorData.error?.message || "Failed to extract text from file");
}
- return response.json();
+ const json = await response.json();
+
+ // Cached result returned directly (200)
+ if (response.status === 200) {
+ return json;
+ }
+
+ // Async extraction (202) — poll for result via SSE
+ const extractionId = (json as AsyncExtractionResponse).data.extractionId;
+ const streamResult = await pollExtractionStream(extractionId);
+
+ return {
+ data: {
+ extractedText: streamResult.extractedText ?? "",
+ fileName: streamResult.fileName ?? "",
+ fileType: streamResult.fileType ?? "",
+ characterCount: streamResult.characterCount ?? 0,
+ },
+ };
},
});
}
/**
* Hook to extract text from a URL
+ * Now dispatches to Inngest and polls for result
*/
export function useExtractUrl() {
return useMutation({
@@ -57,7 +116,23 @@ export function useExtractUrl() {
throw new Error(errorData.error?.message || "Failed to extract text from URL");
}
- return response.json();
+ const json = await response.json();
+
+ // Async extraction (202) — poll for result via SSE
+ if (response.status === 202) {
+ const extractionId = (json as AsyncExtractionResponse).data.extractionId;
+ const streamResult = await pollExtractionStream(extractionId);
+
+ return {
+ data: {
+ extractedText: streamResult.extractedText ?? "",
+ url: streamResult.url ?? url,
+ characterCount: streamResult.characterCount ?? 0,
+ },
+ };
+ }
+
+ return json;
},
});
}
diff --git a/src/stores/createJobStore.ts b/src/stores/createJobStore.ts
index 51b56e31..85babf9f 100644
--- a/src/stores/createJobStore.ts
+++ b/src/stores/createJobStore.ts
@@ -21,6 +21,8 @@ interface CreateJobState {
isOutOfMinutesDialogOpen: boolean;
isScheduleErrorDialogOpen: boolean;
errorMessage?: string;
+ saveAsDefault: boolean;
+ cvFilename: string | null;
}
interface CreateJobActions {
@@ -35,6 +37,8 @@ interface CreateJobActions {
setIsOutOfMinutesDialogOpen: (isOpen: boolean) => void;
setIsScheduleErrorDialogOpen: (isOpen: boolean) => void;
setErrorMessage: (message?: string) => void;
+ setSaveAsDefault: (save: boolean) => void;
+ setCvFilename: (filename: string | null) => void;
resetStore: () => void;
}
@@ -50,6 +54,8 @@ const initialState: CreateJobState = {
isOutOfMinutesDialogOpen: false,
isScheduleErrorDialogOpen: false,
errorMessage: undefined,
+ saveAsDefault: false,
+ cvFilename: null,
};
export const useCreateJobStore = create(
@@ -69,6 +75,8 @@ export const useCreateJobStore = create(
setIsScheduleErrorDialogOpen: (isScheduleErrorDialogOpen: boolean) =>
set({ isScheduleErrorDialogOpen }),
setErrorMessage: (errorMessage?: string) => set({ errorMessage }),
+ setSaveAsDefault: (saveAsDefault: boolean) => set({ saveAsDefault }),
+ setCvFilename: (cvFilename: string | null) => set({ cvFilename }),
resetStore: () => set(initialState),
},
}))
@@ -89,4 +97,6 @@ export const useCreateJobIsOutOfMinutesDialogOpen = () =>
export const useCreateJobIsScheduleErrorDialogOpen = () =>
useCreateJobStore((state) => state.isScheduleErrorDialogOpen);
export const useCreateJobErrorMessage = () => useCreateJobStore((state) => state.errorMessage);
+export const useCreateJobSaveAsDefault = () => useCreateJobStore((state) => state.saveAsDefault);
+export const useCreateJobCvFilename = () => useCreateJobStore((state) => state.cvFilename);
export const useCreateJobActions = () => useCreateJobStore((state) => state.actions);
diff --git a/terraform/s3.tf b/terraform/s3.tf
index d0fac4ab..5a764995 100644
--- a/terraform/s3.tf
+++ b/terraform/s3.tf
@@ -35,23 +35,21 @@ resource "aws_s3_bucket_lifecycle_configuration" "audio_recordings_lifecycle" {
bucket = aws_s3_bucket.audio_recordings.id
rule {
- id = "transition-to-standard-ia"
+ id = "expire-recordings"
status = "Enabled"
- transition {
- days = 30
- storage_class = "STANDARD_IA"
+ # Delete recordings after 30 days to control bucket growth
+ expiration {
+ days = 30
}
- # Transition old versions to Glacier after 60 days
- transition {
- days = 60
- storage_class = "GLACIER"
+ # Clean up old versions and incomplete uploads
+ noncurrent_version_expiration {
+ noncurrent_days = 7
}
- # Expire old versions after 365 days
- expiration {
- days = 365
+ abort_incomplete_multipart_upload {
+ days_after_initiation = 1
}
}
}