this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Format, add markdown support to chat messages and hardcode characters

+513 -392
+2 -21
apps/api/src/lib/db/schema.ts
··· 1 1 import { relations } from "drizzle-orm"; 2 2 import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core"; 3 3 4 - export const characters = sqliteTable("characters", { 5 - id: text("id").primaryKey(), 6 - name: text("name").notNull(), 7 - prompt: text("prompt").notNull().default(""), 8 - createdAt: integer("created_at", { mode: "timestamp_ms" }) 9 - .notNull() 10 - .$defaultFn(() => new Date()), 11 - }); 12 - 13 4 export const chats = sqliteTable("chats", { 14 5 id: text("id").primaryKey(), 15 6 title: text("title").notNull(), 16 - characterId: text("character_id") 17 - .notNull() 18 - .references(() => characters.id), 7 + characterId: text("character_id").notNull(), 19 8 createdAt: integer("created_at", { mode: "timestamp_ms" }) 20 9 .notNull() 21 10 .$defaultFn(() => new Date()), ··· 33 22 .$defaultFn(() => new Date()), 34 23 }); 35 24 36 - export const charactersRelations = relations(characters, ({ many }) => ({ 37 - chats: many(chats), 38 - })); 39 - 40 - export const chatsRelations = relations(chats, ({ many, one }) => ({ 41 - character: one(characters, { 42 - fields: [chats.characterId], 43 - references: [characters.id], 44 - }), 25 + export const chatsRelations = relations(chats, ({ many }) => ({ 45 26 messages: many(messages), 46 27 })); 47 28
+3 -3
apps/api/src/lib/db/types.ts
··· 1 - import type { characters, chats, messages } from "./schema"; 1 + import type { characters } from "../characters"; 2 + import type { chats, messages } from "./schema"; 2 3 3 - export type Character = typeof characters.$inferSelect; 4 - export type NewCharacter = typeof characters.$inferInsert; 4 + export type Character = typeof characters; 5 5 export type Chat = typeof chats.$inferSelect; 6 6 export type NewChat = typeof chats.$inferInsert; 7 7 export type Message = typeof messages.$inferSelect;
+4 -50
apps/api/src/routes/characters.ts
··· 1 - import { zValidator } from "@hono/zod-validator"; 2 - import { eq } from "drizzle-orm"; 3 1 import { Hono } from "hono"; 4 - import { db, schema } from "../lib/db"; 5 - import { nanoid } from "../lib/id"; 6 - import { characterSchema } from "../lib/schema"; 7 - 8 - const app = new Hono() 9 - .get("/", async (c) => { 10 - const res = await db.query.characters.findMany(); 11 - 12 - return c.json(res, 200); 13 - }) 14 - .get("/:id", async (c) => { 15 - const { id } = c.req.param(); 16 - 17 - const res = await db.query.characters.findFirst({ 18 - where: eq(schema.characters.id, id), 19 - }); 20 - 21 - if (!res) return c.json({ message: "Not found" }, 404); 22 - 23 - return c.json(res, 200); 24 - }) 25 - .post("/", zValidator("json", characterSchema), async (c) => { 26 - const body = c.req.valid("json"); 27 - const id = nanoid(); 28 - 29 - db.insert(schema.characters) 30 - .values({ id, ...body }) 31 - .run(); 32 - 33 - return c.json({ id }, 201); 34 - }) 35 - .patch("/:id", zValidator("json", characterSchema.partial()), async (c) => { 36 - const { id } = c.req.param(); 37 - const body = c.req.valid("json"); 2 + import { characters } from "../lib/characters"; 38 3 39 - db.update(schema.characters) 40 - .set({ ...body }) 41 - .where(eq(schema.characters.id, id)) 42 - .run(); 43 - 44 - return c.json({ id }); 45 - }) 46 - .delete("/:id", async (c) => { 47 - const { id } = c.req.param(); 48 - 49 - db.delete(schema.characters).where(eq(schema.characters.id, id)).run(); 50 - 51 - return c.json({ id }); 52 - }); 4 + const app = new Hono().get("/", async (c) => { 5 + return c.json(characters); 6 + }); 53 7 54 8 export { app as characters };
+6 -2
apps/api/src/routes/chats.ts
··· 3 3 import { Hono } from "hono"; 4 4 import { streamChat } from "../lib/ai/chat"; 5 5 import { generateChatTitle } from "../lib/ai/title"; 6 + import { characters } from "../lib/characters"; 6 7 import { db, schema } from "../lib/db"; 7 8 import { nanoid } from "../lib/id"; 8 9 import { chatSchema, messageSchema } from "../lib/schema"; ··· 54 55 55 56 const chat = await db.query.chats.findFirst({ 56 57 where: eq(schema.chats.id, id), 57 - with: { character: true }, 58 58 }); 59 59 60 60 if (!chat) return c.json({ message: "Not found" }, 404); 61 + 62 + const character = characters.find((c) => c.id === chat.characterId); 63 + 64 + if (!character) return c.json({ message: "Invalid character" }, 400); 61 65 62 66 const messages = await db.query.messages.findMany({ 63 67 where: eq(schema.messages.chatId, id), ··· 68 72 messages.length === 1 ? generateChatTitle(body.text) : undefined; 69 73 70 74 const res = streamChat({ 71 - system: chat.character.prompt, 75 + system: character.prompt, 72 76 messages: messages.map((message) => ({ 73 77 role: message.role, 74 78 content: message.text,
-30
apps/api/src/seed.ts
··· 1 - import { sql } from "drizzle-orm"; 2 - import { db, schema } from "./lib/db"; 3 - 4 - const characters = [ 5 - { 6 - id: "kitsune", 7 - name: "Kitsune", 8 - prompt: 9 - "You are Kitsune, a clever and warm AI character. You speak with playful confidence, offer thoughtful help, and keep responses concise unless the user asks for depth.", 10 - }, 11 - { 12 - id: "neko", 13 - name: "Neko", 14 - prompt: 15 - "You are Neko, a curious and upbeat AI character. You are friendly, direct, and lightly playful while still giving useful answers.", 16 - }, 17 - ]; 18 - 19 - db.insert(schema.characters) 20 - .values(characters) 21 - .onConflictDoUpdate({ 22 - target: schema.characters.id, 23 - set: { 24 - name: sql`excluded.name`, 25 - prompt: sql`excluded.prompt`, 26 - }, 27 - }) 28 - .run(); 29 - 30 - console.log("Seeded default characters");
+1
apps/web/package.json
··· 20 20 "lucide-react": "^1.11.0", 21 21 "react": "^19.2.0", 22 22 "react-dom": "^19.2.0", 23 + "react-markdown": "^10.1.0", 23 24 "shadcn": "^4.5.0", 24 25 "tailwindcss": "^4.1.18", 25 26 "tw-animate-css": "^1.4.0"
+17 -16
apps/web/src/components/chat-message.tsx
··· 1 1 import { cva, type VariantProps } from "class-variance-authority"; 2 + import Markdown from "react-markdown"; 2 3 import { cn } from "#/lib/utils"; 3 - import { Row } from "./layout"; 4 - import { Avatar, AvatarFallback } from "./ui/avatar"; 4 + import { TypingIndicator } from "./typing-indicator"; 5 5 6 6 const chatMessage = cva( 7 - "rounded-2xl px-4 py-2 text-sm leading-relaxed wrap-anywhere whitespace-pre-wrap", 7 + "rounded-2xl px-4 py-3 text-sm leading-relaxed wrap-anywhere max-w-[80%]", 8 8 { 9 9 variants: { 10 10 author: { ··· 18 18 }, 19 19 ); 20 20 21 - type ChatMessageProps = React.HTMLAttributes<HTMLDivElement> & 22 - VariantProps<typeof chatMessage>; 21 + type ChatMessageProps = VariantProps<typeof chatMessage> & { 22 + text: string; 23 + className?: string; 24 + }; 23 25 24 - export function ChatMessage({ className, author, ...props }: ChatMessageProps) { 26 + export function ChatMessage({ className, author, text }: ChatMessageProps) { 27 + const isTyping = author === "assistant" && text.length === 0; 28 + 25 29 return ( 26 - <Row 30 + <div 27 31 className={cn( 28 - "max-w-[80%]", 29 - author === "assistant" ? "self-start" : "flex-row-reverse self-end", 32 + chatMessage({ author }), 33 + !isTyping && "markdown", 34 + author === "assistant" ? "self-start" : "self-end", 35 + className, 30 36 )} 31 - items="start" 32 - gap="sm" 33 37 > 34 - <Avatar className="size-[38.75px]"> 35 - <AvatarFallback>{author === "assistant" ? "A" : "U"}</AvatarFallback> 36 - </Avatar> 37 - <div className={cn(chatMessage({ author }), className)} {...props} /> 38 - </Row> 38 + {isTyping ? <TypingIndicator /> : <Markdown>{text}</Markdown>} 39 + </div> 39 40 ); 40 41 }
+7 -11
apps/web/src/components/chat-messages.tsx
··· 2 2 import type { ChatMessage as ChatMessageType } from "#/lib/types"; 3 3 import { ChatMessage } from "./chat-message"; 4 4 import { Stack } from "./layout"; 5 - import { TypingIndicator } from "./typing-indicator"; 6 5 7 6 interface ChatMessageProps { 8 7 messages: ChatMessageType[]; ··· 18 17 19 18 return ( 20 19 <Stack className="no-scrollbar flex-1 overflow-y-auto"> 21 - {messages.map((message) => { 22 - const isTyping = 23 - message.role === "assistant" && message.text.length === 0; 24 - 25 - return ( 26 - <ChatMessage key={message.id} author={message.role}> 27 - {isTyping ? <TypingIndicator /> : <p>{message.text}</p>} 28 - </ChatMessage> 29 - ); 30 - })} 20 + {messages.map((message) => ( 21 + <ChatMessage 22 + key={message.id} 23 + author={message.role} 24 + text={message.text} 25 + /> 26 + ))} 31 27 <div ref={endRef} /> 32 28 </Stack> 33 29 );
+137 -138
apps/web/src/components/ui/alert-dialog.tsx
··· 1 - "use client" 1 + "use client"; 2 2 3 - import * as React from "react" 4 - import { AlertDialog as AlertDialogPrimitive } from "@base-ui/react/alert-dialog" 5 - 6 - import { cn } from "#/lib/utils" 7 - import { Button } from "#/components/ui/button" 3 + import { AlertDialog as AlertDialogPrimitive } from "@base-ui/react/alert-dialog"; 4 + import type * as React from "react"; 5 + import { Button } from "#/components/ui/button"; 6 + import { cn } from "#/lib/utils"; 8 7 9 8 function AlertDialog({ ...props }: AlertDialogPrimitive.Root.Props) { 10 - return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} /> 9 + return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />; 11 10 } 12 11 13 12 function AlertDialogTrigger({ ...props }: AlertDialogPrimitive.Trigger.Props) { 14 - return ( 15 - <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} /> 16 - ) 13 + return ( 14 + <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} /> 15 + ); 17 16 } 18 17 19 18 function AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Props) { 20 - return ( 21 - <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} /> 22 - ) 19 + return ( 20 + <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} /> 21 + ); 23 22 } 24 23 25 24 function AlertDialogOverlay({ 26 - className, 27 - ...props 25 + className, 26 + ...props 28 27 }: AlertDialogPrimitive.Backdrop.Props) { 29 - return ( 30 - <AlertDialogPrimitive.Backdrop 31 - data-slot="alert-dialog-overlay" 32 - className={cn( 33 - "fixed inset-0 isolate z-50 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0", 34 - className 35 - )} 36 - {...props} 37 - /> 38 - ) 28 + return ( 29 + <AlertDialogPrimitive.Backdrop 30 + data-slot="alert-dialog-overlay" 31 + className={cn( 32 + "data-open:fade-in-0 data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/30 duration-100 data-closed:animate-out data-open:animate-in supports-backdrop-filter:backdrop-blur-sm", 33 + className, 34 + )} 35 + {...props} 36 + /> 37 + ); 39 38 } 40 39 41 40 function AlertDialogContent({ 42 - className, 43 - size = "default", 44 - ...props 41 + className, 42 + size = "default", 43 + ...props 45 44 }: AlertDialogPrimitive.Popup.Props & { 46 - size?: "default" | "sm" 45 + size?: "default" | "sm"; 47 46 }) { 48 - return ( 49 - <AlertDialogPortal> 50 - <AlertDialogOverlay /> 51 - <AlertDialogPrimitive.Popup 52 - data-slot="alert-dialog-content" 53 - data-size={size} 54 - className={cn( 55 - "group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-4xl bg-popover p-6 text-popover-foreground shadow-xl ring-1 ring-foreground/5 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-md dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", 56 - className 57 - )} 58 - {...props} 59 - /> 60 - </AlertDialogPortal> 61 - ) 47 + return ( 48 + <AlertDialogPortal> 49 + <AlertDialogOverlay /> 50 + <AlertDialogPrimitive.Popup 51 + data-slot="alert-dialog-content" 52 + data-size={size} 53 + className={cn( 54 + "group/alert-dialog-content data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-6 rounded-4xl bg-popover p-6 text-popover-foreground shadow-xl outline-none ring-1 ring-foreground/5 duration-100 data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-closed:animate-out data-open:animate-in data-[size=default]:sm:max-w-md dark:ring-foreground/10", 55 + className, 56 + )} 57 + {...props} 58 + /> 59 + </AlertDialogPortal> 60 + ); 62 61 } 63 62 64 63 function AlertDialogHeader({ 65 - className, 66 - ...props 64 + className, 65 + ...props 67 66 }: React.ComponentProps<"div">) { 68 - return ( 69 - <div 70 - data-slot="alert-dialog-header" 71 - className={cn( 72 - "grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", 73 - className 74 - )} 75 - {...props} 76 - /> 77 - ) 67 + return ( 68 + <div 69 + data-slot="alert-dialog-header" 70 + className={cn( 71 + "grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", 72 + className, 73 + )} 74 + {...props} 75 + /> 76 + ); 78 77 } 79 78 80 79 function AlertDialogFooter({ 81 - className, 82 - ...props 80 + className, 81 + ...props 83 82 }: React.ComponentProps<"div">) { 84 - return ( 85 - <div 86 - data-slot="alert-dialog-footer" 87 - className={cn( 88 - "flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end", 89 - className 90 - )} 91 - {...props} 92 - /> 93 - ) 83 + return ( 84 + <div 85 + data-slot="alert-dialog-footer" 86 + className={cn( 87 + "flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end", 88 + className, 89 + )} 90 + {...props} 91 + /> 92 + ); 94 93 } 95 94 96 95 function AlertDialogMedia({ 97 - className, 98 - ...props 96 + className, 97 + ...props 99 98 }: React.ComponentProps<"div">) { 100 - return ( 101 - <div 102 - data-slot="alert-dialog-media" 103 - className={cn( 104 - "mb-2 inline-flex size-16 items-center justify-center rounded-full bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8", 105 - className 106 - )} 107 - {...props} 108 - /> 109 - ) 99 + return ( 100 + <div 101 + data-slot="alert-dialog-media" 102 + className={cn( 103 + "mb-2 inline-flex size-16 items-center justify-center rounded-full bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8", 104 + className, 105 + )} 106 + {...props} 107 + /> 108 + ); 110 109 } 111 110 112 111 function AlertDialogTitle({ 113 - className, 114 - ...props 112 + className, 113 + ...props 115 114 }: React.ComponentProps<typeof AlertDialogPrimitive.Title>) { 116 - return ( 117 - <AlertDialogPrimitive.Title 118 - data-slot="alert-dialog-title" 119 - className={cn( 120 - "text-lg font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", 121 - className 122 - )} 123 - {...props} 124 - /> 125 - ) 115 + return ( 116 + <AlertDialogPrimitive.Title 117 + data-slot="alert-dialog-title" 118 + className={cn( 119 + "font-medium text-lg sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", 120 + className, 121 + )} 122 + {...props} 123 + /> 124 + ); 126 125 } 127 126 128 127 function AlertDialogDescription({ 129 - className, 130 - ...props 128 + className, 129 + ...props 131 130 }: React.ComponentProps<typeof AlertDialogPrimitive.Description>) { 132 - return ( 133 - <AlertDialogPrimitive.Description 134 - data-slot="alert-dialog-description" 135 - className={cn( 136 - "text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", 137 - className 138 - )} 139 - {...props} 140 - /> 141 - ) 131 + return ( 132 + <AlertDialogPrimitive.Description 133 + data-slot="alert-dialog-description" 134 + className={cn( 135 + "text-balance text-muted-foreground text-sm md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", 136 + className, 137 + )} 138 + {...props} 139 + /> 140 + ); 142 141 } 143 142 144 143 function AlertDialogAction({ 145 - className, 146 - ...props 144 + className, 145 + ...props 147 146 }: React.ComponentProps<typeof Button>) { 148 - return ( 149 - <Button 150 - data-slot="alert-dialog-action" 151 - className={cn(className)} 152 - {...props} 153 - /> 154 - ) 147 + return ( 148 + <Button 149 + data-slot="alert-dialog-action" 150 + className={cn(className)} 151 + {...props} 152 + /> 153 + ); 155 154 } 156 155 157 156 function AlertDialogCancel({ 158 - className, 159 - variant = "outline", 160 - size = "default", 161 - ...props 157 + className, 158 + variant = "outline", 159 + size = "default", 160 + ...props 162 161 }: AlertDialogPrimitive.Close.Props & 163 - Pick<React.ComponentProps<typeof Button>, "variant" | "size">) { 164 - return ( 165 - <AlertDialogPrimitive.Close 166 - data-slot="alert-dialog-cancel" 167 - className={cn(className)} 168 - render={<Button variant={variant} size={size} />} 169 - {...props} 170 - /> 171 - ) 162 + Pick<React.ComponentProps<typeof Button>, "variant" | "size">) { 163 + return ( 164 + <AlertDialogPrimitive.Close 165 + data-slot="alert-dialog-cancel" 166 + className={cn(className)} 167 + render={<Button variant={variant} size={size} />} 168 + {...props} 169 + /> 170 + ); 172 171 } 173 172 174 173 export { 175 - AlertDialog, 176 - AlertDialogAction, 177 - AlertDialogCancel, 178 - AlertDialogContent, 179 - AlertDialogDescription, 180 - AlertDialogFooter, 181 - AlertDialogHeader, 182 - AlertDialogMedia, 183 - AlertDialogOverlay, 184 - AlertDialogPortal, 185 - AlertDialogTitle, 186 - AlertDialogTrigger, 187 - } 174 + AlertDialog, 175 + AlertDialogAction, 176 + AlertDialogCancel, 177 + AlertDialogContent, 178 + AlertDialogDescription, 179 + AlertDialogFooter, 180 + AlertDialogHeader, 181 + AlertDialogMedia, 182 + AlertDialogOverlay, 183 + AlertDialogPortal, 184 + AlertDialogTitle, 185 + AlertDialogTrigger, 186 + };
+115 -120
apps/web/src/components/ui/dialog.tsx
··· 1 - import * as React from "react" 2 - import { Dialog as DialogPrimitive } from "@base-ui/react/dialog" 3 - 4 - import { cn } from "#/lib/utils" 5 - import { Button } from "#/components/ui/button" 6 - import { XIcon } from "lucide-react" 1 + import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"; 2 + import { XIcon } from "lucide-react"; 3 + import type * as React from "react"; 4 + import { Button } from "#/components/ui/button"; 5 + import { cn } from "#/lib/utils"; 7 6 8 7 function Dialog({ ...props }: DialogPrimitive.Root.Props) { 9 - return <DialogPrimitive.Root data-slot="dialog" {...props} /> 8 + return <DialogPrimitive.Root data-slot="dialog" {...props} />; 10 9 } 11 10 12 11 function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) { 13 - return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} /> 12 + return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />; 14 13 } 15 14 16 15 function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) { 17 - return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} /> 16 + return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />; 18 17 } 19 18 20 19 function DialogClose({ ...props }: DialogPrimitive.Close.Props) { 21 - return <DialogPrimitive.Close data-slot="dialog-close" {...props} /> 20 + return <DialogPrimitive.Close data-slot="dialog-close" {...props} />; 22 21 } 23 22 24 23 function DialogOverlay({ 25 - className, 26 - ...props 24 + className, 25 + ...props 27 26 }: DialogPrimitive.Backdrop.Props) { 28 - return ( 29 - <DialogPrimitive.Backdrop 30 - data-slot="dialog-overlay" 31 - className={cn( 32 - "fixed inset-0 isolate z-50 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0", 33 - className 34 - )} 35 - {...props} 36 - /> 37 - ) 27 + return ( 28 + <DialogPrimitive.Backdrop 29 + data-slot="dialog-overlay" 30 + className={cn( 31 + "data-open:fade-in-0 data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/30 duration-100 data-closed:animate-out data-open:animate-in supports-backdrop-filter:backdrop-blur-sm", 32 + className, 33 + )} 34 + {...props} 35 + /> 36 + ); 38 37 } 39 38 40 39 function DialogContent({ 41 - className, 42 - children, 43 - showCloseButton = true, 44 - ...props 40 + className, 41 + children, 42 + showCloseButton = true, 43 + ...props 45 44 }: DialogPrimitive.Popup.Props & { 46 - showCloseButton?: boolean 45 + showCloseButton?: boolean; 47 46 }) { 48 - return ( 49 - <DialogPortal> 50 - <DialogOverlay /> 51 - <DialogPrimitive.Popup 52 - data-slot="dialog-content" 53 - className={cn( 54 - "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-4xl bg-popover p-6 text-sm text-popover-foreground shadow-xl ring-1 ring-foreground/5 duration-100 outline-none sm:max-w-md dark:ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", 55 - className 56 - )} 57 - {...props} 58 - > 59 - {children} 60 - {showCloseButton && ( 61 - <DialogPrimitive.Close 62 - data-slot="dialog-close" 63 - render={ 64 - <Button 65 - variant="ghost" 66 - className="absolute top-4 right-4 bg-secondary" 67 - size="icon-sm" 68 - /> 69 - } 70 - > 71 - <XIcon 72 - /> 73 - <span className="sr-only">Close</span> 74 - </DialogPrimitive.Close> 75 - )} 76 - </DialogPrimitive.Popup> 77 - </DialogPortal> 78 - ) 47 + return ( 48 + <DialogPortal> 49 + <DialogOverlay /> 50 + <DialogPrimitive.Popup 51 + data-slot="dialog-content" 52 + className={cn( 53 + "data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-6 rounded-4xl bg-popover p-6 text-popover-foreground text-sm shadow-xl outline-none ring-1 ring-foreground/5 duration-100 data-closed:animate-out data-open:animate-in sm:max-w-md dark:ring-foreground/10", 54 + className, 55 + )} 56 + {...props} 57 + > 58 + {children} 59 + {showCloseButton && ( 60 + <DialogPrimitive.Close 61 + data-slot="dialog-close" 62 + render={ 63 + <Button 64 + variant="ghost" 65 + className="absolute top-4 right-4 bg-secondary" 66 + size="icon-sm" 67 + /> 68 + } 69 + > 70 + <XIcon /> 71 + <span className="sr-only">Close</span> 72 + </DialogPrimitive.Close> 73 + )} 74 + </DialogPrimitive.Popup> 75 + </DialogPortal> 76 + ); 79 77 } 80 78 81 79 function DialogHeader({ className, ...props }: React.ComponentProps<"div">) { 82 - return ( 83 - <div 84 - data-slot="dialog-header" 85 - className={cn("flex flex-col gap-1.5", className)} 86 - {...props} 87 - /> 88 - ) 80 + return ( 81 + <div 82 + data-slot="dialog-header" 83 + className={cn("flex flex-col gap-1.5", className)} 84 + {...props} 85 + /> 86 + ); 89 87 } 90 88 91 89 function DialogFooter({ 92 - className, 93 - showCloseButton = false, 94 - children, 95 - ...props 90 + className, 91 + showCloseButton = false, 92 + children, 93 + ...props 96 94 }: React.ComponentProps<"div"> & { 97 - showCloseButton?: boolean 95 + showCloseButton?: boolean; 98 96 }) { 99 - return ( 100 - <div 101 - data-slot="dialog-footer" 102 - className={cn( 103 - "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", 104 - className 105 - )} 106 - {...props} 107 - > 108 - {children} 109 - {showCloseButton && ( 110 - <DialogPrimitive.Close render={<Button variant="outline" />}> 111 - Close 112 - </DialogPrimitive.Close> 113 - )} 114 - </div> 115 - ) 97 + return ( 98 + <div 99 + data-slot="dialog-footer" 100 + className={cn( 101 + "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", 102 + className, 103 + )} 104 + {...props} 105 + > 106 + {children} 107 + {showCloseButton && ( 108 + <DialogPrimitive.Close render={<Button variant="outline" />}> 109 + Close 110 + </DialogPrimitive.Close> 111 + )} 112 + </div> 113 + ); 116 114 } 117 115 118 116 function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) { 119 - return ( 120 - <DialogPrimitive.Title 121 - data-slot="dialog-title" 122 - className={cn( 123 - "text-base leading-none font-medium", 124 - className 125 - )} 126 - {...props} 127 - /> 128 - ) 117 + return ( 118 + <DialogPrimitive.Title 119 + data-slot="dialog-title" 120 + className={cn("font-medium text-base leading-none", className)} 121 + {...props} 122 + /> 123 + ); 129 124 } 130 125 131 126 function DialogDescription({ 132 - className, 133 - ...props 127 + className, 128 + ...props 134 129 }: DialogPrimitive.Description.Props) { 135 - return ( 136 - <DialogPrimitive.Description 137 - data-slot="dialog-description" 138 - className={cn( 139 - "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", 140 - className 141 - )} 142 - {...props} 143 - /> 144 - ) 130 + return ( 131 + <DialogPrimitive.Description 132 + data-slot="dialog-description" 133 + className={cn( 134 + "text-muted-foreground text-sm *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", 135 + className, 136 + )} 137 + {...props} 138 + /> 139 + ); 145 140 } 146 141 147 142 export { 148 - Dialog, 149 - DialogClose, 150 - DialogContent, 151 - DialogDescription, 152 - DialogFooter, 153 - DialogHeader, 154 - DialogOverlay, 155 - DialogPortal, 156 - DialogTitle, 157 - DialogTrigger, 158 - } 143 + Dialog, 144 + DialogClose, 145 + DialogContent, 146 + DialogDescription, 147 + DialogFooter, 148 + DialogHeader, 149 + DialogOverlay, 150 + DialogPortal, 151 + DialogTitle, 152 + DialogTrigger, 153 + };
+3 -1
apps/web/src/hooks/use-rename-chat.ts
··· 21 21 onSuccess: (updatedChat) => { 22 22 queryClient.setQueryData<ChatSummary[]>(["chats"], (chats = []) => 23 23 chats.map((chat) => 24 - chat.id === updatedChat.id ? { ...chat, title: updatedChat.title } : chat, 24 + chat.id === updatedChat.id 25 + ? { ...chat, title: updatedChat.title } 26 + : chat, 25 27 ), 26 28 ); 27 29 },
+59
apps/web/src/styles.css
··· 188 188 @apply bg-background text-foreground; 189 189 } 190 190 } 191 + 192 + @layer components { 193 + .markdown > * + * { 194 + @apply mt-[0.625em]; 195 + } 196 + 197 + .markdown h1 { 198 + @apply text-xl font-semibold leading-tight; 199 + } 200 + 201 + .markdown h2 { 202 + @apply text-lg font-semibold leading-tight; 203 + } 204 + 205 + .markdown h3, 206 + .markdown h4 { 207 + @apply text-base font-semibold leading-tight; 208 + } 209 + 210 + .markdown ul { 211 + @apply list-disc pl-6; 212 + } 213 + 214 + .markdown ol { 215 + @apply list-decimal pl-6; 216 + } 217 + 218 + .markdown li + li { 219 + @apply mt-1; 220 + } 221 + 222 + .markdown strong { 223 + @apply font-semibold; 224 + } 225 + 226 + .markdown em { 227 + @apply italic; 228 + } 229 + 230 + .markdown code { 231 + @apply font-mono text-[0.875em] rounded-sm bg-current/10 px-1 py-0.5; 232 + } 233 + 234 + .markdown pre { 235 + @apply font-mono text-[0.875em] rounded-md bg-current/10 p-3 overflow-x-auto; 236 + } 237 + 238 + .markdown pre code { 239 + @apply bg-transparent p-0 text-[1em]; 240 + } 241 + 242 + .markdown blockquote { 243 + @apply border-l-2 border-current pl-2; 244 + } 245 + 246 + .markdown a { 247 + @apply underline underline-offset-2; 248 + } 249 + }
+159
bun.lock
··· 41 41 "lucide-react": "^1.11.0", 42 42 "react": "^19.2.0", 43 43 "react-dom": "^19.2.0", 44 + "react-markdown": "^10.1.0", 44 45 "shadcn": "^4.5.0", 45 46 "tailwindcss": "^4.1.18", 46 47 "tw-animate-css": "^1.4.0", ··· 406 407 407 408 "@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="], 408 409 410 + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], 411 + 412 + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], 413 + 414 + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], 415 + 416 + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], 417 + 418 + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], 419 + 420 + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], 421 + 409 422 "@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], 410 423 411 424 "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], ··· 416 429 417 430 "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="], 418 431 432 + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], 433 + 419 434 "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="], 420 435 421 436 "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], 422 437 438 + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], 439 + 423 440 "@vercel/oidc": ["@vercel/oidc@3.2.0", "", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="], 424 441 425 442 "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], ··· 447 464 "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], 448 465 449 466 "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], 467 + 468 + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], 450 469 451 470 "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], 452 471 ··· 477 496 "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 478 497 479 498 "caniuse-lite": ["caniuse-lite@1.0.30001791", "", {}, "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ=="], 499 + 500 + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], 480 501 481 502 "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], 482 503 504 + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], 505 + 506 + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], 507 + 508 + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], 509 + 510 + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], 511 + 483 512 "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], 484 513 485 514 "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], ··· 499 528 "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 500 529 501 530 "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 531 + 532 + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], 502 533 503 534 "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], 504 535 ··· 528 559 529 560 "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], 530 561 562 + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], 563 + 531 564 "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], 532 565 533 566 "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], ··· 540 573 541 574 "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], 542 575 576 + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], 577 + 543 578 "detect-libc": ["detect-libc@2.0.2", "", {}, "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="], 579 + 580 + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], 544 581 545 582 "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], 546 583 ··· 582 619 583 620 "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], 584 621 622 + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], 623 + 585 624 "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], 586 625 587 626 "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], ··· 594 633 595 634 "express-rate-limit": ["express-rate-limit@8.4.1", "", { "dependencies": { "ip-address": "10.1.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw=="], 596 635 636 + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], 637 + 597 638 "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 598 639 599 640 "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], ··· 660 701 661 702 "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="], 662 703 704 + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], 705 + 706 + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], 707 + 663 708 "headers-polyfill": ["headers-polyfill@5.0.1", "", { "dependencies": { "@types/set-cookie-parser": "^2.4.10", "set-cookie-parser": "^3.0.1" } }, "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA=="], 664 709 665 710 "hono": ["hono@4.12.15", "", {}, "sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg=="], 666 711 712 + "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], 713 + 667 714 "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], 668 715 669 716 "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], ··· 678 725 679 726 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 680 727 728 + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], 729 + 681 730 "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], 682 731 683 732 "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], 684 733 734 + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], 735 + 736 + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], 737 + 685 738 "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], 686 739 687 740 "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], 688 741 742 + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], 743 + 689 744 "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], 690 745 691 746 "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], ··· 693 748 "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 694 749 695 750 "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 751 + 752 + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], 696 753 697 754 "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], 698 755 ··· 778 835 779 836 "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], 780 837 838 + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], 839 + 781 840 "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 782 841 783 842 "lucide-react": ["lucide-react@1.11.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g=="], ··· 786 845 787 846 "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], 788 847 848 + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], 849 + 850 + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], 851 + 852 + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], 853 + 854 + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], 855 + 856 + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], 857 + 858 + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], 859 + 860 + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], 861 + 862 + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], 863 + 789 864 "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], 790 865 791 866 "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], ··· 794 869 795 870 "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 796 871 872 + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], 873 + 874 + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], 875 + 876 + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], 877 + 878 + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], 879 + 880 + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], 881 + 882 + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], 883 + 884 + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], 885 + 886 + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], 887 + 888 + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], 889 + 890 + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], 891 + 892 + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], 893 + 894 + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], 895 + 896 + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], 897 + 898 + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], 899 + 900 + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], 901 + 902 + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], 903 + 904 + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], 905 + 906 + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], 907 + 908 + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], 909 + 910 + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], 911 + 912 + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], 913 + 797 914 "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 798 915 799 916 "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], ··· 848 965 849 966 "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 850 967 968 + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], 969 + 851 970 "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], 852 971 853 972 "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], ··· 882 1001 883 1002 "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], 884 1003 1004 + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], 1005 + 885 1006 "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], 886 1007 887 1008 "qs": ["qs@6.15.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg=="], ··· 896 1017 897 1018 "react-dom": ["react-dom@19.2.5", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.5" } }, "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag=="], 898 1019 1020 + "react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="], 1021 + 899 1022 "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], 900 1023 901 1024 "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], 1025 + 1026 + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], 1027 + 1028 + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], 902 1029 903 1030 "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 904 1031 ··· 966 1093 967 1094 "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], 968 1095 1096 + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], 1097 + 969 1098 "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], 970 1099 971 1100 "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], ··· 974 1103 975 1104 "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], 976 1105 1106 + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], 1107 + 977 1108 "stringify-object": ["stringify-object@5.0.0", "", { "dependencies": { "get-own-enumerable-keys": "^1.0.0", "is-obj": "^3.0.0", "is-regexp": "^3.1.0" } }, "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg=="], 978 1109 979 1110 "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], ··· 981 1112 "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], 982 1113 983 1114 "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], 1115 + 1116 + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], 1117 + 1118 + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], 984 1119 985 1120 "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], 986 1121 ··· 1004 1139 1005 1140 "tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="], 1006 1141 1142 + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], 1143 + 1144 + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], 1145 + 1007 1146 "ts-morph": ["ts-morph@26.0.0", "", { "dependencies": { "@ts-morph/common": "~0.27.0", "code-block-writer": "^13.0.3" } }, "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug=="], 1008 1147 1009 1148 "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], ··· 1022 1161 1023 1162 "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], 1024 1163 1164 + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], 1165 + 1166 + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], 1167 + 1168 + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], 1169 + 1170 + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], 1171 + 1172 + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], 1173 + 1174 + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], 1175 + 1025 1176 "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], 1026 1177 1027 1178 "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], ··· 1039 1190 "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="], 1040 1191 1041 1192 "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], 1193 + 1194 + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], 1195 + 1196 + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], 1042 1197 1043 1198 "vite": ["vite@8.0.10", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", "rolldown": "1.0.0-rc.17", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw=="], 1044 1199 ··· 1072 1227 1073 1228 "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], 1074 1229 1230 + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], 1231 + 1075 1232 "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], 1076 1233 1077 1234 "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], ··· 1115 1272 "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], 1116 1273 1117 1274 "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], 1275 + 1276 + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], 1118 1277 1119 1278 "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 1120 1279