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} +

+ )} +
+ +
+ )} + {/* 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)} + /> + +
+ )}
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 } } }