diff --git a/app/admin/uploads/[uploadPath]/page.tsx b/app/admin/uploads/[uploadPath]/page.tsx index 82614a73..34b37a1e 100644 --- a/app/admin/uploads/[uploadPath]/page.tsx +++ b/app/admin/uploads/[uploadPath]/page.tsx @@ -8,7 +8,6 @@ import { } from '@/photo/cache'; import UploadPageClient from '@/photo/UploadPageClient'; import { - AI_TEXT_AUTO_GENERATED_FIELDS, AI_CONTENT_GENERATION_ENABLED, BLUR_ENABLED, } from '@/app/config'; @@ -16,6 +15,7 @@ import ErrorNote from '@/components/ErrorNote'; import { getRecipeTitleForData } from '@/photo/query'; import { getAlbumsWithMeta } from '@/album/query'; import { addAiTextToFormData } from '@/photo/ai/server'; +import AppGrid from '@/components/AppGrid'; export const maxDuration = 60; @@ -28,17 +28,27 @@ export default async function UploadPage({ params, searchParams }: Params) { const uploadPath = (await params).uploadPath; const title = (await searchParams)[PARAM_UPLOAD_TITLE]; - const { - blobId, - formDataFromExif: _formDataFromExif, - imageResizedBase64: imageThumbnailBase64, - shouldStripGpsData, - error, - } = await extractImageDataFromBlobPath(uploadPath, { - includeInitialPhotoFields: true, - generateBlurData: BLUR_ENABLED, - generateResizedImage: AI_CONTENT_GENERATION_ENABLED, - }); + const [ + albums, + uniqueRecipes, + uniqueFilms, + uniqueTags, { + blobId, + formDataFromExif: _formDataFromExif, + imageResizedBase64: imageThumbnailBase64, + shouldStripGpsData, + error, + }] = await Promise.all([ + getAlbumsWithMeta(), + getUniqueRecipesCached(), + getUniqueFilmsCached(), + getUniqueTagsCached(), + extractImageDataFromBlobPath(uploadPath, { + includeInitialPhotoFields: true, + generateBlurData: BLUR_ENABLED, + generateResizedImage: AI_CONTENT_GENERATION_ENABLED, + }), + ]); const isDataMissing = !_formDataFromExif || @@ -50,31 +60,23 @@ export default async function UploadPage({ params, searchParams }: Params) { } const [ - albums, - uniqueTags, - uniqueRecipes, - uniqueFilms, recipeTitle, formDataFromExif, ] = await Promise.all([ - getAlbumsWithMeta(), - getUniqueTagsCached(), - getUniqueRecipesCached(), - getUniqueFilmsCached(), _formDataFromExif?.recipeData && _formDataFromExif.film ? getRecipeTitleForData( - _formDataFromExif.recipeData, + _formDataFromExif.recipeData, _formDataFromExif.film, ) : undefined, - addAiTextToFormData( - _formDataFromExif, - imageThumbnailBase64, - ), + addAiTextToFormData({ + formData: _formDataFromExif, + imageBase64: imageThumbnailBase64, + uniqueTags, + }), ]); const hasAiTextGeneration = AI_CONTENT_GENERATION_ENABLED; - let textFieldsToAutoGenerate = AI_TEXT_AUTO_GENERATED_FIELDS; if (formDataFromExif) { if (recipeTitle) { @@ -82,8 +84,6 @@ export default async function UploadPage({ params, searchParams }: Params) { } if (typeof title === 'string') { formDataFromExif.title = title; - textFieldsToAutoGenerate = textFieldsToAutoGenerate - .filter(field => field !== 'title'); } } @@ -97,12 +97,13 @@ export default async function UploadPage({ params, searchParams }: Params) { uniqueRecipes, uniqueFilms, hasAiTextGeneration, - textFieldsToAutoGenerate, imageThumbnailBase64, shouldStripGpsData, }} /> - : - {error ?? 'Unknown error'} - + : + {error ?? 'Unknown error'} + + }/> ); }; diff --git a/package.json b/package.json index e10d99a2..e57d7d27 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,12 @@ "test": "jest --watch --transformIgnorePatterns 'node_modules/(?!my-library-dir)/'", "analyze": "ANALYZE=true next build" }, - "packageManager": "pnpm@10.17.0", + "packageManager": "pnpm@10.17.1", "dependencies": { - "@ai-sdk/openai": "^2.0.32", - "@ai-sdk/rsc": "^1.0.48", - "@aws-sdk/client-s3": "3.893.0", - "@aws-sdk/s3-request-presigner": "3.893.0", + "@ai-sdk/openai": "^2.0.38", + "@ai-sdk/rsc": "^1.0.56", + "@aws-sdk/client-s3": "3.896.0", + "@aws-sdk/s3-request-presigner": "3.896.0", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-tooltip": "^1.2.8", @@ -24,7 +24,7 @@ "@vercel/analytics": "^1.5.0", "@vercel/blob": "^2.0.0", "@vercel/speed-insights": "^1.2.0", - "ai": "^5.0.48", + "ai": "^5.0.56", "camelcase-keys": "^10.0.0", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -35,9 +35,9 @@ "extract-colors": "^4.2.1", "fast-average-color": "^9.5.0", "fast-deep-equal": "^3.1.3", - "framer-motion": "^12.23.16", - "nanoid": "^5.1.5", - "next": "15.5.3", + "framer-motion": "^12.23.22", + "nanoid": "^5.1.6", + "next": "15.5.4", "next-auth": "5.0.0-beta.29", "next-themes": "^0.4.6", "pg": "^8.16.3", @@ -51,12 +51,13 @@ "swr": "^2.3.6", "ts-exif-parser": "^0.2.2", "use-debounce": "^10.0.6", - "viewerjs": "^1.11.7" + "viewerjs": "^1.11.7", + "zod": "^4.1.11" }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@next/bundle-analyzer": "15.5.3", - "@next/eslint-plugin-next": "^15.5.3", + "@next/bundle-analyzer": "15.5.4", + "@next/eslint-plugin-next": "^15.5.4", "@stylistic/eslint-plugin": "^5.4.0", "@tailwindcss/postcss": "^4.1.13", "@testing-library/dom": "^10.4.1", @@ -66,12 +67,12 @@ "@types/jest": "^30.0.0", "@types/node": "^24.5.2", "@types/pg": "^8.15.5", - "@types/react": "19.1.13", + "@types/react": "19.1.14", "@types/react-dom": "19.1.9", "@types/sanitize-html": "^2.16.0", "cross-fetch": "^4.1.0", "eslint": "9.36.0", - "eslint-config-next": "15.5.3", + "eslint-config-next": "15.5.4", "eslint-plugin-react-hooks": "^5.2.0", "jest": "^30.1.3", "jest-environment-jsdom": "^30.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5801c48b..23ee601c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,29 +9,29 @@ importers: .: dependencies: '@ai-sdk/openai': - specifier: ^2.0.32 - version: 2.0.32(zod@4.1.8) + specifier: ^2.0.38 + version: 2.0.38(zod@4.1.11) '@ai-sdk/rsc': - specifier: ^1.0.48 - version: 1.0.48(react@19.1.1)(zod@4.1.8) + specifier: ^1.0.56 + version: 1.0.56(react@19.1.1)(zod@4.1.11) '@aws-sdk/client-s3': - specifier: 3.893.0 - version: 3.893.0 + specifier: 3.896.0 + version: 3.896.0 '@aws-sdk/s3-request-presigner': - specifier: 3.893.0 - version: 3.893.0 + specifier: 3.896.0 + version: 3.896.0 '@radix-ui/react-dialog': specifier: ^1.1.15 - version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.16 - version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-tooltip': specifier: ^1.2.8 - version: 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-visually-hidden': specifier: ^1.2.3 - version: 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/piexifjs': specifier: ^1.0.0 version: 1.0.0 @@ -43,16 +43,16 @@ importers: version: 1.35.4 '@vercel/analytics': specifier: ^1.5.0 - version: 1.5.0(next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 1.5.0(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@vercel/blob': specifier: ^2.0.0 version: 2.0.0 '@vercel/speed-insights': specifier: ^1.2.0 - version: 1.2.0(next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 1.2.0(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) ai: - specifier: ^5.0.48 - version: 5.0.48(zod@4.1.8) + specifier: ^5.0.56 + version: 5.0.56(zod@4.1.11) camelcase-keys: specifier: ^10.0.0 version: 10.0.0 @@ -61,7 +61,7 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 1.1.1(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) culori: specifier: ^4.0.2 version: 4.0.2 @@ -84,17 +84,17 @@ importers: specifier: ^3.1.3 version: 3.1.3 framer-motion: - specifier: ^12.23.16 - version: 12.23.16(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^12.23.22 + version: 12.23.22(react-dom@19.1.1(react@19.1.1))(react@19.1.1) nanoid: - specifier: ^5.1.5 - version: 5.1.5 + specifier: ^5.1.6 + version: 5.1.6 next: - specifier: 15.5.3 - version: 15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 15.5.4 + version: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: 5.0.0-beta.29 - version: 5.0.0-beta.29(next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 5.0.0-beta.29(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -134,16 +134,19 @@ importers: viewerjs: specifier: ^1.11.7 version: 1.11.7 + zod: + specifier: ^4.1.11 + version: 4.1.11 devDependencies: '@eslint/eslintrc': specifier: ^3.3.1 version: 3.3.1 '@next/bundle-analyzer': - specifier: 15.5.3 - version: 15.5.3 + specifier: 15.5.4 + version: 15.5.4 '@next/eslint-plugin-next': - specifier: ^15.5.3 - version: 15.5.3 + specifier: ^15.5.4 + version: 15.5.4 '@stylistic/eslint-plugin': specifier: ^5.4.0 version: 5.4.0(eslint@9.36.0(jiti@2.5.1)) @@ -158,7 +161,7 @@ importers: version: 6.8.0 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/culori': specifier: ^4.0.1 version: 4.0.1 @@ -172,11 +175,11 @@ importers: specifier: ^8.15.5 version: 8.15.5 '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.14 + version: 19.1.14 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.13) + version: 19.1.9(@types/react@19.1.14) '@types/sanitize-html': specifier: ^2.16.0 version: 2.16.0 @@ -187,8 +190,8 @@ importers: specifier: 9.36.0 version: 9.36.0(jiti@2.5.1) eslint-config-next: - specifier: 15.5.3 - version: 15.5.3(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 15.5.4 + version: 15.5.4(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) eslint-plugin-react-hooks: specifier: ^5.2.0 version: 5.2.0(eslint@9.36.0(jiti@2.5.1)) @@ -216,34 +219,34 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/gateway@1.0.25': - resolution: {integrity: sha512-eI/6LLmn1tWFzuhjxgcPEqUFXwLjyRuGFrwkCoqLaTKe/qMYBEAV3iddnGUM0AV+Hp4NEykzP4ly5tibOLDMXw==} + '@ai-sdk/gateway@1.0.30': + resolution: {integrity: sha512-QdrSUryr/CLcsCISokLHOImcHj1adGXk1yy4B3qipqLhcNc33Kj/O/3crI790Qp85oDx7sc4vm7R4raf9RA/kg==} engines: {node: '>=18'} peerDependencies: - zod: ^3.25.76 || ^4 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@2.0.32': - resolution: {integrity: sha512-p7giSkCs66Q1qYO/NPYI41CrSg65mcm8R2uAdF86+Y1D1/q4mUrWMyf5UTOJ0bx/z4jIPiNgGDCg2Kabi5zrKQ==} + '@ai-sdk/openai@2.0.38': + resolution: {integrity: sha512-aPK5jSz5/UkbYnh59/Yy5ic3JsOrz7Gt6TJdB8ggYDYEUHJ9FHEKoRKz8DEHh3Zaf3yngxZLkdP4JSbroK3jsQ==} engines: {node: '>=18'} peerDependencies: - zod: ^3.25.76 || ^4 + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.9': - resolution: {integrity: sha512-Pm571x5efqaI4hf9yW4KsVlDBDme8++UepZRnq+kqVBWWjgvGhQlzU8glaFq0YJEB9kkxZHbRRyVeHoV2sRYaQ==} + '@ai-sdk/provider-utils@3.0.10': + resolution: {integrity: sha512-T1gZ76gEIwffep6MWI0QNy9jgoybUHE7TRaHB5k54K8mF91ciGFlbtCGxDYhMH3nCRergKwYFIDeFF0hJSIQHQ==} engines: {node: '>=18'} peerDependencies: - zod: ^3.25.76 || ^4 + zod: ^3.25.76 || ^4.1.8 '@ai-sdk/provider@2.0.0': resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/rsc@1.0.48': - resolution: {integrity: sha512-eS8ED8yxlAw6PNMZIoic5UDz3SxE+GvN2m6RtvVH+fA1Eze3LYuSrtU8uINZMLhV3CoYDMkm3aONFdjUctJ51Q==} + '@ai-sdk/rsc@1.0.56': + resolution: {integrity: sha512-RUkDVohaV40pR2PsA1kKoe/AVDyZrTtEV5YR5c1TZbHLOJyKsXqoje4jLqBDamZPq44cSdcc2Gwnh2CpJAIaYA==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.25.76 || ^4 + zod: ^3.25.76 || ^4.1.8 peerDependenciesMeta: zod: optional: true @@ -292,44 +295,44 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.893.0': - resolution: {integrity: sha512-/P74KDJhOijnIAQR93sq1DQn8vbU3WaPZDyy1XUMRJJIY6iEJnDo1toD9XY6AFDz5TRto8/8NbcXT30AMOUtJQ==} + '@aws-sdk/client-s3@3.896.0': + resolution: {integrity: sha512-UETVuMLQRqgrWxTnavotY0TlB/jaR9sL3hkIFPx4KtjmigNBdwRaiVfOuTnIXKd+w9RPINYG//nnrK+5gIyZkA==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.893.0': - resolution: {integrity: sha512-0+qRGq7H8UNfxI0F02ObyOgOiYxkN4DSlFfwQUQMPfqENDNYOrL++2H9X3EInyc1lUM/+aK8TZqSbh473gdxcg==} + '@aws-sdk/client-sso@3.896.0': + resolution: {integrity: sha512-mpE3mrNili1dcvEvxaYjyoib8HlRXkb2bY5a3WeK++KObFY+HUujKtgQmiNSRX5YwQszm//fTrmGMmv9zpMcKg==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.893.0': - resolution: {integrity: sha512-E1NAWHOprBXIJ9CVb6oTsRD/tNOozrKBD/Sb4t7WZd3dpby6KpYfM6FaEGfRGcJBIcB4245hww8Rmg16qDMJWg==} + '@aws-sdk/core@3.896.0': + resolution: {integrity: sha512-uJaoyWKeGNyCyeI+cIJrD7LEB4iF/W8/x2ij7zg32OFpAAJx96N34/e+XSKp/xkJpO5FKiBOskKLnHeUsJsAPA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.893.0': - resolution: {integrity: sha512-h4sYNk1iDrSZQLqFfbuD1GWY6KoVCvourfqPl6JZCYj8Vmnox5y9+7taPxwlU2VVII0hiV8UUbO79P35oPBSyA==} + '@aws-sdk/credential-provider-env@3.896.0': + resolution: {integrity: sha512-Cnqhupdkp825ICySrz4QTI64Nq3AmUAscPW8dueanni0avYBDp7RBppX4H0+6icqN569B983XNfQ0YSImQhfhg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.893.0': - resolution: {integrity: sha512-xYoC7DRr++zWZ9jG7/hvd6YjCbGDQzsAu2fBHHf91RVmSETXUgdEaP9rOdfCM02iIK/MYlwiWEIVBcBxWY/GQw==} + '@aws-sdk/credential-provider-http@3.896.0': + resolution: {integrity: sha512-CN0fTCKCUA1OTSx1c76o8XyJCy2WoI/av3J8r8mL6GmxTerhLRyzDy/MwxzPjTYPoL+GLEg6V4a9fRkWj1hBUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.893.0': - resolution: {integrity: sha512-ZQWOl4jdLhJHHrHsOfNRjgpP98A5kw4YzkMOUoK+TgSQVLi7wjb957V0htvwpi6KmGr3f2F8J06D6u2OtIc62w==} + '@aws-sdk/credential-provider-ini@3.896.0': + resolution: {integrity: sha512-+rbYG98czzwZLTYHJasK+VBjnIeXk73mRpZXHvaa4kDNxBezdN2YsoGNpLlPSxPdbpq18LY3LRtkdFTaT6DIQA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.893.0': - resolution: {integrity: sha512-NjvDUXciC2+EaQnbL/u/ZuCXj9PZQ/9ciPhI62LGCoJ3ft91lI1Z58Dgut0OFPpV6i16GhpFxzmbuf40wTgDbA==} + '@aws-sdk/credential-provider-node@3.896.0': + resolution: {integrity: sha512-J0Jm+56MNngk1PIyqoJFf5FC2fjA4CYXlqODqNRDtid7yk7HB9W3UTtvxofmii5KJOLcHGNPdGnHWKkUc+xYgw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.893.0': - resolution: {integrity: sha512-5XitkZdiQhjWJV71qWqrH7hMXwuK/TvIRwiwKs7Pj0sapGSk3YgD3Ykdlolz7sQOleoKWYYqgoq73fIPpTTmFA==} + '@aws-sdk/credential-provider-process@3.896.0': + resolution: {integrity: sha512-UfWVMQPZy7dus40c4LWxh5vQ+I51z0q4vf09Eqas5848e9DrGRG46GYIuc/gy+4CqEypjbg/XNMjnZfGLHxVnQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.893.0': - resolution: {integrity: sha512-ms8v13G1r0aHZh5PLcJu6AnQZPs23sRm3Ph0A7+GdqbPvWewP8M7jgZTKyTXi+oYXswdYECU1zPVur8zamhtLg==} + '@aws-sdk/credential-provider-sso@3.896.0': + resolution: {integrity: sha512-77Te8WrVdLABKlv7QyetXP6aYEX1UORiahLA1PXQb/p66aFBw18Xc6JiN/6zJ4RqdyV1Xr9rwYBwGYua93ANIA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.893.0': - resolution: {integrity: sha512-wWD8r2ot4jf/CoogdPTl13HbwNLW4UheGUCu6gW7n9GoHh1JImYyooPHK8K7kD42hihydIA7OW7iFAf7//JYTw==} + '@aws-sdk/credential-provider-web-identity@3.896.0': + resolution: {integrity: sha512-gwMwZWumo+V0xJplO8j2HIb1TfPsF9fbcRGXS0CanEvjg4fF2Xs1pOQl2oCw3biPZpxHB0plNZjqSF2eneGg9g==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.893.0': @@ -340,8 +343,8 @@ packages: resolution: {integrity: sha512-PEZkvD6k0X9sacHkvkVF4t2QyQEAzd35OJ2bIrjWCfc862TwukMMJ1KErRmQ1WqKXHKF4L0ed5vtWaO/8jVLNA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.893.0': - resolution: {integrity: sha512-2swRPpyGK6xpZwIFmmFSFKp10iuyBLZEouhrt1ycBVA8iHGmPkuJSCim6Vb+JoRKqINp5tizWeQwdg9boIxJPw==} + '@aws-sdk/middleware-flexible-checksums@3.896.0': + resolution: {integrity: sha512-bB3W/IFG7HNNziACOp1aZVGGnrIahXc0PxZoU055JirEGQtDFIU1ZD7S9zLKmy9FFUvQsAeRL9nDFHbx8cwx/w==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-host-header@3.893.0': @@ -360,36 +363,36 @@ packages: resolution: {integrity: sha512-H7Zotd9zUHQAr/wr3bcWHULYhEeoQrF54artgsoUGIf/9emv6LzY89QUccKIxYd6oHKNTrTyXm9F0ZZrzXNxlg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.893.0': - resolution: {integrity: sha512-J2v7jOoSlE4o416yQiuka6+cVJzyrU7mbJEQA9VFCb+TYT2cG3xQB0bDzE24QoHeonpeBDghbg/zamYMnt+GsQ==} + '@aws-sdk/middleware-sdk-s3@3.896.0': + resolution: {integrity: sha512-hlPu/AZ5Afa4ZafP+aXIjRtKm7BX57lurA+TJ+7nXm1Az8Du3Sg2tZXP2/GfqTztLIFQYj/Jy5smkJ0+1HNAPQ==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-ssec@3.893.0': resolution: {integrity: sha512-e4ccCiAnczv9mMPheKjgKxZQN473mcup+3DPLVNnIw5GRbQoDqPSB70nUzfORKZvM7ar7xLMPxNR8qQgo1C8Rg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.893.0': - resolution: {integrity: sha512-n1vHj7bdC4ycIAKkny0rmgvgvGOIgYnGBAqfPAFPR26WuGWmCxH2cT9nQTNA+li8ofxX9F9FIFBTKkW92Pc8iQ==} + '@aws-sdk/middleware-user-agent@3.896.0': + resolution: {integrity: sha512-so/3tZH34YIeqG/QJgn5ZinnmHRdXV1ehsj4wVUrezL/dVW86jfwIkQIwpw8roOC657UoUf91c9FDhCxs3J5aQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.893.0': - resolution: {integrity: sha512-HIUCyNtWkxvc0BmaJPUj/A0/29OapT/dzBNxr2sjgKNZgO81JuDFp+aXCmnf7vQoA2D1RzCsAIgEtfTExNFZqA==} + '@aws-sdk/nested-clients@3.896.0': + resolution: {integrity: sha512-KaHALB6DIXScJL/ExmonADr3jtTV6dpOHoEeTRSskJ/aW+rhZo7kH8SLmrwOT/qX8d5tza17YyR/oRkIKY6Eaw==} engines: {node: '>=18.0.0'} '@aws-sdk/region-config-resolver@3.893.0': resolution: {integrity: sha512-/cJvh3Zsa+Of0Zbg7vl9wp/kZtdb40yk/2+XcroAMVPO9hPvmS9r/UOm6tO7FeX4TtkRFwWaQJiTZTgSdsPY+Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/s3-request-presigner@3.893.0': - resolution: {integrity: sha512-rLOxM1668NP8GTcoSvvI2fEkHjyv84UHWAanc9kbEBDvkRCNhRxz7pRs456PjB4Mprj7mKaJAex7T32nS8Corw==} + '@aws-sdk/s3-request-presigner@3.896.0': + resolution: {integrity: sha512-pAlxvB1UmbgyfW8JyJy30FXfsfcWAbtR5gCO25mR5PPwuBQgzQR6lf/L4zbp+ZsSNhlKsvroe537oW5EXYk6Dw==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.893.0': - resolution: {integrity: sha512-pp4Bn8dL4i68P/mHgZ7sgkm8OSIpwjtGxP73oGseu9Cli0JRyJ1asTSsT60hUz3sbo+3oKk3hEobD6UxLUeGRA==} + '@aws-sdk/signature-v4-multi-region@3.896.0': + resolution: {integrity: sha512-txiQDEZXL9tlNP8mbnNaDtuHBYc/FCqaZ8Y76qnfM3o6CTIn0t0tTAlnx1CyFe4EaikVBgQuZvj5KfNA8PmlzA==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.893.0': - resolution: {integrity: sha512-nkzuE910TxW4pnIwJ+9xDMx5m+A8iXGM16Oa838YKsds07cgkRp7sPnpH9B8NbGK2szskAAkXfj7t1f59EKd1Q==} + '@aws-sdk/token-providers@3.896.0': + resolution: {integrity: sha512-WBoD+RY7tUfW9M+wGrZ2vdveR+ziZOjGHWFY3lcGnDvI8KE+fcSccEOTxgJBNBS5Z8B+WHKU2sZjb+Z7QqGwjw==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.893.0': @@ -400,8 +403,8 @@ packages: resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.893.0': - resolution: {integrity: sha512-xeMcL31jXHKyxRwB3oeNjs8YEpyvMnSYWr2OwLydgzgTr0G349AHlJHwYGCF9xiJ2C27kDxVvXV/Hpdp0p7TWw==} + '@aws-sdk/util-endpoints@3.895.0': + resolution: {integrity: sha512-MhxBvWbwxmKknuggO2NeMwOVkHOYL98pZ+1ZRI5YwckoCL3AvISMnPJgfN60ww6AIXHGpkp+HhpFdKOe8RHSEg==} engines: {node: '>=18.0.0'} '@aws-sdk/util-format-url@3.893.0': @@ -415,8 +418,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.893.0': resolution: {integrity: sha512-PE9NtbDBW6Kgl1bG6A5fF3EPo168tnkj8TgMcT0sg4xYBWsBpq0bpJZRh+Jm5Bkwiw9IgTCLjEU7mR6xWaMB9w==} - '@aws-sdk/util-user-agent-node@3.893.0': - resolution: {integrity: sha512-tTRkJo/fth9NPJ2AO/XLuJWVsOhbhejQRLyP0WXG3z0Waa5IWK5YBxBC1tWWATUCwsN748JQXU03C1aF9cRD9w==} + '@aws-sdk/util-user-agent-node@3.896.0': + resolution: {integrity: sha512-jegizucAwoxyBddKl0kRGNEgRHcfGuMeyhP1Nf+wIUmHz/9CxobIajqcVk/KRNLdZY5mSn7YG2VtP3z0BcBb0w==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -424,8 +427,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.893.0': - resolution: {integrity: sha512-qKkJ2E0hU60iq0o2+hBSIWS8sf34xhqiRRGw5nbRhwEnE2MsWsWBpRoysmr32uq9dHMWUzII0c/fS29+wOSdMA==} + '@aws-sdk/xml-builder@3.894.0': + resolution: {integrity: sha512-E6EAMc9dT1a2DOdo4zyOf3fp5+NJ2wI+mcm7RaW1baFIWDwcb99PpvWoV7YEiK7oaBDshuOEGWKUSYXdW+JYgA==} engines: {node: '>=18.0.0'} '@aws/lambda-invoke-store@0.0.1': @@ -975,59 +978,59 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@next/bundle-analyzer@15.5.3': - resolution: {integrity: sha512-l2NxnWHP2gWHbomAlz/wFnN2jNCx/dpr7P/XWeOLhULiyKkXSac8O8SjxRO/8FNhr2l4JNtWVKk82Uya4cZYTw==} + '@next/bundle-analyzer@15.5.4': + resolution: {integrity: sha512-wMtpIjEHi+B/wC34ZbEcacGIPgQTwTFjjp0+F742s9TxC6QwT0MwB/O0QEgalMe8s3SH/K09DO0gmTvUSJrLRA==} - '@next/env@15.5.3': - resolution: {integrity: sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==} + '@next/env@15.5.4': + resolution: {integrity: sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==} - '@next/eslint-plugin-next@15.5.3': - resolution: {integrity: sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==} + '@next/eslint-plugin-next@15.5.4': + resolution: {integrity: sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==} - '@next/swc-darwin-arm64@15.5.3': - resolution: {integrity: sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==} + '@next/swc-darwin-arm64@15.5.4': + resolution: {integrity: sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.5.3': - resolution: {integrity: sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==} + '@next/swc-darwin-x64@15.5.4': + resolution: {integrity: sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.3': - resolution: {integrity: sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==} + '@next/swc-linux-arm64-gnu@15.5.4': + resolution: {integrity: sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.5.3': - resolution: {integrity: sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==} + '@next/swc-linux-arm64-musl@15.5.4': + resolution: {integrity: sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.5.3': - resolution: {integrity: sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==} + '@next/swc-linux-x64-gnu@15.5.4': + resolution: {integrity: sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.5.3': - resolution: {integrity: sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==} + '@next/swc-linux-x64-musl@15.5.4': + resolution: {integrity: sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.5.3': - resolution: {integrity: sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==} + '@next/swc-win32-arm64-msvc@15.5.4': + resolution: {integrity: sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.5.3': - resolution: {integrity: sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==} + '@next/swc-win32-x64-msvc@15.5.4': + resolution: {integrity: sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1402,8 +1405,8 @@ packages: resolution: {integrity: sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.11.1': - resolution: {integrity: sha512-REH7crwORgdjSpYs15JBiIWOYjj0hJNC3aCecpJvAlMMaaqL5i2CLb1i6Hc4yevToTKSqslLMI9FKjhugEwALA==} + '@smithy/core@3.12.0': + resolution: {integrity: sha512-zJeAgogZfbwlPGL93y4Z/XNeIN37YCreRUd6YMIRvaq+6RnBK8PPYYIQ85Is/GglPh3kNImD5riDCXbVSDpCiQ==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.1.2': @@ -1466,12 +1469,12 @@ packages: resolution: {integrity: sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.2.3': - resolution: {integrity: sha512-+1H5A28DeffRVrqmVmtqtRraEjoaC6JVap3xEQdVoBh2EagCVY7noPmcBcG4y7mnr9AJitR1ZAse2l+tEtK5vg==} + '@smithy/middleware-endpoint@4.2.4': + resolution: {integrity: sha512-FZ4hzupOmthm8Q8ujYrd0I+/MHwVMuSTdkDtIQE0xVuvJt9pLT6Q+b0p4/t+slDyrpcf+Wj7SN+ZqT5OryaaZg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.2.4': - resolution: {integrity: sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==} + '@smithy/middleware-retry@4.3.0': + resolution: {integrity: sha512-qhEX9745fAxZvtLM4bQJAVC98elWjiMO2OiHl1s6p7hUzS4QfZO1gXUYNwEK8m0J6NoCD5W52ggWxbIDHI0XSg==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.1.1': @@ -1518,8 +1521,8 @@ packages: resolution: {integrity: sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.6.3': - resolution: {integrity: sha512-K27LqywsaqKz4jusdUQYJh/YP2VbnbdskZ42zG8xfV+eovbTtMc2/ZatLWCfSkW0PDsTUXlpvlaMyu8925HsOw==} + '@smithy/smithy-client@4.6.4': + resolution: {integrity: sha512-qL7O3VDyfzCSN9r+sdbQXGhaHtrfSJL30En6Jboj0I3bobf2g1/T0eP2L4qxqrEW26gWhJ4THI4ElVVLjYyBHg==} engines: {node: '>=18.0.0'} '@smithy/types@4.5.0': @@ -1554,12 +1557,12 @@ packages: resolution: {integrity: sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.1.3': - resolution: {integrity: sha512-5fm3i2laE95uhY6n6O6uGFxI5SVbqo3/RWEuS3YsT0LVmSZk+0eUqPhKd4qk0KxBRPaT5VNT/WEBUqdMyYoRgg==} + '@smithy/util-defaults-mode-browser@4.1.4': + resolution: {integrity: sha512-mLDJ1s4eA3vwOGaQOEPlg5LB4LdZUUMpB5UMOMofeGhWqiS7WR7dTpLiNi9zVn+YziKUd3Af5NLfxDs7NJqmIw==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.1.3': - resolution: {integrity: sha512-lwnMzlMslZ9GJNt+/wVjz6+fe9Wp5tqR1xAyQn+iywmP+Ymj0F6NhU/KfHM5jhGPQchRSCcau5weKhFdLIM4cA==} + '@smithy/util-defaults-mode-node@4.1.4': + resolution: {integrity: sha512-pjX2iMTcOASaSanAd7bu6i3fcMMezr3NTr8Rh64etB0uHRZi+Aw86DoCxPESjY4UTIuA06hhqtTtw95o//imYA==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.1.2': @@ -1598,6 +1601,10 @@ packages: resolution: {integrity: sha512-PJBmyayrlfxM7nbqjomF4YcT1sApQwZio0NHSsT0EzhJqljRmvhzqZua43TyEs80nJk2Cn2FGPg/N8phH6KeCQ==} engines: {node: '>=18.0.0'} + '@smithy/uuid@1.0.0': + resolution: {integrity: sha512-OlA/yZHh0ekYFnbUkmYBDQPE6fGfdrvgz39ktp8Xf+FA6BfxLejPTMDOG0Nfk5/rDySAz1dRbFf24zaAFYVXlQ==} + engines: {node: '>=18.0.0'} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -1795,8 +1802,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.13': - resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} + '@types/react@19.1.14': + resolution: {integrity: sha512-ukd93VGzaNPMAUPy0gRDSC57UuQbnH9Kussp7HBjM06YFi9uZTFhOvMSO2OKqXm1rSgzOE+pVx1k1PYHGwlc8Q==} '@types/sanitize-html@2.16.0': resolution: {integrity: sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==} @@ -1807,9 +1814,6 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -2060,11 +2064,11 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@5.0.48: - resolution: {integrity: sha512-+oYhbN3NGRXayGfTFI8k1Fu4rhiJcQ0mbgiAOJGFkzvCxunRRQu5cyDl7y6cHNTj1QvHmIBROK5u655Ss2oI0g==} + ai@5.0.56: + resolution: {integrity: sha512-Rl++Ogg6DxzFkVHAOJZzhqcqvqtBLGOP9mMxJOGr2EJWj5HH5zjqDcnRh6x5vBoca5kj/Gd0rvUZFMnyI+sRiw==} engines: {node: '>=18'} peerDependencies: - zod: ^3.25.76 || ^4 + zod: ^3.25.76 || ^4.1.8 ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2554,8 +2558,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.5.3: - resolution: {integrity: sha512-e6j+QhQFOr5pfsc8VJbuTD9xTXJaRvMHYjEeLPA2pFkheNlgPLCkxdvhxhfuM4KGcqSZj2qEnpHisdTVs3BxuQ==} + eslint-config-next@15.5.4: + resolution: {integrity: sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -2768,8 +2772,8 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - framer-motion@12.23.16: - resolution: {integrity: sha512-N81A8hiHqVsexOzI3wzkibyLURW1nEJsZaRuctPhG4AdbbciYu+bKJq9I2lQFzAO4Bx3h4swI6pBbF/Hu7f7BA==} + framer-motion@12.23.22: + resolution: {integrity: sha512-ZgGvdxXCw55ZYvhoZChTlG6pUuehecgvEAJz0BHoC5pQKW1EC5xf1Mul1ej5+ai+pVY0pylyFfdl45qnM1/GsA==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -3502,8 +3506,8 @@ packages: engines: {node: '>=10'} hasBin: true - motion-dom@12.23.12: - resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==} + motion-dom@12.23.21: + resolution: {integrity: sha512-5xDXx/AbhrfgsQmSE7YESMn4Dpo6x5/DTZ4Iyy4xqDvVHWvFVoV+V2Ri2S/ksx+D40wrZ7gPYiMWshkdoqNgNQ==} motion-utils@12.23.6: resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} @@ -3520,8 +3524,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.5: - resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} hasBin: true @@ -3555,8 +3559,8 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.5.3: - resolution: {integrity: sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==} + next@15.5.4: + resolution: {integrity: sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -4345,10 +4349,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -4495,45 +4495,45 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@4.1.8: - resolution: {integrity: sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==} + zod@4.1.11: + resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/gateway@1.0.25(zod@4.1.8)': + '@ai-sdk/gateway@1.0.30(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.9(zod@4.1.8) - zod: 4.1.8 + '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) + zod: 4.1.11 - '@ai-sdk/openai@2.0.32(zod@4.1.8)': + '@ai-sdk/openai@2.0.38(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.9(zod@4.1.8) - zod: 4.1.8 + '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) + zod: 4.1.11 - '@ai-sdk/provider-utils@3.0.9(zod@4.1.8)': + '@ai-sdk/provider-utils@3.0.10(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.0.0 eventsource-parser: 3.0.6 - zod: 4.1.8 + zod: 4.1.11 '@ai-sdk/provider@2.0.0': dependencies: json-schema: 0.4.0 - '@ai-sdk/rsc@1.0.48(react@19.1.1)(zod@4.1.8)': + '@ai-sdk/rsc@1.0.56(react@19.1.1)(zod@4.1.11)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.9(zod@4.1.8) - ai: 5.0.48(zod@4.1.8) + '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) + ai: 5.0.56(zod@4.1.11) jsondiffpatch: 0.6.0 react: 19.1.1 optionalDependencies: - zod: 4.1.8 + zod: 4.1.11 '@alloc/quick-lru@5.2.0': {} @@ -4600,32 +4600,32 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.893.0': + '@aws-sdk/client-s3@3.896.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.893.0 - '@aws-sdk/credential-provider-node': 3.893.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 3.896.0 '@aws-sdk/middleware-bucket-endpoint': 3.893.0 '@aws-sdk/middleware-expect-continue': 3.893.0 - '@aws-sdk/middleware-flexible-checksums': 3.893.0 + '@aws-sdk/middleware-flexible-checksums': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-location-constraint': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-sdk-s3': 3.893.0 + '@aws-sdk/middleware-sdk-s3': 3.896.0 '@aws-sdk/middleware-ssec': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.893.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 - '@aws-sdk/signature-v4-multi-region': 3.893.0 + '@aws-sdk/signature-v4-multi-region': 3.896.0 '@aws-sdk/types': 3.893.0 - '@aws-sdk/util-endpoints': 3.893.0 + '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.893.0 - '@aws-sdk/xml-builder': 3.893.0 + '@aws-sdk/util-user-agent-node': 3.896.0 + '@aws-sdk/xml-builder': 3.894.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.1 + '@smithy/core': 3.12.0 '@smithy/eventstream-serde-browser': 4.1.1 '@smithy/eventstream-serde-config-resolver': 4.2.1 '@smithy/eventstream-serde-node': 4.1.1 @@ -4636,68 +4636,67 @@ snapshots: '@smithy/invalid-dependency': 4.1.1 '@smithy/md5-js': 4.1.1 '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.3 - '@smithy/middleware-retry': 4.2.4 + '@smithy/middleware-endpoint': 4.2.4 + '@smithy/middleware-retry': 4.3.0 '@smithy/middleware-serde': 4.1.1 '@smithy/middleware-stack': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/node-http-handler': 4.2.1 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.3 - '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-defaults-mode-browser': 4.1.4 + '@smithy/util-defaults-mode-node': 4.1.4 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 '@smithy/util-stream': 4.3.2 '@smithy/util-utf8': 4.1.0 '@smithy/util-waiter': 4.1.1 - '@types/uuid': 9.0.8 + '@smithy/uuid': 1.0.0 tslib: 2.8.1 - uuid: 9.0.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.893.0': + '@aws-sdk/client-sso@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.893.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.893.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 - '@aws-sdk/util-endpoints': 3.893.0 + '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.893.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.1 + '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 '@smithy/hash-node': 4.1.1 '@smithy/invalid-dependency': 4.1.1 '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.3 - '@smithy/middleware-retry': 4.2.4 + '@smithy/middleware-endpoint': 4.2.4 + '@smithy/middleware-retry': 4.3.0 '@smithy/middleware-serde': 4.1.1 '@smithy/middleware-stack': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/node-http-handler': 4.2.1 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.3 - '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-defaults-mode-browser': 4.1.4 + '@smithy/util-defaults-mode-node': 4.1.4 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -4706,54 +4705,52 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.893.0': + '@aws-sdk/core@3.896.0': dependencies: '@aws-sdk/types': 3.893.0 - '@aws-sdk/xml-builder': 3.893.0 - '@smithy/core': 3.11.1 + '@aws-sdk/xml-builder': 3.894.0 + '@smithy/core': 3.12.0 '@smithy/node-config-provider': 4.2.2 '@smithy/property-provider': 4.1.1 '@smithy/protocol-http': 5.2.1 '@smithy/signature-v4': 5.2.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 '@smithy/util-base64': 4.1.0 - '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-middleware': 4.1.1 '@smithy/util-utf8': 4.1.0 - fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.893.0': + '@aws-sdk/credential-provider-env@3.896.0': dependencies: - '@aws-sdk/core': 3.893.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.893.0': + '@aws-sdk/credential-provider-http@3.896.0': dependencies: - '@aws-sdk/core': 3.893.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/fetch-http-handler': 5.2.1 '@smithy/node-http-handler': 4.2.1 '@smithy/property-provider': 4.1.1 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 '@smithy/util-stream': 4.3.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.893.0': + '@aws-sdk/credential-provider-ini@3.896.0': dependencies: - '@aws-sdk/core': 3.893.0 - '@aws-sdk/credential-provider-env': 3.893.0 - '@aws-sdk/credential-provider-http': 3.893.0 - '@aws-sdk/credential-provider-process': 3.893.0 - '@aws-sdk/credential-provider-sso': 3.893.0 - '@aws-sdk/credential-provider-web-identity': 3.893.0 - '@aws-sdk/nested-clients': 3.893.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-env': 3.896.0 + '@aws-sdk/credential-provider-http': 3.896.0 + '@aws-sdk/credential-provider-process': 3.896.0 + '@aws-sdk/credential-provider-sso': 3.896.0 + '@aws-sdk/credential-provider-web-identity': 3.896.0 + '@aws-sdk/nested-clients': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/credential-provider-imds': 4.1.2 '@smithy/property-provider': 4.1.1 @@ -4763,14 +4760,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.893.0': + '@aws-sdk/credential-provider-node@3.896.0': dependencies: - '@aws-sdk/credential-provider-env': 3.893.0 - '@aws-sdk/credential-provider-http': 3.893.0 - '@aws-sdk/credential-provider-ini': 3.893.0 - '@aws-sdk/credential-provider-process': 3.893.0 - '@aws-sdk/credential-provider-sso': 3.893.0 - '@aws-sdk/credential-provider-web-identity': 3.893.0 + '@aws-sdk/credential-provider-env': 3.896.0 + '@aws-sdk/credential-provider-http': 3.896.0 + '@aws-sdk/credential-provider-ini': 3.896.0 + '@aws-sdk/credential-provider-process': 3.896.0 + '@aws-sdk/credential-provider-sso': 3.896.0 + '@aws-sdk/credential-provider-web-identity': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/credential-provider-imds': 4.1.2 '@smithy/property-provider': 4.1.1 @@ -4780,20 +4777,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.893.0': + '@aws-sdk/credential-provider-process@3.896.0': dependencies: - '@aws-sdk/core': 3.893.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.893.0': + '@aws-sdk/credential-provider-sso@3.896.0': dependencies: - '@aws-sdk/client-sso': 3.893.0 - '@aws-sdk/core': 3.893.0 - '@aws-sdk/token-providers': 3.893.0 + '@aws-sdk/client-sso': 3.896.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/token-providers': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -4802,10 +4799,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.893.0': + '@aws-sdk/credential-provider-web-identity@3.896.0': dependencies: - '@aws-sdk/core': 3.893.0 - '@aws-sdk/nested-clients': 3.893.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/nested-clients': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -4831,12 +4828,12 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.893.0': + '@aws-sdk/middleware-flexible-checksums@3.896.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.893.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/is-array-buffer': 4.1.0 '@smithy/node-config-provider': 4.2.2 @@ -4874,16 +4871,16 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.893.0': + '@aws-sdk/middleware-sdk-s3@3.896.0': dependencies: - '@aws-sdk/core': 3.893.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/core': 3.11.1 + '@smithy/core': 3.12.0 '@smithy/node-config-provider': 4.2.2 '@smithy/protocol-http': 5.2.1 '@smithy/signature-v4': 5.2.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 '@smithy/util-config-provider': 4.1.0 '@smithy/util-middleware': 4.1.1 @@ -4897,51 +4894,51 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.893.0': + '@aws-sdk/middleware-user-agent@3.896.0': dependencies: - '@aws-sdk/core': 3.893.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/types': 3.893.0 - '@aws-sdk/util-endpoints': 3.893.0 - '@smithy/core': 3.11.1 + '@aws-sdk/util-endpoints': 3.895.0 + '@smithy/core': 3.12.0 '@smithy/protocol-http': 5.2.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.893.0': + '@aws-sdk/nested-clients@3.896.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.893.0 + '@aws-sdk/core': 3.896.0 '@aws-sdk/middleware-host-header': 3.893.0 '@aws-sdk/middleware-logger': 3.893.0 '@aws-sdk/middleware-recursion-detection': 3.893.0 - '@aws-sdk/middleware-user-agent': 3.893.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/region-config-resolver': 3.893.0 '@aws-sdk/types': 3.893.0 - '@aws-sdk/util-endpoints': 3.893.0 + '@aws-sdk/util-endpoints': 3.895.0 '@aws-sdk/util-user-agent-browser': 3.893.0 - '@aws-sdk/util-user-agent-node': 3.893.0 + '@aws-sdk/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.1 + '@smithy/core': 3.12.0 '@smithy/fetch-http-handler': 5.2.1 '@smithy/hash-node': 4.1.1 '@smithy/invalid-dependency': 4.1.1 '@smithy/middleware-content-length': 4.1.1 - '@smithy/middleware-endpoint': 4.2.3 - '@smithy/middleware-retry': 4.2.4 + '@smithy/middleware-endpoint': 4.2.4 + '@smithy/middleware-retry': 4.3.0 '@smithy/middleware-serde': 4.1.1 '@smithy/middleware-stack': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/node-http-handler': 4.2.1 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 '@smithy/url-parser': 4.1.1 '@smithy/util-base64': 4.1.0 '@smithy/util-body-length-browser': 4.1.0 '@smithy/util-body-length-node': 4.1.0 - '@smithy/util-defaults-mode-browser': 4.1.3 - '@smithy/util-defaults-mode-node': 4.1.3 + '@smithy/util-defaults-mode-browser': 4.1.4 + '@smithy/util-defaults-mode-node': 4.1.4 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -4959,30 +4956,30 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@aws-sdk/s3-request-presigner@3.893.0': + '@aws-sdk/s3-request-presigner@3.896.0': dependencies: - '@aws-sdk/signature-v4-multi-region': 3.893.0 + '@aws-sdk/signature-v4-multi-region': 3.896.0 '@aws-sdk/types': 3.893.0 '@aws-sdk/util-format-url': 3.893.0 - '@smithy/middleware-endpoint': 4.2.3 + '@smithy/middleware-endpoint': 4.2.4 '@smithy/protocol-http': 5.2.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.893.0': + '@aws-sdk/signature-v4-multi-region@3.896.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.893.0 + '@aws-sdk/middleware-sdk-s3': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/protocol-http': 5.2.1 '@smithy/signature-v4': 5.2.1 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.893.0': + '@aws-sdk/token-providers@3.896.0': dependencies: - '@aws-sdk/core': 3.893.0 - '@aws-sdk/nested-clients': 3.893.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/nested-clients': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/property-provider': 4.1.1 '@smithy/shared-ini-file-loader': 4.2.0 @@ -5000,7 +4997,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.893.0': + '@aws-sdk/util-endpoints@3.895.0': dependencies: '@aws-sdk/types': 3.893.0 '@smithy/types': 4.5.0 @@ -5026,17 +5023,18 @@ snapshots: bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.893.0': + '@aws-sdk/util-user-agent-node@3.896.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.893.0 + '@aws-sdk/middleware-user-agent': 3.896.0 '@aws-sdk/types': 3.893.0 '@smithy/node-config-provider': 4.2.2 '@smithy/types': 4.5.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.893.0': + '@aws-sdk/xml-builder@3.894.0': dependencies: '@smithy/types': 4.5.0 + fast-xml-parser: 5.2.5 tslib: 2.8.1 '@aws/lambda-invoke-store@0.0.1': {} @@ -5680,41 +5678,41 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/bundle-analyzer@15.5.3': + '@next/bundle-analyzer@15.5.4': dependencies: webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@next/env@15.5.3': {} + '@next/env@15.5.4': {} - '@next/eslint-plugin-next@15.5.3': + '@next/eslint-plugin-next@15.5.4': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.5.3': + '@next/swc-darwin-arm64@15.5.4': optional: true - '@next/swc-darwin-x64@15.5.3': + '@next/swc-darwin-x64@15.5.4': optional: true - '@next/swc-linux-arm64-gnu@15.5.3': + '@next/swc-linux-arm64-gnu@15.5.4': optional: true - '@next/swc-linux-arm64-musl@15.5.3': + '@next/swc-linux-arm64-musl@15.5.4': optional: true - '@next/swc-linux-x64-gnu@15.5.3': + '@next/swc-linux-x64-gnu@15.5.4': optional: true - '@next/swc-linux-x64-musl@15.5.3': + '@next/swc-linux-x64-musl@15.5.4': optional: true - '@next/swc-win32-arm64-msvc@15.5.3': + '@next/swc-win32-arm64-msvc@15.5.4': optional: true - '@next/swc-win32-x64-msvc@15.5.3': + '@next/swc-win32-x64-msvc@15.5.4': optional: true '@nodelib/fs.scandir@2.1.5': @@ -5744,292 +5742,292 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.14)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-context@1.1.2(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.1.14)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.14)(react@19.1.1) aria-hidden: 1.2.6 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.14)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-direction@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-direction@1.1.1(@types/react@19.1.14)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.14)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-id@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-id@1.1.1(@types/react@19.1.14)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.14)(react@19.1.1) aria-hidden: 1.2.6 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-remove-scroll: 2.7.1(@types/react@19.1.13)(react@19.1.1) + react-remove-scroll: 2.7.1(@types/react@19.1.14)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.14)(react@19.1.1) '@radix-ui/rect': 1.1.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-slot@1.2.3(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.1.14)(react@19.1.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.14)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.14)(react@19.1.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.14)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.14)(react@19.1.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.14)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.14)(react@19.1.1)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.14)(react@19.1.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.14)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) '@radix-ui/rect@1.1.1': {} @@ -6069,7 +6067,7 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/core@3.11.1': + '@smithy/core@3.12.0': dependencies: '@smithy/middleware-serde': 4.1.1 '@smithy/protocol-http': 5.2.1 @@ -6079,9 +6077,8 @@ snapshots: '@smithy/util-middleware': 4.1.1 '@smithy/util-stream': 4.3.2 '@smithy/util-utf8': 4.1.0 - '@types/uuid': 9.0.8 + '@smithy/uuid': 1.0.0 tslib: 2.8.1 - uuid: 9.0.1 '@smithy/credential-provider-imds@4.1.2': dependencies: @@ -6174,9 +6171,9 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.2.3': + '@smithy/middleware-endpoint@4.2.4': dependencies: - '@smithy/core': 3.11.1 + '@smithy/core': 3.12.0 '@smithy/middleware-serde': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/shared-ini-file-loader': 4.2.0 @@ -6185,18 +6182,17 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.2.4': + '@smithy/middleware-retry@4.3.0': dependencies: '@smithy/node-config-provider': 4.2.2 '@smithy/protocol-http': 5.2.1 '@smithy/service-error-classification': 4.1.2 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 - '@types/uuid': 9.0.8 + '@smithy/uuid': 1.0.0 tslib: 2.8.1 - uuid: 9.0.1 '@smithy/middleware-serde@4.1.1': dependencies: @@ -6265,10 +6261,10 @@ snapshots: '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/smithy-client@4.6.3': + '@smithy/smithy-client@4.6.4': dependencies: - '@smithy/core': 3.11.1 - '@smithy/middleware-endpoint': 4.2.3 + '@smithy/core': 3.12.0 + '@smithy/middleware-endpoint': 4.2.4 '@smithy/middleware-stack': 4.1.1 '@smithy/protocol-http': 5.2.1 '@smithy/types': 4.5.0 @@ -6313,21 +6309,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.1.3': + '@smithy/util-defaults-mode-browser@4.1.4': dependencies: '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 bowser: 2.12.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.1.3': + '@smithy/util-defaults-mode-node@4.1.4': dependencies: '@smithy/config-resolver': 4.2.2 '@smithy/credential-provider-imds': 4.1.2 '@smithy/node-config-provider': 4.2.2 '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.4 '@smithy/types': 4.5.0 tslib: 2.8.1 @@ -6383,6 +6379,10 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 + '@smithy/uuid@1.0.0': + dependencies: + tslib: 2.8.1 + '@standard-schema/spec@1.0.0': {} '@stylistic/eslint-plugin@5.4.0(eslint@9.36.0(jiti@2.5.1))': @@ -6491,15 +6491,15 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 - '@types/react-dom': 19.1.9(@types/react@19.1.13) + '@types/react': 19.1.14 + '@types/react-dom': 19.1.9(@types/react@19.1.14) '@tsconfig/node10@1.0.11': {} @@ -6580,11 +6580,11 @@ snapshots: '@types/piexifjs@1.0.0': {} - '@types/react-dom@19.1.9(@types/react@19.1.13)': + '@types/react-dom@19.1.9(@types/react@19.1.14)': dependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - '@types/react@19.1.13': + '@types/react@19.1.14': dependencies: csstype: 3.1.3 @@ -6596,8 +6596,6 @@ snapshots: '@types/tough-cookie@4.0.5': {} - '@types/uuid@9.0.8': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -6636,7 +6634,7 @@ snapshots: '@typescript-eslint/project-service@8.43.0(typescript@5.9.2)': dependencies: '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2) - '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/types': 8.44.0 debug: 4.4.3 typescript: 5.9.2 transitivePeerDependencies: @@ -6773,9 +6771,9 @@ snapshots: dependencies: uncrypto: 0.1.3 - '@vercel/analytics@1.5.0(next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + '@vercel/analytics@1.5.0(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': optionalDependencies: - next: 15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 '@vercel/blob@2.0.0': @@ -6786,9 +6784,9 @@ snapshots: throttleit: 2.1.0 undici: 5.29.0 - '@vercel/speed-insights@1.2.0(next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + '@vercel/speed-insights@1.2.0(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': optionalDependencies: - next: 15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 acorn-jsx@5.3.2(acorn@8.15.0): @@ -6803,13 +6801,13 @@ snapshots: agent-base@7.1.4: {} - ai@5.0.48(zod@4.1.8): + ai@5.0.56(zod@4.1.11): dependencies: - '@ai-sdk/gateway': 1.0.25(zod@4.1.8) + '@ai-sdk/gateway': 1.0.30(zod@4.1.11) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.9(zod@4.1.8) + '@ai-sdk/provider-utils': 3.0.10(zod@4.1.11) '@opentelemetry/api': 1.9.0 - zod: 4.1.8 + zod: 4.1.11 ajv@6.12.6: dependencies: @@ -7086,12 +7084,12 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + cmdk@1.1.1(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.14)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.14))(@types/react@19.1.14)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) transitivePeerDependencies: @@ -7378,9 +7376,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.5.3(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): + eslint-config-next@15.5.4(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@next/eslint-plugin-next': 15.5.3 + '@next/eslint-plugin-next': 15.5.4 '@rushstack/eslint-patch': 1.12.0 '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/parser': 8.43.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2) @@ -7680,9 +7678,9 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - framer-motion@12.23.16(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + framer-motion@12.23.22(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - motion-dom: 12.23.12 + motion-dom: 12.23.21 motion-utils: 12.23.6 tslib: 2.8.1 optionalDependencies: @@ -8583,7 +8581,7 @@ snapshots: mkdirp@3.0.1: {} - motion-dom@12.23.12: + motion-dom@12.23.21: dependencies: motion-utils: 12.23.6 @@ -8595,16 +8593,16 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.5: {} + nanoid@5.1.6: {} napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} - next-auth@5.0.0-beta.29(next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1): + next-auth@5.0.0-beta.29(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1): dependencies: '@auth/core': 0.40.0 - next: 15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): @@ -8612,9 +8610,9 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - next@15.5.3(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@next/env': 15.5.3 + '@next/env': 15.5.4 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001741 postcss: 8.4.31 @@ -8622,14 +8620,14 @@ snapshots: react-dom: 19.1.1(react@19.1.1) styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.1.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.5.3 - '@next/swc-darwin-x64': 15.5.3 - '@next/swc-linux-arm64-gnu': 15.5.3 - '@next/swc-linux-arm64-musl': 15.5.3 - '@next/swc-linux-x64-gnu': 15.5.3 - '@next/swc-linux-x64-musl': 15.5.3 - '@next/swc-win32-arm64-msvc': 15.5.3 - '@next/swc-win32-x64-msvc': 15.5.3 + '@next/swc-darwin-arm64': 15.5.4 + '@next/swc-darwin-x64': 15.5.4 + '@next/swc-linux-arm64-gnu': 15.5.4 + '@next/swc-linux-arm64-musl': 15.5.4 + '@next/swc-linux-x64-gnu': 15.5.4 + '@next/swc-linux-x64-musl': 15.5.4 + '@next/swc-win32-arm64-msvc': 15.5.4 + '@next/swc-win32-x64-msvc': 15.5.4 '@opentelemetry/api': 1.9.0 sharp: 0.34.4 transitivePeerDependencies: @@ -8893,32 +8891,32 @@ snapshots: react-is@18.3.1: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.13)(react@19.1.1): + react-remove-scroll-bar@2.3.8(@types/react@19.1.14)(react@19.1.1): dependencies: react: 19.1.1 - react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.14)(react@19.1.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - react-remove-scroll@2.7.1(@types/react@19.1.13)(react@19.1.1): + react-remove-scroll@2.7.1(@types/react@19.1.14)(react@19.1.1): dependencies: react: 19.1.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.13)(react@19.1.1) - react-style-singleton: 2.2.3(@types/react@19.1.13)(react@19.1.1) + react-remove-scroll-bar: 2.3.8(@types/react@19.1.14)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.14)(react@19.1.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.13)(react@19.1.1) - use-sidecar: 1.1.3(@types/react@19.1.13)(react@19.1.1) + use-callback-ref: 1.3.3(@types/react@19.1.14)(react@19.1.1) + use-sidecar: 1.1.3(@types/react@19.1.14)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 - react-style-singleton@2.2.3(@types/react@19.1.13)(react@19.1.1): + react-style-singleton@2.2.3(@types/react@19.1.14)(react@19.1.1): dependencies: get-nonce: 1.0.1 react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 react@19.1.1: {} @@ -9446,31 +9444,29 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.1.13)(react@19.1.1): + use-callback-ref@1.3.3(@types/react@19.1.14)(react@19.1.1): dependencies: react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 use-debounce@10.0.6(react@19.1.1): dependencies: react: 19.1.1 - use-sidecar@1.1.3(@types/react@19.1.13)(react@19.1.1): + use-sidecar@1.1.3(@types/react@19.1.14)(react@19.1.1): dependencies: detect-node-es: 1.1.0 react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.14 use-sync-external-store@1.5.0(react@19.1.1): dependencies: react: 19.1.1 - uuid@9.0.1: {} - v8-compile-cache-lib@3.0.1: {} v8-to-istanbul@9.3.0: @@ -9626,4 +9622,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@4.1.8: {} + zod@4.1.11: {} diff --git a/src/photo/UploadPageClient.tsx b/src/photo/UploadPageClient.tsx index 48b15055..5b1d13b7 100644 --- a/src/photo/UploadPageClient.tsx +++ b/src/photo/UploadPageClient.tsx @@ -10,7 +10,6 @@ import PhotoForm from './form/PhotoForm'; import { Tags } from '@/tag'; import usePhotoFormParent from './form/usePhotoFormParent'; import AiButton from './ai/AiButton'; -import { AiAutoGeneratedField } from './ai'; import { useMemo } from 'react'; import { Recipes } from '@/recipe'; import { Films } from '@/film'; @@ -24,7 +23,6 @@ export default function UploadPageClient({ uniqueRecipes, uniqueFilms, hasAiTextGeneration, - textFieldsToAutoGenerate, imageThumbnailBase64, shouldStripGpsData, }: { @@ -35,7 +33,6 @@ export default function UploadPageClient({ uniqueRecipes: Recipes uniqueFilms: Films hasAiTextGeneration?: boolean - textFieldsToAutoGenerate?: AiAutoGeneratedField[], imageThumbnailBase64?: string shouldStripGpsData?: boolean }) { @@ -49,7 +46,6 @@ export default function UploadPageClient({ aiContent, } = usePhotoFormParent({ photoForm: formDataFromExif, - textFieldsToAutoGenerate, imageThumbnailBase64, }); diff --git a/src/photo/actions.ts b/src/photo/actions.ts index fce7ebc7..521a2846 100644 --- a/src/photo/actions.ts +++ b/src/photo/actions.ts @@ -47,7 +47,7 @@ import { extractImageDataFromBlobPath, propagateRecipeTitleIfNecessary, } from './server'; -import { TAG_FAVS, isPhotoFav, isTagFavs } from '@/tag'; +import { TAG_FAVS, Tags, isPhotoFav, isTagFavs } from '@/tag'; import { convertPhotoToPhotoDbInsert, Photo } from '.'; import { runAuthenticatedAdminServerAction } from '@/auth/server'; import { AiImageQuery, getAiImageQuery, getAiTextFieldsToGenerate } from './ai'; @@ -115,6 +115,7 @@ const addUpload = async ({ excludeFromFeeds, takenAtLocal, takenAtNaiveLocal, + uniqueTags: _uniqueTags, onStreamUpdate, onFinish, shouldRevalidateAllKeysAndPaths, @@ -128,6 +129,7 @@ const addUpload = async ({ excludeFromFeeds?: string takenAtLocal: string takenAtNaiveLocal: string + uniqueTags?: Tags onStreamUpdate?: ( statusMessage: string, status?: UrlAddStatus['status'], @@ -155,21 +157,24 @@ const addUpload = async ({ const caption = formDataFromExif.caption; const tags = _tags || formDataFromExif.tags; + const uniqueTags = _uniqueTags || await getUniqueTags(); + const { title: aiTitle, caption: aiCaption, tags: aiTags, - semanticDescription, - } = await generateAiImageQueries( - imageResizedBase64, - getAiTextFieldsToGenerate( + semantic, + } = await generateAiImageQueries({ + imageBase64: imageResizedBase64, + textFieldsToGenerate: getAiTextFieldsToGenerate( AI_TEXT_AUTO_GENERATED_FIELDS, Boolean(title), Boolean(caption), Boolean(tags), ), - title, - ); + existingTitle: title, + uniqueTags, + }); const form: Partial = { ...formDataFromExif, @@ -179,7 +184,7 @@ const addUpload = async ({ excludeFromFeeds, hidden, favorite, - semanticDescription, + semanticDescription: semantic, takenAt: formDataFromExif.takenAt || takenAtLocal, takenAtNaive: formDataFromExif.takenAtNaive || takenAtNaiveLocal, }; @@ -254,6 +259,8 @@ export const addUploadsAction = async ({ progress: ++progress / PROGRESS_TASK_COUNT, }); + const uniqueTags = await getUniqueTags(); + const albumIds = albumTitles ? await createAlbumsAndGetIds(albumTitles) : []; @@ -276,6 +283,7 @@ export const addUploadsAction = async ({ excludeFromFeeds, takenAtLocal, takenAtNaiveLocal, + uniqueTags, onStreamUpdate: streamUpdate, onFinish: () => { addedUploadUrls.push(url); @@ -561,6 +569,8 @@ export const syncPhotoAction = async ( ), }); + const uniqueTags = await getUniqueTags(); + let urlToDelete: string | undefined; if (formDataFromExif) { if (await shouldBackfillPhotoStorage(photo) || shouldStripGpsData) { @@ -582,13 +592,13 @@ export const syncPhotoAction = async ( title: atTitle, caption: aiCaption, tags: aiTags, - semanticDescription: aiSemanticDescription, - } = await generateAiImageQueries( - imageResizedBase64, - photo.updateStatus?.isMissingAiTextFields, - undefined, + semantic: aiSemanticDescription, + } = await generateAiImageQueries({ + imageBase64: imageResizedBase64, + textFieldsToGenerate: photo.updateStatus?.isMissingAiTextFields ?? [], isBatch, - ); + uniqueTags, + }); const formDataFromPhoto = convertPhotoToFormData(photo); @@ -646,7 +656,7 @@ export const streamAiImageQueryAction = async ( const existingTags = await getUniqueTags(); return streamOpenAiImageQuery( imageBase64, - getAiImageQuery(query, existingTags, existingTitle), + getAiImageQuery(query, existingTitle, existingTags), ); }); diff --git a/src/photo/ai/index.ts b/src/photo/ai/index.ts index b073850c..af2c1fba 100644 --- a/src/photo/ai/index.ts +++ b/src/photo/ai/index.ts @@ -2,6 +2,7 @@ import { Tags } from '@/tag'; import { parseCommaSeparatedKeyString } from '@/utility/key'; +import { z } from 'zod'; export type AiAutoGeneratedField = 'title' | @@ -51,64 +52,72 @@ export type AiImageQuery = 'caption' | 'title-and-caption' | 'tags' | - 'description-small' | - 'description' | - 'description-large' | - 'description-semantic'; + 'semantic'; export const getAiImageQuery = ( query: AiImageQuery, - existingTags: Tags = [], existingTitle?: string, + existingTags: Tags = [], ): string => { switch (query) { - case 'title': return 'Write a compelling title for this image in 3 words or less'; + case 'title': return 'Write a compelling title for this image in 3 words or less.'; case 'caption': return existingTitle - ? `Write a pithy caption for this image in 6 words or less and no punctuation that complements the existing title: "${existingTitle}"` - : 'Write a pithy caption for this image in 6 words or less and no punctuation'; - case 'title-and-caption': return 'Write a compelling title and pithy caption of 8 words or less for this image, using the format Title: "title" Caption: "caption"'; + ? `Write a pithy caption for this image in 6 words or less and no punctuation that complements the existing title: "${existingTitle}."` + : 'Write a pithy caption for this image in 6 words or less and no punctuation.'; + case 'title-and-caption': return 'Write a compelling title and pithy caption of 8 words or less for this image, using the format Title: "title" Caption: "caption."'; case 'tags': const tagQuery = 'Describe this image in 1-2 comma-separated unique keywords, with no adjective or adverbs. Avoid using general terms like "nature," "travel," "architecture," or "sky." Use terms that are highly specific to the image and not redundant.'; const tags = existingTags.map(({ tag }) => tag).join(', '); return tags ? `${tagQuery}. Consider using some of these existing tags, but only if they are relevant: ${tags}.` : tagQuery; - case 'description-small': return 'Describe this image succinctly without the initial text "This image shows" or "This is a picture of"'; - case 'description': return 'Describe this image'; - case 'description-large': return 'Describe this image in detail'; - case 'description-semantic': return 'List up to 5 things in this image without description as a comma-separated list'; + case 'semantic': return 'Describe this image succinctly without initial text like "This image shows" or "This is a picture of."'; } }; const getAiImageQueryForField = ( field: AiAutoGeneratedField, - existingTags: Tags = [], existingTitle?: string, + existingTags?: Tags, ) => { switch(field) { - case 'title': return `TITLE: ${getAiImageQuery('title', existingTags, existingTitle)}`; - case 'caption': return `CAPTION: ${getAiImageQuery('caption', existingTags, existingTitle)}`; - case 'tags': return `TAGS: ${getAiImageQuery('tags', existingTags, existingTitle)}`; - case 'semantic': return `SEMANTIC: ${getAiImageQuery('description-small', existingTags, existingTitle)}`; + case 'title': return `TITLE: ${getAiImageQuery('title', existingTitle, existingTags)}`; + case 'caption': return `CAPTION: ${getAiImageQuery('caption', existingTitle, existingTags)}`; + case 'tags': return `TAGS: ${getAiImageQuery('tags', existingTitle, existingTags)}`; + case 'semantic': return `SEMANTIC: ${getAiImageQuery('semantic', existingTitle, existingTags)}`; } }; -export const getAiImageryQuerySet = ( +export const getAiImageQuerySchema = ( fields: AiAutoGeneratedField[], - existingTags: Tags = [], existingTitle?: string, + existingTags?: Tags, ) => { - const query = ['Generate a suite of structured meta content for the attached image:' + '\n']; + const queryLines = [ + 'Generate a set of meta content for the attached image:\n', + ]; fields.forEach(field => { - query.push(getAiImageQueryForField(field, existingTags, existingTitle)); + queryLines.push(getAiImageQueryForField(field, existingTitle, existingTags)); }); + + const query = queryLines.join('\n'); + + let schema = z.object(); - query.push(`\nRespond with a valid JSON object with the following format: { ${fields.map(field => `${field}: 'string'`).join(', ')} }`); + if (fields.includes('title')) { + schema = schema.extend({ title: z.string() }); } + if (fields.includes('caption')) { + schema = schema.extend({ caption: z.string() }); } + if (fields.includes('tags')) { + schema = schema.extend({ tags: z.string() }); } + if (fields.includes('semantic')) { + schema = schema.extend({ semantic: z.string() }); } - console.log(query.join('\n')); - - return query.join('\n'); + return { + query, + schema, + }; }; export const parseTitleAndCaption = (text: string) => { diff --git a/src/photo/ai/server.ts b/src/photo/ai/server.ts index 7c4a3d18..e37258ed 100644 --- a/src/photo/ai/server.ts +++ b/src/photo/ai/server.ts @@ -1,133 +1,92 @@ -import { generateOpenAiImageQuery } from '@/platforms/openai'; +import { generateOpenAiImageObjectQuery } from '@/platforms/openai'; import { AiAutoGeneratedField, - getAiImageQuery, + getAiImageQuerySchema, getAiTextFieldsToGenerate, - parseTitleAndCaption, } from '.'; -import { getUniqueTags } from '@/photo/query'; import { AI_TEXT_AUTO_GENERATED_FIELDS } from '@/app/config'; import { PhotoFormData } from '../form'; +import { Tags } from '@/tag'; -export const generateAiImageQueries = async ( - imageBase64?: string, - textFieldsToGenerate: AiAutoGeneratedField[] = [], - existingTitle?: string, - isBatch?: boolean, -): Promise<{ +export const generateAiImageQueries = async ({ + imageBase64, + textFieldsToGenerate = [], + existingTitle, + uniqueTags, + isBatch, +}: { + imageBase64?: string + textFieldsToGenerate: AiAutoGeneratedField[] + existingTitle?: string + uniqueTags: Tags + isBatch?: boolean +}): Promise<{ title?: string caption?: string tags?: string - semanticDescription?: string + semantic?: string error?: string }> => { - let title: string | undefined; - let caption: string | undefined; - let tags: string | undefined; - let semanticDescription: string | undefined; - let error: string | undefined; - - try { - if (imageBase64) { - const shouldGenerateTitleAndCaption = - textFieldsToGenerate.includes('title') && - textFieldsToGenerate.includes('caption'); - const shouldGenerateTitle = - !shouldGenerateTitleAndCaption && - textFieldsToGenerate.includes('title'); - const shouldGenerateCaption = - !shouldGenerateTitleAndCaption && - textFieldsToGenerate.includes('caption'); - const shouldGenerateTags = textFieldsToGenerate.includes('tags'); - const shouldGenerateSemantic = textFieldsToGenerate.includes('semantic'); - - const [ - titleAndCaption, - _title, - _caption, - _tags, - _semanticDescription, - ] = await Promise.all([ - shouldGenerateTitleAndCaption ? generateOpenAiImageQuery( - imageBase64, - getAiImageQuery('title-and-caption'), - isBatch, - ): undefined, - shouldGenerateTitle ? generateOpenAiImageQuery( - imageBase64, - getAiImageQuery('title', undefined, existingTitle), - isBatch, - ): undefined, - shouldGenerateCaption ? generateOpenAiImageQuery( - imageBase64, - getAiImageQuery('caption'), - isBatch, - ): undefined, - shouldGenerateTags ? getUniqueTags() - .then(existingTags => generateOpenAiImageQuery( - imageBase64, - getAiImageQuery('tags', existingTags), - isBatch, - )): undefined, - shouldGenerateSemantic ? generateOpenAiImageQuery( - imageBase64, - getAiImageQuery('description-small'), - isBatch, - ): undefined, - ]); - - if (titleAndCaption) { - const titleAndCaptionParsed = parseTitleAndCaption(titleAndCaption); - title = titleAndCaptionParsed.title; - caption = titleAndCaptionParsed.caption; - } else { - title = _title; - caption = _caption; - } - tags = _tags; - semanticDescription = _semanticDescription; + if (imageBase64) { + try { + const { query, schema } = getAiImageQuerySchema( + textFieldsToGenerate, + existingTitle, + uniqueTags, + ); + return generateOpenAiImageObjectQuery( + imageBase64, + query, + schema, + isBatch, + ); + } catch (e: any) { + return { + error: e.message, + }; } - } catch (e: any) { - error = e.message; - console.log('Error generating AI image text', e.message); + } else { + return { + error: 'No image provided', + }; } - - return { - title, - caption, - tags, - semanticDescription, - error, - }; }; -export const addAiTextToFormData = async ( - formData: Partial = {}, - imageBase64?: string, - title?: string, - tags?: string, -): Promise> => { +export const addAiTextToFormData = async ({ + formData = {}, + imageBase64, + existingTitle, + existingTags, + uniqueTags, +}: { + formData?: Partial + imageBase64?: string + existingTitle?: string + existingTags?: string + uniqueTags: Tags +}): Promise> => { const { title: aiTitle, caption: aiCaption, tags: aiTags, - semanticDescription, - } = await generateAiImageQueries( + semantic, + } = await generateAiImageQueries({ imageBase64, - getAiTextFieldsToGenerate( + textFieldsToGenerate: getAiTextFieldsToGenerate( AI_TEXT_AUTO_GENERATED_FIELDS, - Boolean(title || formData?.title), + Boolean(existingTitle || formData?.title), Boolean(formData?.caption), - Boolean(tags || formData?.tags), + Boolean(existingTags || formData?.tags), ), - title || formData?.title, - ); + existingTitle: existingTitle || formData?.title, + uniqueTags, + }); return { ...formData, title: formData?.title || aiTitle, caption: formData?.caption || aiCaption, tags: formData?.tags || aiTags, - semanticDescription, + semanticDescription: semantic, }; }; diff --git a/src/photo/ai/useAiImageQueries.ts b/src/photo/ai/useAiImageQueries.ts index d1b24d57..1fea05ab 100644 --- a/src/photo/ai/useAiImageQueries.ts +++ b/src/photo/ai/useAiImageQueries.ts @@ -43,7 +43,7 @@ export default function useAiImageQueries( requestSemantic, semanticDescription, isLoadingSemantic, - ] = useAiImageQuery(imageBase64, 'description-small'); + ] = useAiImageQuery(imageBase64, 'semantic'); const title = _title || titleSolo; const caption = _caption || captionSolo; diff --git a/src/photo/form/usePhotoFormParent.ts b/src/photo/form/usePhotoFormParent.ts index def379bb..d914bda8 100644 --- a/src/photo/form/usePhotoFormParent.ts +++ b/src/photo/form/usePhotoFormParent.ts @@ -1,15 +1,12 @@ import { useCallback, useState } from 'react'; import { PhotoFormData, formHasExistingAiTextContent } from '.'; import useAiImageQueries from '../ai/useAiImageQueries'; -import { AiAutoGeneratedField } from '../ai'; export default function usePhotoFormParent({ photoForm, - textFieldsToAutoGenerate: _textFieldsToAutoGenerate = [], imageThumbnailBase64, }: { photoForm?: Partial - textFieldsToAutoGenerate?: AiAutoGeneratedField[] imageThumbnailBase64?: string, }) { const [pending, setIsPending] = useState(false); diff --git a/src/platforms/openai.ts b/src/platforms/openai.ts index 6d47e774..26357104 100644 --- a/src/platforms/openai.ts +++ b/src/platforms/openai.ts @@ -1,4 +1,4 @@ -import { generateText, streamText } from 'ai'; +import { generateText, streamText, generateObject } from 'ai'; import { createStreamableValue } from '@ai-sdk/rsc'; import { createOpenAI } from '@ai-sdk/openai'; import { Ratelimit } from '@upstash/ratelimit'; @@ -6,6 +6,7 @@ import { AI_CONTENT_GENERATION_ENABLED, OPENAI_BASE_URL } from '@/app/config'; import { removeBase64Prefix } from '@/utility/image'; import { cleanUpAiTextResponse } from '@/photo/ai'; import { redis } from '@/platforms/redis'; +import { z } from 'zod'; const RATE_LIMIT_IDENTIFIER = 'openai-image-query'; const MODEL = 'gpt-4o'; @@ -107,6 +108,39 @@ export const generateOpenAiImageQuery = async ( } }; +export const generateOpenAiImageObjectQuery = async ( + imageBase64: string, + query: string, + schema: T, + isBatch?: boolean, +): Promise> => { + await checkRateLimitAndThrow(isBatch); + + if (openai) { + return generateObject({ + model: openai(MODEL), + messages: [{ + 'role': 'user', + 'content': [ + { + 'type': 'text', + 'text': query, + }, { + 'type': 'image', + 'image': removeBase64Prefix(imageBase64), + }, + ], + }], + schema, + }).then(result => Object.fromEntries(Object + .entries(result.object || {}) + .map(([k, v]) => [k, cleanUpAiTextResponse(v as string)]), + ) as z.infer); + } else { + throw new Error('No OpenAI client'); + } +}; + export const testOpenAiConnection = async () => { await checkRateLimitAndThrow();