diff --git a/README.md b/README.md index 24748945..f95271f7 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Interested in helping build the best second brain for everyone? Join the discord ## 👀 What is this? -Build your own second brain with supermemory. It's a ChatGPT for your bookmarks. Import tweets or save websites and content using the [chrome extension](https://chromewebstore.google.com/detail/supermemory/afpgkkipfdpeaflnpoaffkcankadgjfc?hl=en-GB&authuser=0) +Build your own second brain with supermemory. It's a ChatGPT for your bookmarks. Import tweets or save websites and content using the [Chrome extension](https://chromewebstore.google.com/detail/supermemory/afpgkkipfdpeaflnpoaffkcankadgjfc?hl=en-GB&authuser=0) Well, here's the thing - me and @yxshv save a _lot_ of content on the internet. @@ -66,7 +66,7 @@ To use the chrome extension, image 3. Click on save button and give it 10 - 20 secs, where supermemory extension will sync all your twitter bookmarks to supermemory.ai -4. Volia! Now your second brain has all your twitter bookmarks. +4. Voila! Now your second brain has all your twitter bookmarks. ## 👨‍💻 The Stack @@ -88,11 +88,11 @@ The database, auth etc logic is here Built with: -- Nextjs 14 +- [Nextjs 14](https://nextjs.org/) - [Next Auth](https://next-auth.js.org/) - [Drizzle ORM](https://drizzle.team/) - [Cloudflare D1 database](https://developers.cloudflare.com/d1/get-started/) -- Cloudflare ratelimiter +- [Cloudflare ratelimiter](https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/) - [TailwindCSS](https://tailwindcss.com) - [shadcn-ui](https://ui.shadcn.com) - And some other amazing open source projects like [Novel](https://novel.sh) and [vaul](https://vaul.emilkowal.ski/) diff --git a/SETUP-GUIDE.md b/SETUP-GUIDE.md index 46a2e1da..c6de0e14 100644 --- a/SETUP-GUIDE.md +++ b/SETUP-GUIDE.md @@ -1,6 +1,6 @@ # Self Hosting Guide -This guide will help you set up your own instance of Supermemory. This is neccessary if you want to contribute to the project or if you want to self host the project. You can read more about the stack [here](https://github.com/supermemoryai/supermemory/?tab=readme-ov-file#-the-stack). +This guide will help you set up your own instance of Supermemory. This is necessary if you want to contribute to the project or if you want to self host the project. You can read more about the stack [here](https://github.com/supermemoryai/supermemory/?tab=readme-ov-file#-the-stack). ## Prerequisites diff --git a/apps/cf-ai-backend/package.json b/apps/cf-ai-backend/package.json index 2b83cc93..3fcf71e0 100644 --- a/apps/cf-ai-backend/package.json +++ b/apps/cf-ai-backend/package.json @@ -13,9 +13,11 @@ "license": "MIT", "dependencies": { "@hono/zod-validator": "^0.2.1", - "hono": "^4.5.1" + "hono": "^4.5.1", + "honox": "^0.1.23", + "vite": "^5.3.5" }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20240614.0" - } + "devDependencies": { + "@cloudflare/workers-types": "^4.20240614.0" + } } diff --git a/apps/cf-ai-backend/src/helper.ts b/apps/cf-ai-backend/src/helper.ts index c4dc8de1..70efaecd 100644 --- a/apps/cf-ai-backend/src/helper.ts +++ b/apps/cf-ai-backend/src/helper.ts @@ -161,6 +161,7 @@ export async function batchCreateChunksAndEmbeddings({ vectors.push(...batchVectors); } console.log( + "vector Id list: ", vectors.map((vector) => { return vector.id; }), @@ -185,6 +186,7 @@ export async function batchCreateChunksAndEmbeddings({ const results = []; for (let i = 0; i < newVectors.length; i += 20) { results.push(newVectors.slice(i, i + 20)); + console.log(newVectors); } await Promise.all( diff --git a/apps/cf-ai-backend/src/index.ts b/apps/cf-ai-backend/src/index.ts index a46d0080..1f391359 100644 --- a/apps/cf-ai-backend/src/index.ts +++ b/apps/cf-ai-backend/src/index.ts @@ -710,6 +710,47 @@ app.get( }, ); +app.get("/howFuckedAreWe", async (c) => { + let keys = 0; + const concurrencyLimit = 5; // Adjust this based on your system's capability + const queue: string[] = [undefined]; // Start with an undefined cursor + + async function fetchKeys(cursor?: string): Promise { + const response = await c.env.KV.list({ cursor }); + keys += response.keys.length; + + // @ts-ignore + if (response.cursor) { + // @ts-ignore + queue.push(response.cursor); + } + } + + async function getAllKeys(): Promise { + const promises: Promise[] = []; + + while (queue.length > 0) { + while (promises.length < concurrencyLimit && queue.length > 0) { + const cursor = queue.shift(); + promises.push(fetchKeys(cursor)); + } + + await Promise.all(promises); + promises.length = 0; // Clear the promises array + } + } + + await getAllKeys(); + + console.log(`Total number of keys: ${keys}`); + + // on a scale of 200,000 + // what % are we there? + const fuckedPercent = (keys / 200000) * 100; + + return c.json({ fuckedPercent }); +}); + export default { fetch: app.fetch, queue, diff --git a/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts b/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts index f4dd2e16..46a56410 100644 --- a/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts +++ b/apps/cf-ai-backend/src/queueConsumer/chunkers/chunkTweet.ts @@ -22,16 +22,26 @@ export interface ThreadTweetData { } export function chunkThread(threadText: string): TweetChunks { - const thread = JSON.parse(threadText); - if (typeof thread == "string") { - console.log("DA WORKER FAILED DO SOMEHTING FIX DA WROKER"); + let thread = threadText; + + try { + thread = JSON.parse(threadText); + } catch (e) { + console.log("error: thread is not json.", e); + } + + if (typeof threadText == "string") { + console.log("DA WORKER FAILED DO SOMEHTING FIX DA WROKER", thread); const rawTweet = getRawTweet(thread); + console.log(rawTweet); const parsedTweet: any = JSON.parse(rawTweet); const chunkedTweet = chunkText(parsedTweet.text, 1536); const metadata: Metadata = { tweetId: parsedTweet.id_str, - tweetLinks: parsedTweet.entities.urls.map((url: any) => url.expanded_url), + tweetLinks: parsedTweet.entities?.urls.map( + (url: any) => url.expanded_url, + ), tweetVids: parsedTweet.extended_entities?.media .filter((media: any) => media.type === "video") @@ -46,8 +56,8 @@ export function chunkThread(threadText: string): TweetChunks { return { type: "tweet", chunks }; } else { - console.log(JSON.stringify(thread)); - const chunkedTweets = thread.map((tweet: Tweet) => { + console.log("thread in else statement", JSON.stringify(thread)); + const chunkedTweets = (thread as any).map((tweet: Tweet) => { const chunkedTweet = chunkText(tweet.text, 1536); const metadata = { diff --git a/apps/extension/content/ContentApp.tsx b/apps/extension/content/ContentApp.tsx index c0339897..a510a77c 100644 --- a/apps/extension/content/ContentApp.tsx +++ b/apps/extension/content/ContentApp.tsx @@ -131,6 +131,13 @@ export default function ContentApp({ }); } }); + const handleKeyDown = (e: KeyboardEvent) => { + if (isPopoverOpen) { + e.stopPropagation(); + e.preventDefault(); + } + }; + document.addEventListener("keydown", handleKeyDown, true); const portalDiv = document.createElement("div"); portalDiv.id = "popover-portal"; @@ -139,6 +146,7 @@ export default function ContentApp({ return () => { document.removeEventListener("mousemove", () => {}); + document.removeEventListener("keydown", handleKeyDown, true); }; }, []); diff --git a/apps/extension/helpers.ts b/apps/extension/helpers.ts index 9e95f963..029de5c7 100644 --- a/apps/extension/helpers.ts +++ b/apps/extension/helpers.ts @@ -43,7 +43,7 @@ export function transformTweetData(input: any): Tweet | null { display_text_range: tweet.legacy.display_text_range, entities: { hashtags: tweet.legacy.entities.hashtags, - urls: tweet.legacy.entities.urls, + urls: tweet.legacy.entities?.urls, user_mentions: tweet.legacy.entities.user_mentions, symbols: tweet.legacy.entities.symbols, }, diff --git a/apps/web/app/(auth)/onboarding/page.tsx b/apps/web/app/(auth)/onboarding/page.tsx index c311ea13..9a6ac481 100644 --- a/apps/web/app/(auth)/onboarding/page.tsx +++ b/apps/web/app/(auth)/onboarding/page.tsx @@ -392,6 +392,24 @@ function Navbar() { const router = useRouter(); const handleSkip = async () => { await completeOnboarding(); + toast.info("Creating memory...", { + icon: , + duration: 7500, + }); + + const cont = await createMemory({ + content: "https://supermemory.ai", + spaces: undefined, + }); + + if (cont.success) { + toast.success("Memory created", { + richColors: true, + }); + } else { + toast.error(`Memory creation failed: ${cont.error}`); + } + router.push("/home?q=what%20is%20supermemory"); }; diff --git a/apps/web/app/(auth)/signin/page.tsx b/apps/web/app/(auth)/signin/page.tsx index 3b563b90..35e6bab6 100644 --- a/apps/web/app/(auth)/signin/page.tsx +++ b/apps/web/app/(auth)/signin/page.tsx @@ -15,10 +15,11 @@ async function Signin({ }: { searchParams: Record; }) { + const telegramUser = searchParams.telegramUser; const user = await auth(); if (user) { - redirect("/home"); + redirect(`/home` + (telegramUser ? `?telegramUser=${telegramUser}` : "")); } return ( diff --git a/apps/web/app/(dash)/(memories)/content.tsx b/apps/web/app/(dash)/(memories)/content.tsx index 431109be..6e2659cb 100644 --- a/apps/web/app/(dash)/(memories)/content.tsx +++ b/apps/web/app/(dash)/(memories)/content.tsx @@ -12,7 +12,7 @@ import { } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; -import React, { useEffect, useMemo, useState } from "react"; +import React, { useMemo, useState } from "react"; import Masonry from "react-layout-masonry"; import { getRawTweet } from "@repo/shared-types/utils"; import { MyTweet } from "../../../components/twitter/render-tweet"; @@ -20,16 +20,19 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, - DropdownMenuLabel, DropdownMenuPortal, - DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@repo/ui/shadcn/dropdown-menu"; import { Button } from "@repo/ui/shadcn/button"; -import { addUserToSpace, deleteItem, moveItem } from "@/app/actions/doers"; +import { + addUserToSpace, + deleteItem, + deleteSpace, + moveItem, +} from "@/app/actions/doers"; import { toast } from "sonner"; import { Input } from "@repo/ui/shadcn/input"; import { motion } from "framer-motion"; @@ -59,6 +62,39 @@ export function MemoriesPage({ }, [tab]); const [filter, setFilter] = useState(initialFilter); + const [spaces, setSpaces] = useState(memoriesAndSpaces.spaces); + + // to delete a space + const handleDeleteSpace = async (id: number) => { + const response = await deleteSpace(id); + + if (response?.success) { + setSpaces(spaces.filter((space) => space.id !== id)); + toast.success("Space deleted"); + } else { + toast.error("Failed to delete space"); + } + }; + + const handleExport = () => { + const dataToExport = sortedItems.map((item) => ({ + type: item.item, + date: new Date(item.date).toISOString(), + data: item.data, + })); + + const json = JSON.stringify(dataToExport, null, 2); + const blob = new Blob([json], { type: "application/json" }); + const url = URL.createObjectURL(blob); + + const a = document.createElement("a"); + a.href = url; + a.download = "memories_and_spaces.json"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }; // Sort Both memories and spaces by their savedAt and createdAt dates respectfully. // The output should be just one single list of items @@ -71,7 +107,7 @@ export function MemoriesPage({ date: new Date(memory.savedAt), // Assuming savedAt is a string date data: memory, })), - ...memoriesAndSpaces.spaces.map((space) => ({ + ...spaces.map((space) => ({ item: "space", date: new Date(space.createdAt), // Assuming createdAt is a string date data: space, @@ -103,7 +139,7 @@ export function MemoriesPage({ return false; }) .sort((a, b) => b.date - a.date); - }, [memoriesAndSpaces.memories, memoriesAndSpaces.spaces, filter]); + }, [memoriesAndSpaces.memories, spaces, filter]); return (
)} - +
+ + +
); } @@ -231,34 +276,45 @@ function TabComponent({ title, description, id, + handleDeleteSpace, }: { title: string; description: string; id: number; + handleDeleteSpace: (id: number) => void; }) { return ( - +
Spaces icon Space
-
-
-
- {title.slice(0, 2).toUpperCase()} {id} + +
+ +
+
+ {title.slice(0, 2).toUpperCase()} {id} +
-
-
-
{title}
-
{description}
-
-
- Search icon +
+
{title}
+
{description}
+
+
+ Search icon +
+ +
+ handleDeleteSpace(id)} + className="w-4 cursor-pointer" + />
- +
); } diff --git a/apps/web/app/(dash)/chat/chatWindow.tsx b/apps/web/app/(dash)/chat/chatWindow.tsx index 3d7ca295..60acd16d 100644 --- a/apps/web/app/(dash)/chat/chatWindow.tsx +++ b/apps/web/app/(dash)/chat/chatWindow.tsx @@ -6,7 +6,7 @@ import QueryInput from "./chatQueryInput"; import { cn } from "@repo/ui/lib/utils"; import { motion } from "framer-motion"; import { useRouter } from "next/navigation"; -import { ChatHistory, sourcesZod } from "@repo/shared-types"; +import { type ChatHistory, sourcesZod } from "@repo/shared-types"; import { Accordion, AccordionContent, @@ -23,7 +23,11 @@ import { codeLanguageSubset } from "@/lib/constants"; import { toast } from "sonner"; import Link from "next/link"; import { createChatObject } from "@/app/actions/doers"; -import { ClipboardIcon } from "@heroicons/react/24/outline"; +import { + ClipboardIcon, + SpeakerWaveIcon, + SpeakerXMarkIcon, +} from "@heroicons/react/24/outline"; function ChatWindow({ q, @@ -51,6 +55,8 @@ function ChatWindow({ }) { const [layout, setLayout] = useState<"chat" | "initial">("chat"); const [chatHistory, setChatHistory] = useState(initialChat); + const [speakingIdx, setSpeakingIdx] = useState(null); + const speechSynth: SpeechSynthesis = window.speechSynthesis; const removeJustificationFromText = (text: string) => { // remove everything after the first "" word @@ -66,12 +72,31 @@ function ChatWindow({ return text; }; + const handleTTS = (text: string, idx: number) => { + if (speakingIdx != null) return stopTTS(); + if (!text) return; + const utterThis: SpeechSynthesisUtterance = new SpeechSynthesisUtterance( + text, + ); + utterThis.lang = "en-US"; + speechSynth.speak(utterThis); + setSpeakingIdx(idx); + utterThis.onend = () => { + setSpeakingIdx(null); + }; + }; + + const stopTTS = () => { + speechSynth.cancel(); + setSpeakingIdx(null); + }; + const router = useRouter(); const getAnswer = async ( query: string, spaces: string[], - proMode: boolean = false, + proMode = false, ) => { if (query.trim() === "from_loading" || query.trim().length === 0) { return; @@ -263,10 +288,10 @@ function ChatWindow({
)} -
-
+
+
Answer
-
+
{/* Loading state */} {(chat.answer.parts.length === 0 || chat.answer.parts.join("").length === 0) && ( @@ -291,11 +316,7 @@ function ChatWindow({ }, ], ]} - components={{ - code: code as any, - p: p as any, - }} - className="flex flex-col gap-2 text-base" + className="flex flex-col gap-2 w-full" > {removeJustificationFromText( chat.answer.parts @@ -305,10 +326,6 @@ function ChatWindow({
- {/* TODO: speak response */} - {/* */} {/* copy response */} + {/* speak response */} +
@@ -342,10 +380,10 @@ function ChatWindow({ {/* TODO: fade out content on the right side, the fade goes away when the user scrolls */} -
+
{/* Loading state */} {chat.answer.sources.length > 0 || (chat.answer.parts.length === 0 && ( @@ -373,7 +411,9 @@ function ChatWindow({ {source.type} {source.numChunks > 1 && ( - {source.numChunks} chunks + + {source.numChunks} chunks + )}
@@ -388,40 +428,36 @@ function ChatWindow({ ))}
- {chat.answer.justification && - chat.answer.justification.length && ( -
0 ? "flex" : "hidden"}`} + {chat.answer.justification?.length && ( +
0 ? "flex" : "hidden"}`} + > + - - - - Justification - - - {chat.answer.justification.length > 0 - ? chat.answer.justification - .replaceAll( - "", - "", - ) - .replaceAll( - "", - "", - ) - : "No justification provided."} - - - -
- )} + + + Justification + + + {chat.answer.justification.length > 0 + ? chat.answer.justification + .replaceAll("", "") + .replaceAll( + "", + "", + ) + : "No justification provided."} + + + +
+ )} diff --git a/apps/web/app/(dash)/home/page.tsx b/apps/web/app/(dash)/home/page.tsx index 0545d1ff..18bd934d 100644 --- a/apps/web/app/(dash)/home/page.tsx +++ b/apps/web/app/(dash)/home/page.tsx @@ -78,7 +78,7 @@ function Page({ searchParams }: { searchParams: Record }) { }} >
-
+ {/*
@@ -84,7 +84,7 @@ function QueryInput({ id="pro-mode" about="Pro mode" /> -
+
*/} diff --git a/apps/web/app/(dash)/menu.tsx b/apps/web/app/(dash)/menu.tsx index 783a4780..1c0ce1ee 100644 --- a/apps/web/app/(dash)/menu.tsx +++ b/apps/web/app/(dash)/menu.tsx @@ -30,6 +30,7 @@ import { createMemory, createSpace } from "../actions/doers"; import ComboboxWithCreate from "@repo/ui/shadcn/combobox"; import { StoredSpace } from "@repo/db/schema"; import useMeasure from "react-use-measure"; +import { useKeyPress } from "@/lib/useKeyPress"; function Menu() { const [spaces, setSpaces] = useState([]); @@ -48,7 +49,11 @@ function Menu() { setSpaces(spaces.data); })(); }, []); - + useKeyPress("a", () => { + if (!dialogOpen) { + setDialogOpen(true); + } + }); const menuItems = [ { icon: HomeIconWeb, @@ -106,33 +111,23 @@ function Menu() { const handleSubmit = async (content?: string, spaces?: number[]) => { setDialogOpen(false); - - toast.info("Creating memory...", { - icon: , - duration: 7500, - }); - if (!content || content.length === 0) { - toast.error("Content is required"); - return; + throw new Error("Content is required"); } - - console.log(spaces); - const cont = await createMemory({ content: content, spaces: spaces ?? undefined, }); - setContent(""); setSelectedSpaces([]); - if (cont.success) { toast.success("Memory queued", { richColors: true, }); } else { toast.error(`Memory creation failed: ${cont.error}`); + throw new Error(`Memory creation failed: ${cont.error}`); + return cont; } }; @@ -188,8 +183,17 @@ function Menu() {
{ const content = e.get("content")?.toString(); - - await handleSubmit(content, selectedSpaces); + toast.promise(handleSubmit(content, selectedSpaces), { + loading: ( + + {" "} + Creating memory... + + ), + success: (data) => "Memory created", + error: (error) => error.message, + richColors: true, + }); }} className="flex flex-col gap-4 " > @@ -213,7 +217,17 @@ function Menu() { onKeyDown={(e) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); - handleSubmit(content, selectedSpaces); + toast.promise(handleSubmit(content, selectedSpaces), { + loading: ( + + {" "} + Creating memory... + + ), + success: (data) => "Memory created", + error: (error) => error.message, + richColors: true, + }); } }} /> @@ -266,10 +280,7 @@ function Menu() { ]); setSelectedSpaces((prev) => [...prev, creationTask.data!]); } else { - toast.error( - "Space creation failed: " + creationTask.error ?? - "Unknown error", - ); + toast.error("Space creation failed: " + creationTask.error); } }} placeholder="Select or create a new space." diff --git a/apps/web/app/(thinkpad)/thinkpad/image.tsx b/apps/web/app/(thinkpad)/thinkpad/image.tsx index b55b9a81..7f3de2ff 100644 --- a/apps/web/app/(thinkpad)/thinkpad/image.tsx +++ b/apps/web/app/(thinkpad)/thinkpad/image.tsx @@ -39,7 +39,7 @@ const ImageComponent = memo(({ id }: { id: string }) => { return (
- Drew things to seee here + Draw things. They will appear here.
); }); diff --git a/apps/web/app/(thinkpad)/thinkpad/page.tsx b/apps/web/app/(thinkpad)/thinkpad/page.tsx index defa8e43..ab2bf88e 100644 --- a/apps/web/app/(thinkpad)/thinkpad/page.tsx +++ b/apps/web/app/(thinkpad)/thinkpad/page.tsx @@ -21,7 +21,7 @@ async function page() { -
+
{!canvas.success || canvas.error ? (
Hmmm... Something went wrong. :/
) : ( @@ -37,7 +37,7 @@ async function page() {

- *this is under beta and only one canvas is allowed per user + Thinkpads is under beta and only one thinkpad is allowed per user.

); diff --git a/apps/web/app/actions/doers.ts b/apps/web/app/actions/doers.ts index 500a8608..c11d5f0a 100644 --- a/apps/web/app/actions/doers.ts +++ b/apps/web/app/actions/doers.ts @@ -167,6 +167,17 @@ const getTweetData = async (tweetID: string) => { return data; }; +export const deleteSpace = async (id: number) => { + try { + await db.delete(space).where(eq(space.id, id)); + return { + success: true, + }; + } catch (e) { + console.log(e); + } +}; + export const createMemory = async (input: { content: string; spaces?: number[]; diff --git a/apps/web/app/api/store/helper.ts b/apps/web/app/api/store/helper.ts index 6ab7fb23..db13ca91 100644 --- a/apps/web/app/api/store/helper.ts +++ b/apps/web/app/api/store/helper.ts @@ -24,8 +24,8 @@ export const createMemoryFromAPI = async (input: { method: "POST", body: JSON.stringify({ pageContent: input.data.pageContent, - title: input.data.title, - description: input.data.description, + title: input.data.title.slice(0, 500), + description: input.data.description.slice(0, 500), url: input.data.url, spaces: input.data.spaces, user: input.userId, diff --git a/apps/web/app/api/store/route.ts b/apps/web/app/api/store/route.ts index 12af7894..ad81c7c4 100644 --- a/apps/web/app/api/store/route.ts +++ b/apps/web/app/api/store/route.ts @@ -2,6 +2,7 @@ import { type NextRequest } from "next/server"; import { addFromAPIType } from "@repo/shared-types"; import { ensureAuth } from "../ensureAuth"; import { createMemoryFromAPI } from "./helper"; +import { getRawTweet } from "@repo/shared-types/utils"; export const runtime = "edge"; @@ -16,7 +17,43 @@ export async function POST(req: NextRequest) { return new Response("Missing BACKEND_SECURITY_KEY", { status: 500 }); } - const body = await req.json(); + let body; + + try { + body = await req.json(); + } catch (e) { + const error = (e as Error).message; + + console.log(error); + + const tryJson = getRawTweet(await req.text()); + console.log(tryJson); + + if (tryJson) { + try { + body = JSON.parse(tryJson); + } catch (e) { + console.log(e); + return new Response( + JSON.stringify({ + message: "Raw found but not json?" + error, + }), + { + status: 400, + }, + ); + } + } else { + return new Response( + JSON.stringify({ + message: "Raw not found & not json." + error, + }), + { + status: 400, + }, + ); + } + } const validated = addFromAPIType.safeParse(body); diff --git a/apps/web/app/api/telegram/route.ts b/apps/web/app/api/telegram/route.ts index dddfa2f4..c629e409 100644 --- a/apps/web/app/api/telegram/route.ts +++ b/apps/web/app/api/telegram/route.ts @@ -68,9 +68,9 @@ bot.on("message", async (ctx) => { if (response.status !== 200) { console.log("Failed to get response from backend"); console.log(response.status); - console.log(await response.text()); await ctx.reply( - "Sorry, I am not able to process your request at the moment.", + "Sorry, I am not able to process your request at the moment." + + (await response.text()), ); return; } diff --git a/apps/web/app/ref/page.tsx b/apps/web/app/ref/page.tsx deleted file mode 100644 index c582fe5c..00000000 --- a/apps/web/app/ref/page.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import { Button } from "@repo/ui/shadcn/button"; -import { auth, signIn, signOut } from "../../server/auth"; -import { db } from "../../server/db"; -import { sql } from "drizzle-orm"; -import { users } from "@repo/db/schema"; -import { getThemeToggler } from "../../lib/get-theme-button"; - -export const runtime = "edge"; - -export default async function Page() { - const usr = await auth(); - - const userCount = await db - .select({ - count: sql`count(*)`.mapWith(Number), - }) - .from(users); - - const SetThemeButton = getThemeToggler(); - - return ( -
-
- - -
- {" "} - - - - - - Cloudflare Next Saas Starter -
- -
- Start by editing apps/web/page.tsx -
-
- -
- Welcome to Cloudflare Next Saas Starter.
Built a full stack app - using production-ready tools and frameworks, host on Cloudflare - instantly. -
- An opinionated, batteries-included framework with{" "} - - Turborepo - {" "} - and Nextjs. Fully Typesafe. Best practices followed by default. -

- Here's what the stack includes: -
    -
  • - Authentication with next-auth -
  • -
  • Database using Cloudflare's D1 serverless databases
  • -
  • Drizzle ORM, already connected to your database and auth ⚡
  • -
  • Light/darkmode theming that works with server components (!)
  • -
  • Styling using TailwindCSS and ShadcnUI
  • -
  • Turborepo with a landing page and shared components
  • -
  • Cloudflare wrangler for quick functions on the edge
  • -
  • - ... best part: everything's already set up for you. Just code! -
  • -
-
- Number of users in database: {userCount[0]!.count} -
- {usr?.user?.email ? ( - <> -
- Hello {usr.user.name} 👋 - {usr.user.email} -
- { - "use server"; - await signOut(); - }} - > - - - - ) : ( -
{ - "use server"; - await signIn("google"); - }} - > - -
- )} -
-
- ); -} diff --git a/apps/web/lib/useKeyPress.ts b/apps/web/lib/useKeyPress.ts new file mode 100644 index 00000000..eee23acb --- /dev/null +++ b/apps/web/lib/useKeyPress.ts @@ -0,0 +1,15 @@ +import { useEffect } from "react"; + +export const useKeyPress = (key: string, callback: () => void) => { + useEffect(() => { + const handler = (e: KeyboardEvent) => { + if (e.key === key && e.altKey) { + callback(); + } + }; + window.addEventListener("keydown", handler); + return () => { + window.removeEventListener("keydown", handler); + }; + }, [key, callback]); +}; diff --git a/apps/web/package.json b/apps/web/package.json index a5332157..d3bf1f48 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -21,6 +21,7 @@ "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-slot": "^1.1.0", "@sentry/nextjs": "^8", + "ai": "^3.3.0", "clsx": "^2.1.1", "cmdk": "^1.0.0", "drizzle-orm": "0.30.0", diff --git a/apps/web/server/auth.ts b/apps/web/server/auth.ts index 5d8b15d1..645989fa 100644 --- a/apps/web/server/auth.ts +++ b/apps/web/server/auth.ts @@ -12,14 +12,6 @@ export const { } = NextAuth({ secret: process.env.BACKEND_SECURITY_KEY, trustHost: true, - // callbacks: { - // session: ({ session, token, user }) => ({ - // ...session, - // user: { - // ...session.user, - // }, - // }), - // }, adapter: DrizzleAdapter(db, { usersTable: users, accountsTable: accounts, diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts index cf1434cf..2a05cd74 100644 --- a/apps/web/tailwind.config.ts +++ b/apps/web/tailwind.config.ts @@ -1 +1,20 @@ -module.exports = require("@repo/tailwind-config/tailwind.config"); +// Import the existing Tailwind config from your shared repository +const sharedConfig = require("@repo/tailwind-config/tailwind.config"); + +module.exports = { + presets: [sharedConfig], + theme: { + extend: { + colors: { + scrollbar: { + // thumb: "#d1d5db", + // thumbHover: "#1D4ED8", + thumb: "#303c4c", + thumbHover: "#2E3A48", + track: "#1F2937", + }, + }, + }, + }, + plugins: [require("tailwind-scrollbar")({ nocompatible: true })], +}; diff --git a/packages/ui/shadcn/accordion.tsx b/packages/ui/shadcn/accordion.tsx index 1421c4b2..1da5893c 100644 --- a/packages/ui/shadcn/accordion.tsx +++ b/packages/ui/shadcn/accordion.tsx @@ -1,6 +1,7 @@ "use client"; -import * as React from "react"; +import React, { useRef, useEffect, useState } from "react"; + import * as AccordionPrimitive from "@radix-ui/react-accordion"; import { ChevronDownIcon } from "@heroicons/react/24/outline"; @@ -40,15 +41,72 @@ AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; const AccordionContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - -
{children}
-
-)); +>(({ className, children, ...props }, ref) => { + const containerRef = useRef(null); + const [fadeWidth, setFadeWidth] = useState(0); + + useEffect(() => { + const handleWheel = (event: WheelEvent) => { + if (containerRef.current) { + event.preventDefault(); + if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) { + containerRef.current.scrollLeft += event.deltaX; + } else { + containerRef.current.scrollLeft += event.deltaY; + } + } + }; + + const handleScroll = () => { + if (containerRef.current) { + const { scrollWidth, clientWidth, scrollLeft } = containerRef.current; + const calculatedFadeWidth = Math.min( + 8, + scrollWidth - clientWidth - scrollLeft, + ); + setFadeWidth(calculatedFadeWidth); + } + }; + + const currentRef = containerRef.current; + currentRef?.addEventListener("wheel", handleWheel); + currentRef?.addEventListener("scroll", handleScroll); + handleScroll(); + + return () => { + currentRef?.removeEventListener("wheel", handleWheel); + currentRef?.removeEventListener("scroll", handleScroll); + }; + }, []); + + const fadeStyle: React.CSSProperties = { + position: "absolute", + top: 0, + right: 0, + width: `${fadeWidth}px`, + height: "85%", + pointerEvents: "none", + background: "linear-gradient(to left, rgb(46, 58, 72), transparent)", + }; + + return ( + +
+ {children} +
+ {/* Fade-out effect with inline styles */} +
+
+ ); +}); AccordionContent.displayName = AccordionPrimitive.Content.displayName; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index df5c6743..8c5d1ad4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -294,6 +294,12 @@ importers: hono: specifier: ^4.5.1 version: 4.5.2 + honox: + specifier: ^0.1.23 + version: 0.1.23(hono@4.5.2) + vite: + specifier: ^5.3.5 + version: 5.3.5 devDependencies: '@cloudflare/workers-types': specifier: ^4.20240614.0 @@ -374,6 +380,9 @@ importers: '@sentry/nextjs': specifier: ^8 version: 8.20.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1)(@opentelemetry/instrumentation@0.52.1)(@opentelemetry/sdk-trace-base@1.25.1)(next@14.2.5)(react@18.3.1)(webpack@5.93.0) + ai: + specifier: ^3.3.0 + version: 3.3.2(react@18.3.1)(svelte@4.2.18)(vue@3.4.34)(zod@3.23.8) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -642,6 +651,22 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/provider-utils@1.0.7(zod@3.23.8): + resolution: {integrity: sha512-xIDpinTnuInH16wBgKAVdN6pmrpjlJF+5f+f/8ahYMQlYzpe4Vj1qw8OL+rUGdCePcRSrFmjk8G/wdX5+J8dIw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.15 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + zod: 3.23.8 + dev: false + /@ai-sdk/provider@0.0.14: resolution: {integrity: sha512-gaQ5Y033nro9iX1YUjEDFDRhmMcEiCk56LJdIUbX5ozEiCNCfpiBpEqrjSp/Gp5RzBS2W0BVxfG7UGW6Ezcrzg==} engines: {node: '>=18'} @@ -649,6 +674,13 @@ packages: json-schema: 0.4.0 dev: false + /@ai-sdk/provider@0.0.15: + resolution: {integrity: sha512-phX/YdwKd8q8/uZ7MsUytcHuN5KvT+wgM+y78eu6E+VyFE3GRwelctBFnaaA96uRL6xnKNmb0e7e+2fDOYuBoA==} + engines: {node: '>=18'} + dependencies: + json-schema: 0.4.0 + dev: false + /@ai-sdk/provider@0.0.6: resolution: {integrity: sha512-kiPqIsSnUimckaUn87WepxfjPNdy8SXlPP7P6yWuG3e1NmyFHcyuH6EBBZxXLmu0oZtkb+QEeP3UDWGSc+wwKQ==} engines: {node: '>=18'} @@ -675,6 +707,25 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/react@0.0.38(react@18.3.1)(zod@3.23.8): + resolution: {integrity: sha512-TH8uubORsHBNfZQvHnvivOgKR/xWnMl0SZiGEj+MYgDGu6xpPW+gHlwYXZM8Fey6V/lvqhe1rNfV7D7E6xJn8A==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.7(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.26(zod@3.23.8) + react: 18.3.1 + swr: 2.2.5(react@18.3.1) + zod: 3.23.8 + dev: false + /@ai-sdk/solid@0.0.23(zod@3.23.8): resolution: {integrity: sha512-GMojG2PsqwnOGfx7C1MyQPzPBIlC44qn3ykjp9OVnN2Fu47mcFp3QM6gwWoHwNqi7FQDjRy+s/p+8EqYIQcAwg==} engines: {node: '>=18'} @@ -690,6 +741,21 @@ packages: - zod dev: false + /@ai-sdk/solid@0.0.29(zod@3.23.8): + resolution: {integrity: sha512-usf7yZPdx5HcTdLrs4rI2cfAqz4V0H61uTJ6SrFmbjObUF8wCGZVMNvUB3zXxrIrlVeHJKEueGd1QNPSG06qBA==} + engines: {node: '>=18'} + peerDependencies: + solid-js: ^1.7.7 + peerDependenciesMeta: + solid-js: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.7(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.26(zod@3.23.8) + transitivePeerDependencies: + - zod + dev: false + /@ai-sdk/svelte@0.0.24(svelte@4.2.18)(zod@3.23.8): resolution: {integrity: sha512-ZjzzvfYLE01VTO0rOZf6z9sTGhJhe6IYZMxQiM3P+zemufRYe57NDcLYEb6h+2qhvU6Z+k/Q+Nh/spAt0JzGUg==} engines: {node: '>=18'} @@ -707,6 +773,23 @@ packages: - zod dev: false + /@ai-sdk/svelte@0.0.31(svelte@4.2.18)(zod@3.23.8): + resolution: {integrity: sha512-hXPc+g0NgxEHGtGCa3OSC8I4mGw41Bi2jYmkzHpoUiHciUv29LPB08r0s2e139nMUDIDf8iYg4faxxdrTcKs7g==} + engines: {node: '>=18'} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + svelte: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.7(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.26(zod@3.23.8) + sswr: 2.1.0(svelte@4.2.18) + svelte: 4.2.18 + transitivePeerDependencies: + - zod + dev: false + /@ai-sdk/ui-utils@0.0.20(zod@3.23.8): resolution: {integrity: sha512-6MRWigzXfuxUcAYEFMLP6cLbALJkg12Iz1Sl+wuPMpB6aw7di2ePiTuNakFUYjgP7TNsW4UxzpypBqqJ1KNB0A==} engines: {node: '>=18'} @@ -721,6 +804,21 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/ui-utils@0.0.26(zod@3.23.8): + resolution: {integrity: sha512-d+16/dcKJM4m4KFgaz8AtJFvJhUNEdqGVFczY6jtFyyBqXz42pQtAASRATtgOatdSuOeEzOSkTzBAr49/qN3Wg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.15 + '@ai-sdk/provider-utils': 1.0.7(zod@3.23.8) + secure-json-parse: 2.7.0 + zod: 3.23.8 + dev: false + /@ai-sdk/vue@0.0.24(vue@3.4.34)(zod@3.23.8): resolution: {integrity: sha512-0S+2dVSui6LFgaWoFx+3h5R7GIP9MxdJo63tFuLvgyKr2jmpo5S5kGcWl95vNdzKDqaesAXfOnky+tn5A2d49A==} engines: {node: '>=18'} @@ -738,6 +836,23 @@ packages: - zod dev: false + /@ai-sdk/vue@0.0.30(vue@3.4.34)(zod@3.23.8): + resolution: {integrity: sha512-FC0/5CpMkYS0RTlTs5E6xw0nM0kNvFWkB2FqxkWvx0R7AKJBjZlXXTtq8aEAXlOg/ce+XSTAG/aTswmjWy6C4A==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.4 + peerDependenciesMeta: + vue: + optional: true + dependencies: + '@ai-sdk/provider-utils': 1.0.7(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.26(zod@3.23.8) + swrv: 1.0.4(vue@3.4.34) + vue: 3.4.34(typescript@5.5.4) + transitivePeerDependencies: + - zod + dev: false + /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -3048,7 +3163,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@cloudflare/workerd-darwin-arm64@1.20240718.0: @@ -3057,7 +3171,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@cloudflare/workerd-linux-64@1.20240718.0: @@ -3066,7 +3179,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@cloudflare/workerd-linux-arm64@1.20240718.0: @@ -3075,7 +3187,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@cloudflare/workerd-windows-64@1.20240718.0: @@ -3084,7 +3195,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@cloudflare/workers-types@4.20240725.0: @@ -3101,7 +3211,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - dev: true /@csstools/cascade-layer-name-parser@1.0.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1): resolution: {integrity: sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==} @@ -3549,6 +3658,14 @@ packages: resolution: {integrity: sha512-ALK12C6SQNNHw1enXK+UO8bdyQ+jaWNQ1Af7Z3FNxeAwjYhQT7do+TRE4RASAJ3ObaS2+TJ7TXR3oz2Gzbw0PQ==} dev: false + /@dependents/detective-less@5.0.0: + resolution: {integrity: sha512-D/9dozteKcutI5OdxJd8rU+fL6XgaaRg60sPPJWkT33OCiRfkCu5wO5B/yXTaaL2e6EB0lcCBGe5E0XscZCvvQ==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.0 + dev: false + /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} @@ -3661,6 +3778,15 @@ packages: dev: false optional: true + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -3695,6 +3821,15 @@ packages: dev: false optional: true + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/android-arm@0.15.18: resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} @@ -3738,6 +3873,15 @@ packages: dev: false optional: true + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/android-x64@0.17.19: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -3772,6 +3916,15 @@ packages: dev: false optional: true + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/darwin-arm64@0.17.19: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -3806,6 +3959,15 @@ packages: dev: false optional: true + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/darwin-x64@0.17.19: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -3840,6 +4002,15 @@ packages: dev: false optional: true + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/freebsd-arm64@0.17.19: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -3874,6 +4045,15 @@ packages: dev: false optional: true + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/freebsd-x64@0.17.19: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -3908,6 +4088,15 @@ packages: dev: false optional: true + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-arm64@0.17.19: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -3942,6 +4131,15 @@ packages: dev: false optional: true + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-arm@0.17.19: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -3976,6 +4174,15 @@ packages: dev: false optional: true + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-ia32@0.17.19: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -4010,6 +4217,15 @@ packages: dev: false optional: true + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-loong64@0.15.18: resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} engines: {node: '>=12'} @@ -4053,6 +4269,15 @@ packages: dev: false optional: true + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-mips64el@0.17.19: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -4087,6 +4312,15 @@ packages: dev: false optional: true + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-ppc64@0.17.19: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -4121,6 +4355,15 @@ packages: dev: false optional: true + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-riscv64@0.17.19: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -4155,6 +4398,15 @@ packages: dev: false optional: true + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-s390x@0.17.19: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -4189,6 +4441,15 @@ packages: dev: false optional: true + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-x64@0.17.19: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -4223,6 +4484,15 @@ packages: dev: false optional: true + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/netbsd-x64@0.17.19: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -4257,6 +4527,15 @@ packages: dev: false optional: true + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/openbsd-x64@0.17.19: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -4291,6 +4570,15 @@ packages: dev: false optional: true + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/sunos-x64@0.17.19: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -4325,6 +4613,15 @@ packages: dev: false optional: true + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-arm64@0.17.19: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -4359,6 +4656,15 @@ packages: dev: false optional: true + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-ia32@0.17.19: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -4393,6 +4699,15 @@ packages: dev: false optional: true + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-x64@0.17.19: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -4427,6 +4742,15 @@ packages: dev: false optional: true + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4555,7 +4879,6 @@ packages: /@fastify/busboy@2.1.1: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - dev: true /@floating-ui/core@1.6.5: resolution: {integrity: sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==} @@ -4642,6 +4965,22 @@ packages: hono: 4.5.2 dev: false + /@hono/vite-dev-server@0.12.2(hono@4.5.2): + resolution: {integrity: sha512-aq09IUi/+Ut/EXR8t1lCjsV/OEnSQoO4F6RmV7Ufvy3x0tE2TIYLs6YL0kZ7+gLIbmVg6V2MppHGQaLMNs7G8Q==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: '*' + dependencies: + '@hono/node-server': 1.12.0 + hono: 4.5.2 + miniflare: 3.20240718.1 + minimatch: 9.0.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /@hono/zod-validator@0.2.2(hono@4.5.2)(zod@3.23.8): resolution: {integrity: sha512-dSDxaPV70Py8wuIU2QNpoVEIOSzSXZ/6/B/h4xA7eOMz7+AarKTSGV8E6QwrdcCbBLkpqfJ4Q2TmBO0eP1tCBQ==} peerDependencies: @@ -4753,7 +5092,6 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - dev: true /@jsonjoy.com/base64@1.1.2(tslib@2.6.3): resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} @@ -7538,6 +7876,134 @@ packages: rollup: 3.29.4 dev: false + /@rollup/rollup-android-arm-eabi@4.20.0: + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-android-arm64@4.20.0: + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-arm64@4.20.0: + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-x64@4.20.0: + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.20.0: + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.20.0: + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.20.0: + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-musl@4.20.0: + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.20.0: + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.20.0: + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.20.0: + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-gnu@4.20.0: + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-musl@4.20.0: + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.20.0: + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.20.0: + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-x64-msvc@4.20.0: + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@rrweb/types@2.0.0-alpha.16: resolution: {integrity: sha512-E6cACNVsm+NUhn7dzocQoKyXI7BHrHRRm5Ab23yrAzEQ2caWocCEYJhqDlc4KRVJBkQfXZfyWm8+2d0uggFuZg==} dependencies: @@ -9503,6 +9969,11 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/types@7.18.0: + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: false + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9546,6 +10017,28 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4): + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -9601,6 +10094,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@7.18.0: + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + dev: false + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -10133,7 +10634,6 @@ packages: engines: {node: '>=0.4.0'} dependencies: acorn: 8.12.1 - dev: true /acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} @@ -10219,6 +10719,49 @@ packages: - vue dev: false + /ai@3.3.2(react@18.3.1)(svelte@4.2.18)(vue@3.4.34)(zod@3.23.8): + resolution: {integrity: sha512-oQF9L75J8kyfYKFNOCFrzmJOeZyj2kWED3x2hl+ZnR93TD1mhtA5XBvukTXK8UjthutRPinSBZaFH2GFn3qAWQ==} + engines: {node: '>=18'} + peerDependencies: + openai: ^4.42.0 + react: ^18 || ^19 + sswr: ^2.1.0 + svelte: ^3.0.0 || ^4.0.0 + zod: ^3.0.0 + peerDependenciesMeta: + openai: + optional: true + react: + optional: true + sswr: + optional: true + svelte: + optional: true + zod: + optional: true + dependencies: + '@ai-sdk/provider': 0.0.15 + '@ai-sdk/provider-utils': 1.0.7(zod@3.23.8) + '@ai-sdk/react': 0.0.38(react@18.3.1)(zod@3.23.8) + '@ai-sdk/solid': 0.0.29(zod@3.23.8) + '@ai-sdk/svelte': 0.0.31(svelte@4.2.18)(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.26(zod@3.23.8) + '@ai-sdk/vue': 0.0.30(vue@3.4.34)(zod@3.23.8) + '@opentelemetry/api': 1.9.0 + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + nanoid: 3.3.6 + react: 18.3.1 + secure-json-parse: 2.7.0 + svelte: 4.2.18 + zod: 3.23.8 + zod-to-json-schema: 3.22.5(zod@3.23.8) + transitivePeerDependencies: + - solid-js + - vue + dev: false + /ajv-formats@2.1.1(ajv@8.17.1): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -10436,7 +10979,6 @@ packages: /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true /array.prototype.findlast@1.2.5: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} @@ -10516,7 +11058,6 @@ packages: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} dependencies: printable-characters: 1.0.42 - dev: true /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -10530,6 +11071,11 @@ packages: minimalistic-assert: 1.0.1 dev: false + /ast-module-types@6.0.0: + resolution: {integrity: sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng==} + engines: {node: '>=18'} + dev: false + /ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true @@ -11129,7 +11675,6 @@ packages: tslib: 2.6.3 transitivePeerDependencies: - supports-color - dev: true /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -11570,7 +12115,6 @@ packages: /commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - dev: true /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -11737,7 +12281,6 @@ packages: /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: true /cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} @@ -11996,7 +12539,6 @@ packages: /data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - dev: true /data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} @@ -12289,6 +12831,95 @@ packages: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true + /detective-amd@6.0.0: + resolution: {integrity: sha512-NTqfYfwNsW7AQltKSEaWR66hGkTeD52Kz3eRQ+nfkA9ZFZt3iifRCWh+yZ/m6t3H42JFwVFTrml/D64R2PAIOA==} + engines: {node: '>=18'} + hasBin: true + dependencies: + ast-module-types: 6.0.0 + escodegen: 2.1.0 + get-amd-module-type: 6.0.0 + node-source-walk: 7.0.0 + dev: false + + /detective-cjs@6.0.0: + resolution: {integrity: sha512-R55jTS6Kkmy6ukdrbzY4x+I7KkXiuDPpFzUViFV/tm2PBGtTCjkh9ZmTuJc1SaziMHJOe636dtiZLEuzBL9drg==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + dev: false + + /detective-es6@5.0.0: + resolution: {integrity: sha512-NGTnzjvgeMW1khUSEXCzPDoraLenWbUjCFjwxReH+Ir+P6LGjYtaBbAvITWn2H0VSC+eM7/9LFOTAkrta6hNYg==} + engines: {node: '>=18'} + dependencies: + node-source-walk: 7.0.0 + dev: false + + /detective-postcss@7.0.0(postcss@8.4.40): + resolution: {integrity: sha512-pSXA6dyqmBPBuERpoOKKTUUjQCZwZPLRbd1VdsTbt6W+m/+6ROl4BbE87yQBUtLoK7yX8pvXHdKyM/xNIW9F7A==} + engines: {node: ^14.0.0 || >=16.0.0} + peerDependencies: + postcss: ^8.4.38 + dependencies: + is-url: 1.2.4 + postcss: 8.4.40 + postcss-values-parser: 6.0.2(postcss@8.4.40) + dev: false + + /detective-sass@6.0.0: + resolution: {integrity: sha512-h5GCfFMkPm4ZUUfGHVPKNHKT8jV7cSmgK+s4dgQH4/dIUNh9/huR1fjEQrblOQNDalSU7k7g+tiW9LJ+nVEUhg==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.0 + dev: false + + /detective-scss@5.0.0: + resolution: {integrity: sha512-Y64HyMqntdsCh1qAH7ci95dk0nnpA29g319w/5d/oYcHolcGUVJbIhOirOFjfN1KnMAXAFm5FIkZ4l2EKFGgxg==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.0 + dev: false + + /detective-stylus@5.0.0: + resolution: {integrity: sha512-KMHOsPY6aq3196WteVhkY5FF+6Nnc/r7q741E+Gq+Ax9mhE2iwj8Hlw8pl+749hPDRDBHZ2WlgOjP+twIG61vQ==} + engines: {node: '>=18'} + dev: false + + /detective-typescript@13.0.0(typescript@5.5.4): + resolution: {integrity: sha512-tcMYfiFWoUejSbvSblw90NDt76/4mNftYCX0SMnVRYzSXv8Fvo06hi4JOPdNvVNxRtCAKg3MJ3cBJh+ygEMH+A==} + engines: {node: ^14.14.0 || >=16.0.0} + peerDependencies: + typescript: ^5.4.4 + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + + /detective-vue2@2.0.3(typescript@5.5.4): + resolution: {integrity: sha512-AgWdSfVnft8uPGnUkdvE1EDadEENDCzoSRMt2xZfpxsjqVO617zGWXbB8TGIxHaqHz/nHa6lOSgAB8/dt0yEug==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 + dependencies: + '@vue/compiler-sfc': 3.4.34 + detective-es6: 5.0.0 + detective-sass: 6.0.0 + detective-scss: 5.0.0 + detective-stylus: 5.0.0 + detective-typescript: 13.0.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + /devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dependencies: @@ -12341,7 +12972,6 @@ packages: engines: {node: '>=8'} dependencies: path-type: 4.0.0 - dev: true /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -13449,6 +14079,37 @@ packages: '@esbuild/win32-x64': 0.20.2 dev: false + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: false + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -13485,7 +14146,6 @@ packages: esutils: 2.0.3 optionalDependencies: source-map: 0.6.1 - dev: true /eslint-config-next@14.2.5(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==} @@ -13920,7 +14580,6 @@ packages: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true /esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -14055,7 +14714,6 @@ packages: /exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - dev: true /exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -14654,6 +15312,14 @@ packages: '@scena/event-emitter': 1.0.5 dev: false + /get-amd-module-type@6.0.0: + resolution: {integrity: sha512-hFM7oivtlgJ3d6XWD6G47l8Wyh/C6vFw5G24Kk1Tbq85yh5gcM8Fne5/lFhiuxB+RT6+SI7I1ThB9lG4FBh3jw==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + dev: false + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -14684,7 +15350,6 @@ packages: dependencies: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - dev: true /get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} @@ -14882,7 +15547,6 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true /globby@13.2.2: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} @@ -14909,6 +15573,14 @@ packages: shelljs: 0.8.5 dev: true + /gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + /google-auth-library@9.11.0: resolution: {integrity: sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==} engines: {node: '>=14'} @@ -15232,6 +15904,28 @@ packages: engines: {node: '>=16.0.0'} dev: false + /honox@0.1.23(hono@4.5.2): + resolution: {integrity: sha512-Qb68f/Cb2FJQ/2foceCRFw/yNOzbDYHmKxV682+q0DqurkssdFKylGZBZd6zWIzBzQqk8Ol02BCOIusdy8u1dg==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: '>=4.*' + dependencies: + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.0 + '@babel/traverse': 7.25.0 + '@babel/types': 7.25.0 + '@hono/vite-dev-server': 0.12.2(hono@4.5.2) + hono: 4.5.2 + jsonc-parser: 3.3.1 + precinct: 12.1.2 + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.20.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -16040,6 +16734,15 @@ packages: upper-case: 1.1.3 dev: true + /is-url-superb@4.0.0: + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + dev: false + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: false + /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true @@ -16321,6 +17024,10 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + dev: false + /jsondiffpatch@0.6.0: resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -17845,7 +18552,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -18062,6 +18768,15 @@ packages: num-sort: 2.1.0 dev: false + /module-definition@6.0.0: + resolution: {integrity: sha512-sEGP5nKEXU7fGSZUML/coJbrO+yQtxcppDAYWRE9ovWsTbFoUHB2qDUx564WUzDaBHXsD46JBbIK5WVTwCyu3w==} + engines: {node: '>=18'} + hasBin: true + dependencies: + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + dev: false + /module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} dev: false @@ -18389,6 +19104,13 @@ packages: /node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + /node-source-walk@7.0.0: + resolution: {integrity: sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw==} + engines: {node: '>=18'} + dependencies: + '@babel/parser': 7.25.0 + dev: false + /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -19260,7 +19982,6 @@ packages: /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: true /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -19893,6 +20614,18 @@ packages: /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + /postcss-values-parser@6.0.2(postcss@8.4.40): + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.4.40 + quote-unquote: 1.0.0 + dev: false + /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -19945,6 +20678,30 @@ packages: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} dev: false + /precinct@12.1.2: + resolution: {integrity: sha512-x2qVN3oSOp3D05ihCd8XdkIPuEQsyte7PSxzLqiRgktu79S5Dr1I75/S+zAup8/0cwjoiJTQztE9h0/sWp9bJQ==} + engines: {node: '>=18'} + hasBin: true + dependencies: + '@dependents/detective-less': 5.0.0 + commander: 12.1.0 + detective-amd: 6.0.0 + detective-cjs: 6.0.0 + detective-es6: 5.0.0 + detective-postcss: 7.0.0(postcss@8.4.40) + detective-sass: 6.0.0 + detective-scss: 5.0.0 + detective-stylus: 5.0.0 + detective-typescript: 13.0.0(typescript@5.5.4) + detective-vue2: 2.0.3(typescript@5.5.4) + module-definition: 6.0.0 + node-source-walk: 7.0.0 + postcss: 8.4.40 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + /preferred-pm@3.1.4: resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} engines: {node: '>=10'} @@ -20008,7 +20765,6 @@ packages: /printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: true /proc-log@1.0.0: resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} @@ -20308,6 +21064,10 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + dev: false + /random-js@2.1.0: resolution: {integrity: sha512-CRUyWmnzmZBA7RZSVGq0xMqmgCyPPxbiKNLFA5ud7KenojVX2s7Gv+V7eB52beKTPGxWRnVZ7D/tCIgYJJ8vNQ==} dev: false @@ -21121,6 +21881,32 @@ packages: fsevents: 2.3.3 dev: false + /rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + dev: false + /rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} dev: false @@ -21547,7 +22333,6 @@ packages: /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true /slash@4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} @@ -21841,7 +22626,6 @@ packages: dependencies: as-table: 1.0.55 get-source: 2.0.12 - dev: true /stat-mode@0.3.0: resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} @@ -21871,7 +22655,6 @@ packages: /stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - dev: true /stream-to-array@2.3.0: resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} @@ -22721,7 +23504,6 @@ packages: typescript: '>=4.2.0' dependencies: typescript: 5.5.4 - dev: true /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -23078,7 +23860,6 @@ packages: engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.1 - dev: true /undici@6.19.4: resolution: {integrity: sha512-i3uaEUwNdkRq2qtTRRJb13moW5HWqviu7Vl7oYRYz++uPtGHJj+x7TGjcEuwS5Mt2P4nA0U9dhIX3DdB6JGY0g==} @@ -23655,6 +24436,41 @@ packages: replace-ext: 1.0.1 dev: true + /vite@5.3.5: + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.21.5 + postcss: 8.4.40 + rollup: 4.20.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + /vue-loader@17.4.2(@vue/compiler-sfc@3.4.34)(vue@3.4.34)(webpack@5.92.1): resolution: {integrity: sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==} peerDependencies: @@ -24350,7 +25166,6 @@ packages: '@cloudflare/workerd-linux-64': 1.20240718.0 '@cloudflare/workerd-linux-arm64': 1.20240718.0 '@cloudflare/workerd-windows-64': 1.20240718.0 - dev: true /wrangler@3.67.1(@cloudflare/workers-types@4.20240725.0): resolution: {integrity: sha512-lLVJxq/OZMfntvZ79WQJNC1OKfxOCs6PLfogqDBuPFEQ3L/Mwqvd9IZ0bB8ahrwUN/K3lSdDPXynk9HfcGZxVw==} @@ -24473,7 +25288,6 @@ packages: optional: true utf-8-validate: optional: true - dev: true /xdg-app-paths@5.1.0: resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} @@ -24687,7 +25501,6 @@ packages: cookie: 0.5.0 mustache: 4.2.0 stacktracey: 2.1.8 - dev: true /zod-to-json-schema@3.22.5(zod@3.23.8): resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==}