diff --git a/demo/nextjs/app/.well-known/oauth-authorization-server/route.ts b/demo/nextjs/app/.well-known/oauth-authorization-server/route.ts new file mode 100644 index 00000000..c236fffd --- /dev/null +++ b/demo/nextjs/app/.well-known/oauth-authorization-server/route.ts @@ -0,0 +1,4 @@ +import { oAuthDiscoveryMetadata } from "better-auth/plugins"; +import { auth } from "../../../lib/auth"; + +export const GET = oAuthDiscoveryMetadata(auth); diff --git a/demo/nextjs/app/api/[transport]/route.ts b/demo/nextjs/app/api/[transport]/route.ts new file mode 100644 index 00000000..056410b4 --- /dev/null +++ b/demo/nextjs/app/api/[transport]/route.ts @@ -0,0 +1,38 @@ +import { createMcpHandler } from "@vercel/mcp-adapter"; +import { withMcpAuth } from "better-auth/plugins"; +import { z } from "zod"; +import { auth } from "@/lib/auth"; + +const handler = withMcpAuth(auth, (req, session) => { + return createMcpHandler( + (server) => { + server.tool( + "echo", + "Echo a message", + { message: z.string() }, + async ({ message }) => { + return { + content: [{ type: "text", text: `Tool echo: ${message}` }], + }; + }, + ); + }, + { + capabilities: { + tools: { + echo: { + description: "Echo a message", + }, + }, + }, + }, + { + redisUrl: process.env.REDIS_URL, + basePath: "/api", + verboseLogs: true, + maxDuration: 60, + }, + )(req); +}); + +export { handler as GET, handler as POST, handler as DELETE }; diff --git a/demo/nextjs/app/api/auth/[...all]/route.ts b/demo/nextjs/app/api/auth/[...all]/route.ts index 6cba29b7..5b67b064 100644 --- a/demo/nextjs/app/api/auth/[...all]/route.ts +++ b/demo/nextjs/app/api/auth/[...all]/route.ts @@ -1,10 +1,4 @@ import { auth } from "@/lib/auth"; import { toNextJsHandler } from "better-auth/next-js"; -import { NextRequest } from "next/server"; -export const { GET } = toNextJsHandler(auth); - -export const POST = async (req: NextRequest) => { - const res = await auth.handler(req); - return res; -}; +export const { GET, POST } = toNextJsHandler(auth); diff --git a/demo/nextjs/lib/auth.ts b/demo/nextjs/lib/auth.ts index 53691a45..45635944 100644 --- a/demo/nextjs/lib/auth.ts +++ b/demo/nextjs/lib/auth.ts @@ -8,8 +8,8 @@ import { oneTap, oAuthProxy, openAPI, - oidcProvider, customSession, + mcp, } from "better-auth/plugins"; import { reactInvitationEmail } from "./email/invitation"; import { LibsqlDialect } from "@libsql/kysely-libsql"; @@ -19,9 +19,9 @@ import { MysqlDialect } from "kysely"; import { createPool } from "mysql2/promise"; import { nextCookies } from "better-auth/next-js"; import { passkey } from "better-auth/plugins/passkey"; -import { expo } from "@better-auth/expo"; import { stripe } from "@better-auth/stripe"; import { Stripe } from "stripe"; +import Database from "better-sqlite3"; const from = process.env.BETTER_AUTH_EMAIL || "delivered@resend.dev"; const to = process.env.TEST_EMAIL || ""; @@ -52,10 +52,7 @@ const STARTER_PRICE_ID = { export const auth = betterAuth({ appName: "Better Auth Demo", - database: { - dialect, - type: process.env.USE_MYSQL ? "mysql" : "sqlite", - }, + database: new Database("auth.db"), emailVerification: { async sendVerificationEmail({ user, url }) { const res = await resend.emails.send({ @@ -117,6 +114,9 @@ export const auth = betterAuth({ }, }, plugins: [ + mcp({ + loginPage: "/sign-in", + }), organization({ async sendInvitationEmail(data) { await resend.emails.send({ @@ -160,9 +160,7 @@ export const auth = betterAuth({ multiSession(), oAuthProxy(), nextCookies(), - oidcProvider({ - loginPage: "/sign-in", - }), + oneTap(), customSession(async (session) => { return { @@ -198,7 +196,6 @@ export const auth = betterAuth({ ], }, }), - expo(), ], trustedOrigins: ["exp://"], }); diff --git a/docs/app/blog/[[...slug]]/page.tsx b/docs/app/blog/[[...slug]]/page.tsx new file mode 100644 index 00000000..7cf64d11 --- /dev/null +++ b/docs/app/blog/[[...slug]]/page.tsx @@ -0,0 +1,219 @@ +import { blogs } from "@/lib/source"; +import { notFound } from "next/navigation"; +import { absoluteUrl, formatDate } from "@/lib/utils"; +import DatabaseTable from "@/components/mdx/database-tables"; +import { cn } from "@/lib/utils"; +import { Step, Steps } from "fumadocs-ui/components/steps"; +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; +import { GenerateSecret } from "@/components/generate-secret"; +import { AnimatePresence } from "@/components/ui/fade-in"; +import { TypeTable } from "fumadocs-ui/components/type-table"; +import { Features } from "@/components/blocks/features"; +import { ForkButton } from "@/components/fork-button"; +import Link from "next/link"; +import defaultMdxComponents from "fumadocs-ui/mdx"; +import { File, Folder, Files } from "fumadocs-ui/components/files"; +import { Accordion, Accordions } from "fumadocs-ui/components/accordion"; +import { Pre } from "fumadocs-ui/components/codeblock"; +import { DocsBody } from "fumadocs-ui/page"; +import { Glow } from "../_components/default-changelog"; +import { IconLink } from "../_components/changelog-layout"; +import { BookIcon, GitHubIcon, XIcon } from "../_components/icons"; +import { DiscordLogoIcon } from "@radix-ui/react-icons"; +import { StarField } from "../_components/stat-field"; +import Image from "next/image"; + +const metaTitle = "Blogs"; +const metaDescription = "Latest changes , fixes and updates."; +const ogImage = "https://better-auth.com/release-og/changelog-og.png"; + +export default async function Page({ + params, +}: { + params: Promise<{ slug?: string[] }>; +}) { + const { slug } = await params; + const page = blogs.getPage(slug); + if (!page) { + notFound(); + } + const MDX = page.data?.body; + const toc = page.data?.toc; + const { title, description, date } = page.data; + return ( +
+
+ + + +
+
+
+ + + +
+

+ {title}{" "} +

+
+ +

{description}

+
+ By {page.data?.author.name} | {formatDate(page.data?.date)} +
+
+ {title} +
+
+
+ + Documentation + + + GitHub + + + Community + +
+

+ + BETTER-AUTH. + +

+
+
+
+
+ + ) => ( + + ), + Step, + Steps, + File, + Folder, + Files, + Tab, + Tabs, + Pre: Pre, + GenerateSecret, + AnimatePresence, + TypeTable, + Features, + ForkButton, + DatabaseTable, + Accordion, + Accordions, + }} + /> + +
+
+ ); +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ slug?: string[] }>; +}) { + const { slug } = await params; + if (!slug) { + return { + metadataBase: new URL("https://better-auth.com/blogs"), + title: metaTitle, + description: metaDescription, + openGraph: { + title: metaTitle, + description: metaDescription, + images: [ + { + url: ogImage, + }, + ], + url: "https://better-auth.com/blogs", + }, + twitter: { + card: "summary_large_image", + title: metaTitle, + description: metaDescription, + images: [ogImage], + }, + }; + } + const page = blogs.getPage(slug); + if (page == null) notFound(); + const baseUrl = process.env.NEXT_PUBLIC_URL || process.env.VERCEL_URL; + const url = new URL(`${baseUrl}/release-og/${slug.join("")}.png`); + const { title, description } = page.data; + + return { + title, + description, + openGraph: { + title, + description, + type: "website", + url: absoluteUrl(`blogs/${slug.join("")}`), + images: [ + { + url: url.toString(), + width: 1200, + height: 630, + alt: title, + }, + ], + }, + twitter: { + card: "summary_large_image", + title, + description, + images: [url.toString()], + }, + }; +} + +export function generateStaticParams() { + return blogs.generateParams(); +} diff --git a/docs/app/blog/_components/_layout.tsx b/docs/app/blog/_components/_layout.tsx new file mode 100644 index 00000000..4d2c0833 --- /dev/null +++ b/docs/app/blog/_components/_layout.tsx @@ -0,0 +1,110 @@ +import { useId } from "react"; + +import { Intro, IntroFooter } from "./changelog-layout"; +import { StarField } from "./stat-field"; + +function Timeline() { + let id = useId(); + + return ( +
+ + someone is +
+ ); +} + +function Glow() { + let id = useId(); + + return ( +
+ +
+
+ ); +} + +function FixedSidebar({ + main, + footer, +}: { + main: React.ReactNode; + footer: React.ReactNode; +}) { + return ( +
+ +
+
+
+
+ + {main} +
+
+
+ {footer} +
+
+
+
+ ); +} + +export function Layout({ children }: { children: React.ReactNode }) { + return ( + <> + } footer={} /> +
+
+ +
+ {children} +
+
+ + ); +} diff --git a/docs/app/blog/_components/changelog-layout.tsx b/docs/app/blog/_components/changelog-layout.tsx new file mode 100644 index 00000000..0da3ee83 --- /dev/null +++ b/docs/app/blog/_components/changelog-layout.tsx @@ -0,0 +1,135 @@ +import Link from "next/link"; +import { useId } from "react"; + +import clsx from "clsx"; +import { DiscordLogoIcon } from "@radix-ui/react-icons"; + +function BookIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function GitHubIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function FeedIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +function XIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +export function Intro() { + return ( + <> +

+ All of the changes made will be{" "} + available here. +

+

+ Better Auth is comprehensive authentication library for TypeScript that + provides a wide range of features to make authentication easier and more + secure. +

+
+
+ + Documentation + + + GitHub + + + Community + +
+ + ); +} + +export function IntroFooter() { + return ( +

+ Brought to you by{" "} + + BETTER-AUTH. + +

+ ); +} + +export function SignUpForm() { + let id = useId(); + + return ( +
+ + +
+
+ + ); +} + +export function IconLink({ + children, + className, + compact = false, + icon: Icon, + ...props +}: React.ComponentPropsWithoutRef & { + compact?: boolean; + icon?: React.ComponentType<{ className?: string }>; +}) { + return ( + + + {Icon && } + + {children} + + + ); +} diff --git a/docs/app/blog/_components/default-changelog.tsx b/docs/app/blog/_components/default-changelog.tsx new file mode 100644 index 00000000..544aaf58 --- /dev/null +++ b/docs/app/blog/_components/default-changelog.tsx @@ -0,0 +1,254 @@ +import Link from "next/link"; +import { useId } from "react"; +import { cn } from "@/lib/utils"; +import { IconLink } from "./changelog-layout"; +import { BookIcon, GitHubIcon, XIcon } from "./icons"; +import { DiscordLogoIcon } from "@radix-ui/react-icons"; +import { StarField } from "./stat-field"; +import { betterFetch } from "@better-fetch/fetch"; +import Markdown from "react-markdown"; +import defaultMdxComponents from "fumadocs-ui/mdx"; +import rehypeHighlight from "rehype-highlight"; +import "highlight.js/styles/dark.css"; + +export const dynamic = "force-static"; +const ChangelogPage = async () => { + const { data: releases } = await betterFetch< + { + id: number; + tag_name: string; + name: string; + body: string; + html_url: string; + prerelease: boolean; + published_at: string; + }[] + >("https://api.github.com/repos/better-auth/better-auth/releases"); + + const messages = releases + ?.filter((release) => !release.prerelease) + .map((release) => ({ + tag: release.tag_name, + title: release.name, + content: getContent(release.body), + date: new Date(release.published_at).toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }), + url: release.html_url, + })); + + function getContent(content: string) { + const lines = content.split("\n"); + const newContext = lines.map((line) => { + if (line.startsWith("- ")) { + const mainContent = line.split(";")[0]; + const context = line.split(";")[2]; + const mentions = context + ?.split(" ") + .filter((word) => word.startsWith("@")) + .map((mention) => { + const username = mention.replace("@", ""); + const avatarUrl = `https://github.com/${username}.png`; + return `[![${mention}](${avatarUrl})](https://github.com/${username})`; + }); + if (!mentions) { + return line; + } + // Remove   + return mainContent.replace(/ /g, "") + " – " + mentions.join(" "); + } + return line; + }); + return newContext.join("\n"); + } + + return ( +
+
+ + + +
+

+ All of the changes made will be{" "} + available here. +

+

+ Better Auth is comprehensive authentication library for TypeScript + that provides a wide range of features to make authentication easier + and more secure. +

+
+
+ + Documentation + + + GitHub + + + Community + +
+

+ + BETTER-AUTH. + +

+
+
+
+
+ +
+ ( + + ), + h2: (props) => ( +

+
+

+ ), + h3: (props) => ( +

+ {props.children?.toString()?.trim()} +
+

+ ), + p: (props) =>

, + ul: (props) => ( +

    + ), + li: (props) =>
  • , + a: ({ className, ...props }: any) => ( + + ), + strong: (props) => ( + + ), + img: (props) => ( + + ), + }} + > + {messages + ?.map((message) => { + return ` +## ${message.title} date=${message.date} + +${message.content} + `; + }) + .join("\n")} + +
+
+
+ ); +}; + +export default ChangelogPage; + +export function Glow() { + let id = useId(); + + return ( +
+ +
+
+ ); +} diff --git a/docs/app/blog/_components/fmt-dates.tsx b/docs/app/blog/_components/fmt-dates.tsx new file mode 100644 index 00000000..7b3841c2 --- /dev/null +++ b/docs/app/blog/_components/fmt-dates.tsx @@ -0,0 +1,25 @@ +import { cn } from "@/lib/utils"; + +const dateFormatter = new Intl.DateTimeFormat("en-US", { + year: "numeric", + month: "short", + day: "numeric", + timeZone: "UTC", +}); + +export function FormattedDate({ + date, + ...props +}: React.ComponentPropsWithoutRef<"time"> & { date: string | Date }) { + date = typeof date === "string" ? new Date(date) : date; + + return ( + + ); +} diff --git a/docs/app/blog/_components/icons.tsx b/docs/app/blog/_components/icons.tsx new file mode 100644 index 00000000..52d7b5f2 --- /dev/null +++ b/docs/app/blog/_components/icons.tsx @@ -0,0 +1,35 @@ +export function BookIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +export function GitHubIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +export function FeedIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} + +export function XIcon(props: React.ComponentPropsWithoutRef<"svg">) { + return ( + + ); +} diff --git a/docs/app/blog/_components/stat-field.tsx b/docs/app/blog/_components/stat-field.tsx new file mode 100644 index 00000000..5eeb89d2 --- /dev/null +++ b/docs/app/blog/_components/stat-field.tsx @@ -0,0 +1,219 @@ +"use client"; + +import { useEffect, useId, useRef } from "react"; +import clsx from "clsx"; +import { animate, Segment } from "motion/react"; + +type Star = [x: number, y: number, dim?: boolean, blur?: boolean]; + +const stars: Array = [ + [4, 4, true, true], + [4, 44, true], + [36, 22], + [50, 146, true, true], + [64, 43, true, true], + [76, 30, true], + [101, 116], + [140, 36, true], + [149, 134], + [162, 74, true], + [171, 96, true, true], + [210, 56, true, true], + [235, 90], + [275, 82, true, true], + [306, 6], + [307, 64, true, true], + [380, 68, true], + [380, 108, true, true], + [391, 148, true, true], + [405, 18, true], + [412, 86, true, true], + [426, 210, true, true], + [427, 56, true, true], + [538, 138], + [563, 88, true, true], + [611, 154, true, true], + [637, 150], + [651, 146, true], + [682, 70, true, true], + [683, 128], + [781, 82, true, true], + [785, 158, true], + [832, 146, true, true], + [852, 89], +]; + +const constellations: Array> = [ + [ + [247, 103], + [261, 86], + [307, 104], + [357, 36], + ], + [ + [586, 120], + [516, 100], + [491, 62], + [440, 107], + [477, 180], + [516, 100], + ], + [ + [733, 100], + [803, 120], + [879, 113], + [823, 164], + [803, 120], + ], +]; + +function Star({ + blurId, + point: [cx, cy, dim, blur], +}: { + blurId: string; + point: Star; +}) { + let groupRef = useRef>(null); + let ref = useRef>(null); + + useEffect(() => { + if (!groupRef.current || !ref.current) { + return; + } + + let delay = Math.random() * 2; + + let animations = [ + animate(groupRef.current, { opacity: 1 }, { duration: 4, delay }), + animate( + ref.current, + { + opacity: dim ? [0.2, 0.5] : [1, 0.6], + scale: dim ? [1, 1.2] : [1.2, 1], + }, + { + duration: 10, + delay, + }, + ), + ]; + + return () => { + for (let animation of animations) { + animation.cancel(); + } + }; + }, [dim]); + + return ( + + + + ); +} + +function Constellation({ + points, + blurId, +}: { + points: Array; + blurId: string; +}) { + let ref = useRef>(null); + let uniquePoints = points.filter( + (point, pointIndex) => + points.findIndex((p) => String(p) === String(point)) === pointIndex, + ); + let isFilled = uniquePoints.length !== points.length; + + useEffect(() => { + if (!ref.current) { + return; + } + + let sequence: Array = [ + [ + ref.current, + { strokeDashoffset: 0, visibility: "visible" }, + { duration: 5, delay: Math.random() * 3 + 2 }, + ], + ]; + + if (isFilled) { + sequence.push([ + ref.current, + { fill: "rgb(255 255 255 / 0.02)" }, + { duration: 1 }, + ]); + } + + let animation = animate(sequence); + + return () => { + animation.cancel(); + }; + }, [isFilled]); + + return ( + <> + + {uniquePoints.map((point, pointIndex) => ( + + ))} + + ); +} + +export function StarField({ className }: { className?: string }) { + let blurId = useId(); + + return ( + + ); +} diff --git a/docs/app/blog/layout.tsx b/docs/app/blog/layout.tsx new file mode 100644 index 00000000..3ce50d1d --- /dev/null +++ b/docs/app/blog/layout.tsx @@ -0,0 +1,18 @@ +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Blog - Better Auth", + description: "Latest updates, articles, and insights about Better Auth", +}; + +interface BlogLayoutProps { + children: React.ReactNode; +} + +export default function BlogLayout({ children }: BlogLayoutProps) { + return ( +
+
{children}
+
+ ); +} diff --git a/docs/app/blogs/layout.tsx b/docs/app/blogs/layout.tsx new file mode 100644 index 00000000..3ce50d1d --- /dev/null +++ b/docs/app/blogs/layout.tsx @@ -0,0 +1,18 @@ +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Blog - Better Auth", + description: "Latest updates, articles, and insights about Better Auth", +}; + +interface BlogLayoutProps { + children: React.ReactNode; +} + +export default function BlogLayout({ children }: BlogLayoutProps) { + return ( +
+
{children}
+
+ ); +} diff --git a/docs/app/blogs/page.tsx b/docs/app/blogs/page.tsx new file mode 100644 index 00000000..eebf0a91 --- /dev/null +++ b/docs/app/blogs/page.tsx @@ -0,0 +1,104 @@ +import { formatBlogDate } from "@/lib/blog"; +import Link from "next/link"; +import { blogs } from "@/lib/source"; +import { IconLink } from "../blog/_components/changelog-layout"; +import { GitHubIcon, BookIcon, XIcon } from "../blog/_components/icons"; +import { Glow } from "../blog/_components/default-changelog"; +import { StarField } from "../blog/_components/stat-field"; +import { DiscordLogoIcon } from "@radix-ui/react-icons"; + +export default async function BlogPage() { + const posts = blogs.getPages(); + + return ( +
+
+ + + +
+

+ Blogs +

+ +

+ Latest updates, articles, and insights about Better Auth +

+
+
+ + Documentation + + + GitHub + + + Community + +
+

+ + BETTER-AUTH. + +

+
+
+
+
+ {posts.map((post) => ( +
+
+ {/* {post.data?.image && ( + {post.data.title} + )} */} +
+

+ {formatBlogDate(post.data.date)} +

+

{post.data?.title}

+

+ {post.data?.description.substring(0, 100)}... +

+
+
+

+ {post.data.structuredData.contents[0].content.substring(0, 250)} + ... +

+ +

Read More

+ + + View Article + +
+ ))} +
+
+
+ ); +} diff --git a/docs/components/nav-bar.tsx b/docs/components/nav-bar.tsx index eab44a75..7a6ea987 100644 --- a/docs/components/nav-bar.tsx +++ b/docs/components/nav-bar.tsx @@ -115,7 +115,10 @@ export const navMenu = [ name: "docs", path: "/docs", }, - + { + name: "blog", + path: "/blogs", + }, { name: "changelogs", path: "/changelogs", diff --git a/docs/components/sidebar-content.tsx b/docs/components/sidebar-content.tsx index 2b9ae4b0..647a2817 100644 --- a/docs/components/sidebar-content.tsx +++ b/docs/components/sidebar-content.tsx @@ -1270,6 +1270,38 @@ C0.7,239.6,62.1,0.5,62.2,0.4c0,0,54,13.8,119.9,30.8S302.1,62,302.2,62c0.2,0,0.2, href: "/docs/plugins/api-key", icon: () => , }, + { + title: "MCP", + icon: () => ( + + + + + + ), + href: "/docs/plugins/mcp", + }, { title: "Organization", icon: () => , diff --git a/docs/content/blogs/mcp-auth.mdx b/docs/content/blogs/mcp-auth.mdx new file mode 100644 index 00000000..58952780 --- /dev/null +++ b/docs/content/blogs/mcp-auth.mdx @@ -0,0 +1,178 @@ +--- +title: Authenicating MCP servers +description: A deep dive into how to implement MCP auth with Better Auth & Vercel MCP adapter +date: 2025-05-19 +image: /images/blogs/mcp-auth.png +author: + name: Bereket Engida + avatar: /avatars/beka.jpg + twitter: imbereket +tags: + - mcp + - vercel + - ai + - nextjs + - neon +--- + +## Introduction + +[MCP](https://modelcontextprotocol.io) is an open protocol that standardizes how applications provide context to LLMs. It provides a standardized way to connect AI models to different data sources and tools. It's been sometime since the MCP spec by anthropic become a standard for building LLM based apps. + +The protocol covers both client and server implementations. When you make a server for MCP clients to connect to, one of the requirements is to have a proper way to authenticate and authorize them. The MCP spec recommends using [OAuth 2.0](https://oauth.net/2/) for this purpose with some additional requirements. + +In this article, we'll see how Better Auth MCP plugin integrates with your MCP server to authenticate and authorize MCP clients. + +## How Better Auth MCP Plugin Works + +The Better Auth MCP plugin implements the OAuth 2.0 authorization flow with some MCP-specific modifications. Let's break down how it works: + +### 1. OAuth Discovery Endpoint + +First, the plugin helps you expose an OAuth discovery endpoint at `/.well-known/oauth-authorization-server` that provides metadata about the authorization server: + + +```ts title=".well-known/oauth-authorization-server/route.ts" +import { oAuthDiscoveryMetadata } from "better-auth/plugins"; +import { auth } from "../../../lib/auth"; + +export const GET = oAuthDiscoveryMetadata(auth); +``` + +This endpoint returns standard OAuth metadata including: +- Authorization endpoint (`/mcp/authorize`) +- Token endpoint (`/mcp/token`) +- Supported scopes (`openid`, `profile`, `email`, `offline_access`) +- Supported response types (`code`) +- PKCE challenge methods (`S256`) + +### 2. Authorization Flow + +When an MCP client (like Claude Desktop) wants to connect to your server, it initiates the OAuth flow: + +1. The client makes a request to your authorization endpoint with: + - `client_id`: Unique identifier for the client + - `redirect_uri`: Where to send the authorization code + - `response_type`: Always "code" for MCP + - `code_challenge`: PKCE challenge for security + - `scope`: Requested permissions (e.g. "openid profile") + +2. If the client isn't registered yet (no `client_id`), it first needs to register using the dynamic client registration endpoint: + +```ts +// Client sends POST request to /mcp/register +{ + "redirect_uris": ["https://client.example.com/callback"], + "client_name": "My MCP Client", + "logo_uri": "https://client.example.com/logo.png", + "token_endpoint_auth_method": "client_secret_basic", + "grant_types": ["authorization_code"], + "response_types": ["code"], + "scope": "openid profile" +} + +// Server validates and responds with: +{ + "client_id": "generated-client-id", + "client_secret": "generated-client-secret", + "client_id_issued_at": 1683900000, + "client_secret_expires_at": 0 +} +``` + +3. Once registered (or if already registered), if the user isn't logged in, they're redirected to your login page: +```ts +await ctx.setSignedCookie( + 'oidc_login_prompt', + JSON.stringify(ctx.query), + ctx.context.secret, + { + maxAge: 600, + path: '/', + sameSite: 'lax', + } +); +throw ctx.redirect(`${options.loginPage}?${queryFromURL}`); +``` + +4. After login, the plugin validates: + - Client ID exists and is enabled + - Redirect URI matches registered URIs + - Requested scopes are valid + - PKCE challenge is present (if required) + +5. If everything is valid, it generates an authorization code: +```ts +const code = generateRandomString(32, "a-z", "A-Z", "0-9"); +const codeExpiresInMs = opts.codeExpiresIn * 1000; +const expiresAt = new Date(Date.now() + codeExpiresInMs); +``` + +### 3. Protecting Your MCP Server + +The plugin provides a `withMcpAuth` middleware to protect your MCP server routes: + +```ts +import { withMcpAuth } from "better-auth/plugins"; + +const handler = withMcpAuth(auth, (req, session) => { + // session contains the access token with scopes and user ID + return createMcpHandler( + (server) => { + // Define your MCP tools here + server.tool("echo", "Echo a message", + { message: z.string() }, + async ({ message }) => { + return { + content: [{ type: "text", text: message }], + }; + } + ); + }, + // ... rest of your MCP config + )(req); +}); +``` + + +or you can use `auth.api.getMcpSession` to get the session from the request headers. + +```ts +const session = await auth.api.getMcpSession({ + headers: req.headers +}); +``` + +Make sure to handle the unauthenticated case properly by returning a 401 status code. + +```ts +if (!session) { + return new Response(null, { + status: 401, + headers: { + "WWW-Authenticate": "Bearer" + } + }); +} +``` + +### 4. Configuration Options + +The plugin is highly configurable through the `mcp()` function: + +```ts +mcp({ + loginPage: "/sign-in", // Where to redirect for auth + oidcConfig: { + codeExpiresIn: 600, // Auth code expiry in seconds + accessTokenExpiresIn: 3600, // Access token expiry + refreshTokenExpiresIn: 604800, // Refresh token expiry + scopes: ["openid", "profile", "email"], // Supported scopes + requirePKCE: true, // Require PKCE security + } +}) +``` + +## Conclusion + +The Better Auth MCP plugin provides a secure and flexible way to authenticate and authorize MCP clients. It handles the OAuth flow, client registration, and session management, allowing you to focus on building your MCP server. diff --git a/docs/content/blogs/meta.json b/docs/content/blogs/meta.json new file mode 100644 index 00000000..47da3118 --- /dev/null +++ b/docs/content/blogs/meta.json @@ -0,0 +1,10 @@ +{ + "title": "Blog", + "description": "Latest updates, articles, and insights about Better Auth", + "items": [ + { + "title": "Latest", + "items": [] + } + ] +} diff --git a/docs/content/docs/plugins/mcp.mdx b/docs/content/docs/plugins/mcp.mdx new file mode 100644 index 00000000..03ee4ecf --- /dev/null +++ b/docs/content/docs/plugins/mcp.mdx @@ -0,0 +1,224 @@ +--- +title: MCP +description: MCP provider plugin for Better Auth +--- + +`OAuth` `MCP` + +The **MCP** plugin lets your app act as an OAuth provider for MCP clients. It handles authentication and makes it easy to issue and manage access tokens for MCP applications. + +## Installation + + + + ### Add the Plugin + + Add the MCP plugin to your auth configuration and specify the login page path. + + ```ts title="auth.ts" + import { betterAuth } from "better-auth"; + import { mcp } from "better-auth/plugins"; + + export const auth = betterAuth({ + plugins: [ + mcp({ + loginPage: "/sign-in" // path to your login page + }) + ] + }); + ``` + + This doesn't have a client plugin, so you don't need to make any changes to your authClient. + + + + + ### Generate Schema + + Run the migration or generate the schema to add the necessary fields and tables to the database. + + + + ```bash + npx @better-auth/cli migrate + ``` + + + ```bash + npx @better-auth/cli generate + ``` + + + The MCP plugin uses the same schema as the OIDC Provider plugin. See the [OIDC Provider Schema](#schema) section for details. + + + +## Usage + +### OAuth Discovery Metadata + +Add a route to expose OAuth metadata for MCP clients: + +```ts title=".well-known/oauth-authorization-server/route.ts" +import { oAuthDiscoveryMetadata } from "better-auth/plugins"; +import { auth } from "../../../lib/auth"; + +export const GET = oAuthDiscoveryMetadata(auth); +``` + +### MCP Session Handling + +You can use the helper function `withMcpAuth` to get the session and handle unauthenticated calls automatically. + + +```ts title="api/[transport]/route.ts" +import { auth } from "@/lib/auth"; +import { createMcpHandler } from "@vercel/mcp-adapter"; +import { withMcpAuth } from "better-auth/plugins"; +import { z } from "zod"; + +const handler = withMcpAuth(auth, (req, session) => { + // session contains the access token record with scopes and user ID + return createMcpHandler( + (server) => { + server.tool( + "echo", + "Echo a message", + { message: z.string() }, + async ({ message }) => { + return { + content: [{ type: "text", text: `Tool echo: ${message}` }], + }; + }, + ); + }, + { + capabilities: { + tools: { + echo: { + description: "Echo a message", + }, + }, + }, + }, + { + redisUrl: process.env.REDIS_URL, + basePath: "/api", + verboseLogs: true, + maxDuration: 60, + }, + )(req); +}); + +export { handler as GET, handler as POST, handler as DELETE }; +``` + +You can also use `auth.api.getMCPSession` to get the session using the access token sent from the MCP client: + +```ts title="api/[transport]/route.ts" +import { auth } from "@/lib/auth"; +import { createMcpHandler } from "@vercel/mcp-adapter"; +import { withMcpAuth } from "better-auth/plugins"; +import { z } from "zod"; + +const handler = async (req: Request) => { + // session contains the access token record with scopes and user ID + const session = await auth.api.getMCPSession({ + headers: req.headers + }) + if(!session){ + //this is important and you must return 401 + return new Response(null, { + status: 401 + }) + } + return createMcpHandler( + (server) => { + server.tool( + "echo", + "Echo a message", + { message: z.string() }, + async ({ message }) => { + return { + content: [{ type: "text", text: `Tool echo: ${message}` }], + }; + }, + ); + }, + { + capabilities: { + tools: { + echo: { + description: "Echo a message", + }, + }, + }, + }, + { + redisUrl: process.env.REDIS_URL, + basePath: "/api", + verboseLogs: true, + maxDuration: 60, + }, + )(req); +} + +export { handler as GET, handler as POST, handler as DELETE }; +``` + +## Configuration + +The MCP plugin accepts the following configuration options: + + + +### OIDC Configuration + +The plugin supports additional OIDC configuration options through the `oidcConfig` parameter: + + + +## Schema + +The MCP plugin uses the same schema as the OIDC Provider plugin. See the [OIDC Provider Schema](#schema) section for details. diff --git a/docs/lib/blog.ts b/docs/lib/blog.ts new file mode 100644 index 00000000..8f314ad8 --- /dev/null +++ b/docs/lib/blog.ts @@ -0,0 +1,76 @@ +import { readFile, readdir } from "fs/promises"; +import matter from "gray-matter"; +import { join } from "path"; +import { cache } from "react"; + +export interface BlogPost { + _id: string; + slug: string; + title: string; + description?: string; + date: string; + content: string; + image?: string; + author?: { + name: string; + avatar?: string; + twitter?: string; + }; + tags?: string[]; +} + +const BLOGS_PATH = join(process.cwd(), "docs/content/blogs"); + +export const getBlogPost = cache( + async (slug: string): Promise => { + try { + const filePath = join(BLOGS_PATH, `${slug}.mdx`); + const source = await readFile(filePath, "utf-8"); + const { data, content } = matter(source); + + return { + _id: slug, + slug, + content, + title: data.title, + description: data.description, + date: data.date, + image: data.image, + author: data.author, + tags: data.tags, + }; + } catch (error) { + return null; + } + }, +); + +export const getAllBlogPosts = cache(async (): Promise => { + try { + const files = await readdir(BLOGS_PATH); + const mdxFiles = files.filter((file) => file.endsWith(".mdx")); + + const posts = await Promise.all( + mdxFiles.map(async (file) => { + const slug = file.replace(/\.mdx$/, ""); + const post = await getBlogPost(slug); + return post; + }), + ); + + return posts + .filter((post): post is BlogPost => post !== null) + .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); + } catch (error) { + return []; + } +}); + +export function formatBlogDate(date: Date) { + let d = new Date(date); + return d.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + year: "numeric", + }); +} diff --git a/docs/lib/source.ts b/docs/lib/source.ts index 579c7be1..b8d7e4f2 100644 --- a/docs/lib/source.ts +++ b/docs/lib/source.ts @@ -1,4 +1,4 @@ -import { changelogCollection, docs } from "@/.source"; +import { changelogCollection, docs, blogCollection } from "@/.source"; import { loader } from "fumadocs-core/source"; import { createMDXSource } from "fumadocs-mdx"; @@ -11,3 +11,8 @@ export const changelogs = loader({ baseUrl: "/changelogs", source: createMDXSource(changelogCollection), }); + +export const blogs = loader({ + baseUrl: "/blogs", + source: createMDXSource(blogCollection), +}); diff --git a/docs/public/avatar/beka.jpg b/docs/public/avatar/beka.jpg new file mode 100644 index 00000000..0d0873e3 Binary files /dev/null and b/docs/public/avatar/beka.jpg differ diff --git a/docs/public/images/blogs/better auth (1).png b/docs/public/images/blogs/better auth (1).png new file mode 100644 index 00000000..3531e362 Binary files /dev/null and b/docs/public/images/blogs/better auth (1).png differ diff --git a/docs/source.config.ts b/docs/source.config.ts index 816f7e7a..329d0db1 100644 --- a/docs/source.config.ts +++ b/docs/source.config.ts @@ -20,6 +20,23 @@ export const changelogCollection = defineCollections({ }), }); +export const blogCollection = defineCollections({ + type: "doc", + dir: "./content/blogs", + schema: z.object({ + title: z.string(), + description: z.string(), + date: z.date(), + author: z.object({ + name: z.string(), + avatar: z.string(), + twitter: z.string(), + }), + image: z.string(), + tags: z.array(z.string()), + }), +}); + export default defineConfig({ mdxOptions: { remarkPlugins: [ diff --git a/examples/nextjs-mcp/.gitignore b/examples/nextjs-mcp/.gitignore new file mode 100644 index 00000000..5ef6a520 --- /dev/null +++ b/examples/nextjs-mcp/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/examples/nextjs-mcp/README.md b/examples/nextjs-mcp/README.md new file mode 100644 index 00000000..041eb61a --- /dev/null +++ b/examples/nextjs-mcp/README.md @@ -0,0 +1,93 @@ +# Better Auth - MCP Demo + +This is example repo on how to setup Better Auth for MCP Auth using Nextjs and Vercel MCP adapter. + + +## Usage + +First, add the plugin to your auth instance + +```ts +// auth.ts +import { betterAuth } from "better-auth"; +import { mcp } from "better-auth/plugins"; + +export cosnt auth = betterAuth({ + plugins: [ + mcp({ + loginPage: "/sign-in" // path to a page where users login + }) + ] +}) +``` + +Make sure to `generate` or `migrate` required schema using the cli: +```bash +npx @better-auth/cli generate ## or (migrate) +``` + +Add a route to expose oauth metadata + +```ts +// .well-known/oauth-authroization-server/route.ts +import { oAuthDiscoveryMetadata } from "better-auth/plugins"; +import { auth } from "../../../lib/auth"; + +export const GET = oAuthDiscoveryMetadata(auth); +``` + +Mount the handlers if you haven't + +```ts +// api/auth/[...all]/route.ts +import { auth } from "@/lib/auth"; +import { toNextJsHandler } from "better-auth/next-js"; + +export const { GET, POST } = toNextJsHandler(auth); +``` + +Use `auth.api.getMCPSession` to get the session using the access token sent from the MCP client + +```ts +import { auth } from "@/lib/auth"; +import { createMcpHandler } from "@vercel/mcp-adapter"; +import { withMcpAuth } from "better-auth/plugins"; +import { z } from "zod"; + +const handler = withMcpAuth(auth, (req, sesssion) => { + //session => This isn’t a typical Better Auth session - instead, it returns the access token record along with the scopes and user ID. + return createMcpHandler( + (server) => { + server.tool( + "echo", + "Echo a message", + { message: z.string() }, + async ({ message }) => { + return { + content: [{ type: "text", text: `Tool echo: ${message}` }], + }; + }, + ); + }, + { + capabilities: { + tools: { + echo: { + description: "Echo a message", + }, + }, + }, + }, + { + redisUrl: process.env.REDIS_URL, + basePath: "/api", + verboseLogs: true, + maxDuration: 60, + }, + )(req); +}); + +export { handler as GET, handler as POST, handler as DELETE }; +``` + +And that's it!! \ No newline at end of file diff --git a/examples/nextjs-mcp/app/.well-known/oauth-authorization-server/route.ts b/examples/nextjs-mcp/app/.well-known/oauth-authorization-server/route.ts new file mode 100644 index 00000000..c236fffd --- /dev/null +++ b/examples/nextjs-mcp/app/.well-known/oauth-authorization-server/route.ts @@ -0,0 +1,4 @@ +import { oAuthDiscoveryMetadata } from "better-auth/plugins"; +import { auth } from "../../../lib/auth"; + +export const GET = oAuthDiscoveryMetadata(auth); diff --git a/examples/nextjs-mcp/app/api/[transport]/route.ts b/examples/nextjs-mcp/app/api/[transport]/route.ts new file mode 100644 index 00000000..a8b9b5b6 --- /dev/null +++ b/examples/nextjs-mcp/app/api/[transport]/route.ts @@ -0,0 +1,38 @@ +import { auth } from "@/lib/auth"; +import { createMcpHandler } from "@vercel/mcp-adapter"; +import { withMcpAuth } from "better-auth/plugins"; +import { z } from "zod"; + +const handler = withMcpAuth(auth, (req, sesssion) => { + return createMcpHandler( + (server) => { + server.tool( + "echo", + "Echo a message", + { message: z.string() }, + async ({ message }) => { + return { + content: [{ type: "text", text: `Tool echo: ${message}` }], + }; + }, + ); + }, + { + capabilities: { + tools: { + echo: { + description: "Echo a message", + }, + }, + }, + }, + { + redisUrl: process.env.REDIS_URL, + basePath: "/api", + verboseLogs: true, + maxDuration: 60, + }, + )(req); +}); + +export { handler as GET, handler as POST, handler as DELETE }; diff --git a/examples/nextjs-mcp/app/api/auth/[...all]/route.ts b/examples/nextjs-mcp/app/api/auth/[...all]/route.ts new file mode 100644 index 00000000..5b67b064 --- /dev/null +++ b/examples/nextjs-mcp/app/api/auth/[...all]/route.ts @@ -0,0 +1,4 @@ +import { auth } from "@/lib/auth"; +import { toNextJsHandler } from "better-auth/next-js"; + +export const { GET, POST } = toNextJsHandler(auth); diff --git a/examples/nextjs-mcp/app/favicon.ico b/examples/nextjs-mcp/app/favicon.ico new file mode 100644 index 00000000..718d6fea Binary files /dev/null and b/examples/nextjs-mcp/app/favicon.ico differ diff --git a/examples/nextjs-mcp/app/globals.css b/examples/nextjs-mcp/app/globals.css new file mode 100644 index 00000000..a2dc41ec --- /dev/null +++ b/examples/nextjs-mcp/app/globals.css @@ -0,0 +1,26 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/examples/nextjs-mcp/app/layout.tsx b/examples/nextjs-mcp/app/layout.tsx new file mode 100644 index 00000000..7371307e --- /dev/null +++ b/examples/nextjs-mcp/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/examples/nextjs-mcp/app/login/page.tsx b/examples/nextjs-mcp/app/login/page.tsx new file mode 100644 index 00000000..358987a0 --- /dev/null +++ b/examples/nextjs-mcp/app/login/page.tsx @@ -0,0 +1,64 @@ +"use client"; + +import { authClient } from "@/lib/authClient"; +import { useState } from "react"; + +export default function Login() { + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const session = authClient.useSession(); + return ( +
+ {JSON.stringify({ session })} +

Sign Up

+
+

Name

+ setName(e.target.value)} + /> +
+
+

Email

+ setEmail(e.target.value)} + /> +
+
+

