diff --git a/apps/dev-tool/package.json b/apps/dev-tool/package.json index 1aae58c2e..05e985478 100644 --- a/apps/dev-tool/package.json +++ b/apps/dev-tool/package.json @@ -8,11 +8,11 @@ "format": "prettier --check --write \"**/*.{js,cjs,mjs,ts,tsx,md,json}\"" }, "dependencies": { - "@ai-sdk/openai": "^2.0.34", + "@ai-sdk/openai": "^2.0.38", "@faker-js/faker": "^10.0.0", "@hookform/resolvers": "^5.2.2", "@tanstack/react-query": "5.90.2", - "ai": "5.0.51", + "ai": "5.0.56", "lucide-react": "^0.544.0", "next": "15.5.4", "nodemailer": "^7.0.6", @@ -32,7 +32,7 @@ "@tailwindcss/postcss": "^4.1.13", "@types/node": "^24.5.2", "@types/nodemailer": "7.0.1", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "@types/react-dom": "19.1.9", "babel-plugin-react-compiler": "19.1.0-rc.3", "pino-pretty": "13.0.0", diff --git a/apps/e2e/package.json b/apps/e2e/package.json index 51be87b22..424bd18a6 100644 --- a/apps/e2e/package.json +++ b/apps/e2e/package.json @@ -12,7 +12,7 @@ "author": "Makerkit", "devDependencies": { "@playwright/test": "^1.55.1", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@types/node": "^24.5.2", "dotenv": "17.2.2", "node-html-parser": "^7.0.1", diff --git a/apps/e2e/tests/invitations/invitations.po.ts b/apps/e2e/tests/invitations/invitations.po.ts index fe9fe4695..ddf6efc13 100644 --- a/apps/e2e/tests/invitations/invitations.po.ts +++ b/apps/e2e/tests/invitations/invitations.po.ts @@ -115,18 +115,17 @@ export class InvitationsPageObject { async acceptInvitation() { console.log('Accepting invitation...'); - const click = this.page - .locator('[data-test="join-team-form"] button[type="submit"]') - .click(); - - const response = this.page.waitForResponse((response) => { - return ( - response.url().includes('/join') && - response.request().method() === 'POST' - ); - }); - - await Promise.all([click, response]); + await Promise.all([ + this.page + .locator('[data-test="join-team-form"] button[type="submit"]') + .click(), + this.page.waitForResponse((response) => { + return ( + response.url().includes('/join') && + response.request().method() === 'POST' + ); + }), + ]); console.log('Invitation accepted'); } diff --git a/apps/e2e/tests/team-accounts/team-invitation-mfa.spec.ts b/apps/e2e/tests/team-accounts/team-invitation-mfa.spec.ts index 7c9a7a570..4b8ab01dd 100644 --- a/apps/e2e/tests/team-accounts/team-invitation-mfa.spec.ts +++ b/apps/e2e/tests/team-accounts/team-invitation-mfa.spec.ts @@ -13,7 +13,7 @@ test.describe('Team Invitation with MFA Flow', () => { const invitations = new InvitationsPageObject(page); await auth.loginAsUser({ - email: 'test@makerkit.dev', + email: 'owner@makerkit.dev', }); const teamName = `test-team-${Math.random().toString(36).substring(2, 15)}`; diff --git a/apps/web/app/home/[account]/members/policies/route.ts b/apps/web/app/home/[account]/members/policies/route.ts new file mode 100644 index 000000000..45f66cd97 --- /dev/null +++ b/apps/web/app/home/[account]/members/policies/route.ts @@ -0,0 +1,69 @@ +import { NextResponse } from 'next/server'; + +import { z } from 'zod'; + +import { enhanceRouteHandler } from '@kit/next/routes'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; +import { + createInvitationContextBuilder, + createInvitationsPolicyEvaluator, +} from '@kit/team-accounts/policies'; + +export const GET = enhanceRouteHandler( + async function ({ params, user }) { + const client = getSupabaseServerClient(); + const { account } = z.object({ account: z.string() }).parse(params); + + try { + // Evaluate with standard evaluator + const evaluator = createInvitationsPolicyEvaluator(); + const hasPolicies = await evaluator.hasPoliciesForStage('preliminary'); + + if (!hasPolicies) { + return NextResponse.json({ + allowed: true, + reasons: [], + metadata: { + policiesEvaluated: 0, + timestamp: new Date().toISOString(), + noPoliciesConfigured: true, + }, + }); + } + + // Build context for policy evaluation (empty invitations for testing) + const contextBuilder = createInvitationContextBuilder(client); + + const context = await contextBuilder.buildContext( + { + invitations: [], + accountSlug: account, + }, + user, + ); + + // validate against policies + const result = await evaluator.canInvite(context, 'preliminary'); + + return NextResponse.json(result); + } catch (error) { + return NextResponse.json( + { + allowed: false, + reasons: [ + error instanceof Error ? error.message : 'Unknown error occurred', + ], + metadata: { + error: true, + originalError: + error instanceof Error ? error.message : String(error), + }, + }, + { status: 500 }, + ); + } + }, + { + auth: true, + }, +); diff --git a/apps/web/package.json b/apps/web/package.json index af5db82ec..a35d81afc 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -56,7 +56,7 @@ "@marsidev/react-turnstile": "^1.3.1", "@nosecone/next": "1.0.0-beta.12", "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@tanstack/react-query": "5.90.2", "@tanstack/react-table": "^8.21.3", "date-fns": "^4.1.0", @@ -67,7 +67,7 @@ "react": "19.1.1", "react-dom": "19.1.1", "react-hook-form": "^7.63.0", - "react-i18next": "^15.7.3", + "react-i18next": "^16.0.0", "recharts": "2.15.3", "tailwind-merge": "^3.3.1", "zod": "^3.25.74" @@ -79,13 +79,13 @@ "@next/bundle-analyzer": "15.5.4", "@tailwindcss/postcss": "^4.1.13", "@types/node": "^24.5.2", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "@types/react-dom": "19.1.9", "babel-plugin-react-compiler": "19.1.0-rc.3", "cssnano": "^7.1.1", "pino-pretty": "13.0.0", "prettier": "^3.6.2", - "supabase": "2.45.5", + "supabase": "2.47.2", "tailwindcss": "4.1.13", "tailwindcss-animate": "^1.0.7", "typescript": "^5.9.2" diff --git a/apps/web/public/locales/en/teams.json b/apps/web/public/locales/en/teams.json index 2a0b61413..21080823d 100644 --- a/apps/web/public/locales/en/teams.json +++ b/apps/web/public/locales/en/teams.json @@ -159,5 +159,17 @@ "leaveTeamInputLabel": "Please type LEAVE to confirm leaving the team.", "leaveTeamInputDescription": "By leaving the team, you will no longer have access to it.", "reservedNameError": "This name is reserved. Please choose a different one.", - "specialCharactersError": "This name cannot contain special characters. Please choose a different one." + "specialCharactersError": "This name cannot contain special characters. Please choose a different one.", + "checkingPolicies": "Loading. Please wait...", + "policyCheckError": "We are unable to verify invitations restrictions. Please try again.", + "invitationsBlockedMultiple": "Invitations are currently not allowed for the following reasons:", + "invitationsBlockedDefault": "Invitations are currently not allowed due to policy restrictions.", + "policyErrors": { + "subscriptionRequired": "An active subscription is required to invite team members.", + "paddleTrialRestriction": "Cannot invite members during trial period with per-seat billing on Paddle." + }, + "policyRemediation": { + "subscriptionRequired": "Please upgrade your plan or activate your subscription", + "paddleTrialRestriction": "Wait until trial period ends or upgrade to full plan" + } } diff --git a/package.json b/package.json index 356d5d560..723b079d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "next-supabase-saas-kit-turbo", - "version": "2.15.1", + "version": "2.16.0", "private": true, "sideEffects": false, "engines": { diff --git a/packages/billing/gateway/package.json b/packages/billing/gateway/package.json index 551a95265..091fed9af 100644 --- a/packages/billing/gateway/package.json +++ b/packages/billing/gateway/package.json @@ -26,14 +26,14 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@supabase/supabase-js": "2.57.4", - "@types/react": "19.1.13", + "@supabase/supabase-js": "2.58.0", + "@types/react": "19.1.15", "date-fns": "^4.1.0", "lucide-react": "^0.544.0", "next": "15.5.4", "react": "19.1.1", "react-hook-form": "^7.63.0", - "react-i18next": "^15.7.3", + "react-i18next": "^16.0.0", "zod": "^3.25.74" }, "typesVersions": { diff --git a/packages/billing/gateway/src/server/services/billing-webhooks/billing-webhooks.service.ts b/packages/billing/gateway/src/server/services/billing-webhooks/billing-webhooks.service.ts index bf564cc36..6bf8a18d0 100644 --- a/packages/billing/gateway/src/server/services/billing-webhooks/billing-webhooks.service.ts +++ b/packages/billing/gateway/src/server/services/billing-webhooks/billing-webhooks.service.ts @@ -32,6 +32,7 @@ class BillingWebhooksService { return gateway.cancelSubscription({ subscriptionId: subscription.id, + invoiceNow: true, }); } } diff --git a/packages/billing/lemon-squeezy/package.json b/packages/billing/lemon-squeezy/package.json index a9bbce14f..0f8c802b1 100644 --- a/packages/billing/lemon-squeezy/package.json +++ b/packages/billing/lemon-squeezy/package.json @@ -24,7 +24,7 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "next": "15.5.4", "react": "19.1.1", "zod": "^3.25.74" diff --git a/packages/billing/stripe/package.json b/packages/billing/stripe/package.json index 39e40ecb1..8ab41d2e6 100644 --- a/packages/billing/stripe/package.json +++ b/packages/billing/stripe/package.json @@ -27,7 +27,7 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "date-fns": "^4.1.0", "next": "15.5.4", "react": "19.1.1", diff --git a/packages/cms/keystatic/package.json b/packages/cms/keystatic/package.json index 80532b7d4..326579ff2 100644 --- a/packages/cms/keystatic/package.json +++ b/packages/cms/keystatic/package.json @@ -27,7 +27,7 @@ "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", "@types/node": "^24.5.2", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "react": "19.1.1", "zod": "^3.25.74" }, diff --git a/packages/cms/wordpress/package.json b/packages/cms/wordpress/package.json index 23e2c6125..3fc7b1c3e 100644 --- a/packages/cms/wordpress/package.json +++ b/packages/cms/wordpress/package.json @@ -21,7 +21,7 @@ "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", "@types/node": "^24.5.2", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "wp-types": "^4.68.1" }, "typesVersions": { diff --git a/packages/database-webhooks/package.json b/packages/database-webhooks/package.json index c51cbec59..9da4d2411 100644 --- a/packages/database-webhooks/package.json +++ b/packages/database-webhooks/package.json @@ -22,7 +22,7 @@ "@kit/supabase": "workspace:*", "@kit/team-accounts": "workspace:*", "@kit/tsconfig": "workspace:*", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "zod": "^3.25.74" }, "typesVersions": { diff --git a/packages/email-templates/package.json b/packages/email-templates/package.json index 5ffdbc8f3..4633c1865 100644 --- a/packages/email-templates/package.json +++ b/packages/email-templates/package.json @@ -13,7 +13,7 @@ ".": "./src/index.ts" }, "dependencies": { - "@react-email/components": "0.5.4" + "@react-email/components": "0.5.5" }, "devDependencies": { "@kit/eslint-config": "workspace:*", diff --git a/packages/features/accounts/package.json b/packages/features/accounts/package.json index f4d1c5765..0bbde3383 100644 --- a/packages/features/accounts/package.json +++ b/packages/features/accounts/package.json @@ -34,9 +34,9 @@ "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@tanstack/react-query": "5.90.2", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "@types/react-dom": "19.1.9", "lucide-react": "^0.544.0", "next": "15.5.4", @@ -44,7 +44,7 @@ "react": "19.1.1", "react-dom": "19.1.1", "react-hook-form": "^7.63.0", - "react-i18next": "^15.7.3", + "react-i18next": "^16.0.0", "zod": "^3.25.74" }, "prettier": "@kit/prettier-config", diff --git a/packages/features/admin/package.json b/packages/features/admin/package.json index 2494c6fee..ba0ef7eec 100644 --- a/packages/features/admin/package.json +++ b/packages/features/admin/package.json @@ -20,10 +20,10 @@ "@kit/ui": "workspace:*", "@makerkit/data-loader-supabase-core": "^0.0.10", "@makerkit/data-loader-supabase-nextjs": "^1.2.5", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@tanstack/react-query": "5.90.2", "@tanstack/react-table": "^8.21.3", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "lucide-react": "^0.544.0", "next": "15.5.4", "react": "19.1.1", diff --git a/packages/features/auth/package.json b/packages/features/auth/package.json index 00fa17ba2..f992b6fa3 100644 --- a/packages/features/auth/package.json +++ b/packages/features/auth/package.json @@ -29,13 +29,13 @@ "@kit/ui": "workspace:*", "@marsidev/react-turnstile": "^1.3.1", "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@tanstack/react-query": "5.90.2", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "lucide-react": "^0.544.0", "next": "15.5.4", "react-hook-form": "^7.63.0", - "react-i18next": "^15.7.3", + "react-i18next": "^16.0.0", "sonner": "^2.0.7", "zod": "^3.25.74" }, diff --git a/packages/features/notifications/package.json b/packages/features/notifications/package.json index 55905d483..6bb1b9a23 100644 --- a/packages/features/notifications/package.json +++ b/packages/features/notifications/package.json @@ -19,13 +19,13 @@ "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@tanstack/react-query": "5.90.2", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "lucide-react": "^0.544.0", "react": "19.1.1", "react-dom": "19.1.1", - "react-i18next": "^15.7.3" + "react-i18next": "^16.0.0" }, "prettier": "@kit/prettier-config", "typesVersions": { diff --git a/packages/features/team-accounts/package.json b/packages/features/team-accounts/package.json index 276a82999..d25d92bfe 100644 --- a/packages/features/team-accounts/package.json +++ b/packages/features/team-accounts/package.json @@ -12,7 +12,10 @@ "./api": "./src/server/api.ts", "./components": "./src/components/index.ts", "./hooks/*": "./src/hooks/*.ts", - "./webhooks": "./src/server/services/webhooks/index.ts" + "./webhooks": "./src/server/services/webhooks/index.ts", + "./policies": "./src/server/policies/index.ts", + "./policies/orchestrator": "./src/server/policies/orchestrator.ts", + "./services/account-invitations.service": "./src/server/services/account-invitations.service.ts" }, "dependencies": { "nanoid": "^5.1.6" @@ -27,15 +30,16 @@ "@kit/monitoring": "workspace:*", "@kit/next": "workspace:*", "@kit/otp": "workspace:*", + "@kit/policies": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/shared": "workspace:*", "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@tanstack/react-query": "5.90.2", "@tanstack/react-table": "^8.21.3", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "@types/react-dom": "19.1.9", "class-variance-authority": "^0.7.1", "date-fns": "^4.1.0", @@ -44,7 +48,7 @@ "react": "19.1.1", "react-dom": "19.1.1", "react-hook-form": "^7.63.0", - "react-i18next": "^15.7.3", + "react-i18next": "^16.0.0", "zod": "^3.25.74" }, "prettier": "@kit/prettier-config", diff --git a/packages/features/team-accounts/src/components/members/invite-members-dialog-container.tsx b/packages/features/team-accounts/src/components/members/invite-members-dialog-container.tsx index 26fd9eebd..35e119638 100644 --- a/packages/features/team-accounts/src/components/members/invite-members-dialog-container.tsx +++ b/packages/features/team-accounts/src/components/members/invite-members-dialog-container.tsx @@ -3,10 +3,12 @@ import { useState, useTransition } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; +import { useQuery } from '@tanstack/react-query'; import { Plus, X } from 'lucide-react'; import { useFieldArray, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; +import { Alert, AlertDescription } from '@kit/ui/alert'; import { Button } from '@kit/ui/button'; import { Dialog, @@ -27,6 +29,7 @@ import { import { If } from '@kit/ui/if'; import { Input } from '@kit/ui/input'; import { toast } from '@kit/ui/sonner'; +import { Spinner } from '@kit/ui/spinner'; import { Tooltip, TooltipContent, @@ -62,6 +65,13 @@ export function InviteMembersDialogContainer({ const [isOpen, setIsOpen] = useState(false); const { t } = useTranslation('teams'); + // Evaluate policies when dialog is open + const { + data: policiesResult, + isLoading: isLoadingPolicies, + error: policiesError, + } = useFetchInvitationsPolicies({ accountSlug, isOpen }); + return ( {children} @@ -77,30 +87,70 @@ export function InviteMembersDialogContainer({ - - {(roles) => ( - { - startTransition(() => { - const promise = createInvitationsAction({ - accountSlug, - invitations: data.invitations, - }); + +
+ - toast.promise(() => promise, { - loading: t('invitingMembers'), - success: t('inviteMembersSuccessMessage'), - error: t('inviteMembersErrorMessage'), - }); + + + +
+
- setIsOpen(false); - }); - }} - /> - )} -
+ + + + + + + + + + + + + + + + + + + {(roles) => ( + { + startTransition(async () => { + const toastId = toast.loading(t('invitingMembers')); + + const result = await createInvitationsAction({ + accountSlug, + invitations: data.invitations, + }); + + if (result.success) { + toast.success(t('inviteMembersSuccessMessage'), { + id: toastId, + }); + } else { + toast.error(t('inviteMembersErrorMessage'), { + id: toastId, + }); + } + + setIsOpen(false); + }); + }} + /> + )} + +
); @@ -275,3 +325,27 @@ function InviteMembersForm({ function createEmptyInviteModel() { return { email: '', role: 'member' as Role }; } + +function useFetchInvitationsPolicies({ + accountSlug, + isOpen, +}: { + accountSlug: string; + isOpen: boolean; +}) { + return useQuery({ + queryKey: ['invitation-policies', accountSlug], + queryFn: async () => { + const response = await fetch(`./members/policies`); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + return response.json(); + }, + enabled: isOpen, + staleTime: 5 * 60 * 1000, + refetchOnWindowFocus: false, + }); +} diff --git a/packages/features/team-accounts/src/components/members/roles-data-provider.tsx b/packages/features/team-accounts/src/components/members/roles-data-provider.tsx index 1075e5b4b..cf442d22d 100644 --- a/packages/features/team-accounts/src/components/members/roles-data-provider.tsx +++ b/packages/features/team-accounts/src/components/members/roles-data-provider.tsx @@ -38,5 +38,6 @@ function useFetchRoles(props: { maxRoleHierarchy: number }) { return data.map((item) => item.name); }, + staleTime: 1000 * 60 * 30, // 30 minutes }); } diff --git a/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts index 2e210c2ee..7d20d4804 100644 --- a/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts @@ -6,14 +6,18 @@ import { redirect } from 'next/navigation'; import { z } from 'zod'; import { enhanceAction } from '@kit/next/actions'; +import { getLogger } from '@kit/shared/logger'; import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; +import { JWTUserData } from '@kit/supabase/types'; import { AcceptInvitationSchema } from '../../schema/accept-invitation.schema'; import { DeleteInvitationSchema } from '../../schema/delete-invitation.schema'; import { InviteMembersSchema } from '../../schema/invite-members.schema'; import { RenewInvitationSchema } from '../../schema/renew-invitation.schema'; import { UpdateInvitationSchema } from '../../schema/update-invitation.schema'; +import { createInvitationContextBuilder } from '../policies/invitation-context-builder'; +import { createInvitationsPolicyEvaluator } from '../policies/invitation-policies'; import { createAccountInvitationsService } from '../services/account-invitations.service'; import { createAccountPerSeatBillingService } from '../services/account-per-seat-billing.service'; @@ -22,20 +26,47 @@ import { createAccountPerSeatBillingService } from '../services/account-per-seat * @description Creates invitations for inviting members. */ export const createInvitationsAction = enhanceAction( - async (params) => { - const client = getSupabaseServerClient(); + async (params, user) => { + const logger = await getLogger(); - // Create the service + logger.info( + { params, userId: user.id }, + 'User requested to send invitations', + ); + + // Evaluate invitation policies + const policiesResult = await evaluateInvitationsPolicies(params, user); + + // If the invitations are not allowed, throw an error + if (!policiesResult.allowed) { + logger.info( + { reasons: policiesResult?.reasons, userId: user.id }, + 'Invitations blocked by policies', + ); + + return { + success: false, + reasons: policiesResult?.reasons, + }; + } + + // invitations are allowed, so continue with the action + const client = getSupabaseServerClient(); const service = createAccountInvitationsService(client); - // send invitations - await service.sendInvitations(params); + try { + await service.sendInvitations(params); - revalidateMemberPage(); + revalidateMemberPage(); - return { - success: true, - }; + return { + success: true, + }; + } catch { + return { + success: false, + }; + } }, { schema: InviteMembersSchema.and( @@ -157,3 +188,30 @@ export const renewInvitationAction = enhanceAction( function revalidateMemberPage() { revalidatePath('/home/[account]/members', 'page'); } + +/** + * @name evaluateInvitationsPolicies + * @description Evaluates invitation policies with performance optimization. + * @param params - The invitations to evaluate (emails and roles). + */ +async function evaluateInvitationsPolicies( + params: z.infer & { accountSlug: string }, + user: JWTUserData, +) { + const evaluator = createInvitationsPolicyEvaluator(); + const hasPolicies = await evaluator.hasPoliciesForStage('submission'); + + // No policies to evaluate, skip + if (!hasPolicies) { + return { + allowed: true, + reasons: [], + }; + } + + const client = getSupabaseServerClient(); + const builder = createInvitationContextBuilder(client); + const context = await builder.buildContext(params, user); + + return evaluator.canInvite(context, 'submission'); +} diff --git a/packages/features/team-accounts/src/server/policies/feature-policy-invitation-context.ts b/packages/features/team-accounts/src/server/policies/feature-policy-invitation-context.ts new file mode 100644 index 000000000..45ef9ea38 --- /dev/null +++ b/packages/features/team-accounts/src/server/policies/feature-policy-invitation-context.ts @@ -0,0 +1,61 @@ +import type { PolicyContext, PolicyResult } from '@kit/policies'; +import { Database } from '@kit/supabase/database'; + +/** + * Invitation policy context that extends the base PolicyContext + * from @kit/policies for invitation-specific data. + */ +export interface FeaturePolicyInvitationContext extends PolicyContext { + /** The account slug being invited to */ + accountSlug: string; + + /** The account ID being invited to (same as accountId from base) */ + accountId: string; + + /** Current subscription data for the account */ + subscription?: { + id: string; + status: Database['public']['Enums']['subscription_status']; + provider: Database['public']['Enums']['billing_provider']; + active: boolean; + trial_starts_at?: string; + trial_ends_at?: string; + items: Array<{ + id: string; + type: Database['public']['Enums']['subscription_item_type']; + quantity: number; + product_id: string; + variant_id: string; + }>; + }; + + /** Current number of members in the account */ + currentMemberCount: number; + + /** The invitations being attempted */ + invitations: Array<{ + email: string; + role: string; + }>; + + /** The user performing the invitation */ + invitingUser: { + id: string; + email?: string; + }; +} + +/** + * Invitation policy result that extends the base PolicyResult + * from @kit/policies while maintaining backward compatibility. + */ +export interface FeaturePolicyInvitationResult extends PolicyResult { + /** Whether the invitations are allowed */ + allowed: boolean; + + /** Human-readable reason if not allowed */ + reason?: string; + + /** Additional metadata for logging/debugging */ + metadata?: Record; +} diff --git a/packages/features/team-accounts/src/server/policies/index.ts b/packages/features/team-accounts/src/server/policies/index.ts new file mode 100644 index 000000000..9906edd22 --- /dev/null +++ b/packages/features/team-accounts/src/server/policies/index.ts @@ -0,0 +1,7 @@ +export { createInvitationsPolicyEvaluator } from './invitation-policies'; + +// Context building +export { createInvitationContextBuilder } from './invitation-context-builder'; + +// Type exports +export type { FeaturePolicyInvitationContext } from './feature-policy-invitation-context'; diff --git a/packages/features/team-accounts/src/server/policies/invitation-context-builder.ts b/packages/features/team-accounts/src/server/policies/invitation-context-builder.ts new file mode 100644 index 000000000..3cc8548d1 --- /dev/null +++ b/packages/features/team-accounts/src/server/policies/invitation-context-builder.ts @@ -0,0 +1,147 @@ +import type { SupabaseClient } from '@supabase/supabase-js'; + +import { z } from 'zod'; + +import type { Database } from '@kit/supabase/database'; +import { JWTUserData } from '@kit/supabase/types'; + +import { InviteMembersSchema } from '../../schema/invite-members.schema'; +import type { FeaturePolicyInvitationContext } from './feature-policy-invitation-context'; + +/** + * Creates an invitation context builder + * @param client - The Supabase client + * @returns + */ +export function createInvitationContextBuilder( + client: SupabaseClient, +) { + return new InvitationContextBuilder(client); +} + +/** + * Invitation context builder + */ +class InvitationContextBuilder { + constructor(private readonly client: SupabaseClient) {} + + /** + * Build policy context for invitation evaluation with optimized parallel loading + */ + async buildContext( + params: z.infer & { accountSlug: string }, + user: JWTUserData, + ): Promise { + // Fetch all data in parallel for optimal performance + const account = await this.getAccount(params.accountSlug); + + // Fetch subscription and member count in parallel using account ID + const [subscription, memberCount] = await Promise.all([ + this.getSubscription(account.id), + this.getMemberCount(account.id), + ]); + + return { + // Base PolicyContext fields + timestamp: new Date().toISOString(), + metadata: { + accountSlug: params.accountSlug, + invitationCount: params.invitations.length, + invitingUserEmail: user.email as string, + }, + + // Invitation-specific fields + accountSlug: params.accountSlug, + accountId: account.id, + subscription, + currentMemberCount: memberCount, + invitations: params.invitations, + invitingUser: { + id: user.id, + email: user.email, + }, + }; + } + + /** + * Gets the account from the database + * @param accountSlug - The slug of the account to get + * @returns + */ + private async getAccount(accountSlug: string) { + const { data: account } = await this.client + .from('accounts') + .select('id') + .eq('slug', accountSlug) + .single(); + + if (!account) { + throw new Error('Account not found'); + } + + return account; + } + + /** + * Gets the subscription from the database + * @param accountId - The ID of the account to get the subscription for + * @returns + */ + private async getSubscription(accountId: string) { + const { data: subscription } = await this.client + .from('subscriptions') + .select( + ` + id, + status, + active, + trial_starts_at, + trial_ends_at, + billing_provider, + subscription_items( + id, + type, + quantity, + product_id, + variant_id + ) + `, + ) + .eq('account_id', accountId) + .eq('active', true) + .single(); + + return subscription + ? { + id: subscription.id, + status: subscription.status, + provider: subscription.billing_provider, + active: subscription.active, + trial_starts_at: subscription.trial_starts_at || undefined, + trial_ends_at: subscription.trial_ends_at || undefined, + items: + subscription.subscription_items?.map((item) => ({ + id: item.id, + type: item.type, + quantity: item.quantity, + product_id: item.product_id, + variant_id: item.variant_id, + })) || [], + } + : undefined; + } + + /** + * Gets the member count from the database + * @param accountId - The ID of the account to get the member count for + * @returns + */ + private async getMemberCount(accountId: string) { + const { count } = await this.client + .from('accounts_memberships') + .select('*', { count: 'exact', head: true }) + .eq('account_id', accountId); + + return count || 0; + } +} diff --git a/packages/features/team-accounts/src/server/policies/invitation-policies.ts b/packages/features/team-accounts/src/server/policies/invitation-policies.ts new file mode 100644 index 000000000..d8f9dbe7c --- /dev/null +++ b/packages/features/team-accounts/src/server/policies/invitation-policies.ts @@ -0,0 +1,39 @@ +import { createPoliciesEvaluator } from '@kit/policies'; + +import type { FeaturePolicyInvitationContext } from './feature-policy-invitation-context'; +import { invitationPolicyRegistry } from './policies'; + +/** + * Creates an invitation evaluator + */ +export function createInvitationsPolicyEvaluator() { + const evaluator = createPoliciesEvaluator(); + + return { + /** + * Checks if there are any invitation policies for the given stage + * @param stage - The stage to check if there are any invitation policies for + */ + async hasPoliciesForStage(stage: 'preliminary' | 'submission') { + return evaluator.hasPoliciesForStage(invitationPolicyRegistry, stage); + }, + + /** + * Evaluates the invitation policies for the given context and stage + * @param context - The context for the invitation policy + * @param stage - The stage to evaluate the invitation policies for + * @returns + */ + async canInvite( + context: FeaturePolicyInvitationContext, + stage: 'preliminary' | 'submission', + ) { + return evaluator.evaluate( + invitationPolicyRegistry, + context, + 'ALL', + stage, + ); + }, + }; +} diff --git a/packages/features/team-accounts/src/server/policies/policies.ts b/packages/features/team-accounts/src/server/policies/policies.ts new file mode 100644 index 000000000..f1e9f80e1 --- /dev/null +++ b/packages/features/team-accounts/src/server/policies/policies.ts @@ -0,0 +1,70 @@ +import { allow, definePolicy, deny } from '@kit/policies'; +import { createPolicyRegistry } from '@kit/policies'; + +import { FeaturePolicyInvitationContext } from './feature-policy-invitation-context'; + +/** + * Feature-specific registry for invitation policies + */ +export const invitationPolicyRegistry = createPolicyRegistry(); + +/** + * Subscription required policy + * Checks if the account has an active subscription + */ +export const subscriptionRequiredInvitationsPolicy = + definePolicy({ + id: 'subscription-required', + stages: ['preliminary', 'submission'], + evaluate: async ({ subscription }) => { + if (!subscription || !subscription.active) { + return deny({ + code: 'SUBSCRIPTION_REQUIRED', + message: 'teams:policyErrors.subscriptionRequired', + remediation: 'teams:policyRemediation.subscriptionRequired', + }); + } + + return allow(); + }, + }); + +/** + * Paddle billing policy + * Checks if the account has a paddle subscription and is in a trial period + */ +export const paddleBillingInvitationsPolicy = + definePolicy({ + id: 'paddle-billing', + stages: ['preliminary', 'submission'], + evaluate: async ({ subscription }) => { + // combine with subscriptionRequiredPolicy if subscription must be required + if (!subscription) { + return allow(); + } + + // Paddle specific constraint: cannot update subscription items during trial + if ( + subscription.provider === 'paddle' && + subscription.status === 'trialing' + ) { + const hasPerSeatItems = subscription.items.some( + (item) => item.type === 'per_seat', + ); + + if (hasPerSeatItems) { + return deny({ + code: 'PADDLE_TRIAL_RESTRICTION', + message: 'teams:policyErrors.paddleTrialRestriction', + remediation: 'teams:policyRemediation.paddleTrialRestriction', + }); + } + } + + return allow(); + }, + }); + +// register policies below to apply them +// +// diff --git a/packages/features/team-accounts/src/server/services/account-invitations.service.ts b/packages/features/team-accounts/src/server/services/account-invitations.service.ts index deb1fec67..8501a6ed3 100644 --- a/packages/features/team-accounts/src/server/services/account-invitations.service.ts +++ b/packages/features/team-accounts/src/server/services/account-invitations.service.ts @@ -12,6 +12,10 @@ import type { DeleteInvitationSchema } from '../../schema/delete-invitation.sche import type { InviteMembersSchema } from '../../schema/invite-members.schema'; import type { UpdateInvitationSchema } from '../../schema/update-invitation.schema'; +/** + * + * Create an account invitations service. + */ export function createAccountInvitationsService( client: SupabaseClient, ) { diff --git a/packages/features/team-accounts/src/server/services/account-per-seat-billing.service.ts b/packages/features/team-accounts/src/server/services/account-per-seat-billing.service.ts index 08f9eb053..fce672922 100644 --- a/packages/features/team-accounts/src/server/services/account-per-seat-billing.service.ts +++ b/packages/features/team-accounts/src/server/services/account-per-seat-billing.service.ts @@ -44,7 +44,8 @@ class AccountPerSeatBillingService { subscription_items !inner ( quantity, id, - type + type, + variant_id ) `, ) diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 373e2ec7e..8cbacc616 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -24,7 +24,7 @@ "next": "15.5.4", "react": "19.1.1", "react-dom": "19.1.1", - "react-i18next": "^15.7.3" + "react-i18next": "^16.0.0" }, "dependencies": { "i18next": "25.5.2", diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index 8a39b886c..053b4d1b8 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@modelcontextprotocol/sdk": "1.18.1", + "@modelcontextprotocol/sdk": "1.18.2", "@types/node": "^24.5.2", "postgres": "3.4.7", "zod": "^3.25.74" diff --git a/packages/monitoring/api/package.json b/packages/monitoring/api/package.json index 0ffb85737..a0d8d4532 100644 --- a/packages/monitoring/api/package.json +++ b/packages/monitoring/api/package.json @@ -23,7 +23,7 @@ "@kit/sentry": "workspace:*", "@kit/shared": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "react": "19.1.1", "zod": "^3.25.74" }, diff --git a/packages/monitoring/core/package.json b/packages/monitoring/core/package.json index 0dcb00ffd..49cbdcabb 100644 --- a/packages/monitoring/core/package.json +++ b/packages/monitoring/core/package.json @@ -17,7 +17,7 @@ "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "react": "19.1.1" }, "typesVersions": { diff --git a/packages/monitoring/sentry/package.json b/packages/monitoring/sentry/package.json index 796505135..f2232c875 100644 --- a/packages/monitoring/sentry/package.json +++ b/packages/monitoring/sentry/package.json @@ -16,15 +16,15 @@ "./config/server": "./src/sentry.client.server.ts" }, "dependencies": { - "@sentry/nextjs": "^10.14.0", - "import-in-the-middle": "1.14.2" + "@sentry/nextjs": "^10.15.0", + "import-in-the-middle": "1.14.4" }, "devDependencies": { "@kit/eslint-config": "workspace:*", "@kit/monitoring-core": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "react": "19.1.1" }, "typesVersions": { diff --git a/packages/next/package.json b/packages/next/package.json index 41b2aed24..b018524a4 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -20,7 +20,7 @@ "@kit/prettier-config": "workspace:*", "@kit/supabase": "workspace:*", "@kit/tsconfig": "workspace:*", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "next": "15.5.4", "zod": "^3.25.74" }, diff --git a/packages/otp/package.json b/packages/otp/package.json index 679c12f2d..3d745a55d 100644 --- a/packages/otp/package.json +++ b/packages/otp/package.json @@ -25,8 +25,8 @@ "@kit/tsconfig": "workspace:*", "@kit/ui": "workspace:*", "@radix-ui/react-icons": "^1.3.2", - "@supabase/supabase-js": "2.57.4", - "@types/react": "19.1.13", + "@supabase/supabase-js": "2.58.0", + "@types/react": "19.1.15", "@types/react-dom": "19.1.9", "react": "19.1.1", "react-dom": "19.1.1", diff --git a/packages/policies/AGENTS.md b/packages/policies/AGENTS.md new file mode 100644 index 000000000..2fe61838c --- /dev/null +++ b/packages/policies/AGENTS.md @@ -0,0 +1,684 @@ +# FeaturePolicy API - Registry-Based Policy System + +A unified, registry-based foundation for implementing business rules across all Makerkit features. + +## Overview + +The FeaturePolicy API provides: + +- **Registry-based architecture** - centralized policy management with IDs +- **Configuration support** - policies can accept typed configuration objects +- **Stage-aware evaluation** - policies can be filtered by execution stage +- **Immutable contexts** for safe policy evaluation +- **Customer extensibility** - easy to add custom policies without forking + +## Quick Start + +### 1. Register Policies + +```typescript +import { z } from 'zod'; + +import { allow, createPolicyRegistry, definePolicy, deny } from '@kit/policies'; + +const registry = createPolicyRegistry(); + +// Register a basic policy +registry.registerPolicy( + definePolicy({ + id: 'email-validation', + stages: ['preliminary', 'submission'], + evaluate: async (context) => { + if (!context.userEmail?.includes('@')) { + return deny({ + code: 'INVALID_EMAIL_FORMAT', + message: 'Invalid email format', + remediation: 'Please provide a valid email address', + }); + } + return allow(); + }, + }), +); + +// Register a configurable policy +registry.registerPolicy( + definePolicy({ + id: 'max-invitations', + configSchema: z.object({ + maxInvitations: z.number().positive(), + }), + evaluate: async (context, config = { maxInvitations: 5 }) => { + if (context.invitations.length > config.maxInvitations) { + return deny({ + code: 'MAX_INVITATIONS_EXCEEDED', + message: `Cannot invite more than ${config.maxInvitations} members`, + remediation: `Reduce invitations to ${config.maxInvitations} or fewer`, + }); + } + return allow(); + }, + }), +); +``` + +### 2. Use Policies from Registry + +```typescript +import { + createPoliciesFromRegistry, + createPolicyEvaluator, + createPolicyRegistry, +} from '@kit/policies'; + +const registry = createPolicyRegistry(); + +// Load policies from registry +const policies = await createPoliciesFromRegistry(registry, [ + 'email-validation', + 'subscription-required', + ['max-invitations', { maxInvitations: 5 }], // with configuration +]); + +const evaluator = createPolicyEvaluator(); +const result = await evaluator.evaluatePolicies(policies, context, 'ALL'); + +if (!result.allowed) { + console.log('Failed reasons:', result.reasons); +} +``` + +### 3. Group Policies with Complex Logic + +```typescript +// Basic group example +const preliminaryGroup = { + operator: 'ALL' as const, + policies: [emailValidationPolicy, authenticationPolicy], +}; + +const billingGroup = { + operator: 'ANY' as const, + policies: [subscriptionPolicy, trialPolicy], +}; + +// Evaluate groups in sequence +const result = await evaluator.evaluateGroups( + [preliminaryGroup, billingGroup], + context, +); +``` + +## Complex Group Flows + +### Real-World Multi-Stage Team Invitation Flow + +```typescript +import { createPolicy, createPolicyEvaluator } from '@kit/policies'; + +// Complex business logic: (Authentication AND Email Validation) AND (Subscription OR Trial) AND Billing Limits +async function validateTeamInvitation(context: InvitationContext) { + const evaluator = createPolicyEvaluator(); + + // Stage 1: Authentication Requirements (ALL must pass) + const authenticationGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.userId + ? allow({ step: 'authenticated' }) + : deny('Authentication required'), + ), + createPolicy(async (ctx) => + ctx.email.includes('@') + ? allow({ step: 'email-valid' }) + : deny('Valid email required'), + ), + createPolicy(async (ctx) => + ctx.permissions.includes('invite') + ? allow({ step: 'permissions' }) + : deny('Insufficient permissions'), + ), + ], + }; + + // Stage 2: Subscription Validation (ANY sufficient - flexible billing) + const subscriptionGroup = { + operator: 'ANY' as const, + policies: [ + createPolicy(async (ctx) => + ctx.subscription?.active && ctx.subscription.plan === 'enterprise' + ? allow({ billing: 'enterprise' }) + : deny('Enterprise subscription required'), + ), + createPolicy(async (ctx) => + ctx.subscription?.active && ctx.subscription.plan === 'pro' + ? allow({ billing: 'pro' }) + : deny('Pro subscription required'), + ), + createPolicy(async (ctx) => + ctx.trial?.active && ctx.trial.daysRemaining > 0 + ? allow({ billing: 'trial', daysLeft: ctx.trial.daysRemaining }) + : deny('Active trial required'), + ), + ], + }; + + // Stage 3: Final Constraints (ALL must pass) + const constraintsGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.team.memberCount < ctx.subscription?.maxMembers + ? allow({ constraint: 'member-limit' }) + : deny('Member limit exceeded'), + ), + createPolicy(async (ctx) => + ctx.invitations.length <= 10 + ? allow({ constraint: 'batch-size' }) + : deny('Cannot invite more than 10 members at once'), + ), + ], + }; + + // Execute all groups sequentially - ALL groups must pass + const result = await evaluator.evaluateGroups( + [authenticationGroup, subscriptionGroup, constraintsGroup], + context, + ); + + return { + allowed: result.allowed, + reasons: result.reasons, + metadata: { + stagesCompleted: result.results.length, + authenticationPassed: result.results.some( + (r) => r.metadata?.step === 'authenticated', + ), + billingType: result.results.find((r) => r.metadata?.billing)?.metadata + ?.billing, + constraintsChecked: result.results.some((r) => r.metadata?.constraint), + }, + }; +} +``` + +### Middleware-Style Policy Chain + +```typescript +// Simulate middleware pattern: Auth → Rate Limiting → Business Logic +async function processApiRequest(context: ApiContext) { + const evaluator = createPoliciesEvaluator(); + + // Layer 1: Security (ALL required) + const securityLayer = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.apiKey && ctx.apiKey.length > 0 + ? allow({ security: 'api-key-valid' }) + : deny('API key required'), + ), + createPolicy(async (ctx) => + ctx.rateLimitRemaining > 0 + ? allow({ security: 'rate-limit-ok' }) + : deny('Rate limit exceeded'), + ), + createPolicy(async (ctx) => + !ctx.blacklisted + ? allow({ security: 'not-blacklisted' }) + : deny('Client is blacklisted'), + ), + ], + }; + + // Layer 2: Authorization (ANY sufficient - flexible access levels) + const authorizationLayer = { + operator: 'ANY' as const, + policies: [ + createPolicy(async (ctx) => + ctx.user.role === 'admin' + ? allow({ access: 'admin' }) + : deny('Admin access denied'), + ), + createPolicy(async (ctx) => + ctx.user.permissions.includes(ctx.requestedResource) + ? allow({ access: 'resource-specific' }) + : deny('Resource access denied'), + ), + createPolicy(async (ctx) => + ctx.user.subscription?.includes('api-access') + ? allow({ access: 'subscription-based' }) + : deny('Subscription access denied'), + ), + ], + }; + + // Layer 3: Business Rules (ALL required) + const businessLayer = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.request.size <= ctx.maxRequestSize + ? allow({ business: 'size-valid' }) + : deny('Request too large'), + ), + createPolicy(async (ctx) => + ctx.user.dailyQuota > ctx.user.dailyUsage + ? allow({ business: 'quota-available' }) + : deny('Daily quota exceeded'), + ), + ], + }; + + return evaluator.evaluateGroups( + [securityLayer, authorizationLayer, businessLayer], + context, + ); +} +``` + +### Complex Nested Logic with Short-Circuiting + +```typescript +// Complex scenario: (Premium User OR (Basic User AND Low Usage)) AND Security Checks +async function validateFeatureAccess(context: FeatureContext) { + const evaluator = createPoliciesEvaluator(); + + // Group 1: User Tier Logic - demonstrates complex OR conditions + const userTierGroup = { + operator: 'ANY' as const, + policies: [ + // Premium users get immediate access + createPolicy(async (ctx) => + ctx.user.plan === 'premium' + ? allow({ tier: 'premium', reason: 'premium-user' }) + : deny('Not premium user'), + ), + // Enterprise users get immediate access + createPolicy(async (ctx) => + ctx.user.plan === 'enterprise' + ? allow({ tier: 'enterprise', reason: 'enterprise-user' }) + : deny('Not enterprise user'), + ), + // Basic users need additional validation (sub-group logic) + createPolicy(async (ctx) => { + if (ctx.user.plan !== 'basic') { + return deny('Not basic user'); + } + + // Simulate nested AND logic for basic users + const basicUserRequirements = [ + ctx.user.monthlyUsage < 1000, + ctx.user.accountAge > 30, // days + !ctx.user.hasViolations, + ]; + + const allBasicRequirementsMet = basicUserRequirements.every( + (req) => req, + ); + + return allBasicRequirementsMet + ? allow({ tier: 'basic', reason: 'low-usage-basic-user' }) + : deny('Basic user requirements not met'); + }), + ], + }; + + // Group 2: Security Requirements (ALL must pass) + const securityGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.user.emailVerified + ? allow({ security: 'email-verified' }) + : deny('Email verification required'), + ), + createPolicy(async (ctx) => + ctx.user.twoFactorEnabled || ctx.user.plan === 'basic' + ? allow({ security: '2fa-compliant' }) + : deny('Two-factor authentication required for premium plans'), + ), + createPolicy(async (ctx) => + !ctx.user.suspiciousActivity + ? allow({ security: 'activity-clean' }) + : deny('Suspicious activity detected'), + ), + ], + }; + + return evaluator.evaluateGroups([userTierGroup, securityGroup], context); +} +``` + +### Dynamic Policy Composition + +```typescript +// Dynamically compose policies based on context +async function createContextAwarePolicyFlow(context: DynamicContext) { + const evaluator = createPoliciesEvaluator(); + const groups = []; + + // Always include base security + const baseSecurityGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.isAuthenticated ? allow() : deny('Authentication required'), + ), + ], + }; + groups.push(baseSecurityGroup); + + // Add user-type specific policies + if (context.user.type === 'admin') { + const adminGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.user.adminLevel >= ctx.requiredAdminLevel + ? allow({ admin: 'level-sufficient' }) + : deny('Insufficient admin level'), + ), + createPolicy(async (ctx) => + ctx.user.lastLogin > Date.now() - 24 * 60 * 60 * 1000 // 24 hours + ? allow({ admin: 'recent-login' }) + : deny('Admin must have logged in within 24 hours'), + ), + ], + }; + groups.push(adminGroup); + } + + // Add feature-specific policies based on requested feature + if (context.feature.requiresBilling) { + const billingGroup = { + operator: 'ANY' as const, + policies: [ + createPolicy(async (ctx) => + ctx.subscription?.active + ? allow({ billing: 'subscription' }) + : deny('Active subscription required'), + ), + createPolicy(async (ctx) => + ctx.credits && ctx.credits > ctx.feature.creditCost + ? allow({ billing: 'credits' }) + : deny('Insufficient credits'), + ), + ], + }; + groups.push(billingGroup); + } + + // Add rate limiting for high-impact features + if (context.feature.highImpact) { + const rateLimitGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.rateLimit.remaining > 0 + ? allow({ rateLimit: 'within-limits' }) + : deny('Rate limit exceeded for high-impact features'), + ), + ], + }; + groups.push(rateLimitGroup); + } + + return evaluator.evaluateGroups(groups, context); +} +``` + +### Performance-Optimized Large Group Evaluation + +```typescript +// Handle large numbers of policies efficiently +async function validateComplexBusinessRules(context: BusinessContext) { + const evaluator = createPoliciesEvaluator({ maxCacheSize: 200 }); + + // Group policies by evaluation cost and criticality + const criticalFastGroup = { + operator: 'ALL' as const, + policies: [ + // Fast critical checks first + createPolicy(async (ctx) => + ctx.isActive ? allow() : deny('Account inactive'), + ), + createPolicy(async (ctx) => + ctx.hasPermission ? allow() : deny('No permission'), + ), + createPolicy(async (ctx) => + !ctx.isBlocked ? allow() : deny('Account blocked'), + ), + ], + }; + + const businessLogicGroup = { + operator: 'ANY' as const, + policies: [ + // Complex business rules + createPolicy(async (ctx) => { + // Simulate complex calculation + const score = await calculateRiskScore(ctx); + return score < 0.8 + ? allow({ risk: 'low' }) + : deny('High risk detected'); + }), + createPolicy(async (ctx) => { + // Simulate external API call + const verification = await verifyWithThirdParty(ctx); + return verification.success + ? allow({ external: 'verified' }) + : deny('External verification failed'); + }), + ], + }; + + const finalValidationGroup = { + operator: 'ALL' as const, + policies: [ + // Final checks after complex logic + createPolicy(async (ctx) => + ctx.complianceCheck ? allow() : deny('Compliance check failed'), + ), + ], + }; + + // Use staged evaluation for better performance + const startTime = Date.now(); + + const result = await evaluator.evaluateGroups( + [ + criticalFastGroup, // Fast critical checks first + businessLogicGroup, // Complex logic only if critical checks pass + finalValidationGroup, // Final validation + ], + context, + ); + + const evaluationTime = Date.now() - startTime; + + return { + ...result, + performance: { + evaluationTimeMs: evaluationTime, + groupsEvaluated: result.results.length > 0 ? 3 : 1, + }, + }; +} + +// Helper functions for complex examples +async function calculateRiskScore(context: any): Promise { + // Simulate complex risk calculation + await new Promise((resolve) => setTimeout(resolve, 10)); + return Math.random(); +} + +async function verifyWithThirdParty( + context: any, +): Promise<{ success: boolean }> { + // Simulate external API call + await new Promise((resolve) => setTimeout(resolve, 5)); + return { success: Math.random() > 0.2 }; +} +``` + +## Advanced Usage + +### Configurable Policies + +```typescript +// Create policy factories for configuration +const createMaxInvitationsPolicy = (maxInvitations: number) => + createPolicy(async (context) => { + if (context.invitations.length > maxInvitations) { + return deny({ + code: 'MAX_INVITATIONS_EXCEEDED', + message: `Cannot invite more than ${maxInvitations} members`, + remediation: `Reduce invitations to ${maxInvitations} or fewer`, + }); + } + return allow(); + }); + +// Use with different configurations +const strictPolicy = createMaxInvitationsPolicy(1); +const standardPolicy = createMaxInvitationsPolicy(5); +const permissivePolicy = createMaxInvitationsPolicy(25); +``` + +### Feature-Specific evaluators + +```typescript +// Create feature-specific evaluator with preset configurations +export function createInvitationevaluator( + preset: 'strict' | 'standard' | 'permissive', +) { + const configs = { + strict: { maxInvitationsPerBatch: 1 }, + standard: { maxInvitationsPerBatch: 5 }, + permissive: { maxInvitationsPerBatch: 25 }, + }; + + const config = configs[preset]; + + return { + async validateInvitations(context: InvitationContext) { + const policies = [ + emailValidationPolicy, + createMaxInvitationsPolicy(config.maxInvitationsPerBatch), + subscriptionRequiredPolicy, + paddleBillingPolicy, + ]; + + const evaluator = createPoliciesEvaluator(); + return evaluator.evaluatePolicies(policies, context, 'ALL'); + }, + }; +} + +// Usage +const evaluator = createInvitationevaluator('standard'); +const result = await evaluator.validateInvitations(context); +``` + +### Error Handling + +```typescript +const result = await evaluator.evaluate(); + +if (!result.allowed) { + result.reasons.forEach((reason) => { + console.log(`Policy ${reason.policyId} failed:`); + console.log(` Code: ${reason.code}`); + console.log(` Message: ${reason.message}`); + if (reason.remediation) { + console.log(` Fix: ${reason.remediation}`); + } + }); +} +``` + +### 1. Register Complex Policy with Configuration + +```typescript +import { createPolicyRegistry, definePolicy } from '@kit/policies'; + +const registry = createPolicyRegistry(); + +const customConfigurablePolicy = definePolicy({ + id: 'custom-domain-check', + configSchema: z.object({ + allowedDomains: z.array(z.string()), + strictMode: z.boolean(), + }), + evaluate: async (context, config) => { + const emailDomain = context.userEmail?.split('@')[1]; + + if (config?.strictMode && !config.allowedDomains.includes(emailDomain)) { + return deny({ + code: 'DOMAIN_NOT_ALLOWED', + message: `Email domain ${emailDomain} is not in the allowed list`, + remediation: 'Use an email from an approved domain', + }); + } + + return allow(); + }, +}); + +registry.registerPolicy(customConfigurablePolicy); +``` + +## Key Concepts + +### Group Operators + +- **`ALL` (AND logic)**: All policies in the group must pass + - **Short-circuits on first failure** for performance + - Use for mandatory requirements where every condition must be met + - Example: Authentication AND permissions AND rate limiting + +- **`ANY` (OR logic)**: At least one policy in the group must pass + - **Short-circuits on first success** for performance + - Use for flexible requirements where multiple options are acceptable + - Example: Premium subscription OR trial access OR admin override + +### Group Evaluation Flow + +1. **Sequential Group Processing**: Groups are evaluated in order +2. **All Groups Must Pass**: If any group fails, entire evaluation fails +3. **Short-Circuiting**: Stops on first group failure for performance +4. **Metadata Preservation**: All policy results and metadata are collected + +### Performance Considerations + +- **Order groups by criticality**: Put fast, critical checks first +- **Use caching**: Configure `maxCacheSize` for frequently used policies +- **Group by evaluation cost**: Separate expensive operations +- **Monitor evaluation time**: Track performance for optimization + +## Stage-Aware Evaluation + +Policies can be filtered by execution stage. This is useful for running a subset of policies depending on the situation: + +```typescript +// Only run preliminary checks +const prelimResult = await evaluator.evaluate( + registry, + context, + 'ALL', + 'preliminary', +); + +// Run submission validation +const submitResult = await evaluator.evaluate( + registry, + context, + 'ALL', + 'submission', +); + +// Run all applicable policies +const fullResult = await evaluator.evaluate(registry, context, 'ALL'); +``` diff --git a/packages/policies/CLAUDE.md b/packages/policies/CLAUDE.md new file mode 100644 index 000000000..2fe61838c --- /dev/null +++ b/packages/policies/CLAUDE.md @@ -0,0 +1,684 @@ +# FeaturePolicy API - Registry-Based Policy System + +A unified, registry-based foundation for implementing business rules across all Makerkit features. + +## Overview + +The FeaturePolicy API provides: + +- **Registry-based architecture** - centralized policy management with IDs +- **Configuration support** - policies can accept typed configuration objects +- **Stage-aware evaluation** - policies can be filtered by execution stage +- **Immutable contexts** for safe policy evaluation +- **Customer extensibility** - easy to add custom policies without forking + +## Quick Start + +### 1. Register Policies + +```typescript +import { z } from 'zod'; + +import { allow, createPolicyRegistry, definePolicy, deny } from '@kit/policies'; + +const registry = createPolicyRegistry(); + +// Register a basic policy +registry.registerPolicy( + definePolicy({ + id: 'email-validation', + stages: ['preliminary', 'submission'], + evaluate: async (context) => { + if (!context.userEmail?.includes('@')) { + return deny({ + code: 'INVALID_EMAIL_FORMAT', + message: 'Invalid email format', + remediation: 'Please provide a valid email address', + }); + } + return allow(); + }, + }), +); + +// Register a configurable policy +registry.registerPolicy( + definePolicy({ + id: 'max-invitations', + configSchema: z.object({ + maxInvitations: z.number().positive(), + }), + evaluate: async (context, config = { maxInvitations: 5 }) => { + if (context.invitations.length > config.maxInvitations) { + return deny({ + code: 'MAX_INVITATIONS_EXCEEDED', + message: `Cannot invite more than ${config.maxInvitations} members`, + remediation: `Reduce invitations to ${config.maxInvitations} or fewer`, + }); + } + return allow(); + }, + }), +); +``` + +### 2. Use Policies from Registry + +```typescript +import { + createPoliciesFromRegistry, + createPolicyEvaluator, + createPolicyRegistry, +} from '@kit/policies'; + +const registry = createPolicyRegistry(); + +// Load policies from registry +const policies = await createPoliciesFromRegistry(registry, [ + 'email-validation', + 'subscription-required', + ['max-invitations', { maxInvitations: 5 }], // with configuration +]); + +const evaluator = createPolicyEvaluator(); +const result = await evaluator.evaluatePolicies(policies, context, 'ALL'); + +if (!result.allowed) { + console.log('Failed reasons:', result.reasons); +} +``` + +### 3. Group Policies with Complex Logic + +```typescript +// Basic group example +const preliminaryGroup = { + operator: 'ALL' as const, + policies: [emailValidationPolicy, authenticationPolicy], +}; + +const billingGroup = { + operator: 'ANY' as const, + policies: [subscriptionPolicy, trialPolicy], +}; + +// Evaluate groups in sequence +const result = await evaluator.evaluateGroups( + [preliminaryGroup, billingGroup], + context, +); +``` + +## Complex Group Flows + +### Real-World Multi-Stage Team Invitation Flow + +```typescript +import { createPolicy, createPolicyEvaluator } from '@kit/policies'; + +// Complex business logic: (Authentication AND Email Validation) AND (Subscription OR Trial) AND Billing Limits +async function validateTeamInvitation(context: InvitationContext) { + const evaluator = createPolicyEvaluator(); + + // Stage 1: Authentication Requirements (ALL must pass) + const authenticationGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.userId + ? allow({ step: 'authenticated' }) + : deny('Authentication required'), + ), + createPolicy(async (ctx) => + ctx.email.includes('@') + ? allow({ step: 'email-valid' }) + : deny('Valid email required'), + ), + createPolicy(async (ctx) => + ctx.permissions.includes('invite') + ? allow({ step: 'permissions' }) + : deny('Insufficient permissions'), + ), + ], + }; + + // Stage 2: Subscription Validation (ANY sufficient - flexible billing) + const subscriptionGroup = { + operator: 'ANY' as const, + policies: [ + createPolicy(async (ctx) => + ctx.subscription?.active && ctx.subscription.plan === 'enterprise' + ? allow({ billing: 'enterprise' }) + : deny('Enterprise subscription required'), + ), + createPolicy(async (ctx) => + ctx.subscription?.active && ctx.subscription.plan === 'pro' + ? allow({ billing: 'pro' }) + : deny('Pro subscription required'), + ), + createPolicy(async (ctx) => + ctx.trial?.active && ctx.trial.daysRemaining > 0 + ? allow({ billing: 'trial', daysLeft: ctx.trial.daysRemaining }) + : deny('Active trial required'), + ), + ], + }; + + // Stage 3: Final Constraints (ALL must pass) + const constraintsGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.team.memberCount < ctx.subscription?.maxMembers + ? allow({ constraint: 'member-limit' }) + : deny('Member limit exceeded'), + ), + createPolicy(async (ctx) => + ctx.invitations.length <= 10 + ? allow({ constraint: 'batch-size' }) + : deny('Cannot invite more than 10 members at once'), + ), + ], + }; + + // Execute all groups sequentially - ALL groups must pass + const result = await evaluator.evaluateGroups( + [authenticationGroup, subscriptionGroup, constraintsGroup], + context, + ); + + return { + allowed: result.allowed, + reasons: result.reasons, + metadata: { + stagesCompleted: result.results.length, + authenticationPassed: result.results.some( + (r) => r.metadata?.step === 'authenticated', + ), + billingType: result.results.find((r) => r.metadata?.billing)?.metadata + ?.billing, + constraintsChecked: result.results.some((r) => r.metadata?.constraint), + }, + }; +} +``` + +### Middleware-Style Policy Chain + +```typescript +// Simulate middleware pattern: Auth → Rate Limiting → Business Logic +async function processApiRequest(context: ApiContext) { + const evaluator = createPoliciesEvaluator(); + + // Layer 1: Security (ALL required) + const securityLayer = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.apiKey && ctx.apiKey.length > 0 + ? allow({ security: 'api-key-valid' }) + : deny('API key required'), + ), + createPolicy(async (ctx) => + ctx.rateLimitRemaining > 0 + ? allow({ security: 'rate-limit-ok' }) + : deny('Rate limit exceeded'), + ), + createPolicy(async (ctx) => + !ctx.blacklisted + ? allow({ security: 'not-blacklisted' }) + : deny('Client is blacklisted'), + ), + ], + }; + + // Layer 2: Authorization (ANY sufficient - flexible access levels) + const authorizationLayer = { + operator: 'ANY' as const, + policies: [ + createPolicy(async (ctx) => + ctx.user.role === 'admin' + ? allow({ access: 'admin' }) + : deny('Admin access denied'), + ), + createPolicy(async (ctx) => + ctx.user.permissions.includes(ctx.requestedResource) + ? allow({ access: 'resource-specific' }) + : deny('Resource access denied'), + ), + createPolicy(async (ctx) => + ctx.user.subscription?.includes('api-access') + ? allow({ access: 'subscription-based' }) + : deny('Subscription access denied'), + ), + ], + }; + + // Layer 3: Business Rules (ALL required) + const businessLayer = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.request.size <= ctx.maxRequestSize + ? allow({ business: 'size-valid' }) + : deny('Request too large'), + ), + createPolicy(async (ctx) => + ctx.user.dailyQuota > ctx.user.dailyUsage + ? allow({ business: 'quota-available' }) + : deny('Daily quota exceeded'), + ), + ], + }; + + return evaluator.evaluateGroups( + [securityLayer, authorizationLayer, businessLayer], + context, + ); +} +``` + +### Complex Nested Logic with Short-Circuiting + +```typescript +// Complex scenario: (Premium User OR (Basic User AND Low Usage)) AND Security Checks +async function validateFeatureAccess(context: FeatureContext) { + const evaluator = createPoliciesEvaluator(); + + // Group 1: User Tier Logic - demonstrates complex OR conditions + const userTierGroup = { + operator: 'ANY' as const, + policies: [ + // Premium users get immediate access + createPolicy(async (ctx) => + ctx.user.plan === 'premium' + ? allow({ tier: 'premium', reason: 'premium-user' }) + : deny('Not premium user'), + ), + // Enterprise users get immediate access + createPolicy(async (ctx) => + ctx.user.plan === 'enterprise' + ? allow({ tier: 'enterprise', reason: 'enterprise-user' }) + : deny('Not enterprise user'), + ), + // Basic users need additional validation (sub-group logic) + createPolicy(async (ctx) => { + if (ctx.user.plan !== 'basic') { + return deny('Not basic user'); + } + + // Simulate nested AND logic for basic users + const basicUserRequirements = [ + ctx.user.monthlyUsage < 1000, + ctx.user.accountAge > 30, // days + !ctx.user.hasViolations, + ]; + + const allBasicRequirementsMet = basicUserRequirements.every( + (req) => req, + ); + + return allBasicRequirementsMet + ? allow({ tier: 'basic', reason: 'low-usage-basic-user' }) + : deny('Basic user requirements not met'); + }), + ], + }; + + // Group 2: Security Requirements (ALL must pass) + const securityGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.user.emailVerified + ? allow({ security: 'email-verified' }) + : deny('Email verification required'), + ), + createPolicy(async (ctx) => + ctx.user.twoFactorEnabled || ctx.user.plan === 'basic' + ? allow({ security: '2fa-compliant' }) + : deny('Two-factor authentication required for premium plans'), + ), + createPolicy(async (ctx) => + !ctx.user.suspiciousActivity + ? allow({ security: 'activity-clean' }) + : deny('Suspicious activity detected'), + ), + ], + }; + + return evaluator.evaluateGroups([userTierGroup, securityGroup], context); +} +``` + +### Dynamic Policy Composition + +```typescript +// Dynamically compose policies based on context +async function createContextAwarePolicyFlow(context: DynamicContext) { + const evaluator = createPoliciesEvaluator(); + const groups = []; + + // Always include base security + const baseSecurityGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.isAuthenticated ? allow() : deny('Authentication required'), + ), + ], + }; + groups.push(baseSecurityGroup); + + // Add user-type specific policies + if (context.user.type === 'admin') { + const adminGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.user.adminLevel >= ctx.requiredAdminLevel + ? allow({ admin: 'level-sufficient' }) + : deny('Insufficient admin level'), + ), + createPolicy(async (ctx) => + ctx.user.lastLogin > Date.now() - 24 * 60 * 60 * 1000 // 24 hours + ? allow({ admin: 'recent-login' }) + : deny('Admin must have logged in within 24 hours'), + ), + ], + }; + groups.push(adminGroup); + } + + // Add feature-specific policies based on requested feature + if (context.feature.requiresBilling) { + const billingGroup = { + operator: 'ANY' as const, + policies: [ + createPolicy(async (ctx) => + ctx.subscription?.active + ? allow({ billing: 'subscription' }) + : deny('Active subscription required'), + ), + createPolicy(async (ctx) => + ctx.credits && ctx.credits > ctx.feature.creditCost + ? allow({ billing: 'credits' }) + : deny('Insufficient credits'), + ), + ], + }; + groups.push(billingGroup); + } + + // Add rate limiting for high-impact features + if (context.feature.highImpact) { + const rateLimitGroup = { + operator: 'ALL' as const, + policies: [ + createPolicy(async (ctx) => + ctx.rateLimit.remaining > 0 + ? allow({ rateLimit: 'within-limits' }) + : deny('Rate limit exceeded for high-impact features'), + ), + ], + }; + groups.push(rateLimitGroup); + } + + return evaluator.evaluateGroups(groups, context); +} +``` + +### Performance-Optimized Large Group Evaluation + +```typescript +// Handle large numbers of policies efficiently +async function validateComplexBusinessRules(context: BusinessContext) { + const evaluator = createPoliciesEvaluator({ maxCacheSize: 200 }); + + // Group policies by evaluation cost and criticality + const criticalFastGroup = { + operator: 'ALL' as const, + policies: [ + // Fast critical checks first + createPolicy(async (ctx) => + ctx.isActive ? allow() : deny('Account inactive'), + ), + createPolicy(async (ctx) => + ctx.hasPermission ? allow() : deny('No permission'), + ), + createPolicy(async (ctx) => + !ctx.isBlocked ? allow() : deny('Account blocked'), + ), + ], + }; + + const businessLogicGroup = { + operator: 'ANY' as const, + policies: [ + // Complex business rules + createPolicy(async (ctx) => { + // Simulate complex calculation + const score = await calculateRiskScore(ctx); + return score < 0.8 + ? allow({ risk: 'low' }) + : deny('High risk detected'); + }), + createPolicy(async (ctx) => { + // Simulate external API call + const verification = await verifyWithThirdParty(ctx); + return verification.success + ? allow({ external: 'verified' }) + : deny('External verification failed'); + }), + ], + }; + + const finalValidationGroup = { + operator: 'ALL' as const, + policies: [ + // Final checks after complex logic + createPolicy(async (ctx) => + ctx.complianceCheck ? allow() : deny('Compliance check failed'), + ), + ], + }; + + // Use staged evaluation for better performance + const startTime = Date.now(); + + const result = await evaluator.evaluateGroups( + [ + criticalFastGroup, // Fast critical checks first + businessLogicGroup, // Complex logic only if critical checks pass + finalValidationGroup, // Final validation + ], + context, + ); + + const evaluationTime = Date.now() - startTime; + + return { + ...result, + performance: { + evaluationTimeMs: evaluationTime, + groupsEvaluated: result.results.length > 0 ? 3 : 1, + }, + }; +} + +// Helper functions for complex examples +async function calculateRiskScore(context: any): Promise { + // Simulate complex risk calculation + await new Promise((resolve) => setTimeout(resolve, 10)); + return Math.random(); +} + +async function verifyWithThirdParty( + context: any, +): Promise<{ success: boolean }> { + // Simulate external API call + await new Promise((resolve) => setTimeout(resolve, 5)); + return { success: Math.random() > 0.2 }; +} +``` + +## Advanced Usage + +### Configurable Policies + +```typescript +// Create policy factories for configuration +const createMaxInvitationsPolicy = (maxInvitations: number) => + createPolicy(async (context) => { + if (context.invitations.length > maxInvitations) { + return deny({ + code: 'MAX_INVITATIONS_EXCEEDED', + message: `Cannot invite more than ${maxInvitations} members`, + remediation: `Reduce invitations to ${maxInvitations} or fewer`, + }); + } + return allow(); + }); + +// Use with different configurations +const strictPolicy = createMaxInvitationsPolicy(1); +const standardPolicy = createMaxInvitationsPolicy(5); +const permissivePolicy = createMaxInvitationsPolicy(25); +``` + +### Feature-Specific evaluators + +```typescript +// Create feature-specific evaluator with preset configurations +export function createInvitationevaluator( + preset: 'strict' | 'standard' | 'permissive', +) { + const configs = { + strict: { maxInvitationsPerBatch: 1 }, + standard: { maxInvitationsPerBatch: 5 }, + permissive: { maxInvitationsPerBatch: 25 }, + }; + + const config = configs[preset]; + + return { + async validateInvitations(context: InvitationContext) { + const policies = [ + emailValidationPolicy, + createMaxInvitationsPolicy(config.maxInvitationsPerBatch), + subscriptionRequiredPolicy, + paddleBillingPolicy, + ]; + + const evaluator = createPoliciesEvaluator(); + return evaluator.evaluatePolicies(policies, context, 'ALL'); + }, + }; +} + +// Usage +const evaluator = createInvitationevaluator('standard'); +const result = await evaluator.validateInvitations(context); +``` + +### Error Handling + +```typescript +const result = await evaluator.evaluate(); + +if (!result.allowed) { + result.reasons.forEach((reason) => { + console.log(`Policy ${reason.policyId} failed:`); + console.log(` Code: ${reason.code}`); + console.log(` Message: ${reason.message}`); + if (reason.remediation) { + console.log(` Fix: ${reason.remediation}`); + } + }); +} +``` + +### 1. Register Complex Policy with Configuration + +```typescript +import { createPolicyRegistry, definePolicy } from '@kit/policies'; + +const registry = createPolicyRegistry(); + +const customConfigurablePolicy = definePolicy({ + id: 'custom-domain-check', + configSchema: z.object({ + allowedDomains: z.array(z.string()), + strictMode: z.boolean(), + }), + evaluate: async (context, config) => { + const emailDomain = context.userEmail?.split('@')[1]; + + if (config?.strictMode && !config.allowedDomains.includes(emailDomain)) { + return deny({ + code: 'DOMAIN_NOT_ALLOWED', + message: `Email domain ${emailDomain} is not in the allowed list`, + remediation: 'Use an email from an approved domain', + }); + } + + return allow(); + }, +}); + +registry.registerPolicy(customConfigurablePolicy); +``` + +## Key Concepts + +### Group Operators + +- **`ALL` (AND logic)**: All policies in the group must pass + - **Short-circuits on first failure** for performance + - Use for mandatory requirements where every condition must be met + - Example: Authentication AND permissions AND rate limiting + +- **`ANY` (OR logic)**: At least one policy in the group must pass + - **Short-circuits on first success** for performance + - Use for flexible requirements where multiple options are acceptable + - Example: Premium subscription OR trial access OR admin override + +### Group Evaluation Flow + +1. **Sequential Group Processing**: Groups are evaluated in order +2. **All Groups Must Pass**: If any group fails, entire evaluation fails +3. **Short-Circuiting**: Stops on first group failure for performance +4. **Metadata Preservation**: All policy results and metadata are collected + +### Performance Considerations + +- **Order groups by criticality**: Put fast, critical checks first +- **Use caching**: Configure `maxCacheSize` for frequently used policies +- **Group by evaluation cost**: Separate expensive operations +- **Monitor evaluation time**: Track performance for optimization + +## Stage-Aware Evaluation + +Policies can be filtered by execution stage. This is useful for running a subset of policies depending on the situation: + +```typescript +// Only run preliminary checks +const prelimResult = await evaluator.evaluate( + registry, + context, + 'ALL', + 'preliminary', +); + +// Run submission validation +const submitResult = await evaluator.evaluate( + registry, + context, + 'ALL', + 'submission', +); + +// Run all applicable policies +const fullResult = await evaluator.evaluate(registry, context, 'ALL'); +``` diff --git a/packages/policies/eslint.config.mjs b/packages/policies/eslint.config.mjs new file mode 100644 index 000000000..97563ae8d --- /dev/null +++ b/packages/policies/eslint.config.mjs @@ -0,0 +1,3 @@ +import eslintConfigBase from '@kit/eslint-config/base.js'; + +export default eslintConfigBase; diff --git a/packages/policies/index.ts b/packages/policies/index.ts new file mode 100644 index 000000000..8420b1093 --- /dev/null +++ b/packages/policies/index.ts @@ -0,0 +1 @@ +export * from './src'; diff --git a/packages/policies/package.json b/packages/policies/package.json new file mode 100644 index 000000000..4591bf5f4 --- /dev/null +++ b/packages/policies/package.json @@ -0,0 +1,29 @@ +{ + "name": "@kit/policies", + "private": true, + "version": "0.1.0", + "exports": { + ".": "./index.ts" + }, + "typesVersions": { + "*": { + "*": [ + "src/*" + ] + } + }, + "scripts": { + "clean": "rm -rf .turbo node_modules", + "lint": "eslint .", + "format": "prettier --check \"**/*.{mjs,ts,md,json}\"", + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/shared": "workspace:*", + "@kit/tsconfig": "workspace:*", + "zod": "^3.25.74" + }, + "prettier": "@kit/prettier-config" +} diff --git a/packages/policies/src/declarative.ts b/packages/policies/src/declarative.ts new file mode 100644 index 000000000..0951a6cfc --- /dev/null +++ b/packages/policies/src/declarative.ts @@ -0,0 +1,247 @@ +import type { z } from 'zod'; + +import type { PolicyContext, PolicyResult, PolicyStage } from './types'; + +/** + * Error code for structured policy failures + */ +export interface PolicyErrorCode { + /** Machine-readable error code */ + code: string; + /** Human-readable error message */ + message: string; + /** Optional remediation instructions */ + remediation?: string; + /** Additional metadata */ + metadata?: Record; +} + +/** + * Enhanced policy result with structured error information + */ +export interface PolicyReason extends PolicyErrorCode { + /** Policy ID that generated this reason */ + policyId: string; + /** Stage at which this reason was generated */ + stage?: PolicyStage; +} + +/** + * Policy evaluator function with immutable context + */ +export interface PolicyEvaluator { + /** Evaluate the policy for a specific stage */ + evaluate(stage?: PolicyStage): Promise; + + /** Get the immutable context */ + getContext(): Readonly; +} + +/** + * Policy definition factory configuration + */ +export interface FeaturePolicyDefinition< + TContext extends PolicyContext = PolicyContext, + TConfig = unknown, +> { + /** Unique policy identifier */ + id: string; + + /** Optional stages this policy applies to */ + stages?: PolicyStage[]; + + /** Optional configuration schema for validation */ + configSchema?: z.ZodType; + + /** Factory function to create evaluator instances */ + create(context: TContext, config?: TConfig): PolicyEvaluator; +} + +/** + * Helper function to create a successful policy result + */ +export function allow(metadata?: Record): PolicyResult { + return { + allowed: true, + metadata, + }; +} + +/** + * Helper function to create a failed policy result with structured error + */ +export function deny(error: PolicyErrorCode): PolicyResult { + return { + allowed: false, + reason: error.message, + metadata: { + code: error.code, + remediation: error.remediation, + ...error.metadata, + }, + }; +} + +/** + * Deep freeze an object and all its nested properties + */ +function deepFreeze(obj: T, visited = new WeakSet()): Readonly { + // Prevent infinite recursion with circular references + if (visited.has(obj as object)) { + return obj; + } + + visited.add(obj as object); + + // Get all property names + const propNames = Reflect.ownKeys(obj as object); + + // Freeze properties before freezing self + for (const name of propNames) { + const value = (obj as Record)[name as string]; + + if ((value && typeof value === 'object') || typeof value === 'function') { + deepFreeze(value, visited); + } + } + + return Object.freeze(obj); +} + +/** + * Safe cloning that handles functions and other non-cloneable objects + */ +function safeClone(obj: T): T { + try { + return structuredClone(obj); + } catch { + // If structuredClone fails (e.g., due to functions), create a shallow clone + // and recursively clone cloneable properties + if (obj && typeof obj === 'object') { + const cloned = Array.isArray(obj) ? ([] as unknown as T) : ({} as T); + + for (const [key, value] of Object.entries(obj)) { + try { + // Try to clone individual properties + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (cloned as any)[key] = structuredClone(value); + } catch { + // If individual property can't be cloned (like functions), keep as-is + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (cloned as any)[key] = value; + } + } + + return cloned; + } + + // For primitives or non-cloneable objects, return as-is + return obj; + } +} + +/** + * Creates an immutable context wrapper + */ +function createImmutableContext( + context: T, +): Readonly { + // Safely clone the context, handling functions and other edge cases + const cloned = safeClone(context); + + // Deep freeze the object to make it immutable + return deepFreeze(cloned); +} + +/** + * Factory function to define a policy with metadata and configuration + */ +export function definePolicy< + TContext extends PolicyContext = PolicyContext, + TConfig = unknown, +>(config: { + /** Unique policy identifier */ + id: string; + + /** Optional stages this policy applies to */ + stages?: PolicyStage[]; + + /** Optional configuration schema for validation */ + configSchema?: z.ZodType; + + /** Policy implementation function */ + evaluate: ( + context: Readonly, + config?: TConfig, + stage?: PolicyStage, + ) => Promise; +}) { + return { + id: config.id, + stages: config.stages, + configSchema: config.configSchema, + + create(context: TContext, policyConfig?: TConfig) { + // Validate configuration if schema is provided + if (config.configSchema && policyConfig !== undefined) { + const validation = config.configSchema.safeParse(policyConfig); + + if (!validation.success) { + throw new Error( + `Invalid configuration for policy "${config.id}": ${validation.error.message}`, + ); + } + } + + // Create immutable context + const immutableContext = createImmutableContext(context); + + return { + async evaluate(stage?: PolicyStage) { + // Check if this policy should run at this stage + if (stage && config.stages && !config.stages.includes(stage)) { + return allow({ + skipped: true, + reason: `Policy not applicable for stage: ${stage}`, + }); + } + + try { + const result = await config.evaluate( + immutableContext, + policyConfig, + stage, + ); + + // Ensure metadata includes policy ID and stage + return { + ...result, + metadata: { + policyId: config.id, + stage, + ...result.metadata, + }, + }; + } catch (error) { + return deny({ + code: 'POLICY_EVALUATION_ERROR', + message: + error instanceof Error + ? error.message + : 'Policy evaluation failed', + metadata: { + policyId: config.id, + stage, + error: error instanceof Error ? error.message : 'Unknown error', + }, + }); + } + }, + + getContext() { + return immutableContext; + }, + }; + }, + }; +} diff --git a/packages/policies/src/evaluator.ts b/packages/policies/src/evaluator.ts new file mode 100644 index 000000000..1ecc6e7f5 --- /dev/null +++ b/packages/policies/src/evaluator.ts @@ -0,0 +1,406 @@ +import type { FeaturePolicyDefinition, PolicyErrorCode } from './declarative'; +import type { PolicyRegistry } from './registry'; +import type { PolicyContext, PolicyResult, PolicyStage } from './types'; + +const OPERATORS = { + ALL: 'ALL' as const, + ANY: 'ANY' as const, +}; + +type Operator = (typeof OPERATORS)[keyof typeof OPERATORS]; + +/** + * Simple policy function type + */ +export type PolicyFunction = ( + context: Readonly, + stage?: PolicyStage, +) => Promise; + +/** + * Policy group - just an array of policies with an operator + */ +export interface PolicyGroup { + operator: Operator; + policies: PolicyFunction[]; +} + +/** + * Evaluation result + */ +export interface EvaluationResult { + allowed: boolean; + reasons: string[]; + results: PolicyResult[]; +} + +/** + * LRU Cache for policy definitions with size limit + */ +class LRUCache { + private cache = new Map(); + private maxSize: number; + + constructor(maxSize: number = 100) { + this.maxSize = maxSize; + } + + get(key: K): V | undefined { + const value = this.cache.get(key); + + if (value !== undefined) { + // Move to end (most recently used) + this.cache.delete(key); + this.cache.set(key, value); + } + + return value; + } + + set(key: K, value: V): void { + if (this.cache.has(key)) { + this.cache.delete(key); + } else if (this.cache.size >= this.maxSize) { + // Remove least recently used (first entry) + const firstKey = this.cache.keys().next().value; + + if (firstKey) { + this.cache.delete(firstKey); + } + } + this.cache.set(key, value); + } + + clear(): void { + this.cache.clear(); + } + + size(): number { + return this.cache.size; + } +} + +export class PoliciesEvaluator { + // Use WeakMap for registry references to allow garbage collection + private registryPolicyCache = new WeakMap< + PolicyRegistry, + LRUCache> + >(); + + private readonly maxCacheSize: number; + + constructor(options?: { maxCacheSize?: number }) { + this.maxCacheSize = options?.maxCacheSize ?? 100; + } + + private async getCachedPolicy( + registry: PolicyRegistry, + policyId: string, + ): Promise | undefined> { + if (!this.registryPolicyCache.has(registry)) { + this.registryPolicyCache.set(registry, new LRUCache(this.maxCacheSize)); + } + + const cache = this.registryPolicyCache.get(registry)!; + + let definition = cache.get(policyId); + + if (!definition) { + definition = await registry.getPolicy(policyId); + + if (definition) { + cache.set(policyId, definition); + } + } + + return definition; + } + + /** + * Clear all cached policies (useful for testing or memory management) + */ + clearCache(): void { + // Create new WeakMap to clear all references + this.registryPolicyCache = new WeakMap(); + } + + async hasPoliciesForStage( + registry: PolicyRegistry, + stage?: PolicyStage, + ): Promise { + const policyIds = registry.listPolicies(); + + for (const policyId of policyIds) { + const definition = await this.getCachedPolicy(registry, policyId); + + if (!definition) { + continue; + } + + if (!stage) { + return true; + } + + if (!definition.stages) { + return true; + } + + if (definition.stages.includes(stage)) { + return true; + } + } + + return false; + } + + /** + * Evaluate a registry with support for stages and AND/OR logic + */ + async evaluate( + registry: PolicyRegistry, + context: TContext, + operator: Operator = OPERATORS.ALL, + stage?: PolicyStage, + ): Promise { + const results: PolicyResult[] = []; + const reasons: string[] = []; + const policyIds = registry.listPolicies(); + + for (const policyId of policyIds) { + const definition = await this.getCachedPolicy(registry, policyId); + + if (!definition) { + continue; + } + + if (stage && definition.stages && !definition.stages.includes(stage)) { + continue; + } + + const evaluator = definition.create(context); + const result = await evaluator.evaluate(stage); + + results.push(result); + + if (!result.allowed && result.reason) { + reasons.push(result.reason); + } + + if (operator === OPERATORS.ALL && !result.allowed) { + return { allowed: false, reasons, results }; + } + + if (operator === OPERATORS.ANY && result.allowed) { + return { allowed: true, reasons: [], results }; + } + } + + // Handle edge case: empty policy list with ANY operator + if (results.length === 0 && operator === OPERATORS.ANY) { + return { + allowed: false, + reasons: ['No policies matched the criteria'], + results: [], + }; + } + + const allowed = + operator === OPERATORS.ALL + ? results.every((r) => r.allowed) + : results.some((r) => r.allowed); + + return { allowed, reasons: allowed ? [] : reasons, results }; + } + + /** + * Evaluate a single group of policies + */ + async evaluateGroup( + group: PolicyGroup, + context: TContext, + stage?: PolicyStage, + ): Promise { + const results: PolicyResult[] = []; + const reasons: string[] = []; + + for (const policy of group.policies) { + const result = await policy(Object.freeze({ ...context }), stage); + results.push(result); + + if (!result.allowed && result.reason) { + reasons.push(result.reason); + } + + // Short-circuit logic + if (group.operator === OPERATORS.ALL && !result.allowed) { + return { + allowed: false, + reasons, + results, + }; + } + + if (group.operator === OPERATORS.ANY && result.allowed) { + return { + allowed: true, + reasons: [], + results, + }; + } + } + + // Final evaluation + const allowed = + group.operator === OPERATORS.ALL + ? results.every((r) => r.allowed) + : results.some((r) => r.allowed); + + return { + allowed, + reasons: allowed ? [] : reasons, + results, + }; + } + + /** + * Evaluate multiple groups in sequence + */ + async evaluateGroups( + groups: PolicyGroup[], + context: TContext, + stage?: PolicyStage, + ): Promise { + const allResults: PolicyResult[] = []; + const allReasons: string[] = []; + + for (const group of groups) { + const groupResult = await this.evaluateGroup(group, context, stage); + allResults.push(...groupResult.results); + allReasons.push(...groupResult.reasons); + + // Stop on first failure + if (!groupResult.allowed) { + return { + allowed: false, + reasons: allReasons, + results: allResults, + }; + } + } + + return { + allowed: true, + reasons: [], + results: allResults, + }; + } + + /** + * Evaluate a simple array of policies with ALL/ANY logic + */ + async evaluatePolicies( + policies: PolicyFunction[], + context: TContext, + operator: Operator = OPERATORS.ALL, + stage?: PolicyStage, + ) { + return this.evaluateGroup({ operator, policies }, context, stage); + } +} + +/** + * Helper to create a policy function + */ +export function createPolicy( + evaluate: ( + context: Readonly, + stage?: PolicyStage, + ) => Promise, +): PolicyFunction { + return evaluate; +} + +/** + * Helper policy results + */ +export const allow = (metadata?: Record): PolicyResult => ({ + allowed: true, + metadata, +}); + +// Function overloads for deny() to support both string and structured errors +export function deny( + reason: string, + metadata?: Record, +): PolicyResult; + +export function deny(error: PolicyErrorCode): PolicyResult; + +export function deny( + reasonOrError: string | PolicyErrorCode, + metadata?: Record, +): PolicyResult { + if (typeof reasonOrError === 'string') { + return { + allowed: false, + reason: reasonOrError, + metadata, + }; + } else { + return { + allowed: false, + reason: reasonOrError.message, + metadata: { + code: reasonOrError.code, + remediation: reasonOrError.remediation, + ...reasonOrError.metadata, + }, + }; + } +} + +/** + * Create a policies evaluator with optional configuration + */ +export function createPoliciesEvaluator< + TContext extends PolicyContext = PolicyContext, +>(options?: { maxCacheSize?: number }) { + return new PoliciesEvaluator(options); +} + +/** + * Convert a registry-based policy to a simple policy function + */ +export async function createPolicyFromRegistry< + TContext extends PolicyContext = PolicyContext, +>(registry: PolicyRegistry, policyId: string, config?: unknown) { + const definition = await registry.getPolicy(policyId); + + return async (context: Readonly, stage?: PolicyStage) => { + const evaluator = definition.create(context as TContext, config); + + return evaluator.evaluate(stage); + }; +} + +/** + * Create multiple policy functions from registry policy IDs + */ +export async function createPoliciesFromRegistry< + TContext extends PolicyContext = PolicyContext, +>(registry: PolicyRegistry, policySpecs: Array) { + const policies: PolicyFunction[] = []; + + for (const spec of policySpecs) { + if (typeof spec === 'string') { + // Simple policy ID + policies.push(await createPolicyFromRegistry(registry, spec)); + } else { + // Policy ID with config + const [policyId, config] = spec; + policies.push(await createPolicyFromRegistry(registry, policyId, config)); + } + } + + return policies; +} diff --git a/packages/policies/src/index.ts b/packages/policies/src/index.ts new file mode 100644 index 000000000..91c1f6c08 --- /dev/null +++ b/packages/policies/src/index.ts @@ -0,0 +1,32 @@ +// Export core types and interfaces +export type { PolicyContext, PolicyResult, PolicyStage } from './types'; + +// Export primary registry-based API +export { definePolicy } from './declarative'; +export type { + FeaturePolicyDefinition, + PolicyEvaluator, + PolicyErrorCode, + PolicyReason, +} from './declarative'; + +// Export policy registry (primary API) +export { createPolicyRegistry } from './registry'; +export type { PolicyRegistry } from './registry'; + +// Export evaluator and bridge functions +export { + createPolicy, + createPoliciesEvaluator, + createPolicyFromRegistry, + createPoliciesFromRegistry, +} from './evaluator'; + +export type { + PolicyFunction, + PolicyGroup, + EvaluationResult, +} from './evaluator'; + +// Export helper functions (for policy implementations) +export { allow, deny } from './evaluator'; diff --git a/packages/policies/src/registry.ts b/packages/policies/src/registry.ts new file mode 100644 index 000000000..85b42e580 --- /dev/null +++ b/packages/policies/src/registry.ts @@ -0,0 +1,81 @@ +import { createRegistry } from '@kit/shared/registry'; + +import type { FeaturePolicyDefinition } from './declarative'; +import type { PolicyContext } from './types'; + +/** + * Simple policy registry interface + */ +export interface PolicyRegistry { + /** Register a single policy definition */ + registerPolicy< + TContext extends PolicyContext = PolicyContext, + TConfig = unknown, + >( + definition: FeaturePolicyDefinition, + ): PolicyRegistry; + + /** Get a policy definition by ID */ + getPolicy( + id: string, + ): Promise>; + + /** Check if a policy exists */ + hasPolicy(id: string): boolean; + + /** List all registered policy IDs */ + listPolicies(): string[]; +} + +/** + * Creates a new policy registry instance + */ +export function createPolicyRegistry(): PolicyRegistry { + const baseRegistry = createRegistry< + FeaturePolicyDefinition, + string + >(); + + const policyIds = new Set(); + + return { + registerPolicy< + TContext extends PolicyContext = PolicyContext, + TConfig = unknown, + >(definition: FeaturePolicyDefinition) { + // Check for duplicates + if (policyIds.has(definition.id)) { + throw new Error( + `Policy with ID "${definition.id}" is already registered`, + ); + } + + // Register the policy definition + baseRegistry.register(definition.id, () => definition); + policyIds.add(definition.id); + + return this; + }, + + async getPolicy< + TContext extends PolicyContext = PolicyContext, + TConfig = unknown, + >(id: string) { + if (!policyIds.has(id)) { + throw new Error(`Policy with ID "${id}" is not registered`); + } + + return baseRegistry.get(id) as Promise< + FeaturePolicyDefinition + >; + }, + + hasPolicy(id: string) { + return policyIds.has(id); + }, + + listPolicies() { + return Array.from(policyIds); + }, + }; +} diff --git a/packages/policies/src/types.ts b/packages/policies/src/types.ts new file mode 100644 index 000000000..6bee16635 --- /dev/null +++ b/packages/policies/src/types.ts @@ -0,0 +1,42 @@ +/** + * Base context interface that all policy contexts must extend. + * Provides common metadata and identifiers used across all policy types. + */ +export interface PolicyContext { + /** Timestamp when the policy evaluation was initiated */ + timestamp: string; + + /** Additional metadata for debugging and logging */ + metadata?: Record; +} + +/** + * Standard result interface returned by all policy evaluations. + * Provides consistent structure for policy decisions across all features. + */ +export interface PolicyResult { + /** Whether the action is allowed by this policy */ + allowed: boolean; + + /** Human-readable reason when action is not allowed */ + reason?: string; + + /** Whether this policy failure requires manual review */ + requiresManualReview?: boolean; + + /** Additional metadata for debugging, logging, and UI customization */ + metadata?: Record; +} + +/** + * Policy evaluation stages are user-defined strings for multi-phase validation. + * Allows policies to run at different points in the user workflow. + * + * Common examples: + * - 'preliminary' - runs before user input/form submission + * - 'submission' - runs during form submission with actual user data + * - 'post_action' - runs after the action has been completed + * + * You can define your own stages like 'validation', 'authorization', 'audit', etc. + */ +export type PolicyStage = string; diff --git a/packages/policies/tsconfig.json b/packages/policies/tsconfig.json new file mode 100644 index 000000000..c4697e934 --- /dev/null +++ b/packages/policies/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@kit/tsconfig/base.json", + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" + }, + "include": ["*.ts", "src"], + "exclude": ["node_modules"] +} diff --git a/packages/shared/package.json b/packages/shared/package.json index debc76759..7f4576610 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -20,10 +20,10 @@ "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@types/react": "19.1.13" + "@types/react": "19.1.15" }, "dependencies": { - "pino": "^9.11.0" + "pino": "^9.12.0" }, "typesVersions": { "*": { diff --git a/packages/supabase/package.json b/packages/supabase/package.json index 675a3060b..4c9d622d1 100644 --- a/packages/supabase/package.json +++ b/packages/supabase/package.json @@ -26,12 +26,11 @@ "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", "@supabase/ssr": "^0.7.0", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@tanstack/react-query": "5.90.2", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "next": "15.5.4", "react": "19.1.1", - "server-only": "^0.0.1", "zod": "^3.25.74" }, "typesVersions": { diff --git a/packages/ui/package.json b/packages/ui/package.json index 6911a6d18..8ba652cd6 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -25,10 +25,10 @@ "@kit/eslint-config": "workspace:*", "@kit/prettier-config": "workspace:*", "@kit/tsconfig": "workspace:*", - "@supabase/supabase-js": "2.57.4", + "@supabase/supabase-js": "2.58.0", "@tanstack/react-query": "5.90.2", "@tanstack/react-table": "^8.21.3", - "@types/react": "19.1.13", + "@types/react": "19.1.15", "@types/react-dom": "19.1.9", "class-variance-authority": "^0.7.1", "date-fns": "^4.1.0", @@ -38,7 +38,7 @@ "prettier": "^3.6.2", "react-day-picker": "^9.11.0", "react-hook-form": "^7.63.0", - "react-i18next": "^15.7.3", + "react-i18next": "^16.0.0", "sonner": "^2.0.7", "tailwindcss": "4.1.13", "tailwindcss-animate": "^1.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22f58ce58..178ce31d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: apps/dev-tool: dependencies: '@ai-sdk/openai': - specifier: ^2.0.34 - version: 2.0.34(zod@3.25.76) + specifier: ^2.0.38 + version: 2.0.38(zod@3.25.76) '@faker-js/faker': specifier: ^10.0.0 version: 10.0.0 @@ -42,8 +42,8 @@ importers: specifier: 5.90.2 version: 5.90.2(react@19.1.1) ai: - specifier: 5.0.51 - version: 5.0.51(zod@3.25.76) + specifier: 5.0.56 + version: 5.0.56(zod@3.25.76) lucide-react: specifier: ^0.544.0 version: 0.544.0(react@19.1.1) @@ -97,11 +97,11 @@ importers: specifier: 7.0.1 version: 7.0.1 '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.13) + version: 19.1.9(@types/react@19.1.15) babel-plugin-react-compiler: specifier: 19.1.0-rc.3 version: 19.1.0-rc.3 @@ -133,8 +133,8 @@ importers: specifier: ^1.55.1 version: 1.55.1 '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@types/node': specifier: ^24.5.2 version: 24.5.2 @@ -212,10 +212,10 @@ importers: version: link:../../packages/ui '@makerkit/data-loader-supabase-core': specifier: ^0.0.10 - version: 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4) + version: 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.58.0) '@makerkit/data-loader-supabase-nextjs': specifier: ^1.2.5 - version: 1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4)(@tanstack/react-query@5.90.2(react@19.1.1))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.58.0)(@tanstack/react-query@5.90.2(react@19.1.1))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@marsidev/react-turnstile': specifier: ^1.3.1 version: 1.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -226,8 +226,8 @@ importers: specifier: ^1.3.2 version: 1.3.2(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@tanstack/react-query': specifier: 5.90.2 version: 5.90.2(react@19.1.1) @@ -259,8 +259,8 @@ importers: specifier: ^7.63.0 version: 7.63.0(react@19.1.1) react-i18next: - specifier: ^15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: ^16.0.0 + version: 16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) recharts: specifier: 2.15.3 version: 2.15.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -290,11 +290,11 @@ importers: specifier: ^24.5.2 version: 24.5.2 '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.13) + version: 19.1.9(@types/react@19.1.15) babel-plugin-react-compiler: specifier: 19.1.0-rc.3 version: 19.1.0-rc.3 @@ -308,8 +308,8 @@ importers: specifier: ^3.6.2 version: 3.6.2 supabase: - specifier: 2.45.5 - version: 2.45.5 + specifier: 2.47.2 + version: 2.47.2 tailwindcss: specifier: 4.1.13 version: 4.1.13 @@ -389,11 +389,11 @@ importers: specifier: workspace:* version: link:../../ui '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -410,8 +410,8 @@ importers: specifier: ^7.63.0 version: 7.63.0(react@19.1.1) react-i18next: - specifier: ^15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: ^16.0.0 + version: 16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) zod: specifier: ^3.25.74 version: 3.25.76 @@ -444,8 +444,8 @@ importers: specifier: workspace:* version: link:../../ui '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 next: specifier: 15.5.4 version: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -490,8 +490,8 @@ importers: specifier: workspace:* version: link:../../ui '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -542,7 +542,7 @@ importers: version: 5.0.4(@keystatic/core@0.5.48(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@markdoc/markdoc': specifier: ^0.5.4 - version: 0.5.4(@types/react@19.1.13)(react@19.1.1) + version: 0.5.4(@types/react@19.1.15)(react@19.1.1) devDependencies: '@kit/cms-types': specifier: workspace:* @@ -563,8 +563,8 @@ importers: specifier: ^24.5.2 version: 24.5.2 '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 react: specifier: 19.1.1 version: 19.1.1 @@ -605,8 +605,8 @@ importers: specifier: ^24.5.2 version: 24.5.2 '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 wp-types: specifier: ^4.68.1 version: 4.68.1 @@ -641,8 +641,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 zod: specifier: ^3.25.74 version: 3.25.76 @@ -650,8 +650,8 @@ importers: packages/email-templates: dependencies: '@react-email/components': - specifier: 0.5.4 - version: 0.5.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 0.5.5 + version: 0.5.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) devDependencies: '@kit/eslint-config': specifier: workspace:* @@ -715,17 +715,17 @@ importers: specifier: ^1.3.2 version: 1.3.2(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@tanstack/react-query': specifier: 5.90.2 version: 5.90.2(react@19.1.1) '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.13) + version: 19.1.9(@types/react@19.1.15) lucide-react: specifier: ^0.544.0 version: 0.544.0(react@19.1.1) @@ -745,8 +745,8 @@ importers: specifier: ^7.63.0 version: 7.63.0(react@19.1.1) react-i18next: - specifier: ^15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: ^16.0.0 + version: 16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) zod: specifier: ^3.25.74 version: 3.25.76 @@ -779,13 +779,13 @@ importers: version: link:../../ui '@makerkit/data-loader-supabase-core': specifier: ^0.0.10 - version: 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4) + version: 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.58.0) '@makerkit/data-loader-supabase-nextjs': specifier: ^1.2.5 - version: 1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4)(@tanstack/react-query@5.90.2(react@19.1.1))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + version: 1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.58.0)(@tanstack/react-query@5.90.2(react@19.1.1))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@tanstack/react-query': specifier: 5.90.2 version: 5.90.2(react@19.1.1) @@ -793,8 +793,8 @@ importers: specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 lucide-react: specifier: ^0.544.0 version: 0.544.0(react@19.1.1) @@ -844,14 +844,14 @@ importers: specifier: ^1.3.2 version: 1.3.2(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@tanstack/react-query': specifier: 5.90.2 version: 5.90.2(react@19.1.1) '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 lucide-react: specifier: ^0.544.0 version: 0.544.0(react@19.1.1) @@ -862,8 +862,8 @@ importers: specifier: ^7.63.0 version: 7.63.0(react@19.1.1) react-i18next: - specifier: ^15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: ^16.0.0 + version: 16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) sonner: specifier: ^2.0.7 version: 2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -889,14 +889,14 @@ importers: specifier: workspace:* version: link:../../ui '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@tanstack/react-query': specifier: 5.90.2 version: 5.90.2(react@19.1.1) '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 lucide-react: specifier: ^0.544.0 version: 0.544.0(react@19.1.1) @@ -907,8 +907,8 @@ importers: specifier: 19.1.1 version: 19.1.1(react@19.1.1) react-i18next: - specifier: ^15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: ^16.0.0 + version: 16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) packages/features/team-accounts: dependencies: @@ -943,6 +943,9 @@ importers: '@kit/otp': specifier: workspace:* version: link:../../otp + '@kit/policies': + specifier: workspace:* + version: link:../../policies '@kit/prettier-config': specifier: workspace:* version: link:../../../tooling/prettier @@ -959,8 +962,8 @@ importers: specifier: workspace:* version: link:../../ui '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@tanstack/react-query': specifier: 5.90.2 version: 5.90.2(react@19.1.1) @@ -968,11 +971,11 @@ importers: specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.13) + version: 19.1.9(@types/react@19.1.15) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -995,8 +998,8 @@ importers: specifier: ^7.63.0 version: 7.63.0(react@19.1.1) react-i18next: - specifier: ^15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: ^16.0.0 + version: 16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) zod: specifier: ^3.25.74 version: 3.25.76 @@ -1038,8 +1041,8 @@ importers: specifier: 19.1.1 version: 19.1.1(react@19.1.1) react-i18next: - specifier: ^15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: ^16.0.0 + version: 16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) packages/mailers/core: devDependencies: @@ -1141,8 +1144,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@modelcontextprotocol/sdk': - specifier: 1.18.1 - version: 1.18.1 + specifier: 1.18.2 + version: 1.18.2 '@types/node': specifier: ^24.5.2 version: 24.5.2 @@ -1174,8 +1177,8 @@ importers: specifier: workspace:* version: link:../../../tooling/typescript '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 react: specifier: 19.1.1 version: 19.1.1 @@ -1195,8 +1198,8 @@ importers: specifier: workspace:* version: link:../../../tooling/typescript '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 react: specifier: 19.1.1 version: 19.1.1 @@ -1204,11 +1207,11 @@ importers: packages/monitoring/sentry: dependencies: '@sentry/nextjs': - specifier: ^10.14.0 - version: 10.14.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3) + specifier: ^10.15.0 + version: 10.15.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3) import-in-the-middle: - specifier: 1.14.2 - version: 1.14.2 + specifier: 1.14.4 + version: 1.14.4 devDependencies: '@kit/eslint-config': specifier: workspace:* @@ -1223,8 +1226,8 @@ importers: specifier: workspace:* version: link:../../../tooling/typescript '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 react: specifier: 19.1.1 version: 19.1.1 @@ -1250,8 +1253,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 next: specifier: 15.5.4 version: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1295,14 +1298,14 @@ importers: specifier: ^1.3.2 version: 1.3.2(react@19.1.1) '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.13) + version: 19.1.9(@types/react@19.1.15) react: specifier: 19.1.1 version: 19.1.1 @@ -1316,11 +1319,29 @@ importers: specifier: ^3.25.74 version: 3.25.76 + packages/policies: + devDependencies: + '@kit/eslint-config': + specifier: workspace:* + version: link:../../tooling/eslint + '@kit/prettier-config': + specifier: workspace:* + version: link:../../tooling/prettier + '@kit/shared': + specifier: workspace:* + version: link:../shared + '@kit/tsconfig': + specifier: workspace:* + version: link:../../tooling/typescript + zod: + specifier: ^3.25.74 + version: 3.25.76 + packages/shared: dependencies: pino: - specifier: ^9.11.0 - version: 9.11.0 + specifier: ^9.12.0 + version: 9.12.0 devDependencies: '@kit/eslint-config': specifier: workspace:* @@ -1332,8 +1353,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 packages/supabase: devDependencies: @@ -1348,25 +1369,22 @@ importers: version: link:../../tooling/typescript '@supabase/ssr': specifier: ^0.7.0 - version: 0.7.0(@supabase/supabase-js@2.57.4) + version: 0.7.0(@supabase/supabase-js@2.58.0) '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@tanstack/react-query': specifier: 5.90.2 version: 5.90.2(react@19.1.1) '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 next: specifier: 15.5.4 version: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 - server-only: - specifier: ^0.0.1 - version: 0.0.1 zod: specifier: ^3.25.74 version: 3.25.76 @@ -1384,7 +1402,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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) input-otp: specifier: 1.4.2 version: 1.4.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1393,7 +1411,7 @@ importers: version: 0.544.0(react@19.1.1) radix-ui: specifier: 1.4.3 - version: 1.4.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.4.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-dropzone: specifier: ^14.3.8 version: 14.3.8(react@19.1.1) @@ -1417,8 +1435,8 @@ importers: specifier: workspace:* version: link:../../tooling/typescript '@supabase/supabase-js': - specifier: 2.57.4 - version: 2.57.4 + specifier: 2.58.0 + version: 2.58.0 '@tanstack/react-query': specifier: 5.90.2 version: 5.90.2(react@19.1.1) @@ -1426,11 +1444,11 @@ importers: specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/react': - specifier: 19.1.13 - version: 19.1.13 + specifier: 19.1.15 + version: 19.1.15 '@types/react-dom': specifier: 19.1.9 - version: 19.1.9(@types/react@19.1.13) + version: 19.1.9(@types/react@19.1.15) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1456,8 +1474,8 @@ importers: specifier: ^7.63.0 version: 7.63.0(react@19.1.1) react-i18next: - specifier: ^15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + specifier: ^16.0.0 + version: 16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) sonner: specifier: ^2.0.7 version: 2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1538,23 +1556,23 @@ packages: graphql: optional: true - '@ai-sdk/gateway@1.0.28': - resolution: {integrity: sha512-e9RKgWVDYHsd4UkKCgKQpK+nxLSDydN18yXctzgNlmf2R7BR+HqUsTKJdZT6ArSoXBWBGhyZss0cJJnpm6YVfw==} + '@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.34': - resolution: {integrity: sha512-ATMX1DyXANq2e6DVMpAcAOVvUKiMkNI0hCXbyHs7Bg0M8744B/jiGHM0Can9Ez3DnnLIfhoqZs4XQe1csscSiA==} + '@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==} @@ -1577,44 +1595,44 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-sesv2@3.893.0': - resolution: {integrity: sha512-n0SJ/BGbpUz7FcatGtQHTK5Zaq8Z4xgad1tqvJzhoSjHerivVEoR63o1R7V2GiREPfcws2Gd0ROuajOLS2kaOg==} + '@aws-sdk/client-sesv2@3.896.0': + resolution: {integrity: sha512-KqWoxNmSKw4KYDrB3IH6AIfX855Dlorya1PcRqODa16xUp8aqoYACuBq+cjSuy5F6j9YDGSZgc20JDmWQRkN8Q==} 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-host-header@3.893.0': @@ -1629,28 +1647,28 @@ 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-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/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': @@ -1661,8 +1679,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-locate-window@3.893.0': @@ -1672,8 +1690,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' @@ -1681,8 +1699,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': @@ -2201,8 +2219,8 @@ packages: react: ^17.0.2 || ^18.0.0 || ^19.0 react-dom: ^17.0.2 || ^18.0.0 || ^19.0 - '@modelcontextprotocol/sdk@1.18.1': - resolution: {integrity: sha512-d//GE8/Yh7aC3e7p+kZG8JqqEAwwDUmAfvH1quogtbk+ksS6E0RR6toKKESPYYZVre0meqkJb27zb+dhqE9Sgw==} + '@modelcontextprotocol/sdk@1.18.2': + resolution: {integrity: sha512-beedclIvFcCnPrYgHsylqiYJVJ/CI47Vyc4tY8no1/Li/O8U4BTlJfy6ZwxkYwx+Mx10nrgwSVrA7VBbhh4slg==} engines: {node: '>=18'} '@napi-rs/wasm-runtime@0.2.12': @@ -3494,8 +3512,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/components@0.5.4': - resolution: {integrity: sha512-y9aa/na9pEJ4uXVxX2E0QuiDLES8CIghkUOHJsRdKXbN9pGdgtPz5tjfMrNFe1x00S/kq2/VNaGidFYfZTnrTA==} + '@react-email/components@0.5.5': + resolution: {integrity: sha512-+utnip1DiXTq5TQKvL8qztWy0EC3L+qdRIeJkBZXJA4WGIukbaqimWCTBGIMW19Pj+1iKvDYk2JQHEQDLiq7uQ==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3559,8 +3577,8 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/render@1.3.0': - resolution: {integrity: sha512-AuKT93RJO+eBg9FIo5+QzVCUTB62sBcKewtDwoKS46KMTRSHeLH0oi3k8+B3ag51zgxAmk6Dda2630KVKNaggg==} + '@react-email/render@1.3.1': + resolution: {integrity: sha512-BOc/kanieEVyiuldFFvceriiBGBBVhe4JWWXCXE2ehLIqz+gSWD4rgCoXAGbJRnnVyyp4joPqK62bSfa88yonA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3873,113 +3891,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.2': - resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==} + '@rollup/rollup-android-arm-eabi@4.52.3': + resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.2': - resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} + '@rollup/rollup-android-arm64@4.52.3': + resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.2': - resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} + '@rollup/rollup-darwin-arm64@4.52.3': + resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.2': - resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} + '@rollup/rollup-darwin-x64@4.52.3': + resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.2': - resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} + '@rollup/rollup-freebsd-arm64@4.52.3': + resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.2': - resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} + '@rollup/rollup-freebsd-x64@4.52.3': + resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.2': - resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.3': + resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.2': - resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} + '@rollup/rollup-linux-arm-musleabihf@4.52.3': + resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.2': - resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} + '@rollup/rollup-linux-arm64-gnu@4.52.3': + resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.2': - resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} + '@rollup/rollup-linux-arm64-musl@4.52.3': + resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.2': - resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} + '@rollup/rollup-linux-loong64-gnu@4.52.3': + resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.2': - resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} + '@rollup/rollup-linux-ppc64-gnu@4.52.3': + resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.2': - resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} + '@rollup/rollup-linux-riscv64-gnu@4.52.3': + resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.2': - resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} + '@rollup/rollup-linux-riscv64-musl@4.52.3': + resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.2': - resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} + '@rollup/rollup-linux-s390x-gnu@4.52.3': + resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.2': - resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} + '@rollup/rollup-linux-x64-gnu@4.52.3': + resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.2': - resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} + '@rollup/rollup-linux-x64-musl@4.52.3': + resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.2': - resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} + '@rollup/rollup-openharmony-arm64@4.52.3': + resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.2': - resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} + '@rollup/rollup-win32-arm64-msvc@4.52.3': + resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.2': - resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} + '@rollup/rollup-win32-ia32-msvc@4.52.3': + resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.2': - resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} + '@rollup/rollup-win32-x64-gnu@4.52.3': + resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.2': - resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} + '@rollup/rollup-win32-x64-msvc@4.52.3': + resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==} cpu: [x64] os: [win32] @@ -3992,28 +4010,28 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@sentry-internal/browser-utils@10.14.0': - resolution: {integrity: sha512-32kM7Fs9x6d2GGiE3YaaKq2+qWwSaV2h0XhaIdvs/Ewkh9bJq81xlgEor7gjmJ6UpfxjPpU8rGST6hI1I5lcVg==} + '@sentry-internal/browser-utils@10.15.0': + resolution: {integrity: sha512-hJxo6rj3cMqiYlZd6PC8o/i2FG6hRnZdHcJkfm1HXgWCRgdCPilKghL6WU+B2H5dLyRKJ17nWjDAVQPRdCxO9w==} engines: {node: '>=18'} - '@sentry-internal/feedback@10.14.0': - resolution: {integrity: sha512-Lj8VGq+VSdwfEu6/Oo7hhcLKQRaRmOs30CAvbcPFSYRKfoi/0xT+dsOm2/C7vgIM9tmXJJ3hMHjgTgnJ3PIZfw==} + '@sentry-internal/feedback@10.15.0': + resolution: {integrity: sha512-EP+NvdU9yfmepGzQwz0jnqhd0DBxHzrP16TsJIVXJe93QJ+gumdN3XQ0lvYtEC9zHuU08DghRLjfI1kLRfGzdQ==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.14.0': - resolution: {integrity: sha512-z0DrutMZtxnCf8ZUxYttdbaFeUlnG6CQuDPJ9DQkQVTE2BOiVegZTMMRkj0cUDmIiRQ42Agf1hPbxVmqh2AUuQ==} + '@sentry-internal/replay-canvas@10.15.0': + resolution: {integrity: sha512-SXgUWArk+haUJ24W6pIm9IiwmIk3WxeQyFUxFfMUetSRb06CVAoNjPb0YuzKIeuFYJb6hDPGQ9UWhShnQpTmkw==} engines: {node: '>=18'} - '@sentry-internal/replay@10.14.0': - resolution: {integrity: sha512-C/DYUVTTlIxTLdgVlrPbilk2fYw/EPw4SfQgLC7tZXx/X7+Hh/Yi4ESrTlaKBsEUPhK/b82vdbS04+J1dZRyxA==} + '@sentry-internal/replay@10.15.0': + resolution: {integrity: sha512-vHBAFVdDfa51oqPWyRCK4fOIFhFeE2mVlqBWrBb+S3vCNcmtpvqJUq6o4sjSYcQzdZQpMSp5/Lj8Y3a8x/ed7w==} engines: {node: '>=18'} '@sentry/babel-plugin-component-annotate@4.3.0': resolution: {integrity: sha512-OuxqBprXRyhe8Pkfyz/4yHQJc5c3lm+TmYWSSx8u48g5yKewSQDOxkiLU5pAk3WnbLPy8XwU/PN+2BG0YFU9Nw==} engines: {node: '>= 14'} - '@sentry/browser@10.14.0': - resolution: {integrity: sha512-bDtsrHX+wtyOK0J1CcZoSgSJm2U1ITHVceAQfnQeEwWNP9y9xPRsEZDHfE3DnVNl/jB8iA/IOl5I8p4cCQdtpQ==} + '@sentry/browser@10.15.0': + resolution: {integrity: sha512-YV42VgW7xdmY23u7+nQLNJXDVilNTP0d5WWkHDxeI/uD6AAvn3GyKjx1YMG/KCulxva3dPDPEUunzDm3al26Sw==} engines: {node: '>=18'} '@sentry/bundler-plugin-core@4.3.0': @@ -4072,18 +4090,18 @@ packages: engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.14.0': - resolution: {integrity: sha512-gyJB7/mW0OteM+vwEsAWaPcLd3fTaKRAc4LZM1aXRbl7juPRmhgwFftjqGg7AMMGNDE0JMs1Fb2W4xSVxH1ItQ==} + '@sentry/core@10.15.0': + resolution: {integrity: sha512-J7WsQvb9G6nsVgWkTHwyX7wR2djtEACYCx19hAnRbSGIg+ysVG+7Ti3RL4bz9/VXfcxsz346cleKc7ljhynYlQ==} engines: {node: '>=18'} - '@sentry/nextjs@10.14.0': - resolution: {integrity: sha512-HmvQ6K91+qFgj5Kx7kiIXyMYVUY+Ojt2snajf7UkP1m8zWWoyhbqZd1cbXpWt7uIEzG82MZpK8zY1VmjSkf1JQ==} + '@sentry/nextjs@10.15.0': + resolution: {integrity: sha512-u3WLeeYgQH2Ug2SSdUu5ChMDKnWXeDXP7Bn+dRO01Y1/5NrMjoXO2w33ak03SLaZltPJFsRuMcfBtYoLA9BNlw==} engines: {node: '>=18'} peerDependencies: next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 - '@sentry/node-core@10.14.0': - resolution: {integrity: sha512-IHL2gEWTb1YvlPduPi9bRLUM43ZpS+/ZbkKgjI/X8X/ck0LCpgu93Kq/Fzgk3Ae9DyB7p+dd/Tu+B89td5kTVw==} + '@sentry/node-core@10.15.0': + resolution: {integrity: sha512-X6QAHulgfkpONYrXNK2QXfW02ja5FS31sn5DWfCDO8ggHej/u2mrf5nwnUU8vilSwbInHmiMpkUswGEKYDEKTA==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -4094,12 +4112,12 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 '@opentelemetry/semantic-conventions': ^1.37.0 - '@sentry/node@10.14.0': - resolution: {integrity: sha512-2e4g9lPJ/DuJsS4IMcd7RZq8vhqTAnT30GNSY/Sd2Pv6t64Eb5suXtkrHpH6y14QPlp0egQmq5jRs6RpINZSAA==} + '@sentry/node@10.15.0': + resolution: {integrity: sha512-5V9BX55DEIscU/S5+AEIQuIMKKbSd+MVo1/x5UkOceBxfiA0KUmgQ0POIpUEZqGCS9rpQ5fEajByRXAQ7bjaWA==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.14.0': - resolution: {integrity: sha512-DAVv6vFVeFclCtg8+6g90r2n2MmM6LZLEwfd8POgCL2MNd3cswC5CM1XFNOwG61stYtQ9PTFh/FQWHFv9fA+Pg==} + '@sentry/opentelemetry@10.15.0': + resolution: {integrity: sha512-j+uk3bfxGgsBejwpq78iRZ+aBOKR/fWcJi72MBTboTEK3B4LINO65PyJqwOhcZOJVVAPL6IK1+sWQp4RL24GTg==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -4108,14 +4126,14 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 '@opentelemetry/semantic-conventions': ^1.37.0 - '@sentry/react@10.14.0': - resolution: {integrity: sha512-kG2q/ICoDaCRJKbGGnyCOokSsHjxjA3TVRPZYOLuaP9rvuvrYGBUwXFUwSUtFV0A38o4F20HSPLMbLuu1oCH3Q==} + '@sentry/react@10.15.0': + resolution: {integrity: sha512-dyJTv0rJtHunGE0rZ3amQAgBaKR9YnbIJcg9Y1uZt+vPK/B19sqM9S8D7DUvlBfDk9iWfhBCK6gHLEUOckFrKA==} engines: {node: '>=18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/vercel-edge@10.14.0': - resolution: {integrity: sha512-bxlxUKeACvzIM9cSw4VPjK/bwh2srr9xgOUNLAjQjIQVlALZCN0KYh/pe9bC1KuJJ0nm+8gDvj5Lcqmv6BX5Dg==} + '@sentry/vercel-edge@10.15.0': + resolution: {integrity: sha512-QNruocfQy2P3rrgCKHCWNq7bsy+cFVNY25Y5PDaYsFKSiIge482g4Tjvfi7VMohy5jozcC1y82efFhicp3UqYg==} engines: {node: '>=18'} '@sentry/webpack-plugin@4.3.0': @@ -4140,8 +4158,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.13.0': + resolution: {integrity: sha512-BI6ALLPOKnPOU1Cjkc+1TPhOlP3JXSR/UH14JmnaLq41t3ma+IjuXrKfhycVjr5IQ0XxRh2NnQo3olp+eCVrGg==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.1.2': @@ -4172,12 +4190,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.5': + resolution: {integrity: sha512-DdOIpssQ5LFev7hV6GX9TMBW5ChTsQBxqgNW1ZGtJNSAi5ksd5klwPwwMY0ejejfEzwXXGqxgVO3cpaod4veiA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.2.4': - resolution: {integrity: sha512-amyqYQFewnAviX3yy/rI/n1HqAgfvUdkEhc04kDjxsngAUREKuOI24iwqQUirrj6GtodWmR4iO5Zeyl3/3BwWg==} + '@smithy/middleware-retry@4.3.1': + resolution: {integrity: sha512-aH2bD1bzb6FB04XBhXA5mgedEZPKx3tD/qBuYCAKt5iieWvWO1Y2j++J9uLqOndXb9Pf/83Xka/YjSnMbcPchA==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.1.1': @@ -4224,8 +4242,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.5': + resolution: {integrity: sha512-6J2hhuWu7EjnvLBIGltPCqzNswL1cW/AkaZx6i56qLsQ0ix17IAhmDD9aMmL+6CN9nCJODOXpBTCQS6iKAA7/g==} engines: {node: '>=18.0.0'} '@smithy/types@4.5.0': @@ -4260,12 +4278,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.5': + resolution: {integrity: sha512-FGBhlmFZVSRto816l6IwrmDcQ9pUYX6ikdR1mmAhdtSS1m77FgADukbQg7F7gurXfAvloxE/pgsrb7SGja6FQA==} 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.5': + resolution: {integrity: sha512-Gwj8KLgJ/+MHYjVubJF0EELEh9/Ir7z7DFqyYlwgmp4J37KE+5vz6b3pWUnSt53tIe5FjDfVjDmHGYKjwIvW0Q==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.1.2': @@ -4300,6 +4318,10 @@ packages: resolution: {integrity: sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==} 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==} @@ -4317,11 +4339,11 @@ packages: resolution: {integrity: sha512-ggs5k+/0FUJcIgNY08aZTqpBTtbExkJMYMLSMwyucrhtWexVOEY1KJmhBsxf+E/Q15f5rbwBpj+t0t2AW2oCsQ==} engines: {node: '>=12.16'} - '@supabase/auth-js@2.71.1': - resolution: {integrity: sha512-mMIQHBRc+SKpZFRB2qtupuzulaUhFYupNyxqDj5Jp/LyPvcWvjaJzZzObv6URtL/O6lPxkanASnotGtNpS3H2Q==} + '@supabase/auth-js@2.72.0': + resolution: {integrity: sha512-4+bnUrtTDK1YD0/FCx2YtMiQH5FGu9Jlf4IQi5kcqRwRwqp2ey39V61nHNdH86jm3DIzz0aZKiWfTW8qXk1swQ==} - '@supabase/functions-js@2.4.6': - resolution: {integrity: sha512-bhjZ7rmxAibjgmzTmQBxJU6ZIBCCJTc3Uwgvdi4FewueUTAGO5hxZT1Sj6tiD+0dSXf9XI87BDdJrg12z8Uaew==} + '@supabase/functions-js@2.5.0': + resolution: {integrity: sha512-SXBx6Jvp+MOBekeKFu+G11YLYPeVeGQl23eYyAG9+Ro0pQ1aIP0UZNIBxHKNHqxzR0L0n6gysNr2KT3841NATw==} '@supabase/node-fetch@2.6.15': resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} @@ -4338,11 +4360,11 @@ packages: peerDependencies: '@supabase/supabase-js': ^2.43.4 - '@supabase/storage-js@2.12.1': - resolution: {integrity: sha512-QWg3HV6Db2J81VQx0PqLq0JDBn4Q8B1FYn1kYcbla8+d5WDmTdwwMr+EJAxNOSs9W4mhKMv+EYCpCrTFlTj4VQ==} + '@supabase/storage-js@2.12.2': + resolution: {integrity: sha512-SiySHxi3q7gia7NBYpsYRu8gyI0NhFwSORMxbZIxJ/zAVkN6QpwDRan158CJ+UdzD4WB/rQMAGRqIJQP+7ccAQ==} - '@supabase/supabase-js@2.57.4': - resolution: {integrity: sha512-LcbTzFhHYdwfQ7TRPfol0z04rLEyHabpGYANME6wkQ/kLtKNmI+Vy+WEM8HxeOZAtByUFxoUTTLwhXmrh+CcVw==} + '@supabase/supabase-js@2.58.0': + resolution: {integrity: sha512-Tm1RmQpoAKdQr4/8wiayGti/no+If7RtveVZjHR8zbO7hhQjmPW2Ok5ZBPf1MGkt5c+9R85AVMsTfSaqAP1sUg==} '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -4620,8 +4642,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.15': + resolution: {integrity: sha512-+kLxJpaJzXybyDyFXYADyP1cznTO8HSuBpenGlnKOAkH4hyNINiywvXS/tGJhsrGGP/gM185RA3xpjY0Yg4erA==} '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} @@ -4641,9 +4663,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -4911,11 +4930,11 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ai@5.0.51: - resolution: {integrity: sha512-ToKW099QWUJNqePZbWGg8FSfxTxS3UN9U6yCla8rYdW0EBTDNPnpRwK1N6ER9TfV+dFtdUu+ZgKSlhQnEThriQ==} + 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-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} @@ -5900,10 +5919,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} - fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -6235,8 +6250,8 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.14.2: - resolution: {integrity: sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw==} + import-in-the-middle@1.14.4: + resolution: {integrity: sha512-eWjxh735SJLFJJDs5X82JQ2405OdJeAHDBnaoFCfdr5GVc7AWc9xU7KbrF+3Xd5F2ccP1aQFKtY+65X6EfKZ7A==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -7275,8 +7290,8 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.11.0: - resolution: {integrity: sha512-+YIodBB9sxcWeR8PrXC2K3gEDyfkUuVEITOcbqrfcj+z5QW4ioIcqZfYFbrLTYLsmAwunbS7nfU/dpBB6PZc1g==} + pino@9.12.0: + resolution: {integrity: sha512-0Gd0OezGvqtqMwgYxpL7P0pSHHzTJ0Lx992h+mNlMtRVfNnqweWmf0JmRWk5gJzHalyd2mxTzKjhiNbGS2Ztfw==} hasBin: true pkce-challenge@5.0.0: @@ -7688,10 +7703,10 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@15.7.3: - resolution: {integrity: sha512-AANws4tOE+QSq/IeMF/ncoHlMNZaVLxpa5uUGW1wjike68elVYr0018L9xYoqBr1OFO7G7boDPrbn0HpMCJxTw==} + react-i18next@16.0.0: + resolution: {integrity: sha512-JQ+dFfLnFSKJQt7W01lJHWRC0SX7eDPobI+MSTJ3/gP39xH2g33AuTE7iddAfXYHamJdAeMGM0VFboPaD3G68Q==} peerDependencies: - i18next: '>= 25.4.1' + i18next: '>= 25.5.2' react: '>= 16.8.0' react-dom: '*' react-native: '*' @@ -7858,8 +7873,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.52.2: - resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==} + rollup@4.52.3: + resolution: {integrity: sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -8038,6 +8053,9 @@ packages: slate@0.91.4: resolution: {integrity: sha512-aUJ3rpjrdi5SbJ5G1Qjr3arytfRkEStTmHjBfWq2A2Q8MybacIzkScSvGJjQkdTk3djCK9C9SEOt39sSeZFwTw==} + slow-redact@0.3.0: + resolution: {integrity: sha512-cf723wn9JeRIYP9tdtd86GuqoR5937u64Io+CYjlm2i7jvu7g0H+Cp0l0ShAf/4ZL+ISUTVT+8Qzz7RZmp9FjA==} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -8187,8 +8205,8 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - supabase@2.45.5: - resolution: {integrity: sha512-/toOX6bHYx2TUNA5AtlzrKKfvctbLQ8R6QqvUCAT20KtZOkR14HpBYav3TNDaU5owPeB58cT5Uftvxw36Tb95A==} + supabase@2.47.2: + resolution: {integrity: sha512-YvjjJXt21GsYvMBBJN3aKoGZf8QkCWU3hX5So/KsLRweY1YDu9mcEsrMdWp3ZYKQhoEMl9jDHG58SEQuFWGUfg==} engines: {npm: '>=8'} hasBin: true @@ -8242,8 +8260,8 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - tar@7.4.4: - resolution: {integrity: sha512-O1z7ajPkjTgEgmTGz0v9X4eqeEXTDREPTO77pVC1Nbs86feBU1Zhdg+edzavPmYW1olxkwsqA2v4uOw6E8LeDg==} + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} engines: {node: '>=18'} terser-webpack-plugin@5.3.14: @@ -8732,19 +8750,19 @@ snapshots: optionalDependencies: graphql: 16.11.0 - '@ai-sdk/gateway@1.0.28(zod@3.25.76)': + '@ai-sdk/gateway@1.0.30(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/openai@2.0.34(zod@3.25.76)': + '@ai-sdk/openai@2.0.38(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.9(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.10(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.0.0 @@ -8783,43 +8801,43 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-sesv2@3.893.0': + '@aws-sdk/client-sesv2@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/credential-provider-node': 3.893.0 + '@aws-sdk/core': 3.896.0 + '@aws-sdk/credential-provider-node': 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/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/util-user-agent-node': 3.896.0 '@smithy/config-resolver': 4.2.2 - '@smithy/core': 3.11.1 + '@smithy/core': 3.13.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.5 + '@smithy/middleware-retry': 4.3.1 '@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.5 '@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.5 + '@smithy/util-defaults-mode-node': 4.1.5 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -8828,41 +8846,41 @@ snapshots: 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.13.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.5 + '@smithy/middleware-retry': 4.3.1 '@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.5 '@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.5 + '@smithy/util-defaults-mode-node': 4.1.5 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -8871,54 +8889,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.13.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.5 '@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.5 '@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 @@ -8928,14 +8944,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 @@ -8945,20 +8961,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 @@ -8967,10 +8983,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 @@ -9000,16 +9016,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.13.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.5 '@smithy/types': 4.5.0 '@smithy/util-config-provider': 4.1.0 '@smithy/util-middleware': 4.1.1 @@ -9017,51 +9033,51 @@ snapshots: '@smithy/util-utf8': 4.1.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.13.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.13.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.5 + '@smithy/middleware-retry': 4.3.1 '@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.5 '@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.5 + '@smithy/util-defaults-mode-node': 4.1.5 '@smithy/util-endpoints': 3.1.2 '@smithy/util-middleware': 4.1.1 '@smithy/util-retry': 4.1.2 @@ -9079,19 +9095,19 @@ snapshots: '@smithy/util-middleware': 4.1.1 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 @@ -9109,7 +9125,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 @@ -9128,17 +9144,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': {} @@ -9691,7 +9708,7 @@ snapshots: '@react-types/switch': 3.5.14(react@19.1.1) '@react-types/table': 3.13.3(react@19.1.1) '@react-types/tabs': 3.3.18(react@19.1.1) - '@types/react': 19.1.13 + '@types/react': 19.1.15 emery: 1.4.4 facepaint: 1.2.1 react: 19.1.1 @@ -9709,7 +9726,7 @@ snapshots: '@floating-ui/react': 0.24.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@internationalized/string': 3.2.7 '@keystar/ui': 0.7.19(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@markdoc/markdoc': 0.4.0(@types/react@19.1.13)(react@19.1.1) + '@markdoc/markdoc': 0.4.0(@types/react@19.1.15)(react@19.1.1) '@react-aria/focus': 3.21.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@react-aria/i18n': 3.12.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@react-aria/interactions': 3.25.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -9726,7 +9743,7 @@ snapshots: '@sindresorhus/slugify': 1.1.2 '@toeverything/y-indexeddb': 0.10.0-canary.9(yjs@13.6.27) '@ts-gql/tag': 0.7.3(graphql@16.11.0) - '@types/react': 19.1.13 + '@types/react': 19.1.15 '@urql/core': 5.2.0(graphql@16.11.0) '@urql/exchange-auth': 2.2.1(@urql/core@5.2.0(graphql@16.11.0)) '@urql/exchange-graphcache': 7.2.4(@urql/core@5.2.0(graphql@16.11.0))(graphql@16.11.0) @@ -9783,7 +9800,7 @@ snapshots: dependencies: '@babel/runtime': 7.28.4 '@keystatic/core': 0.5.48(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@types/react': 19.1.13 + '@types/react': 19.1.15 chokidar: 3.6.0 next: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 @@ -9792,16 +9809,16 @@ snapshots: '@lemonsqueezy/lemonsqueezy.js@4.0.0': {} - '@makerkit/data-loader-supabase-core@0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4)': + '@makerkit/data-loader-supabase-core@0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.58.0)': dependencies: '@supabase/postgrest-js': 1.21.4 - '@supabase/supabase-js': 2.57.4 + '@supabase/supabase-js': 2.58.0 ts-case-convert: 2.1.0 - '@makerkit/data-loader-supabase-nextjs@1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4)(@tanstack/react-query@5.90.2(react@19.1.1))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': + '@makerkit/data-loader-supabase-nextjs@1.2.5(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.58.0)(@tanstack/react-query@5.90.2(react@19.1.1))(next@15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)': dependencies: - '@makerkit/data-loader-supabase-core': 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.57.4) - '@supabase/supabase-js': 2.57.4 + '@makerkit/data-loader-supabase-core': 0.0.10(@supabase/postgrest-js@1.21.4)(@supabase/supabase-js@2.58.0) + '@supabase/supabase-js': 2.58.0 '@tanstack/react-query': 5.90.2(react@19.1.1) next: 15.5.4(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 @@ -9837,17 +9854,17 @@ snapshots: js-yaml: 4.1.0 tinyglobby: 0.2.15 - '@markdoc/markdoc@0.4.0(@types/react@19.1.13)(react@19.1.1)': + '@markdoc/markdoc@0.4.0(@types/react@19.1.15)(react@19.1.1)': optionalDependencies: '@types/markdown-it': 12.2.3 - '@types/react': 19.1.13 + '@types/react': 19.1.15 react: 19.1.1 - '@markdoc/markdoc@0.5.4(@types/react@19.1.13)(react@19.1.1)': + '@markdoc/markdoc@0.5.4(@types/react@19.1.15)(react@19.1.1)': optionalDependencies: '@types/linkify-it': 3.0.5 '@types/markdown-it': 12.2.3 - '@types/react': 19.1.13 + '@types/react': 19.1.15 react: 19.1.1 '@marsidev/react-turnstile@1.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': @@ -9855,7 +9872,7 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@modelcontextprotocol/sdk@1.18.1': + '@modelcontextprotocol/sdk@1.18.2': dependencies: ajv: 6.12.6 content-type: 1.0.5 @@ -10150,7 +10167,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.204.0 - import-in-the-middle: 1.14.2 + import-in-the-middle: 1.14.4 require-in-the-middle: 7.5.2 transitivePeerDependencies: - supports-color @@ -10160,7 +10177,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.57.2 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.14.2 + import-in-the-middle: 1.14.4 require-in-the-middle: 7.5.2 semver: 7.7.2 shimmer: 1.2.1 @@ -10218,750 +10235,750 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accessible-icon@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-accessible-icon@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@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.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-accordion@1.2.12(@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-accordion@1.2.12(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@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.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-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-alert-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-alert-dialog@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-aspect-ratio@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-aspect-ratio@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-avatar@1.1.10(@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-avatar@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@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-is-hydrated': 0.1.0(@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-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-checkbox@1.3.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-checkbox@1.3.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 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-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-collapsible@1.1.12(@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-collapsible@1.1.12(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-use-controllable-state': 1.2.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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@radix-ui/react-context-menu@2.2.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-context-menu@2.2.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@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-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-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-form@0.1.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-form@0.1.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-label': 2.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-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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-hover-card@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-hover-card@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) '@radix-ui/react-icons@1.3.2(react@19.1.1)': dependencies: react: 19.1.1 - '@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.15)(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.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@radix-ui/react-label@2.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-label@2.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-menubar@1.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-menubar@1.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-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-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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-navigation-menu@1.2.14(@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-navigation-menu@1.2.14(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-id': 1.1.1(@types/react@19.1.13)(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-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-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@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-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-one-time-password-field@0.1.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-one-time-password-field@0.1.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@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-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-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@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-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-password-toggle-field@0.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-password-toggle-field@0.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-use-effect-event': 0.0.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-popover@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-popover@1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-progress@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-progress@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@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-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-radio-group@1.3.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-radio-group@1.3.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-direction': 1.1.1(@types/react@19.1.13)(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-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 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-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-scroll-area@1.2.10(@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-scroll-area@1.2.10(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@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-direction': 1.1.1(@types/react@19.1.13)(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-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-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-select@2.2.6(@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-select@2.2.6(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@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-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-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-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 1.1.1(@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-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-separator@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-separator@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-slider@1.3.6(@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-slider@1.3.6(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/number': 1.1.1 '@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-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-use-layout-effect': 1.1.1(@types/react@19.1.13)(react@19.1.1) - '@radix-ui/react-use-previous': 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-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15)(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.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@radix-ui/react-switch@1.2.6(@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-switch@1.2.6(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-use-previous': 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-compose-refs': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-tabs@1.1.13(@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-tabs@1.1.13(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@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-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-use-controllable-state': 1.2.2(@types/react@19.1.13)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-toast@1.2.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-toast@1.2.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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-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-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-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-use-layout-effect': 1.1.1(@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-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-toggle-group@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-toggle-group@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@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-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-toggle': 1.1.10(@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-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-toggle@1.1.10(@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-toggle@1.1.10(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@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-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@radix-ui/react-toolbar@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-toolbar@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@radix-ui/primitive': 1.1.3 - '@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-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-separator': 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-toggle-group': 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-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) - '@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.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15)(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.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15)(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.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.15)(react@19.1.1)': dependencies: react: 19.1.1 use-sync-external-store: 1.5.0(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.13)(react@19.1.1)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.15)(react@19.1.1)': dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15)(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.15 - '@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.15)(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.15)(react@19.1.1) react: 19.1.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) '@radix-ui/rect@1.1.1': {} @@ -11547,7 +11564,7 @@ snapshots: dependencies: react: 19.1.1 - '@react-email/components@0.5.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@react-email/components@0.5.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@react-email/body': 0.1.0(react@19.1.1) '@react-email/button': 0.2.0(react@19.1.1) @@ -11564,7 +11581,7 @@ snapshots: '@react-email/link': 0.0.12(react@19.1.1) '@react-email/markdown': 0.0.15(react@19.1.1) '@react-email/preview': 0.0.13(react@19.1.1) - '@react-email/render': 1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@react-email/render': 1.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@react-email/row': 0.0.12(react@19.1.1) '@react-email/section': 0.0.16(react@19.1.1) '@react-email/tailwind': 1.2.2(react@19.1.1) @@ -11614,7 +11631,7 @@ snapshots: dependencies: react: 19.1.1 - '@react-email/render@1.3.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@react-email/render@1.3.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: html-to-text: 9.0.5 prettier: 3.6.2 @@ -12001,9 +12018,9 @@ snapshots: '@react-types/shared': 3.32.0(react@19.1.1) react: 19.1.1 - '@rollup/plugin-commonjs@28.0.1(rollup@4.52.2)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.52.3)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.52.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.3) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -12011,80 +12028,80 @@ snapshots: magic-string: 0.30.19 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.2 + rollup: 4.52.3 - '@rollup/pluginutils@5.3.0(rollup@4.52.2)': + '@rollup/pluginutils@5.3.0(rollup@4.52.3)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.2 + rollup: 4.52.3 - '@rollup/rollup-android-arm-eabi@4.52.2': + '@rollup/rollup-android-arm-eabi@4.52.3': optional: true - '@rollup/rollup-android-arm64@4.52.2': + '@rollup/rollup-android-arm64@4.52.3': optional: true - '@rollup/rollup-darwin-arm64@4.52.2': + '@rollup/rollup-darwin-arm64@4.52.3': optional: true - '@rollup/rollup-darwin-x64@4.52.2': + '@rollup/rollup-darwin-x64@4.52.3': optional: true - '@rollup/rollup-freebsd-arm64@4.52.2': + '@rollup/rollup-freebsd-arm64@4.52.3': optional: true - '@rollup/rollup-freebsd-x64@4.52.2': + '@rollup/rollup-freebsd-x64@4.52.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.2': + '@rollup/rollup-linux-arm-gnueabihf@4.52.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.2': + '@rollup/rollup-linux-arm-musleabihf@4.52.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.2': + '@rollup/rollup-linux-arm64-gnu@4.52.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.2': + '@rollup/rollup-linux-arm64-musl@4.52.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.2': + '@rollup/rollup-linux-loong64-gnu@4.52.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.2': + '@rollup/rollup-linux-ppc64-gnu@4.52.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.2': + '@rollup/rollup-linux-riscv64-gnu@4.52.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.2': + '@rollup/rollup-linux-riscv64-musl@4.52.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.2': + '@rollup/rollup-linux-s390x-gnu@4.52.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.2': + '@rollup/rollup-linux-x64-gnu@4.52.3': optional: true - '@rollup/rollup-linux-x64-musl@4.52.2': + '@rollup/rollup-linux-x64-musl@4.52.3': optional: true - '@rollup/rollup-openharmony-arm64@4.52.2': + '@rollup/rollup-openharmony-arm64@4.52.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.2': + '@rollup/rollup-win32-arm64-msvc@4.52.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.2': + '@rollup/rollup-win32-ia32-msvc@4.52.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.2': + '@rollup/rollup-win32-x64-gnu@4.52.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.2': + '@rollup/rollup-win32-x64-msvc@4.52.3': optional: true '@rtsao/scc@1.1.0': {} @@ -12096,33 +12113,33 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@sentry-internal/browser-utils@10.14.0': + '@sentry-internal/browser-utils@10.15.0': dependencies: - '@sentry/core': 10.14.0 + '@sentry/core': 10.15.0 - '@sentry-internal/feedback@10.14.0': + '@sentry-internal/feedback@10.15.0': dependencies: - '@sentry/core': 10.14.0 + '@sentry/core': 10.15.0 - '@sentry-internal/replay-canvas@10.14.0': + '@sentry-internal/replay-canvas@10.15.0': dependencies: - '@sentry-internal/replay': 10.14.0 - '@sentry/core': 10.14.0 + '@sentry-internal/replay': 10.15.0 + '@sentry/core': 10.15.0 - '@sentry-internal/replay@10.14.0': + '@sentry-internal/replay@10.15.0': dependencies: - '@sentry-internal/browser-utils': 10.14.0 - '@sentry/core': 10.14.0 + '@sentry-internal/browser-utils': 10.15.0 + '@sentry/core': 10.15.0 '@sentry/babel-plugin-component-annotate@4.3.0': {} - '@sentry/browser@10.14.0': + '@sentry/browser@10.15.0': dependencies: - '@sentry-internal/browser-utils': 10.14.0 - '@sentry-internal/feedback': 10.14.0 - '@sentry-internal/replay': 10.14.0 - '@sentry-internal/replay-canvas': 10.14.0 - '@sentry/core': 10.14.0 + '@sentry-internal/browser-utils': 10.15.0 + '@sentry-internal/feedback': 10.15.0 + '@sentry-internal/replay': 10.15.0 + '@sentry-internal/replay-canvas': 10.15.0 + '@sentry/core': 10.15.0 '@sentry/bundler-plugin-core@4.3.0': dependencies: @@ -12182,25 +12199,25 @@ snapshots: - encoding - supports-color - '@sentry/core@10.14.0': {} + '@sentry/core@10.15.0': {} - '@sentry/nextjs@10.14.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3)': + '@sentry/nextjs@10.15.0(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(next@15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1)(webpack@5.101.3)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.37.0 - '@rollup/plugin-commonjs': 28.0.1(rollup@4.52.2) - '@sentry-internal/browser-utils': 10.14.0 + '@rollup/plugin-commonjs': 28.0.1(rollup@4.52.3) + '@sentry-internal/browser-utils': 10.15.0 '@sentry/bundler-plugin-core': 4.3.0 - '@sentry/core': 10.14.0 - '@sentry/node': 10.14.0 - '@sentry/opentelemetry': 10.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - '@sentry/react': 10.14.0(react@19.1.1) - '@sentry/vercel-edge': 10.14.0 + '@sentry/core': 10.15.0 + '@sentry/node': 10.15.0 + '@sentry/opentelemetry': 10.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/react': 10.15.0(react@19.1.1) + '@sentry/vercel-edge': 10.15.0 '@sentry/webpack-plugin': 4.3.0(webpack@5.101.3) chalk: 3.0.0 next: 15.5.4(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.55.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) resolve: 1.22.8 - rollup: 4.52.2 + rollup: 4.52.3 stacktrace-parser: 0.1.11 transitivePeerDependencies: - '@opentelemetry/context-async-hooks' @@ -12211,7 +12228,7 @@ snapshots: - supports-color - webpack - '@sentry/node-core@10.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': + '@sentry/node-core@10.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) @@ -12220,11 +12237,11 @@ snapshots: '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@sentry/core': 10.14.0 - '@sentry/opentelemetry': 10.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - import-in-the-middle: 1.14.2 + '@sentry/core': 10.15.0 + '@sentry/opentelemetry': 10.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + import-in-the-middle: 1.14.4 - '@sentry/node@10.14.0': + '@sentry/node@10.15.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) @@ -12256,35 +12273,35 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 '@prisma/instrumentation': 6.15.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.14.0 - '@sentry/node-core': 10.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - '@sentry/opentelemetry': 10.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - import-in-the-middle: 1.14.2 + '@sentry/core': 10.15.0 + '@sentry/node-core': 10.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/opentelemetry': 10.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + import-in-the-middle: 1.14.4 minimatch: 9.0.5 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@10.14.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': + '@sentry/opentelemetry@10.15.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.37.0 - '@sentry/core': 10.14.0 + '@sentry/core': 10.15.0 - '@sentry/react@10.14.0(react@19.1.1)': + '@sentry/react@10.15.0(react@19.1.1)': dependencies: - '@sentry/browser': 10.14.0 - '@sentry/core': 10.14.0 + '@sentry/browser': 10.15.0 + '@sentry/core': 10.15.0 hoist-non-react-statics: 3.3.2 react: 19.1.1 - '@sentry/vercel-edge@10.14.0': + '@sentry/vercel-edge@10.15.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.14.0 + '@sentry/core': 10.15.0 '@sentry/webpack-plugin@4.3.0(webpack@5.101.3)': dependencies: @@ -12319,7 +12336,7 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/core@3.11.1': + '@smithy/core@3.13.0': dependencies: '@smithy/middleware-serde': 4.1.1 '@smithy/protocol-http': 5.2.1 @@ -12329,9 +12346,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: @@ -12375,9 +12391,9 @@ snapshots: '@smithy/types': 4.5.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.2.3': + '@smithy/middleware-endpoint@4.2.5': dependencies: - '@smithy/core': 3.11.1 + '@smithy/core': 3.13.0 '@smithy/middleware-serde': 4.1.1 '@smithy/node-config-provider': 4.2.2 '@smithy/shared-ini-file-loader': 4.2.0 @@ -12386,18 +12402,17 @@ snapshots: '@smithy/util-middleware': 4.1.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.2.4': + '@smithy/middleware-retry@4.3.1': 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.5 '@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: @@ -12466,10 +12481,10 @@ snapshots: '@smithy/util-utf8': 4.1.0 tslib: 2.8.1 - '@smithy/smithy-client@4.6.3': + '@smithy/smithy-client@4.6.5': dependencies: - '@smithy/core': 3.11.1 - '@smithy/middleware-endpoint': 4.2.3 + '@smithy/core': 3.13.0 + '@smithy/middleware-endpoint': 4.2.5 '@smithy/middleware-stack': 4.1.1 '@smithy/protocol-http': 5.2.1 '@smithy/types': 4.5.0 @@ -12514,21 +12529,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.1.3': + '@smithy/util-defaults-mode-browser@4.1.5': dependencies: '@smithy/property-provider': 4.1.1 - '@smithy/smithy-client': 4.6.3 + '@smithy/smithy-client': 4.6.5 '@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.5': 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.5 '@smithy/types': 4.5.0 tslib: 2.8.1 @@ -12578,6 +12593,10 @@ snapshots: '@smithy/util-buffer-from': 4.1.0 tslib: 2.8.1 + '@smithy/uuid@1.0.0': + dependencies: + tslib: 2.8.1 + '@standard-schema/spec@1.0.0': {} '@standard-schema/utils@0.3.0': {} @@ -12591,11 +12610,11 @@ snapshots: '@stripe/stripe-js@7.9.0': {} - '@supabase/auth-js@2.71.1': + '@supabase/auth-js@2.72.0': dependencies: '@supabase/node-fetch': 2.6.15 - '@supabase/functions-js@2.4.6': + '@supabase/functions-js@2.5.0': dependencies: '@supabase/node-fetch': 2.6.15 @@ -12617,23 +12636,23 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/ssr@0.7.0(@supabase/supabase-js@2.57.4)': + '@supabase/ssr@0.7.0(@supabase/supabase-js@2.58.0)': dependencies: - '@supabase/supabase-js': 2.57.4 + '@supabase/supabase-js': 2.58.0 cookie: 1.0.2 - '@supabase/storage-js@2.12.1': + '@supabase/storage-js@2.12.2': dependencies: '@supabase/node-fetch': 2.6.15 - '@supabase/supabase-js@2.57.4': + '@supabase/supabase-js@2.58.0': dependencies: - '@supabase/auth-js': 2.71.1 - '@supabase/functions-js': 2.4.6 + '@supabase/auth-js': 2.72.0 + '@supabase/functions-js': 2.5.0 '@supabase/node-fetch': 2.6.15 '@supabase/postgrest-js': 1.21.4 '@supabase/realtime-js': 2.15.5 - '@supabase/storage-js': 2.12.1 + '@supabase/storage-js': 2.12.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12911,7 +12930,7 @@ snapshots: '@types/nodemailer@7.0.1': dependencies: - '@aws-sdk/client-sesv2': 3.893.0 + '@aws-sdk/client-sesv2': 3.896.0 '@types/node': 24.5.2 transitivePeerDependencies: - aws-crt @@ -12930,11 +12949,11 @@ snapshots: '@types/phoenix@1.6.6': {} - '@types/react-dom@19.1.9(@types/react@19.1.13)': + '@types/react-dom@19.1.9(@types/react@19.1.15)': dependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - '@types/react@19.1.13': + '@types/react@19.1.15': dependencies: csstype: 3.1.3 @@ -12954,8 +12973,6 @@ snapshots: '@types/unist@3.0.3': {} - '@types/uuid@9.0.8': {} - '@types/ws@8.18.1': dependencies: '@types/node': 24.5.2 @@ -13253,11 +13270,11 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@5.0.51(zod@3.25.76): + ai@5.0.56(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 1.0.28(zod@3.25.76) + '@ai-sdk/gateway': 1.0.30(zod@3.25.76) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.9(zod@3.25.76) + '@ai-sdk/provider-utils': 3.0.10(zod@3.25.76) '@opentelemetry/api': 1.9.0 zod: 3.25.76 @@ -13608,12 +13625,12 @@ snapshots: cmd-shim@7.0.0: {} - 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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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: @@ -14449,8 +14466,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-redact@3.5.0: {} - fast-safe-stringify@2.1.1: {} fast-uri@3.1.0: {} @@ -14805,7 +14820,7 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.14.2: + import-in-the-middle@1.14.4: dependencies: acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) @@ -16067,10 +16082,9 @@ snapshots: pino-std-serializers@7.0.0: {} - pino@9.11.0: + pino@9.12.0: dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 @@ -16078,6 +16092,7 @@ snapshots: quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 + slow-redact: 0.3.0 sonic-boom: 4.2.0 thread-stream: 3.1.0 @@ -16380,68 +16395,68 @@ snapshots: quick-format-unescaped@4.0.4: {} - radix-ui@1.4.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@1.4.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-accessible-icon': 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-accordion': 1.2.12(@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-alert-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-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-aspect-ratio': 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-avatar': 1.1.10(@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-checkbox': 1.3.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-collapsible': 1.1.12(@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.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-context-menu': 2.2.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-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-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-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-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-form': 0.1.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-hover-card': 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-label': 2.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-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-menubar': 1.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-navigation-menu': 1.2.14(@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-one-time-password-field': 0.1.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-password-toggle-field': 0.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-popover': 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-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-progress': 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-radio-group': 1.3.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-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-scroll-area': 1.2.10(@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-select': 2.2.6(@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-separator': 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-slider': 1.3.6(@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-switch': 1.2.6(@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-tabs': 1.1.13(@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-toast': 1.2.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-toggle': 1.1.10(@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-toggle-group': 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-toolbar': 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-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-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-use-effect-event': 0.0.2(@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-use-is-hydrated': 0.1.0(@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-size': 1.1.1(@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-accessible-icon': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-form': 0.1.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-select': 2.2.6(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15))(@types/react@19.1.15)(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.15)(react@19.1.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.15)(react@19.1.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.9(@types/react@19.1.15))(@types/react@19.1.15)(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.15 + '@types/react-dom': 19.1.9(@types/react@19.1.15) randombytes@2.1.0: dependencies: @@ -16486,7 +16501,7 @@ snapshots: dependencies: react: 19.1.1 - react-i18next@15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2): + react-i18next@16.0.0(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 @@ -16504,24 +16519,24 @@ snapshots: dependencies: fast-deep-equal: 2.0.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.15)(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.15)(react@19.1.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - 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.15)(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.15)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.15)(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.15)(react@19.1.1) + use-sidecar: 1.1.3(@types/react@19.1.15)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 react-smooth@4.0.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: @@ -16531,13 +16546,13 @@ snapshots: react-dom: 19.1.1(react@19.1.1) react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(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.15)(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.15 react-top-loading-bar@3.0.2(react@19.1.1): dependencies: @@ -16667,32 +16682,32 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.52.2: + rollup@4.52.3: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.2 - '@rollup/rollup-android-arm64': 4.52.2 - '@rollup/rollup-darwin-arm64': 4.52.2 - '@rollup/rollup-darwin-x64': 4.52.2 - '@rollup/rollup-freebsd-arm64': 4.52.2 - '@rollup/rollup-freebsd-x64': 4.52.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.2 - '@rollup/rollup-linux-arm-musleabihf': 4.52.2 - '@rollup/rollup-linux-arm64-gnu': 4.52.2 - '@rollup/rollup-linux-arm64-musl': 4.52.2 - '@rollup/rollup-linux-loong64-gnu': 4.52.2 - '@rollup/rollup-linux-ppc64-gnu': 4.52.2 - '@rollup/rollup-linux-riscv64-gnu': 4.52.2 - '@rollup/rollup-linux-riscv64-musl': 4.52.2 - '@rollup/rollup-linux-s390x-gnu': 4.52.2 - '@rollup/rollup-linux-x64-gnu': 4.52.2 - '@rollup/rollup-linux-x64-musl': 4.52.2 - '@rollup/rollup-openharmony-arm64': 4.52.2 - '@rollup/rollup-win32-arm64-msvc': 4.52.2 - '@rollup/rollup-win32-ia32-msvc': 4.52.2 - '@rollup/rollup-win32-x64-gnu': 4.52.2 - '@rollup/rollup-win32-x64-msvc': 4.52.2 + '@rollup/rollup-android-arm-eabi': 4.52.3 + '@rollup/rollup-android-arm64': 4.52.3 + '@rollup/rollup-darwin-arm64': 4.52.3 + '@rollup/rollup-darwin-x64': 4.52.3 + '@rollup/rollup-freebsd-arm64': 4.52.3 + '@rollup/rollup-freebsd-x64': 4.52.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.3 + '@rollup/rollup-linux-arm-musleabihf': 4.52.3 + '@rollup/rollup-linux-arm64-gnu': 4.52.3 + '@rollup/rollup-linux-arm64-musl': 4.52.3 + '@rollup/rollup-linux-loong64-gnu': 4.52.3 + '@rollup/rollup-linux-ppc64-gnu': 4.52.3 + '@rollup/rollup-linux-riscv64-gnu': 4.52.3 + '@rollup/rollup-linux-riscv64-musl': 4.52.3 + '@rollup/rollup-linux-s390x-gnu': 4.52.3 + '@rollup/rollup-linux-x64-gnu': 4.52.3 + '@rollup/rollup-linux-x64-musl': 4.52.3 + '@rollup/rollup-openharmony-arm64': 4.52.3 + '@rollup/rollup-win32-arm64-msvc': 4.52.3 + '@rollup/rollup-win32-ia32-msvc': 4.52.3 + '@rollup/rollup-win32-x64-gnu': 4.52.3 + '@rollup/rollup-win32-x64-msvc': 4.52.3 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -16945,6 +16960,8 @@ snapshots: is-plain-object: 5.0.0 tiny-warning: 1.0.3 + slow-redact@0.3.0: {} + smart-buffer@4.2.0: {} snake-case@2.1.0: @@ -17101,12 +17118,12 @@ snapshots: stylis@4.2.0: {} - supabase@2.45.5: + supabase@2.47.2: dependencies: bin-links: 5.0.0 https-proxy-agent: 7.0.6 node-fetch: 3.3.2 - tar: 7.4.4 + tar: 7.5.1 transitivePeerDependencies: - supports-color @@ -17162,7 +17179,7 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - tar@7.4.4: + tar@7.5.1: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -17454,20 +17471,20 @@ snapshots: react: 19.1.1 wonka: 6.3.5 - 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.15)(react@19.1.1): dependencies: react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.13 + '@types/react': 19.1.15 - use-sidecar@1.1.3(@types/react@19.1.13)(react@19.1.1): + use-sidecar@1.1.3(@types/react@19.1.15)(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.15 use-sync-external-store@1.5.0(react@19.1.1): dependencies: