diff --git a/apps/widget/modules/widget/ui/screens/widget-auth-screen.tsx b/apps/widget/modules/widget/ui/screens/widget-auth-screen.tsx index bdf6605..4a83698 100644 --- a/apps/widget/modules/widget/ui/screens/widget-auth-screen.tsx +++ b/apps/widget/modules/widget/ui/screens/widget-auth-screen.tsx @@ -40,7 +40,7 @@ export const WidgetAuthScreen = () => { } }); - const createContaxtSession = useMutation(api.public.contact_sessions.create) + const createContaxtSession = useMutation(api.public.contactSessions.create) const onSubmit = async (values : z.infer) => { if(!organizationId) return; diff --git a/apps/widget/modules/widget/ui/screens/widget-chat-screen.tsx b/apps/widget/modules/widget/ui/screens/widget-chat-screen.tsx index 86dc01c..38b64f9 100644 --- a/apps/widget/modules/widget/ui/screens/widget-chat-screen.tsx +++ b/apps/widget/modules/widget/ui/screens/widget-chat-screen.tsx @@ -1,11 +1,30 @@ +"use client" + +import { useThreadMessages , toUIMessages } from "@convex-dev/agent/react" import { useAtom, useAtomValue, useSetAtom } from "jotai"; -import { AlertTriangleIcon, ArrowLeftIcon, MenuIcon } from "lucide-react"; +import { ArrowLeftIcon, MenuIcon } from "lucide-react"; import { contactSessionIdAtomFamily, conversationIDAtom, errorMessageAtom, organizationIdAtom, screenAtom } from "../../atoms/widget-atoms"; import { WidgetHeader } from "../components/widget.-header"; import { Button } from "@workspace/ui/components/button"; -import { useQuery } from "convex/react"; +import { useAction, useQuery } from "convex/react"; import { api } from "@workspace/backend/_generated/api"; -import { set } from "react-hook-form"; +import { + AIConversation , AIConversationContent , AIConversationScrollButton +} from "@workspace/ui/components/ui/conversation" +import { + AIInput, + AIInputButton, + AIInputSubmit, + AIInputTextarea, + AIInputToolbar, + AIInputTools +} from "@workspace/ui/components/ui/input" +import { + AIMessage, + AIMessageContent, +} from "@workspace/ui/components/ui/message" +import { AIResponse } from "@workspace/ui/components/ui/response" +import { useState } from "react"; export const WidgetChatScreen = () => { const setScreen = useSetAtom(screenAtom); @@ -15,7 +34,6 @@ export const WidgetChatScreen = () => { const contactSessionId = useAtomValue( contactSessionIdAtomFamily(organizationId || "") ) - const conversation = useQuery( api.public.conversations.getOne, conversationId && contactSessionId ? { @@ -23,13 +41,43 @@ export const WidgetChatScreen = () => { contactSessionId, } : "skip" ) - + const messages = useThreadMessages( + api.public.messages.getMany, + conversation?.threadId && contactSessionId + ? { + threadId : conversation.threadId, + contactSessionId + } : "skip" , + { initialNumItems : 10 } + ) const onBack = () => { setConversationId(null) setScreen("selection") } - return ( - <> + + const [input, setInput] = useState(""); + const sendMessage = useAction(api.public.messages.create); + + const handleSendMessage = async () => { + if (!input) return; + + if(!conversationId || !contactSessionId) { + console.error("Conversation ID or Contact Session ID is missing."); + return; + } + + await sendMessage({ + threadId: conversation?.threadId!, + contactSessionId: contactSessionId, + prompt: input, + }); + + + setInput(""); // Clear the input after sending + }; + + return ( +
-
-

- {JSON.stringify(conversation)} -

-
- + + + {toUIMessages(messages.results ?? [])?.map((message) => { + return ( + + + {message.content} + + {/* Add avatar component */} + + ) + })} + + + + + {/* */} + {/* Add tools here if needed */} + {/* */} +
+ setInput(e.target.value)} + placeholder="Type your message..." + onKeyDown={(e) => { + if (e.key !== 'Shift' && e.key !== 'Meta' && e.key !== 'Control' && e.key !== 'Alt') { + e.preventDefault(); + handleSendMessage(); + } + }} + /> + + + +
+
+
) -} \ No newline at end of file +} + diff --git a/apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx b/apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx index 1b47e06..8708e27 100644 --- a/apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx +++ b/apps/widget/modules/widget/ui/screens/widget-loading-screen.tsx @@ -66,7 +66,7 @@ export const WidgetLoadingScreen = ({ organizationId } : { organizationId : stri // Validate sessions if it exists - const validateContactSessions = useMutation(api.public.contact_sessions.validate) + const validateContactSessions = useMutation(api.public.contactSessions.validate) useEffect(() => { if(step != "session") { diff --git a/apps/widget/package.json b/apps/widget/package.json index 881ccc3..d17c1b0 100644 --- a/apps/widget/package.json +++ b/apps/widget/package.json @@ -12,6 +12,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@convex-dev/agent": "~0.1.16", "@hookform/resolvers": "^5.2.0", "@vapi-ai/web": "^2.3.9", "@workspace/backend": "workspace:*", diff --git a/packages/backend/convex/_generated/api.d.ts b/packages/backend/convex/_generated/api.d.ts index 39b5370..cd47eb9 100644 --- a/packages/backend/convex/_generated/api.d.ts +++ b/packages/backend/convex/_generated/api.d.ts @@ -8,15 +8,20 @@ * @module */ +import type * as public_contactSessions from "../public/contactSessions.js"; +import type * as public_conversations from "../public/conversations.js"; +import type * as public_messages from "../public/messages.js"; +import type * as public_organizations from "../public/organizations.js"; +import type * as system_ai_agents_supportAgent from "../system/ai/agents/supportAgent.js"; +import type * as system_contactSessions from "../system/contactSessions.js"; +import type * as system_converstions from "../system/converstions.js"; +import type * as users from "../users.js"; + import type { ApiFromModules, FilterApi, FunctionReference, } from "convex/server"; -import type * as public_contact_sessions from "../public/contact_sessions.js"; -import type * as public_conversations from "../public/conversations.js"; -import type * as public_organizations from "../public/organizations.js"; -import type * as users from "../users.js"; /** * A utility for referencing Convex functions in your app's API. @@ -27,16 +32,1934 @@ import type * as users from "../users.js"; * ``` */ declare const fullApi: ApiFromModules<{ - "public/contact_sessions": typeof public_contact_sessions; + "public/contactSessions": typeof public_contactSessions; "public/conversations": typeof public_conversations; + "public/messages": typeof public_messages; "public/organizations": typeof public_organizations; + "system/ai/agents/supportAgent": typeof system_ai_agents_supportAgent; + "system/contactSessions": typeof system_contactSessions; + "system/converstions": typeof system_converstions; users: typeof users; }>; +declare const fullApiWithMounts: typeof fullApi; + export declare const api: FilterApi< - typeof fullApi, + typeof fullApiWithMounts, FunctionReference >; export declare const internal: FilterApi< - typeof fullApi, + typeof fullApiWithMounts, FunctionReference >; + +export declare const components: { + agent: { + apiKeys: { + destroy: FunctionReference< + "mutation", + "internal", + { apiKey?: string; name?: string }, + | "missing" + | "deleted" + | "name mismatch" + | "must provide either apiKey or name" + >; + issue: FunctionReference< + "mutation", + "internal", + { name?: string }, + string + >; + validate: FunctionReference< + "query", + "internal", + { apiKey: string }, + boolean + >; + }; + files: { + addFile: FunctionReference< + "mutation", + "internal", + { + filename?: string; + hash: string; + mimeType: string; + storageId: string; + }, + { fileId: string; storageId: string } + >; + copyFile: FunctionReference< + "mutation", + "internal", + { fileId: string }, + null + >; + deleteFiles: FunctionReference< + "mutation", + "internal", + { fileIds: Array; force?: boolean }, + Array + >; + get: FunctionReference< + "query", + "internal", + { fileId: string }, + null | { + _creationTime: number; + _id: string; + filename?: string; + hash: string; + lastTouchedAt: number; + mimeType: string; + refcount: number; + storageId: string; + } + >; + getFilesToDelete: FunctionReference< + "query", + "internal", + { + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + }, + { + continueCursor: string; + isDone: boolean; + page: Array<{ + _creationTime: number; + _id: string; + filename?: string; + hash: string; + lastTouchedAt: number; + mimeType: string; + refcount: number; + storageId: string; + }>; + } + >; + useExistingFile: FunctionReference< + "mutation", + "internal", + { filename?: string; hash: string }, + null | { fileId: string; storageId: string } + >; + }; + messages: { + addMessages: FunctionReference< + "mutation", + "internal", + { + agentName?: string; + embeddings?: { + dimension: + | 128 + | 256 + | 512 + | 768 + | 1024 + | 1408 + | 1536 + | 2048 + | 3072 + | 4096; + model: string; + vectors: Array | null>; + }; + failPendingSteps?: boolean; + messages: Array<{ + error?: string; + fileIds?: Array; + finishReason?: + | "stop" + | "length" + | "content-filter" + | "tool-calls" + | "error" + | "other" + | "unknown"; + id?: string; + message: + | { + content: + | string + | Array< + | { + providerOptions?: Record< + string, + Record + >; + text: string; + type: "text"; + } + | { + image: string | ArrayBuffer; + mimeType?: string; + providerOptions?: Record< + string, + Record + >; + type: "image"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record< + string, + Record + >; + type: "file"; + } + >; + providerOptions?: Record>; + role: "user"; + } + | { + content: + | string + | Array< + | { + providerOptions?: Record< + string, + Record + >; + text: string; + type: "text"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record< + string, + Record + >; + type: "file"; + } + | { + providerOptions?: Record< + string, + Record + >; + signature?: string; + text: string; + type: "reasoning"; + } + | { + data: string; + providerOptions?: Record< + string, + Record + >; + type: "redacted-reasoning"; + } + | { + args: any; + providerOptions?: Record< + string, + Record + >; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + >; + providerOptions?: Record>; + role: "assistant"; + } + | { + content: Array<{ + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + }>; + providerOptions?: Record>; + role: "tool"; + } + | { + content: string; + providerOptions?: Record>; + role: "system"; + }; + model?: string; + provider?: string; + providerMetadata?: Record>; + reasoning?: string; + reasoningDetails?: Array< + | { signature?: string; text: string; type: "text" } + | { data: string; type: "redacted" } + >; + sources?: Array<{ + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }>; + text?: string; + usage?: { + completionTokens: number; + promptTokens: number; + totalTokens: number; + }; + warnings?: Array< + | { + details?: string; + setting: string; + type: "unsupported-setting"; + } + | { details?: string; tool: any; type: "unsupported-tool" } + | { message: string; type: "other" } + >; + }>; + pending?: boolean; + promptMessageId?: string; + threadId: string; + userId?: string; + }, + { + messages: Array<{ + _creationTime: number; + _id: string; + agentName?: string; + embeddingId?: string; + error?: string; + fileIds?: Array; + finishReason?: + | "stop" + | "length" + | "content-filter" + | "tool-calls" + | "error" + | "other" + | "unknown"; + id?: string; + message?: + | { + content: + | string + | Array< + | { + providerOptions?: Record< + string, + Record + >; + text: string; + type: "text"; + } + | { + image: string | ArrayBuffer; + mimeType?: string; + providerOptions?: Record< + string, + Record + >; + type: "image"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record< + string, + Record + >; + type: "file"; + } + >; + providerOptions?: Record>; + role: "user"; + } + | { + content: + | string + | Array< + | { + providerOptions?: Record< + string, + Record + >; + text: string; + type: "text"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record< + string, + Record + >; + type: "file"; + } + | { + providerOptions?: Record< + string, + Record + >; + signature?: string; + text: string; + type: "reasoning"; + } + | { + data: string; + providerOptions?: Record< + string, + Record + >; + type: "redacted-reasoning"; + } + | { + args: any; + providerOptions?: Record< + string, + Record + >; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + >; + providerOptions?: Record>; + role: "assistant"; + } + | { + content: Array<{ + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + }>; + providerOptions?: Record>; + role: "tool"; + } + | { + content: string; + providerOptions?: Record>; + role: "system"; + }; + model?: string; + order: number; + provider?: string; + providerMetadata?: Record>; + providerOptions?: Record>; + reasoning?: string; + reasoningDetails?: Array< + | { signature?: string; text: string; type: "text" } + | { data: string; type: "redacted" } + >; + sources?: Array<{ + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }>; + status: "pending" | "success" | "failed"; + stepOrder: number; + text?: string; + threadId: string; + tool: boolean; + usage?: { + completionTokens: number; + promptTokens: number; + totalTokens: number; + }; + userId?: string; + warnings?: Array< + | { + details?: string; + setting: string; + type: "unsupported-setting"; + } + | { details?: string; tool: any; type: "unsupported-tool" } + | { message: string; type: "other" } + >; + }>; + } + >; + commitMessage: FunctionReference< + "mutation", + "internal", + { messageId: string }, + null + >; + deleteByIds: FunctionReference< + "mutation", + "internal", + { messageIds: Array }, + Array + >; + deleteByOrder: FunctionReference< + "mutation", + "internal", + { + endOrder: number; + endStepOrder?: number; + startOrder: number; + startStepOrder?: number; + threadId: string; + }, + { isDone: boolean; lastOrder?: number; lastStepOrder?: number } + >; + getMessagesByIds: FunctionReference< + "query", + "internal", + { messageIds: Array }, + Array; + finishReason?: + | "stop" + | "length" + | "content-filter" + | "tool-calls" + | "error" + | "other" + | "unknown"; + id?: string; + message?: + | { + content: + | string + | Array< + | { + providerOptions?: Record>; + text: string; + type: "text"; + } + | { + image: string | ArrayBuffer; + mimeType?: string; + providerOptions?: Record>; + type: "image"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record>; + type: "file"; + } + >; + providerOptions?: Record>; + role: "user"; + } + | { + content: + | string + | Array< + | { + providerOptions?: Record>; + text: string; + type: "text"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record>; + type: "file"; + } + | { + providerOptions?: Record>; + signature?: string; + text: string; + type: "reasoning"; + } + | { + data: string; + providerOptions?: Record>; + type: "redacted-reasoning"; + } + | { + args: any; + providerOptions?: Record>; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + >; + providerOptions?: Record>; + role: "assistant"; + } + | { + content: Array<{ + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + }>; + providerOptions?: Record>; + role: "tool"; + } + | { + content: string; + providerOptions?: Record>; + role: "system"; + }; + model?: string; + order: number; + provider?: string; + providerMetadata?: Record>; + providerOptions?: Record>; + reasoning?: string; + reasoningDetails?: Array< + | { signature?: string; text: string; type: "text" } + | { data: string; type: "redacted" } + >; + sources?: Array<{ + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }>; + status: "pending" | "success" | "failed"; + stepOrder: number; + text?: string; + threadId: string; + tool: boolean; + usage?: { + completionTokens: number; + promptTokens: number; + totalTokens: number; + }; + userId?: string; + warnings?: Array< + | { details?: string; setting: string; type: "unsupported-setting" } + | { details?: string; tool: any; type: "unsupported-tool" } + | { message: string; type: "other" } + >; + }> + >; + listMessagesByThreadId: FunctionReference< + "query", + "internal", + { + excludeToolMessages?: boolean; + order: "asc" | "desc"; + paginationOpts?: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + statuses?: Array<"pending" | "success" | "failed">; + threadId: string; + upToAndIncludingMessageId?: string; + }, + { + continueCursor: string; + isDone: boolean; + page: Array<{ + _creationTime: number; + _id: string; + agentName?: string; + embeddingId?: string; + error?: string; + fileIds?: Array; + finishReason?: + | "stop" + | "length" + | "content-filter" + | "tool-calls" + | "error" + | "other" + | "unknown"; + id?: string; + message?: + | { + content: + | string + | Array< + | { + providerOptions?: Record< + string, + Record + >; + text: string; + type: "text"; + } + | { + image: string | ArrayBuffer; + mimeType?: string; + providerOptions?: Record< + string, + Record + >; + type: "image"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record< + string, + Record + >; + type: "file"; + } + >; + providerOptions?: Record>; + role: "user"; + } + | { + content: + | string + | Array< + | { + providerOptions?: Record< + string, + Record + >; + text: string; + type: "text"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record< + string, + Record + >; + type: "file"; + } + | { + providerOptions?: Record< + string, + Record + >; + signature?: string; + text: string; + type: "reasoning"; + } + | { + data: string; + providerOptions?: Record< + string, + Record + >; + type: "redacted-reasoning"; + } + | { + args: any; + providerOptions?: Record< + string, + Record + >; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + >; + providerOptions?: Record>; + role: "assistant"; + } + | { + content: Array<{ + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + }>; + providerOptions?: Record>; + role: "tool"; + } + | { + content: string; + providerOptions?: Record>; + role: "system"; + }; + model?: string; + order: number; + provider?: string; + providerMetadata?: Record>; + providerOptions?: Record>; + reasoning?: string; + reasoningDetails?: Array< + | { signature?: string; text: string; type: "text" } + | { data: string; type: "redacted" } + >; + sources?: Array<{ + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }>; + status: "pending" | "success" | "failed"; + stepOrder: number; + text?: string; + threadId: string; + tool: boolean; + usage?: { + completionTokens: number; + promptTokens: number; + totalTokens: number; + }; + userId?: string; + warnings?: Array< + | { + details?: string; + setting: string; + type: "unsupported-setting"; + } + | { details?: string; tool: any; type: "unsupported-tool" } + | { message: string; type: "other" } + >; + }>; + pageStatus?: "SplitRecommended" | "SplitRequired" | null; + splitCursor?: string | null; + } + >; + rollbackMessage: FunctionReference< + "mutation", + "internal", + { error?: string; messageId: string }, + null + >; + searchMessages: FunctionReference< + "action", + "internal", + { + beforeMessageId?: string; + embedding?: Array; + embeddingModel?: string; + limit: number; + messageRange?: { after: number; before: number }; + searchAllMessagesForUserId?: string; + text?: string; + threadId?: string; + vectorScoreThreshold?: number; + }, + Array<{ + _creationTime: number; + _id: string; + agentName?: string; + embeddingId?: string; + error?: string; + fileIds?: Array; + finishReason?: + | "stop" + | "length" + | "content-filter" + | "tool-calls" + | "error" + | "other" + | "unknown"; + id?: string; + message?: + | { + content: + | string + | Array< + | { + providerOptions?: Record>; + text: string; + type: "text"; + } + | { + image: string | ArrayBuffer; + mimeType?: string; + providerOptions?: Record>; + type: "image"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record>; + type: "file"; + } + >; + providerOptions?: Record>; + role: "user"; + } + | { + content: + | string + | Array< + | { + providerOptions?: Record>; + text: string; + type: "text"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record>; + type: "file"; + } + | { + providerOptions?: Record>; + signature?: string; + text: string; + type: "reasoning"; + } + | { + data: string; + providerOptions?: Record>; + type: "redacted-reasoning"; + } + | { + args: any; + providerOptions?: Record>; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + >; + providerOptions?: Record>; + role: "assistant"; + } + | { + content: Array<{ + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + }>; + providerOptions?: Record>; + role: "tool"; + } + | { + content: string; + providerOptions?: Record>; + role: "system"; + }; + model?: string; + order: number; + provider?: string; + providerMetadata?: Record>; + providerOptions?: Record>; + reasoning?: string; + reasoningDetails?: Array< + | { signature?: string; text: string; type: "text" } + | { data: string; type: "redacted" } + >; + sources?: Array<{ + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }>; + status: "pending" | "success" | "failed"; + stepOrder: number; + text?: string; + threadId: string; + tool: boolean; + usage?: { + completionTokens: number; + promptTokens: number; + totalTokens: number; + }; + userId?: string; + warnings?: Array< + | { details?: string; setting: string; type: "unsupported-setting" } + | { details?: string; tool: any; type: "unsupported-tool" } + | { message: string; type: "other" } + >; + }> + >; + textSearch: FunctionReference< + "query", + "internal", + { + beforeMessageId?: string; + limit: number; + searchAllMessagesForUserId?: string; + text: string; + threadId?: string; + }, + Array<{ + _creationTime: number; + _id: string; + agentName?: string; + embeddingId?: string; + error?: string; + fileIds?: Array; + finishReason?: + | "stop" + | "length" + | "content-filter" + | "tool-calls" + | "error" + | "other" + | "unknown"; + id?: string; + message?: + | { + content: + | string + | Array< + | { + providerOptions?: Record>; + text: string; + type: "text"; + } + | { + image: string | ArrayBuffer; + mimeType?: string; + providerOptions?: Record>; + type: "image"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record>; + type: "file"; + } + >; + providerOptions?: Record>; + role: "user"; + } + | { + content: + | string + | Array< + | { + providerOptions?: Record>; + text: string; + type: "text"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record>; + type: "file"; + } + | { + providerOptions?: Record>; + signature?: string; + text: string; + type: "reasoning"; + } + | { + data: string; + providerOptions?: Record>; + type: "redacted-reasoning"; + } + | { + args: any; + providerOptions?: Record>; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + >; + providerOptions?: Record>; + role: "assistant"; + } + | { + content: Array<{ + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + }>; + providerOptions?: Record>; + role: "tool"; + } + | { + content: string; + providerOptions?: Record>; + role: "system"; + }; + model?: string; + order: number; + provider?: string; + providerMetadata?: Record>; + providerOptions?: Record>; + reasoning?: string; + reasoningDetails?: Array< + | { signature?: string; text: string; type: "text" } + | { data: string; type: "redacted" } + >; + sources?: Array<{ + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }>; + status: "pending" | "success" | "failed"; + stepOrder: number; + text?: string; + threadId: string; + tool: boolean; + usage?: { + completionTokens: number; + promptTokens: number; + totalTokens: number; + }; + userId?: string; + warnings?: Array< + | { details?: string; setting: string; type: "unsupported-setting" } + | { details?: string; tool: any; type: "unsupported-tool" } + | { message: string; type: "other" } + >; + }> + >; + updateMessage: FunctionReference< + "mutation", + "internal", + { + messageId: string; + patch: { + error?: string; + fileIds?: Array; + message?: + | { + content: + | string + | Array< + | { + providerOptions?: Record< + string, + Record + >; + text: string; + type: "text"; + } + | { + image: string | ArrayBuffer; + mimeType?: string; + providerOptions?: Record< + string, + Record + >; + type: "image"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record< + string, + Record + >; + type: "file"; + } + >; + providerOptions?: Record>; + role: "user"; + } + | { + content: + | string + | Array< + | { + providerOptions?: Record< + string, + Record + >; + text: string; + type: "text"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record< + string, + Record + >; + type: "file"; + } + | { + providerOptions?: Record< + string, + Record + >; + signature?: string; + text: string; + type: "reasoning"; + } + | { + data: string; + providerOptions?: Record< + string, + Record + >; + type: "redacted-reasoning"; + } + | { + args: any; + providerOptions?: Record< + string, + Record + >; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + >; + providerOptions?: Record>; + role: "assistant"; + } + | { + content: Array<{ + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + }>; + providerOptions?: Record>; + role: "tool"; + } + | { + content: string; + providerOptions?: Record>; + role: "system"; + }; + status?: "pending" | "success" | "failed"; + }; + }, + { + _creationTime: number; + _id: string; + agentName?: string; + embeddingId?: string; + error?: string; + fileIds?: Array; + finishReason?: + | "stop" + | "length" + | "content-filter" + | "tool-calls" + | "error" + | "other" + | "unknown"; + id?: string; + message?: + | { + content: + | string + | Array< + | { + providerOptions?: Record>; + text: string; + type: "text"; + } + | { + image: string | ArrayBuffer; + mimeType?: string; + providerOptions?: Record>; + type: "image"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record>; + type: "file"; + } + >; + providerOptions?: Record>; + role: "user"; + } + | { + content: + | string + | Array< + | { + providerOptions?: Record>; + text: string; + type: "text"; + } + | { + data: string | ArrayBuffer; + filename?: string; + mimeType: string; + providerOptions?: Record>; + type: "file"; + } + | { + providerOptions?: Record>; + signature?: string; + text: string; + type: "reasoning"; + } + | { + data: string; + providerOptions?: Record>; + type: "redacted-reasoning"; + } + | { + args: any; + providerOptions?: Record>; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + >; + providerOptions?: Record>; + role: "assistant"; + } + | { + content: Array<{ + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + }>; + providerOptions?: Record>; + role: "tool"; + } + | { + content: string; + providerOptions?: Record>; + role: "system"; + }; + model?: string; + order: number; + provider?: string; + providerMetadata?: Record>; + providerOptions?: Record>; + reasoning?: string; + reasoningDetails?: Array< + | { signature?: string; text: string; type: "text" } + | { data: string; type: "redacted" } + >; + sources?: Array<{ + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }>; + status: "pending" | "success" | "failed"; + stepOrder: number; + text?: string; + threadId: string; + tool: boolean; + usage?: { + completionTokens: number; + promptTokens: number; + totalTokens: number; + }; + userId?: string; + warnings?: Array< + | { details?: string; setting: string; type: "unsupported-setting" } + | { details?: string; tool: any; type: "unsupported-tool" } + | { message: string; type: "other" } + >; + } + >; + }; + streams: { + abort: FunctionReference< + "mutation", + "internal", + { reason: string; streamId: string }, + boolean + >; + abortByOrder: FunctionReference< + "mutation", + "internal", + { order: number; reason: string; threadId: string }, + boolean + >; + addDelta: FunctionReference< + "mutation", + "internal", + { + end: number; + parts: Array< + | { textDelta: string; type: "text-delta" } + | { textDelta: string; type: "reasoning" } + | { + source: { + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }; + type: "source"; + } + | { + args: any; + providerOptions?: Record>; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + | { + toolCallId: string; + toolName: string; + type: "tool-call-streaming-start"; + } + | { + argsTextDelta: string; + toolCallId: string; + toolName: string; + type: "tool-call-delta"; + } + | { + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + } + >; + start: number; + streamId: string; + }, + boolean + >; + create: FunctionReference< + "mutation", + "internal", + { + agentName?: string; + model?: string; + order: number; + provider?: string; + providerOptions?: Record>; + stepOrder: number; + threadId: string; + userId?: string; + }, + string + >; + deleteAllStreamsForThreadIdAsync: FunctionReference< + "mutation", + "internal", + { deltaCursor?: string; streamOrder?: number; threadId: string }, + { deltaCursor?: string; isDone: boolean; streamOrder?: number } + >; + deleteAllStreamsForThreadIdSync: FunctionReference< + "action", + "internal", + { threadId: string }, + null + >; + deleteStreamAsync: FunctionReference< + "mutation", + "internal", + { cursor?: string; streamId: string }, + null + >; + deleteStreamSync: FunctionReference< + "mutation", + "internal", + { streamId: string }, + null + >; + finish: FunctionReference< + "mutation", + "internal", + { + finalDelta?: { + end: number; + parts: Array< + | { textDelta: string; type: "text-delta" } + | { textDelta: string; type: "reasoning" } + | { + source: { + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }; + type: "source"; + } + | { + args: any; + providerOptions?: Record>; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + | { + toolCallId: string; + toolName: string; + type: "tool-call-streaming-start"; + } + | { + argsTextDelta: string; + toolCallId: string; + toolName: string; + type: "tool-call-delta"; + } + | { + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + } + >; + start: number; + streamId: string; + }; + streamId: string; + }, + null + >; + list: FunctionReference< + "query", + "internal", + { + startOrder?: number; + statuses?: Array<"streaming" | "finished" | "aborted">; + threadId: string; + }, + Array<{ + agentName?: string; + model?: string; + order: number; + provider?: string; + providerOptions?: Record>; + status: "streaming" | "finished" | "aborted"; + stepOrder: number; + streamId: string; + userId?: string; + }> + >; + listDeltas: FunctionReference< + "query", + "internal", + { + cursors: Array<{ cursor: number; streamId: string }>; + threadId: string; + }, + Array<{ + end: number; + parts: Array< + | { textDelta: string; type: "text-delta" } + | { textDelta: string; type: "reasoning" } + | { + source: { + id: string; + providerOptions?: Record>; + sourceType: "url"; + title?: string; + url: string; + }; + type: "source"; + } + | { + args: any; + providerOptions?: Record>; + toolCallId: string; + toolName: string; + type: "tool-call"; + } + | { + toolCallId: string; + toolName: string; + type: "tool-call-streaming-start"; + } + | { + argsTextDelta: string; + toolCallId: string; + toolName: string; + type: "tool-call-delta"; + } + | { + args?: any; + experimental_content?: Array< + | { text: string; type: "text" } + | { data: string; mimeType?: string; type: "image" } + >; + isError?: boolean; + providerOptions?: Record>; + result: any; + toolCallId: string; + toolName: string; + type: "tool-result"; + } + >; + start: number; + streamId: string; + }> + >; + }; + threads: { + createThread: FunctionReference< + "mutation", + "internal", + { + defaultSystemPrompt?: string; + parentThreadIds?: Array; + summary?: string; + title?: string; + userId?: string; + }, + { + _creationTime: number; + _id: string; + status: "active" | "archived"; + summary?: string; + title?: string; + userId?: string; + } + >; + deleteAllForThreadIdAsync: FunctionReference< + "mutation", + "internal", + { + cursor?: string; + deltaCursor?: string; + limit?: number; + messagesDone?: boolean; + streamOrder?: number; + streamsDone?: boolean; + threadId: string; + }, + { isDone: boolean } + >; + deleteAllForThreadIdSync: FunctionReference< + "action", + "internal", + { limit?: number; threadId: string }, + null + >; + getThread: FunctionReference< + "query", + "internal", + { threadId: string }, + { + _creationTime: number; + _id: string; + status: "active" | "archived"; + summary?: string; + title?: string; + userId?: string; + } | null + >; + listThreadsByUserId: FunctionReference< + "query", + "internal", + { + order?: "asc" | "desc"; + paginationOpts?: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + userId?: string; + }, + { + continueCursor: string; + isDone: boolean; + page: Array<{ + _creationTime: number; + _id: string; + status: "active" | "archived"; + summary?: string; + title?: string; + userId?: string; + }>; + pageStatus?: "SplitRecommended" | "SplitRequired" | null; + splitCursor?: string | null; + } + >; + searchThreadTitles: FunctionReference< + "query", + "internal", + { limit: number; query: string; userId?: string | null }, + Array<{ + _creationTime: number; + _id: string; + status: "active" | "archived"; + summary?: string; + title?: string; + userId?: string; + }> + >; + updateThread: FunctionReference< + "mutation", + "internal", + { + patch: { + status?: "active" | "archived"; + summary?: string; + title?: string; + userId?: string; + }; + threadId: string; + }, + { + _creationTime: number; + _id: string; + status: "active" | "archived"; + summary?: string; + title?: string; + userId?: string; + } + >; + }; + users: { + deleteAllForUserId: FunctionReference< + "action", + "internal", + { userId: string }, + null + >; + deleteAllForUserIdAsync: FunctionReference< + "mutation", + "internal", + { userId: string }, + boolean + >; + listUsersWithThreads: FunctionReference< + "query", + "internal", + { + paginationOpts: { + cursor: string | null; + endCursor?: string | null; + id?: number; + maximumBytesRead?: number; + maximumRowsRead?: number; + numItems: number; + }; + }, + { + continueCursor: string; + isDone: boolean; + page: Array; + pageStatus?: "SplitRecommended" | "SplitRequired" | null; + splitCursor?: string | null; + } + >; + }; + vector: { + index: { + deleteBatch: FunctionReference< + "mutation", + "internal", + { + ids: Array< + | string + | string + | string + | string + | string + | string + | string + | string + | string + | string + >; + }, + null + >; + deleteBatchForThread: FunctionReference< + "mutation", + "internal", + { + cursor?: string; + limit: number; + model: string; + threadId: string; + vectorDimension: + | 128 + | 256 + | 512 + | 768 + | 1024 + | 1408 + | 1536 + | 2048 + | 3072 + | 4096; + }, + { continueCursor: string; isDone: boolean } + >; + insertBatch: FunctionReference< + "mutation", + "internal", + { + vectorDimension: + | 128 + | 256 + | 512 + | 768 + | 1024 + | 1408 + | 1536 + | 2048 + | 3072 + | 4096; + vectors: Array<{ + messageId?: string; + model: string; + table: string; + threadId?: string; + userId?: string; + vector: Array; + }>; + }, + Array< + | string + | string + | string + | string + | string + | string + | string + | string + | string + | string + > + >; + paginate: FunctionReference< + "query", + "internal", + { + cursor?: string; + limit: number; + table?: string; + targetModel: string; + vectorDimension: + | 128 + | 256 + | 512 + | 768 + | 1024 + | 1408 + | 1536 + | 2048 + | 3072 + | 4096; + }, + { + continueCursor: string; + ids: Array< + | string + | string + | string + | string + | string + | string + | string + | string + | string + | string + >; + isDone: boolean; + } + >; + updateBatch: FunctionReference< + "mutation", + "internal", + { + vectors: Array<{ + id: + | string + | string + | string + | string + | string + | string + | string + | string + | string + | string; + model: string; + vector: Array; + }>; + }, + null + >; + }; + }; + }; +}; diff --git a/packages/backend/convex/_generated/api.js b/packages/backend/convex/_generated/api.js index 3f9c482..44bf985 100644 --- a/packages/backend/convex/_generated/api.js +++ b/packages/backend/convex/_generated/api.js @@ -8,7 +8,7 @@ * @module */ -import { anyApi } from "convex/server"; +import { anyApi, componentsGeneric } from "convex/server"; /** * A utility for referencing Convex functions in your app's API. @@ -20,3 +20,4 @@ import { anyApi } from "convex/server"; */ export const api = anyApi; export const internal = anyApi; +export const components = componentsGeneric(); diff --git a/packages/backend/convex/_generated/server.d.ts b/packages/backend/convex/_generated/server.d.ts index 7f337a4..b5c6828 100644 --- a/packages/backend/convex/_generated/server.d.ts +++ b/packages/backend/convex/_generated/server.d.ts @@ -10,6 +10,7 @@ import { ActionBuilder, + AnyComponents, HttpActionBuilder, MutationBuilder, QueryBuilder, @@ -18,9 +19,15 @@ import { GenericQueryCtx, GenericDatabaseReader, GenericDatabaseWriter, + FunctionReference, } from "convex/server"; import type { DataModel } from "./dataModel.js"; +type GenericCtx = + | GenericActionCtx + | GenericMutationCtx + | GenericQueryCtx; + /** * Define a query in this Convex app's public API. * diff --git a/packages/backend/convex/_generated/server.js b/packages/backend/convex/_generated/server.js index 566d485..4a21df4 100644 --- a/packages/backend/convex/_generated/server.js +++ b/packages/backend/convex/_generated/server.js @@ -16,6 +16,7 @@ import { internalActionGeneric, internalMutationGeneric, internalQueryGeneric, + componentsGeneric, } from "convex/server"; /** diff --git a/packages/backend/convex/convex.config.ts b/packages/backend/convex/convex.config.ts new file mode 100644 index 0000000..c043457 --- /dev/null +++ b/packages/backend/convex/convex.config.ts @@ -0,0 +1,7 @@ +import { defineApp } from "convex/server"; +import agent from "@convex-dev/agent/convex.config"; + +const app: ReturnType = defineApp(); +app.use(agent); + +export default app; diff --git a/packages/backend/convex/public/contact_sessions.tsx b/packages/backend/convex/public/contactSessions.tsx similarity index 100% rename from packages/backend/convex/public/contact_sessions.tsx rename to packages/backend/convex/public/contactSessions.tsx diff --git a/packages/backend/convex/public/conversations.ts b/packages/backend/convex/public/conversations.ts index 53b42fc..c52db04 100644 --- a/packages/backend/convex/public/conversations.ts +++ b/packages/backend/convex/public/conversations.ts @@ -1,6 +1,9 @@ import { Id } from "../_generated/dataModel.js"; import { mutation, query } from "../_generated/server.js"; import { ConvexError, v } from "convex/values" +import { supportAgent } from "../system/ai/agents/supportAgent.js"; +import { saveMessage } from "@convex-dev/agent"; +import { components } from "../_generated/api.js"; export const getOne = query({ args : { @@ -21,7 +24,17 @@ export const getOne = query({ const conversation = await ctx.db.get(args.conversationId); if(!conversation) { - return null; + throw new ConvexError({ + code : "NOT_FOUND", + message : "Conversation Not Found" + }) + } + + if(conversation.contactSessionId !== session._id) { + throw new ConvexError({ + code : "NOT_FOUND", + message : "Incorrect Session" + }) } return { @@ -41,7 +54,7 @@ export const create = mutation({ handler: async (ctx, args) => { const session = await ctx.db.get(args.contactSessionId as Id<"contactSession">); - // Check if session does not exist or session expired + // Check if session does not exist or session expired if (!session || session.expiresAt < Date.now()) { throw new ConvexError({ code: "unauthorized", @@ -49,8 +62,19 @@ export const create = mutation({ }); } - const threadId = "123"; // placeholder, consider generating dynamically if needed + const { threadId } = await supportAgent.createThread(ctx , { + userId : args.organizationId + }) + await saveMessage(ctx , components.agent, { + threadId, + message : { + role : "assistant", + // Later modify to edit initial message + content : "How can I help you today?" + } + }) + const conversationId = await ctx.db.insert("conversations", { contactSessionId: session._id, status: "unresolved", diff --git a/packages/backend/convex/public/messages.ts b/packages/backend/convex/public/messages.ts new file mode 100644 index 0000000..0fe4bd4 --- /dev/null +++ b/packages/backend/convex/public/messages.ts @@ -0,0 +1,83 @@ +import { internal } from "../_generated/api.js"; +import { action, query } from "../_generated/server.js"; +import { ConvexError, v } from "convex/values"; +import { supportAgent } from "../system/ai/agents/supportAgent.js"; +import { paginationOptsValidator } from "convex/server"; + +export const create = action({ + args: { + prompt: v.string(), + threadId: v.string(), + contactSessionId: v.id("contactSession"), + }, + handler: async (ctx, args) => { + const contactSession = await ctx.runQuery( + internal.system.contactSessions.getOne, + { + contactSessionId: args.contactSessionId, + } + ); + + if(!contactSession || contactSession.expiresAt < Date.now()) { + throw new ConvexError({ + code : "UNAUTHORIZED", + message : "Invalid Session" + }) + } + + const conversation = await ctx.runQuery( + internal.system.converstions.getByThread, + { + threadId : args.threadId + } + ) + + if(!conversation) { + throw new ConvexError({ + code : "NOT_FOUND", + message : "Conversation not found" + }) + } + + if(conversation.status === "resolved") { + throw new ConvexError({ + code : "BAD_REQUEST", + message : "Conversation resolved" + }) + } + + // Todo : Implement subscription check + + await supportAgent.generateText( + ctx , + { threadId : args.threadId}, + { prompt : args.prompt } + ) + }, +}); + + +export const getMany = query({ + args : { + threadId : v.string(), + paginationOpts : paginationOptsValidator, + contactSessionId : v.id("contactSession") + }, + handler : async (ctx , args) => { + const contactSession = await ctx.db.get(args.contactSessionId) + + if(!contactSession || contactSession.expiresAt < Date.now()) { + throw new ConvexError({ + code : "UNAUTHORIZED", + message : "Invalid session" + }) + } + + const paginated = await supportAgent.listMessages(ctx , { + threadId : args.threadId, + paginationOpts : args.paginationOpts + }) + + return paginated; + } +}) \ No newline at end of file diff --git a/packages/backend/convex/system/ai/agents/supportAgent.ts b/packages/backend/convex/system/ai/agents/supportAgent.ts new file mode 100644 index 0000000..429fbfb --- /dev/null +++ b/packages/backend/convex/system/ai/agents/supportAgent.ts @@ -0,0 +1,8 @@ +import { google } from "@ai-sdk/google" +import { Agent } from "@convex-dev/agent" +import { components } from "../../../_generated/api.js" + +export const supportAgent = new Agent(components.agent, { + chat : google.chat("gemini-2.0-flash"), + instructions : "You are a customer support agent!" +}) \ No newline at end of file diff --git a/packages/backend/convex/system/contactSessions.ts b/packages/backend/convex/system/contactSessions.ts new file mode 100644 index 0000000..44604a2 --- /dev/null +++ b/packages/backend/convex/system/contactSessions.ts @@ -0,0 +1,11 @@ +import { v } from "convex/values" +import { internalQuery } from "../_generated/server.js" + +export const getOne = internalQuery({ + args : { + contactSessionId : v.id("contactSession") + }, + handler : async (ctx , args) => { + return await ctx.db.get(args.contactSessionId); + } +}) \ No newline at end of file diff --git a/packages/backend/convex/system/converstions.ts b/packages/backend/convex/system/converstions.ts new file mode 100644 index 0000000..5743776 --- /dev/null +++ b/packages/backend/convex/system/converstions.ts @@ -0,0 +1,16 @@ +import { v } from "convex/values" +import { internalQuery } from "../_generated/server.js" + +export const getByThread = internalQuery({ + args : { + threadId : v.string() + }, + handler : async (ctx , args) => { + const conversation = await ctx.db + .query("conversations") + .withIndex("by_thread_id" , (q) => q.eq("threadId" , args.threadId)) + .unique() + + return conversation; + }, +}) \ No newline at end of file diff --git a/packages/backend/package.json b/packages/backend/package.json index 6da6f9b..d8f93ba 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -13,7 +13,13 @@ "typescript": "latest" }, "dependencies": { + "@ai-sdk/google": "^1.2.22", + "@ai-sdk/openai": "^1.3.23", "@clerk/backend": "^2.10.1", - "convex": "1.25.4" + "@convex-dev/agent": "^0.1.16", + "ai": "^4.3.19", + "convex": "1.25.4", + "convex-helpers": "^0.1.104", + "lucide-react": "^0.475.0" } } \ No newline at end of file diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index abef532..d342d28 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -6,6 +6,6 @@ "@workspace/backend/*" : ["./*"] } }, - "include": ["."], + "include": [".", "../ui/src/components/ui"], "exclude": ["node_modules"] } \ No newline at end of file diff --git a/packages/ui/package.json b/packages/ui/package.json index c243db0..5ca4096 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -34,6 +34,7 @@ "@radix-ui/react-toggle": "^1.1.10", "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", + "@radix-ui/react-use-controllable-state": "^1.2.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -46,11 +47,14 @@ "react-day-picker": "^9.9.0", "react-dom": "^19.1.1", "react-hook-form": "^7.62.0", + "react-markdown": "^10.1.0", "react-resizable-panels": "^3.0.5", "recharts": "2.15.4", + "remark-gfm": "^4.0.1", "sonner": "^2.0.7", "tailwind-merge": "^3.3.1", "tw-animate-css": "^1.3.6", + "use-stick-to-bottom": "^1.1.1", "vaul": "^1.1.2", "zod": "^3.25.76" }, diff --git a/packages/ui/src/components/ui/branch.tsx b/packages/ui/src/components/ui/branch.tsx new file mode 100644 index 0000000..a8f920b --- /dev/null +++ b/packages/ui/src/components/ui/branch.tsx @@ -0,0 +1,212 @@ +"use client"; + +import { ChevronLeftIcon , ChevronRightIcon } from "lucide-react"; +import type { HTMLAttributes, ReactElement, ReactNode } from "react"; +import { createContext, useContext, useEffect, useState } from "react"; +import { Button } from "@workspace/ui/components/button"; +import { cn } from "@workspace/ui/lib/utils"; + +type AIBranchContextType = { + currentBranch: number; + totalBranches: number; + goToPrevious: () => void; + goToNext: () => void; + branches: ReactElement[]; + setBranches: (branches: ReactElement[]) => void; +}; + +const AIBranchContext = createContext(null); + +const useAIBranch = () => { + const context = useContext(AIBranchContext); + + if (!context) { + throw new Error("AIBranch components must be used within AIBranch"); + } + + return context; +}; + +export type AIBranchProps = HTMLAttributes & { + defaultBranch?: number; + onBranchChange?: (branchIndex: number) => void; +}; + +export const AIBranch = ({ + defaultBranch = 0, + onBranchChange, + className, + ...props +}: AIBranchProps) => { + const [currentBranch, setCurrentBranch] = useState(defaultBranch); + const [branches, setBranches] = useState([]); + + const handleBranchChange = (newBranch: number) => { + setCurrentBranch(newBranch); + onBranchChange?.(newBranch); + }; + + const goToPrevious = () => { + const newBranch = + currentBranch > 0 ? currentBranch - 1 : branches.length - 1; + handleBranchChange(newBranch); + }; + + const goToNext = () => { + const newBranch = + currentBranch < branches.length - 1 ? currentBranch + 1 : 0; + handleBranchChange(newBranch); + }; + + const contextValue: AIBranchContextType = { + currentBranch, + totalBranches: branches.length, + goToPrevious, + goToNext, + branches, + setBranches, + }; + + return ( + +
div]:pb-0", className)} + {...props} + /> + + ); +}; + +export type AIBranchMessagesProps = { + children: ReactElement | ReactElement[]; +}; + +export const AIBranchMessages = ({ children }: AIBranchMessagesProps) => { + const { currentBranch, setBranches, branches } = useAIBranch(); + const childrenArray = Array.isArray(children) ? children : [children]; + + // Use useEffect to update branches when they change + useEffect(() => { + if (branches.length !== childrenArray.length) { + setBranches(childrenArray); + } + }, [childrenArray, branches, setBranches]); + + return childrenArray.map((branch, index) => ( +
div]:pb-0", + index === currentBranch ? "block" : "hidden", + )} + key={index} + > + {branch} +
+ )); +}; + +export type AIBranchSelectorProps = HTMLAttributes & { + from: "user" | "assistant"; +}; + +export const AIBranchSelector = ({ + className, + from, + ...props +}: AIBranchSelectorProps) => { + const { totalBranches } = useAIBranch(); + + // Don't render if there's only one branch + if (totalBranches <= 1) { + return null; + } + + return ( +
+ ); +}; + +export type AIBranchPreviousProps = { + className?: string; + children?: ReactNode; +}; + +export const AIBranchPrevious = ({ + className, + children, +}: AIBranchPreviousProps) => { + const { goToPrevious, totalBranches } = useAIBranch(); + + return ( + + ); +}; + +export type AIBranchNextProps = { + className?: string; + children?: ReactNode; +}; + +export const AIBranchNext = ({ className, children }: AIBranchNextProps) => { + const { goToNext, totalBranches } = useAIBranch(); + + return ( + + ); +}; + +export type AIBranchPageProps = { + className?: string; +}; + +export const AIBranchPage = ({ className }: AIBranchPageProps) => { + const { currentBranch, totalBranches } = useAIBranch(); + + return ( + + {currentBranch + 1} of {totalBranches} + + ); +}; \ No newline at end of file diff --git a/packages/ui/src/components/ui/conversation.tsx b/packages/ui/src/components/ui/conversation.tsx new file mode 100644 index 0000000..7dde971 --- /dev/null +++ b/packages/ui/src/components/ui/conversation.tsx @@ -0,0 +1,56 @@ +"use client"; + +import { Button } from "@workspace/ui/components/button"; +import { ArrowDownIcon } from "lucide-react"; +import type { ComponentProps } from "react"; +import { useCallback } from "react"; +import { StickToBottom, useStickToBottomContext } from "use-stick-to-bottom"; +import { cn } from "@workspace/ui/lib/utils"; + +export type AIConversationProps = ComponentProps; + +export const AIConversation = ({ + className, + ...props +}: AIConversationProps) => ( + +); + +export type AIConversationContentProps = ComponentProps< + typeof StickToBottom.Content +>; + +export const AIConversationContent = ({ + className, + ...props +}: AIConversationContentProps) => ( + +); + +export const AIConversationScrollButton = () => { + const { isAtBottom, scrollToBottom } = useStickToBottomContext(); + + const handleScrollToBottom = useCallback(() => { + scrollToBottom(); + }, [scrollToBottom]); + + return ( + !isAtBottom && ( + + ) + ); +}; \ No newline at end of file diff --git a/packages/ui/src/components/ui/message.tsx b/packages/ui/src/components/ui/message.tsx new file mode 100644 index 0000000..63840fa --- /dev/null +++ b/packages/ui/src/components/ui/message.tsx @@ -0,0 +1,57 @@ +import type { ComponentProps, HTMLAttributes } from "react"; +import { Avatar, AvatarFallback, AvatarImage } from "@workspace/ui/components/avatar"; +import { cn } from "@workspace/ui/lib/utils"; + +export type AIMessageProps = HTMLAttributes & { + from: "user" | "assistant"; +}; + +export const AIMessage = ({ className, from, ...props }: AIMessageProps) => ( +
div]:max-w-[80%]", + className + )} + {...props} + /> +); + +export type AIMessageContentProps = HTMLAttributes; + +export const AIMessageContent = ({ + children, + className, + ...props +}: AIMessageContentProps) => ( +
+
{children}
+
+); + +export type AIMessageAvatarProps = ComponentProps & { + src: string; + name?: string; +}; + +export const AIMessageAvatar = ({ + src, + name, + className, + ...props +}: AIMessageAvatarProps) => ( + + + {name?.slice(0, 2) || "ME"} + +); \ No newline at end of file diff --git a/packages/ui/src/components/ui/reasoning.tsx b/packages/ui/src/components/ui/reasoning.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/ui/src/components/ui/response.tsx b/packages/ui/src/components/ui/response.tsx new file mode 100644 index 0000000..283949e --- /dev/null +++ b/packages/ui/src/components/ui/response.tsx @@ -0,0 +1,107 @@ +"use client"; + +import type { HTMLAttributes } from "react"; +import { memo } from "react"; +import ReactMarkdown, { type Options } from "react-markdown"; +import remarkGfm from "remark-gfm"; +import { cn } from "@workspace/ui/lib/utils"; + +export type AIResponseProps = HTMLAttributes & { + options?: Options; + children: Options["children"]; +}; + +const components: Options["components"] = { + ol: ({ children, className, ...props }) => ( +
    + {children} +
+ ), + li: ({ children, className, ...props }) => ( +
  • + {children} +
  • + ), + ul: ({ children, className, ...props }) => ( +
      + {children} +
    + ), + strong: ({ children, className, ...props }) => ( + + {children} + + ), + a: ({ children, className, ...props }) => ( + + {children} + + ), + h1: ({ children, className, ...props }) => ( +

    + {children} +

    + ), + h2: ({ children, className, ...props }) => ( +

    + {children} +

    + ), + h3: ({ children, className, ...props }) => ( +

    + {children} +

    + ), + h4: ({ children, className, ...props }) => ( +

    + {children} +

    + ), + h5: ({ children, className, ...props }) => ( +
    + {children} +
    + ), + h6: ({ children, className, ...props }) => ( +
    + {children} +
    + ), +}; + +export const AIResponse = memo( + ({ className, options, children, ...props }: AIResponseProps) => ( +
    *:first-child]:mt-0 [&>*:last-child]:mb-0", + className, + )} + {...props} + > + + {children} + +
    + ), + (prevProps, nextProps) => prevProps.children === nextProps.children, +); + +AIResponse.displayName = "AIResponse"; \ No newline at end of file diff --git a/packages/ui/src/components/ui/source.tsx b/packages/ui/src/components/ui/source.tsx new file mode 100644 index 0000000..02cbc7e --- /dev/null +++ b/packages/ui/src/components/ui/source.tsx @@ -0,0 +1,76 @@ +"use client"; + +import { BookIcon, ChevronDownIcon } from "lucide-react"; +import type { ComponentProps } from "react"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@workspace/ui/components/collapsible"; +import { cn } from "@workspace/ui/lib/utils"; + +export type AISourcesProps = ComponentProps<"div">; + +export const AISources = ({ className, ...props }: AISourcesProps) => ( + +); + +export type AISourcesTriggerProps = ComponentProps< + typeof CollapsibleTrigger +> & { + count: number; +}; + +export const AISourcesTrigger = ({ + count, + children, + ...props +}: AISourcesTriggerProps) => ( + + {children ?? ( + <> +

    Used {count} sources

    + + + )} +
    +); + +export type AISourcesContentProps = ComponentProps; + +export const AISourcesContent = ({ + className, + ...props +}: AISourcesContentProps) => ( + +); + +export type AISourceProps = ComponentProps<"a">; + +export const AISource = ({ + href, + title, + children, + ...props +}: AISourceProps) => ( + + {children ?? ( + <> + + {title} + + )} + +); \ No newline at end of file diff --git a/packages/ui/src/components/ui/suggestion.tsx b/packages/ui/src/components/ui/suggestion.tsx new file mode 100644 index 0000000..91f18e5 --- /dev/null +++ b/packages/ui/src/components/ui/suggestion.tsx @@ -0,0 +1,56 @@ +"use client"; + +import type { ComponentProps } from "react"; +import { Button } from "@workspace/ui/components/button"; +import { ScrollArea, ScrollBar } from "@workspace/ui/components/scroll-area"; +import { cn } from "@workspace/ui/lib/utils"; + +export type AISuggestionsProps = ComponentProps; + +export const AISuggestions = ({ + className, + children, + ...props +}: AISuggestionsProps) => ( + +
    + {children} +
    + +
    +); + +export type AISuggestionProps = Omit< + ComponentProps, + "onClick" +> & { + suggestion: string; + onClick?: (suggestion: string) => void; +}; + +export const AISuggestion = ({ + suggestion, + onClick, + className, + variant = "outline", + size = "sm", + children, + ...props +}: AISuggestionProps) => { + const handleClick = () => { + onClick?.(suggestion); + }; + + return ( + + ); +}; \ No newline at end of file diff --git a/packages/ui/src/components/ui/tools.tsx b/packages/ui/src/components/ui/tools.tsx new file mode 100644 index 0000000..06ff121 --- /dev/null +++ b/packages/ui/src/components/ui/tools.tsx @@ -0,0 +1,149 @@ +"use client"; + +import { + CheckCircleIcon, + ChevronDownIcon, + CircleIcon, + ClockIcon, + WrenchIcon, + XCircleIcon, +} from "lucide-react"; +import type { ComponentProps, ReactNode } from "react"; +import { Badge } from "@workspace/ui/components/badge"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@workspace/ui/components/collapsible"; +import { cn } from "@workspace/ui/lib/utils"; + +export type AIToolStatus = "pending" | "running" | "completed" | "error"; + +export type AIToolProps = ComponentProps & { + status?: AIToolStatus; +}; + +export const AITool = ({ className, ...props }: AIToolProps) => ( + +); + +export type AIToolHeaderProps = ComponentProps & { + status?: AIToolStatus; + name: string; + description?: string; +}; + +const getStatusBadge = (status: AIToolStatus) => { + const labels = { + pending: "Pending", + running: "Running", + completed: "Completed", + error: "Error", + } as const; + + const icons = { + pending: , + running: , + completed: , + error: , + } as const; + + return ( + + {icons[status]} + {labels[status]} + + ); +}; + +export const AIToolHeader = ({ + className, + status = "pending", + name, + ...props +}: AIToolHeaderProps) => ( + +
    + + {name} + {getStatusBadge(status)} +
    + +
    +); + +export type AIToolContentProps = ComponentProps; + +export const AIToolContent = ({ className, ...props }: AIToolContentProps) => ( + +); + +export type AIToolParametersProps = ComponentProps<"div"> & { + parameters: Record; +}; + +export const AIToolParameters = ({ + className, + parameters, + ...props +}: AIToolParametersProps) => ( +
    +

    + Parameters +

    +
    +
    +        {JSON.stringify(parameters, null, 2)}
    +      
    +
    +
    +); + +export type AIToolResultProps = ComponentProps<"div"> & { + result?: ReactNode; + error?: string; +}; + +export const AIToolResult = ({ + className, + result, + error, + ...props +}: AIToolResultProps) => { + if (!(result || error)) { + return null; + } + + return ( +
    +

    + {error ? "Error" : "Result"} +

    +
    + {error ?
    {error}
    :
    {result}
    } +
    +
    + ); +}; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d865f7..0029f3e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: dependencies: '@clerk/nextjs': specifier: ^6.31.6 - version: 6.31.6(next@15.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 6.31.6(next@15.4.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@workspace/backend': specifier: workspace:* version: link:../../packages/backend @@ -46,7 +46,7 @@ importers: version: 0.475.0(react@19.1.1) next: specifier: ^15.4.5 - version: 15.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 15.4.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -78,6 +78,9 @@ importers: apps/widget: dependencies: + '@convex-dev/agent': + specifier: ~0.1.16 + version: 0.1.18(ai@4.3.19(react@19.1.1)(zod@3.25.76))(convex-helpers@0.1.104(@standard-schema/spec@1.0.0)(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(zod@3.25.76))(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1) '@hookform/resolvers': specifier: ^5.2.0 version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) @@ -104,7 +107,7 @@ importers: version: 0.475.0(react@19.1.1) next: specifier: ^15.4.5 - version: 15.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 15.4.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -148,12 +151,30 @@ importers: packages/backend: dependencies: + '@ai-sdk/google': + specifier: ^1.2.22 + version: 1.2.22(zod@3.25.76) + '@ai-sdk/openai': + specifier: ^1.3.23 + version: 1.3.24(zod@3.25.76) '@clerk/backend': specifier: ^2.10.1 version: 2.10.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@convex-dev/agent': + specifier: ^0.1.16 + version: 0.1.18(ai@4.3.19(react@19.1.1)(zod@3.25.76))(convex-helpers@0.1.104(@standard-schema/spec@1.0.0)(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(zod@3.25.76))(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1) + ai: + specifier: ^4.3.19 + version: 4.3.19(react@19.1.1)(zod@3.25.76) convex: specifier: 1.25.4 version: 1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + convex-helpers: + specifier: ^0.1.104 + version: 0.1.104(@standard-schema/spec@1.0.0)(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(zod@3.25.76) + lucide-react: + specifier: ^0.475.0 + version: 0.475.0(react@19.1.1) devDependencies: '@workspace/typescript-config': specifier: workspace:* @@ -298,6 +319,9 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.2.8 version: 1.2.8(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@radix-ui/react-use-controllable-state': + specifier: ^1.2.2 + version: 1.2.2(@types/react@19.1.9)(react@19.1.1) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -334,12 +358,18 @@ importers: react-hook-form: specifier: ^7.62.0 version: 7.62.0(react@19.1.1) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.1.9)(react@19.1.1) react-resizable-panels: specifier: ^3.0.5 version: 3.0.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) recharts: specifier: 2.15.4 version: 2.15.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 sonner: specifier: ^2.0.7 version: 2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -349,6 +379,9 @@ importers: tw-animate-css: specifier: ^1.3.6 version: 1.3.6 + use-stick-to-bottom: + specifier: ^1.1.1 + version: 1.1.1(react@19.1.1) vaul: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@19.1.7(@types/react@19.1.9))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -386,6 +419,44 @@ importers: packages: + '@ai-sdk/google@1.2.22': + resolution: {integrity: sha512-Ppxu3DIieF1G9pyQ5O1Z646GYR0gkC57YdBqXJ82qvCdhEhZHu0TWhmnOoeIWe2olSbuDeoOY+MfJrW8dzS3Hw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai@1.3.24': + resolution: {integrity: sha512-GYXnGJTHRTZc4gJMSmFRgEQudjqd4PUN0ZjQhPwOAYH1yOAvQoG/Ikqs+HyISRbLPCrhbZnPKCNHuRU4OfpW0Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@2.2.8': + resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/react@1.2.12': + resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/ui-utils@1.2.11': + resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -437,6 +508,17 @@ packages: resolution: {integrity: sha512-WEILYgTGkwdB7OUoxHPrdHe/UAUPYvwutJxrwPyHfTejBmRD0RcKmB8VwTqwOxlfQgcKVDfLQ9jLW8m7NeJHIA==} engines: {node: '>=18.17.0'} + '@convex-dev/agent@0.1.18': + resolution: {integrity: sha512-eAoBBlHAmPmyA2VThLA7BEVVbCfuz+A1mTMph0AqKlWxUdPkipoaGVY7WekijHODKoC6MWlYCO6/jJ6KKjGxNQ==} + peerDependencies: + ai: ^4.3.16 + convex: ^1.23.0 + convex-helpers: ^0.1.100 + react: ^18.3.1 || ^19.0.0 + peerDependenciesMeta: + react: + optional: true + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -887,6 +969,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -1526,6 +1612,9 @@ packages: '@stablelib/base64@1.0.1': resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -1670,22 +1759,40 @@ packages: '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/inquirer@6.5.0': resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/minimatch@6.0.0': resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@20.19.9': resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} @@ -1703,6 +1810,12 @@ packages: '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript-eslint/eslint-plugin@8.39.0': resolution: {integrity: sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1762,6 +1875,9 @@ packages: resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vapi-ai/web@2.3.9': resolution: {integrity: sha512-Xx85DGuZd8dyCXsBmI09EwLXZIX+PyoYLayADOCRrnkwP+pilbY0gpEdZX4GjxlfYwo3GjqCx6zAeHq6+eUtjw==} engines: {node: '>=18.0.0'} @@ -1788,6 +1904,16 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + ai@4.3.19: + resolution: {integrity: sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + react: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1861,6 +1987,9 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1912,6 +2041,9 @@ packages: caniuse-lite@1.0.30001731: resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1924,9 +2056,25 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.0: + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@3.1.0: resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -1990,6 +2138,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -2000,6 +2151,28 @@ packages: constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + convex-helpers@0.1.104: + resolution: {integrity: sha512-7CYvx7T3K6n+McDTK4ZQaQNNGBzq5aWezpjzsKbOxPXx7oNcTP9wrpef3JxeXWFzkByJv5hRCjseh9B7eNJ7Ig==} + hasBin: true + peerDependencies: + '@standard-schema/spec': ^1.0.0 + convex: ^1.24.0 + hono: ^4.0.5 + react: ^17.0.2 || ^18.0.0 || ^19.0.0 + typescript: ^5.5 + zod: ^3.22.4 || ^4.0.15 + peerDependenciesMeta: + '@standard-schema/spec': + optional: true + hono: + optional: true + react: + optional: true + typescript: + optional: true + zod: + optional: true + convex@1.25.4: resolution: {integrity: sha512-LiGZZTmbe5iHWwDOYfSA00w+uDM8kgLC0ohFJW0VgQlKcs8famHCE6yuplk4wwXyj9Lhb1+yMRfrAD2ZEquqHg==} engines: {node: '>=18.0.0', npm: '>=7.0.0'} @@ -2111,6 +2284,9 @@ packages: decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2148,6 +2324,12 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -2239,6 +2421,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -2315,6 +2501,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2330,6 +2519,9 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -2510,9 +2702,18 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -2562,6 +2763,9 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + input-otp@1.4.2: resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==} peerDependencies: @@ -2588,6 +2792,12 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2623,6 +2833,9 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2643,6 +2856,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -2674,6 +2890,10 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -2777,9 +2997,17 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -2884,6 +3112,9 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2909,10 +3140,58 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2920,6 +3199,90 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -3096,6 +3459,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + pascal-case@2.0.1: resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} @@ -3160,6 +3526,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + proxy-agent@6.5.0: resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} @@ -3201,6 +3570,12 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -3282,6 +3657,18 @@ packages: resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} engines: {node: '>=0.10.0'} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3343,6 +3730,9 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3442,6 +3832,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} @@ -3481,6 +3874,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3497,6 +3893,12 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -3544,6 +3946,10 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -3567,6 +3973,12 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -3683,6 +4095,24 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3719,6 +4149,11 @@ packages: '@types/react': optional: true + use-stick-to-bottom@1.1.1: + resolution: {integrity: sha512-JkDp0b0tSmv7HQOOpL1hT7t7QaoUBXkq045WWWOFDTlLGRzgIIyW7vyzOIJzY7L2XVIG7j1yUxeDj2LHm9Vwng==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + use-sync-external-store@1.5.0: resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: @@ -3740,6 +4175,12 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} @@ -3793,11 +4234,59 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: + '@ai-sdk/google@1.2.22(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/openai@1.3.24(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.25.76 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@1.2.12(react@19.1.1)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + react: 19.1.1 + swr: 2.3.4(react@19.1.1) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.25.76 + + '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -3830,13 +4319,13 @@ snapshots: react-dom: 19.1.1(react@19.1.1) tslib: 2.8.1 - '@clerk/nextjs@6.31.6(next@15.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@clerk/nextjs@6.31.6(next@15.4.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@clerk/backend': 2.10.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/clerk-react': 5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/shared': 3.23.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/types': 4.83.0 - next: 15.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + next: 15.4.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) server-only: 0.0.1 @@ -3858,6 +4347,14 @@ snapshots: dependencies: csstype: 3.1.3 + '@convex-dev/agent@0.1.18(ai@4.3.19(react@19.1.1)(zod@3.25.76))(convex-helpers@0.1.104(@standard-schema/spec@1.0.0)(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(zod@3.25.76))(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1)': + dependencies: + ai: 4.3.19(react@19.1.1)(zod@3.25.76) + convex: 1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + convex-helpers: 0.1.104(@standard-schema/spec@1.0.0)(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(zod@3.25.76) + optionalDependencies: + react: 19.1.1 + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -4182,6 +4679,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@opentelemetry/api@1.9.0': {} + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -4865,6 +5364,9 @@ snapshots: '@stablelib/base64@1.0.1': {} + '@standard-schema/spec@1.0.0': + optional: true + '@standard-schema/utils@0.3.0': {} '@swc/helpers@0.5.15': @@ -5011,6 +5513,16 @@ snapshots: '@types/d3-timer@3.0.2': {} + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/diff-match-patch@1.0.36': {} + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + '@types/estree@1.0.8': {} '@types/glob@7.2.0': @@ -5018,6 +5530,10 @@ snapshots: '@types/minimatch': 6.0.0 '@types/node': 20.19.9 + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/inquirer@6.5.0': dependencies: '@types/through': 0.0.33 @@ -5025,10 +5541,16 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/minimatch@6.0.0': dependencies: minimatch: 9.0.5 + '@types/ms@2.1.0': {} + '@types/node@20.19.9': dependencies: undici-types: 6.21.0 @@ -5047,6 +5569,10 @@ snapshots: '@types/tinycolor2@1.4.6': {} + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -5140,6 +5666,8 @@ snapshots: '@typescript-eslint/types': 8.39.0 eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} + '@vapi-ai/web@2.3.9': dependencies: '@daily-co/daily-js': 0.80.0 @@ -5162,6 +5690,18 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + ai@4.3.19(react@19.1.1)(zod@3.25.76): + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/react': 1.2.12(react@19.1.1)(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.25.76 + optionalDependencies: + react: 19.1.1 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -5260,6 +5800,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + bail@2.0.2: {} + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -5318,6 +5860,8 @@ snapshots: caniuse-lite@1.0.30001731: {} + ccount@2.0.1: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -5334,6 +5878,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.0: {} + change-case@3.1.0: dependencies: camel-case: 3.0.0 @@ -5355,6 +5901,14 @@ snapshots: upper-case: 1.1.3 upper-case-first: 1.1.2 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chardet@0.7.0: {} chownr@3.0.0: {} @@ -5415,6 +5969,8 @@ snapshots: color-string: 1.9.1 optional: true + comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} concat-map@0.0.1: {} @@ -5424,6 +5980,15 @@ snapshots: snake-case: 2.1.0 upper-case: 1.1.3 + convex-helpers@0.1.104(@standard-schema/spec@1.0.0)(convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(zod@3.25.76): + dependencies: + convex: 1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1) + optionalDependencies: + '@standard-schema/spec': 1.0.0 + react: 19.1.1 + typescript: 5.9.2 + zod: 3.25.76 + convex@1.25.4(@clerk/clerk-react@5.45.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react@19.1.1): dependencies: esbuild: 0.25.4 @@ -5515,6 +6080,10 @@ snapshots: decimal.js-light@2.5.1: {} + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -5558,6 +6127,12 @@ snapshots: detect-node-es@1.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff-match-patch@1.0.5: {} + diff@4.0.2: {} dir-glob@3.0.1: @@ -5737,6 +6312,8 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -5852,6 +6429,8 @@ snapshots: estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} + esutils@2.0.3: {} eventemitter3@4.0.7: {} @@ -5870,6 +6449,8 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + extend@3.0.2: {} + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -6074,11 +6655,37 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + header-case@1.0.1: dependencies: no-case: 2.3.2 upper-case: 1.1.3 + html-url-attributes@3.0.1: {} + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -6123,6 +6730,8 @@ snapshots: ini@1.3.8: {} + inline-style-parser@0.2.4: {} + input-otp@1.4.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: react: 19.1.1 @@ -6175,6 +6784,13 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -6218,6 +6834,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -6237,6 +6855,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-interactive@1.0.0: {} is-lower-case@1.1.3: @@ -6258,6 +6878,8 @@ snapshots: is-path-inside@3.0.3: {} + is-plain-obj@4.1.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -6341,8 +6963,16 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.6.0 + diff-match-patch: 1.0.5 + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -6431,6 +7061,8 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6453,12 +7085,358 @@ snapshots: make-error@1.3.6: {} + markdown-table@3.0.4: {} + math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + merge-stream@2.0.0: {} merge2@1.4.1: {} + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -6505,7 +7483,7 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - next@15.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@15.4.5(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@next/env': 15.4.5 '@swc/helpers': 0.5.15 @@ -6523,6 +7501,7 @@ snapshots: '@next/swc-linux-x64-musl': 15.4.5 '@next/swc-win32-arm64-msvc': 15.4.5 '@next/swc-win32-x64-msvc': 15.4.5 + '@opentelemetry/api': 1.9.0 sharp: 0.34.3 transitivePeerDependencies: - '@babel/core' @@ -6672,6 +7651,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + pascal-case@2.0.1: dependencies: camel-case: 3.0.0 @@ -6723,6 +7712,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@7.1.0: {} + proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 @@ -6769,6 +7760,24 @@ snapshots: react-is@18.3.1: {} + react-markdown@10.1.0(@types/react@19.1.9)(react@19.1.1): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.1.9 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + react-remove-scroll-bar@2.3.8(@types/react@19.1.9)(react@19.1.1): dependencies: react: 19.1.1 @@ -6872,6 +7881,40 @@ snapshots: dependencies: rc: 1.2.8 + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + resolve-from@4.0.0: {} resolve@1.22.10: @@ -6936,6 +7979,8 @@ snapshots: scheduler@0.26.0: {} + secure-json-parse@2.7.0: {} + semver@6.3.1: {} semver@7.6.2: {} @@ -7072,6 +8117,8 @@ snapshots: source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + sprintf-js@1.1.3: {} standardwebhooks@1.0.0: @@ -7140,6 +8187,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -7150,6 +8202,14 @@ snapshots: strip-json-comments@3.1.1: {} + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + styled-jsx@5.1.6(react@19.1.1): dependencies: client-only: 0.0.1 @@ -7191,6 +8251,8 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + throttleit@2.1.0: {} + through@2.3.8: {} tiny-invariant@1.3.3: {} @@ -7215,6 +8277,10 @@ snapshots: dependencies: is-number: 7.0.0 + trim-lines@3.0.1: {} + + trough@2.2.0: {} + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: typescript: 5.9.2 @@ -7336,6 +8402,39 @@ snapshots: undici-types@6.21.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universalify@2.0.1: {} update-check@1.5.4: @@ -7368,6 +8467,10 @@ snapshots: optionalDependencies: '@types/react': 19.1.9 + use-stick-to-bottom@1.1.1(react@19.1.1): + dependencies: + react: 19.1.1 + use-sync-external-store@1.5.0(react@19.1.1): dependencies: react: 19.1.1 @@ -7387,6 +8490,16 @@ snapshots: - '@types/react' - '@types/react-dom' + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + victory-vendor@36.9.2: dependencies: '@types/d3-array': 3.2.1 @@ -7471,4 +8584,10 @@ snapshots: yocto-queue@0.1.0: {} + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod@3.25.76: {} + + zwitch@2.0.4: {}