From 6174b44570565910d59f9fc9746ce65228f28739 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Tue, 3 Mar 2026 14:58:14 +0100 Subject: [PATCH] fix: bump @mintel/payload-ai to 1.9.13 and apply CSS loader shim for Next.js dev server --- apps/web/ignore-css.js | 2 + apps/web/ignore-css.mjs | 12 + apps/web/package.json | 9 +- apps/web/scripts/cms-sync.sh | 8 +- apps/web/scripts/import-leads.ts | 168 +++++++ apps/web/scripts/restore-db.sh | 61 +++ package.json | 8 + pnpm-lock.yaml | 783 ++++++++++++++++++++++++++++++- 8 files changed, 1041 insertions(+), 10 deletions(-) create mode 100644 apps/web/ignore-css.js create mode 100644 apps/web/ignore-css.mjs create mode 100644 apps/web/scripts/import-leads.ts create mode 100644 apps/web/scripts/restore-db.sh diff --git a/apps/web/ignore-css.js b/apps/web/ignore-css.js new file mode 100644 index 0000000..df8ec26 --- /dev/null +++ b/apps/web/ignore-css.js @@ -0,0 +1,2 @@ +const Module = require("module"); +Module._extensions[".css"] = function () {}; diff --git a/apps/web/ignore-css.mjs b/apps/web/ignore-css.mjs new file mode 100644 index 0000000..d766685 --- /dev/null +++ b/apps/web/ignore-css.mjs @@ -0,0 +1,12 @@ +import { extname } from 'node:path'; + +export async function load(url, context, nextLoad) { + if (url.endsWith('.css') || url.endsWith('.scss')) { + return { + format: 'module', + shortCircuit: true, + source: 'export default {};' + }; + } + return nextLoad(url, context); +} diff --git a/apps/web/package.json b/apps/web/package.json index 2c68e31..b008329 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "pnpm run seed:context && next dev --webpack --hostname 0.0.0.0", "dev:native": "DATABASE_URI=postgres://payload:payload@127.0.0.1:54321/payload PAYLOAD_SECRET=dev-secret pnpm run seed:context && DATABASE_URI=postgres://payload:payload@127.0.0.1:54321/payload PAYLOAD_SECRET=dev-secret next dev --webpack", - "seed:context": "tsx ./seed-context.ts", + "seed:context": "node --import tsx --experimental-loader ./ignore-css.mjs ./seed-context.ts", "build": "next build --webpack", "start": "next start", "lint": "eslint app src scripts video", @@ -26,8 +26,11 @@ "check:forms": "tsx scripts/check-forms.ts", "cms:push:testing": "bash ./scripts/cms-sync.sh push testing", "cms:pull:testing": "bash ./scripts/cms-sync.sh pull testing", + "cms:push:staging": "bash ./scripts/cms-sync.sh push staging", + "cms:pull:staging": "bash ./scripts/cms-sync.sh pull staging", "cms:push:prod": "bash ./scripts/cms-sync.sh push prod", - "cms:pull:prod": "bash ./scripts/cms-sync.sh pull prod" + "cms:pull:prod": "bash ./scripts/cms-sync.sh pull prod", + "db:restore": "bash ./scripts/restore-db.sh" }, "dependencies": { "@aws-sdk/client-s3": "^3.750.0", @@ -39,7 +42,7 @@ "@mintel/content-engine": "link:../../../at-mintel/packages/content-engine", "@mintel/estimation-engine": "link:../../../at-mintel/packages/estimation-engine", "@mintel/meme-generator": "link:../../../at-mintel/packages/meme-generator", - "@mintel/payload-ai": "^1.9.10", + "@mintel/payload-ai": "^1.9.13", "@mintel/pdf": "link:../../../at-mintel/packages/pdf-library", "@mintel/thumbnail-generator": "link:../../../at-mintel/packages/thumbnail-generator", "@next/mdx": "^16.1.6", diff --git a/apps/web/scripts/cms-sync.sh b/apps/web/scripts/cms-sync.sh index 1a5640e..a44a818 100755 --- a/apps/web/scripts/cms-sync.sh +++ b/apps/web/scripts/cms-sync.sh @@ -108,8 +108,12 @@ resolve_target() { # Auto-detect remote DB credentials from the env file on the server echo "🔍 Detecting $TARGET database credentials..." - REMOTE_DB_USER="directus" - REMOTE_DB_NAME="directus" + + # Try specific environment file first, then fallback to .env and .env.* + REMOTE_DB_USER=$(ssh "$SSH_HOST" "grep -h '^\(POSTGRES_USER\|postgres_DB_USER\)=' $REMOTE_SITE_DIR/.env.$TARGET $REMOTE_SITE_DIR/.env 2>/dev/null | head -1 | cut -d= -f2" || echo "") + REMOTE_DB_NAME=$(ssh "$SSH_HOST" "grep -h '^\(POSTGRES_DB\|postgres_DB_NAME\)=' $REMOTE_SITE_DIR/.env.$TARGET $REMOTE_SITE_DIR/.env 2>/dev/null | head -1 | cut -d= -f2" || echo "") + + # Fallback if empty REMOTE_DB_USER="${REMOTE_DB_USER:-payload}" REMOTE_DB_NAME="${REMOTE_DB_NAME:-payload}" echo " User: $REMOTE_DB_USER | DB: $REMOTE_DB_NAME" diff --git a/apps/web/scripts/import-leads.ts b/apps/web/scripts/import-leads.ts new file mode 100644 index 0000000..c757fd4 --- /dev/null +++ b/apps/web/scripts/import-leads.ts @@ -0,0 +1,168 @@ +import fs from "node:fs"; +import * as xlsxImport from "xlsx"; +const xlsx = (xlsxImport as any).default || xlsxImport; +import { getPayload } from "payload"; +import configPromise from "../payload.config"; + +async function run() { + try { + console.log("Initializing Payload..."); + const payload = await getPayload({ config: configPromise }); + + const filePath = "/Users/marcmintel/Downloads/Akquise_Branchen.xlsx"; + if (!fs.existsSync(filePath)) { + console.error("File not found:", filePath); + process.exit(1); + } + + console.log(`Reading Excel file: ${filePath}`); + const wb = xlsx.readFile(filePath); + + let accountsCreated = 0; + let contactsCreated = 0; + + for (const sheetName of wb.SheetNames) { + if ( + sheetName === "Weitere Kundenideen" || + sheetName.includes("BKF Firmen") + ) + continue; + + let industry = sheetName + .replace(/^\d+_/, "") + .replace(/^\d+\.\s*/, "") + .replace(/_/g, " "); + console.log( + `\n--- Importing Sheet: ${sheetName} -> Industry: ${industry} ---`, + ); + const rows = xlsx.utils.sheet_to_json(wb.Sheets[sheetName]); + + for (const row of rows) { + const companyName = row["Unternehmen"]?.trim(); + const website = row["Webseitenlink"]?.trim(); + let email = row["Emailadresse"]?.trim(); + const contactName = row["Ansprechpartner"]?.trim(); + const position = row["Position"]?.trim(); + const statusRaw = row["Webseiten-Status (alt/gut/schlecht)"] + ?.trim() + ?.toLowerCase(); + const notes = row["Notizen"]?.trim(); + + if (!companyName) continue; + + let websiteStatus = "unknown"; + if (statusRaw === "gut") websiteStatus = "gut"; + else if (statusRaw === "ok" || statusRaw === "okay") + websiteStatus = "ok"; + else if ( + statusRaw === "schlecht" || + statusRaw === "alt" || + statusRaw === "veraltet" + ) + websiteStatus = "schlecht"; + + // Find or create account + let accountId; + const whereClause = website + ? { website: { equals: website } } + : { name: { equals: companyName } }; + + const existingAccounts = await payload.find({ + collection: "crm-accounts", + where: whereClause, + }); + + if (existingAccounts.docs.length > 0) { + accountId = existingAccounts.docs[0].id; + console.log(`[SKIP] Account exists: ${companyName}`); + } else { + try { + const newAccount = await payload.create({ + collection: "crm-accounts", + data: { + name: companyName, + website: website || "", + status: "lead", + leadTemperature: "cold", + industry, + websiteStatus, + notes, + } as any, + }); + accountId = newAccount.id; + accountsCreated++; + console.log(`[OK] Created account: ${companyName}`); + } catch (err: any) { + console.error( + `[ERROR] Failed to create account ${companyName}:`, + err.message, + ); + continue; // Skip contact creation if account failed + } + } + + // Handle contact + if (email) { + // Some rows have multiple emails or contacts. Let's just pick the first email if there are commas. + if (email.includes(",")) email = email.split(",")[0].trim(); + + const existingContacts = await payload.find({ + collection: "crm-contacts", + where: { email: { equals: email } }, + }); + + if (existingContacts.docs.length === 0) { + let firstName = "Team"; + let lastName = companyName; // fallback + + if (contactName) { + // If multiple contacts are listed, just take the first one + const firstContact = contactName.split(",")[0].trim(); + const parts = firstContact.split(" "); + if (parts.length > 1) { + lastName = parts.pop(); + firstName = parts.join(" "); + } else { + firstName = firstContact; + lastName = "Contact"; + } + } + + try { + await payload.create({ + collection: "crm-contacts", + data: { + email, + firstName, + lastName, + role: position, + account: accountId as any, + }, + }); + contactsCreated++; + console.log(` -> [OK] Created contact: ${email}`); + } catch (err: any) { + console.error( + ` -> [ERROR] Failed to create contact ${email}:`, + err.message, + ); + } + } else { + console.log(` -> [SKIP] Contact exists: ${email}`); + } + } + } + } + + console.log(`\nMigration completed successfully!`); + console.log( + `Created ${accountsCreated} Accounts and ${contactsCreated} Contacts.`, + ); + process.exit(0); + } catch (e) { + console.error("Migration failed:", e); + process.exit(1); + } +} + +run(); diff --git a/apps/web/scripts/restore-db.sh b/apps/web/scripts/restore-db.sh new file mode 100644 index 0000000..07678d0 --- /dev/null +++ b/apps/web/scripts/restore-db.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# ──────────────────────────────────────────────────────────────────────────── +# Payload CMS Database Restore +# Restores a backup created by backup-db.sh +# Usage: pnpm run db:restore +# ──────────────────────────────────────────────────────────────────────────── +set -euo pipefail + +# Load environment variables +if [ -f ../../.env ]; then + set -a; source ../../.env; set +a +fi +if [ -f .env ]; then + set -a; source .env; set +a +fi + +DB_NAME="${postgres_DB_NAME:-payload}" +DB_USER="${postgres_DB_USER:-payload}" +DB_CONTAINER="mintel-me-postgres-db-1" + +BACKUP_FILE="${1:-}" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BACKUP_DIR="${SCRIPT_DIR}/../../../../backups" + +if [ -z "$BACKUP_FILE" ]; then + echo "❌ Usage: pnpm run db:restore " + echo "" + echo "📋 Available backups in $BACKUP_DIR:" + ls -lh "$BACKUP_DIR"/*.dump 2>/dev/null | awk '{print " " $NF " (" $5 ")"}' || echo " No backups found." + exit 1 +fi + +if [ ! -f "$BACKUP_FILE" ]; then + echo "❌ Backup file not found: $BACKUP_FILE" + exit 1 +fi + +# Check if container is running +if ! docker ps --format '{{.Names}}' | grep -q "$DB_CONTAINER"; then + echo "❌ Database container '$DB_CONTAINER' is not running." + echo " Start it with: pnpm dev:docker" + exit 1 +fi + +echo "⚠️ WARNING: This will REPLACE ALL DATA in the '$DB_NAME' database!" +echo " Backup file: $BACKUP_FILE" +echo "" +read -p "Are you sure? (y/N) " -n 1 -r +echo "" + +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Cancelled." + exit 0 +fi + +echo "🔄 Restoring database from $BACKUP_FILE..." +# Uses pg_restore for custom format dumps (-F c) produced by backup-db.sh +cat "$BACKUP_FILE" | docker exec -i "$DB_CONTAINER" pg_restore -U "$DB_USER" -d "$DB_NAME" --clean --if-exists + +echo "✅ Database restored successfully!" diff --git a/package.json b/package.json index fad3175..2fa2927 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,13 @@ "lint:yaml": "node scripts/lint-yaml.js", "optimize-blog": "tsx --env-file=.env apps/web/scripts/optimize-blog-post.ts", "db:backup": "bash apps/web/scripts/backup-db.sh", + "db:restore": "bash apps/web/scripts/restore-db.sh", + "cms:push:testing": "bash apps/web/scripts/cms-sync.sh push testing", + "cms:pull:testing": "bash apps/web/scripts/cms-sync.sh pull testing", + "cms:push:staging": "bash apps/web/scripts/cms-sync.sh push staging", + "cms:pull:staging": "bash apps/web/scripts/cms-sync.sh pull staging", + "cms:push:prod": "bash apps/web/scripts/cms-sync.sh push prod", + "cms:pull:prod": "bash apps/web/scripts/cms-sync.sh pull prod", "prepare": "husky" }, "devDependencies": { @@ -60,6 +67,7 @@ "dependencies": { "@eslint/compat": "^2.0.2", "@mintel/acquisition": "link:../at-mintel/packages/acquisition-library", + "@mintel/payload-ai": "1.9.13", "tsx": "^4.21.0", "turbo": "^2.8.10" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 441483a..3a4ffea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: "@mintel/acquisition": specifier: link:../at-mintel/packages/acquisition-library version: link:../at-mintel/packages/acquisition-library + "@mintel/payload-ai": + specifier: 1.9.13 + version: 1.9.13(@payloadcms/next@3.77.0(graphql@16.12.0)(monaco-editor@0.55.1)(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@payloadcms/ui@3.77.0(monaco-editor@0.55.1)(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(ws@8.19.0) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -121,8 +124,8 @@ importers: specifier: link:../../../at-mintel/packages/meme-generator version: link:../../../at-mintel/packages/meme-generator "@mintel/payload-ai": - specifier: link:../../../at-mintel/packages/payload-ai - version: link:../../../at-mintel/packages/payload-ai + specifier: ^1.9.13 + version: 1.9.13(@payloadcms/next@3.77.0(graphql@16.12.0)(monaco-editor@0.55.1)(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@payloadcms/ui@3.77.0(monaco-editor@0.55.1)(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(ws@8.19.0) "@mintel/pdf": specifier: link:../../../at-mintel/packages/pdf-library version: link:../../../at-mintel/packages/pdf-library @@ -405,6 +408,49 @@ importers: version: 8.54.0(eslint@10.0.0(jiti@1.21.7))(typescript@5.9.3) packages: + "@ai-sdk/gateway@3.0.61": + resolution: + { + integrity: sha512-OT6SeORuOoqfABhntMJHmInblxE2DbBYvRTynVOGl6dCDDh0cNU1lJgknyDV698eQmfb6Um/94/rImgt0ZPjDA==, + } + engines: { node: ">=18" } + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + "@ai-sdk/openai@3.0.39": + resolution: + { + integrity: sha512-EZrs4L6kMkPQhpodagpEvqLSryOIK99WgblN0IsVHr1xhajWizQOZ0XMa7c5JpSYgIjV6u8GCpGV6hS3Mk2Bug==, + } + engines: { node: ">=18" } + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + "@ai-sdk/provider-utils@4.0.17": + resolution: + { + integrity: sha512-oyCeFINTYK0B8ZGUBiQc05G5vytPlKSmTTtm19xfJuUgoi8zkvvRcoPQci4mSnyfpPn2XSFFDfsALG8uGcapfg==, + } + engines: { node: ">=18" } + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + "@ai-sdk/provider@3.0.8": + resolution: + { + integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==, + } + engines: { node: ">=18" } + + "@ai-sdk/react@3.0.110": + resolution: + { + integrity: sha512-kMjMg9BSSksVgiSVwJmyWN49EbxAv9YZ0SlabHqjAFP9T2DkzBj2WUkZWnr14Da0DYpFMgsT9wXBmRGagKlHxA==, + } + engines: { node: ">=18" } + peerDependencies: + react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 + "@alloc/quick-lru@5.2.0": resolution: { @@ -2727,6 +2773,15 @@ packages: integrity: sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==, } + "@hono/node-server@1.19.10": + resolution: + { + integrity: sha512-hZ7nOssGqRgyV3FVVQdfi+U4q02uB23bpnYpdvNXkYTRRyWx84b7yf1ans+dnJ/7h41sGL3CeQTfO+ZGxuO+Iw==, + } + engines: { node: ">=18.14.1" } + peerDependencies: + hono: ^4 + "@humanfs/core@0.19.1": resolution: { @@ -3274,6 +3329,13 @@ packages: tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fcloner/-/1.9.5/cloner-1.9.5.tgz, } + "@mintel/content-engine@1.9.10": + resolution: + { + integrity: sha512-rv5vJ1bQkW713q14tPLOgRt5Y7+t4tu76i3H3tJkCADAqGvLrM/QuI9SF6aR9H8/KHzzF7BjRHDFsHPYqzQhpg==, + tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fcontent-engine/-/1.9.10/content-engine-1.9.10.tgz, + } + "@mintel/eslint-config@1.9.5": resolution: { @@ -3288,6 +3350,20 @@ packages: tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fhusky-config/-/1.9.5/husky-config-1.9.5.tgz, } + "@mintel/journaling@1.9.10": + resolution: + { + integrity: sha512-wuOz6bhloVgw1yiA3OhRMxak7pqB5kft62QjxPz1w+LSRaRR4nDXRR1qhSdKlcqLhEJL5+kljJnVMZ3N2UhJnw==, + tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fjournaling/-/1.9.10/journaling-1.9.10.tgz, + } + + "@mintel/meme-generator@1.9.10": + resolution: + { + integrity: sha512-Mg89RH4KgKOmpFF1G6DNu/LPzzQg2CgV15lazpsLa8ce/XydcSXOv2QvS2jk3kytGHOgqnu3j3xAn10Yi4KgvA==, + tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fmeme-generator/-/1.9.10/meme-generator-1.9.10.tgz, + } + "@mintel/next-config@1.9.5": resolution: { @@ -3302,6 +3378,26 @@ packages: tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fnext-utils/-/1.9.5/next-utils-1.9.5.tgz, } + "@mintel/payload-ai@1.9.13": + resolution: + { + integrity: sha512-WFXqgCMBwOOaKUiURar7m+Yupi/ePg+NUQciJjjT9igAk4DI7QiOJpXSNzkEkhfYfHVIFNn+fNDzFrfJZThkEg==, + tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fpayload-ai/-/1.9.13/payload-ai-1.9.13.tgz, + } + peerDependencies: + "@payloadcms/next": ">=3.0.0" + "@payloadcms/ui": ">=3.0.0" + payload: ">=3.0.0" + react: ">=18.0.0" + react-dom: ">=18.0.0" + + "@mintel/thumbnail-generator@1.9.10": + resolution: + { + integrity: sha512-3YcM4w7ysuffsxUJenx7RRSyTFhirDXDTgQ1KbRhNxkQH+9fCQUrH72w9lDNCZmP2776TSmwDPK46KD5CAGKzw==, + tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Fthumbnail-generator/-/1.9.10/thumbnail-generator-1.9.10.tgz, + } + "@mintel/tsconfig@1.9.5": resolution: { @@ -3309,6 +3405,19 @@ packages: tarball: https://git.infra.mintel.me/api/packages/mmintel/npm/%40mintel%2Ftsconfig/-/1.9.5/tsconfig-1.9.5.tgz, } + "@modelcontextprotocol/sdk@1.27.1": + resolution: + { + integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==, + } + engines: { node: ">=18" } + peerDependencies: + "@cfworker/json-schema": ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + "@cfworker/json-schema": + optional: true + "@monaco-editor/loader@1.7.0": resolution: { @@ -4024,6 +4133,22 @@ packages: engines: { node: ">=18" } hasBin: true + "@qdrant/js-client-rest@1.17.0": + resolution: + { + integrity: sha512-aZFQeirWVqWAa1a8vJ957LMzcXkFHGbsoRhzc8AkGfg6V0jtK8PlG8/eyyc2xhYsR961FDDx1Tx6nyE0K7lS+A==, + } + engines: { node: ">=18.17.0", pnpm: ">=8" } + peerDependencies: + typescript: ">=4.7" + + "@qdrant/openapi-typescript-fetch@1.2.6": + resolution: + { + integrity: sha512-oQG/FejNpItrxRHoyctYvT3rwGZOnK4jr3JdppO/c78ktDvkWiPXPHNsrDf33K9sZdRb6PR7gi4noIapu5q4HA==, + } + engines: { node: ">=18.0.0", pnpm: ">=8" } + "@react-pdf/fns@3.1.2": resolution: { @@ -5773,6 +5898,18 @@ packages: integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==, } + "@types/node-fetch@2.6.13": + resolution: + { + integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==, + } + + "@types/node@18.19.130": + resolution: + { + integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==, + } + "@types/node@25.2.0": resolution: { @@ -6157,6 +6294,13 @@ packages: } engines: { node: ">=16" } + "@vercel/oidc@3.1.0": + resolution: + { + integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==, + } + engines: { node: ">= 20" } + "@vladfrangu/async_event_emitter@2.4.7": resolution: { @@ -6292,6 +6436,13 @@ packages: } engines: { node: ">= 0.6" } + accepts@2.0.0: + resolution: + { + integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, + } + engines: { node: ">= 0.6" } + acorn-import-attributes@1.9.5: resolution: { @@ -6352,6 +6503,22 @@ packages: } engines: { node: ">= 14" } + agentkeepalive@4.6.0: + resolution: + { + integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==, + } + engines: { node: ">= 8.0.0" } + + ai@6.0.108: + resolution: + { + integrity: sha512-h2xwwU9lE+tdLyII/uFcjcrw+7ciWj2S68GrwQsebjHPSfnvxwrn+sjIl+tBt419yA9rYznWXtQvHJxM1wEAAQ==, + } + engines: { node: ">=18" } + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + ajv-formats@2.1.1: resolution: { @@ -6363,6 +6530,17 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: + { + integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==, + } + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@3.5.2: resolution: { @@ -6794,6 +6972,7 @@ packages: integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==, } engines: { node: ">=10.0.0" } + deprecated: Security vulnerability fixed in 5.2.0, please upgrade bidi-js@1.0.3: resolution: @@ -6827,6 +7006,13 @@ packages: } engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + body-parser@2.2.2: + resolution: + { + integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==, + } + engines: { node: ">=18" } + body-scroll-lock@4.0.0-beta.0: resolution: { @@ -7472,6 +7658,13 @@ packages: } engines: { node: ">= 0.6" } + content-disposition@1.0.1: + resolution: + { + integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==, + } + engines: { node: ">=18" } + content-type@1.0.5: resolution: { @@ -7512,6 +7705,13 @@ packages: integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==, } + cookie-signature@1.2.2: + resolution: + { + integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, + } + engines: { node: ">=6.6.0" } + cookie@0.7.2: resolution: { @@ -7519,6 +7719,13 @@ packages: } engines: { node: ">= 0.6" } + cors@2.8.6: + resolution: + { + integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==, + } + engines: { node: ">= 0.10" } + cose-base@1.0.3: resolution: { @@ -9102,6 +9309,20 @@ packages: } engines: { node: ">=0.8.x" } + eventsource-parser@3.0.6: + resolution: + { + integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==, + } + engines: { node: ">=18.0.0" } + + eventsource@3.0.7: + resolution: + { + integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==, + } + engines: { node: ">=18.0.0" } + execa@5.1.1: resolution: { @@ -9116,6 +9337,15 @@ packages: } engines: { node: ">=0.10.0" } + express-rate-limit@8.2.1: + resolution: + { + integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==, + } + engines: { node: ">= 16" } + peerDependencies: + express: ">= 4.11" + express@4.22.1: resolution: { @@ -9123,6 +9353,13 @@ packages: } engines: { node: ">= 0.10.0" } + express@5.2.1: + resolution: + { + integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==, + } + engines: { node: ">= 18" } + extend@3.0.2: resolution: { @@ -9300,6 +9537,13 @@ packages: } engines: { node: ">= 0.8" } + finalhandler@2.1.1: + resolution: + { + integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==, + } + engines: { node: ">= 18.0.0" } + find-node-modules@2.1.3: resolution: { @@ -9406,6 +9650,12 @@ packages: } engines: { node: ">=14" } + form-data-encoder@1.7.2: + resolution: + { + integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==, + } + form-data-encoder@4.1.0: resolution: { @@ -9420,6 +9670,13 @@ packages: } engines: { node: ">= 6" } + formdata-node@4.4.1: + resolution: + { + integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, + } + engines: { node: ">= 12.20" } + forwarded-parse@2.1.2: resolution: { @@ -9476,6 +9733,13 @@ packages: } engines: { node: ">= 0.6" } + fresh@2.0.0: + resolution: + { + integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, + } + engines: { node: ">= 0.8" } + from@0.1.7: resolution: { @@ -9896,6 +10160,13 @@ packages: } engines: { node: ">=0.10.0" } + hono@4.12.4: + resolution: + { + integrity: sha512-ooiZW1Xy8rQ4oELQ++otI2T9DsKpV0M6c6cO6JGx4RTfav9poFFLlet9UMXHZnoM1yG0HWGlQLswBGX3RZmHtg==, + } + engines: { node: ">=16.9.0" } + hsl-to-hex@1.0.0: resolution: { @@ -10013,6 +10284,12 @@ packages: } engines: { node: ">=10.17.0" } + humanize-ms@1.2.1: + resolution: + { + integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, + } + husky@9.1.7: resolution: { @@ -10240,6 +10517,13 @@ packages: } engines: { node: ">=12.22.0" } + ip-address@10.0.1: + resolution: + { + integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==, + } + engines: { node: ">= 12" } + ip-address@10.1.0: resolution: { @@ -10490,6 +10774,12 @@ packages: integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, } + is-promise@4.0.0: + resolution: + { + integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==, + } + is-reference@1.2.1: resolution: { @@ -10669,6 +10959,12 @@ packages: integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==, } + jose@6.1.3: + resolution: + { + integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==, + } + joycon@3.1.1: resolution: { @@ -10767,6 +11063,18 @@ packages: integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, } + json-schema-typed@8.0.2: + resolution: + { + integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==, + } + + json-schema@0.4.0: + resolution: + { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, + } + json-stable-stringify-without-jsonify@1.0.1: resolution: { @@ -11294,6 +11602,13 @@ packages: } engines: { node: ">= 0.6" } + media-typer@1.1.0: + resolution: + { + integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==, + } + engines: { node: ">= 0.8" } + mediabunny@1.29.0: resolution: { @@ -11326,6 +11641,13 @@ packages: integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, } + merge-descriptors@2.0.0: + resolution: + { + integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==, + } + engines: { node: ">=18" } + merge-stream@2.0.0: resolution: { @@ -11879,6 +12201,14 @@ packages: integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, } + node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: resolution: { @@ -12100,6 +12430,21 @@ packages: } engines: { node: ">=12" } + openai@4.104.0: + resolution: + { + integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==, + } + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + optionator@0.9.4: resolution: { @@ -12365,6 +12710,12 @@ packages: integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, } + path-to-regexp@8.3.0: + resolution: + { + integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==, + } + path-type@4.0.0: resolution: { @@ -12547,6 +12898,13 @@ packages: } engines: { node: ">= 6" } + pkce-challenge@5.0.1: + resolution: + { + integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==, + } + engines: { node: ">=16.20.0" } + pkg-dir@4.2.0: resolution: { @@ -13269,6 +13627,13 @@ packages: } engines: { node: ">= 0.8" } + raw-body@3.0.2: + resolution: + { + integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==, + } + engines: { node: ">= 0.10" } + react-datepicker@7.6.0: resolution: { @@ -13789,6 +14154,13 @@ packages: integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==, } + router@2.2.0: + resolution: + { + integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==, + } + engines: { node: ">= 18" } + rrweb-cssom@0.8.0: resolution: { @@ -13990,6 +14362,13 @@ packages: } engines: { node: ">= 0.8.0" } + send@1.2.1: + resolution: + { + integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==, + } + engines: { node: ">= 18" } + serialize-javascript@6.0.2: resolution: { @@ -14003,6 +14382,13 @@ packages: } engines: { node: ">= 0.8.0" } + serve-static@2.2.1: + resolution: + { + integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==, + } + engines: { node: ">= 18" } + set-blocking@2.0.0: resolution: { @@ -14762,6 +15148,13 @@ packages: integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==, } + throttleit@2.1.0: + resolution: + { + integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==, + } + engines: { node: ">=18" } + through@2.3.8: resolution: { @@ -15099,6 +15492,13 @@ packages: } engines: { node: ">= 0.6" } + type-is@2.0.1: + resolution: + { + integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==, + } + engines: { node: ">= 0.6" } + typed-array-buffer@1.0.3: resolution: { @@ -15183,12 +15583,25 @@ packages: } engines: { node: ">= 0.4" } + undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + undici-types@7.16.0: resolution: { integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==, } + undici@6.23.0: + resolution: + { + integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==, + } + engines: { node: ">=18.17" } + undici@7.18.2: resolution: { @@ -15505,6 +15918,13 @@ packages: integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, } + web-streams-polyfill@4.0.0-beta.3: + resolution: + { + integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, + } + engines: { node: ">= 14" } + webdriver-bidi-protocol@0.4.0: resolution: { @@ -15929,6 +16349,14 @@ packages: integrity: sha512-ZGtsemSpXnDky2AUYWgxjaopgB+shFHgXVpiJFeNB5nWEugpW1KWYDaHKuLqh2b67r24GtP6HoSW5swvf0fFIQ==, } + zod-to-json-schema@3.25.1: + resolution: + { + integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==, + } + peerDependencies: + zod: ^3.25 || ^4 + zod-validation-error@4.0.2: resolution: { @@ -15957,6 +16385,40 @@ packages: } snapshots: + "@ai-sdk/gateway@3.0.61(zod@3.25.76)": + dependencies: + "@ai-sdk/provider": 3.0.8 + "@ai-sdk/provider-utils": 4.0.17(zod@3.25.76) + "@vercel/oidc": 3.1.0 + zod: 3.25.76 + + "@ai-sdk/openai@3.0.39(zod@3.25.76)": + dependencies: + "@ai-sdk/provider": 3.0.8 + "@ai-sdk/provider-utils": 4.0.17(zod@3.25.76) + zod: 3.25.76 + + "@ai-sdk/provider-utils@4.0.17(zod@3.25.76)": + dependencies: + "@ai-sdk/provider": 3.0.8 + "@standard-schema/spec": 1.1.0 + eventsource-parser: 3.0.6 + zod: 3.25.76 + + "@ai-sdk/provider@3.0.8": + dependencies: + json-schema: 0.4.0 + + "@ai-sdk/react@3.0.110(react@19.2.4)(zod@3.25.76)": + dependencies: + "@ai-sdk/provider-utils": 4.0.17(zod@3.25.76) + ai: 6.0.108(zod@3.25.76) + react: 19.2.4 + swr: 2.4.0(react@19.2.4) + throttleit: 2.1.0 + transitivePeerDependencies: + - zod + "@alloc/quick-lru@5.2.0": {} "@antfu/install-pkg@1.1.0": @@ -17649,6 +18111,10 @@ snapshots: "@formatjs/fast-memoize": 3.1.0 tslib: 2.8.1 + "@hono/node-server@1.19.10(hono@4.12.4)": + dependencies: + hono: 4.12.4 + "@humanfs/core@0.19.1": {} "@humanfs/node@0.16.7": @@ -18080,6 +18546,19 @@ snapshots: - supports-color - utf-8-validate + "@mintel/content-engine@1.9.10(ws@8.19.0)(zod@3.25.76)": + dependencies: + "@mintel/journaling": 1.9.10(ws@8.19.0)(zod@3.25.76) + "@mintel/meme-generator": 1.9.10(ws@8.19.0)(zod@3.25.76) + "@mintel/thumbnail-generator": 1.9.10 + dotenv: 17.3.1 + openai: 4.104.0(ws@8.19.0)(zod@3.25.76) + transitivePeerDependencies: + - debug + - encoding + - ws + - zod + "@mintel/eslint-config@1.9.5(@typescript-eslint/parser@8.54.0(eslint@10.0.0(jiti@1.21.7))(typescript@5.9.3))(eslint@10.0.0(jiti@1.21.7))(typescript@5.9.3)": dependencies: "@eslint/eslintrc": 3.3.3 @@ -18118,6 +18597,24 @@ snapshots: dependencies: "@commitlint/config-conventional": 20.4.1 + "@mintel/journaling@1.9.10(ws@8.19.0)(zod@3.25.76)": + dependencies: + axios: 1.13.4 + openai: 4.104.0(ws@8.19.0)(zod@3.25.76) + transitivePeerDependencies: + - debug + - encoding + - ws + - zod + + "@mintel/meme-generator@1.9.10(ws@8.19.0)(zod@3.25.76)": + dependencies: + openai: 4.104.0(ws@8.19.0)(zod@3.25.76) + transitivePeerDependencies: + - encoding + - ws + - zod + "@mintel/next-config@1.9.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(@swc/helpers@0.5.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4)(typescript@5.9.3)(webpack@5.96.1(esbuild@0.27.3))": dependencies: "@sentry/nextjs": 10.38.0(@opentelemetry/context-async-hooks@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.0(@opentelemetry/api@1.9.0))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(react@19.2.4)(webpack@5.96.1(esbuild@0.27.3)) @@ -18181,8 +18678,58 @@ snapshots: - sass - typescript + "@mintel/payload-ai@1.9.13(@payloadcms/next@3.77.0(graphql@16.12.0)(monaco-editor@0.55.1)(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(@payloadcms/ui@3.77.0(monaco-editor@0.55.1)(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(ws@8.19.0)": + dependencies: + "@ai-sdk/openai": 3.0.39(zod@3.25.76) + "@ai-sdk/react": 3.0.110(react@19.2.4)(zod@3.25.76) + "@mintel/content-engine": 1.9.10(ws@8.19.0)(zod@3.25.76) + "@mintel/thumbnail-generator": 1.9.10 + "@modelcontextprotocol/sdk": 1.27.1(zod@3.25.76) + "@payloadcms/next": 3.77.0(@types/react@19.2.13)(graphql@16.12.0)(monaco-editor@0.55.1)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + "@payloadcms/ui": 3.77.0(@types/react@19.2.13)(monaco-editor@0.55.1)(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.77.4))(payload@3.77.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + "@qdrant/js-client-rest": 1.17.0(typescript@5.9.3) + ai: 6.0.108(zod@3.25.76) + payload: 3.77.0(graphql@16.12.0)(typescript@5.9.3) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + replicate: 1.4.0 + zod: 3.25.76 + transitivePeerDependencies: + - "@cfworker/json-schema" + - debug + - encoding + - supports-color + - typescript + - ws + + "@mintel/thumbnail-generator@1.9.10": + dependencies: + replicate: 1.4.0 + "@mintel/tsconfig@1.9.5": {} + "@modelcontextprotocol/sdk@1.27.1(zod@3.25.76)": + dependencies: + "@hono/node-server": 1.19.10(hono@4.12.4) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 8.2.1(express@5.2.1) + hono: 4.12.4 + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - supports-color + "@monaco-editor/loader@1.7.0": dependencies: state-local: 1.0.7 @@ -18845,6 +19392,14 @@ snapshots: - react-native-b4a - supports-color + "@qdrant/js-client-rest@1.17.0(typescript@5.9.3)": + dependencies: + "@qdrant/openapi-typescript-fetch": 1.2.6 + typescript: 5.9.3 + undici: 6.23.0 + + "@qdrant/openapi-typescript-fetch@1.2.6": {} + "@react-pdf/fns@3.1.2": {} "@react-pdf/font@4.0.4": @@ -20209,6 +20764,15 @@ snapshots: dependencies: "@types/node": 25.2.0 + "@types/node-fetch@2.6.13": + dependencies: + "@types/node": 25.2.0 + form-data: 4.0.5 + + "@types/node@18.19.130": + dependencies: + undici-types: 5.26.5 + "@types/node@25.2.0": dependencies: undici-types: 7.16.0 @@ -20438,6 +21002,8 @@ snapshots: "@resvg/resvg-wasm": 2.4.0 satori: 0.16.0 + "@vercel/oidc@3.1.0": {} + "@vladfrangu/async_event_emitter@2.4.7": {} "@webassemblyjs/ast@1.14.1": @@ -20535,7 +21101,6 @@ snapshots: abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - optional: true abs-svg-path@0.1.1: {} @@ -20544,6 +21109,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -20568,10 +21138,26 @@ snapshots: agent-base@7.1.4: {} + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ai@6.0.108(zod@3.25.76): + dependencies: + "@ai-sdk/gateway": 3.0.61(zod@3.25.76) + "@ai-sdk/provider": 3.0.8 + "@ai-sdk/provider-utils": 4.0.17(zod@3.25.76) + "@opentelemetry/api": 1.9.0 + zod: 3.25.76 + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -20867,6 +21453,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.14.1 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + body-scroll-lock@4.0.0-beta.0: {} boolbase@1.0.0: {} @@ -21262,6 +21862,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.1: {} + content-type@1.0.5: {} conventional-changelog-conventionalcommits@9.1.0: @@ -21278,8 +21880,15 @@ snapshots: cookie-signature@1.0.7: {} + cookie-signature@1.2.2: {} + cookie@0.7.2: {} + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -22436,8 +23045,7 @@ snapshots: stream-combiner: 0.0.4 through: 2.3.8 - event-target-shim@5.0.1: - optional: true + event-target-shim@5.0.1: {} eventemitter3@5.0.4: {} @@ -22449,6 +23057,12 @@ snapshots: events@3.3.0: {} + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -22465,6 +23079,11 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 + express-rate-limit@8.2.1(express@5.2.1): + dependencies: + express: 5.2.1 + ip-address: 10.0.1 + express@4.22.1: dependencies: accepts: 1.3.8 @@ -22501,6 +23120,39 @@ snapshots: transitivePeerDependencies: - supports-color + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.0.1 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.1 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + extend@3.0.2: {} external-editor@3.1.0: @@ -22616,6 +23268,17 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + find-node-modules@2.1.3: dependencies: findup-sync: 4.0.0 @@ -22688,6 +23351,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data-encoder@1.7.2: {} + form-data-encoder@4.1.0: {} form-data@4.0.5: @@ -22698,6 +23363,11 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + forwarded-parse@2.1.2: {} forwarded@0.2.0: {} @@ -22720,6 +23390,8 @@ snapshots: fresh@0.5.2: {} + fresh@2.0.0: {} + from@0.1.7: {} fs-extra@11.3.3: @@ -23024,6 +23696,8 @@ snapshots: dependencies: parse-passwd: 1.0.0 + hono@4.12.4: {} + hsl-to-hex@1.0.0: dependencies: hsl-to-rgb-for-reals: 1.1.1 @@ -23103,6 +23777,10 @@ snapshots: human-signals@2.1.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + husky@9.1.7: {} hyphen@1.14.1: {} @@ -23273,6 +23951,8 @@ snapshots: transitivePeerDependencies: - supports-color + ip-address@10.0.1: {} + ip-address@10.1.0: {} ipaddr.js@1.9.1: {} @@ -23393,6 +24073,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} + is-reference@1.2.1: dependencies: "@types/estree": 1.0.8 @@ -23494,6 +24176,8 @@ snapshots: jose@5.9.6: {} + jose@6.1.3: {} + joycon@3.1.1: {} jpeg-js@0.4.4: {} @@ -23562,6 +24246,10 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -23957,6 +24645,8 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + mediabunny@1.29.0: dependencies: "@types/dom-mediacapture-transform": 0.1.11 @@ -23972,6 +24662,8 @@ snapshots: merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -24414,6 +25106,8 @@ snapshots: node-addon-api@7.1.1: {} + node-domexception@1.0.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -24533,6 +25227,21 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + openai@4.104.0(ws@8.19.0)(zod@3.25.76): + dependencies: + "@types/node": 18.19.130 + "@types/node-fetch": 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.19.0 + zod: 3.25.76 + transitivePeerDependencies: + - encoding + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -24699,6 +25408,8 @@ snapshots: path-to-regexp@6.3.0: {} + path-to-regexp@8.3.0: {} + path-type@4.0.0: {} pathe@2.0.3: {} @@ -24845,6 +25556,8 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -25338,6 +26051,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + react-datepicker@7.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: "@floating-ui/react": 0.27.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -25741,6 +26461,16 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + rrweb-cssom@0.8.0: {} run-async@2.4.1: {} @@ -25867,6 +26597,22 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -25880,6 +26626,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + set-blocking@2.0.0: {} set-function-length@1.2.2: @@ -26444,6 +27199,8 @@ snapshots: dependencies: real-require: 0.2.0 + throttleit@2.1.0: {} + through@2.3.8: {} tiny-inflate@1.0.3: {} @@ -26607,6 +27364,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -26672,8 +27435,12 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + undici-types@5.26.5: {} + undici-types@7.16.0: {} + undici@6.23.0: {} + undici@7.18.2: {} undici@7.20.0: {} @@ -26891,6 +27658,8 @@ snapshots: dependencies: defaults: 1.0.4 + web-streams-polyfill@4.0.0-beta.3: {} + webdriver-bidi-protocol@0.4.0: {} webidl-conversions@3.0.1: {} @@ -27241,6 +28010,10 @@ snapshots: transitivePeerDependencies: - supports-color + zod-to-json-schema@3.25.1(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod-validation-error@4.0.2(zod@3.25.76): dependencies: zod: 3.25.76