Password

+ setPassword(e.target.value)} + /> +
+ + +
+ ); +} diff --git a/examples/nextjs-mcp/app/page.tsx b/examples/nextjs-mcp/app/page.tsx new file mode 100644 index 00000000..721a4be1 --- /dev/null +++ b/examples/nextjs-mcp/app/page.tsx @@ -0,0 +1,103 @@ +import Image from "next/image"; + +export default function Home() { + return ( +
+
+ Next.js logo +
    +
  1. + Get started by editing{" "} + + app/page.tsx + + . +
  2. +
  3. + Save and see your changes instantly. +
  4. +
+ + +
+ +
+ ); +} diff --git a/examples/nextjs-mcp/lib/auth.ts b/examples/nextjs-mcp/lib/auth.ts new file mode 100644 index 00000000..d52c35a4 --- /dev/null +++ b/examples/nextjs-mcp/lib/auth.ts @@ -0,0 +1,16 @@ +import { betterAuth } from "better-auth"; +import { mcp } from "better-auth/plugins"; +import Database from "better-sqlite3"; + +export const auth = betterAuth({ + database: new Database("./auth.db"), + baseURL: "http://localhost:3000", + plugins: [ + mcp({ + loginPage: "/login", + }), + ], + emailAndPassword: { + enabled: true, + }, +}); diff --git a/examples/nextjs-mcp/lib/authClient.ts b/examples/nextjs-mcp/lib/authClient.ts new file mode 100644 index 00000000..f1012dd4 --- /dev/null +++ b/examples/nextjs-mcp/lib/authClient.ts @@ -0,0 +1,3 @@ +import { createAuthClient } from "better-auth/react"; + +export const authClient = createAuthClient(); diff --git a/examples/nextjs-mcp/next.config.ts b/examples/nextjs-mcp/next.config.ts new file mode 100644 index 00000000..7921f35d --- /dev/null +++ b/examples/nextjs-mcp/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/examples/nextjs-mcp/package.json b/examples/nextjs-mcp/package.json new file mode 100644 index 00000000..4a975e8d --- /dev/null +++ b/examples/nextjs-mcp/package.json @@ -0,0 +1,29 @@ +{ + "name": "nextjs-mcp", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@types/better-sqlite3": "^7.6.12", + "@vercel/mcp-adapter": "^0.4.1", + "better-auth": "workspace:^", + "better-sqlite3": "^11.6.0", + "next": "15.3.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "zod": "^3.24.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4", + "typescript": "^5" + } +} \ No newline at end of file diff --git a/examples/nextjs-mcp/postcss.config.mjs b/examples/nextjs-mcp/postcss.config.mjs new file mode 100644 index 00000000..f50127cd --- /dev/null +++ b/examples/nextjs-mcp/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/examples/nextjs-mcp/public/file.svg b/examples/nextjs-mcp/public/file.svg new file mode 100644 index 00000000..004145cd --- /dev/null +++ b/examples/nextjs-mcp/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/nextjs-mcp/public/globe.svg b/examples/nextjs-mcp/public/globe.svg new file mode 100644 index 00000000..567f17b0 --- /dev/null +++ b/examples/nextjs-mcp/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/nextjs-mcp/public/next.svg b/examples/nextjs-mcp/public/next.svg new file mode 100644 index 00000000..5174b28c --- /dev/null +++ b/examples/nextjs-mcp/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/nextjs-mcp/public/vercel.svg b/examples/nextjs-mcp/public/vercel.svg new file mode 100644 index 00000000..77053960 --- /dev/null +++ b/examples/nextjs-mcp/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/nextjs-mcp/public/window.svg b/examples/nextjs-mcp/public/window.svg new file mode 100644 index 00000000..b2b2a44f --- /dev/null +++ b/examples/nextjs-mcp/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/nextjs-mcp/tsconfig.json b/examples/nextjs-mcp/tsconfig.json new file mode 100644 index 00000000..3addb7e6 --- /dev/null +++ b/examples/nextjs-mcp/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + "app/.well-known/oauth-authorization-server/route.ts" + ], + "exclude": ["node_modules"] +} diff --git a/examples/svelte-kit-example/tsconfig.json b/examples/svelte-kit-example/tsconfig.json index 3c05e398..0f47472f 100644 --- a/examples/svelte-kit-example/tsconfig.json +++ b/examples/svelte-kit-example/tsconfig.json @@ -8,7 +8,6 @@ "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, - "strict": true, - "moduleResolution": "Bundler" + "strict": true } } diff --git a/packages/better-auth/package.json b/packages/better-auth/package.json index fba672ca..7c0f6655 100644 --- a/packages/better-auth/package.json +++ b/packages/better-auth/package.json @@ -1,6 +1,6 @@ { "name": "better-auth", - "version": "1.2.8", + "version": "1.2.9-beta.1", "description": "The most comprehensive authentication library for TypeScript.", "type": "module", "repository": { diff --git a/packages/better-auth/src/plugins/index.ts b/packages/better-auth/src/plugins/index.ts index f86e7871..e6d9d5f6 100644 --- a/packages/better-auth/src/plugins/index.ts +++ b/packages/better-auth/src/plugins/index.ts @@ -22,3 +22,4 @@ export * from "./captcha"; export * from "./api-key"; export * from "./haveibeenpwned"; export * from "./one-time-token"; +export * from "./mcp"; diff --git a/packages/better-auth/src/plugins/mcp/authorize.ts b/packages/better-auth/src/plugins/mcp/authorize.ts new file mode 100644 index 00000000..1c5a75d2 --- /dev/null +++ b/packages/better-auth/src/plugins/mcp/authorize.ts @@ -0,0 +1,232 @@ +import { APIError } from "better-call"; +import type { GenericEndpointContext } from "../../types"; +import { getSessionFromCtx } from "../../api"; +import type { + AuthorizationQuery, + Client, + OIDCOptions, +} from "../oidc-provider/types"; +import { generateRandomString } from "../../crypto"; + +function redirectErrorURL(url: string, error: string, description: string) { + return `${ + url.includes("?") ? "&" : "?" + }error=${error}&error_description=${description}`; +} + +export async function authorizeMCPOAuth( + ctx: GenericEndpointContext, + options: OIDCOptions, +) { + ctx.setHeader("Access-Control-Allow-Origin", "*"); + ctx.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); + ctx.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); + ctx.setHeader("Access-Control-Max-Age", "86400"); + const opts = { + codeExpiresIn: 600, + defaultScope: "openid", + ...options, + scopes: [ + "openid", + "profile", + "email", + "offline_access", + ...(options?.scopes || []), + ], + }; + if (!ctx.request) { + throw new APIError("UNAUTHORIZED", { + error_description: "request not found", + error: "invalid_request", + }); + } + const session = await getSessionFromCtx(ctx); + if (!session) { + /** + * If the user is not logged in, we need to redirect them to the + * login page. + */ + await ctx.setSignedCookie( + "oidc_login_prompt", + JSON.stringify(ctx.query), + ctx.context.secret, + { + maxAge: 600, + path: "/", + sameSite: "lax", + }, + ); + const queryFromURL = ctx.request.url?.split("?")[1]; + throw ctx.redirect(`${options.loginPage}?${queryFromURL}`); + } + + const query = ctx.query as AuthorizationQuery; + console.log(query); + if (!query.client_id) { + throw ctx.redirect(`${ctx.context.baseURL}/error?error=invalid_client`); + } + + if (!query.response_type) { + throw ctx.redirect( + redirectErrorURL( + `${ctx.context.baseURL}/error`, + "invalid_request", + "response_type is required", + ), + ); + } + + const client = await ctx.context.adapter + .findOne>({ + model: "oauthApplication", + where: [ + { + field: "clientId", + value: ctx.query.client_id, + }, + ], + }) + .then((res) => { + if (!res) { + return null; + } + return { + ...res, + redirectURLs: res.redirectURLs.split(","), + metadata: res.metadata ? JSON.parse(res.metadata) : {}, + } as Client; + }); + console.log(client); + if (!client) { + throw ctx.redirect(`${ctx.context.baseURL}/error?error=invalid_client`); + } + const redirectURI = client.redirectURLs.find( + (url) => url === ctx.query.redirect_uri, + ); + + if (!redirectURI || !query.redirect_uri) { + /** + * show UI error here warning the user that the redirect URI is invalid + */ + throw new APIError("BAD_REQUEST", { + message: "Invalid redirect URI", + }); + } + if (client.disabled) { + throw ctx.redirect(`${ctx.context.baseURL}/error?error=client_disabled`); + } + + if (query.response_type !== "code") { + throw ctx.redirect( + `${ctx.context.baseURL}/error?error=unsupported_response_type`, + ); + } + + const requestScope = + query.scope?.split(" ").filter((s) => s) || opts.defaultScope.split(" "); + const invalidScopes = requestScope.filter((scope) => { + const isInvalid = + !opts.scopes.includes(scope) || + (scope === "offline_access" && query.prompt !== "consent"); + return isInvalid; + }); + if (invalidScopes.length) { + throw ctx.redirect( + redirectErrorURL( + query.redirect_uri, + "invalid_scope", + `The following scopes are invalid: ${invalidScopes.join(", ")}`, + ), + ); + } + + if ( + (!query.code_challenge || !query.code_challenge_method) && + options.requirePKCE + ) { + throw ctx.redirect( + redirectErrorURL( + query.redirect_uri, + "invalid_request", + "pkce is required", + ), + ); + } + + if (!query.code_challenge_method) { + query.code_challenge_method = "plain"; + } + + if ( + ![ + "s256", + options.allowPlainCodeChallengeMethod ? "plain" : "s256", + ].includes(query.code_challenge_method?.toLowerCase() || "") + ) { + throw ctx.redirect( + redirectErrorURL( + query.redirect_uri, + "invalid_request", + "invalid code_challenge method", + ), + ); + } + + const code = generateRandomString(32, "a-z", "A-Z", "0-9"); + const codeExpiresInMs = opts.codeExpiresIn * 1000; + const expiresAt = new Date(Date.now() + codeExpiresInMs); + try { + /** + * Save the code in the database + */ + await ctx.context.internalAdapter.createVerificationValue( + { + value: JSON.stringify({ + clientId: client.clientId, + redirectURI: query.redirect_uri, + scope: requestScope, + userId: session.user.id, + authTime: session.session.createdAt.getTime(), + /** + * If the prompt is set to `consent`, then we need + * to require the user to consent to the scopes. + * + * This means the code now needs to be treated as a + * consent request. + * + * once the user consents, teh code will be updated + * with the actual code. This is to prevent the + * client from using the code before the user + * consents. + */ + requireConsent: query.prompt === "consent", + state: query.prompt === "consent" ? query.state : null, + codeChallenge: query.code_challenge, + codeChallengeMethod: query.code_challenge_method, + nonce: query.nonce, + }), + identifier: code, + expiresAt, + }, + ctx, + ); + } catch (e) { + throw ctx.redirect( + redirectErrorURL( + query.redirect_uri, + "server_error", + "An error occurred while processing the request", + ), + ); + } + + const redirectURIWithCode = new URL(redirectURI); + redirectURIWithCode.searchParams.set("code", code); + redirectURIWithCode.searchParams.set("state", ctx.query.state); + + if (query.prompt !== "consent") { + throw ctx.redirect(redirectURIWithCode.toString()); + } + + throw ctx.redirect(redirectURIWithCode.toString()); +} diff --git a/packages/better-auth/src/plugins/mcp/index.ts b/packages/better-auth/src/plugins/mcp/index.ts new file mode 100644 index 00000000..8002a8c2 --- /dev/null +++ b/packages/better-auth/src/plugins/mcp/index.ts @@ -0,0 +1,928 @@ +import { z } from "zod"; +import { + createAuthEndpoint, + createAuthMiddleware, + type BetterAuthPlugin, +} from ".."; +import { + oidcProvider, + type Client, + type CodeVerificationValue, + type OAuthAccessToken, + type OIDCMetadata, + type OIDCOptions, +} from "../oidc-provider"; +import { APIError, getSessionFromCtx } from "../../api"; +import { base64 } from "@better-auth/utils/base64"; +import { generateRandomString } from "../../crypto"; +import { createHash } from "@better-auth/utils/hash"; +import { subtle } from "@better-auth/utils"; +import { SignJWT } from "jose"; +import type { GenericEndpointContext } from "../../types"; +import { parseSetCookieHeader } from "../../cookies"; +import { schema } from "../oidc-provider/schema"; +import { authorizeMCPOAuth } from "./authorize"; + +interface MCPOptions { + loginPage: string; + oidcConfig?: OIDCOptions; +} + +export const getMCPProviderMetadata = ( + ctx: GenericEndpointContext, + options?: OIDCOptions, +): OIDCMetadata => { + const issuer = ctx.context.options.baseURL as string; + const baseURL = ctx.context.baseURL; + if (!issuer || !baseURL) { + throw new APIError("INTERNAL_SERVER_ERROR", { + error: "invalid_issuer", + error_description: + "issuer or baseURL is not set. If you're the app developer, please make sure to set the `baseURL` in your auth config.", + }); + } + return { + issuer, + authorization_endpoint: `${baseURL}/mcp/authorize`, + token_endpoint: `${baseURL}/mcp/token`, + userinfo_endpoint: `${baseURL}/mcp/userinfo`, + jwks_uri: `${baseURL}/mcp/jwks`, + registration_endpoint: `${baseURL}/mcp/register`, + scopes_supported: ["openid", "profile", "email", "offline_access"], + response_types_supported: ["code"], + response_modes_supported: ["query"], + grant_types_supported: ["authorization_code"], + acr_values_supported: [ + "urn:mace:incommon:iap:silver", + "urn:mace:incommon:iap:bronze", + ], + subject_types_supported: ["public"], + id_token_signing_alg_values_supported: ["RS256", "none"], + token_endpoint_auth_methods_supported: [ + "client_secret_basic", + "client_secret_post", + ], + code_challenge_methods_supported: ["S256"], + claims_supported: [ + "sub", + "iss", + "aud", + "exp", + "nbf", + "iat", + "jti", + "email", + "email_verified", + "name", + ], + ...options?.metadata, + }; +}; + +export const mcp = (options: MCPOptions) => { + const opts = { + codeExpiresIn: 600, + defaultScope: "openid", + accessTokenExpiresIn: 3600, + refreshTokenExpiresIn: 604800, + allowPlainCodeChallengeMethod: true, + ...options.oidcConfig, + loginPage: options.loginPage, + scopes: [ + "openid", + "profile", + "email", + "offline_access", + ...(options.oidcConfig?.scopes || []), + ], + }; + const modelName = { + oauthClient: "oauthApplication", + oauthAccessToken: "oauthAccessToken", + oauthConsent: "oauthConsent", + }; + const provider = oidcProvider(opts); + return { + id: "mcp", + hooks: { + after: [ + { + matcher() { + return true; + }, + handler: createAuthMiddleware(async (ctx) => { + const cookie = await ctx.getSignedCookie( + "oidc_login_prompt", + ctx.context.secret, + ); + const cookieName = ctx.context.authCookies.sessionToken.name; + const parsedSetCookieHeader = parseSetCookieHeader( + ctx.context.responseHeaders?.get("set-cookie") || "", + ); + const hasSessionToken = parsedSetCookieHeader.has(cookieName); + if (!cookie || !hasSessionToken) { + return; + } + ctx.setCookie("oidc_login_prompt", "", { + maxAge: 0, + }); + const sessionCookie = parsedSetCookieHeader.get(cookieName)?.value; + const sessionToken = sessionCookie?.split(".")[0]; + if (!sessionToken) { + return; + } + const session = + await ctx.context.internalAdapter.findSession(sessionToken); + if (!session) { + return; + } + ctx.query = JSON.parse(cookie); + ctx.query!.prompt = "consent"; + ctx.context.session = session; + const response = await authorizeMCPOAuth(ctx, opts).catch((e) => { + if (e instanceof APIError) { + if (e.statusCode === 302) { + return ctx.json({ + redirect: true, + //@ts-expect-error + url: e.headers.get("location"), + }); + } + } + throw e; + }); + return response; + }), + }, + ], + }, + endpoints: { + getMcpOAuthConfig: createAuthEndpoint( + "/.well-known/oauth-authorization-server", + { + method: "GET", + metadata: { + client: false, + }, + }, + async (c) => { + try { + const metadata = getMCPProviderMetadata(c, options); + return c.json(metadata); + } catch (e) { + console.log(e); + return c.json(null); + } + }, + ), + mcpOAuthAuthroize: createAuthEndpoint( + "/mcp/authorize", + { + method: "GET", + query: z.record(z.string(), z.any()), + metadata: { + openapi: { + description: "Authorize an OAuth2 request using MCP", + responses: { + "200": { + description: "Authorization response generated successfully", + content: { + "application/json": { + schema: { + type: "object", + additionalProperties: true, + description: + "Authorization response, contents depend on the authorize function implementation", + }, + }, + }, + }, + }, + }, + }, + }, + async (ctx) => { + return authorizeMCPOAuth(ctx, opts); + }, + ), + mcpOAuthToken: createAuthEndpoint( + "/mcp/token", + { + method: "POST", + body: z.record(z.any()), + metadata: { + isAction: false, + }, + }, + async (ctx) => { + //cors + ctx.setHeader("Access-Control-Allow-Origin", "*"); + ctx.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); + ctx.setHeader( + "Access-Control-Allow-Headers", + "Content-Type, Authorization", + ); + ctx.setHeader("Access-Control-Max-Age", "86400"); + + let { body } = ctx; + if (!body) { + throw ctx.error("BAD_REQUEST", { + error_description: "request body not found", + error: "invalid_request", + }); + } + if (body instanceof FormData) { + body = Object.fromEntries(body.entries()); + } + if (!(body instanceof Object)) { + throw new APIError("BAD_REQUEST", { + error_description: "request body is not an object", + error: "invalid_request", + }); + } + let { client_id, client_secret } = body; + const authorization = + ctx.request?.headers.get("authorization") || null; + if ( + authorization && + !client_id && + !client_secret && + authorization.startsWith("Basic ") + ) { + try { + const encoded = authorization.replace("Basic ", ""); + const decoded = new TextDecoder().decode(base64.decode(encoded)); + if (!decoded.includes(":")) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid authorization header format", + error: "invalid_client", + }); + } + const [id, secret] = decoded.split(":"); + if (!id || !secret) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid authorization header format", + error: "invalid_client", + }); + } + client_id = id; + client_secret = secret; + } catch (error) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid authorization header format", + error: "invalid_client", + }); + } + } + const { + grant_type, + code, + redirect_uri, + refresh_token, + code_verifier, + } = body; + if (grant_type === "refresh_token") { + if (!refresh_token) { + throw new APIError("BAD_REQUEST", { + error_description: "refresh_token is required", + error: "invalid_request", + }); + } + const token = await ctx.context.adapter.findOne({ + model: "oauthAccessToken", + where: [ + { + field: "refreshToken", + value: refresh_token.toString(), + }, + ], + }); + if (!token) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid refresh token", + error: "invalid_grant", + }); + } + if (token.clientId !== client_id?.toString()) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid client_id", + error: "invalid_client", + }); + } + if (token.refreshTokenExpiresAt < new Date()) { + throw new APIError("UNAUTHORIZED", { + error_description: "refresh token expired", + error: "invalid_grant", + }); + } + const accessToken = generateRandomString(32, "a-z", "A-Z"); + const newRefreshToken = generateRandomString(32, "a-z", "A-Z"); + const accessTokenExpiresAt = new Date( + Date.now() + opts.accessTokenExpiresIn * 1000, + ); + const refreshTokenExpiresAt = new Date( + Date.now() + opts.refreshTokenExpiresIn * 1000, + ); + await ctx.context.adapter.create({ + model: modelName.oauthAccessToken, + data: { + accessToken, + refreshToken: newRefreshToken, + accessTokenExpiresAt, + refreshTokenExpiresAt, + clientId: client_id.toString(), + userId: token.userId, + scopes: token.scopes, + createdAt: new Date(), + updatedAt: new Date(), + }, + }); + return ctx.json({ + access_token: accessToken, + token_type: "bearer", + expires_in: opts.accessTokenExpiresIn, + refresh_token: newRefreshToken, + scope: token.scopes, + }); + } + + if (!code) { + throw new APIError("BAD_REQUEST", { + error_description: "code is required", + error: "invalid_request", + }); + } + + if (opts.requirePKCE && !code_verifier) { + throw new APIError("BAD_REQUEST", { + error_description: "code verifier is missing", + error: "invalid_request", + }); + } + + /** + * We need to check if the code is valid before we can proceed + * with the rest of the request. + */ + const verificationValue = + await ctx.context.internalAdapter.findVerificationValue( + code.toString(), + ); + if (!verificationValue) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid code", + error: "invalid_grant", + }); + } + if (verificationValue.expiresAt < new Date()) { + throw new APIError("UNAUTHORIZED", { + error_description: "code expired", + error: "invalid_grant", + }); + } + + await ctx.context.internalAdapter.deleteVerificationValue( + verificationValue.id, + ); + if (!client_id || !client_secret) { + throw new APIError("UNAUTHORIZED", { + error_description: "client_id and client_secret are required", + error: "invalid_client", + }); + } + if (!grant_type) { + throw new APIError("BAD_REQUEST", { + error_description: "grant_type is required", + error: "invalid_request", + }); + } + if (grant_type !== "authorization_code") { + throw new APIError("BAD_REQUEST", { + error_description: "grant_type must be 'authorization_code'", + error: "unsupported_grant_type", + }); + } + + if (!redirect_uri) { + throw new APIError("BAD_REQUEST", { + error_description: "redirect_uri is required", + error: "invalid_request", + }); + } + + const client = await ctx.context.adapter + .findOne>({ + model: modelName.oauthClient, + where: [{ field: "clientId", value: client_id.toString() }], + }) + .then((res) => { + if (!res) { + return null; + } + return { + ...res, + redirectURLs: res.redirectURLs.split(","), + metadata: res.metadata ? JSON.parse(res.metadata) : {}, + } as Client; + }); + if (!client) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid client_id", + error: "invalid_client", + }); + } + if (client.disabled) { + throw new APIError("UNAUTHORIZED", { + error_description: "client is disabled", + error: "invalid_client", + }); + } + const isValidSecret = + client.clientSecret === client_secret.toString(); + if (!isValidSecret) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid client_secret", + error: "invalid_client", + }); + } + const value = JSON.parse( + verificationValue.value, + ) as CodeVerificationValue; + if (value.clientId !== client_id.toString()) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid client_id", + error: "invalid_client", + }); + } + if (value.redirectURI !== redirect_uri.toString()) { + throw new APIError("UNAUTHORIZED", { + error_description: "invalid redirect_uri", + error: "invalid_client", + }); + } + if (value.codeChallenge && !code_verifier) { + throw new APIError("BAD_REQUEST", { + error_description: "code verifier is missing", + error: "invalid_request", + }); + } + + const challenge = + value.codeChallengeMethod === "plain" + ? code_verifier + : await createHash("SHA-256", "base64urlnopad").digest( + code_verifier, + ); + + if (challenge !== value.codeChallenge) { + throw new APIError("UNAUTHORIZED", { + error_description: "code verification failed", + error: "invalid_request", + }); + } + + const requestedScopes = value.scope; + await ctx.context.internalAdapter.deleteVerificationValue( + verificationValue.id, + ); + const accessToken = generateRandomString(32, "a-z", "A-Z"); + const refreshToken = generateRandomString(32, "A-Z", "a-z"); + const accessTokenExpiresAt = new Date( + Date.now() + opts.accessTokenExpiresIn * 1000, + ); + const refreshTokenExpiresAt = new Date( + Date.now() + opts.refreshTokenExpiresIn * 1000, + ); + await ctx.context.adapter.create({ + model: modelName.oauthAccessToken, + data: { + accessToken, + refreshToken, + accessTokenExpiresAt, + refreshTokenExpiresAt, + clientId: client_id.toString(), + userId: value.userId, + scopes: requestedScopes.join(" "), + createdAt: new Date(), + updatedAt: new Date(), + }, + }); + const user = await ctx.context.internalAdapter.findUserById( + value.userId, + ); + if (!user) { + throw new APIError("UNAUTHORIZED", { + error_description: "user not found", + error: "invalid_grant", + }); + } + let secretKey = { + alg: "HS256", + key: await subtle.generateKey( + { + name: "HMAC", + hash: "SHA-256", + }, + true, + ["sign", "verify"], + ), + }; + const profile = { + given_name: user.name.split(" ")[0], + family_name: user.name.split(" ")[1], + name: user.name, + profile: user.image, + updated_at: user.updatedAt.toISOString(), + }; + const email = { + email: user.email, + email_verified: user.emailVerified, + }; + const userClaims = { + ...(requestedScopes.includes("profile") ? profile : {}), + ...(requestedScopes.includes("email") ? email : {}), + }; + + const additionalUserClaims = opts.getAdditionalUserInfoClaim + ? opts.getAdditionalUserInfoClaim(user, requestedScopes) + : {}; + + const idToken = await new SignJWT({ + sub: user.id, + aud: client_id.toString(), + iat: Date.now(), + auth_time: ctx.context.session?.session.createdAt.getTime(), + nonce: value.nonce, + acr: "urn:mace:incommon:iap:silver", // default to silver - ⚠︎ this should be configurable and should be validated against the client's metadata + ...userClaims, + ...additionalUserClaims, + }) + .setProtectedHeader({ alg: secretKey.alg }) + .setIssuedAt() + .setExpirationTime( + Math.floor(Date.now() / 1000) + opts.accessTokenExpiresIn, + ) + .sign(secretKey.key); + return ctx.json( + { + access_token: accessToken, + token_type: "Bearer", + expires_in: opts.accessTokenExpiresIn, + refresh_token: requestedScopes.includes("offline_access") + ? refreshToken + : undefined, + scope: requestedScopes.join(" "), + id_token: requestedScopes.includes("openid") + ? idToken + : undefined, + }, + { + headers: { + "Cache-Control": "no-store", + Pragma: "no-cache", + }, + }, + ); + }, + ), + registerMcpClient: createAuthEndpoint( + "/mcp/register", + { + method: "POST", + body: z.object({ + redirect_uris: z.array(z.string()), + token_endpoint_auth_method: z + .enum(["none", "client_secret_basic", "client_secret_post"]) + .default("client_secret_basic") + .optional(), + grant_types: z + .array( + z.enum([ + "authorization_code", + "implicit", + "password", + "client_credentials", + "refresh_token", + "urn:ietf:params:oauth:grant-type:jwt-bearer", + "urn:ietf:params:oauth:grant-type:saml2-bearer", + ]), + ) + .default(["authorization_code"]) + .optional(), + response_types: z + .array(z.enum(["code", "token"])) + .default(["code"]) + .optional(), + client_name: z.string().optional(), + client_uri: z.string().optional(), + logo_uri: z.string().optional(), + scope: z.string().optional(), + contacts: z.array(z.string()).optional(), + tos_uri: z.string().optional(), + policy_uri: z.string().optional(), + jwks_uri: z.string().optional(), + jwks: z.record(z.any()).optional(), + metadata: z.record(z.any()).optional(), + software_id: z.string().optional(), + software_version: z.string().optional(), + software_statement: z.string().optional(), + }), + metadata: { + openapi: { + description: "Register an OAuth2 application", + responses: { + "200": { + description: "OAuth2 application registered successfully", + content: { + "application/json": { + schema: { + type: "object", + properties: { + name: { + type: "string", + description: "Name of the OAuth2 application", + }, + icon: { + type: "string", + nullable: true, + description: "Icon URL for the application", + }, + metadata: { + type: "object", + additionalProperties: true, + nullable: true, + description: + "Additional metadata for the application", + }, + clientId: { + type: "string", + description: "Unique identifier for the client", + }, + clientSecret: { + type: "string", + description: "Secret key for the client", + }, + redirectURLs: { + type: "array", + items: { type: "string", format: "uri" }, + description: "List of allowed redirect URLs", + }, + type: { + type: "string", + description: "Type of the client", + enum: ["web"], + }, + authenticationScheme: { + type: "string", + description: + "Authentication scheme used by the client", + enum: ["client_secret"], + }, + disabled: { + type: "boolean", + description: "Whether the client is disabled", + enum: [false], + }, + userId: { + type: "string", + nullable: true, + description: + "ID of the user who registered the client, null if registered anonymously", + }, + createdAt: { + type: "string", + format: "date-time", + description: "Creation timestamp", + }, + updatedAt: { + type: "string", + format: "date-time", + description: "Last update timestamp", + }, + }, + required: [ + "name", + "clientId", + "clientSecret", + "redirectURLs", + "type", + "authenticationScheme", + "disabled", + "createdAt", + "updatedAt", + ], + }, + }, + }, + }, + }, + }, + }, + }, + async (ctx) => { + const body = ctx.body; + const session = await getSessionFromCtx(ctx); + ctx.setHeader("Access-Control-Allow-Origin", "*"); + ctx.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); + ctx.setHeader( + "Access-Control-Allow-Headers", + "Content-Type, Authorization", + ); + ctx.setHeader("Access-Control-Max-Age", "86400"); + ctx.headers?.set("Access-Control-Max-Age", "86400"); + if ( + (!body.grant_types || + body.grant_types.includes("authorization_code") || + body.grant_types.includes("implicit")) && + (!body.redirect_uris || body.redirect_uris.length === 0) + ) { + throw new APIError("BAD_REQUEST", { + error: "invalid_redirect_uri", + error_description: + "Redirect URIs are required for authorization_code and implicit grant types", + }); + } + + if (body.grant_types && body.response_types) { + if ( + body.grant_types.includes("authorization_code") && + !body.response_types.includes("code") + ) { + throw new APIError("BAD_REQUEST", { + error: "invalid_client_metadata", + error_description: + "When 'authorization_code' grant type is used, 'code' response type must be included", + }); + } + if ( + body.grant_types.includes("implicit") && + !body.response_types.includes("token") + ) { + throw new APIError("BAD_REQUEST", { + error: "invalid_client_metadata", + error_description: + "When 'implicit' grant type is used, 'token' response type must be included", + }); + } + } + + const clientId = + opts.generateClientId?.() || generateRandomString(32, "a-z", "A-Z"); + const clientSecret = + opts.generateClientSecret?.() || + generateRandomString(32, "a-z", "A-Z"); + + await ctx.context.adapter.create({ + model: modelName.oauthClient, + data: { + name: body.client_name, + icon: body.logo_uri, + metadata: body.metadata ? JSON.stringify(body.metadata) : null, + clientId: clientId, + clientSecret: clientSecret, + redirectURLs: body.redirect_uris.join(","), + type: "web", + authenticationScheme: + body.token_endpoint_auth_method || "client_secret_basic", + disabled: false, + userId: session?.session.userId, + createdAt: new Date(), + updatedAt: new Date(), + }, + }); + + return ctx.json( + { + client_id: clientId, + client_secret: clientSecret, + client_id_issued_at: Math.floor(Date.now() / 1000), + client_secret_expires_at: 0, // 0 means it doesn't expire + redirect_uris: body.redirect_uris, + token_endpoint_auth_method: + body.token_endpoint_auth_method || "client_secret_basic", + grant_types: body.grant_types || ["authorization_code"], + response_types: body.response_types || ["code"], + client_name: body.client_name, + client_uri: body.client_uri, + logo_uri: body.logo_uri, + scope: body.scope, + contacts: body.contacts, + tos_uri: body.tos_uri, + policy_uri: body.policy_uri, + jwks_uri: body.jwks_uri, + jwks: body.jwks, + software_id: body.software_id, + software_version: body.software_version, + software_statement: body.software_statement, + metadata: body.metadata, + }, + { + status: 201, + headers: { + "Cache-Control": "no-store", + Pragma: "no-cache", + }, + }, + ); + }, + ), + getMcpSession: createAuthEndpoint( + "/mcp/get-session", + { + method: "GET", + requireHeaders: true, + }, + async (c) => { + const accessToken = c.headers + ?.get("Authorization") + ?.replace("Bearer ", ""); + if (!accessToken) { + c.headers?.set("WWW-Authenticate", "Bearer"); + return c.json(null); + } + const accessTokenData = + await c.context.adapter.findOne({ + model: modelName.oauthAccessToken, + where: [ + { + field: "accessToken", + value: accessToken, + }, + ], + }); + if (!accessTokenData) { + return c.json(null); + } + return c.json(accessTokenData); + }, + ), + }, + schema, + } satisfies BetterAuthPlugin; +}; + +export const withMcpAuth = < + Auth extends { + api: { + getMcpSession: (...args: any) => Promise; + }; + }, +>( + auth: Auth, + handler: ( + req: Request, + sesssion: OAuthAccessToken, + ) => Response | Promise, +) => { + return async (req: Request) => { + const session = await auth.api.getMcpSession({ + headers: req.headers, + }); + const wwwAuthenticateValue = + "Bearer resource_metadata=http://localhost:3000/api/auth/.well-known/oauth-authorization-server"; + if (!session) { + return Response.json( + { + jsonrpc: "2.0", + error: { + code: -32000, + message: "Unauthorized: Authentication required", + "www-authenticate": wwwAuthenticateValue, + }, + id: null, + }, + { + status: 401, + headers: { + "WWW-Authenticate": wwwAuthenticateValue, + }, + }, + ); + } + return handler(req, session); + }; +}; + +export const oAuthDiscoveryMetadata = < + Auth extends { + api: { + getMcpOAuthConfig: (...args: any) => any; + }; + }, +>( + auth: Auth, +) => { + return async (request: Request) => { + const res = await auth.api.getMcpOAuthConfig(); + return new Response(JSON.stringify(res), { + status: 200, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "POST, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type, Authorization", + "Access-Control-Max-Age": "86400", + }, + }); + }; +}; diff --git a/packages/better-auth/src/plugins/oidc-provider/index.ts b/packages/better-auth/src/plugins/oidc-provider/index.ts index 39afe00f..84c3f28d 100644 --- a/packages/better-auth/src/plugins/oidc-provider/index.ts +++ b/packages/better-auth/src/plugins/oidc-provider/index.ts @@ -23,7 +23,7 @@ import { parseSetCookieHeader } from "../../cookies"; import { createHash } from "@better-auth/utils/hash"; import { base64 } from "@better-auth/utils/base64"; -const getMetadata = ( +export const getMetadata = ( ctx: GenericEndpointContext, options?: OIDCOptions, ): OIDCMetadata => { @@ -50,6 +50,7 @@ const getMetadata = ( "client_secret_basic", "client_secret_post", ], + code_challenge_methods_supported: ["S256"], claims_supported: [ "sub", "iss", diff --git a/packages/better-auth/src/plugins/oidc-provider/types.ts b/packages/better-auth/src/plugins/oidc-provider/types.ts index 22629da9..d6b26c79 100644 --- a/packages/better-auth/src/plugins/oidc-provider/types.ts +++ b/packages/better-auth/src/plugins/oidc-provider/types.ts @@ -513,4 +513,12 @@ export interface OIDCMetadata { * ["sub", "iss", "aud", "exp", "nbf", "iat", "jti", "email", "email_verified", "name"] */ claims_supported: string[]; + /** + * Supported code challenge methods. + * + * only `S256` is supported. + * + * @default ["S256"] + */ + code_challenge_methods_supported: ["S256"]; } diff --git a/packages/cli/package.json b/packages/cli/package.json index a4c259bd..b9a2bb7e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/cli", - "version": "1.2.8", + "version": "1.2.9-beta.1", "description": "The CLI for Better Auth", "module": "dist/index.mjs", "repository": { diff --git a/packages/expo/package.json b/packages/expo/package.json index 944592f9..a41f2615 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@better-auth/expo", - "version": "1.2.8", + "version": "1.2.9-beta.1", "description": "", "main": "dist/index.cjs", "module": "dist/index.mjs", diff --git a/packages/stripe/package.json b/packages/stripe/package.json index 22e9c178..53140213 100644 --- a/packages/stripe/package.json +++ b/packages/stripe/package.json @@ -1,7 +1,7 @@ { "name": "@better-auth/stripe", "author": "Bereket Engida", - "version": "1.2.8", + "version": "1.2.9-beta.1", "main": "dist/index.cjs", "license": "MIT", "keywords": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50e9add1..f40208a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -358,7 +358,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.12 + version: 1.2.13 dev/cloudflare: dependencies: @@ -367,7 +367,7 @@ importers: version: link:../../packages/better-auth drizzle-orm: specifier: ^0.39.3 - version: 0.39.3(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)) + version: 0.39.3(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)) hono: specifier: ^4.7.2 version: 4.7.4 @@ -476,7 +476,7 @@ importers: version: 0.5.15(next@15.2.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) '@vercel/analytics': specifier: ^1.5.0 - version: 1.5.0(@remix-run/react@2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@sveltejs/kit@2.19.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(next@15.2.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)(svelte@5.22.6)(vue-router@4.5.1(vue@3.5.13(typescript@5.8.2)))(vue@3.5.13(typescript@5.8.2)) + version: 1.5.0(@remix-run/react@2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@sveltejs/kit@2.19.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(next@15.2.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)(svelte@5.22.6)(vue-router@4.5.1(vue@3.5.14(typescript@5.8.2)))(vue@3.5.14(typescript@5.8.2)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -731,7 +731,7 @@ importers: devDependencies: '@ianvs/prettier-plugin-sort-imports': specifier: 4.1.1 - version: 4.1.1(@vue/compiler-sfc@3.5.13)(prettier@3.2.4) + version: 4.1.1(@vue/compiler-sfc@3.5.14)(prettier@3.2.4) '@types/chrome': specifier: 0.0.258 version: 0.0.258 @@ -890,11 +890,57 @@ importers: specifier: ^5.7.2 version: 5.8.2 + examples/nextjs-mcp: + dependencies: + '@types/better-sqlite3': + specifier: ^7.6.12 + version: 7.6.12 + '@vercel/mcp-adapter': + specifier: ^0.4.1 + version: 0.4.1(next@15.3.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1)) + better-auth: + specifier: workspace:^ + version: link:../../packages/better-auth + better-sqlite3: + specifier: ^11.6.0 + version: 11.8.1 + next: + specifier: 15.3.2 + version: 15.3.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + zod: + specifier: ^3.24.4 + version: 3.24.4 + devDependencies: + '@tailwindcss/postcss': + specifier: ^4 + version: 4.0.12 + '@types/node': + specifier: ^20 + version: 20.17.24 + '@types/react': + specifier: ^19 + version: 19.0.10 + '@types/react-dom': + specifier: ^19 + version: 19.0.4(@types/react@19.0.10) + tailwindcss: + specifier: ^4 + version: 4.0.12 + typescript: + specifier: ^5 + version: 5.8.2 + examples/nuxt-example: dependencies: '@radix-icons/vue': specifier: ^1.0.0 - version: 1.0.0(vue@3.5.13(typescript@5.8.2)) + version: 1.0.0(vue@3.5.14(typescript@5.8.2)) '@types/better-sqlite3': specifier: ^7.6.12 version: 7.6.12 @@ -903,13 +949,13 @@ importers: version: 1.4.3-beta.0 '@unovis/vue': specifier: 1.4.3-beta.0 - version: 1.4.3-beta.0(@unovis/ts@1.4.3-beta.0)(vue@3.5.13(typescript@5.8.2)) + version: 1.4.3-beta.0(@unovis/ts@1.4.3-beta.0)(vue@3.5.14(typescript@5.8.2)) '@vee-validate/zod': specifier: ^4.14.7 - version: 4.15.0(vue@3.5.13(typescript@5.8.2))(zod@3.24.2) + version: 4.15.0(vue@3.5.14(typescript@5.8.2))(zod@3.24.2) '@vueuse/core': specifier: ^11.3.0 - version: 11.3.0(vue@3.5.13(typescript@5.8.2)) + version: 11.3.0(vue@3.5.14(typescript@5.8.2)) better-auth: specifier: workspace:* version: link:../../packages/better-auth @@ -924,13 +970,13 @@ importers: version: 2.1.1 embla-carousel-vue: specifier: ^8.5.1 - version: 8.5.2(vue@3.5.13(typescript@5.8.2)) + version: 8.5.2(vue@3.5.14(typescript@5.8.2)) nuxt: specifier: ^3.14.1592 - version: 3.16.0(yykrlyfgcq7bklxjhifzhuppyq) + version: 3.16.0(kygbndsg3u7xffwrewwioaaldy) radix-vue: specifier: ^1.9.11 - version: 1.9.17(vue@3.5.13(typescript@5.8.2)) + version: 1.9.17(vue@3.5.14(typescript@5.8.2)) shadcn-nuxt: specifier: ^0.10.4 version: 0.10.4(magicast@0.3.5) @@ -942,19 +988,19 @@ importers: version: 1.0.7(tailwindcss@3.4.17) v-calendar: specifier: ^3.1.2 - version: 3.1.2(@popperjs/core@2.11.8)(vue@3.5.13(typescript@5.8.2)) + version: 3.1.2(@popperjs/core@2.11.8)(vue@3.5.14(typescript@5.8.2)) vaul-vue: specifier: ^0.2.0 - version: 0.2.1(radix-vue@1.9.17(vue@3.5.13(typescript@5.8.2)))(vue@3.5.13(typescript@5.8.2)) + version: 0.2.1(radix-vue@1.9.17(vue@3.5.14(typescript@5.8.2)))(vue@3.5.14(typescript@5.8.2)) vee-validate: specifier: ^4.14.7 - version: 4.15.0(vue@3.5.13(typescript@5.8.2)) + version: 4.15.0(vue@3.5.14(typescript@5.8.2)) vue: specifier: latest - version: 3.5.13(typescript@5.8.2) + version: 3.5.14(typescript@5.8.2) vue-router: specifier: latest - version: 4.5.1(vue@3.5.13(typescript@5.8.2)) + version: 4.5.1(vue@3.5.14(typescript@5.8.2)) vue-sonner: specifier: ^1.3.0 version: 1.3.0 @@ -1314,7 +1360,7 @@ importers: version: 1.112.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/start': specifier: ^1.86.1 - version: 1.113.0(hcvcmo22cfk2zc45m3egdtrfb4) + version: 1.113.0(umfczj6grv5xwnnilehiba4mti) '@types/ua-parser-js': specifier: ^0.7.39 version: 0.7.39 @@ -1362,7 +1408,7 @@ importers: version: 0.7.40 vinxi: specifier: ^0.4.3 - version: 0.4.3(tbiltmkuca6gwy6wvywbppe5hm) + version: 0.4.3(xigip3pwxsynk4cmajsowrm4re) devDependencies: '@biomejs/biome': specifier: 1.9.4 @@ -1372,7 +1418,7 @@ importers: version: 7.6.12 '@types/bun': specifier: latest - version: 1.2.12 + version: 1.2.13 '@types/node': specifier: ^22.10.1 version: 22.13.10 @@ -1442,13 +1488,13 @@ importers: version: 5.22.0(prisma@5.22.0) '@tanstack/react-start': specifier: ^1.114.34 - version: 1.114.34(lijngnfq54cp5rlnj53jssmkhu) + version: 1.114.34(xdtxozacaptx2f2yoax7hh4is4) '@types/better-sqlite3': specifier: ^7.6.12 version: 7.6.12 '@types/bun': specifier: latest - version: 1.2.12 + version: 1.2.13 '@types/pg': specifier: ^8.11.10 version: 8.11.11 @@ -1466,7 +1512,7 @@ importers: version: 9.1.2 drizzle-orm: specifier: ^0.38.2 - version: 0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0) + version: 0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0) happy-dom: specifier: ^15.11.7 version: 15.11.7 @@ -1565,7 +1611,7 @@ importers: version: 16.4.7 drizzle-orm: specifier: ^0.33.0 - version: 0.33.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@19.0.10)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0) + version: 0.33.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@19.0.10)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0) fs-extra: specifier: ^11.3.0 version: 11.3.0 @@ -1605,7 +1651,7 @@ importers: version: 5.8.2 unbuild: specifier: 'catalog:' - version: 3.5.0(sass@1.85.1)(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)) + version: 3.5.0(sass@1.85.1)(typescript@5.8.2)(vue@3.5.14(typescript@5.8.2)) vitest: specifier: ^1.6.0 version: 1.6.1(@types/node@22.15.3)(happy-dom@17.4.1)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0) @@ -1645,7 +1691,7 @@ importers: version: 14.0.2(expo@52.0.37(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@expo/metro-runtime@4.0.1(react-native@0.78.0(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@react-native-community/cli-server-api@13.6.9(encoding@0.1.13))(@types/react@19.0.10)(react@19.0.0)))(encoding@0.1.13)(graphql@15.10.1)(react-native@0.78.0(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@react-native-community/cli-server-api@13.6.9(encoding@0.1.13))(@types/react@19.0.10)(react@19.0.0))(react@19.0.0))(react-native@0.78.0(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@react-native-community/cli-server-api@13.6.9(encoding@0.1.13))(@types/react@19.0.10)(react@19.0.0)) unbuild: specifier: ^3.5.0 - version: 3.5.0(sass@1.85.1)(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)) + version: 3.5.0(sass@1.85.1)(typescript@5.8.2)(vue@3.5.14(typescript@5.8.2)) vitest: specifier: ^1.6.0 version: 1.6.1(@types/node@22.15.3)(happy-dom@17.4.1)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0) @@ -2162,6 +2208,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} @@ -3377,6 +3428,9 @@ packages: '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} @@ -4933,105 +4987,215 @@ packages: cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.1': + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.1': + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + cpu: [x64] + os: [linux] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm64@0.34.1': + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-arm@0.34.1': + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-s390x@0.34.1': + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linux-x64@0.34.1': + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.1': + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-x64@0.34.1': + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.1': + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.1': + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.1': + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@internationalized/date@3.5.5': resolution: {integrity: sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ==} @@ -5440,6 +5604,10 @@ packages: resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} engines: {node: '>=12.0.0'} + '@modelcontextprotocol/sdk@1.10.2': + resolution: {integrity: sha512-rb6AMp2DR4SN+kc6L1ta2NCpApyA9WYNx3CrTSZvGxq9wH71bRur+zRqPfg0vQ9mjywR7qZdX2RGHOPq3ss+tA==} + engines: {node: '>=18'} + '@mongodb-js/saslprep@1.1.9': resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} @@ -5505,6 +5673,9 @@ packages: '@next/env@15.2.3': resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==} + '@next/env@15.3.2': + resolution: {integrity: sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==} + '@next/eslint-plugin-next@15.0.0-canary.149': resolution: {integrity: sha512-luututuveL0xzHMFfuyVyfctC/7jdNS/iGrVqGbEvHqvW7W4yydwieasELkC4uY10onGoKGxg1PV8QciqMJqWQ==} @@ -5514,48 +5685,96 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@15.3.2': + resolution: {integrity: sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@15.2.3': resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@15.3.2': + resolution: {integrity: sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-linux-arm64-gnu@15.2.3': resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-gnu@15.3.2': + resolution: {integrity: sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@15.2.3': resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@15.3.2': + resolution: {integrity: sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-x64-gnu@15.2.3': resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-gnu@15.3.2': + resolution: {integrity: sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@15.2.3': resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@15.3.2': + resolution: {integrity: sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-win32-arm64-msvc@15.2.3': resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@15.3.2': + resolution: {integrity: sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-x64-msvc@15.2.3': resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@15.3.2': + resolution: {integrity: sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@noble/ciphers@0.6.0': resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} @@ -7874,6 +8093,35 @@ packages: react-native: optional: true + '@redis/bloom@1.2.0': + resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/client@1.6.1': + resolution: {integrity: sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==} + engines: {node: '>=14'} + + '@redis/graph@1.1.1': + resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/json@1.0.7': + resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/search@1.2.0': + resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/time-series@1.1.0': + resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} + peerDependencies: + '@redis/client': ^1.0.0 + '@redocly/ajv@8.11.2': resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} @@ -9413,8 +9661,8 @@ packages: '@types/braces@3.0.4': resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==} - '@types/bun@1.2.12': - resolution: {integrity: sha512-lY/GQTXDGsolT/TiH72p1tuyUORuRrdV7VwOTOjDOt8uTBJQOJc5zz3ufwwDl0VBaoxotSk4LdP0hhjLJ6ypIQ==} + '@types/bun@1.2.13': + resolution: {integrity: sha512-u6vXep/i9VBxoJl3GjZsl/BFIsvML8DfVDO0RYLEwtSZSp981kEO1V5NwRcO1CPJ7AmvpbnDCiMKo3JvbDEjAg==} '@types/canvas-confetti@1.9.0': resolution: {integrity: sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==} @@ -9945,6 +10193,11 @@ packages: vue-router: optional: true + '@vercel/mcp-adapter@0.4.1': + resolution: {integrity: sha512-/P1J1KGbQieNT9dKSt4Y+ZrLcnuf6W1cUMR0V+AcWRfQs7ilz64GaLVdpyUIoZFb45VHqRvTVEZ8YmQspEM/Kw==} + peerDependencies: + next: '>=13.0.0' + '@vercel/nft@0.29.2': resolution: {integrity: sha512-A/Si4mrTkQqJ6EXJKv5EYCDQ3NL6nJXxG8VGXePsaiQigsomHYQC9xSpX8qGk7AEZk4b1ssbYIqJ0ISQQ7bfcA==} engines: {node: '>=18'} @@ -10095,24 +10348,36 @@ packages: '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.14': + resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} + '@vue/compiler-dom@3.3.4': resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} '@vue/compiler-dom@3.5.13': resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.14': + resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==} + '@vue/compiler-sfc@3.3.4': resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} '@vue/compiler-sfc@3.5.13': resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-sfc@3.5.14': + resolution: {integrity: sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==} + '@vue/compiler-ssr@3.3.4': resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} '@vue/compiler-ssr@3.5.13': resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.14': + resolution: {integrity: sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==} + '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} @@ -10145,18 +10410,27 @@ packages: '@vue/reactivity@3.5.13': resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.14': + resolution: {integrity: sha512-7cK1Hp343Fu/SUCCO52vCabjvsYu7ZkOqyYu7bXV9P2yyfjUMUXHZafEbq244sP7gf+EZEz+77QixBTuEqkQQw==} + '@vue/runtime-core@3.3.4': resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} '@vue/runtime-core@3.5.13': resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.14': + resolution: {integrity: sha512-w9JWEANwHXNgieAhxPpEpJa+0V5G0hz3NmjAZwlOebtfKyp2hKxKF0+qSh0Xs6/PhfGihuSdqMprMVcQU/E6ag==} + '@vue/runtime-dom@3.3.4': resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} '@vue/runtime-dom@3.5.13': resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.14': + resolution: {integrity: sha512-lCfR++IakeI35TVR80QgOelsUIdcKjd65rWAMfdSlCYnaEY5t3hYwru7vvcWaqmrK+LpI7ZDDYiGU5V3xjMacw==} + '@vue/server-renderer@3.3.4': resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} peerDependencies: @@ -10167,12 +10441,20 @@ packages: peerDependencies: vue: 3.5.13 + '@vue/server-renderer@3.5.14': + resolution: {integrity: sha512-Rf/ISLqokIvcySIYnv3tNWq40PLpNLDLSJwwVWzG6MNtyIhfbcrAxo5ZL9nARJhqjZyWWa40oRb2IDuejeuv6w==} + peerDependencies: + vue: 3.5.14 + '@vue/shared@3.3.4': resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.14': + resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} + '@vueuse/core@10.11.1': resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} @@ -10433,6 +10715,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -10956,6 +11242,10 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -11046,8 +11336,8 @@ packages: engines: {node: '>=10'} hasBin: true - bun-types@1.2.12: - resolution: {integrity: sha512-tvWMx5vPqbRXgE8WUZI94iS1xAYs8bkqESR9cxBB1Wi+urvfTrF1uzuDgBHFAdO0+d2lmsbG3HmeKMvUyj6pWA==} + bun-types@1.2.13: + resolution: {integrity: sha512-rRjA1T6n7wto4gxhAO/ErZEtOXyEZEmnIHQfl0Dt1QQSB4QV0iP6BZ9/YB5fZaHFQ2dwHFrmPaRQ9GGMX01k9Q==} bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} @@ -11518,6 +11808,10 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + content-security-policy-parser@0.4.1: resolution: {integrity: sha512-NNJS8XPnx3OKr/CUOSwDSJw+lWTrZMYnclLKj0Y9CYOfJNJTWLFGPg3u2hYgbXMXKVRkZR2fbyReNQ1mUff/Qg==} engines: {node: '>=8.0.0'} @@ -13117,6 +13411,14 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.0.2: + resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + exec-async@2.2.0: resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==} @@ -13278,10 +13580,20 @@ packages: exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + express-rate-limit@7.5.0: + resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + engines: {node: '>= 16'} + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + express@4.21.1: resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} engines: {node: '>= 0.10.0'} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + exsolve@1.0.2: resolution: {integrity: sha512-ZEcIMbthn2zeX4/wD/DLxDUjuCltHXT8Htvm/JFlTkdYgWh2+HGppgwwNUnIVxzxP7yJOPtuBAec0dLx6lVY8w==} @@ -13437,6 +13749,10 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} @@ -13583,6 +13899,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -13711,6 +14031,10 @@ packages: generic-names@4.0.0: resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + generic-pool@3.9.0: + resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} + engines: {node: '>= 4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -14566,6 +14890,9 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} @@ -15608,6 +15935,10 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} @@ -15627,6 +15958,10 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-options@3.0.4: resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} engines: {node: '>=10'} @@ -16008,10 +16343,18 @@ packages: resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -16402,6 +16745,27 @@ packages: sass: optional: true + next@15.3.2: + resolution: {integrity: sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -16959,6 +17323,10 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -17080,6 +17448,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} @@ -17648,6 +18020,10 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + quansync@0.2.8: resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} @@ -17692,6 +18068,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -18061,6 +18441,9 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} + redis@4.7.1: + resolution: {integrity: sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -18389,6 +18772,10 @@ packages: rou3@0.5.1: resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-applescript@7.0.0: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} engines: {node: '>=18'} @@ -18511,6 +18898,10 @@ packages: resolution: {integrity: sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==} engines: {node: '>= 0.8.0'} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} @@ -18538,6 +18929,10 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -18586,6 +18981,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -19584,6 +19983,10 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -20623,6 +21026,14 @@ packages: typescript: optional: true + vue@3.5.14: + resolution: {integrity: sha512-LbOm50/vZFG6Mhy6KscQYXZMQ0LMCC/y40HDJPPvGFQ+i/lUH+PJHR6C3assgOQiXdl6tAfsXHbXYVBZZu65ew==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -20990,6 +21401,9 @@ packages: zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.24.4: + resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + zustand@3.7.2: resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} engines: {node: '>=12.7.0'} @@ -22070,6 +22484,10 @@ snapshots: dependencies: '@babel/types': 7.27.1 + '@babel/parser@7.27.2': + dependencies: + '@babel/types': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.9)': dependencies: '@babel/core': 7.26.9 @@ -24508,6 +24926,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.1': dependencies: tslib: 2.8.1 @@ -25677,11 +26100,11 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@floating-ui/vue@1.1.5(vue@3.5.13(typescript@5.8.2))': + '@floating-ui/vue@1.1.5(vue@3.5.14(typescript@5.8.2))': dependencies: '@floating-ui/dom': 1.6.12 '@floating-ui/utils': 0.2.8 - vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.14(typescript@5.8.2)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -25738,7 +26161,7 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} - '@ianvs/prettier-plugin-sort-imports@4.1.1(@vue/compiler-sfc@3.5.13)(prettier@3.2.4)': + '@ianvs/prettier-plugin-sort-imports@4.1.1(@vue/compiler-sfc@3.5.14)(prettier@3.2.4)': dependencies: '@babel/core': 7.26.9 '@babel/generator': 7.26.9 @@ -25748,7 +26171,7 @@ snapshots: prettier: 3.2.4 semver: 7.7.1 optionalDependencies: - '@vue/compiler-sfc': 3.5.13 + '@vue/compiler-sfc': 3.5.14 transitivePeerDependencies: - supports-color @@ -25757,76 +26180,154 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true + '@img/sharp-darwin-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.1.0': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.1.0': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.1.0': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.1.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.1.0': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.1.0': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.1.0': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true + '@img/sharp-linux-s390x@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.3.1 optional: true + '@img/sharp-wasm32@0.34.1': + dependencies: + '@emnapi/runtime': 1.4.3 + optional: true + '@img/sharp-win32-ia32@0.33.5': optional: true + '@img/sharp-win32-ia32@0.34.1': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.1': + optional: true + '@internationalized/date@3.5.5': dependencies: '@swc/helpers': 0.5.15 @@ -25926,7 +26427,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.3 + '@types/node': 20.17.24 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -26340,6 +26841,21 @@ snapshots: '@lezer/lr': 1.4.2 json5: 2.2.3 + '@modelcontextprotocol/sdk@1.10.2': + dependencies: + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + express: 5.1.0 + express-rate-limit: 7.5.0(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.24.4 + zod-to-json-schema: 3.24.3(zod@3.24.4) + transitivePeerDependencies: + - supports-color + '@mongodb-js/saslprep@1.1.9': dependencies: sparse-bitfield: 3.0.3 @@ -26394,6 +26910,8 @@ snapshots: '@next/env@15.2.3': {} + '@next/env@15.3.2': {} + '@next/eslint-plugin-next@15.0.0-canary.149': dependencies: fast-glob: 3.3.1 @@ -26401,27 +26919,51 @@ snapshots: '@next/swc-darwin-arm64@15.2.3': optional: true + '@next/swc-darwin-arm64@15.3.2': + optional: true + '@next/swc-darwin-x64@15.2.3': optional: true + '@next/swc-darwin-x64@15.3.2': + optional: true + '@next/swc-linux-arm64-gnu@15.2.3': optional: true + '@next/swc-linux-arm64-gnu@15.3.2': + optional: true + '@next/swc-linux-arm64-musl@15.2.3': optional: true + '@next/swc-linux-arm64-musl@15.3.2': + optional: true + '@next/swc-linux-x64-gnu@15.2.3': optional: true + '@next/swc-linux-x64-gnu@15.3.2': + optional: true + '@next/swc-linux-x64-musl@15.2.3': optional: true + '@next/swc-linux-x64-musl@15.3.2': + optional: true + '@next/swc-win32-arm64-msvc@15.2.3': optional: true + '@next/swc-win32-arm64-msvc@15.3.2': + optional: true + '@next/swc-win32-x64-msvc@15.2.3': optional: true + '@next/swc-win32-x64-msvc@15.3.2': + optional: true + '@noble/ciphers@0.6.0': {} '@noble/hashes@1.7.1': {} @@ -26530,12 +27072,12 @@ snapshots: prompts: 2.4.2 semver: 7.7.1 - '@nuxt/devtools@2.2.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))': + '@nuxt/devtools@2.2.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2))': dependencies: '@nuxt/devtools-kit': 2.2.1(magicast@0.3.5)(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) '@nuxt/devtools-wizard': 2.2.1 '@nuxt/kit': 3.16.0(magicast@0.3.5) - '@vue/devtools-core': 7.7.2(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2)) + '@vue/devtools-core': 7.7.2(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2)) '@vue/devtools-kit': 7.7.2 birpc: 2.2.0 consola: 3.4.0 @@ -26562,7 +27104,7 @@ snapshots: tinyglobby: 0.2.12 vite: 6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) vite-plugin-inspect: 11.0.0(@nuxt/kit@3.16.0(magicast@0.3.5))(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) - vite-plugin-vue-tracer: 0.1.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2)) + vite-plugin-vue-tracer: 0.1.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2)) which: 5.0.0 ws: 8.18.1 transitivePeerDependencies: @@ -26649,12 +27191,12 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/vite-builder@3.16.0(@biomejs/biome@1.9.4)(@types/node@22.15.3)(eslint@9.22.0(jiti@2.4.2))(less@4.2.2)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.38.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))(yaml@2.7.0)': + '@nuxt/vite-builder@3.16.0(@biomejs/biome@1.9.4)(@types/node@22.15.3)(eslint@9.22.0(jiti@2.4.2))(less@4.2.2)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.38.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(vue@3.5.14(typescript@5.8.2))(yaml@2.7.0)': dependencies: '@nuxt/kit': 3.16.0(magicast@0.3.5) '@rollup/plugin-replace': 6.0.2(rollup@4.38.0) - '@vitejs/plugin-vue': 5.2.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2)) - '@vitejs/plugin-vue-jsx': 4.1.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2)) + '@vitejs/plugin-vue': 5.2.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2)) + '@vitejs/plugin-vue-jsx': 4.1.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2)) autoprefixer: 10.4.20(postcss@8.5.3) consola: 3.4.0 cssnano: 7.0.6(postcss@8.5.3) @@ -26682,7 +27224,7 @@ snapshots: vite: 6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) vite-node: 3.0.8(@types/node@22.15.3)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0) vite-plugin-checker: 0.9.0(@biomejs/biome@1.9.4)(eslint@9.22.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.2)(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: - '@biomejs/biome' @@ -28071,9 +28613,9 @@ snapshots: '@prisma/debug': 6.4.1 optional: true - '@radix-icons/vue@1.0.0(vue@3.5.13(typescript@5.8.2))': + '@radix-icons/vue@1.0.0(vue@3.5.14(typescript@5.8.2))': dependencies: - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) '@radix-ui/number@1.1.0': {} @@ -30808,6 +31350,32 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@redis/bloom@1.2.0(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + + '@redis/client@1.6.1': + dependencies: + cluster-key-slot: 1.1.2 + generic-pool: 3.9.0 + yallist: 4.0.0 + + '@redis/graph@1.1.1(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + + '@redis/json@1.0.7(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + + '@redis/search@1.2.0(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + + '@redis/time-series@1.1.0(@redis/client@1.6.1)': + dependencies: + '@redis/client': 1.6.1 + '@redocly/ajv@8.11.2': dependencies: fast-deep-equal: 3.1.3 @@ -32165,11 +32733,11 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-api-routes@1.112.18(aguku5xwh67z542n34jhfwn7wm)': + '@tanstack/react-start-api-routes@1.112.18(do3hc3md4wd7it5bigaqcra2vq)': dependencies: - '@tanstack/react-start-server': 1.112.18(aguku5xwh67z542n34jhfwn7wm) + '@tanstack/react-start-server': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) '@tanstack/router-core': 1.112.18 - vinxi: 0.5.3(5mkccpfbjktkt3otnngqrrcgde) + vinxi: 0.5.3(qmycrikecd3inn5enqnqcdtkym) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -32215,7 +32783,7 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-client@1.112.18(aguku5xwh67z542n34jhfwn7wm)': + '@tanstack/react-start-client@1.112.18(do3hc3md4wd7it5bigaqcra2vq)': dependencies: '@tanstack/react-router': 1.112.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-core': 1.112.18 @@ -32225,7 +32793,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - vinxi: 0.5.3(5mkccpfbjktkt3otnngqrrcgde) + vinxi: 0.5.3(qmycrikecd3inn5enqnqcdtkym) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -32269,7 +32837,7 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-client@1.114.34(3rgr7yknbwuqb7flheblwpv2eq)': + '@tanstack/react-start-client@1.114.34(2plvxtj6a7vw55mtbqwukj7brm)': dependencies: '@tanstack/react-router': 1.114.34(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tanstack/router-core': 1.114.33 @@ -32280,7 +32848,7 @@ snapshots: react-dom: 19.0.0(react@19.0.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - vinxi: 0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) + vinxi: 0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -32324,7 +32892,7 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-client@1.114.34(aguku5xwh67z542n34jhfwn7wm)': + '@tanstack/react-start-client@1.114.34(do3hc3md4wd7it5bigaqcra2vq)': dependencies: '@tanstack/react-router': 1.114.34(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/router-core': 1.114.33 @@ -32335,7 +32903,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - vinxi: 0.5.3(5mkccpfbjktkt3otnngqrrcgde) + vinxi: 0.5.3(qmycrikecd3inn5enqnqcdtkym) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -32379,7 +32947,7 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-config@1.114.34(lijngnfq54cp5rlnj53jssmkhu)': + '@tanstack/react-start-config@1.114.34(xdtxozacaptx2f2yoax7hh4is4)': dependencies: '@tanstack/react-start-plugin': 1.114.32(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) '@tanstack/router-core': 1.114.33 @@ -32389,11 +32957,11 @@ snapshots: '@tanstack/start-server-functions-handler': 1.114.33 '@vitejs/plugin-react': 4.3.4(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) import-meta-resolve: 4.1.0 - nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) + nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) ofetch: 1.4.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - vinxi: 0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) + vinxi: 0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) vite: 6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) zod: 3.24.2 transitivePeerDependencies: @@ -32498,11 +33066,11 @@ snapshots: - tsx - yaml - '@tanstack/react-start-router-manifest@1.112.18(5mkccpfbjktkt3otnngqrrcgde)': + '@tanstack/react-start-router-manifest@1.112.18(qmycrikecd3inn5enqnqcdtkym)': dependencies: '@tanstack/router-core': 1.112.18 tiny-invariant: 1.3.3 - vinxi: 0.5.3(5mkccpfbjktkt3otnngqrrcgde) + vinxi: 0.5.3(qmycrikecd3inn5enqnqcdtkym) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -32546,11 +33114,11 @@ snapshots: - xml2js - yaml - ? '@tanstack/react-start-router-manifest@1.114.33(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0)' + ? '@tanstack/react-start-router-manifest@1.114.33(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0)' : dependencies: '@tanstack/router-core': 1.114.33 tiny-invariant: 1.3.3 - vinxi: 0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) + vinxi: 0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -32594,9 +33162,9 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-server-functions-client@1.112.18(fbq2slcpifq65x7m35legngaoq)': + '@tanstack/react-start-server-functions-client@1.112.18(rikohmhqegmq4stnnvkdxooyim)': dependencies: - '@tanstack/react-start-server-functions-fetcher': 1.112.18(aguku5xwh67z542n34jhfwn7wm) + '@tanstack/react-start-server-functions-fetcher': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) '@tanstack/server-functions-plugin': 1.112.18(@types/node@22.13.10)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - '@azure/app-configuration' @@ -32644,10 +33212,10 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-server-functions-fetcher@1.112.18(aguku5xwh67z542n34jhfwn7wm)': + '@tanstack/react-start-server-functions-fetcher@1.112.18(do3hc3md4wd7it5bigaqcra2vq)': dependencies: '@tanstack/react-router': 1.112.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-start-client': 1.114.34(aguku5xwh67z542n34jhfwn7wm) + '@tanstack/react-start-client': 1.114.34(do3hc3md4wd7it5bigaqcra2vq) '@tanstack/router-core': 1.112.18 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -32694,11 +33262,11 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-server-functions-handler@1.112.18(aguku5xwh67z542n34jhfwn7wm)': + '@tanstack/react-start-server-functions-handler@1.112.18(do3hc3md4wd7it5bigaqcra2vq)': dependencies: '@tanstack/react-router': 1.112.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-start-client': 1.112.18(aguku5xwh67z542n34jhfwn7wm) - '@tanstack/react-start-server': 1.112.18(aguku5xwh67z542n34jhfwn7wm) + '@tanstack/react-start-client': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) + '@tanstack/react-start-server': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tiny-invariant: 1.3.3 @@ -32745,11 +33313,11 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-server-functions-ssr@1.112.18(fbq2slcpifq65x7m35legngaoq)': + '@tanstack/react-start-server-functions-ssr@1.112.18(rikohmhqegmq4stnnvkdxooyim)': dependencies: - '@tanstack/react-start-client': 1.112.18(aguku5xwh67z542n34jhfwn7wm) - '@tanstack/react-start-server': 1.112.18(aguku5xwh67z542n34jhfwn7wm) - '@tanstack/react-start-server-functions-fetcher': 1.112.18(aguku5xwh67z542n34jhfwn7wm) + '@tanstack/react-start-client': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) + '@tanstack/react-start-server': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) + '@tanstack/react-start-server-functions-fetcher': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) '@tanstack/server-functions-plugin': 1.112.18(@types/node@22.13.10)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) tiny-invariant: 1.3.3 transitivePeerDependencies: @@ -32798,11 +33366,11 @@ snapshots: - xml2js - yaml - '@tanstack/react-start-server@1.112.18(aguku5xwh67z542n34jhfwn7wm)': + '@tanstack/react-start-server@1.112.18(do3hc3md4wd7it5bigaqcra2vq)': dependencies: '@tanstack/history': 1.112.18 '@tanstack/react-router': 1.112.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-start-client': 1.112.18(aguku5xwh67z542n34jhfwn7wm) + '@tanstack/react-start-client': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) '@tanstack/router-core': 1.112.18 h3: 1.13.0 isbot: 5.1.23 @@ -32869,13 +33437,13 @@ snapshots: tiny-warning: 1.0.3 unctx: 2.4.1 - '@tanstack/react-start@1.114.34(lijngnfq54cp5rlnj53jssmkhu)': + '@tanstack/react-start@1.114.34(xdtxozacaptx2f2yoax7hh4is4)': dependencies: - '@tanstack/react-start-client': 1.114.34(3rgr7yknbwuqb7flheblwpv2eq) - '@tanstack/react-start-config': 1.114.34(lijngnfq54cp5rlnj53jssmkhu) - '@tanstack/react-start-router-manifest': 1.114.33(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) + '@tanstack/react-start-client': 1.114.34(2plvxtj6a7vw55mtbqwukj7brm) + '@tanstack/react-start-config': 1.114.34(xdtxozacaptx2f2yoax7hh4is4) + '@tanstack/react-start-router-manifest': 1.114.33(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) '@tanstack/react-start-server': 1.114.34(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/start-api-routes': 1.114.33(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) + '@tanstack/start-api-routes': 1.114.33(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) '@tanstack/start-server-functions-client': 1.114.33(@types/node@22.15.3)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) '@tanstack/start-server-functions-handler': 1.114.33 '@tanstack/start-server-functions-server': 1.114.32(@types/node@22.15.3)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) @@ -33096,11 +33664,11 @@ snapshots: - tsx - yaml - '@tanstack/start-api-routes@1.114.33(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0)': + '@tanstack/start-api-routes@1.114.33(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0)': dependencies: '@tanstack/router-core': 1.114.33 '@tanstack/start-server-core': 1.114.33 - vinxi: 0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) + vinxi: 0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -33151,21 +33719,21 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-config@1.113.0(hcvcmo22cfk2zc45m3egdtrfb4)': + '@tanstack/start-config@1.113.0(umfczj6grv5xwnnilehiba4mti)': dependencies: '@tanstack/react-router': 1.112.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-start-plugin': 1.112.18(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - '@tanstack/react-start-server-functions-handler': 1.112.18(aguku5xwh67z542n34jhfwn7wm) + '@tanstack/react-start-server-functions-handler': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) '@tanstack/router-generator': 1.113.0(@tanstack/react-router@1.112.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@tanstack/router-plugin': 1.113.0(@tanstack/react-router@1.112.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite-plugin-solid@2.11.6(solid-js@1.9.5)(vite@6.3.4(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(vite@6.3.4(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) '@tanstack/server-functions-plugin': 1.112.18(@types/node@22.13.10)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) '@vitejs/plugin-react': 4.3.4(vite@6.3.4(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) import-meta-resolve: 4.1.0 - nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) + nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) ofetch: 1.4.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - vinxi: 0.5.3(5mkccpfbjktkt3otnngqrrcgde) + vinxi: 0.5.3(qmycrikecd3inn5enqnqcdtkym) vite: 6.3.4(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) zod: 3.24.2 transitivePeerDependencies: @@ -33317,16 +33885,16 @@ snapshots: - tsx - yaml - '@tanstack/start@1.113.0(hcvcmo22cfk2zc45m3egdtrfb4)': + '@tanstack/start@1.113.0(umfczj6grv5xwnnilehiba4mti)': dependencies: - '@tanstack/react-start-api-routes': 1.112.18(aguku5xwh67z542n34jhfwn7wm) - '@tanstack/react-start-client': 1.112.18(aguku5xwh67z542n34jhfwn7wm) - '@tanstack/react-start-router-manifest': 1.112.18(5mkccpfbjktkt3otnngqrrcgde) - '@tanstack/react-start-server': 1.112.18(aguku5xwh67z542n34jhfwn7wm) - '@tanstack/react-start-server-functions-client': 1.112.18(fbq2slcpifq65x7m35legngaoq) - '@tanstack/react-start-server-functions-handler': 1.112.18(aguku5xwh67z542n34jhfwn7wm) - '@tanstack/react-start-server-functions-ssr': 1.112.18(fbq2slcpifq65x7m35legngaoq) - '@tanstack/start-config': 1.113.0(hcvcmo22cfk2zc45m3egdtrfb4) + '@tanstack/react-start-api-routes': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) + '@tanstack/react-start-client': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) + '@tanstack/react-start-router-manifest': 1.112.18(qmycrikecd3inn5enqnqcdtkym) + '@tanstack/react-start-server': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) + '@tanstack/react-start-server-functions-client': 1.112.18(rikohmhqegmq4stnnvkdxooyim) + '@tanstack/react-start-server-functions-handler': 1.112.18(do3hc3md4wd7it5bigaqcra2vq) + '@tanstack/react-start-server-functions-ssr': 1.112.18(rikohmhqegmq4stnnvkdxooyim) + '@tanstack/start-config': 1.113.0(umfczj6grv5xwnnilehiba4mti) '@tanstack/start-server-functions-server': 1.112.18(@types/node@22.13.10)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - '@azure/app-configuration' @@ -33386,10 +33954,10 @@ snapshots: '@tanstack/virtual-file-routes@1.99.0': {} - '@tanstack/vue-virtual@3.10.8(vue@3.5.13(typescript@5.8.2))': + '@tanstack/vue-virtual@3.10.8(vue@3.5.14(typescript@5.8.2))': dependencies: '@tanstack/virtual-core': 3.10.8 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) '@trysound/sax@0.2.0': {} @@ -33437,9 +34005,9 @@ snapshots: '@types/braces@3.0.4': {} - '@types/bun@1.2.12': + '@types/bun@1.2.13': dependencies: - bun-types: 1.2.12 + bun-types: 1.2.13 '@types/canvas-confetti@1.9.0': {} @@ -33610,7 +34178,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 '@types/hammerjs@2.0.46': {} @@ -33628,7 +34196,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 '@types/istanbul-lib-coverage@2.0.6': {} @@ -33651,7 +34219,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 '@types/leaflet@1.7.6': dependencies: @@ -33689,7 +34257,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 '@types/node@18.19.87': dependencies: @@ -33714,6 +34282,7 @@ snapshots: '@types/node@22.15.3': dependencies: undici-types: 6.21.0 + optional: true '@types/parse-json@4.0.2': {} @@ -33864,7 +34433,7 @@ snapshots: '@types/ws@8.5.13': dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 '@types/yargs-parser@21.0.3': {} @@ -34042,11 +34611,11 @@ snapshots: hookable: 5.5.3 zhead: 2.2.4 - '@unhead/vue@2.0.0-rc.9(vue@3.5.13(typescript@5.8.2))': + '@unhead/vue@2.0.0-rc.9(vue@3.5.14(typescript@5.8.2))': dependencies: hookable: 5.5.3 unhead: 2.0.0-rc.9 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) '@unovis/dagre-layout@0.8.8-2': dependencies: @@ -34094,10 +34663,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@unovis/vue@1.4.3-beta.0(@unovis/ts@1.4.3-beta.0)(vue@3.5.13(typescript@5.8.2))': + '@unovis/vue@1.4.3-beta.0(@unovis/ts@1.4.3-beta.0)(vue@3.5.14(typescript@5.8.2))': dependencies: '@unovis/ts': 1.4.3-beta.0 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) '@urql/core@5.1.1(graphql@15.10.1)': dependencies: @@ -34163,23 +34732,31 @@ snapshots: '@vanilla-extract/private@1.0.6': {} - '@vee-validate/zod@4.15.0(vue@3.5.13(typescript@5.8.2))(zod@3.24.2)': + '@vee-validate/zod@4.15.0(vue@3.5.14(typescript@5.8.2))(zod@3.24.2)': dependencies: type-fest: 4.26.1 - vee-validate: 4.15.0(vue@3.5.13(typescript@5.8.2)) + vee-validate: 4.15.0(vue@3.5.14(typescript@5.8.2)) zod: 3.24.2 transitivePeerDependencies: - vue - '@vercel/analytics@1.5.0(@remix-run/react@2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@sveltejs/kit@2.19.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(next@15.2.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)(svelte@5.22.6)(vue-router@4.5.1(vue@3.5.13(typescript@5.8.2)))(vue@3.5.13(typescript@5.8.2))': + '@vercel/analytics@1.5.0(@remix-run/react@2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@sveltejs/kit@2.19.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(next@15.2.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)(svelte@5.22.6)(vue-router@4.5.1(vue@3.5.14(typescript@5.8.2)))(vue@3.5.14(typescript@5.8.2))': optionalDependencies: '@remix-run/react': 2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) '@sveltejs/kit': 2.19.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)))(svelte@5.22.6)(vite@6.3.4(@types/node@22.13.8)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) next: 15.2.3(@babel/core@7.26.9)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) react: 19.0.0 svelte: 5.22.6 - vue: 3.5.13(typescript@5.8.2) - vue-router: 4.5.1(vue@3.5.13(typescript@5.8.2)) + vue: 3.5.14(typescript@5.8.2) + vue-router: 4.5.1(vue@3.5.14(typescript@5.8.2)) + + '@vercel/mcp-adapter@0.4.1(next@15.3.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))': + dependencies: + '@modelcontextprotocol/sdk': 1.10.2 + next: 15.3.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + redis: 4.7.1 + transitivePeerDependencies: + - supports-color '@vercel/nft@0.29.2(encoding@0.1.13)(rollup@4.38.0)': dependencies: @@ -34257,20 +34834,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.1.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))': + '@vitejs/plugin-vue-jsx@4.1.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2))': dependencies: '@babel/core': 7.26.9 '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.9) '@vue/babel-plugin-jsx': 1.3.0(@babel/core@7.26.9) vite: 6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))': + '@vitejs/plugin-vue@5.2.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2))': dependencies: vite: 6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) '@vitest/expect@1.6.1': dependencies: @@ -34412,7 +34989,7 @@ snapshots: '@vscode/l10n@0.0.18': {} - '@vue-macros/common@1.16.1(vue@3.5.13(typescript@5.8.2))': + '@vue-macros/common@1.16.1(vue@3.5.14(typescript@5.8.2))': dependencies: '@vue/compiler-sfc': 3.5.13 ast-kit: 1.4.2 @@ -34421,7 +34998,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.2 optionalDependencies: - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) '@vue/babel-helper-vue-transform-on@1.3.0': {} @@ -34461,12 +35038,20 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.1 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.14': + dependencies: + '@babel/parser': 7.27.2 + '@vue/shared': 3.5.14 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.3.4': dependencies: '@vue/compiler-core': 3.3.4 @@ -34477,6 +35062,11 @@ snapshots: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 + '@vue/compiler-dom@3.5.14': + dependencies: + '@vue/compiler-core': 3.5.14 + '@vue/shared': 3.5.14 + '@vue/compiler-sfc@3.3.4': dependencies: '@babel/parser': 7.27.1 @@ -34502,6 +35092,18 @@ snapshots: postcss: 8.5.3 source-map-js: 1.2.1 + '@vue/compiler-sfc@3.5.14': + dependencies: + '@babel/parser': 7.27.2 + '@vue/compiler-core': 3.5.14 + '@vue/compiler-dom': 3.5.14 + '@vue/compiler-ssr': 3.5.14 + '@vue/shared': 3.5.14 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.3 + source-map-js: 1.2.1 + '@vue/compiler-ssr@3.3.4': dependencies: '@vue/compiler-dom': 3.3.4 @@ -34512,13 +35114,18 @@ snapshots: '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 + '@vue/compiler-ssr@3.5.14': + dependencies: + '@vue/compiler-dom': 3.5.14 + '@vue/shared': 3.5.14 + '@vue/devtools-api@6.6.4': {} '@vue/devtools-api@7.6.2': dependencies: '@vue/devtools-kit': 7.6.2 - '@vue/devtools-core@7.7.2(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2))': + '@vue/devtools-core@7.7.2(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2))': dependencies: '@vue/devtools-kit': 7.7.2 '@vue/devtools-shared': 7.7.2 @@ -34526,7 +35133,7 @@ snapshots: nanoid: 5.1.5 pathe: 2.0.3 vite-hot-client: 0.2.4(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) transitivePeerDependencies: - vite @@ -34574,6 +35181,10 @@ snapshots: dependencies: '@vue/shared': 3.5.13 + '@vue/reactivity@3.5.14': + dependencies: + '@vue/shared': 3.5.14 + '@vue/runtime-core@3.3.4': dependencies: '@vue/reactivity': 3.3.4 @@ -34584,6 +35195,11 @@ snapshots: '@vue/reactivity': 3.5.13 '@vue/shared': 3.5.13 + '@vue/runtime-core@3.5.14': + dependencies: + '@vue/reactivity': 3.5.14 + '@vue/shared': 3.5.14 + '@vue/runtime-dom@3.3.4': dependencies: '@vue/runtime-core': 3.3.4 @@ -34597,6 +35213,13 @@ snapshots: '@vue/shared': 3.5.13 csstype: 3.1.3 + '@vue/runtime-dom@3.5.14': + dependencies: + '@vue/reactivity': 3.5.14 + '@vue/runtime-core': 3.5.14 + '@vue/shared': 3.5.14 + csstype: 3.1.3 + '@vue/server-renderer@3.3.4(vue@3.3.4)': dependencies: '@vue/compiler-ssr': 3.3.4 @@ -34609,26 +35232,34 @@ snapshots: '@vue/shared': 3.5.13 vue: 3.5.13(typescript@5.8.2) + '@vue/server-renderer@3.5.14(vue@3.5.14(typescript@5.8.2))': + dependencies: + '@vue/compiler-ssr': 3.5.14 + '@vue/shared': 3.5.14 + vue: 3.5.14(typescript@5.8.2) + '@vue/shared@3.3.4': {} '@vue/shared@3.5.13': {} - '@vueuse/core@10.11.1(vue@3.5.13(typescript@5.8.2))': + '@vue/shared@3.5.14': {} + + '@vueuse/core@10.11.1(vue@3.5.14(typescript@5.8.2))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 10.11.1 - '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.8.2)) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + '@vueuse/shared': 10.11.1(vue@3.5.14(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.14(typescript@5.8.2)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/core@11.3.0(vue@3.5.13(typescript@5.8.2))': + '@vueuse/core@11.3.0(vue@3.5.14(typescript@5.8.2))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 11.3.0 - '@vueuse/shared': 11.3.0(vue@3.5.13(typescript@5.8.2)) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + '@vueuse/shared': 11.3.0(vue@3.5.14(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.14(typescript@5.8.2)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -34637,16 +35268,16 @@ snapshots: '@vueuse/metadata@11.3.0': {} - '@vueuse/shared@10.11.1(vue@3.5.13(typescript@5.8.2))': + '@vueuse/shared@10.11.1(vue@3.5.14(typescript@5.8.2))': dependencies: - vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.14(typescript@5.8.2)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/shared@11.3.0(vue@3.5.13(typescript@5.8.2))': + '@vueuse/shared@11.3.0(vue@3.5.14(typescript@5.8.2))': dependencies: - vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.14(typescript@5.8.2)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -35170,6 +35801,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn-import-attributes@1.9.5(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -35456,7 +36092,7 @@ snapshots: ast-walker-scope@0.6.2: dependencies: - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.1 ast-kit: 1.4.2 astral-regex@1.0.0: {} @@ -36026,6 +36662,20 @@ snapshots: transitivePeerDependencies: - supports-color + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.0(supports-color@9.4.0) + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + boolbase@1.0.0: {} boxen@7.1.1: @@ -36151,9 +36801,9 @@ snapshots: transitivePeerDependencies: - magicast - bun-types@1.2.12: + bun-types@1.2.13: dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 bundle-name@4.1.0: dependencies: @@ -36412,7 +37062,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -36423,7 +37073,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -36697,6 +37347,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + content-security-policy-parser@0.4.1: {} content-type@1.0.5: {} @@ -37213,18 +37867,18 @@ snapshots: dayjs@1.11.13: {} - db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0): + db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0): optionalDependencies: '@libsql/client': 0.14.0 better-sqlite3: 11.8.1 - drizzle-orm: 0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0) + drizzle-orm: 0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0) mysql2: 3.13.0 - db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0): + db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0): optionalDependencies: '@libsql/client': 0.14.0 better-sqlite3: 11.8.1 - drizzle-orm: 0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)) + drizzle-orm: 0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)) mysql2: 3.13.0 debug@2.6.9: @@ -37460,7 +38114,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.33.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@19.0.10)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0): + drizzle-orm@0.33.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@19.0.10)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0): optionalDependencies: '@cloudflare/workers-types': 4.20250303.0 '@libsql/client': 0.14.0 @@ -37469,14 +38123,14 @@ snapshots: '@types/pg': 8.11.11 '@types/react': 19.0.10 better-sqlite3: 11.8.1 - bun-types: 1.2.12 + bun-types: 1.2.13 kysely: 0.28.1 mysql2: 3.13.0 pg: 8.13.3 prisma: 5.22.0 react: 19.0.0 - drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0): + drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0): optionalDependencies: '@cloudflare/workers-types': 4.20250303.0 '@libsql/client': 0.14.0 @@ -37486,14 +38140,14 @@ snapshots: '@types/pg': 8.11.11 '@types/react': 18.3.18 better-sqlite3: 11.8.1 - bun-types: 1.2.12 + bun-types: 1.2.13 kysely: 0.28.1 mysql2: 3.13.0 pg: 8.13.3 prisma: 5.22.0 react: 19.0.0 - drizzle-orm@0.39.3(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)): + drizzle-orm@0.39.3(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)): optionalDependencies: '@cloudflare/workers-types': 4.20250303.0 '@libsql/client': 0.14.0 @@ -37502,13 +38156,13 @@ snapshots: '@types/better-sqlite3': 7.6.12 '@types/pg': 8.11.11 better-sqlite3: 11.8.1 - bun-types: 1.2.12 + bun-types: 1.2.13 kysely: 0.28.1 mysql2: 3.13.0 pg: 8.13.3 prisma: 6.4.1(typescript@5.8.2) - drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)): + drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)): optionalDependencies: '@cloudflare/workers-types': 4.20250303.0 '@libsql/client': 0.14.0 @@ -37517,7 +38171,7 @@ snapshots: '@types/better-sqlite3': 7.6.12 '@types/pg': 8.11.11 better-sqlite3: 11.8.1 - bun-types: 1.2.12 + bun-types: 1.2.13 gel: 2.0.1 kysely: 0.28.1 mysql2: 3.13.0 @@ -37599,11 +38253,11 @@ snapshots: embla-carousel-reactive-utils: 8.5.2(embla-carousel@8.5.2) svelte: 4.2.19 - embla-carousel-vue@8.5.2(vue@3.5.13(typescript@5.8.2)): + embla-carousel-vue@8.5.2(vue@3.5.14(typescript@5.8.2)): dependencies: embla-carousel: 8.5.2 embla-carousel-reactive-utils: 8.5.2(embla-carousel@8.5.2) - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) embla-carousel@8.5.2: {} @@ -38581,7 +39235,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -38592,6 +39246,12 @@ snapshots: events@3.3.0: {} + eventsource-parser@3.0.2: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.2 + exec-async@2.2.0: {} execa@1.0.0: @@ -38934,6 +39594,10 @@ snapshots: exponential-backoff@3.1.2: {} + express-rate-limit@7.5.0(express@5.1.0): + dependencies: + express: 5.1.0 + express@4.21.1: dependencies: accepts: 1.3.8 @@ -38970,6 +39634,38 @@ snapshots: transitivePeerDependencies: - supports-color + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.0(supports-color@9.4.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + exsolve@1.0.2: {} extend-shallow@2.0.1: @@ -39146,6 +39842,17 @@ snapshots: transitivePeerDependencies: - supports-color + finalhandler@2.1.0: + dependencies: + debug: 4.4.0(supports-color@9.4.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-cache-dir@2.1.0: dependencies: commondir: 1.0.1 @@ -39279,6 +39986,8 @@ snapshots: fresh@0.5.2: {} + fresh@2.0.0: {} + fs-constants@1.0.0: {} fs-extra@10.1.0: @@ -39473,6 +40182,8 @@ snapshots: dependencies: loader-utils: 3.3.1 + generic-pool@3.9.0: {} + gensync@1.0.0-beta.2: {} geojson-vt@3.2.1: {} @@ -40483,6 +41194,8 @@ snapshots: is-plain-object@5.0.0: {} + is-promise@4.0.0: {} + is-property@1.0.2: {} is-reference@1.2.1: @@ -40667,7 +41380,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.13.8 + '@types/node': 20.17.24 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -40709,7 +41422,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.3 + '@types/node': 20.17.24 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -40726,7 +41439,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -40794,7 +41507,7 @@ snapshots: jscodeshift@0.14.0(@babel/preset-env@7.26.9(@babel/core@7.26.9)): dependencies: '@babel/core': 7.26.9 - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.9) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.9) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.9) @@ -40819,7 +41532,7 @@ snapshots: jscodeshift@0.14.0(@babel/preset-env@7.26.9(@babel/core@7.27.1)): dependencies: '@babel/core': 7.26.9 - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.1 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.9) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.26.9) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.26.9) @@ -41848,6 +42561,8 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + memoize-one@5.2.1: {} memoize-one@6.0.0: {} @@ -41862,6 +42577,8 @@ snapshots: merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge-options@3.0.4: dependencies: is-plain-obj: 2.1.0 @@ -42258,7 +42975,7 @@ snapshots: '@babel/code-frame': 7.26.2 '@babel/core': 7.26.9 '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 + '@babel/parser': 7.27.1 '@babel/template': 7.26.9 '@babel/traverse': 7.26.9 '@babel/types': 7.26.9 @@ -42824,10 +43541,16 @@ snapshots: mime-db@1.53.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mime@1.6.0: {} mime@2.6.0: {} @@ -42955,6 +43678,26 @@ snapshots: typescript: 5.8.2 vue: 3.5.13(typescript@5.8.2) + mkdist@2.2.0(sass@1.85.1)(typescript@5.8.2)(vue@3.5.14(typescript@5.8.2)): + dependencies: + autoprefixer: 10.4.20(postcss@8.5.3) + citty: 0.1.6 + cssnano: 7.0.6(postcss@8.5.3) + defu: 6.1.4 + esbuild: 0.24.2 + jiti: 1.21.7 + mlly: 1.7.4 + pathe: 1.1.2 + pkg-types: 1.3.1 + postcss: 8.5.3 + postcss-nested: 7.0.2(postcss@8.5.3) + semver: 7.7.1 + tinyglobby: 0.2.12 + optionalDependencies: + sass: 1.85.1 + typescript: 5.8.2 + vue: 3.5.14(typescript@5.8.2) + mlly@1.7.3: dependencies: acorn: 8.14.0 @@ -43199,9 +43942,35 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.3.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1): + dependencies: + '@next/env': 15.3.2 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001707 + postcss: 8.4.31 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + styled-jsx: 5.1.6(@babel/core@7.26.9)(babel-plugin-macros@3.1.0)(react@19.0.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.3.2 + '@next/swc-darwin-x64': 15.3.2 + '@next/swc-linux-arm64-gnu': 15.3.2 + '@next/swc-linux-arm64-musl': 15.3.2 + '@next/swc-linux-x64-gnu': 15.3.2 + '@next/swc-linux-x64-musl': 15.3.2 + '@next/swc-win32-arm64-msvc': 15.3.2 + '@next/swc-win32-x64-msvc': 15.3.2 + sass: 1.85.1 + sharp: 0.34.1 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-try@1.0.5: {} - nitropack@2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2): + nitropack@2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 '@netlify/functions': 3.0.0 @@ -43224,7 +43993,7 @@ snapshots: cookie-es: 2.0.0 croner: 9.0.0 crossws: 0.3.4 - db0: 0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0) + db0: 0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0) defu: 6.1.4 destr: 2.0.3 dot-prop: 9.0.0 @@ -43272,7 +44041,7 @@ snapshots: unenv: 2.0.0-rc.12 unimport: 4.1.2 unplugin-utils: 0.2.4 - unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(ioredis@5.6.0) + unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(ioredis@5.6.0) untyped: 2.0.0 unwasm: 0.3.9 youch: 4.1.0-beta.6 @@ -43305,7 +44074,7 @@ snapshots: - typescript - uploadthing - nitropack@2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2): + nitropack@2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 '@netlify/functions': 3.0.0 @@ -43328,7 +44097,7 @@ snapshots: cookie-es: 2.0.0 croner: 9.0.0 crossws: 0.3.4 - db0: 0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0) + db0: 0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0) defu: 6.1.4 destr: 2.0.3 dot-prop: 9.0.0 @@ -43376,7 +44145,7 @@ snapshots: unenv: 2.0.0-rc.12 unimport: 4.1.2 unplugin-utils: 0.2.4 - unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0) + unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0) untyped: 2.0.0 unwasm: 0.3.9 youch: 4.1.0-beta.6 @@ -43549,17 +44318,17 @@ snapshots: dependencies: esm-env: 1.2.1 - nuxt@3.16.0(yykrlyfgcq7bklxjhifzhuppyq): + nuxt@3.16.0(kygbndsg3u7xffwrewwioaaldy): dependencies: '@nuxt/cli': 3.22.5(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.2.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2)) + '@nuxt/devtools': 2.2.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2)) '@nuxt/kit': 3.16.0(magicast@0.3.5) '@nuxt/schema': 3.16.0 '@nuxt/telemetry': 2.6.5(magicast@0.3.5) - '@nuxt/vite-builder': 3.16.0(@biomejs/biome@1.9.4)(@types/node@22.15.3)(eslint@9.22.0(jiti@2.4.2))(less@4.2.2)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.38.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))(yaml@2.7.0) + '@nuxt/vite-builder': 3.16.0(@biomejs/biome@1.9.4)(@types/node@22.15.3)(eslint@9.22.0(jiti@2.4.2))(less@4.2.2)(lightningcss@1.29.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.38.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(vue@3.5.14(typescript@5.8.2))(yaml@2.7.0) '@oxc-parser/wasm': 0.56.5 - '@unhead/vue': 2.0.0-rc.9(vue@3.5.13(typescript@5.8.2)) + '@unhead/vue': 2.0.0-rc.9(vue@3.5.14(typescript@5.8.2)) '@vue/shared': 3.5.13 c12: 3.0.2(magicast@0.3.5) chokidar: 4.0.3 @@ -43585,7 +44354,7 @@ snapshots: magic-string: 0.30.17 mlly: 1.7.4 nanotar: 0.2.0 - nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) + nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) nypm: 0.6.0 ofetch: 1.4.1 ohash: 2.0.11 @@ -43607,13 +44376,13 @@ snapshots: unenv: 2.0.0-rc.12 unimport: 4.1.2 unplugin: 2.2.0 - unplugin-vue-router: 0.12.0(vue-router@4.5.1(vue@3.5.13(typescript@5.8.2)))(vue@3.5.13(typescript@5.8.2)) - unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0) + unplugin-vue-router: 0.12.0(vue-router@4.5.1(vue@3.5.14(typescript@5.8.2)))(vue@3.5.14(typescript@5.8.2)) + unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0) untyped: 2.0.0 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) vue-bundle-renderer: 2.1.1 vue-devtools-stub: 0.1.0 - vue-router: 4.5.1(vue@3.5.13(typescript@5.8.2)) + vue-router: 4.5.1(vue@3.5.14(typescript@5.8.2)) optionalDependencies: '@parcel/watcher': 2.5.1 '@types/node': 22.15.3 @@ -44112,6 +44881,8 @@ snapshots: path-to-regexp@6.3.0: {} + path-to-regexp@8.2.0: {} + path-type@4.0.0: {} path-type@6.0.0: {} @@ -44214,6 +44985,8 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.0: {} + pkg-dir@3.0.0: dependencies: find-up: 3.0.0 @@ -45027,6 +45800,10 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + quansync@0.2.8: {} query-string@7.1.3: @@ -45048,20 +45825,20 @@ snapshots: quickselect@2.0.0: {} - radix-vue@1.9.17(vue@3.5.13(typescript@5.8.2)): + radix-vue@1.9.17(vue@3.5.14(typescript@5.8.2)): dependencies: '@floating-ui/dom': 1.6.12 - '@floating-ui/vue': 1.1.5(vue@3.5.13(typescript@5.8.2)) + '@floating-ui/vue': 1.1.5(vue@3.5.14(typescript@5.8.2)) '@internationalized/date': 3.6.0 '@internationalized/number': 3.5.4 - '@tanstack/vue-virtual': 3.10.8(vue@3.5.13(typescript@5.8.2)) - '@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.8.2)) - '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.8.2)) + '@tanstack/vue-virtual': 3.10.8(vue@3.5.14(typescript@5.8.2)) + '@vueuse/core': 10.11.1(vue@3.5.14(typescript@5.8.2)) + '@vueuse/shared': 10.11.1(vue@3.5.14(typescript@5.8.2)) aria-hidden: 1.2.4 defu: 6.1.4 fast-deep-equal: 3.1.3 nanoid: 5.0.9 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) transitivePeerDependencies: - '@vue/composition-api' @@ -45080,6 +45857,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + rc9@2.1.2: dependencies: defu: 6.1.4 @@ -45810,6 +46594,15 @@ snapshots: dependencies: redis-errors: 1.2.0 + redis@4.7.1: + dependencies: + '@redis/bloom': 1.2.0(@redis/client@1.6.1) + '@redis/client': 1.6.1 + '@redis/graph': 1.1.1(@redis/client@1.6.1) + '@redis/json': 1.0.7(@redis/client@1.6.1) + '@redis/search': 1.2.0(@redis/client@1.6.1) + '@redis/time-series': 1.1.0(@redis/client@1.6.1) + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -46310,6 +47103,16 @@ snapshots: rou3@0.5.1: {} + router@2.2.0: + dependencies: + debug: 4.4.0(supports-color@9.4.0) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + run-applescript@7.0.0: {} run-async@3.0.0: {} @@ -46465,6 +47268,22 @@ snapshots: transitivePeerDependencies: - supports-color + send@1.2.0: + dependencies: + debug: 4.4.0(supports-color@9.4.0) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + seq-queue@0.0.5: {} serialize-error@2.1.0: {} @@ -46492,6 +47311,15 @@ snapshots: transitivePeerDependencies: - supports-color + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + server-only@0.0.1: {} set-blocking@2.0.0: {} @@ -46579,6 +47407,34 @@ snapshots: '@img/sharp-win32-x64': 0.33.5 optional: true + sharp@0.34.1: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 + optional: true + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -47021,7 +47877,7 @@ snapshots: stripe@18.0.0: dependencies: - '@types/node': 22.13.8 + '@types/node': 20.17.24 qs: 6.13.0 striptags@3.2.0: {} @@ -47753,6 +48609,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.8 @@ -47885,6 +48747,39 @@ snapshots: - vue - vue-tsc + unbuild@3.5.0(sass@1.85.1)(typescript@5.8.2)(vue@3.5.14(typescript@5.8.2)): + dependencies: + '@rollup/plugin-alias': 5.1.1(rollup@4.34.8) + '@rollup/plugin-commonjs': 28.0.2(rollup@4.34.8) + '@rollup/plugin-json': 6.1.0(rollup@4.34.8) + '@rollup/plugin-node-resolve': 16.0.0(rollup@4.34.8) + '@rollup/plugin-replace': 6.0.2(rollup@4.34.8) + '@rollup/pluginutils': 5.1.4(rollup@4.34.8) + citty: 0.1.6 + consola: 3.4.0 + defu: 6.1.4 + esbuild: 0.25.0 + fix-dts-default-cjs-exports: 1.0.0 + hookable: 5.5.3 + jiti: 2.4.2 + magic-string: 0.30.17 + mkdist: 2.2.0(sass@1.85.1)(typescript@5.8.2)(vue@3.5.14(typescript@5.8.2)) + mlly: 1.7.4 + pathe: 2.0.3 + pkg-types: 2.0.0 + pretty-bytes: 6.1.1 + rollup: 4.34.8 + rollup-plugin-dts: 6.1.1(rollup@4.34.8)(typescript@5.8.2) + scule: 1.3.0 + tinyglobby: 0.2.12 + untyped: 2.0.0 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - sass + - vue + - vue-tsc + unconfig@0.6.1: dependencies: '@antfu/utils': 8.1.1 @@ -47913,7 +48808,8 @@ snapshots: undici-types@6.20.0: {} - undici-types@6.21.0: {} + undici-types@6.21.0: + optional: true undici@5.28.5: dependencies: @@ -48095,10 +48991,10 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.2 - unplugin-vue-router@0.12.0(vue-router@4.5.1(vue@3.5.13(typescript@5.8.2)))(vue@3.5.13(typescript@5.8.2)): + unplugin-vue-router@0.12.0(vue-router@4.5.1(vue@3.5.14(typescript@5.8.2)))(vue@3.5.14(typescript@5.8.2)): dependencies: '@babel/types': 7.26.9 - '@vue-macros/common': 1.16.1(vue@3.5.13(typescript@5.8.2)) + '@vue-macros/common': 1.16.1(vue@3.5.14(typescript@5.8.2)) ast-walker-scope: 0.6.2 chokidar: 4.0.3 fast-glob: 3.3.3 @@ -48113,7 +49009,7 @@ snapshots: unplugin-utils: 0.2.4 yaml: 2.7.0 optionalDependencies: - vue-router: 4.5.1(vue@3.5.13(typescript@5.8.2)) + vue-router: 4.5.1(vue@3.5.14(typescript@5.8.2)) transitivePeerDependencies: - vue @@ -48127,7 +49023,7 @@ snapshots: acorn: 8.14.1 webpack-virtual-modules: 0.6.2 - unstorage@1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(ioredis@5.6.0): + unstorage@1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(ioredis@5.6.0): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -48139,10 +49035,10 @@ snapshots: ufo: 1.5.4 optionalDependencies: '@azure/identity': 4.6.0 - db0: 0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0) + db0: 0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0) ioredis: 5.6.0 - unstorage@1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0): + unstorage@1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0): dependencies: anymatch: 3.1.3 chokidar: 4.0.3 @@ -48154,7 +49050,7 @@ snapshots: ufo: 1.5.4 optionalDependencies: '@azure/identity': 4.6.0 - db0: 0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0) + db0: 0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0) ioredis: 5.6.0 untun@0.1.3: @@ -48292,7 +49188,7 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 - v-calendar@3.1.2(@popperjs/core@2.11.8)(vue@3.5.13(typescript@5.8.2)): + v-calendar@3.1.2(@popperjs/core@2.11.8)(vue@3.5.14(typescript@5.8.2)): dependencies: '@popperjs/core': 2.11.8 '@types/lodash': 4.17.13 @@ -48300,8 +49196,8 @@ snapshots: date-fns: 2.30.0 date-fns-tz: 2.0.1(date-fns@2.30.0) lodash: 4.17.21 - vue: 3.5.13(typescript@5.8.2) - vue-screen-utils: 1.0.0-beta.13(vue@3.5.13(typescript@5.8.2)) + vue: 3.5.14(typescript@5.8.2) + vue-screen-utils: 1.0.0-beta.13(vue@3.5.14(typescript@5.8.2)) valibot@0.31.1: optional: true @@ -48334,11 +49230,11 @@ snapshots: bits-ui: 0.21.16(svelte@4.2.19) svelte: 4.2.19 - vaul-vue@0.2.1(radix-vue@1.9.17(vue@3.5.13(typescript@5.8.2)))(vue@3.5.13(typescript@5.8.2)): + vaul-vue@0.2.1(radix-vue@1.9.17(vue@3.5.14(typescript@5.8.2)))(vue@3.5.14(typescript@5.8.2)): dependencies: - '@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.8.2)) - radix-vue: 1.9.17(vue@3.5.13(typescript@5.8.2)) - vue: 3.5.13(typescript@5.8.2) + '@vueuse/core': 10.11.1(vue@3.5.14(typescript@5.8.2)) + radix-vue: 1.9.17(vue@3.5.14(typescript@5.8.2)) + vue: 3.5.14(typescript@5.8.2) transitivePeerDependencies: - '@vue/composition-api' @@ -48369,11 +49265,11 @@ snapshots: - '@types/react' - '@types/react-dom' - vee-validate@4.15.0(vue@3.5.13(typescript@5.8.2)): + vee-validate@4.15.0(vue@3.5.14(typescript@5.8.2)): dependencies: '@vue/devtools-api': 7.6.2 type-fest: 4.26.1 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) vfile-location@5.0.3: dependencies: @@ -48419,7 +49315,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vinxi@0.4.3(tbiltmkuca6gwy6wvywbppe5hm): + vinxi@0.4.3(xigip3pwxsynk4cmajsowrm4re): dependencies: '@babel/core': 7.26.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) @@ -48441,7 +49337,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) + nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -48452,7 +49348,7 @@ snapshots: ufo: 1.5.4 unctx: 2.4.1 unenv: 1.10.0 - unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0) + unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0) vite: 5.4.19(@types/node@22.13.10)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0) zod: 3.24.2 transitivePeerDependencies: @@ -48496,7 +49392,7 @@ snapshots: - uploadthing - xml2js - vinxi@0.5.3(5mkccpfbjktkt3otnngqrrcgde): + vinxi@0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0): dependencies: '@babel/core': 7.26.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) @@ -48518,7 +49414,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) + nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -48529,8 +49425,8 @@ snapshots: ufo: 1.5.4 unctx: 2.4.1 unenv: 1.10.0 - unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.12)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0) - vite: 6.3.4(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.13)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(ioredis@5.6.0) + vite: 6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) zod: 3.24.2 transitivePeerDependencies: - '@azure/app-configuration' @@ -48575,7 +49471,7 @@ snapshots: - xml2js - yaml - vinxi@0.5.3(@azure/identity@4.6.0)(@libsql/client@0.14.0)(@types/node@22.15.3)(better-sqlite3@11.8.1)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(ioredis@5.6.0)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(mysql2@3.13.0)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0): + vinxi@0.5.3(qmycrikecd3inn5enqnqcdtkym): dependencies: '@babel/core': 7.26.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) @@ -48597,7 +49493,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) + nitropack: 2.11.5(@azure/identity@4.6.0)(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(encoding@0.1.13)(mysql2@3.13.0)(typescript@5.8.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2 @@ -48608,8 +49504,8 @@ snapshots: ufo: 1.5.4 unctx: 2.4.1 unenv: 1.10.0 - unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.38.4(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@5.22.0(prisma@5.22.0))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(@types/react@18.3.18)(better-sqlite3@11.8.1)(bun-types@1.2.12)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@5.22.0)(react@19.0.0))(mysql2@3.13.0))(ioredis@5.6.0) - vite: 6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + unstorage: 1.15.0(@azure/identity@4.6.0)(db0@0.3.1(@libsql/client@0.14.0)(better-sqlite3@11.8.1)(drizzle-orm@0.40.0(@cloudflare/workers-types@4.20250303.0)(@libsql/client-wasm@0.14.0)(@libsql/client@0.14.0)(@prisma/client@6.4.1(prisma@6.4.1(typescript@5.8.2))(typescript@5.8.2))(@types/better-sqlite3@7.6.12)(@types/pg@8.11.11)(better-sqlite3@11.8.1)(bun-types@1.2.13)(gel@2.0.1)(kysely@0.28.1)(mysql2@3.13.0)(pg@8.13.3)(prisma@6.4.1(typescript@5.8.2)))(mysql2@3.13.0))(ioredis@5.6.0) + vite: 6.3.4(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) zod: 3.24.2 transitivePeerDependencies: - '@azure/app-configuration' @@ -48816,14 +49712,14 @@ snapshots: - supports-color optional: true - vite-plugin-vue-tracer@0.1.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.2)): + vite-plugin-vue-tracer@0.1.1(vite@6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.14(typescript@5.8.2)): dependencies: estree-walker: 3.0.3 magic-string: 0.30.17 pathe: 2.0.3 source-map-js: 1.2.1 vite: 6.3.4(@types/node@22.15.3)(jiti@2.4.2)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) vite-tsconfig-paths@4.3.2(typescript@5.8.2)(vite@5.4.19(@types/node@22.15.3)(less@4.2.2)(lightningcss@1.29.2)(sass@1.85.1)(terser@5.39.0)): dependencies: @@ -49231,20 +50127,20 @@ snapshots: dependencies: ufo: 1.5.4 - vue-demi@0.14.10(vue@3.5.13(typescript@5.8.2)): + vue-demi@0.14.10(vue@3.5.14(typescript@5.8.2)): dependencies: - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) vue-devtools-stub@0.1.0: {} - vue-router@4.5.1(vue@3.5.13(typescript@5.8.2)): + vue-router@4.5.1(vue@3.5.14(typescript@5.8.2)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) - vue-screen-utils@1.0.0-beta.13(vue@3.5.13(typescript@5.8.2)): + vue-screen-utils@1.0.0-beta.13(vue@3.5.14(typescript@5.8.2)): dependencies: - vue: 3.5.13(typescript@5.8.2) + vue: 3.5.14(typescript@5.8.2) vue-sonner@1.3.0: {} @@ -49266,6 +50162,16 @@ snapshots: optionalDependencies: typescript: 5.8.2 + vue@3.5.14(typescript@5.8.2): + dependencies: + '@vue/compiler-dom': 3.5.14 + '@vue/compiler-sfc': 3.5.14 + '@vue/runtime-dom': 3.5.14 + '@vue/server-renderer': 3.5.14(vue@3.5.14(typescript@5.8.2)) + '@vue/shared': 3.5.14 + optionalDependencies: + typescript: 5.8.2 + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -49634,6 +50540,10 @@ snapshots: dependencies: zod: 3.24.2 + zod-to-json-schema@3.24.3(zod@3.24.4): + dependencies: + zod: 3.24.4 + zod-to-ts@1.2.0(typescript@5.8.2)(zod@3.24.2): dependencies: typescript: 5.8.2 @@ -49643,6 +50553,8 @@ snapshots: zod@3.24.2: {} + zod@3.24.4: {} + zustand@3.7.2(react@19.0.0): optionalDependencies: react: 19.0.0