diff options
| author | Dhravya Shah <[email protected]> | 2024-08-06 11:05:02 -0700 |
|---|---|---|
| committer | Dhravya Shah <[email protected]> | 2024-08-06 11:05:02 -0700 |
| commit | be3e13b4bfb847af410f2159be462cc912141fc3 (patch) | |
| tree | a3783a7e7798de60f599ea0f0a5db24c5c30395f | |
| parent | changes for prod (diff) | |
| parent | Merge pull request #219 from Deepakchowdavarapu/readme-issue (diff) | |
| download | supermemory-be3e13b4bfb847af410f2159be462cc912141fc3.tar.xz supermemory-be3e13b4bfb847af410f2159be462cc912141fc3.zip | |
merged latest changes with queue branch and ready for prod
28 files changed, 1311 insertions, 298 deletions
@@ -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, <img width="480" alt="image" src="https://github.com/MaheshtheDev/supermemory/assets/38828053/2efb06a5-912a-48e7-ad1c-d527e7ffbc94"> 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<void> { + 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<void> { + const promises: Promise<void>[] = []; + + 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: <PlusCircleIcon className="w-4 h-4 text-white animate-spin" />, + 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<string, string>; }) { + 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<StoredSpace[]>(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 ( <div @@ -172,13 +208,21 @@ export function MemoriesPage({ </div> )} - <Filters - setFilter={setFilter} - filter={filter} - filterMethods={ - currentSpace ? SpaceFilterMethods : MemoriesFilterMethods - } - /> + <div className="flex justify-between w-full"> + <Filters + setFilter={setFilter} + filter={filter} + filterMethods={ + currentSpace ? SpaceFilterMethods : MemoriesFilterMethods + } + /> + <button + onClick={handleExport} + className={`transition px-6 py-2 rounded-xl hover:text-[#369DFD]" text-[#B3BCC5] bg-secondary hover:bg-secondary hover:text-[#76a3cc]`} + > + JSON Export + </button> + </div> <Masonry className="mt-6 relative" @@ -216,6 +260,7 @@ export function MemoriesPage({ title={(item.data as StoredSpace).name} description={`${(item.data as StoredSpace).numItems} memories`} id={(item.data as StoredSpace).id} + handleDeleteSpace={handleDeleteSpace} /> ); } @@ -231,34 +276,45 @@ function TabComponent({ title, description, id, + handleDeleteSpace, }: { title: string; description: string; id: number; + handleDeleteSpace: (id: number) => void; }) { return ( - <Link - href={`/space/${id}`} - className="flex flex-col gap-4 bg-[#161f2a]/30 backdrop-blur-md border-2 border-border w-full rounded-xl p-4" - > + <div className="flex group flex-col gap-4 bg-[#161f2a]/30 backdrop-blur-md border-2 border-border w-full rounded-xl p-4"> <div className="flex items-center gap-2 text-xs"> <Image alt="Spaces icon" src={MemoriesIcon} className="size-3" /> Space </div> - <div className="flex items-center"> - <div> - <div className="h-12 w-12 flex justify-center items-center rounded-md"> - {title.slice(0, 2).toUpperCase()} {id} + + <div> + <Link + href={`/space/${id}`} + className="flex items-center justify-between w-full" + > + <div> + <div className="h-12 w-12 flex justify-center items-center rounded-md"> + {title.slice(0, 2).toUpperCase()} {id} + </div> </div> - </div> - <div className="grow px-4"> - <div className="text-lg text-[#fff] line-clamp-2">{title}</div> - <div>{description}</div> - </div> - <div> - <Image src={NextIcon} alt="Search icon" /> + <div className="grow px-2"> + <div className="text-lg text-[#fff] line-clamp-2">{title}</div> + <div>{description}</div> + </div> + <div> + <Image src={NextIcon} alt="Search icon" /> + </div> + </Link> + <div className="absolute z-40 right-3 top-3 opacity-0 group-hover:opacity-100 hover:text-red-600"> + <TrashIcon + onClick={() => handleDeleteSpace(id)} + className="w-4 cursor-pointer" + /> </div> </div> - </Link> + </div> ); } 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<ChatHistory[]>(initialChat); + const [speakingIdx, setSpeakingIdx] = useState<number | null>(null); + const speechSynth: SpeechSynthesis = window.speechSynthesis; const removeJustificationFromText = (text: string) => { // remove everything after the first "<justification>" 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({ </div> )} - <div className="flex flex-col mt-2"> - <div> + <div className="flex flex-col mt-2 w-full"> + <div className="w-full"> <div className="text-foreground-menu py-2">Answer</div> - <div className="text-base"> + <div className="text-base prose prose-invert prose-headings:py-0 prose-h1:py-4 prose-h2:py-4 prose-headings:-my-2 prose-h1:text-2xl prose-h2:text-xl prose:min-w-full min-w-full"> {/* 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({ </Markdown> <div className="mt-3 relative -left-2 flex items-center gap-1"> - {/* TODO: speak response */} - {/* <button className="group h-8 w-8 flex justify-center items-center active:scale-75 duration-200"> - <SpeakerWaveIcon className="size-[18px] group-hover:text-primary" /> - </button> */} {/* copy response */} <button onClick={() => @@ -322,6 +339,27 @@ function ChatWindow({ > <ClipboardIcon className="size-[18px] group-hover:text-primary" /> </button> + {/* speak response */} + <button + disabled={ + speakingIdx !== null && speakingIdx !== idx + } + onClick={() => { + handleTTS( + chat.answer.parts + .map((part) => part.text) + .join(""), + idx, + ); + }} + className="group h-8 w-8 flex justify-center items-center active:scale-75 duration-200" + > + {speakingIdx === idx ? ( + <SpeakerXMarkIcon className="size-[18px] group-hover:text-primary" /> + ) : ( + <SpeakerWaveIcon className="size-[18px] group-hover:text-primary group-disabled:text-gray-600" /> + )} + </button> </div> </div> </div> @@ -342,10 +380,10 @@ function ChatWindow({ </AccordionTrigger> {/* TODO: fade out content on the right side, the fade goes away when the user scrolls */} <AccordionContent - className="flex flex-col no-scrollbar overflow-auto gap-4 relative max-w-3xl no-scrollbar" + className="flex flex-col gap-4 relative max-w-3xl overflow-x-auto scrollbar-thin scrollbar-thumb-scrollbar-thumb scrollbar-track-scrollbar-track scrollbar-thumb-rounded" defaultChecked > - <div className="w-full no-scrollbar flex gap-4"> + <div className="w-full flex gap-3"> {/* Loading state */} {chat.answer.sources.length > 0 || (chat.answer.parts.length === 0 && ( @@ -373,7 +411,9 @@ function ChatWindow({ <span>{source.type}</span> {source.numChunks > 1 && ( - <span>{source.numChunks} chunks</span> + <span className="font-bold"> + {source.numChunks} chunks + </span> )} </div> <div className="text-base"> @@ -388,40 +428,36 @@ function ChatWindow({ ))} </div> - {chat.answer.justification && - chat.answer.justification.length && ( - <div - className={`${chat.answer.justification && chat.answer.justification.length > 0 ? "flex" : "hidden"}`} + {chat.answer.justification?.length && ( + <div + className={`${chat.answer.justification && chat.answer.justification.length > 0 ? "flex" : "hidden"}`} + > + <Accordion + defaultValue={""} + type="single" + collapsible > - <Accordion - defaultValue={""} - type="single" - collapsible - > - <AccordionItem value="justification"> - <AccordionTrigger className="text-foreground-menu"> - Justification - </AccordionTrigger> - <AccordionContent - className="relative flex gap-2 max-w-3xl overflow-auto no-scrollbar" - defaultChecked - > - {chat.answer.justification.length > 0 - ? chat.answer.justification - .replaceAll( - "<justification>", - "", - ) - .replaceAll( - "</justification>", - "", - ) - : "No justification provided."} - </AccordionContent> - </AccordionItem> - </Accordion> - </div> - )} + <AccordionItem value="justification"> + <AccordionTrigger className="text-foreground-menu"> + Justification + </AccordionTrigger> + <AccordionContent + className="relative flex gap-2 max-w-3xl overflow-auto no-scrollbar" + defaultChecked + > + {chat.answer.justification.length > 0 + ? chat.answer.justification + .replaceAll("<justification>", "") + .replaceAll( + "</justification>", + "", + ) + : "No justification provided."} + </AccordionContent> + </AccordionItem> + </Accordion> + </div> + )} </AccordionContent> </AccordionItem> </Accordion> 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<string, string> }) { }} > <motion.h1 - className="text-center mx-auto bg-[linear-gradient(180deg,_#FFF_0%,_rgba(255,_255,_255,_0.00)_202.08%)] bg-clip-text text-4xl tracking-tighter text-transparent md:text-5xl" + className="text-center mx-auto bg-[linear-gradient(180deg,_#FFF_0%,_rgba(255,_255,_255,_0.00)_202.08%)] bg-clip-text text-4xl tracking-tighter text-transparent md:text-5xl pb-1" animate={{ opacity: query.length ? 0 : 1, translateY: query.length ? "10px" : "0px", diff --git a/apps/web/app/(dash)/home/queryinput.tsx b/apps/web/app/(dash)/home/queryinput.tsx index 995fea53..e7f400da 100644 --- a/apps/web/app/(dash)/home/queryinput.tsx +++ b/apps/web/app/(dash)/home/queryinput.tsx @@ -74,7 +74,7 @@ function QueryInput({ initialSpaces={initialSpaces || []} /> <div className="flex items-center gap-4"> - <div className="flex items-center gap-2 p-2 rounded-lg bg-[#369DFD1A]"> + {/* <div className="flex items-center gap-2 p-2 rounded-lg bg-[#369DFD1A]"> <Label htmlFor="pro-mode" className="text-sm"> Pro mode </Label> @@ -84,7 +84,7 @@ function QueryInput({ id="pro-mode" about="Pro mode" /> - </div> + </div> */} <button type="submit" className="rounded-lg bg-[#369DFD1A] p-3"> <Image src={ArrowRightIcon} alt="Enter" /> </button> 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<StoredSpace[]>([]); @@ -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: <PlusCircleIcon className="w-4 h-4 text-white animate-spin" />, - 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() { <form action={async (e: FormData) => { const content = e.get("content")?.toString(); - - await handleSubmit(content, selectedSpaces); + toast.promise(handleSubmit(content, selectedSpaces), { + loading: ( + <span> + <PlusCircleIcon className="w-4 h-4 inline mr-2 text-white animate-spin" />{" "} + Creating memory... + </span> + ), + 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: ( + <span> + <PlusCircleIcon className="w-4 h-4 inline mr-2 text-white animate-spin" />{" "} + Creating memory... + </span> + ), + 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 ( <div className="w-full aspect-video bg-[#2C3439] flex justify-center items-center"> - Drew things to seee here + Draw things. They will appear here. </div> ); }); 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() { <BlurHeaderMenu /> - <div className="w-full flex py-20"> + <div className="w-full flex py-20 justify-center"> {!canvas.success || canvas.error ? ( <div>Hmmm... Something went wrong. :/</div> ) : ( @@ -37,7 +37,7 @@ async function page() { </div> <h3 className="fixed left-1/2 -translate-x-1/2 bottom-4 text-gray-400 pt-20 text-center"> - *this is under beta and only one canvas is allowed per user + Thinkpads is under beta and only one thinkpad is allowed per user. </h3> </div> ); 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<number>`count(*)`.mapWith(Number), - }) - .from(users); - - const SetThemeButton = getThemeToggler(); - - return ( - <main className="flex flex-col items-center justify-center min-h-screen"> - <div className="flex max-w-2xl justify-between w-full"> - <SetThemeButton /> - - <div className="flex gap-2 items-center justify-center"> - {" "} - <svg - viewBox="0 0 256 116" - xmlns="http://www.w3.org/2000/svg" - width="45px" - height="45px" - preserveAspectRatio="xMidYMid" - > - <path - fill="#FFF" - d="m202.357 49.394-5.311-2.124C172.085 103.434 72.786 69.289 66.81 85.997c-.996 11.286 54.227 2.146 93.706 4.059 12.039.583 18.076 9.671 12.964 24.484l10.069.031c11.615-36.209 48.683-17.73 50.232-29.68-2.545-7.857-42.601 0-31.425-35.497Z" - /> - <path - fill="#F4811F" - d="M176.332 108.348c1.593-5.31 1.062-10.622-1.593-13.809-2.656-3.187-6.374-5.31-11.154-5.842L71.17 87.634c-.531 0-1.062-.53-1.593-.53-.531-.532-.531-1.063 0-1.594.531-1.062 1.062-1.594 2.124-1.594l92.946-1.062c11.154-.53 22.839-9.56 27.087-20.182l5.312-13.809c0-.532.531-1.063 0-1.594C191.203 20.182 166.772 0 138.091 0 111.535 0 88.697 16.995 80.73 40.896c-5.311-3.718-11.684-5.843-19.12-5.31-12.747 1.061-22.838 11.683-24.432 24.43-.531 3.187 0 6.374.532 9.56C16.996 70.107 0 87.103 0 108.348c0 2.124 0 3.718.531 5.842 0 1.063 1.062 1.594 1.594 1.594h170.489c1.062 0 2.125-.53 2.125-1.594l1.593-5.842Z" - /> - <path - fill="#FAAD3F" - d="M205.544 48.863h-2.656c-.531 0-1.062.53-1.593 1.062l-3.718 12.747c-1.593 5.31-1.062 10.623 1.594 13.809 2.655 3.187 6.373 5.31 11.153 5.843l19.652 1.062c.53 0 1.062.53 1.593.53.53.532.53 1.063 0 1.594-.531 1.063-1.062 1.594-2.125 1.594l-20.182 1.062c-11.154.53-22.838 9.56-27.087 20.182l-1.063 4.78c-.531.532 0 1.594 1.063 1.594h70.108c1.062 0 1.593-.531 1.593-1.593 1.062-4.25 2.124-9.03 2.124-13.81 0-27.618-22.838-50.456-50.456-50.456" - /> - </svg> - <span className="italic">Cloudflare Next Saas Starter</span> - </div> - - <div className="border border-black dark:border-white rounded-2xl p-2 flex items-center"> - Start by editing apps/web/page.tsx - </div> - </div> - - <div className="max-w-2xl text-start w-full mt-16"> - Welcome to Cloudflare Next Saas Starter. <br /> Built a full stack app - using production-ready tools and frameworks, host on Cloudflare - instantly. - <br /> - An opinionated, batteries-included framework with{" "} - <a - className="text-transparent bg-clip-text bg-gradient-to-r from-[#a93d64] to-[#275ba9]" - href="https://turbo.build" - > - Turborepo - </a>{" "} - and Nextjs. Fully Typesafe. Best practices followed by default. - <br /> <br /> - Here's what the stack includes: - <ul className="list-disc mt-4 prose dark:prose-invert"> - <li> - Authentication with <code>next-auth</code> - </li> - <li>Database using Cloudflare's D1 serverless databases</li> - <li>Drizzle ORM, already connected to your database and auth ⚡</li> - <li>Light/darkmode theming that works with server components (!)</li> - <li>Styling using TailwindCSS and ShadcnUI</li> - <li>Turborepo with a landing page and shared components</li> - <li>Cloudflare wrangler for quick functions on the edge</li> - <li> - ... best part: everything's already set up for you. Just code! - </li> - </ul> - <div className="mt-4 flex flex-col gap-2"> - <span>Number of users in database: {userCount[0]!.count}</span> - </div> - {usr?.user?.email ? ( - <> - <div className="mt-4 flex flex-col gap-2"> - <span>Hello {usr.user.name} 👋</span> - <span>{usr.user.email}</span> - </div> - <form - action={async () => { - "use server"; - await signOut(); - }} - > - <Button variant={"destructive"} className="mt-4"> - Sign out - </Button> - </form> - </> - ) : ( - <form - action={async () => { - "use server"; - await signIn("google"); - }} - > - <Button className="mt-4">Login with Google</Button> - </form> - )} - </div> - </main> - ); -} 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<typeof AccordionPrimitive.Content>, React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content> ->(({ className, children, ...props }, ref) => ( - <AccordionPrimitive.Content - ref={ref} - className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" - {...props} - > - <div className={cn("pb-4 pt-0", className)}>{children}</div> - </AccordionPrimitive.Content> -)); +>(({ className, children, ...props }, ref) => { + const containerRef = useRef<HTMLDivElement>(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 ( + <AccordionPrimitive.Content + ref={ref} + className="relative overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down" + {...props} + > + <div + ref={containerRef} + className={cn("pb-4 pt-0", className)} + style={{ position: "relative" }} + > + {children} + </div> + {/* Fade-out effect with inline styles */} + <div style={fadeStyle}></div> + </AccordionPrimitive.Content> + ); +}); 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([email protected]) + 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/[email protected])(@opentelemetry/[email protected])(@opentelemetry/[email protected])(@opentelemetry/[email protected])([email protected])([email protected])([email protected]) + ai: + specifier: ^3.3.0 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -642,6 +651,22 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/[email protected]([email protected]): + 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/[email protected]: resolution: {integrity: sha512-gaQ5Y033nro9iX1YUjEDFDRhmMcEiCk56LJdIUbX5ozEiCNCfpiBpEqrjSp/Gp5RzBS2W0BVxfG7UGW6Ezcrzg==} engines: {node: '>=18'} @@ -649,6 +674,13 @@ packages: json-schema: 0.4.0 dev: false + /@ai-sdk/[email protected]: + resolution: {integrity: sha512-phX/YdwKd8q8/uZ7MsUytcHuN5KvT+wgM+y78eu6E+VyFE3GRwelctBFnaaA96uRL6xnKNmb0e7e+2fDOYuBoA==} + engines: {node: '>=18'} + dependencies: + json-schema: 0.4.0 + dev: false + /@ai-sdk/[email protected]: resolution: {integrity: sha512-kiPqIsSnUimckaUn87WepxfjPNdy8SXlPP7P6yWuG3e1NmyFHcyuH6EBBZxXLmu0oZtkb+QEeP3UDWGSc+wwKQ==} engines: {node: '>=18'} @@ -675,6 +707,25 @@ packages: zod: 3.23.8 dev: false + 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([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) + react: 18.3.1 + swr: 2.2.5([email protected]) + zod: 3.23.8 + dev: false + /@ai-sdk/[email protected]([email protected]): resolution: {integrity: sha512-GMojG2PsqwnOGfx7C1MyQPzPBIlC44qn3ykjp9OVnN2Fu47mcFp3QM6gwWoHwNqi7FQDjRy+s/p+8EqYIQcAwg==} engines: {node: '>=18'} @@ -690,6 +741,21 @@ packages: - zod dev: false + /@ai-sdk/[email protected]([email protected]): + 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([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) + transitivePeerDependencies: + - zod + dev: false + resolution: {integrity: sha512-ZjzzvfYLE01VTO0rOZf6z9sTGhJhe6IYZMxQiM3P+zemufRYe57NDcLYEb6h+2qhvU6Z+k/Q+Nh/spAt0JzGUg==} engines: {node: '>=18'} @@ -707,6 +773,23 @@ packages: - zod dev: false + 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([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) + sswr: 2.1.0([email protected]) + svelte: 4.2.18 + transitivePeerDependencies: + - zod + dev: false + /@ai-sdk/[email protected]([email protected]): resolution: {integrity: sha512-6MRWigzXfuxUcAYEFMLP6cLbALJkg12Iz1Sl+wuPMpB6aw7di2ePiTuNakFUYjgP7TNsW4UxzpypBqqJ1KNB0A==} engines: {node: '>=18'} @@ -721,6 +804,21 @@ packages: zod: 3.23.8 dev: false + /@ai-sdk/[email protected]([email protected]): + 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([email protected]) + secure-json-parse: 2.7.0 + zod: 3.23.8 + dev: false + resolution: {integrity: sha512-0S+2dVSui6LFgaWoFx+3h5R7GIP9MxdJo63tFuLvgyKr2jmpo5S5kGcWl95vNdzKDqaesAXfOnky+tn5A2d49A==} engines: {node: '>=18'} @@ -738,6 +836,23 @@ packages: - zod dev: false + 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([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) + swrv: 1.0.4([email protected]) + vue: 3.4.34([email protected]) + transitivePeerDependencies: + - zod + dev: false + /@alloc/[email protected]: 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/[email protected]: @@ -3057,7 +3171,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3066,7 +3179,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3075,7 +3187,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3084,7 +3195,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@cloudflare/[email protected]: @@ -3101,7 +3211,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - dev: true resolution: {integrity: sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==} @@ -3549,6 +3658,14 @@ packages: resolution: {integrity: sha512-ALK12C6SQNNHw1enXK+UO8bdyQ+jaWNQ1Af7Z3FNxeAwjYhQT7do+TRE4RASAJ3ObaS2+TJ7TXR3oz2Gzbw0PQ==} dev: false + /@dependents/[email protected]: + 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/[email protected]: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} @@ -3661,6 +3778,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -3695,6 +3821,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} @@ -3738,6 +3873,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -3772,6 +3916,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -3806,6 +3959,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -3840,6 +4002,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -3874,6 +4045,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -3908,6 +4088,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -3942,6 +4131,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -3976,6 +4174,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -4010,6 +4217,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} engines: {node: '>=12'} @@ -4053,6 +4269,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -4087,6 +4312,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -4121,6 +4355,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -4155,6 +4398,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -4189,6 +4441,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -4223,6 +4484,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -4257,6 +4527,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -4291,6 +4570,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -4325,6 +4613,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -4359,6 +4656,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -4393,6 +4699,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/[email protected]: resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -4427,6 +4742,15 @@ packages: dev: false optional: true + /@esbuild/[email protected]: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@eslint-community/[email protected]([email protected]): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4555,7 +4879,6 @@ packages: /@fastify/[email protected]: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - dev: true /@floating-ui/[email protected]: resolution: {integrity: sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==} @@ -4642,6 +4965,22 @@ packages: hono: 4.5.2 dev: false + /@hono/[email protected]([email protected]): + 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 + 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/[email protected]([email protected]): resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} @@ -7538,6 +7876,134 @@ packages: rollup: 3.29.4 dev: false + /@rollup/[email protected]: + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/[email protected]: + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@rrweb/[email protected]: resolution: {integrity: sha512-E6cACNVsm+NUhn7dzocQoKyXI7BHrHRRm5Ab23yrAzEQ2caWocCEYJhqDlc4KRVJBkQfXZfyWm8+2d0uggFuZg==} dependencies: @@ -9503,6 +9969,11 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/[email protected]: + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: false + /@typescript-eslint/[email protected]([email protected]): 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/[email protected]([email protected]): + 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([email protected]) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + 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/[email protected]: + 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/[email protected]: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -10133,7 +10634,6 @@ packages: engines: {node: '>=0.4.0'} dependencies: acorn: 8.12.1 - dev: true resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} @@ -10219,6 +10719,49 @@ packages: - vue dev: false + 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([email protected]) + '@ai-sdk/react': 0.0.38([email protected])([email protected]) + '@ai-sdk/solid': 0.0.29([email protected]) + '@ai-sdk/svelte': 0.0.31([email protected])([email protected]) + '@ai-sdk/ui-utils': 0.0.26([email protected]) + '@ai-sdk/vue': 0.0.30([email protected])([email protected]) + '@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([email protected]) + transitivePeerDependencies: + - solid-js + - vue + dev: false + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -10436,7 +10979,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true 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 resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -10530,6 +11071,11 @@ packages: minimalistic-assert: 1.0.1 dev: false + resolution: {integrity: sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng==} + engines: {node: '>=18'} + dev: false + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true @@ -11129,7 +11675,6 @@ packages: tslib: 2.6.3 transitivePeerDependencies: - supports-color - dev: true resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -11570,7 +12115,6 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - dev: true resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -11737,7 +12281,6 @@ packages: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: true resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} @@ -11996,7 +12539,6 @@ packages: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - dev: true resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} @@ -12289,6 +12831,95 @@ packages: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: true + 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 + + resolution: {integrity: sha512-R55jTS6Kkmy6ukdrbzY4x+I7KkXiuDPpFzUViFV/tm2PBGtTCjkh9ZmTuJc1SaziMHJOe636dtiZLEuzBL9drg==} + engines: {node: '>=18'} + dependencies: + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + dev: false + + resolution: {integrity: sha512-NGTnzjvgeMW1khUSEXCzPDoraLenWbUjCFjwxReH+Ir+P6LGjYtaBbAvITWn2H0VSC+eM7/9LFOTAkrta6hNYg==} + engines: {node: '>=18'} + dependencies: + node-source-walk: 7.0.0 + dev: false + + 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([email protected]) + dev: false + + 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 + + resolution: {integrity: sha512-Y64HyMqntdsCh1qAH7ci95dk0nnpA29g319w/5d/oYcHolcGUVJbIhOirOFjfN1KnMAXAFm5FIkZ4l2EKFGgxg==} + engines: {node: '>=18'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.0 + dev: false + + resolution: {integrity: sha512-KMHOsPY6aq3196WteVhkY5FF+6Nnc/r7q741E+Gq+Ax9mhE2iwj8Hlw8pl+749hPDRDBHZ2WlgOjP+twIG61vQ==} + engines: {node: '>=18'} + dev: false + + 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([email protected]) + ast-module-types: 6.0.0 + node-source-walk: 7.0.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + + 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([email protected]) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + 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 resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -13449,6 +14079,37 @@ packages: '@esbuild/win32-x64': 0.20.2 dev: false + 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 + 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 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 resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -14055,7 +14714,6 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - dev: true resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -14654,6 +15312,14 @@ packages: '@scena/event-emitter': 1.0.5 dev: false + 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 + 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 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 resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} @@ -14909,6 +15573,14 @@ packages: shelljs: 0.8.5 dev: true + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + resolution: {integrity: sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==} engines: {node: '>=14'} @@ -15232,6 +15904,28 @@ packages: engines: {node: '>=16.0.0'} dev: false + 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([email protected]) + 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 + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -16040,6 +16734,15 @@ packages: upper-case: 1.1.3 dev: true + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + dev: false + + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: false + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true @@ -16321,6 +17024,10 @@ packages: engines: {node: '>=6'} hasBin: true + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + dev: false + 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 resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -18062,6 +18768,15 @@ packages: num-sort: 2.1.0 dev: false + 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 + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} dev: false @@ -18389,6 +19104,13 @@ packages: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + resolution: {integrity: sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw==} + engines: {node: '>=18'} + dependencies: + '@babel/parser': 7.25.0 + dev: false + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -19260,7 +19982,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: true resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} @@ -19893,6 +20614,18 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + 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 + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -19945,6 +20678,30 @@ packages: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} dev: false + 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([email protected]) + detective-sass: 6.0.0 + detective-scss: 5.0.0 + detective-stylus: 5.0.0 + detective-typescript: 13.0.0([email protected]) + detective-vue2: 2.0.3([email protected]) + module-definition: 6.0.0 + node-source-walk: 7.0.0 + postcss: 8.4.40 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: false + resolution: {integrity: sha512-lEHd+yEm22jXdCphDrkvIJQU66EuLojPPtvZkpKIkiD+l0DMThF/niqZKJSoU8Vl7iuvtmzyMhir9LdVy5WMnA==} engines: {node: '>=10'} @@ -20008,7 +20765,6 @@ packages: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: true resolution: {integrity: sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==} @@ -20308,6 +21064,10 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + dev: false + resolution: {integrity: sha512-CRUyWmnzmZBA7RZSVGq0xMqmgCyPPxbiKNLFA5ud7KenojVX2s7Gv+V7eB52beKTPGxWRnVZ7D/tCIgYJJ8vNQ==} dev: false @@ -21121,6 +21881,32 @@ packages: fsevents: 2.3.3 dev: false + 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 + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} dev: false @@ -21547,7 +22333,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} @@ -21841,7 +22626,6 @@ packages: dependencies: as-table: 1.0.55 get-source: 2.0.12 - dev: true resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} @@ -21871,7 +22655,6 @@ packages: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - dev: true resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} @@ -22721,7 +23504,6 @@ packages: typescript: '>=4.2.0' dependencies: typescript: 5.5.4 - dev: true 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 resolution: {integrity: sha512-i3uaEUwNdkRq2qtTRRJb13moW5HWqviu7Vl7oYRYz++uPtGHJj+x7TGjcEuwS5Mt2P4nA0U9dhIX3DdB6JGY0g==} @@ -23655,6 +24436,41 @@ packages: replace-ext: 1.0.1 dev: true + 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 + 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 /[email protected](@cloudflare/[email protected]): resolution: {integrity: sha512-lLVJxq/OZMfntvZ79WQJNC1OKfxOCs6PLfogqDBuPFEQ3L/Mwqvd9IZ0bB8ahrwUN/K3lSdDPXynk9HfcGZxVw==} @@ -24473,7 +25288,6 @@ packages: optional: true utf-8-validate: optional: true - dev: true 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 resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} |