diff --git a/apps/agent-ui/components.json b/apps/agent-ui/components.json new file mode 100644 index 00000000000..285033d31c0 --- /dev/null +++ b/apps/agent-ui/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/styles/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/apps/agent-ui/eslint.config.mjs b/apps/agent-ui/eslint.config.mjs new file mode 100644 index 00000000000..7cbcaf9c7d2 --- /dev/null +++ b/apps/agent-ui/eslint.config.mjs @@ -0,0 +1,7 @@ +import { defineConfig } from '@lobehub/eslint-config' + +export default defineConfig({ + react: true, + typescript: true, + sortKeys: false, +}) diff --git a/apps/agent-ui/index.html b/apps/agent-ui/index.html new file mode 100644 index 00000000000..fb2c21f7f05 --- /dev/null +++ b/apps/agent-ui/index.html @@ -0,0 +1,19 @@ + + + + + + + MX Agent + + + + + +
+ + + diff --git a/apps/agent-ui/package.json b/apps/agent-ui/package.json new file mode 100644 index 00000000000..b95501a7dd1 --- /dev/null +++ b/apps/agent-ui/package.json @@ -0,0 +1,50 @@ +{ + "name": "@mx-space/agent-ui", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview", + "lint": "eslint src/", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@lexical/code": "^0.22.0", + "@lexical/link": "^0.22.0", + "@lexical/list": "^0.22.0", + "@lexical/markdown": "^0.22.0", + "@lexical/react": "^0.22.0", + "@lexical/rich-text": "^0.22.0", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-popover": "1.1.15", + "@radix-ui/react-slot": "1.2.4", + "@radix-ui/react-switch": "1.2.6", + "@radix-ui/react-toast": "1.2.15", + "@radix-ui/react-tooltip": "1.2.8", + "@streamdown/cjk": "latest", + "@streamdown/code": "latest", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lexical": "^0.22.0", + "lucide-react": "^0.564.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router": "^7.0.0", + "socket.io-client": "^4.8.0", + "streamdown": "latest", + "tailwind-merge": "^3.3.1", + "zustand": "^5.0.11" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^4.4.0", + "tailwindcss": "^4.1.0", + "tw-animate-css": "^1.3.3", + "typescript": "^5.7.3", + "vite": "^6.2.0" + } +} diff --git a/apps/agent-ui/src/app.tsx b/apps/agent-ui/src/app.tsx new file mode 100644 index 00000000000..cae7928757a --- /dev/null +++ b/apps/agent-ui/src/app.tsx @@ -0,0 +1,17 @@ +import { Toaster } from '@/components/ui/toaster' +import { TooltipProvider } from '@/components/ui/tooltip' +import { AgentRoute } from '@/routes/index' +import { BrowserRouter, Route, Routes } from 'react-router' + +export function App() { + return ( + + + + } /> + + + + + ) +} diff --git a/apps/agent-ui/src/components/agent/agent-shell.tsx b/apps/agent-ui/src/components/agent/agent-shell.tsx new file mode 100644 index 00000000000..d7bb60625c5 --- /dev/null +++ b/apps/agent-ui/src/components/agent/agent-shell.tsx @@ -0,0 +1,101 @@ +import { Button } from '@/components/ui/button' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' +import { useAgentStore } from '@/lib/agent-store' +import { PanelLeft, PenSquare, Settings2 } from 'lucide-react' +import { ChatMessages } from './chat-messages' +import { InputBar } from './input-bar' +import { SettingsPanel } from './settings-panel' +import { Sidebar } from './sidebar' + +export function AgentShell() { + const store = useAgentStore() + + return ( +
+ {/* Sidebar */} + + + {/* Main area */} +
+ {/* Top bar */} +
+
+ {!store.sidebarOpen && ( + + + + + Open sidebar + + )} +
+
+ + + +
+
+

MX Agent

+
+
+ +
+ + + + + New chat + + + + + + Settings + +
+
+ + {/* Chat area */} + + + {/* Input area */} + + + {/* Settings dialog */} + +
+
+ ) +} diff --git a/apps/agent-ui/src/components/agent/chat-messages.tsx b/apps/agent-ui/src/components/agent/chat-messages.tsx new file mode 100644 index 00000000000..8b02ce17b89 --- /dev/null +++ b/apps/agent-ui/src/components/agent/chat-messages.tsx @@ -0,0 +1,337 @@ +import { useAgentStore } from '@/lib/agent-store' +import { cn } from '@/lib/utils' +import type { AIAgentMessage, WsConfirmRequest } from '@/types/agent' +import { AIAgentMessageKind } from '@/types/agent' +import { + Brain, + Check, + ChevronDown, + ChevronRight, + Copy, + Loader2, + User, + Wrench, +} from 'lucide-react' +import { useEffect, useRef, useState } from 'react' +import { extractTextFromContent, MarkdownStream } from './markdown-stream' +import { ToolCallCard } from './tool-call-card' +import { ToolConfirmCard } from './tool-confirm-card' +import { ToolResultCard } from './tool-result-card' + +function formatTime(isoOrTimestamp: string | number) { + const date = + typeof isoOrTimestamp === 'string' + ? new Date(isoOrTimestamp) + : new Date(isoOrTimestamp) + return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) +} + +function ThinkingBlock({ content }: { content: string }) { + const [expanded, setExpanded] = useState(false) + return ( +
+ + {expanded && ( +
+
{content}
+
+ )} +
+ ) +} + +function ToolCallItem({ name, args }: { name: string; args: any }) { + const [expanded, setExpanded] = useState(false) + return ( +
+ + {expanded && ( +
+
+            {JSON.stringify(args, null, 2)}
+          
+
+ )} +
+ ) +} + +function MessageBubble({ message }: { message: AIAgentMessage }) { + const [copied, setCopied] = useState(false) + const { pendingActions } = useAgentStore() + const isUser = message.kind === AIAgentMessageKind.User + const isAssistant = message.kind === AIAgentMessageKind.Assistant + const textContent = extractTextFromContent(message.content) + + const handleCopy = () => { + navigator.clipboard.writeText(textContent) + setCopied(true) + setTimeout(() => setCopied(false), 2000) + } + + if (message.kind === AIAgentMessageKind.ConfirmRequest) { + const data = message.content as WsConfirmRequest | null + if (!data) return null + + const isPending = pendingActions.some((a) => a.actionId === data.actionId) + + return + } + + if (message.kind === AIAgentMessageKind.ConfirmResult) { + const data = (message.content as any)?.message || message.content + const actionState = data?.state as string + return ( +
+
+ Action {actionState}: {(data?.toolName as string) || 'unknown'} +
+
+ ) + } + + if (message.kind === AIAgentMessageKind.ToolResult) { + return + } + + // Handle structured assistant message content + const structuredContent = (message.content as any)?.message?.content as + | any[] + | undefined + + return ( +
+ {!isUser && ( +
+
+
+ )} + +
+
+ + {formatTime(message.created)} + +
+ +
+ {structuredContent ? ( +
+ {structuredContent.map((item, i) => { + if (item.type === 'thinking') { + return + } + if (item.type === 'text') { + return + } + if (item.type === 'toolCall') { + return ( + + ) + } + return null + })} +
+ ) : isAssistant ? ( + + ) : ( +
{textContent}
+ )} +
+ + {isAssistant && ( +
+ +
+ )} +
+ + {isUser && ( +
+ +
+ )} +
+ ) +} + +function StreamingMessage({ delta }: { delta: string }) { + return ( +
+
+
+
+
+
+ +
+
+
+ ) +} + +function TypingIndicator() { + return ( +
+ + Agent is working... +
+ ) +} + +function EmptyState() { + return ( +
+
+ + + + +
+

MX Agent

+

+ Your AI assistant for managing blog content. Ask me to query data, run + commands, or analyze your site. +

+
+ ) +} + +export function ChatMessages() { + const store = useAgentStore() + const scrollRef = useRef(null) + + const { + messages, + streamingDelta, + sessionRunning, + activeToolEvents, + pendingActions, + } = store + + useEffect(() => { + if (scrollRef.current) { + scrollRef.current.scrollTop = scrollRef.current.scrollHeight + } + }, [messages, streamingDelta, activeToolEvents.size, pendingActions.length]) + + if (!store.activeSessionId && messages.length === 0) { + return + } + + // Filter pending actions that are not already in messages to avoid duplication + const messageActionIds = new Set( + messages + .filter((m) => m.kind === AIAgentMessageKind.ConfirmRequest) + .map((m) => (m.content as WsConfirmRequest)?.actionId) + .filter(Boolean), + ) + + const orphanedPendingActions = pendingActions.filter( + (a) => !messageActionIds.has(a.actionId), + ) + + return ( +
+
+ {messages.map((message) => ( + + ))} + + {/* Orphans (pending actions not in messages) */} + {orphanedPendingActions.map((action) => ( + + ))} + + {/* Active tool events */} + {Array.from(activeToolEvents.values()).map((entry) => ( + + ))} + + {/* Streaming delta */} + {streamingDelta && } + + {/* Typing indicator when running but no delta */} + {sessionRunning && + !streamingDelta && + activeToolEvents.size === 0 && + orphanedPendingActions.length === 0 && } +
+
+ ) +} diff --git a/apps/agent-ui/src/components/agent/input-bar.tsx b/apps/agent-ui/src/components/agent/input-bar.tsx new file mode 100644 index 00000000000..b75bdc93b6c --- /dev/null +++ b/apps/agent-ui/src/components/agent/input-bar.tsx @@ -0,0 +1,77 @@ +import { toast } from '@/hooks/use-toast' +import { useAgentStore } from '@/lib/agent-store' +import { ArrowUp, Loader2 } from 'lucide-react' +import { useCallback, useState } from 'react' +import { RichEditor } from './rich-editor' + +export function InputBar() { + const store = useAgentStore() + const [sending, setSending] = useState(false) + + const handleSubmit = useCallback( + async (text: string) => { + if (store.sessionRunning || sending) return + setSending(true) + try { + await store.sendMessage(text) + } catch (err) { + toast({ + title: 'Send failed', + description: (err as Error).message, + variant: 'destructive', + }) + } finally { + setSending(false) + } + }, + [store, sending], + ) + + const disabled = store.sessionRunning || sending + + return ( +
+
+
+ + +
+
+ {store.sessionRunning && ( +
+ + Agent running... +
+ )} +
+ + +
+
+ +

+ AI responses are generated. Verify important information before + publishing. +

+
+
+ ) +} diff --git a/apps/agent-ui/src/components/agent/markdown-stream.tsx b/apps/agent-ui/src/components/agent/markdown-stream.tsx new file mode 100644 index 00000000000..750679ea04c --- /dev/null +++ b/apps/agent-ui/src/components/agent/markdown-stream.tsx @@ -0,0 +1,57 @@ +import { cjk } from '@streamdown/cjk' +import { code } from '@streamdown/code' +import { Streamdown } from 'streamdown' + +interface MarkdownStreamProps { + content: string + streaming?: boolean +} + +export function MarkdownStream({ + content, + streaming = false, +}: MarkdownStreamProps) { + if (streaming) { + return ( + + {content} + + ) + } + + return {content} +} + +export function extractTextFromContent(content: unknown): string { + if (typeof content === 'string') return content + + if (content && typeof content === 'object') { + // pi-agent format: { message: { content: [{ type: 'text', text: '...' }] } } + const obj = content as Record + + if ('message' in obj && obj.message && typeof obj.message === 'object') { + const msg = obj.message as Record + if ('content' in msg && Array.isArray(msg.content)) { + return msg.content + .filter((c: { type?: string }) => c.type === 'text') + .map((c: { text?: string }) => c.text || '') + .join('') + } + } + + // Direct content array + if (Array.isArray(content)) { + return (content as Array<{ type?: string; text?: string }>) + .filter((c) => c.type === 'text') + .map((c) => c.text || '') + .join('') + } + + // Plain text field + if ('text' in obj && typeof obj.text === 'string') { + return obj.text + } + } + + return String(content ?? '') +} diff --git a/apps/agent-ui/src/components/agent/provider-icons.tsx b/apps/agent-ui/src/components/agent/provider-icons.tsx new file mode 100644 index 00000000000..a83ec76bd31 --- /dev/null +++ b/apps/agent-ui/src/components/agent/provider-icons.tsx @@ -0,0 +1,80 @@ +import { Bot } from 'lucide-react' + +export function OpenRouterIcon({ className }: { className?: string }) { + return ( + + + + + + ) +} + +export function OpenAIIcon({ className }: { className?: string }) { + return ( + + + + ) +} + +export function AnthropicIcon({ className }: { className?: string }) { + return ( + + + + ) +} + +export function GoogleIcon({ className }: { className?: string }) { + return ( + + + + + + + ) +} + +export const PROVIDER_ICON_OPTIONS = [ + { id: 'bot', label: 'Bot' }, + { id: 'openai', label: 'OpenAI' }, + { id: 'anthropic', label: 'Anthropic' }, + { id: 'openrouter', label: 'OpenRouter' }, + { id: 'google', label: 'Google' }, +] as const + +export function ProviderIcon({ + provider, + className, +}: { + provider: string + className?: string +}) { + switch (provider) { + case 'openrouter': { + return + } + case 'openai': { + return + } + case 'anthropic': { + return + } + case 'google': { + return + } + default: { + return + } + } +} diff --git a/apps/agent-ui/src/components/agent/rich-editor.tsx b/apps/agent-ui/src/components/agent/rich-editor.tsx new file mode 100644 index 00000000000..1de0f21b0a7 --- /dev/null +++ b/apps/agent-ui/src/components/agent/rich-editor.tsx @@ -0,0 +1,169 @@ +import { cn } from '@/lib/utils' +import { CodeNode } from '@lexical/code' +import { LinkNode } from '@lexical/link' +import { ListItemNode, ListNode } from '@lexical/list' +import { LexicalComposer } from '@lexical/react/LexicalComposer' +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' +import { ContentEditable } from '@lexical/react/LexicalContentEditable' +import { LexicalErrorBoundary } from '@lexical/react/LexicalErrorBoundary' +import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin' +import { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin' +import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin' +import { HeadingNode, QuoteNode } from '@lexical/rich-text' +import { + $createParagraphNode, + $createTextNode, + $getRoot, + COMMAND_PRIORITY_HIGH, + KEY_ENTER_COMMAND, + type EditorState, +} from 'lexical' +import { useCallback, useEffect, useRef } from 'react' + +const theme = { + paragraph: 'mb-0', + heading: { + h1: 'text-lg font-bold', + h2: 'text-base font-bold', + h3: 'text-sm font-bold', + }, + text: { + bold: 'font-bold', + italic: 'italic', + underline: 'underline', + strikethrough: 'line-through', + code: 'bg-secondary rounded px-1 py-0.5 font-mono text-xs', + }, + code: 'bg-secondary rounded-md p-2 font-mono text-xs block', + quote: + 'border-l-2 border-muted-foreground/30 pl-3 text-muted-foreground italic', + list: { + ul: 'list-disc pl-4', + ol: 'list-decimal pl-4', + }, +} + +function EnterKeyPlugin({ onSubmit }: { onSubmit: () => void }) { + const [editor] = useLexicalComposerContext() + + useEffect(() => { + return editor.registerCommand( + KEY_ENTER_COMMAND, + (event: KeyboardEvent | null) => { + if (event && !event.shiftKey) { + event.preventDefault() + onSubmit() + return true + } + return false + }, + COMMAND_PRIORITY_HIGH, + ) + }, [editor, onSubmit]) + + return null +} + +function ClearEditorPlugin({ + clearRef, +}: { + clearRef: React.MutableRefObject<(() => void) | null> +}) { + const [editor] = useLexicalComposerContext() + + useEffect(() => { + clearRef.current = () => { + editor.update(() => { + const root = $getRoot() + root.clear() + const paragraph = $createParagraphNode() + paragraph.append($createTextNode('')) + root.append(paragraph) + }) + } + }, [editor, clearRef]) + + return null +} + +function FocusPlugin({ + focusRef, +}: { + focusRef: React.MutableRefObject<(() => void) | null> +}) { + const [editor] = useLexicalComposerContext() + + useEffect(() => { + focusRef.current = () => { + editor.focus() + } + }, [editor, focusRef]) + + return null +} + +interface RichEditorProps { + onSubmit: (text: string) => void + placeholder?: string + className?: string +} + +export function RichEditor({ + onSubmit, + placeholder = 'Type a message...', + className, +}: RichEditorProps) { + const textRef = useRef('') + const clearRef = useRef<(() => void) | null>(null) + const focusRef = useRef<(() => void) | null>(null) + + const handleChange = useCallback((editorState: EditorState) => { + editorState.read(() => { + const root = $getRoot() + textRef.current = root.getTextContent() + }) + }, []) + + const handleSubmit = useCallback(() => { + const text = textRef.current.trim() + if (!text) return + onSubmit(text) + clearRef.current?.() + setTimeout(() => focusRef.current?.(), 0) + }, [onSubmit]) + + const initialConfig = { + namespace: 'AgentEditor', + theme, + nodes: [HeadingNode, QuoteNode, CodeNode, LinkNode, ListNode, ListItemNode], + onError: (error: Error) => { + console.error('[v0] Lexical error:', error) + }, + } + + return ( + +
+ + } + placeholder={ +
+ {placeholder} +
+ } + ErrorBoundary={LexicalErrorBoundary} + /> + + + + + +
+
+ ) +} diff --git a/apps/agent-ui/src/components/agent/settings-panel.tsx b/apps/agent-ui/src/components/agent/settings-panel.tsx new file mode 100644 index 00000000000..a76ab59cfcb --- /dev/null +++ b/apps/agent-ui/src/components/agent/settings-panel.tsx @@ -0,0 +1,423 @@ +import { Button } from '@/components/ui/button' +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' +import { Input } from '@/components/ui/input' +import { Switch } from '@/components/ui/switch' +import { toast } from '@/hooks/use-toast' +import { useAgentStore } from '@/lib/agent-store' +import { api } from '@/lib/api' +import { cn } from '@/lib/utils' +import type { AIAgentRuntimeConfig, AIProviderConfig } from '@/types/agent' +import { AIProviderType } from '@/types/agent' +import { Eye, EyeOff, Loader2, Plus, Save, Trash2 } from 'lucide-react' +import { useEffect, useState } from 'react' +import { ProviderIcon } from './provider-icons' + +interface ProviderFormState { + id: string + name: string + type: AIProviderType + apiKey: string + endpoint: string + defaultModel: string + enabled: boolean +} + +function toFormState(p: AIProviderConfig): ProviderFormState { + return { + id: p.id, + name: p.name, + type: p.type, + apiKey: p.api_key, + endpoint: p.endpoint || '', + defaultModel: p.default_model, + enabled: p.enabled, + } +} + +function ProviderDetail({ + provider, + onChange, + onRemove, +}: { + provider: ProviderFormState + onChange: (p: ProviderFormState) => void + onRemove: () => void +}) { + const [showKey, setShowKey] = useState(false) + + return ( +
+
+
+
+ +
+ + {provider.name || 'New Provider'} + +
+ +
+ +
+
+
+ + onChange({ ...provider, name: e.target.value })} + className="h-8 bg-secondary border-border text-sm" + /> +
+ +
+ +
+ {Object.values(AIProviderType).map((t) => ( + + ))} +
+
+ +
+ +
+ + onChange({ ...provider, apiKey: e.target.value }) + } + placeholder="sk-..." + className="h-8 bg-secondary border-border pr-9 font-mono text-xs" + /> + +
+
+ +
+ + + onChange({ ...provider, endpoint: e.target.value }) + } + placeholder="https://api.example.com/v1" + className="h-8 bg-secondary border-border font-mono text-xs" + /> +
+ +
+ + + onChange({ ...provider, defaultModel: e.target.value }) + } + placeholder="gpt-4o" + className="h-8 bg-secondary border-border font-mono text-xs" + /> +
+ +
+ + onChange({ ...provider, enabled: v })} + /> +
+
+
+
+ ) +} + +export function SettingsPanel() { + const store = useAgentStore() + const [providers, setProviders] = useState([]) + const [selectedIdx, setSelectedIdx] = useState(0) + const [agentProviderId, setAgentProviderId] = useState('') + const [agentModel, setAgentModel] = useState('') + const [enabledTools, setEnabledTools] = useState([]) + const [saving, setSaving] = useState(false) + const [loaded, setLoaded] = useState(false) + + useEffect(() => { + if (!store.settingsOpen) { + setLoaded(false) + return + } + + api + .getConfig() + .then((config: AIAgentRuntimeConfig) => { + setProviders(config.providers.map(toFormState)) + setAgentProviderId(config.agent_model?.provider_id || '') + setAgentModel(config.agent_model?.model || '') + setEnabledTools(config.enabled_tools || []) + setSelectedIdx(0) + setLoaded(true) + }) + .catch(() => { + setLoaded(true) + }) + }, [store.settingsOpen]) + + const addProvider = () => { + const id = `provider-${Date.now().toString(36)}` + const newP: ProviderFormState = { + id, + name: '', + type: AIProviderType.OpenAI, + apiKey: '', + endpoint: '', + defaultModel: '', + enabled: true, + } + setProviders([...providers, newP]) + setSelectedIdx(providers.length) + } + + const removeProvider = (idx: number) => { + const next = providers.filter((_, i) => i !== idx) + setProviders(next) + setSelectedIdx(Math.min(selectedIdx, Math.max(0, next.length - 1))) + } + + const updateProvider = (idx: number, p: ProviderFormState) => { + setProviders(providers.map((pr, i) => (i === idx ? p : pr))) + } + + const toggleTool = (tool: string) => { + setEnabledTools( + enabledTools.includes(tool) + ? enabledTools.filter((t) => t !== tool) + : [...enabledTools, tool], + ) + } + + const handleSave = async () => { + setSaving(true) + try { + await store.saveConfig({ + providers: providers.map((p) => ({ + id: p.id, + name: p.name, + type: p.type, + apiKey: p.apiKey, + endpoint: p.endpoint || undefined, + defaultModel: p.defaultModel, + enabled: p.enabled, + })), + agentModel: agentProviderId + ? { providerId: agentProviderId, model: agentModel || undefined } + : undefined, + enabledTools, + }) + toast({ title: 'Settings saved' }) + } catch { + toast({ title: 'Failed to save', variant: 'destructive' }) + } finally { + setSaving(false) + } + } + + return ( + + +
+ + Agent Settings + + Configure AI providers and agent tools. + + +
+ + {!loaded ? ( +
+ +
+ ) : ( +
+
+ {/* Left: Provider list */} +
+
+ + Providers + + +
+ + + {/* Agent model + tools */} +
+
+ + setAgentProviderId(e.target.value)} + placeholder="Provider ID" + className="h-7 bg-secondary border-border text-xs mb-1" + /> + setAgentModel(e.target.value)} + placeholder="Model name" + className="h-7 bg-secondary border-border text-xs" + /> +
+
+ +
+ {['mongodb', 'shell'].map((tool) => ( + + ))} +
+
+
+
+ + {/* Right: Provider detail */} + {providers[selectedIdx] ? ( + updateProvider(selectedIdx, p)} + onRemove={() => removeProvider(selectedIdx)} + /> + ) : ( +
+ Add a provider to get started +
+ )} +
+ + {/* Footer */} +
+ + +
+
+ )} +
+
+ ) +} diff --git a/apps/agent-ui/src/components/agent/sidebar.tsx b/apps/agent-ui/src/components/agent/sidebar.tsx new file mode 100644 index 00000000000..64e2a59ede8 --- /dev/null +++ b/apps/agent-ui/src/components/agent/sidebar.tsx @@ -0,0 +1,150 @@ +import { Button } from '@/components/ui/button' +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip' +import { useAgentStore } from '@/lib/agent-store' +import { cn } from '@/lib/utils' +import { Loader2, MessageSquare, PenSquare, X } from 'lucide-react' + +function formatRelativeDate(iso: string) { + const ts = new Date(iso).getTime() + const now = Date.now() + const diff = now - ts + const minutes = Math.floor(diff / 60000) + if (minutes < 1) return 'Just now' + if (minutes < 60) return `${minutes}m ago` + const hours = Math.floor(minutes / 60) + if (hours < 24) return `${hours}h ago` + const days = Math.floor(hours / 24) + if (days < 7) return `${days}d ago` + return new Date(ts).toLocaleDateString([], { month: 'short', day: 'numeric' }) +} + +export function Sidebar() { + const store = useAgentStore() + const sessions = Array.isArray(store.sessions) ? store.sessions : [] + + const groupedSessions = (() => { + const now = Date.now() + const today: typeof sessions = [] + const week: typeof sessions = [] + const older: typeof sessions = [] + + for (const s of sessions) { + const diff = now - new Date(s.updated).getTime() + if (diff < 86400000) today.push(s) + else if (diff < 604800000) week.push(s) + else older.push(s) + } + return [ + { label: 'Today', items: today }, + { label: 'This Week', items: week }, + { label: 'Older', items: older }, + ].filter((g) => g.items.length > 0) + })() + + return ( + + ) +} diff --git a/apps/agent-ui/src/components/agent/tool-call-card.tsx b/apps/agent-ui/src/components/agent/tool-call-card.tsx new file mode 100644 index 00000000000..4993912036b --- /dev/null +++ b/apps/agent-ui/src/components/agent/tool-call-card.tsx @@ -0,0 +1,121 @@ +import { Badge } from '@/components/ui/badge' +import type { ToolEventEntry } from '@/lib/agent-store' +import { cn } from '@/lib/utils' +import { + AlertCircle, + Check, + ChevronDown, + ChevronRight, + Loader2, + Wrench, +} from 'lucide-react' +import { useState } from 'react' + +interface ToolCallCardProps { + entry: ToolEventEntry +} + +export function ToolCallCard({ entry }: ToolCallCardProps) { + const [expanded, setExpanded] = useState(false) + + const statusIcon = (() => { + switch (entry.status) { + case 'running': { + return ( + + ) + } + case 'done': { + return + } + case 'error': { + return + } + } + })() + + const statusLabel = (() => { + switch (entry.status) { + case 'running': { + return 'Running...' + } + case 'done': { + return 'Completed' + } + case 'error': { + return 'Failed' + } + } + })() + + return ( +
+ + + {expanded && ( +
+ {entry.input != null && ( +
+

+ Input +

+
+                {String(JSON.stringify(entry.input, null, 2))}
+              
+
+ )} + {entry.output != null && ( +
+

+ Output +

+
+                {typeof entry.output === 'string'
+                  ? entry.output
+                  : String(JSON.stringify(entry.output, null, 2))}
+              
+
+ )} + {entry.error && ( +
+

+ Error +

+
+                {entry.error}
+              
+
+ )} +
+ )} +
+ ) +} diff --git a/apps/agent-ui/src/components/agent/tool-confirm-card.tsx b/apps/agent-ui/src/components/agent/tool-confirm-card.tsx new file mode 100644 index 00000000000..aaec7e261a4 --- /dev/null +++ b/apps/agent-ui/src/components/agent/tool-confirm-card.tsx @@ -0,0 +1,139 @@ +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { useAgentStore } from '@/lib/agent-store' +import type { WsConfirmRequest } from '@/types/agent' +import { + Check, + ChevronDown, + ChevronRight, + Loader2, + ShieldAlert, + X, +} from 'lucide-react' +import { useState } from 'react' + +interface ToolConfirmCardProps { + request: WsConfirmRequest + isPending?: boolean +} + +export function ToolConfirmCard({ + request, + isPending = true, +}: ToolConfirmCardProps) { + const [expanded, setExpanded] = useState(true) + const [confirming, setConfirming] = useState(false) + const [rejecting, setRejecting] = useState(false) + const { confirmAction, rejectAction } = useAgentStore() + + const handleConfirm = async () => { + setConfirming(true) + try { + await confirmAction(request.actionId) + } catch { + // error set in store + } finally { + setConfirming(false) + } + } + + const handleReject = async () => { + setRejecting(true) + try { + await rejectAction(request.actionId) + } catch { + // error set in store + } finally { + setRejecting(false) + } + } + + const busy = confirming || rejecting + + return ( +
+ + + {expanded && ( +
+
+ The agent wants to execute a potentially dangerous action. Please + review the details below. +
+ +
+

+ Arguments +

+
+              {JSON.stringify(request.arguments, null, 2)}
+            
+
+ + {request.dryRunPreview && ( +
+

+ Impact Preview +

+
+                {JSON.stringify(request.dryRunPreview, null, 2)}
+              
+
+ )} + + {isPending && ( +
+ + +
+ )} +
+ )} +
+ ) +} diff --git a/apps/agent-ui/src/components/agent/tool-result-card.tsx b/apps/agent-ui/src/components/agent/tool-result-card.tsx new file mode 100644 index 00000000000..3d62ac80235 --- /dev/null +++ b/apps/agent-ui/src/components/agent/tool-result-card.tsx @@ -0,0 +1,155 @@ +import { Badge } from '@/components/ui/badge' +import { cn } from '@/lib/utils' +import type { AIAgentMessage } from '@/types/agent' +import { + AlertCircle, + Check, + ChevronDown, + ChevronRight, + Database, + Terminal, + Wrench, +} from 'lucide-react' +import { useState } from 'react' + +interface ToolResultCardProps { + message: AIAgentMessage +} + +export function ToolResultCard({ message }: ToolResultCardProps) { + const [expanded, setExpanded] = useState(false) + + const content = message.content as any + const toolResult = content?.message || content + if (!toolResult) return null + + const isError = toolResult.is_error + const toolName = toolResult.tool_name + const details = toolResult.details + const rawOutput = toolResult.content + + const icon = (() => { + switch (toolName) { + case 'mongodb': { + return + } + case 'shell': { + return + } + default: { + return + } + } + })() + + // Format the output for display + const displayOutput = (() => { + if (details && toolName === 'mongodb') { + return ( +
+
+ + {details.operation} + + + {details.collection} + +
+
+            {JSON.stringify(details.result, null, 2)}
+          
+
+ ) + } + + const text = Array.isArray(rawOutput) + ? rawOutput.map((c: any) => c.text || '').join('\n') + : typeof rawOutput === 'string' + ? rawOutput + : JSON.stringify(rawOutput, null, 2) + + return ( +
+        {text}
+      
+ ) + })() + + return ( +
+ + + {expanded && ( +
{displayOutput}
+ )} +
+ ) +} diff --git a/apps/agent-ui/src/components/ui/badge.tsx b/apps/agent-ui/src/components/ui/badge.tsx new file mode 100644 index 00000000000..2acc8008b8f --- /dev/null +++ b/apps/agent-ui/src/components/ui/badge.tsx @@ -0,0 +1,45 @@ +import { cn } from '@/lib/utils' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' +import * as React from 'react' + +const badgeVariants = cva( + 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90', + secondary: + 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90', + destructive: + 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: + 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<'span'> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : 'span' + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/apps/agent-ui/src/components/ui/button.tsx b/apps/agent-ui/src/components/ui/button.tsx new file mode 100644 index 00000000000..8baf20339f4 --- /dev/null +++ b/apps/agent-ui/src/components/ui/button.tsx @@ -0,0 +1,59 @@ +import { cn } from '@/lib/utils' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' +import * as React from 'react' + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground hover:bg-primary/90', + destructive: + 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: + 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: + 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-9 px-4 py-2 has-[>svg]:px-3', + sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', + lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', + icon: 'size-9', + 'icon-sm': 'size-8', + 'icon-lg': 'size-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<'button'> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : 'button' + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/apps/agent-ui/src/components/ui/dialog.tsx b/apps/agent-ui/src/components/ui/dialog.tsx new file mode 100644 index 00000000000..4aaa002c5ac --- /dev/null +++ b/apps/agent-ui/src/components/ui/dialog.tsx @@ -0,0 +1,140 @@ +import { cn } from '@/lib/utils' +import * as DialogPrimitive from '@radix-ui/react-dialog' +import { XIcon } from 'lucide-react' +import * as React from 'react' + +function Dialog({ + ...props +}: React.ComponentProps) { + return +} + +function DialogTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function DialogPortal({ + ...props +}: React.ComponentProps) { + return +} + +function DialogClose({ + ...props +}: React.ComponentProps) { + return +} + +function DialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogContent({ + className, + children, + showCloseButton = true, + ...props +}: React.ComponentProps & { + showCloseButton?: boolean +}) { + return ( + + + + {children} + {showCloseButton && ( + + + Close + + )} + + + ) +} + +function DialogHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function DialogFooter({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function DialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +} diff --git a/apps/agent-ui/src/components/ui/input.tsx b/apps/agent-ui/src/components/ui/input.tsx new file mode 100644 index 00000000000..750b9060e02 --- /dev/null +++ b/apps/agent-ui/src/components/ui/input.tsx @@ -0,0 +1,20 @@ +import { cn } from '@/lib/utils' +import * as React from 'react' + +function Input({ className, type, ...props }: React.ComponentProps<'input'>) { + return ( + + ) +} + +export { Input } diff --git a/apps/agent-ui/src/components/ui/popover.tsx b/apps/agent-ui/src/components/ui/popover.tsx new file mode 100644 index 00000000000..aa255fa9d55 --- /dev/null +++ b/apps/agent-ui/src/components/ui/popover.tsx @@ -0,0 +1,45 @@ +import { cn } from '@/lib/utils' +import * as PopoverPrimitive from '@radix-ui/react-popover' +import * as React from 'react' + +function Popover({ + ...props +}: React.ComponentProps) { + return +} + +function PopoverTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function PopoverContent({ + className, + align = 'center', + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function PopoverAnchor({ + ...props +}: React.ComponentProps) { + return +} + +export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } diff --git a/apps/agent-ui/src/components/ui/spinner.tsx b/apps/agent-ui/src/components/ui/spinner.tsx new file mode 100644 index 00000000000..36b8261ce31 --- /dev/null +++ b/apps/agent-ui/src/components/ui/spinner.tsx @@ -0,0 +1,15 @@ +import { cn } from '@/lib/utils' +import { Loader2Icon } from 'lucide-react' + +function Spinner({ className, ...props }: React.ComponentProps<'svg'>) { + return ( + + ) +} + +export { Spinner } diff --git a/apps/agent-ui/src/components/ui/switch.tsx b/apps/agent-ui/src/components/ui/switch.tsx new file mode 100644 index 00000000000..7f6c592fe32 --- /dev/null +++ b/apps/agent-ui/src/components/ui/switch.tsx @@ -0,0 +1,28 @@ +import { cn } from '@/lib/utils' +import * as SwitchPrimitive from '@radix-ui/react-switch' +import * as React from 'react' + +function Switch({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { Switch } diff --git a/apps/agent-ui/src/components/ui/toast.tsx b/apps/agent-ui/src/components/ui/toast.tsx new file mode 100644 index 00000000000..dcdcd87a2b5 --- /dev/null +++ b/apps/agent-ui/src/components/ui/toast.tsx @@ -0,0 +1,149 @@ +import { cn } from '@/lib/utils' +import * as ToastPrimitives from '@radix-ui/react-toast' +import { cva, type VariantProps } from 'class-variance-authority' +import { X } from 'lucide-react' +import * as React from 'react' + +const ToastProvider = ToastPrimitives.Provider + +const ToastViewport = ({ + ref, + className, + ...props +}: React.ComponentPropsWithoutRef & { + ref?: React.RefObject | null> +}) => ( + +) +ToastViewport.displayName = ToastPrimitives.Viewport.displayName + +const toastVariants = cva( + 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full', + { + variants: { + variant: { + default: 'border bg-background text-foreground', + destructive: + 'destructive group border-destructive bg-destructive text-destructive-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +const Toast = ({ + ref, + className, + variant, + ...props +}: React.ComponentPropsWithoutRef & + VariantProps & { + ref?: React.RefObject | null> + }) => { + return ( + + ) +} +Toast.displayName = ToastPrimitives.Root.displayName + +const ToastAction = ({ + ref, + className, + ...props +}: React.ComponentPropsWithoutRef & { + ref?: React.RefObject | null> +}) => ( + +) +ToastAction.displayName = ToastPrimitives.Action.displayName + +const ToastClose = ({ + ref, + className, + ...props +}: React.ComponentPropsWithoutRef & { + ref?: React.RefObject | null> +}) => ( + + + +) +ToastClose.displayName = ToastPrimitives.Close.displayName + +const ToastTitle = ({ + ref, + className, + ...props +}: React.ComponentPropsWithoutRef & { + ref?: React.RefObject | null> +}) => ( + +) +ToastTitle.displayName = ToastPrimitives.Title.displayName + +const ToastDescription = ({ + ref, + className, + ...props +}: React.ComponentPropsWithoutRef & { + ref?: React.RefObject | null> +}) => ( + +) +ToastDescription.displayName = ToastPrimitives.Description.displayName + +type ToastProps = React.ComponentPropsWithoutRef + +type ToastActionElement = React.ReactElement + +export { + Toast, + ToastAction, + type ToastActionElement, + ToastClose, + ToastDescription, + type ToastProps, + ToastProvider, + ToastTitle, + ToastViewport, +} diff --git a/apps/agent-ui/src/components/ui/toaster.tsx b/apps/agent-ui/src/components/ui/toaster.tsx new file mode 100644 index 00000000000..85af62309fb --- /dev/null +++ b/apps/agent-ui/src/components/ui/toaster.tsx @@ -0,0 +1,33 @@ +import { + Toast, + ToastClose, + ToastDescription, + ToastProvider, + ToastTitle, + ToastViewport, +} from '@/components/ui/toast' +import { useToast } from '@/hooks/use-toast' + +export function Toaster() { + const { toasts } = useToast() + + return ( + + {toasts.map(function ({ id, title, description, action, ...props }) { + return ( + +
+ {title && {title}} + {description && ( + {description} + )} +
+ {action} + +
+ ) + })} + +
+ ) +} diff --git a/apps/agent-ui/src/components/ui/tooltip.tsx b/apps/agent-ui/src/components/ui/tooltip.tsx new file mode 100644 index 00000000000..b5a02c456d0 --- /dev/null +++ b/apps/agent-ui/src/components/ui/tooltip.tsx @@ -0,0 +1,58 @@ +import { cn } from '@/lib/utils' +import * as TooltipPrimitive from '@radix-ui/react-tooltip' +import * as React from 'react' + +function TooltipProvider({ + delayDuration = 0, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function Tooltip({ + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function TooltipTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function TooltipContent({ + className, + sideOffset = 0, + children, + ...props +}: React.ComponentProps) { + return ( + + + {children} + + + + ) +} + +export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } diff --git a/apps/agent-ui/src/hooks/use-mobile.ts b/apps/agent-ui/src/hooks/use-mobile.ts new file mode 100644 index 00000000000..4331d5c5620 --- /dev/null +++ b/apps/agent-ui/src/hooks/use-mobile.ts @@ -0,0 +1,19 @@ +import * as React from 'react' + +const MOBILE_BREAKPOINT = 768 + +export function useIsMobile() { + const [isMobile, setIsMobile] = React.useState(undefined) + + React.useEffect(() => { + const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) + const onChange = () => { + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) + } + mql.addEventListener('change', onChange) + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) + return () => mql.removeEventListener('change', onChange) + }, []) + + return !!isMobile +} diff --git a/apps/agent-ui/src/hooks/use-socket.ts b/apps/agent-ui/src/hooks/use-socket.ts new file mode 100644 index 00000000000..006a19c8ba5 --- /dev/null +++ b/apps/agent-ui/src/hooks/use-socket.ts @@ -0,0 +1,77 @@ +import { + connectSocket, + joinSession, + leaveSession, + onWsMessage, +} from '@/lib/socket' +import { + BusinessEvents, + type WsConfirmRequest, + type WsConfirmResult, + type WsEnvelope, + type WsMessagePayload, + type WsSessionState, + type WsToolEvent, +} from '@/types/agent' +import { useEffect, useRef } from 'react' + +export interface SocketHandlers { + onSessionState: (data: WsSessionState) => void + onMessage: (data: WsMessagePayload) => void + onToolEvent: (data: WsToolEvent) => void + onConfirmRequest: (data: WsConfirmRequest) => void + onConfirmResult: (data: WsConfirmResult) => void +} + +export function useSocketSession( + sessionId: string | null, + handlers: SocketHandlers, +) { + const handlersRef = useRef(handlers) + handlersRef.current = handlers + + useEffect(() => { + connectSocket() + + const cleanup = onWsMessage((raw: unknown) => { + const envelope = raw as WsEnvelope + if (!envelope?.type) return + + const h = handlersRef.current + + switch (envelope.type) { + case BusinessEvents.AI_AGENT_SESSION_STATE: { + h.onSessionState(envelope.data as WsSessionState) + break + } + case BusinessEvents.AI_AGENT_MESSAGE: { + h.onMessage(envelope.data as WsMessagePayload) + break + } + case BusinessEvents.AI_AGENT_TOOL_EVENT: { + h.onToolEvent(envelope.data as WsToolEvent) + break + } + case BusinessEvents.AI_AGENT_CONFIRM_REQUEST: { + h.onConfirmRequest(envelope.data as WsConfirmRequest) + break + } + case BusinessEvents.AI_AGENT_CONFIRM_RESULT: { + h.onConfirmResult(envelope.data as WsConfirmResult) + break + } + } + }) + + return cleanup + }, []) + + useEffect(() => { + if (!sessionId) return + + joinSession(sessionId) + return () => { + leaveSession(sessionId) + } + }, [sessionId]) +} diff --git a/apps/agent-ui/src/hooks/use-toast.ts b/apps/agent-ui/src/hooks/use-toast.ts new file mode 100644 index 00000000000..993c94e0915 --- /dev/null +++ b/apps/agent-ui/src/hooks/use-toast.ts @@ -0,0 +1,173 @@ +// Inspired by react-hot-toast library +import type { ToastActionElement, ToastProps } from '@/components/ui/toast' +import * as React from 'react' +import { create } from 'zustand' + +const TOAST_LIMIT = 1 +const TOAST_REMOVE_DELAY = 1000000 + +type ToasterToast = ToastProps & { + id: string + title?: React.ReactNode + description?: React.ReactNode + action?: ToastActionElement +} + +let count = 0 + +function genId() { + count = (count + 1) % Number.MAX_SAFE_INTEGER + return count.toString() +} + +type Action = + | { + type: 'ADD_TOAST' + toast: ToasterToast + } + | { + type: 'UPDATE_TOAST' + toast: Partial + } + | { + type: 'DISMISS_TOAST' + toastId?: ToasterToast['id'] + } + | { + type: 'REMOVE_TOAST' + toastId?: ToasterToast['id'] + } + +interface State { + toasts: ToasterToast[] +} + +const toastTimeouts = new Map>() + +const addToRemoveQueue = (toastId: string) => { + if (toastTimeouts.has(toastId)) { + return + } + + const timeout = setTimeout(() => { + toastTimeouts.delete(toastId) + dispatch({ + type: 'REMOVE_TOAST', + toastId, + }) + }, TOAST_REMOVE_DELAY) + + toastTimeouts.set(toastId, timeout) +} + +export const reducer = (state: State, action: Action): State => { + switch (action.type) { + case 'ADD_TOAST': { + return { + ...state, + toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), + } + } + + case 'UPDATE_TOAST': { + return { + ...state, + toasts: state.toasts.map((t) => + t.id === action.toast.id ? { ...t, ...action.toast } : t, + ), + } + } + + case 'DISMISS_TOAST': { + const { toastId } = action + + // ! Side effects ! - This could be extracted into a dismissToast() action, + // but I'll keep it here for simplicity + if (toastId) { + addToRemoveQueue(toastId) + } else { + state.toasts.forEach((toast) => { + addToRemoveQueue(toast.id) + }) + } + + return { + ...state, + toasts: state.toasts.map((t) => + t.id === toastId || toastId === undefined + ? { + ...t, + open: false, + } + : t, + ), + } + } + + case 'REMOVE_TOAST': { + if (action.toastId === undefined) { + return { + ...state, + toasts: [], + } + } + + return { + ...state, + toasts: state.toasts.filter((t) => t.id !== action.toastId), + } + } + } +} + +const useToastStore = create(() => ({ toasts: [] })) + +function dispatch(action: Action) { + useToastStore.setState((state) => reducer(state, action)) +} + +type Toast = Omit + +function toast({ ...props }: Toast) { + const id = genId() + + const update = (nextProps: ToasterToast) => + dispatch({ + type: 'UPDATE_TOAST', + toast: { ...nextProps, id }, + }) + const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id }) + + dispatch({ + type: 'ADD_TOAST', + toast: { + ...props, + id, + open: true, + onOpenChange: (open) => { + if (!open) dismiss() + }, + }, + }) + + return { + id, + dismiss, + update, + } +} + +function useToast() { + const toasts = useToastStore((state) => state.toasts) + + return { + toasts, + toast, + dismiss: React.useCallback( + (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }), + [], + ), + } +} + +export { toast, useToast } diff --git a/apps/agent-ui/src/lib/agent-store.ts b/apps/agent-ui/src/lib/agent-store.ts new file mode 100644 index 00000000000..9b23facd9ed --- /dev/null +++ b/apps/agent-ui/src/lib/agent-store.ts @@ -0,0 +1,320 @@ +import type { + AIAgentMessage, + AIAgentRuntimeConfig, + AIAgentSession, + WsConfirmRequest, + WsConfirmResult, + WsMessagePayload, + WsSessionState, + WsToolEvent, +} from '@/types/agent' +import { useCallback } from 'react' +import { create } from 'zustand' +import { api } from './api' + +// ──────────────── Tool Event Entry ──────────────── + +export interface ToolEventEntry { + toolUseId: string + toolName: string + status: 'running' | 'done' | 'error' + input?: unknown + output?: unknown + error?: string +} + +// ──────────────── State ──────────────── + +export interface AgentState { + config: AIAgentRuntimeConfig | null + sessions: AIAgentSession[] + activeSessionId: string | null + messages: AIAgentMessage[] + pendingActions: WsConfirmRequest[] + sessionRunning: boolean + streamingDelta: string + activeToolEvents: Map + settingsOpen: boolean + sidebarOpen: boolean + loading: boolean + error: string | null +} + +const initialState: AgentState = { + config: null, + sessions: [], + activeSessionId: null, + messages: [], + pendingActions: [], + sessionRunning: false, + streamingDelta: '', + activeToolEvents: new Map(), + settingsOpen: false, + sidebarOpen: true, + loading: false, + error: null, +} + +const useAgentStateStore = create(() => initialState) + +function setAgentState(partial: Partial) { + useAgentStateStore.setState(partial) +} + +function getAgentState() { + return useAgentStateStore.getState() +} + +// ──────────────── Computed Helpers ──────────────── + +export function getActiveSession(s: AgentState): AIAgentSession | undefined { + return s.sessions.find((ses) => ses.id === s.activeSessionId) +} + +function normalizeSessions( + payload: AIAgentSession[] | { data?: AIAgentSession[] } | null | undefined, +): AIAgentSession[] { + if (Array.isArray(payload)) { + return payload + } + + if (payload && Array.isArray(payload.data)) { + return payload.data + } + + return [] +} + +// ──────────────── Async Actions ──────────────── + +export async function loadConfig() { + try { + const config = await api.getConfig() + setAgentState({ config }) + } catch (err) { + setAgentState({ error: (err as Error).message }) + } +} + +export async function saveConfig(config: Parameters[0]) { + try { + const result = await api.putConfig(config) + setAgentState({ config: result }) + } catch (err) { + setAgentState({ error: (err as Error).message }) + throw err + } +} + +export async function loadSessions() { + try { + setAgentState({ loading: true }) + const sessions = normalizeSessions(await api.getSessions()) + setAgentState({ sessions, loading: false }) + } catch (err) { + setAgentState({ + error: (err as Error).message, + loading: false, + sessions: [], + }) + } +} + +export async function createSession(title?: string) { + try { + const session = await api.createSession(title) + const { sessions } = getAgentState() + setAgentState({ + sessions: [session, ...sessions], + activeSessionId: session.id, + messages: [], + streamingDelta: '', + pendingActions: [], + activeToolEvents: new Map(), + }) + } catch (err) { + setAgentState({ error: (err as Error).message }) + } +} + +export async function switchSession(sessionId: string) { + setAgentState({ + activeSessionId: sessionId, + messages: [], + streamingDelta: '', + pendingActions: [], + activeToolEvents: new Map(), + loading: true, + }) + + try { + const [sessionDetail, messagesResult] = await Promise.all([ + api.getSession(sessionId), + api.getMessages(sessionId), + ]) + + const pending: WsConfirmRequest[] = ( + sessionDetail.pending_actions || [] + ).map((a) => ({ + actionId: a.id, + sessionId: a.session_id, + toolName: a.tool_name, + arguments: a.arguments, + riskLevel: a.risk_level, + dryRunPreview: a.dry_run_preview, + })) + + setAgentState({ + messages: messagesResult.data, + pendingActions: pending, + loading: false, + }) + } catch (err) { + setAgentState({ error: (err as Error).message, loading: false }) + } +} + +export async function sendMessage(content: string) { + const { activeSessionId } = getAgentState() + if (!activeSessionId) return + + try { + await api.sendMessage(activeSessionId, content) + } catch (err) { + setAgentState({ error: (err as Error).message }) + throw err + } +} + +export async function confirmAction(actionId: string) { + try { + await api.confirmAction(actionId) + } catch (err) { + setAgentState({ error: (err as Error).message }) + throw err + } +} + +export async function rejectAction(actionId: string) { + try { + await api.rejectAction(actionId) + } catch (err) { + setAgentState({ error: (err as Error).message }) + throw err + } +} + +// ──────────────── Sync Actions ──────────────── + +export function setSettingsOpen(open: boolean) { + setAgentState({ settingsOpen: open }) +} + +export function setSidebarOpen(open: boolean) { + setAgentState({ sidebarOpen: open }) +} + +export function setActiveSessionId(id: string | null) { + setAgentState({ activeSessionId: id }) +} + +export function clearError() { + setAgentState({ error: null }) +} + +// ──────────────── WS Handlers ──────────────── + +export function handleSessionState(data: WsSessionState) { + setAgentState({ sessionRunning: data.state === 'running' }) + if (data.state === 'idle') { + setAgentState({ streamingDelta: '' }) + } +} + +export function handleMessage(data: WsMessagePayload) { + if ('delta' in data && data.kind === 'assistant_delta') { + const { streamingDelta } = getAgentState() + setAgentState({ streamingDelta: streamingDelta + data.delta }) + } else if ('message' in data) { + const { messages } = getAgentState() + setAgentState({ + messages: [...messages, data.message], + streamingDelta: '', + }) + } +} + +export function handleToolEvent(data: WsToolEvent) { + const { event } = data + const toolUseId = event.toolUseId || '' + const { activeToolEvents } = getAgentState() + const next = new Map(activeToolEvents) + + switch (event.type) { + case 'tool_execution_start': { + next.set(toolUseId, { + toolUseId, + toolName: event.toolName || 'unknown', + status: 'running', + input: event.input, + }) + break + } + case 'tool_execution_update': { + const existing = next.get(toolUseId) + if (existing) { + next.set(toolUseId, { ...existing, output: event.output }) + } + break + } + case 'tool_execution_end': { + const existing = next.get(toolUseId) + if (existing) { + next.set(toolUseId, { + ...existing, + status: event.error ? 'error' : 'done', + output: event.output, + error: event.error, + }) + } + break + } + } + + setAgentState({ activeToolEvents: next }) +} + +export function handleConfirmRequest(data: WsConfirmRequest) { + const { pendingActions } = getAgentState() + setAgentState({ pendingActions: [...pendingActions, data] }) +} + +export function handleConfirmResult(data: WsConfirmResult) { + const { pendingActions } = getAgentState() + setAgentState({ + pendingActions: pendingActions.filter((a) => a.actionId !== data.actionId), + }) +} + +// ──────────────── Hook ──────────────── + +export function useAgentStore() { + const snapshot = useAgentStateStore() + + return { + ...snapshot, + setSettingsOpen: useCallback((open: boolean) => setSettingsOpen(open), []), + setSidebarOpen: useCallback((open: boolean) => setSidebarOpen(open), []), + newSession: useCallback(() => createSession(), []), + switchSession: useCallback((id: string) => switchSession(id), []), + sendMessage: useCallback((content: string) => sendMessage(content), []), + confirmAction: useCallback((id: string) => confirmAction(id), []), + rejectAction: useCallback((id: string) => rejectAction(id), []), + loadConfig: useCallback(() => loadConfig(), []), + saveConfig: useCallback( + (config: Parameters[0]) => saveConfig(config), + [], + ), + getActiveSession: useCallback(() => getActiveSession(snapshot), [snapshot]), + } +} diff --git a/apps/agent-ui/src/lib/api.ts b/apps/agent-ui/src/lib/api.ts new file mode 100644 index 00000000000..a26a993ddf3 --- /dev/null +++ b/apps/agent-ui/src/lib/api.ts @@ -0,0 +1,112 @@ +import type { + AIAgentRuntimeConfig, + AIAgentSession, + GetSessionResponse, + PaginatedMessages, +} from '@/types/agent' + +export class ApiError extends Error { + constructor( + public status: number, + message: string, + ) { + super(message) + this.name = 'ApiError' + } +} + +const PREFIX = import.meta.env.PROD ? '/api/v2' : '' + +async function request(path: string, init?: RequestInit): Promise { + const url = `${PREFIX}${path}` + const res = await fetch(url, { + credentials: 'include', + headers: { + 'Content-Type': 'application/json', + ...(init?.headers as Record), + }, + ...init, + }) + + if (!res.ok) { + const body = await res.text().catch(() => '') + throw new ApiError(res.status, body || res.statusText) + } + + const text = await res.text() + if (!text) return undefined as T + return JSON.parse(text) +} + +export const api = { + getConfig() { + return request('/ai/agent/config') + }, + + putConfig(config: { + providers: Array<{ + id: string + name: string + type: string + apiKey: string + endpoint?: string + defaultModel: string + enabled: boolean + }> + agentModel?: { providerId?: string; model?: string } + enabledTools?: string[] + }) { + return request('/ai/agent/config', { + method: 'PUT', + body: JSON.stringify(config), + }) + }, + + createSession(title?: string) { + return request('/ai/agent/sessions', { + method: 'POST', + body: JSON.stringify({ title }), + }) + }, + + getSessions() { + return request( + '/ai/agent/sessions', + ) + }, + + getSession(id: string) { + return request(`/ai/agent/sessions/${id}`) + }, + + getMessages(sessionId: string, page = 1, size = 50) { + return request( + `/ai/agent/sessions/${sessionId}/messages?page=${page}&size=${size}`, + ) + }, + + sendMessage(sessionId: string, content: string) { + return request(`/ai/agent/sessions/${sessionId}/messages`, { + method: 'POST', + body: JSON.stringify({ content }), + }) + }, + + confirmAction(actionId: string) { + return request<{ success: boolean }>( + `/ai/agent/actions/${actionId}/confirm`, + { + method: 'POST', + }, + ) + }, + + rejectAction(actionId: string) { + return request<{ success: boolean }>( + `/ai/agent/actions/${actionId}/reject`, + { + method: 'POST', + }, + ) + }, +} diff --git a/apps/agent-ui/src/lib/socket.ts b/apps/agent-ui/src/lib/socket.ts new file mode 100644 index 00000000000..cfdcdf4b6dc --- /dev/null +++ b/apps/agent-ui/src/lib/socket.ts @@ -0,0 +1,45 @@ +import { io, type Socket } from 'socket.io-client' + +let socket: Socket | null = null + +export function getSocket(): Socket { + if (!socket) { + socket = io('/admin', { + transports: ['websocket'], + withCredentials: true, + autoConnect: false, + }) + } + return socket +} + +export function connectSocket() { + const s = getSocket() + if (!s.connected) { + s.connect() + } +} + +export function disconnectSocket() { + if (socket?.connected) { + socket.disconnect() + } +} + +export function joinSession(sessionId: string) { + const s = getSocket() + s.emit('ai-agent:join', { sessionId }) +} + +export function leaveSession(sessionId: string) { + const s = getSocket() + s.emit('ai-agent:leave', { sessionId }) +} + +export function onWsMessage(handler: (data: unknown) => void): () => void { + const s = getSocket() + s.on('message', handler) + return () => { + s.off('message', handler) + } +} diff --git a/apps/agent-ui/src/lib/utils.ts b/apps/agent-ui/src/lib/utils.ts new file mode 100644 index 00000000000..fed2fe91e4d --- /dev/null +++ b/apps/agent-ui/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/apps/agent-ui/src/main.tsx b/apps/agent-ui/src/main.tsx new file mode 100644 index 00000000000..f63967d0c02 --- /dev/null +++ b/apps/agent-ui/src/main.tsx @@ -0,0 +1,11 @@ +import './styles/globals.css' +import 'streamdown/styles.css' +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import { App } from './app' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/apps/agent-ui/src/routes/index.tsx b/apps/agent-ui/src/routes/index.tsx new file mode 100644 index 00000000000..96d07406912 --- /dev/null +++ b/apps/agent-ui/src/routes/index.tsx @@ -0,0 +1,32 @@ +import { AgentShell } from '@/components/agent/agent-shell' +import { useSocketSession } from '@/hooks/use-socket' +import { + handleConfirmRequest, + handleConfirmResult, + handleMessage, + handleSessionState, + handleToolEvent, + loadConfig, + loadSessions, + useAgentStore, +} from '@/lib/agent-store' +import { useEffect } from 'react' + +export function AgentRoute() { + const { activeSessionId } = useAgentStore() + + useEffect(() => { + loadConfig() + loadSessions() + }, []) + + useSocketSession(activeSessionId, { + onSessionState: handleSessionState, + onMessage: handleMessage, + onToolEvent: handleToolEvent, + onConfirmRequest: handleConfirmRequest, + onConfirmResult: handleConfirmResult, + }) + + return +} diff --git a/apps/agent-ui/src/styles/globals.css b/apps/agent-ui/src/styles/globals.css new file mode 100644 index 00000000000..bccde1e8d7f --- /dev/null +++ b/apps/agent-ui/src/styles/globals.css @@ -0,0 +1,115 @@ +@import 'tailwindcss'; +@import 'tw-animate-css'; + +@source "../../../node_modules/streamdown/dist/*.js"; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: #0a0a0a; + --foreground: #ededed; + --card: #111111; + --card-foreground: #ededed; + --popover: #111111; + --popover-foreground: #ededed; + --primary: #ededed; + --primary-foreground: #0a0a0a; + --secondary: #1a1a1a; + --secondary-foreground: #ededed; + --muted: #1a1a1a; + --muted-foreground: #888888; + --accent: #1a1a1a; + --accent-foreground: #ededed; + --destructive: #e5484d; + --destructive-foreground: #e5484d; + --border: #222222; + --input: #222222; + --ring: #444444; + --chart-1: #3b82f6; + --chart-2: #22c55e; + --chart-3: #eab308; + --chart-4: #f97316; + --chart-5: #ef4444; + --radius: 0.5rem; + --sidebar: #0a0a0a; + --sidebar-foreground: #ededed; + --sidebar-primary: #ededed; + --sidebar-primary-foreground: #0a0a0a; + --sidebar-accent: #1a1a1a; + --sidebar-accent-foreground: #ededed; + --sidebar-border: #222222; + --sidebar-ring: #444444; + --success: #22c55e; + --warning: #eab308; +} + +@theme inline { + --font-sans: 'Geist', 'Geist Fallback'; + --font-mono: 'Geist Mono', 'Geist Mono Fallback'; + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); + --color-success: var(--success); + --color-warning: var(--warning); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } + + ::-webkit-scrollbar { + width: 6px; + height: 6px; + } + ::-webkit-scrollbar-track { + background: transparent; + } + ::-webkit-scrollbar-thumb { + background: var(--border); + border-radius: 3px; + } + ::-webkit-scrollbar-thumb:hover { + background: var(--ring); + } + + ::selection { + background: rgba(237, 237, 237, 0.15); + } +} diff --git a/apps/agent-ui/src/types/agent.ts b/apps/agent-ui/src/types/agent.ts new file mode 100644 index 00000000000..15919a42075 --- /dev/null +++ b/apps/agent-ui/src/types/agent.ts @@ -0,0 +1,173 @@ +// ──────────────── Enums (mirror core) ──────────────── + +export enum AIProviderType { + OpenAI = 'openai', + OpenAICompatible = 'openai-compatible', + Anthropic = 'anthropic', + OpenRouter = 'openrouter', +} + +export enum AIAgentSessionStatus { + Active = 'active', + Closed = 'closed', +} + +export enum AIAgentMessageKind { + User = 'user', + Assistant = 'assistant', + ToolResult = 'tool_result', + ConfirmRequest = 'confirm_request', + ConfirmResult = 'confirm_result', +} + +export enum AIAgentActionState { + Pending = 'pending', + Confirmed = 'confirmed', + Rejected = 'rejected', + Executed = 'executed', + Cancelled = 'cancelled', +} + +export enum AIAgentActionRiskLevel { + Safe = 'safe', + Dangerous = 'dangerous', +} + +export enum BusinessEvents { + AI_AGENT_MESSAGE = 'AI_AGENT_MESSAGE', + AI_AGENT_TOOL_EVENT = 'AI_AGENT_TOOL_EVENT', + AI_AGENT_CONFIRM_REQUEST = 'AI_AGENT_CONFIRM_REQUEST', + AI_AGENT_CONFIRM_RESULT = 'AI_AGENT_CONFIRM_RESULT', + AI_AGENT_SESSION_STATE = 'AI_AGENT_SESSION_STATE', +} + +// ──────────────── REST types (snake_case from JSONTransformInterceptor) ──────────────── + +export interface AIProviderConfig { + id: string + name: string + type: AIProviderType + api_key: string + endpoint?: string + default_model: string + enabled: boolean +} + +export interface AIModelAssignment { + provider_id: string + model?: string +} + +export interface AIAgentRuntimeConfig { + providers: AIProviderConfig[] + agent_model?: AIModelAssignment + enabled_tools: AIAgentToolId[] +} + +export type AIAgentToolId = 'mongodb' | 'shell' + +export interface AIAgentSession { + id: string + title: string + status: AIAgentSessionStatus + created: string + updated: string +} + +export interface AIAgentMessage { + id: string + session_id: string + seq: number + role: string + kind: AIAgentMessageKind + content: unknown + created: string +} + +export interface AIAgentAction { + id: string + session_id: string + tool_name: string + arguments: Record + risk_level: AIAgentActionRiskLevel + state: AIAgentActionState + result?: unknown + error?: string + dry_run_preview?: Record + created: string + updated: string +} + +export interface PaginatedMessages { + data: AIAgentMessage[] + pagination: { + total: number + page: number + size: number + total_page: number + has_next_page: boolean + has_prev_page: boolean + } +} + +export interface GetSessionResponse extends AIAgentSession { + pending_actions?: AIAgentAction[] +} + +// ──────────────── WS types (camelCase, raw from gateway) ──────────────── + +export interface WsEnvelope { + type: BusinessEvents + data: T +} + +export interface WsSessionState { + sessionId: string + state: 'running' | 'idle' +} + +export interface WsMessageDelta { + sessionId: string + kind: 'assistant_delta' + delta: string +} + +export interface WsMessageFull { + sessionId: string + kind: AIAgentMessageKind + message: AIAgentMessage +} + +export type WsMessagePayload = WsMessageDelta | WsMessageFull + +export interface WsToolEvent { + sessionId: string + event: { + type: + | 'tool_execution_start' + | 'tool_execution_update' + | 'tool_execution_end' + toolName?: string + toolUseId?: string + input?: unknown + output?: unknown + error?: string + } +} + +export interface WsConfirmRequest { + actionId: string + sessionId: string + toolName: string + arguments: Record + riskLevel: AIAgentActionRiskLevel + dryRunPreview?: Record +} + +export interface WsConfirmResult { + actionId: string + state: AIAgentActionState + toolName: string + result?: unknown + error?: string +} diff --git a/apps/agent-ui/tsconfig.json b/apps/agent-ui/tsconfig.json new file mode 100644 index 00000000000..87a83f4e71f --- /dev/null +++ b/apps/agent-ui/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "noEmit": true, + "skipLibCheck": true, + "esModuleInterop": true, + "isolatedModules": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", "vite-env.d.ts"] +} diff --git a/apps/agent-ui/vite-env.d.ts b/apps/agent-ui/vite-env.d.ts new file mode 100644 index 00000000000..11f02fe2a00 --- /dev/null +++ b/apps/agent-ui/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/agent-ui/vite.config.ts b/apps/agent-ui/vite.config.ts new file mode 100644 index 00000000000..61edd0f45e5 --- /dev/null +++ b/apps/agent-ui/vite.config.ts @@ -0,0 +1,31 @@ +import { resolve } from 'node:path' +import tailwindcss from '@tailwindcss/vite' +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [react(), tailwindcss()], + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + }, + }, + server: { + port: 2340, + proxy: { + '/api': { + target: 'http://localhost:2333', + changeOrigin: true, + }, + '/socket.io': { + target: 'http://localhost:2333', + changeOrigin: true, + ws: true, + }, + '/ai': { + target: 'http://localhost:2333', + changeOrigin: true, + }, + }, + }, +}) diff --git a/apps/core/package.json b/apps/core/package.json index 3cff6478881..70da3309c46 100644 --- a/apps/core/package.json +++ b/apps/core/package.json @@ -70,6 +70,8 @@ "@lexical/link": "^0.40.0", "@lexical/list": "^0.40.0", "@lexical/rich-text": "^0.40.0", + "@mariozechner/pi-agent-core": "^0.52.12", + "@mariozechner/pi-ai": "^0.52.12", "@nestjs/cache-manager": "3.1.0", "@nestjs/common": "11.1.12", "@nestjs/core": "11.1.12", diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent-action.model.ts b/apps/core/src/modules/ai/ai-agent/ai-agent-action.model.ts new file mode 100644 index 00000000000..fab5c2fad62 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent-action.model.ts @@ -0,0 +1,53 @@ +import { index, modelOptions, prop, Severity } from '@typegoose/typegoose' +import { AI_AGENT_ACTION_COLLECTION_NAME } from '~/constants/db.constant' +import { BaseModel } from '~/shared/model/base.model' +import { AIAgentActionRiskLevel, AIAgentActionState } from './ai-agent.types' + +@modelOptions({ + options: { + customName: AI_AGENT_ACTION_COLLECTION_NAME, + allowMixed: Severity.ALLOW, + }, +}) +@index({ sessionId: 1, state: 1, created: -1 }) +export class AIAgentActionModel extends BaseModel { + @prop({ required: true }) + sessionId: string + + @prop({ required: true }) + toolName: string + + @prop({ type: () => Object, required: true }) + arguments: Record + + @prop({ + required: true, + enum: AIAgentActionRiskLevel, + default: AIAgentActionRiskLevel.Dangerous, + type: String, + }) + riskLevel: AIAgentActionRiskLevel + + @prop({ + required: true, + enum: AIAgentActionState, + default: AIAgentActionState.Pending, + type: String, + }) + state: AIAgentActionState + + @prop({ type: () => Object }) + dryRunPreview?: Record + + @prop({ type: () => Object }) + result?: Record + + @prop() + error?: string + + @prop() + confirmedBy?: string + + @prop({ type: Date, default: () => new Date() }) + updated?: Date +} diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent-message.model.ts b/apps/core/src/modules/ai/ai-agent/ai-agent-message.model.ts new file mode 100644 index 00000000000..1368c3a1de8 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent-message.model.ts @@ -0,0 +1,33 @@ +import { index, modelOptions, prop, Severity } from '@typegoose/typegoose' +import { AI_AGENT_MESSAGE_COLLECTION_NAME } from '~/constants/db.constant' +import { BaseModel } from '~/shared/model/base.model' +import { AIAgentMessageKind } from './ai-agent.types' + +@modelOptions({ + options: { + customName: AI_AGENT_MESSAGE_COLLECTION_NAME, + allowMixed: Severity.ALLOW, + }, +}) +@index({ sessionId: 1, seq: 1 }, { unique: true }) +@index({ sessionId: 1, created: -1 }) +export class AIAgentMessageModel extends BaseModel { + @prop({ required: true }) + sessionId: string + + @prop({ required: true }) + seq: number + + @prop({ required: true }) + role: 'user' | 'assistant' | 'toolResult' | 'system' + + @prop({ + required: true, + enum: AIAgentMessageKind, + type: String, + }) + kind: AIAgentMessageKind + + @prop({ type: () => Object, required: true }) + content: Record +} diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent-runtime-config.model.ts b/apps/core/src/modules/ai/ai-agent/ai-agent-runtime-config.model.ts new file mode 100644 index 00000000000..c05c0f1e229 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent-runtime-config.model.ts @@ -0,0 +1,27 @@ +import { index, modelOptions, prop, Severity } from '@typegoose/typegoose' +import { AI_AGENT_RUNTIME_CONFIG_COLLECTION_NAME } from '~/constants/db.constant' +import type { AIAgentRuntimeConfigValue } from './ai-agent.types' + +@modelOptions({ + options: { + customName: AI_AGENT_RUNTIME_CONFIG_COLLECTION_NAME, + allowMixed: Severity.ALLOW, + }, +}) +@index({ key: 1 }, { unique: true }) +export class AIAgentRuntimeConfigModel { + @prop({ required: true, default: 'default' }) + key: string + + @prop({ type: () => [Object], default: [] }) + providers: AIAgentRuntimeConfigValue['providers'] + + @prop({ type: () => Object }) + agentModel?: AIAgentRuntimeConfigValue['agentModel'] + + @prop({ type: () => [String], default: [] }) + enabledTools: AIAgentRuntimeConfigValue['enabledTools'] + + @prop({ type: Date, default: () => new Date() }) + updated?: Date +} diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent-session.model.ts b/apps/core/src/modules/ai/ai-agent/ai-agent-session.model.ts new file mode 100644 index 00000000000..754fdb2b6ee --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent-session.model.ts @@ -0,0 +1,25 @@ +import { modelOptions, prop } from '@typegoose/typegoose' +import { AI_AGENT_SESSION_COLLECTION_NAME } from '~/constants/db.constant' +import { BaseModel } from '~/shared/model/base.model' +import { AIAgentSessionStatus } from './ai-agent.types' + +@modelOptions({ + options: { + customName: AI_AGENT_SESSION_COLLECTION_NAME, + }, +}) +export class AIAgentSessionModel extends BaseModel { + @prop({ required: true, trim: true, default: 'Agent Session' }) + title: string + + @prop({ + required: true, + type: String, + enum: AIAgentSessionStatus, + default: AIAgentSessionStatus.Active, + }) + status: AIAgentSessionStatus + + @prop({ type: Date, default: () => new Date() }) + updated?: Date +} diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent-system-prompt.ts b/apps/core/src/modules/ai/ai-agent/ai-agent-system-prompt.ts new file mode 100644 index 00000000000..7f6eac9056d --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent-system-prompt.ts @@ -0,0 +1,53 @@ +/** + * System prompt for the Mix Space site-owner AI agent. + * Structure and principles follow Claude Code–style system prompts: identity, + * agentic loop, tool use, user-in-the-loop confirmations, safe execution, and tone. + */ + +export const AI_AGENT_SYSTEM_PROMPT_LINES: readonly string[] = [ + // ── Identity ──────────────────────────────────────────────────────────────── + 'You are the site-owner AI agent for Mix Space — a personal blog server built on NestJS, MongoDB, and Redis.', + 'Your role is to help the owner inspect, manage, and operate their site through conversation and tools.', + "You have access to the owner's data and server environment. Treat everything you see as private and confidential.", + + // ── Output and communication ───────────────────────────────────────────────── + 'All text you output is shown to the user in a chat interface that renders markdown. Use markdown for structure when helpful.', + 'Keep responses short and direct. Prefer bullet points or short paragraphs over long prose.', + 'Never use emojis unless the user explicitly asks for them.', + 'When referencing specific records, commands, or results, quote or format them clearly so the user can verify.', + + // ── Agentic loop: gather → act → verify ────────────────────────────────────── + 'Work in three phases: (1) gather context with read/query operations, (2) take action when you have enough information, (3) summarize or verify the result for the user.', + 'Never skip the gather phase. Read or query before modifying, deleting, or running commands that change state.', + 'When multiple independent reads or queries would help, perform them in parallel. When a step depends on the previous result, proceed in order.', + + // ── Tool use ───────────────────────────────────────────────────────────────── + 'Use tools when they are needed to answer or act — not speculatively. Only call a tool when its result will materially affect your response.', + 'Read/query operations can be run directly. Use them first to understand data or server state before proposing any changes.', + 'Write operations and non-whitelisted shell commands require user confirmation and are NOT executed immediately — see below for specifics.', + + // ── User-in-the-loop: confirmations ────────────────────────────────────────── + 'If a tool call returns a pending actionId, the operation has NOT been executed. Inform the user and ask them to confirm or reject in the UI.', + 'Never claim a write or side-effect operation succeeded until you receive the confirmation result with state "confirmed" or "executed".', + 'If the user rejects a confirmation (state "rejected" or "cancelled"), acknowledge it and do not retry the same operation without new instructions.', + 'After a confirmation result arrives, continue the task based on the actual outcome — including errors if the operation failed.', + + // ── Executing actions with care ─────────────────────────────────────────────── + 'Before any destructive action (delete, overwrite, bulk update), always read or query first to show the user exactly what will be affected.', + 'When a task is blocked or fails, do not retry the same action. Investigate the cause, then adjust your approach or ask the user for direction.', + 'Scope your actions to what was actually requested. Do not touch unrelated data, collections, or processes as a side effect.', + 'Prefer targeted, reversible operations over broad ones (e.g. updateOne before updateMany, deleteOne before deleteMany).', + + // ── Doing tasks ────────────────────────────────────────────────────────────── + 'When the request is ambiguous, interpret it in the context of managing a Mix Space site. The site covers the following domains:', + ' • Content — posts, notes, pages, drafts, says (short statuses), recentlies, snippets (code), projects', + ' • Taxonomy — categories (for posts), topics (for notes)', + ' • Community — comments, links (friend links), subscribes (email subscribers)', + ' • Analytics — activities (user events), analyzes (page analytics), readers (reader tracking)', + ' • Configuration — options (site settings), owner_profiles (author info), users/accounts (admin accounts)', + ' • AI-generated — ai_summaries, ai_translations, ai_deep_readings', + ' • Automation — webhooks, webhook_events, serverless functions and their logs', + ' • Infrastructure — server health, Redis state, process info, disk/memory usage', + 'If you need more information to act safely, ask a focused clarifying question rather than proceeding with assumptions.', + 'Avoid over-engineering: only do what was asked or is clearly necessary. Do not add extra steps or changes beyond the scope of the request.', +] diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent.controller.ts b/apps/core/src/modules/ai/ai-agent/ai-agent.controller.ts new file mode 100644 index 00000000000..264bb498a9d --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent.controller.ts @@ -0,0 +1,76 @@ +import { Body, Get, Param, Post, Put, Query } from '@nestjs/common' +import { ApiController } from '~/common/decorators/api-controller.decorator' +import { Auth } from '~/common/decorators/auth.decorator' +import { MongoIdDto } from '~/shared/dto/id.dto' +import { + CreateAIAgentSessionDto, + GetAIAgentMessagesQueryDto, + SendAIAgentMessageDto, + UpsertAIAgentConfigDto, +} from './ai-agent.schema' +import { AIAgentService } from './ai-agent.service' + +@ApiController('ai/agent') +export class AIAgentController { + constructor(private readonly service: AIAgentService) {} + + @Get('/config') + @Auth() + async getConfig() { + return this.service.getRuntimeConfig() + } + + @Put('/config') + @Auth() + async putConfig(@Body() body: UpsertAIAgentConfigDto) { + return this.service.upsertRuntimeConfig(body) + } + + @Post('/sessions') + @Auth() + async createSession(@Body() body: CreateAIAgentSessionDto) { + return this.service.createSession(body.title) + } + + @Get('/sessions') + @Auth() + async getSessions() { + return this.service.listSessions() + } + + @Get('/sessions/:id') + @Auth() + async getSession(@Param() params: MongoIdDto) { + return this.service.getSession(params.id) + } + + @Get('/sessions/:id/messages') + @Auth() + async getSessionMessages( + @Param() params: MongoIdDto, + @Query() query: GetAIAgentMessagesQueryDto, + ) { + return this.service.getSessionMessages(params.id, query.page, query.size) + } + + @Post('/sessions/:id/messages') + @Auth() + async sendMessage( + @Param() params: MongoIdDto, + @Body() body: SendAIAgentMessageDto, + ) { + return this.service.sendMessage(params.id, body) + } + + @Post('/actions/:id/confirm') + @Auth() + async confirmAction(@Param() params: MongoIdDto) { + return this.service.confirmAction(params.id) + } + + @Post('/actions/:id/reject') + @Auth() + async rejectAction(@Param() params: MongoIdDto) { + return this.service.rejectAction(params.id) + } +} diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent.module.ts b/apps/core/src/modules/ai/ai-agent/ai-agent.module.ts new file mode 100644 index 00000000000..100a5cb09d5 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common' +import { AIAgentController } from './ai-agent.controller' +import { AIAgentService } from './ai-agent.service' + +@Module({ + providers: [AIAgentService], + controllers: [AIAgentController], + exports: [AIAgentService], +}) +export class AIAgentModule {} diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent.schema.ts b/apps/core/src/modules/ai/ai-agent/ai-agent.schema.ts new file mode 100644 index 00000000000..3b619c79185 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent.schema.ts @@ -0,0 +1,63 @@ +import { AIProviderType } from '~/modules/ai/ai.types' +import { createZodDto } from 'nestjs-zod' +import { z } from 'zod' +import { BUILTIN_AGENT_TOOL_IDS } from './ai-agent.types' + +const AgentProviderSchema = z.object({ + id: z.string().min(1), + name: z.string().min(1), + type: z.nativeEnum(AIProviderType), + apiKey: z.string().min(1), + endpoint: z.string().url().optional().or(z.literal('')), + defaultModel: z.string().min(1), + enabled: z.boolean(), +}) + +const AgentModelAssignmentSchema = z.object({ + providerId: z.string().min(1).optional(), + model: z.string().min(1).optional(), +}) + +export const UpsertAIAgentConfigSchema = z.object({ + providers: z.array(AgentProviderSchema), + agentModel: AgentModelAssignmentSchema.optional(), + enabledTools: z.array(z.enum(BUILTIN_AGENT_TOOL_IDS)).optional(), +}) + +export class UpsertAIAgentConfigDto extends createZodDto( + UpsertAIAgentConfigSchema, +) {} + +export const CreateAIAgentSessionSchema = z.object({ + title: z.string().min(1).max(120).optional(), +}) + +export class CreateAIAgentSessionDto extends createZodDto( + CreateAIAgentSessionSchema, +) {} + +export const SendAIAgentMessageSchema = z.object({ + content: z.string().trim().min(1).max(20_000), +}) + +export class SendAIAgentMessageDto extends createZodDto( + SendAIAgentMessageSchema, +) {} + +export const GetAIAgentMessagesQuerySchema = z.object({ + page: z.coerce.number().int().positive().default(1), + size: z.coerce.number().int().min(1).max(100).default(50), +}) + +export class GetAIAgentMessagesQueryDto extends createZodDto( + GetAIAgentMessagesQuerySchema, +) {} + +export type UpsertAIAgentConfigInput = z.infer +export type SendAIAgentMessageInput = z.infer +export type CreateAIAgentSessionInput = z.infer< + typeof CreateAIAgentSessionSchema +> +export type GetAIAgentMessagesQueryInput = z.infer< + typeof GetAIAgentMessagesQuerySchema +> diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent.service.ts b/apps/core/src/modules/ai/ai-agent/ai-agent.service.ts new file mode 100644 index 00000000000..58afd65e27b --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent.service.ts @@ -0,0 +1,1079 @@ +import { + Agent, + type AgentMessage, + type AgentTool, +} from '@mariozechner/pi-agent-core' +import type { Model } from '@mariozechner/pi-ai' +import { Injectable, Logger } from '@nestjs/common' +import { BizException } from '~/common/exceptions/biz.exception' +import { BusinessEvents, EventScope } from '~/constants/business-event.constant' +import { ErrorCodeEnum } from '~/constants/error-code.constant' +import { DatabaseService } from '~/processors/database/database.service' +import { EventManagerService } from '~/processors/helper/helper.event.service' +import { InjectModel } from '~/transformers/model.transformer' +import { AIProviderType, type AIProviderConfig } from '../ai.types' +import { AIAgentActionModel } from './ai-agent-action.model' +import { AIAgentMessageModel } from './ai-agent-message.model' +import { AIAgentRuntimeConfigModel } from './ai-agent-runtime-config.model' +import { AIAgentSessionModel } from './ai-agent-session.model' +import { AI_AGENT_SYSTEM_PROMPT_LINES } from './ai-agent-system-prompt' +import type { + SendAIAgentMessageInput, + UpsertAIAgentConfigInput, +} from './ai-agent.schema' +import { + AIAgentActionRiskLevel, + AIAgentActionState, + AIAgentMessageKind, + AIAgentSessionStatus, + getAgentSessionRoom, + type AIAgentRuntimeConfigValue, + type AIAgentToolId, +} from './ai-agent.types' +import { + createConnectorRegistry, + normalizeEnabledToolIds, + resolveEnabledConnectors, +} from './tools/connector-registry' +import { + buildConnectorSystemPrompt, + type AIAgentToolConnector, +} from './tools/connector.types' +import { + createMongoToolConnector, + executeMongoConfirmedAction, + executeMongoTool, + type MongoToolArgs, +} from './tools/connectors/mongodb' +import { + createShellToolConnector, + executeShellConfirmedAction, + executeShellTool, + type ShellToolArgs, +} from './tools/connectors/shell' + +const AGENT_RUNTIME_CONFIG_KEY = 'default' +const MAX_TOOL_OUTPUT_LENGTH = 16_000 + +type AIAgentLoopStart = { mode: 'prompt'; input: string } | { mode: 'continue' } + +@Injectable() +export class AIAgentService { + private readonly logger = new Logger(AIAgentService.name) + private readonly runningSessions = new Map>() + + constructor( + @InjectModel(AIAgentRuntimeConfigModel) + private readonly runtimeConfigModel: MongooseModel, + @InjectModel(AIAgentSessionModel) + private readonly sessionModel: MongooseModel, + @InjectModel(AIAgentMessageModel) + private readonly messageModel: MongooseModel, + @InjectModel(AIAgentActionModel) + private readonly actionModel: MongooseModel, + private readonly databaseService: DatabaseService, + private readonly eventManager: EventManagerService, + ) {} + + async getRuntimeConfig(): Promise { + const connectorRegistry = this.buildConnectorRegistry() + const doc = await this.runtimeConfigModel + .findOne({ key: AGENT_RUNTIME_CONFIG_KEY }) + .lean() + + if (!doc) { + return { + providers: [], + enabledTools: normalizeEnabledToolIds(undefined, connectorRegistry), + } + } + + return { + providers: (doc.providers || []) as AIProviderConfig[], + agentModel: doc.agentModel, + enabledTools: normalizeEnabledToolIds( + doc.enabledTools as string[] | undefined, + connectorRegistry, + ), + } + } + + async upsertRuntimeConfig(input: UpsertAIAgentConfigInput) { + const connectorRegistry = this.buildConnectorRegistry() + const providers = input.providers.map((provider) => ({ + ...provider, + apiKey: provider.apiKey.trim(), + endpoint: provider.endpoint?.trim() || undefined, + })) + const enabledTools = normalizeEnabledToolIds( + input.enabledTools as string[] | undefined, + connectorRegistry, + ) + + const doc = await this.runtimeConfigModel.findOneAndUpdate( + { key: AGENT_RUNTIME_CONFIG_KEY }, + { + $set: { + key: AGENT_RUNTIME_CONFIG_KEY, + providers, + agentModel: input.agentModel, + enabledTools, + updated: new Date(), + }, + }, + { + upsert: true, + new: true, + }, + ) + + return { + providers: (doc.providers || []) as AIProviderConfig[], + agentModel: doc.agentModel, + enabledTools: normalizeEnabledToolIds( + doc.enabledTools as string[] | undefined, + connectorRegistry, + ), + } + } + + async createSession(title?: string) { + const session = await this.sessionModel.create({ + title: title?.trim() || 'Agent Session', + status: AIAgentSessionStatus.Active, + updated: new Date(), + }) + + return session + } + + async listSessions() { + return this.sessionModel.find().sort({ updated: -1, created: -1 }).lean() + } + + async getSession(sessionId: string) { + const session = await this.sessionModel.findById(sessionId).lean() + if (!session) { + throw new BizException( + ErrorCodeEnum.ResourceNotFound, + 'Session not found', + ) + } + + const pendingActions = await this.actionModel + .find({ + sessionId, + state: AIAgentActionState.Pending, + }) + .sort({ created: -1 }) + .lean() + + return { + session, + pendingActions, + running: this.runningSessions.has(sessionId), + } + } + + async getSessionMessages(sessionId: string, page = 1, size = 50) { + await this.assertSessionExists(sessionId) + + const skip = (page - 1) * size + + const [total, data] = await Promise.all([ + this.messageModel.countDocuments({ sessionId }), + this.messageModel + .find({ sessionId }) + .sort({ seq: 1 }) + .skip(skip) + .limit(size) + .lean(), + ]) + + return { + data, + total, + page, + size, + hasMore: page * size < total, + } + } + + async sendMessage(sessionId: string, body: SendAIAgentMessageInput) { + await this.assertSessionExists(sessionId) + + const pendingActionCount = await this.actionModel.countDocuments({ + sessionId, + state: AIAgentActionState.Pending, + }) + + if (pendingActionCount > 0) { + throw new BizException( + ErrorCodeEnum.InvalidParameter, + 'Pending confirmation actions exist. Confirm or reject them first.', + ) + } + + const started = this.startAgentLoop(sessionId, { + mode: 'prompt', + input: body.content, + }) + + if (!started) { + throw new BizException( + ErrorCodeEnum.AIProcessing, + 'Agent is already running for this session', + ) + } + + return { + accepted: true, + running: true, + } + } + + async confirmAction(actionId: string) { + const action = await this.actionModel.findById(actionId) + if (!action) { + throw new BizException(ErrorCodeEnum.ResourceNotFound, 'Action not found') + } + + if (action.state !== AIAgentActionState.Pending) { + throw new BizException( + ErrorCodeEnum.InvalidParameter, + `Action is not pending: ${action.state}`, + ) + } + + action.state = AIAgentActionState.Confirmed + action.updated = new Date() + await action.save() + + let result: Record + let errorMessage: string | undefined + + try { + result = await this.executeConfirmedAction(action) + action.state = AIAgentActionState.Executed + action.result = result + } catch (error) { + errorMessage = (error as Error)?.message || 'Unknown execution error' + action.state = AIAgentActionState.Cancelled + action.error = errorMessage + action.result = { + error: errorMessage, + } + } + + action.updated = new Date() + await action.save() + + const seq = { value: await this.getNextSeq(action.sessionId) } + const confirmContent = { + actionId: action.id, + state: action.state, + toolName: action.toolName, + result: action.result, + error: action.error, + } + + await this.createMessage( + action.sessionId, + seq, + 'system', + AIAgentMessageKind.ConfirmResult, + confirmContent, + ) + + await this.createAgentMessage( + action.sessionId, + seq, + this.createActionResolutionMessage(action), + AIAgentMessageKind.ConfirmResult, + ) + + await this.emitToSession( + action.sessionId, + BusinessEvents.AI_AGENT_CONFIRM_RESULT, + confirmContent, + ) + + await this.maybeResumeAfterConfirmations(action.sessionId) + + return { + success: !errorMessage, + action, + } + } + + async rejectAction(actionId: string) { + const action = await this.actionModel.findById(actionId) + if (!action) { + throw new BizException(ErrorCodeEnum.ResourceNotFound, 'Action not found') + } + + if (action.state !== AIAgentActionState.Pending) { + throw new BizException( + ErrorCodeEnum.InvalidParameter, + `Action is not pending: ${action.state}`, + ) + } + + action.state = AIAgentActionState.Rejected + action.updated = new Date() + await action.save() + + const seq = { value: await this.getNextSeq(action.sessionId) } + const rejectContent = { + actionId: action.id, + state: action.state, + toolName: action.toolName, + } + + await this.createMessage( + action.sessionId, + seq, + 'system', + AIAgentMessageKind.ConfirmResult, + rejectContent, + ) + + await this.createAgentMessage( + action.sessionId, + seq, + this.createActionResolutionMessage(action), + AIAgentMessageKind.ConfirmResult, + ) + + await this.emitToSession( + action.sessionId, + BusinessEvents.AI_AGENT_CONFIRM_RESULT, + rejectContent, + ) + + await this.maybeResumeAfterConfirmations(action.sessionId) + + return { + success: true, + action, + } + } + + private startAgentLoop(sessionId: string, start: AIAgentLoopStart) { + if (this.runningSessions.has(sessionId)) { + return false + } + + const task = this.runAgentLoop(sessionId, start) + .catch((error) => { + this.logger.error( + `runAgentLoop failed: mode=${start.mode} session=${sessionId} error=${error?.message || error}`, + error?.stack, + ) + }) + .finally(() => { + this.runningSessions.delete(sessionId) + }) + + this.runningSessions.set(sessionId, task) + return true + } + + private async maybeResumeAfterConfirmations(sessionId: string) { + const pendingActionCount = await this.actionModel.countDocuments({ + sessionId, + state: AIAgentActionState.Pending, + }) + if (pendingActionCount > 0) { + return + } + + this.startAgentLoop(sessionId, { mode: 'continue' }) + } + + private async runAgentLoop(sessionId: string, start: AIAgentLoopStart) { + const historyMessages = await this.loadAgentMessagesForLoop(sessionId) + const runtime = await this.getRuntimeConfig() + const { model, selectedProvider } = this.resolvePiModel(runtime) + const enabledConnectors = this.resolveEnabledConnectors( + runtime.enabledTools, + ) + const apiKeyResolver = this.createApiKeyResolver(runtime.providers) + + const seq = { + value: await this.getNextSeq(sessionId), + } + + let promptMessage: AgentMessage | null = null + if (start.mode === 'prompt') { + promptMessage = this.createUserMessage(start.input) + await this.createAgentMessage( + sessionId, + seq, + promptMessage, + AIAgentMessageKind.User, + ) + } + + await this.sessionModel.updateOne( + { _id: sessionId }, + { + $set: { updated: new Date() }, + }, + ) + + await this.emitToSession(sessionId, BusinessEvents.AI_AGENT_SESSION_STATE, { + sessionId, + state: 'running', + }) + + const agent = new Agent({ + initialState: { + systemPrompt: this.buildSystemPrompt(enabledConnectors), + model, + messages: historyMessages, + tools: this.buildAgentTools(enabledConnectors, sessionId, seq), + }, + getApiKey: (providerName) => { + return apiKeyResolver(providerName) || selectedProvider.apiKey + }, + transport: 'websocket', + maxRetryDelayMs: 60_000, + }) + + let persistQueue = Promise.resolve() + let hasPersistedAssistantOrToolMessage = false + let isPausedForConfirmation = false + + const unsubscribe = agent.subscribe((event) => { + // Pause the current loop as soon as a tool reports pending confirmation. + if ( + this.isPendingConfirmationToolEvent(event) && + !isPausedForConfirmation + ) { + isPausedForConfirmation = true + agent.abort() + } + + persistQueue = persistQueue.then(async () => { + switch (event.type) { + case 'message_update': { + if (event.assistantMessageEvent.type === 'text_delta') { + await this.emitToSession( + sessionId, + BusinessEvents.AI_AGENT_MESSAGE, + { + sessionId, + kind: 'assistant_delta', + delta: event.assistantMessageEvent.delta, + }, + ) + } + break + } + + case 'message_end': { + if ( + event.message.role === 'assistant' || + event.message.role === 'toolResult' + ) { + if ( + isPausedForConfirmation && + event.message.role === 'assistant' && + this.isAbortAssistantMessage(event.message) + ) { + break + } + + hasPersistedAssistantOrToolMessage = true + const kind = + event.message.role === 'assistant' + ? AIAgentMessageKind.Assistant + : AIAgentMessageKind.ToolResult + await this.createAgentMessage(sessionId, seq, event.message, kind) + } + break + } + + case 'agent_end': { + // If provider initialization failed before message streaming starts + // (e.g. missing api key), pi-agent may emit only agent_end with an + // assistant error message. Persist it so UI can render the failure. + if (hasPersistedAssistantOrToolMessage) { + break + } + + const lastMessage = event.messages.at(-1) + if ( + lastMessage?.role === 'assistant' && + !( + isPausedForConfirmation && + this.isAbortAssistantMessage(lastMessage) + ) + ) { + await this.createAgentMessage( + sessionId, + seq, + lastMessage, + AIAgentMessageKind.Assistant, + ) + hasPersistedAssistantOrToolMessage = true + } + break + } + + case 'tool_execution_start': + case 'tool_execution_update': + case 'tool_execution_end': { + await this.emitToSession( + sessionId, + BusinessEvents.AI_AGENT_TOOL_EVENT, + { + sessionId, + event, + }, + ) + break + } + } + }) + }) + + try { + if (start.mode === 'prompt') { + await agent.prompt(promptMessage as AgentMessage) + } else { + await agent.continue() + } + await persistQueue + } finally { + unsubscribe() + await this.emitToSession( + sessionId, + BusinessEvents.AI_AGENT_SESSION_STATE, + { + sessionId, + state: 'idle', + }, + ) + } + } + + private buildConnectorRegistry() { + return createConnectorRegistry([ + createMongoToolConnector((id, seq, params) => { + return this.handleMongoToolExecution(id, seq, params) + }), + createShellToolConnector((id, seq, params) => { + return this.handleShellToolExecution(id, seq, params) + }), + ]) + } + + private resolveEnabledConnectors(enabledTools: readonly AIAgentToolId[]) { + const registry = this.buildConnectorRegistry() + const normalized = normalizeEnabledToolIds(enabledTools, registry) + return resolveEnabledConnectors(normalized, registry) + } + + private buildAgentTools( + connectors: AIAgentToolConnector[], + sessionId: string, + seq: { value: number }, + ): AgentTool[] { + return connectors.map((connector) => { + return connector.createTool({ + sessionId, + seq, + }) + }) + } + + private async handleMongoToolExecution( + sessionId: string, + seq: { value: number }, + params: MongoToolArgs, + ) { + return executeMongoTool({ + db: this.databaseService.db, + sessionId, + seq, + params, + safeJson: (input) => this.safeJson(input), + createPendingAction: (id, currentSeq, toolName, args, dryRunPreview) => { + return this.createPendingAction( + id, + currentSeq, + toolName, + args, + dryRunPreview, + ) + }, + }) + } + + private async handleShellToolExecution( + sessionId: string, + seq: { value: number }, + params: ShellToolArgs, + ) { + return executeShellTool({ + sessionId, + seq, + params, + safeJson: (input) => this.safeJson(input), + createPendingAction: (id, currentSeq, toolName, args, dryRunPreview) => { + return this.createPendingAction( + id, + currentSeq, + toolName, + args, + dryRunPreview, + ) + }, + }) + } + + private async createPendingAction( + sessionId: string, + seq: { value: number }, + toolName: string, + args: Record, + dryRunPreview: Record, + ) { + const action = await this.actionModel.create({ + sessionId, + toolName, + arguments: args, + riskLevel: AIAgentActionRiskLevel.Dangerous, + state: AIAgentActionState.Pending, + dryRunPreview, + updated: new Date(), + }) + + const payload = { + actionId: action.id, + toolName, + args, + dryRunPreview, + state: AIAgentActionState.Pending, + } + + await this.createMessage( + sessionId, + seq, + 'system', + AIAgentMessageKind.ConfirmRequest, + payload, + ) + + await this.emitToSession( + sessionId, + BusinessEvents.AI_AGENT_CONFIRM_REQUEST, + payload, + ) + + return action + } + + private async executeConfirmedAction(action: AIAgentActionModel) { + if (action.toolName === 'mongodb') { + return executeMongoConfirmedAction( + this.databaseService.db, + action.arguments, + ) + } + + if (action.toolName === 'shell') { + return executeShellConfirmedAction(action.arguments) + } + + throw new Error(`Unsupported action tool: ${action.toolName}`) + } + + private async assertSessionExists(sessionId: string) { + const session = await this.sessionModel.findById(sessionId).lean() + if (!session) { + throw new BizException( + ErrorCodeEnum.ResourceNotFound, + 'Session not found', + ) + } + } + + private async loadAgentMessagesForLoop(sessionId: string) { + const docs = await this.messageModel + .find({ sessionId }) + .sort({ seq: 1 }) + .lean() + + const messages: AgentMessage[] = [] + for (const doc of docs) { + const message = (doc.content as any)?.message + if (!message || typeof message !== 'object') { + continue + } + if ( + message.role === 'user' || + message.role === 'assistant' || + message.role === 'toolResult' + ) { + messages.push(message as AgentMessage) + } + } + + return messages + } + + private createUserMessage(content: string): AgentMessage { + return { + role: 'user', + content: [ + { + type: 'text', + text: content, + }, + ], + timestamp: Date.now(), + } + } + + private async createAgentMessage( + sessionId: string, + seq: { value: number }, + message: AgentMessage, + kind: AIAgentMessageKind, + ) { + const role = (message as any).role as + | 'user' + | 'assistant' + | 'toolResult' + | 'system' + + await this.createMessage(sessionId, seq, role, kind, { + message, + }) + } + + private async createMessage( + sessionId: string, + seq: { value: number }, + role: 'user' | 'assistant' | 'toolResult' | 'system', + kind: AIAgentMessageKind, + content: Record, + ) { + const message = await this.messageModel.create({ + sessionId, + seq: seq.value, + role, + kind, + content, + }) + + seq.value += 1 + + await this.emitToSession(sessionId, BusinessEvents.AI_AGENT_MESSAGE, { + sessionId, + message, + }) + + return message + } + + private async getNextSeq(sessionId: string) { + const doc = await this.messageModel + .findOne({ sessionId }) + .sort({ seq: -1 }) + .select('seq') + .lean() + + return (doc?.seq || 0) + 1 + } + + private resolvePiModel(config: AIAgentRuntimeConfigValue): { + model: Model + selectedProvider: AIProviderConfig + } { + const enabledProviders = (config.providers || []).filter((provider) => { + return provider.enabled && provider.apiKey?.trim() + }) + + if (!enabledProviders.length) { + throw new BizException( + ErrorCodeEnum.AINotEnabled, + 'No enabled provider with API key configured for AI agent', + ) + } + + let selectedProvider: AIProviderConfig | undefined + if (config.agentModel?.providerId) { + selectedProvider = enabledProviders.find( + (provider) => provider.id === config.agentModel!.providerId, + ) + } + + selectedProvider ||= enabledProviders[0] + + const selectedModel = + config.agentModel?.model?.trim() || selectedProvider.defaultModel + + const baseCost = { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + } + + switch (selectedProvider.type) { + case AIProviderType.Anthropic: { + return { + model: { + id: selectedModel, + name: selectedModel, + api: 'anthropic-messages', + provider: 'anthropic', + baseUrl: + this.normalizeEndpoint(selectedProvider.endpoint) || + 'https://api.anthropic.com/v1', + reasoning: true, + input: ['text', 'image'], + cost: baseCost, + contextWindow: 200_000, + maxTokens: 8_192, + }, + selectedProvider, + } + } + + case AIProviderType.OpenRouter: { + return { + model: { + id: selectedModel, + name: selectedModel, + api: 'openai-completions', + provider: 'openrouter', + baseUrl: + this.normalizeEndpoint(selectedProvider.endpoint) || + 'https://openrouter.ai/api/v1', + reasoning: true, + input: ['text', 'image'], + cost: baseCost, + contextWindow: 128_000, + maxTokens: 16_384, + }, + selectedProvider, + } + } + + case AIProviderType.OpenAICompatible: { + const endpoint = this.normalizeEndpoint(selectedProvider.endpoint) + if (!endpoint) { + throw new BizException( + ErrorCodeEnum.InvalidParameter, + `Endpoint is required for provider: ${selectedProvider.id}`, + ) + } + return { + model: { + id: selectedModel, + name: selectedModel, + api: 'openai-completions', + provider: selectedProvider.id, + baseUrl: endpoint, + reasoning: true, + input: ['text', 'image'], + cost: baseCost, + contextWindow: 128_000, + maxTokens: 16_384, + }, + selectedProvider, + } + } + + case AIProviderType.OpenAI: + default: { + return { + model: { + id: selectedModel, + name: selectedModel, + api: 'openai-completions', + provider: 'openai', + baseUrl: + this.normalizeEndpoint(selectedProvider.endpoint) || + 'https://api.openai.com/v1', + reasoning: true, + input: ['text', 'image'], + cost: baseCost, + contextWindow: 128_000, + maxTokens: 16_384, + }, + selectedProvider, + } + } + } + } + + private createApiKeyResolver(providers: AIProviderConfig[]) { + const enabledProviders = (providers || []) + .filter((provider) => provider.enabled && provider.apiKey?.trim()) + .map((provider) => ({ + ...provider, + apiKey: provider.apiKey.trim(), + })) + + const keyByProviderId = new Map( + enabledProviders.map((provider) => [provider.id, provider.apiKey]), + ) + const keyByProviderType = new Map() + + for (const provider of enabledProviders) { + if (!keyByProviderType.has(provider.type)) { + keyByProviderType.set(provider.type, provider.apiKey) + } + } + + return (providerName: string) => { + if (!providerName) { + return undefined + } + + if (keyByProviderId.has(providerName)) { + return keyByProviderId.get(providerName) + } + + switch (providerName) { + case 'openrouter': { + return keyByProviderType.get(AIProviderType.OpenRouter) + } + case 'anthropic': { + return keyByProviderType.get(AIProviderType.Anthropic) + } + case 'openai': { + return ( + keyByProviderType.get(AIProviderType.OpenAI) || + keyByProviderType.get(AIProviderType.OpenAICompatible) + ) + } + default: { + return undefined + } + } + } + } + + private normalizeEndpoint(endpoint?: string) { + if (!endpoint) { + return undefined + } + + let normalized = endpoint.trim().replace(/\/+$/, '') + if (!normalized.endsWith('/v1')) { + normalized = `${normalized}/v1` + } + return normalized + } + + private buildSystemPrompt(connectors: AIAgentToolConnector[]) { + const basePrompt = [...AI_AGENT_SYSTEM_PROMPT_LINES] + + if (connectors.length === 0) { + return [ + ...basePrompt, + 'No tools are currently enabled for this session. Explain limitation and ask user to enable tools in admin config if needed.', + ].join('\n') + } + + const connectorPrompt = connectors + .map(buildConnectorSystemPrompt) + .join('\n\n') + + return [ + ...basePrompt, + '', + '', + connectorPrompt, + '', + ].join('\n') + } + + private safeJson(input: unknown) { + try { + const json = JSON.stringify(input, null, 2) + if (!json) { + return '' + } + if (json.length <= MAX_TOOL_OUTPUT_LENGTH) { + return json + } + return `${json.slice(0, MAX_TOOL_OUTPUT_LENGTH)}\n...` + } catch { + return String(input) + } + } + + private createActionResolutionMessage( + action: AIAgentActionModel, + ): AgentMessage { + const summary = { + actionId: action.id, + toolName: action.toolName, + state: action.state, + result: action.result, + error: action.error, + } + + return this.createUserMessage( + [ + 'Tool confirmation resolved. Continue the previous task with this outcome:', + this.safeJson(summary), + ].join('\n'), + ) + } + + private isPendingConfirmationToolEvent(event: unknown) { + if (!event || typeof event !== 'object') { + return false + } + if ((event as any).type !== 'tool_execution_end') { + return false + } + + const details = (event as any).result?.details + return Boolean( + details && + typeof details === 'object' && + (details as Record).pendingConfirmation === true, + ) + } + + private isAbortAssistantMessage(message: AgentMessage) { + if (message.role !== 'assistant') { + return false + } + + const stopReason = (message as any).stopReason + if (stopReason !== 'aborted') { + return false + } + + const errorMessage = (message as any).errorMessage + if (typeof errorMessage !== 'string') { + return true + } + + return /aborted/i.test(errorMessage) + } + + private async emitToSession( + sessionId: string, + event: BusinessEvents, + payload: Record, + ) { + await this.eventManager.emit(event, payload, { + scope: EventScope.TO_ADMIN, + gateway: { + rooms: [getAgentSessionRoom(sessionId)], + }, + }) + } +} diff --git a/apps/core/src/modules/ai/ai-agent/ai-agent.types.ts b/apps/core/src/modules/ai/ai-agent/ai-agent.types.ts new file mode 100644 index 00000000000..28914cd37c2 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/ai-agent.types.ts @@ -0,0 +1,50 @@ +import type { AIModelAssignment, AIProviderConfig } from '../ai.types' + +export const AGENT_SESSION_ROOM_PREFIX = 'session:' +export const BUILTIN_AGENT_TOOL_IDS = ['mongodb', 'shell'] as const +export type AIAgentToolId = (typeof BUILTIN_AGENT_TOOL_IDS)[number] + +export function getAgentSessionRoom(sessionId: string) { + return `${AGENT_SESSION_ROOM_PREFIX}${sessionId}` +} + +export interface AIAgentRuntimeConfigValue { + providers: AIProviderConfig[] + agentModel?: AIModelAssignment + enabledTools: AIAgentToolId[] +} + +export enum AIAgentSessionStatus { + Active = 'active', + Closed = 'closed', +} + +export enum AIAgentMessageKind { + User = 'user', + Assistant = 'assistant', + ToolResult = 'tool_result', + ConfirmRequest = 'confirm_request', + ConfirmResult = 'confirm_result', +} + +export enum AIAgentActionRiskLevel { + Safe = 'safe', + Dangerous = 'dangerous', +} + +export enum AIAgentActionState { + Pending = 'pending', + Confirmed = 'confirmed', + Rejected = 'rejected', + Executed = 'executed', + Cancelled = 'cancelled', +} + +export interface AIAgentToolActionArgument { + [key: string]: unknown +} + +export interface AIAgentToolResult { + content: Array<{ type: 'text'; text: string }> + details: Record +} diff --git a/apps/core/src/modules/ai/ai-agent/index.ts b/apps/core/src/modules/ai/ai-agent/index.ts new file mode 100644 index 00000000000..cb40f59e2f7 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/index.ts @@ -0,0 +1,4 @@ +export * from './ai-agent.module' +export * from './ai-agent.schema' +export * from './ai-agent.service' +export * from './ai-agent.types' diff --git a/apps/core/src/modules/ai/ai-agent/tools/connector-registry.ts b/apps/core/src/modules/ai/ai-agent/tools/connector-registry.ts new file mode 100644 index 00000000000..37b99fbd7a1 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connector-registry.ts @@ -0,0 +1,45 @@ +import { BUILTIN_AGENT_TOOL_IDS, type AIAgentToolId } from '../ai-agent.types' +import type { AIAgentToolConnector } from './connector.types' + +export function createConnectorRegistry(connectors: AIAgentToolConnector[]) { + const registry = new Map() + + for (const connector of connectors) { + registry.set(connector.manifest.id, connector) + } + + return registry +} + +export function normalizeEnabledToolIds( + enabledTools: readonly string[] | null | undefined, + registry: Map, +) { + if (!Array.isArray(enabledTools)) { + return Array.from(registry.values()) + .filter((connector) => connector.manifest.defaultEnabled) + .map((connector) => connector.manifest.id) + } + + const normalized = Array.from( + new Set( + enabledTools.filter((id): id is AIAgentToolId => { + const toolId = id as AIAgentToolId + return BUILTIN_AGENT_TOOL_IDS.includes(toolId) && registry.has(toolId) + }), + ), + ) + + return normalized +} + +export function resolveEnabledConnectors( + enabledTools: readonly AIAgentToolId[], + registry: Map, +) { + return enabledTools + .map((toolId) => registry.get(toolId)) + .filter((connector): connector is AIAgentToolConnector => + Boolean(connector), + ) +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connector.types.ts b/apps/core/src/modules/ai/ai-agent/tools/connector.types.ts new file mode 100644 index 00000000000..9573f27aa3f --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connector.types.ts @@ -0,0 +1,50 @@ +import type { AgentTool } from '@mariozechner/pi-agent-core' +import type { AIAgentToolId } from '../ai-agent.types' + +export interface AIAgentToolManifest { + id: AIAgentToolId + name: string + label: string + description: string + defaultEnabled: boolean +} + +export interface AIAgentToolSystemPrompt { + purpose: string + whenToUse: string[] + usageRules: string[] +} + +export interface AIAgentToolConnectorContext { + sessionId: string + seq: { value: number } +} + +export interface AIAgentToolConnector { + manifest: AIAgentToolManifest + systemPrompt: AIAgentToolSystemPrompt + createTool: (context: AIAgentToolConnectorContext) => AgentTool +} + +export function buildConnectorSystemPrompt(connector: AIAgentToolConnector) { + const lines = [ + `Tool: ${connector.manifest.name}`, + `Purpose: ${connector.systemPrompt.purpose}`, + ] + + if (connector.systemPrompt.whenToUse.length > 0) { + lines.push('When to use:') + for (const item of connector.systemPrompt.whenToUse) { + lines.push(`- ${item}`) + } + } + + if (connector.systemPrompt.usageRules.length > 0) { + lines.push('Usage rules:') + for (const item of connector.systemPrompt.usageRules) { + lines.push(`- ${item}`) + } + } + + return lines.join('\n') +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/executor.ts b/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/executor.ts new file mode 100644 index 00000000000..a065d14565f --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/executor.ts @@ -0,0 +1,387 @@ +import { Type, type Static } from '@mariozechner/pi-ai' +import type { Db, Filter } from 'mongodb' +import type { AIAgentToolResult } from '../../../ai-agent.types' + +export const MONGO_TOOL_OPERATIONS = [ + 'find', + 'findOne', + 'countDocuments', + 'distinct', + 'aggregate', + 'insertOne', + 'insertMany', + 'updateOne', + 'updateMany', + 'replaceOne', + 'deleteOne', + 'deleteMany', + 'findOneAndUpdate', + 'findOneAndReplace', + 'findOneAndDelete', + 'bulkWrite', +] as const + +export const MongoToolParameters = Type.Object({ + collection: Type.String({ minLength: 1 }), + operation: Type.String({ + enum: [...MONGO_TOOL_OPERATIONS], + }), + filter: Type.Optional(Type.Object({}, { additionalProperties: true })), + update: Type.Optional(Type.Object({}, { additionalProperties: true })), + document: Type.Optional(Type.Object({}, { additionalProperties: true })), + documents: Type.Optional( + Type.Array(Type.Object({}, { additionalProperties: true })), + ), + options: Type.Optional(Type.Object({}, { additionalProperties: true })), + pipeline: Type.Optional( + Type.Array(Type.Object({}, { additionalProperties: true })), + ), + field: Type.Optional(Type.String()), +}) + +export type MongoToolArgs = Static + +const MONGO_WRITE_OPERATIONS = new Set([ + 'insertone', + 'insertmany', + 'updateone', + 'updatemany', + 'replaceone', + 'deleteone', + 'deletemany', + 'findoneandupdate', + 'findoneandreplace', + 'findoneanddelete', + 'bulkwrite', +]) + +const MONGO_READ_OPERATIONS = new Set([ + 'find', + 'findone', + 'countdocuments', + 'distinct', + 'aggregate', +]) + +export function normalizeMongoOperation(operation: string) { + return operation.trim().toLowerCase() +} + +export function isMongoWriteOperation(operation: string) { + return MONGO_WRITE_OPERATIONS.has(operation.toLowerCase()) +} + +export function isMongoReadOperation(operation: string) { + return MONGO_READ_OPERATIONS.has(operation.toLowerCase()) +} + +interface ExecuteMongoToolContext { + db: Db + sessionId: string + seq: { value: number } + params: MongoToolArgs + safeJson: (input: unknown) => string + createPendingAction: ( + sessionId: string, + seq: { value: number }, + toolName: string, + args: Record, + dryRunPreview: Record, + ) => Promise<{ id: string }> +} + +export async function executeMongoTool( + context: ExecuteMongoToolContext, +): Promise { + const operation = normalizeMongoOperation(context.params.operation) + + if (isMongoReadOperation(operation)) { + const result = await executeMongoReadOperation(context.db, context.params) + return { + content: [ + { + type: 'text' as const, + text: context.safeJson(result), + }, + ], + details: { + collection: context.params.collection, + operation: context.params.operation, + result, + }, + } + } + + if (isMongoWriteOperation(operation)) { + const dryRunPreview = await buildMongoDryRunPreview( + context.db, + context.params, + ) + const action = await context.createPendingAction( + context.sessionId, + context.seq, + 'mongodb', + { + ...context.params, + operation, + }, + dryRunPreview, + ) + + return { + content: [ + { + type: 'text' as const, + text: `MongoDB write requires confirmation. actionId=${action.id}`, + }, + ], + details: { + pendingConfirmation: true, + actionId: action.id, + dryRunPreview, + }, + } + } + + throw new Error(`Unsupported MongoDB operation: ${context.params.operation}`) +} + +export async function executeMongoConfirmedAction( + db: Db, + params: Record, +) { + const args = params as unknown as MongoToolArgs + const collection = db.collection(args.collection) + const operation = normalizeMongoOperation(args.operation) + + switch (operation) { + case 'insertone': { + const result = await collection.insertOne((args.document || {}) as any, { + ...args.options, + }) + return { + acknowledged: result.acknowledged, + insertedId: result.insertedId, + } + } + case 'insertmany': { + const result = await collection.insertMany( + (args.documents || []) as any[], + { + ...args.options, + }, + ) + return { + acknowledged: result.acknowledged, + insertedCount: result.insertedCount, + insertedIds: result.insertedIds, + } + } + case 'updateone': { + const result = await collection.updateOne( + (args.filter || {}) as Filter, + (args.update || {}) as any, + args.options || {}, + ) + return { + acknowledged: result.acknowledged, + matchedCount: result.matchedCount, + modifiedCount: result.modifiedCount, + upsertedId: result.upsertedId, + } + } + case 'updatemany': { + const result = await collection.updateMany( + (args.filter || {}) as Filter, + (args.update || {}) as any, + args.options || {}, + ) + return { + acknowledged: result.acknowledged, + matchedCount: result.matchedCount, + modifiedCount: result.modifiedCount, + upsertedId: result.upsertedId, + } + } + case 'replaceone': { + const result = await collection.replaceOne( + (args.filter || {}) as Filter, + (args.document || {}) as any, + args.options || {}, + ) + return { + acknowledged: result.acknowledged, + matchedCount: result.matchedCount, + modifiedCount: result.modifiedCount, + upsertedId: result.upsertedId, + } + } + case 'deleteone': { + const result = await collection.deleteOne( + (args.filter || {}) as Filter, + args.options || {}, + ) + return { + acknowledged: result.acknowledged, + deletedCount: result.deletedCount, + } + } + case 'deletemany': { + const result = await collection.deleteMany( + (args.filter || {}) as Filter, + args.options || {}, + ) + return { + acknowledged: result.acknowledged, + deletedCount: result.deletedCount, + } + } + case 'findoneandupdate': { + const result = await collection.findOneAndUpdate( + (args.filter || {}) as Filter, + (args.update || {}) as any, + args.options || {}, + ) + return { + data: result, + } + } + case 'findoneandreplace': { + const result = await collection.findOneAndReplace( + (args.filter || {}) as Filter, + (args.document || {}) as any, + args.options || {}, + ) + return { + data: result, + } + } + case 'findoneanddelete': { + const result = await collection.findOneAndDelete( + (args.filter || {}) as Filter, + args.options || {}, + ) + return { + data: result, + } + } + case 'bulkwrite': { + const operations = (args.options as any)?.operations + if (!Array.isArray(operations)) { + throw new Error('bulkWrite requires options.operations array') + } + const result = await collection.bulkWrite(operations) + return { + acknowledged: result.isOk(), + insertedCount: result.insertedCount, + matchedCount: result.matchedCount, + modifiedCount: result.modifiedCount, + deletedCount: result.deletedCount, + upsertedCount: result.upsertedCount, + } + } + default: { + throw new Error(`Unsupported MongoDB write operation: ${args.operation}`) + } + } +} + +async function executeMongoReadOperation(db: Db, params: MongoToolArgs) { + const collection = db.collection(params.collection) + const operation = normalizeMongoOperation(params.operation) + + switch (operation) { + case 'find': { + const data = await collection + .find((params.filter || {}) as Filter, params.options || {}) + .limit(Math.min(Number((params.options as any)?.limit || 20), 100)) + .toArray() + return { data } + } + case 'findone': { + const data = await collection.findOne( + (params.filter || {}) as Filter, + params.options || {}, + ) + return { data } + } + case 'countdocuments': { + const count = await collection.countDocuments( + (params.filter || {}) as Filter, + params.options || {}, + ) + return { count } + } + case 'distinct': { + if (!params.field) { + throw new Error('field is required for distinct') + } + const data = await collection.distinct( + params.field, + (params.filter || {}) as Filter, + params.options || {}, + ) + return { data } + } + case 'aggregate': { + const data = await collection + .aggregate(params.pipeline || [], params.options || {}) + .limit(Math.min(Number((params.options as any)?.limit || 20), 100)) + .toArray() + return { data } + } + default: { + throw new Error(`Unsupported MongoDB read operation: ${params.operation}`) + } + } +} + +async function buildMongoDryRunPreview(db: Db, params: MongoToolArgs) { + const collection = db.collection(params.collection) + const operation = normalizeMongoOperation(params.operation) + + const preview: Record = { + collection: params.collection, + operation: params.operation, + filter: params.filter || {}, + update: params.update, + options: params.options, + } + + if ( + operation === 'updateone' || + operation === 'updatemany' || + operation === 'deleteone' || + operation === 'deletemany' || + operation === 'replaceone' || + operation === 'findoneandupdate' || + operation === 'findoneandreplace' || + operation === 'findoneanddelete' + ) { + preview.estimatedMatchedCount = await collection.countDocuments( + (params.filter || {}) as Filter, + ) + } + + if (operation === 'insertone') { + preview.estimatedInsertCount = params.document ? 1 : 0 + preview.document = params.document + } + + if (operation === 'insertmany') { + preview.estimatedInsertCount = params.documents?.length || 0 + preview.documentsSample = (params.documents || []).slice(0, 3) + } + + if (operation === 'bulkwrite') { + const operations = (params.options as any)?.operations + preview.bulkOperationCount = Array.isArray(operations) + ? operations.length + : undefined + preview.operationsSample = Array.isArray(operations) + ? operations.slice(0, 3) + : undefined + } + + return preview +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/index.ts b/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/index.ts new file mode 100644 index 00000000000..0df569d6fe5 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/index.ts @@ -0,0 +1,50 @@ +import type { AgentTool } from '@mariozechner/pi-agent-core' +import type { AIAgentToolResult } from '../../../ai-agent.types' +import type { + AIAgentToolConnector, + AIAgentToolConnectorContext, +} from '../../connector.types' +import { + executeMongoConfirmedAction, + executeMongoTool, + MongoToolParameters, + type MongoToolArgs, +} from './executor' +import { mongoToolManifest } from './manifest' +import { mongoToolSystemPrompt } from './system-prompt' + +type ExecuteMongoTool = ( + sessionId: string, + seq: { value: number }, + params: MongoToolArgs, +) => Promise + +export function createMongoToolConnector( + executeTool: ExecuteMongoTool, +): AIAgentToolConnector { + return { + manifest: mongoToolManifest, + systemPrompt: mongoToolSystemPrompt, + createTool: ({ + sessionId, + seq, + }: AIAgentToolConnectorContext): AgentTool => { + return { + name: mongoToolManifest.name, + label: mongoToolManifest.label, + description: mongoToolManifest.description, + parameters: MongoToolParameters, + execute: async (_toolCallId, params) => { + return executeTool(sessionId, seq, params) + }, + } + }, + } +} + +export { + executeMongoConfirmedAction, + executeMongoTool, + type MongoToolArgs, + MongoToolParameters, +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/manifest.ts b/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/manifest.ts new file mode 100644 index 00000000000..2dc806a94ad --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/manifest.ts @@ -0,0 +1,10 @@ +import type { AIAgentToolManifest } from '../../connector.types' + +export const mongoToolManifest: AIAgentToolManifest = { + id: 'mongodb', + name: 'mongodb', + label: 'MongoDB', + description: + 'Access MongoDB collections. Write operations require explicit user confirmation before execution.', + defaultEnabled: true, +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/system-prompt.ts b/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/system-prompt.ts new file mode 100644 index 00000000000..997644a9502 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connectors/mongodb/system-prompt.ts @@ -0,0 +1,19 @@ +import type { AIAgentToolSystemPrompt } from '../../connector.types' + +export const mongoToolSystemPrompt: AIAgentToolSystemPrompt = { + purpose: + 'Query and, when required, prepare write actions against Mix Space MongoDB collections for user confirmation.', + whenToUse: [ + 'Use this tool whenever the user asks to inspect records, count data, or aggregate documents.', + 'Use this tool for insert/update/delete requests instead of pretending the data was already changed.', + 'Prefer running a read operation first (find/findOne/countDocuments) to confirm scope before any write.', + ], + usageRules: [ + 'Read operations (find, findOne, countDocuments, distinct, aggregate) execute directly — use them freely for investigation.', + 'Write operations (insertOne, insertMany, updateOne, updateMany, replaceOne, deleteOne, deleteMany, findOneAndUpdate, findOneAndReplace, findOneAndDelete, bulkWrite) return a pending confirmation actionId and are NOT executed yet.', + 'If a pending actionId is returned, tell the user what will happen and ask them to confirm or reject in the UI.', + 'Do not proceed past a pending write as if it succeeded; wait for the confirmation result.', + 'Key collections and their purpose: posts (blog posts), notes (journals), pages (static pages), drafts (unpublished content), says (short statuses), recentlies (recent items), snippets (code), projects (portfolio); categories, topics (taxonomy); comments, links, subscribes (community); activities, analyzes, readers (analytics); options, owner_profiles, users, accounts (config/admin); webhooks, serverless_storages, serverless_logs (automation).', + 'Internal/system collections (migrations, migration_locks, checksum, sessions, slug_trackers, ai_agent_*) should only be queried, never written to, unless the user explicitly understands the risk.', + ], +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/executor.ts b/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/executor.ts new file mode 100644 index 00000000000..7b9873e4343 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/executor.ts @@ -0,0 +1,174 @@ +import { spawn } from 'node:child_process' +import { Type, type Static } from '@mariozechner/pi-ai' +import type { AIAgentToolResult } from '../../../ai-agent.types' + +const SHELL_TIMEOUT_MS = 15_000 +const MAX_TOOL_OUTPUT_LENGTH = 16_000 + +export const SHELL_COMMAND_WHITELIST = [ + 'pwd', + 'ls', + 'cat', + 'head', + 'tail', + 'wc', + 'du', + 'df', + 'ps', + 'date', + 'uname', + 'whoami', + 'echo', + 'rg', + 'find', +] as const + +export const ShellToolParameters = Type.Object({ + command: Type.String({ minLength: 1 }), + cwd: Type.Optional(Type.String()), +}) + +export type ShellToolArgs = Static + +export function parseShellCommandName(command: string) { + const matched = command.trim().match(/^([\w.-]+)/) + return matched?.[1]?.toLowerCase() || '' +} + +export function isWhitelistedShellCommand(command: string) { + const name = parseShellCommandName(command) + return SHELL_COMMAND_WHITELIST.includes(name as any) +} + +interface ExecuteShellToolContext { + sessionId: string + seq: { value: number } + params: ShellToolArgs + safeJson: (input: unknown) => string + createPendingAction: ( + sessionId: string, + seq: { value: number }, + toolName: string, + args: Record, + dryRunPreview: Record, + ) => Promise<{ id: string }> +} + +export async function executeShellTool( + context: ExecuteShellToolContext, +): Promise { + if (isWhitelistedShellCommand(context.params.command)) { + const result = await executeShellCommand( + context.params.command, + context.params.cwd, + ) + return { + content: [ + { + type: 'text' as const, + text: context.safeJson(result), + }, + ], + details: { + command: context.params.command, + commandName: parseShellCommandName(context.params.command), + result, + }, + } + } + + const dryRunPreview = { + command: context.params.command, + cwd: context.params.cwd, + reason: 'Command is not in hardcoded whitelist', + commandName: parseShellCommandName(context.params.command), + } + + const action = await context.createPendingAction( + context.sessionId, + context.seq, + 'shell', + { + ...context.params, + }, + dryRunPreview, + ) + + return { + content: [ + { + type: 'text' as const, + text: `Shell command requires confirmation. actionId=${action.id}`, + }, + ], + details: { + pendingConfirmation: true, + actionId: action.id, + dryRunPreview, + }, + } +} + +export async function executeShellConfirmedAction( + params: Record, +) { + const command = params.command as string | undefined + const cwd = params.cwd as string | undefined + + if (!command) { + throw new Error('Invalid shell action payload: missing command') + } + + return executeShellCommand(command, cwd) +} + +export async function executeShellCommand(command: string, cwd?: string) { + return new Promise>((resolve, reject) => { + const startedAt = Date.now() + const child = spawn('sh', ['-lc', command], { + cwd: cwd || process.cwd(), + env: process.env, + }) + + let stdout = '' + let stderr = '' + let timedOut = false + + const timer = setTimeout(() => { + timedOut = true + child.kill('SIGTERM') + }, SHELL_TIMEOUT_MS) + + child.stdout.on('data', (chunk) => { + stdout += chunk.toString() + if (stdout.length > MAX_TOOL_OUTPUT_LENGTH) { + stdout = stdout.slice(0, MAX_TOOL_OUTPUT_LENGTH) + } + }) + + child.stderr.on('data', (chunk) => { + stderr += chunk.toString() + if (stderr.length > MAX_TOOL_OUTPUT_LENGTH) { + stderr = stderr.slice(0, MAX_TOOL_OUTPUT_LENGTH) + } + }) + + child.on('error', (error) => { + clearTimeout(timer) + reject(error) + }) + + child.on('close', (exitCode) => { + clearTimeout(timer) + resolve({ + command, + cwd: cwd || process.cwd(), + exitCode: exitCode ?? 0, + timedOut, + durationMs: Date.now() - startedAt, + stdout, + stderr, + }) + }) + }) +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/index.ts b/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/index.ts new file mode 100644 index 00000000000..dd983ce4758 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/index.ts @@ -0,0 +1,52 @@ +import type { AgentTool } from '@mariozechner/pi-agent-core' +import type { AIAgentToolResult } from '../../../ai-agent.types' +import type { + AIAgentToolConnector, + AIAgentToolConnectorContext, +} from '../../connector.types' +import { + executeShellCommand, + executeShellConfirmedAction, + executeShellTool, + ShellToolParameters, + type ShellToolArgs, +} from './executor' +import { shellToolManifest } from './manifest' +import { shellToolSystemPrompt } from './system-prompt' + +type ExecuteShellTool = ( + sessionId: string, + seq: { value: number }, + params: ShellToolArgs, +) => Promise + +export function createShellToolConnector( + executeTool: ExecuteShellTool, +): AIAgentToolConnector { + return { + manifest: shellToolManifest, + systemPrompt: shellToolSystemPrompt, + createTool: ({ + sessionId, + seq, + }: AIAgentToolConnectorContext): AgentTool => { + return { + name: shellToolManifest.name, + label: shellToolManifest.label, + description: shellToolManifest.description, + parameters: ShellToolParameters, + execute: async (_toolCallId, params) => { + return executeTool(sessionId, seq, params) + }, + } + }, + } +} + +export { + executeShellCommand, + executeShellConfirmedAction, + executeShellTool, + type ShellToolArgs, + ShellToolParameters, +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/manifest.ts b/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/manifest.ts new file mode 100644 index 00000000000..35ee8e6bcd5 --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/manifest.ts @@ -0,0 +1,10 @@ +import type { AIAgentToolManifest } from '../../connector.types' + +export const shellToolManifest: AIAgentToolManifest = { + id: 'shell', + name: 'shell', + label: 'Shell', + description: + 'Execute shell commands. Whitelisted read-only commands run directly; other commands require explicit user confirmation.', + defaultEnabled: true, +} diff --git a/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/system-prompt.ts b/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/system-prompt.ts new file mode 100644 index 00000000000..16af84c1e6c --- /dev/null +++ b/apps/core/src/modules/ai/ai-agent/tools/connectors/shell/system-prompt.ts @@ -0,0 +1,21 @@ +import type { AIAgentToolSystemPrompt } from '../../connector.types' +import { SHELL_COMMAND_WHITELIST } from './executor' + +const WHITELIST_HINT = SHELL_COMMAND_WHITELIST.join(', ') + +export const shellToolSystemPrompt: AIAgentToolSystemPrompt = { + purpose: + 'Inspect the Mix Space server environment and run shell commands to troubleshoot or verify runtime state.', + whenToUse: [ + 'Use this tool when the user asks about server health, process status, disk/memory usage, log files, or environment variables.', + 'Use this tool to verify runtime state (e.g. whether a process is running, a file exists, or a directory is readable) before drawing conclusions.', + 'Prefer read-only inspection commands before suggesting any server-side changes.', + ], + usageRules: [ + `Whitelisted read-only commands (${WHITELIST_HINT}) execute directly without confirmation.`, + 'Non-whitelisted commands (e.g. rm, kill, systemctl, npm, pm2) return a pending confirmation actionId and are NOT executed immediately.', + 'If a command is pending confirmation, explain to the user what it will do and ask them to confirm in the UI before continuing.', + 'Useful inspection patterns for Mix Space: check process list with ps (look for node/pm2), inspect log files with tail/cat, check disk with df/du, verify env with echo, search config or source files with rg/find.', + 'Never construct commands that read sensitive files like private keys or raw credential files unless the user explicitly asks.', + ], +} diff --git a/apps/core/src/modules/ai/ai.module.ts b/apps/core/src/modules/ai/ai.module.ts index f09bbccb608..3a8f07810e9 100644 --- a/apps/core/src/modules/ai/ai.module.ts +++ b/apps/core/src/modules/ai/ai.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common' +import { AIAgentModule } from './ai-agent/ai-agent.module' import { AiInFlightService } from './ai-inflight/ai-inflight.service' import { AiSummaryController } from './ai-summary/ai-summary.controller' import { AiSummaryService } from './ai-summary/ai-summary.service' @@ -11,7 +12,7 @@ import { AiController } from './ai.controller' import { AiService } from './ai.service' @Module({ - imports: [AiTaskModule], + imports: [AiTaskModule, AIAgentModule], providers: [ AiSummaryService, AiInFlightService, diff --git a/apps/core/src/processors/gateway/shared/auth.gateway.ts b/apps/core/src/processors/gateway/shared/auth.gateway.ts index 63e277e137f..dff10335fce 100644 --- a/apps/core/src/processors/gateway/shared/auth.gateway.ts +++ b/apps/core/src/processors/gateway/shared/auth.gateway.ts @@ -120,18 +120,36 @@ export const createAuthGateway = ( exclude?: string[] }, ) { + const payload = this.gatewayMessageFormat(event, data) + const rooms = options?.rooms + const exclude = options?.exclude + + if (this.namespace) { + let socket: any = this.namespace as Namespace + + if (rooms?.length) { + socket = socket.to(rooms) + } + if (exclude?.length) { + socket = socket.except(exclude) + } + + socket.emit('message', payload) + return + } + let socket = this.redisService.emitter.of(`/${namespace}`) as | Emitter | BroadcastOperator - if (options?.rooms?.length) { - socket = socket.in(options.rooms) + if (rooms?.length) { + socket = socket.to(rooms) } - if (options?.exclude?.length) { - socket = socket.except(options.exclude) + if (exclude?.length) { + socket = socket.except(exclude) } - socket.emit('message', this.gatewayMessageFormat(event, data)) + socket.emit('message', payload) } } diff --git a/eslint.config.mjs b/eslint.config.mjs index 5580751d55a..038df01831a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,6 +18,7 @@ export default defineConfig( 'packages/*/esm', 'packages/*/types', 'test/**/*.db.ts', + 'apps/agent-ui/**', ], sortKeys: false, typescript: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e9d83afbf8..1c3a09e2148 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,7 +39,7 @@ importers: version: 16.2.7 mongodb-memory-server: specifier: 11.0.1 - version: 11.0.1 + version: 11.0.1(socks@2.8.7) prettier: specifier: 3.8.1 version: 3.8.1 @@ -72,7 +72,110 @@ importers: version: 5.9.3 vite-tsconfig-paths: specifier: 6.0.5 - version: 6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)) + version: 6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)) + + apps/agent-ui: + dependencies: + '@lexical/code': + specifier: ^0.22.0 + version: 0.22.0 + '@lexical/link': + specifier: ^0.22.0 + version: 0.22.0 + '@lexical/list': + specifier: ^0.22.0 + version: 0.22.0 + '@lexical/markdown': + specifier: ^0.22.0 + version: 0.22.0 + '@lexical/react': + specifier: ^0.22.0 + version: 0.22.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(yjs@13.6.29) + '@lexical/rich-text': + specifier: ^0.22.0 + version: 0.22.0 + '@radix-ui/react-dialog': + specifier: 1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-popover': + specifier: 1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': + specifier: 1.2.4 + version: 1.2.4(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-switch': + specifier: 1.2.6 + version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toast': + specifier: 1.2.15 + version: 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-tooltip': + specifier: 1.2.8 + version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@streamdown/cjk': + specifier: latest + version: 1.0.2(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.4)(unified@11.0.5) + '@streamdown/code': + specifier: latest + version: 1.0.2(react@19.2.4) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lexical: + specifier: ^0.22.0 + version: 0.22.0 + lucide-react: + specifier: ^0.564.0 + version: 0.564.0(react@19.2.4) + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + react-router: + specifier: ^7.0.0 + version: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + socket.io-client: + specifier: ^4.8.0 + version: 4.8.3 + streamdown: + specifier: latest + version: 2.2.0(react@19.2.4) + tailwind-merge: + specifier: ^3.3.1 + version: 3.5.0 + zustand: + specifier: ^5.0.11 + version: 5.0.11(@types/react@19.2.14)(react@19.2.4) + devDependencies: + '@tailwindcss/vite': + specifier: ^4.1.0 + version: 4.2.0(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)) + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^4.4.0 + version: 4.7.0(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)) + tailwindcss: + specifier: ^4.1.0 + version: 4.2.0 + tw-animate-css: + specifier: ^1.3.3 + version: 1.4.0 + typescript: + specifier: 5.9.3 + version: 5.9.3 + vite: + specifier: ^6.2.0 + version: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) apps/core: dependencies: @@ -99,7 +202,7 @@ importers: version: 7.28.6 '@better-auth/passkey': specifier: ^1.4.18 - version: 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-auth@1.4.18(mongodb@6.12.0)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)))(better-call@1.1.8(zod@4.3.6))(nanostores@1.1.0) + version: 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-auth@1.4.18(mongodb@6.12.0(socks@2.8.7))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)))(better-call@1.1.8(zod@4.3.6))(nanostores@1.1.0) '@fastify/cookie': specifier: 11.0.2 version: 11.0.2 @@ -130,6 +233,12 @@ importers: '@lexical/rich-text': specifier: ^0.40.0 version: 0.40.0 + '@mariozechner/pi-agent-core': + specifier: ^0.52.12 + version: 0.52.12(ws@8.18.3)(zod@4.3.6) + '@mariozechner/pi-ai': + specifier: ^0.52.12 + version: 0.52.12(ws@8.18.3)(zod@4.3.6) '@nestjs/cache-manager': specifier: 3.1.0 version: 3.1.0(@nestjs/common@11.1.12(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.12)(cache-manager@7.2.8)(keyv@5.6.0)(rxjs@7.8.2) @@ -168,10 +277,10 @@ importers: version: 5.1.0 '@typegoose/auto-increment': specifier: ^5.0.0 - version: 5.0.1(mongoose@9.1.6) + version: 5.0.1(mongoose@9.1.6(socks@2.8.7)) '@typegoose/typegoose': specifier: ^13.0.0 - version: 13.1.0(mongoose@9.1.6) + version: 13.1.0(mongoose@9.1.6(socks@2.8.7)) '@types/jsonwebtoken': specifier: 9.0.10 version: 9.0.10 @@ -189,7 +298,7 @@ importers: version: 3.0.3 better-auth: specifier: 1.4.18 - version: 1.4.18(mongodb@6.12.0)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)) + version: 1.4.18(mongodb@6.12.0(socks@2.8.7))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)) blurhash: specifier: 2.0.5 version: 2.0.5 @@ -261,22 +370,22 @@ importers: version: 3.0.1 mongoose: specifier: ^9.1.5 - version: 9.1.6 + version: 9.1.6(socks@2.8.7) mongoose-aggregate-paginate-v2: specifier: 1.1.4 version: 1.1.4 mongoose-autopopulate: specifier: 1.2.1 - version: 1.2.1(mongoose@9.1.6) + version: 1.2.1(mongoose@9.1.6(socks@2.8.7)) mongoose-lean-getters: specifier: 2.3.1 - version: 2.3.1 + version: 2.3.1(socks@2.8.7) mongoose-lean-virtuals: specifier: 2.1.0 - version: 2.1.0(mongoose@9.1.6) + version: 2.1.0(mongoose@9.1.6(socks@2.8.7)) mongoose-paginate-v2: specifier: 1.9.1 - version: 1.9.1(mongoose@9.1.6) + version: 1.9.1(mongoose@9.1.6(socks@2.8.7)) nanoid: specifier: 5.1.6 version: 5.1.6 @@ -312,7 +421,7 @@ importers: version: 0.0.4 resend: specifier: ^6.9.1 - version: 6.9.2(@react-email/render@1.1.2(react-dom@19.2.4(react@19.2.3))(react@19.2.3)) + version: 6.9.2(@react-email/render@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) rxjs: specifier: 7.8.2 version: 7.8.2 @@ -397,13 +506,13 @@ importers: version: 13.15.10 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)) ioredis: specifier: 5.9.3 version: 5.9.3 mongodb-memory-server: specifier: ^11.0.1 - version: 11.0.1 + version: 11.0.1(socks@2.8.7) redis-memory-server: specifier: ^0.15.0 version: 0.15.0 @@ -427,13 +536,13 @@ importers: version: 1.5.9(@swc/core@1.15.11)(rollup@4.55.3) vite: specifier: 7.3.1 - version: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + version: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) vite-tsconfig-paths: specifier: 6.0.5 - version: 6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)) + version: 6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) apps/telemetry: devDependencies: @@ -481,10 +590,10 @@ importers: version: 1.4.0 vite: specifier: ^7.3.1 - version: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + version: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) packages/webhook: devDependencies: @@ -596,6 +705,164 @@ packages: zod: optional: true + '@anthropic-ai/sdk@0.73.0': + resolution: {integrity: sha512-URURVzhxXGJDGUGFunIOtBlSl7KWvZiAAKY/ttTkZAkXT9bTPqdk2eK0b8qqSxXpikh3QKPnPYpiyX98zf5ebw==} + hasBin: true + peerDependencies: + zod: 4.3.6 + peerDependenciesMeta: + zod: + optional: true + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-bedrock-runtime@3.991.0': + resolution: {integrity: sha512-eKdkfIj2R/lfA6XGjTCQdFSVRKAjPd1Epndf1DvnzYInEzh/WOoaMMWuQn6HP9VPzHDb4xAiYmJX9FHmTJGFtg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-sso@3.990.0': + resolution: {integrity: sha512-xTEaPjZwOqVjGbLOP7qzwbdOWJOo1ne2mUhTZwEBBkPvNk4aXB/vcYwWwrjoSWUqtit4+GDbO75ePc/S6TUJYQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.973.10': + resolution: {integrity: sha512-4u/FbyyT3JqzfsESI70iFg6e2yp87MB5kS2qcxIA66m52VSTN1fvuvbCY1h/LKq1LvuxIrlJ1ItcyjvcKoaPLg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.8': + resolution: {integrity: sha512-r91OOPAcHnLCSxaeu/lzZAVRCZ/CtTNuwmJkUwpwSDshUrP7bkX1OmFn2nUMWd9kN53Q4cEo8b7226G4olt2Mg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.10': + resolution: {integrity: sha512-DTtuyXSWB+KetzLcWaSahLJCtTUe/3SXtlGp4ik9PCe9xD6swHEkG8n8/BNsQ9dsihb9nhFvuUB4DpdBGDcvVg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.8': + resolution: {integrity: sha512-n2dMn21gvbBIEh00E8Nb+j01U/9rSqFIamWRdGm/mE5e+vHQ9g0cBNdrYFlM6AAiryKVHZmShWT9D1JAWJ3ISw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.8': + resolution: {integrity: sha512-rMFuVids8ICge/X9DF5pRdGMIvkVhDV9IQFQ8aTYk6iF0rl9jOUa1C3kjepxiXUlpgJQT++sLZkT9n0TMLHhQw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.9': + resolution: {integrity: sha512-LfJfO0ClRAq2WsSnA9JuUsNyIicD2eyputxSlSL0EiMrtxOxELLRG6ZVYDf/a1HCepaYPXeakH4y8D5OLCauag==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.8': + resolution: {integrity: sha512-6cg26ffFltxM51OOS8NH7oE41EccaYiNlbd5VgUYwhiGCySLfHoGuGrLm2rMB4zhy+IO5nWIIG0HiodX8zdvHA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.8': + resolution: {integrity: sha512-35kqmFOVU1n26SNv+U37sM8b2TzG8LyqAcd6iM9gprqxyHEh/8IM3gzN4Jzufs3qM6IrH8e43ryZWYdvfVzzKQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.8': + resolution: {integrity: sha512-CZhN1bOc1J3ubQPqbmr5b4KaMJBgdDvYsmEIZuX++wFlzmZsKj1bwkaiTEb5U2V7kXuzLlpF5HJSOM9eY/6nGA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/eventstream-handler-node@3.972.5': + resolution: {integrity: sha512-xEmd3dnyn83K6t4AJxBJA63wpEoCD45ERFG0XMTViD2E/Ohls9TLxjOWPb1PAxR9/46cKy/TImez1GoqP6xVNQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-eventstream@3.972.3': + resolution: {integrity: sha512-pbvZ6Ye/Ks6BAZPa3RhsNjHrvxU9li25PMhSdDpbX0jzdpKpAkIR65gXSNKmA/REnSdEMWSD4vKUW+5eMFzB6w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-host-header@3.972.3': + resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-logger@3.972.3': + resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.972.3': + resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-user-agent@3.972.10': + resolution: {integrity: sha512-bBEL8CAqPQkI91ZM5a9xnFAzedpzH6NYCOtNyLarRAzTUTFN2DKqaC60ugBa7pnU1jSi4mA7WAXBsrod7nJltg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-websocket@3.972.6': + resolution: {integrity: sha512-1DedO6N3m8zQ/vG6twNiHtsdwBgk773VdavLEbB3NXeKZDlzSK1BTviqWwvJdKx5UnIy4kGGP6WWpCEFEt/bhQ==} + engines: {node: '>= 14.0.0'} + + '@aws-sdk/nested-clients@3.990.0': + resolution: {integrity: sha512-3NA0s66vsy8g7hPh36ZsUgO4SiMyrhwcYvuuNK1PezO52vX3hXDW4pQrC6OQLGKGJV0o6tbEyQtXb/mPs8zg8w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.991.0': + resolution: {integrity: sha512-vCWX2O4Kf9h0BviR46r2kc9cAv9twcxDCW9Rlszjkxg0+QN3ji0Q68OVfFZKZYx1BIPkPaWwjeMFB3iUtyyC3w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/region-config-resolver@3.972.3': + resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.990.0': + resolution: {integrity: sha512-L3BtUb2v9XmYgQdfGBzbBtKMXaP5fV973y3Qdxeevs6oUTVXFmi/mV1+LnScA/1wVPJC9/hlK+1o5vbt7cG7EQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.991.0': + resolution: {integrity: sha512-bBlhKprCPhOU+XuoFdR8D5hrbfvUxOYPsMm/bTAhaiCZzng0G1QM5jqOet3z9U9BzyIAH+PH6kUGbeDwhv0acA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.1': + resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.990.0': + resolution: {integrity: sha512-kVwtDc9LNI3tQZHEMNbkLIOpeDK8sRSTuT8eMnzGY+O+JImPisfSTjdh+jw9OTznu+MYZjQsv0258sazVKunYg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.991.0': + resolution: {integrity: sha512-m8tcZ3SbqG3NRDv0Py3iBKdb4/FlpOCP4CQ6wRtsk4vs3UypZ0nFdZwCRVnTN7j+ldj+V72xVi/JBlxFBDE7Sg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-format-url@3.972.3': + resolution: {integrity: sha512-n7F2ycckcKFXa01vAsT/SJdjFHfKH9s96QHcs5gn8AaaigASICeME8WdUL9uBp8XV/OVwEt8+6gzn6KFUgQa8g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-locate-window@3.965.4': + resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-user-agent-browser@3.972.3': + resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} + + '@aws-sdk/util-user-agent-node@3.972.8': + resolution: {integrity: sha512-XJZuT0LWsFCW1C8dEpPAXSa7h6Pb3krr2y//1X0Zidpcl0vmgY5nL/X0JuBZlntpBzaN3+U4hvKjuijyiiR8zw==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.972.4': + resolution: {integrity: sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.2.3': + resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + engines: {node: '>=18.0.0'} + '@babel/code-frame@7.28.6': resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} @@ -729,6 +996,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.28.6': resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} engines: {node: '>=6.9.0'} @@ -869,6 +1148,12 @@ packages: '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.27.0': resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} engines: {node: '>=18'} @@ -881,6 +1166,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.27.0': resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} engines: {node: '>=18'} @@ -893,6 +1184,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.27.0': resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} engines: {node: '>=18'} @@ -905,6 +1202,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.27.0': resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} engines: {node: '>=18'} @@ -917,6 +1220,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.27.0': resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} engines: {node: '>=18'} @@ -929,6 +1238,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.27.0': resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} engines: {node: '>=18'} @@ -941,6 +1256,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.27.0': resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} engines: {node: '>=18'} @@ -953,6 +1274,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.0': resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} engines: {node: '>=18'} @@ -965,6 +1292,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.27.0': resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} engines: {node: '>=18'} @@ -977,6 +1310,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.27.0': resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} engines: {node: '>=18'} @@ -989,6 +1328,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.27.0': resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} engines: {node: '>=18'} @@ -1001,6 +1346,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.27.0': resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} engines: {node: '>=18'} @@ -1013,6 +1364,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.27.0': resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} engines: {node: '>=18'} @@ -1025,6 +1382,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.27.0': resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} engines: {node: '>=18'} @@ -1037,6 +1400,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.27.0': resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} engines: {node: '>=18'} @@ -1049,6 +1418,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.27.0': resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} engines: {node: '>=18'} @@ -1061,6 +1436,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.27.0': resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} engines: {node: '>=18'} @@ -1073,6 +1454,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.27.0': resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} engines: {node: '>=18'} @@ -1085,6 +1472,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.0': resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} engines: {node: '>=18'} @@ -1097,6 +1490,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.27.0': resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} engines: {node: '>=18'} @@ -1109,6 +1508,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.0': resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} engines: {node: '>=18'} @@ -1121,6 +1526,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/openharmony-arm64@0.27.0': resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} engines: {node: '>=18'} @@ -1133,6 +1544,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.27.0': resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} engines: {node: '>=18'} @@ -1145,6 +1562,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.27.0': resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} engines: {node: '>=18'} @@ -1157,6 +1580,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.27.0': resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} engines: {node: '>=18'} @@ -1169,6 +1598,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.27.0': resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} engines: {node: '>=18'} @@ -1316,6 +1751,30 @@ packages: '@fastify/static@9.0.0': resolution: {integrity: sha512-r64H8Woe/vfilg5RTy7lwWlE8ZZcTrc3kebYFMEUBrMqlydhQyoiExQXdYAy2REVpST/G35+stAM8WYp1WGmMA==} + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} + + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} + + '@floating-ui/react-dom@2.1.7': + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@google/genai@1.41.0': + resolution: {integrity: sha512-S4WGil+PG0NBQRAx+0yrQuM/TWOLn2gGEy5wn4IsoOI6ouHad0P61p3OWdhJ3aqr9kfj8o904i/jevfaGoGuIQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.25.2 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + '@hexagon/base64@1.1.28': resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} @@ -1848,36 +2307,107 @@ packages: '@levischuck/tiny-cbor@0.2.11': resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} + '@lexical/clipboard@0.22.0': + resolution: {integrity: sha512-nG3MX7MYmaf4f4Ia0YaYaJIS1QriuUxNaLHYeAqOPqYZLH1CUnXslCiak6OyQ4dt/QozKKvGM5vpZN2QWvs0Xw==} + '@lexical/clipboard@0.40.0': resolution: {integrity: sha512-FWyAKwbGbmwLbG6biyxB/MQkELzcbd6E89Xufarbx/1VZ2pX/BMaeVD4J7ojHgIZ4omTNI6nKH26K4wWySCIGQ==} + '@lexical/code@0.22.0': + resolution: {integrity: sha512-5HQGcv+R7+uOxFGGqGxE5Mj2LcYwxniHejri7s3OJTSeFrGxAXwP2Kxb+5FSvWsyg265snuxZlNNfKVozgJPhA==} + + '@lexical/devtools-core@0.22.0': + resolution: {integrity: sha512-PFdaN2c+O/eLqNcWzuLBz0AaiLPHs9+iMHUZDQMgAWcKS6uiEBA61VS+ZNZn8zj8RZZvUtxgmZ9wQFFURklfww==} + peerDependencies: + react: '>=17.x' + react-dom: '>=17.x' + + '@lexical/dragon@0.22.0': + resolution: {integrity: sha512-68b1EiFbYRqPEhbrFPhfTNe/hSTCFtwBmcIP5cGgEef+lL5XqCxc6NK2g2DK4Dx26DSGwXxTuRG8NuuxFN+CiA==} + '@lexical/dragon@0.40.0': resolution: {integrity: sha512-QWBZw89CAkw2b3Fl942DxJ7M8/XxFFvVubw9Z7Ac6wgUkGgtF2wrK9F0H8cPZ3pzbUqL1v1EtwW1/XhlLfmQqw==} '@lexical/extension@0.40.0': resolution: {integrity: sha512-kipdm0f+xe8ctxHt9S3NPZazMX3ILqIk5xMWxX2svdsRc7qIeMkl+5SLWnBqQA+e5ztLJqa7GSA4WMqu/dBZDQ==} + '@lexical/hashtag@0.22.0': + resolution: {integrity: sha512-W6Wrz0+ClezZQavjCjYso+LzRP/rWNUIM6cLwnf7oFXsmIXeaLHXecIbRwZ+SChnj4eUlSlnlknMVi3bJKaOjw==} + '@lexical/headless@0.40.0': resolution: {integrity: sha512-mjYJTRq6DfY1qdT/OJVGqpTX3m4DryZVldVjuELqVWGS/uZ+pgQDVXM97tveU9TpqVHYH7YrQev/Sex9SdGb9A==} + '@lexical/history@0.22.0': + resolution: {integrity: sha512-4e/xL7CtYvsv8X4iGH1tPL8J6jthDpzh0a1WWZfL9ipeOYN9Btctq6o1Obdth5DfbMR7ELq7PSN2FK6+jZ4EQQ==} + + '@lexical/html@0.22.0': + resolution: {integrity: sha512-ED2Xik95a4kPg9vbU5pT/sA5hvEyGnuVxg0XvMx/6Gaa7OIhYDiZvSD4DCE+eVfn0xZMnIbX94Ygf4//71kCYw==} + '@lexical/html@0.40.0': resolution: {integrity: sha512-5EZeHbp9Q3Op2KRoVfFvX4QyMizYW5SJkrWkGG6h6g/Z9EDNjb3C7Wjqx7ZosCHcFze6Pgic/0yEaCc2fSUcEg==} + '@lexical/link@0.22.0': + resolution: {integrity: sha512-mtlsOYW6sgbgvv1ecPt6/9CdlgP0MhVyrF8iu16JpngphVXu/Lz2BSh7TCfY0xho/H2OIu++9lUGn87cK1Zplw==} + '@lexical/link@0.40.0': resolution: {integrity: sha512-4EVMJQ6tKJR+1+YAJ2mhVsRR6Edk6b81hWKjnMZITKhEOKjylxO7bwuXYVYPEckBzL2mXkEhYX5aFnig5+HkMQ==} + '@lexical/list@0.22.0': + resolution: {integrity: sha512-DZLzMg1/H+nclV8BNqZe2qk/bz1ogCr7Huzwab5o8jTjpsDJaqyUZasj8wRgBzyLu9jxMQngkarL47nnk+zrbA==} + '@lexical/list@0.40.0': resolution: {integrity: sha512-YHStiN56DOc6tDu/3LwalPtHH8/1R+peiDF+/ePpla9aSDJclAqhxRBYsqSZhO6Hu5QhAEIi2Me7Gi+uZdmCTw==} + '@lexical/mark@0.22.0': + resolution: {integrity: sha512-d8Jb9xqhHwUrN2uBs0aIjvA/NgeAZCI5Zorynqq5ihBVSytrol09JyRt4t7SXRH4sCpDMDLMWfTjm820RQFq8g==} + + '@lexical/markdown@0.22.0': + resolution: {integrity: sha512-FJNfegbgry4dFwyzjdK6sasYHsVgiYy2WrVmVKYR/EDBxa0MARnVO7lRRXA37WcqMKi5N8dE/dABmjlmzuYzHA==} + + '@lexical/offset@0.22.0': + resolution: {integrity: sha512-DgfO0q1+PzLzmMgRxTC7+y4whL6btlNSfv7f47TBAMBoj5tKdkGyMrru0xjoeYHVsMiSNgqMY2HTXU5YokKUOg==} + + '@lexical/overflow@0.22.0': + resolution: {integrity: sha512-LPj27ChVsOUW7Gv28z9m7NfpPQs7e3OooYL1WzU3R8NYDj/U32YxQXpUDcxHKwBPo8j8NVEna2d3UAG1txz6BA==} + + '@lexical/plain-text@0.22.0': + resolution: {integrity: sha512-MBlX4PfLN6I/As8uuRnL/17B+lIjmtNSIH90NjykRwBC8dtWr4gzSjm9OGTee6HctxnbQNb1BGLM7W1hLtiKAw==} + + '@lexical/react@0.22.0': + resolution: {integrity: sha512-kHeAX6QFsDcdih2kBQVnIATOQsDzpMp2VLYlSxatF8JvCTaMQ3quH/CGHLnUAauZDxM2LC/eV+Z4nrUOP3Alyg==} + peerDependencies: + react: '>=17.x' + react-dom: '>=17.x' + + '@lexical/rich-text@0.22.0': + resolution: {integrity: sha512-ILN/tht6emxbVK12Hp86y50fk0MGHMHg6Ivt/5OncoDPXfLMicuJRgLgLxLl5dCf7UVQOfa7z8eKEWnE83M5Mg==} + '@lexical/rich-text@0.40.0': resolution: {integrity: sha512-aHW9gSYGzEfZNxx14j2xJhihrnKaWA1aoudteP4r7TkNlbfJ3xG9dxp7ItwrAKJlfvI0gkMc1/aZOUIqESbAkw==} + '@lexical/selection@0.22.0': + resolution: {integrity: sha512-DdRh8bHijQGV1OxeaywulaLRxgYtn1B7miS0I4pP04KkRXVxrlWRP5dGzQoMDghTh+W1QD9GiUSAyz4L9R3zxQ==} + '@lexical/selection@0.40.0': resolution: {integrity: sha512-iFwZufMlIx9fZ+K3NQip9oxoHzuP+V9rVdkLnfUWC7aO4HNxVPSryEfUnbAs+F5xlOzyVHsu7Xa+CMHfIL8/gQ==} + '@lexical/table@0.22.0': + resolution: {integrity: sha512-Kx4N4kgYKTpcYtYYbp3hfG6We6ss3vWlhJ/f/QuUo18+w8c0a7aaCo4wTjNNUnSuXSFc1E02JlaTTVoI1pVfDw==} + + '@lexical/text@0.22.0': + resolution: {integrity: sha512-eLQTH11FmTW8VBOcb3hKc6H4S4A2cXFDOXHE3lCA+ErLXOnwlj7tKm52eWyddPTlkNmZ3C8mIvfVPcS4Jxw20Q==} + + '@lexical/utils@0.22.0': + resolution: {integrity: sha512-mQoNS4e0+lqkj3lPKE2u5vdQmdtgsqcLhzNJMhpCmFvJ896l5zKXOFQoFmF8BFz/v7w92FT7dpT5gd0lcIryyg==} + '@lexical/utils@0.40.0': resolution: {integrity: sha512-3wkzgQxeb137GtaGWZI23XYB+omGjfYlrvAPJOqcb5z8yS7iAiuHwWULdmi1/jPBClS7z9N8pkNzq06BP8QlZA==} + '@lexical/yjs@0.22.0': + resolution: {integrity: sha512-JrQO03HIIfOURpCpSZgZoTH8WBFumhvl9ysP1ZAqh9f2bLZp7qxi/jFgwOorz0NdM11Qb1dJprNNPaqNnS4BKA==} + peerDependencies: + yjs: '>=13.5.22' + '@lobehub/eslint-config@2.1.5': resolution: {integrity: sha512-qTIdfZFl1cNJED0Z75fRiNdz9xFcbLnZGZRZanqNLfWxzNmyWkBfwUJh/piTdkaTq3pKjFJON/zmGmYX6B5nsg==} engines: {node: '>=18'} @@ -1896,6 +2426,18 @@ packages: resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@mariozechner/pi-agent-core@0.52.12': + resolution: {integrity: sha512-fBQdwLMvTteHUP9nJxMjtMpEHH4I8tdGnkerOoCFnS9y03AHdqy96IhtL+zZjw9N3dmVCOVqh8gwGjAGLZT31Q==} + engines: {node: '>=20.0.0'} + + '@mariozechner/pi-ai@0.52.12': + resolution: {integrity: sha512-oF7OMJu1aUx7MXJeJoJ/3JDXzD2a5SqK9nHVK3mCA8DRQaykv9g+wcFZaANcCl0vAR2QSDr5KN3ZMARlFNWiVg==} + engines: {node: '>=20.0.0'} + hasBin: true + + '@mistralai/mistralai@1.10.0': + resolution: {integrity: sha512-tdIgWs4Le8vpvPiUEWne6tK0qbVc+jMenujnvTqOjogrJUsCSQhus0tHTU1avDDh5//Rq2dFgP9mWRAdIEoBqg==} + '@mongodb-js/saslprep@1.4.6': resolution: {integrity: sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g==} @@ -2347,15 +2889,359 @@ packages: resolution: {integrity: sha512-UGXe+g/rSRbglL0FOJiar+a+nUrst7KaFmsg05wYbKiInGWP6eAj/f8A2Uobgo5KxEtb2X10zeflNH6RK2xeIQ==} engines: {node: '>=14'} - '@quansync/fs@1.0.0': - resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - '@react-email/render@1.1.2': - resolution: {integrity: sha512-RnRehYN3v9gVlNMehHPHhyp2RQo7+pSkHDtXPvg3s0GbzM9SQMW4Qrf8GRNvtpLC4gsI+Wt0VatNRUFqjvevbw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^18.0 || ^19.0 || ^19.0.0-rc + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.2.6': + resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toast@1.2.15': + resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.8': + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@react-email/render@1.1.2': + resolution: {integrity: sha512-RnRehYN3v9gVlNMehHPHhyp2RQo7+pSkHDtXPvg3s0GbzM9SQMW4Qrf8GRNvtpLC4gsI+Wt0VatNRUFqjvevbw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^18.0 || ^19.0 || ^19.0.0-rc '@redis/client@5.10.0': resolution: {integrity: sha512-JXmM4XCoso6C75Mr3lhKA3eNxSzkYi3nCzxDIKY+YOszYsJjuKbFgVtguVPbLMOttN4iu2fXoc2BGhdnYhIOxA==} @@ -2442,6 +3328,9 @@ packages: cpu: [x64] os: [win32] + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/pluginutils@1.0.0-rc.2': resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} @@ -2595,6 +3484,27 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@shikijs/core@3.22.0': + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} + + '@shikijs/engine-javascript@3.22.0': + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} + + '@shikijs/engine-oniguruma@3.22.0': + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} + + '@shikijs/langs@3.22.0': + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} + + '@shikijs/themes@3.22.0': + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} + + '@shikijs/types@3.22.0': + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@simplewebauthn/browser@13.2.2': resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==} @@ -2602,6 +3512,9 @@ packages: resolution: {integrity: sha512-HcWLW28yTMGXpwE9VLx9J+N2KEUaELadLrkPEEI9tpI5la70xNEVEsu/C+m3u7uoq4FulLqZQhgBCzR9IZhFpA==} engines: {node: '>=20.0.0'} + '@sinclair/typebox@0.34.48': + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -2610,6 +3523,198 @@ packages: resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} + '@smithy/abort-controller@4.2.8': + resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.6': + resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.23.0': + resolution: {integrity: sha512-Yq4UPVoQICM9zHnByLmG8632t2M0+yap4T7ANVw482J0W7HW0pOuxwVmeOwzJqX2Q89fkXz0Vybz55Wj2Xzrsg==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.8': + resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.2.8': + resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.2.8': + resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.3.8': + resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.2.8': + resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.2.8': + resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.9': + resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.8': + resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.8': + resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.8': + resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.4.14': + resolution: {integrity: sha512-FUFNE5KVeaY6U/GL0nzAAHkaCHzXLZcY1EhtQnsAqhD8Du13oPKtMB9/0WK4/LK6a/T5OZ24wPoSShff5iI6Ag==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.31': + resolution: {integrity: sha512-RXBzLpMkIrxBPe4C8OmEOHvS8aH9RUuCOH++Acb5jZDEblxDjyg6un72X9IcbrGTJoiUwmI7hLypNfuDACypbg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.9': + resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.8': + resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.8': + resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.10': + resolution: {integrity: sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.8': + resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.8': + resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.8': + resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.8': + resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.8': + resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.3': + resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.8': + resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.11.3': + resolution: {integrity: sha512-Q7kY5sDau8OoE6Y9zJoRGgje8P4/UY0WzH8R2ok0PDh+iJ+ZnEKowhjEqYafVcubkbYxQVaqwm3iufktzhprGg==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.12.0': + resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.8': + resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.30': + resolution: {integrity: sha512-cMni0uVU27zxOiU8TuC8pQLC1pYeZ/xEMxvchSK/ILwleRd1ugobOcIRr5vXtcRqKd4aBLWlpeBoDPJJ91LQng==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.33': + resolution: {integrity: sha512-LEb2aq5F4oZUSzWBG7S53d4UytZSkOEJPXcBq/xbG2/TmK9EW5naUZ8lKu1BEyWMzdHIzEVN16M3k8oxDq+DJA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.8': + resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.8': + resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.8': + resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.12': + resolution: {integrity: sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -2631,6 +3736,16 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@streamdown/cjk@1.0.2': + resolution: {integrity: sha512-5OOuZjj2Lnae92Zmg2gA5hloSbcKj25gv+QY4iKbYI+iRsiGWbgmYxmgxNUSO9SR6BKOCy783UHN1HM/QEUpdw==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + '@streamdown/code@1.0.2': + resolution: {integrity: sha512-QKLS3sC8no5y0YvhGLA+ZjtNhznWU09IvFcjRKgSA35ulckMLw3b5T1ha+o1DaW8BS8l0zceLPFZa3/X9+agWQ==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + '@swc/cli@0.7.10': resolution: {integrity: sha512-QQ36Q1VwGTT2YzvMeNe/j1x4DKS277DscNhWc57dIwQn//C+zAgvuSupMB/XkmYqPKQX+8hjn5/cHRJrMvWy0Q==} engines: {node: '>= 16.14.0'} @@ -2725,6 +3840,100 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tailwindcss/node@4.2.0': + resolution: {integrity: sha512-Yv+fn/o2OmL5fh/Ir62VXItdShnUxfpkMA4Y7jdeC8O81WPB8Kf6TT6GSHvnqgSwDzlB5iT7kDpeXxLsUS0T6Q==} + + '@tailwindcss/oxide-android-arm64@4.2.0': + resolution: {integrity: sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.0': + resolution: {integrity: sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.0': + resolution: {integrity: sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.0': + resolution: {integrity: sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.0': + resolution: {integrity: sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.0': + resolution: {integrity: sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.0': + resolution: {integrity: sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.0': + resolution: {integrity: sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.2.0': + resolution: {integrity: sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.2.0': + resolution: {integrity: sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.0': + resolution: {integrity: sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.0': + resolution: {integrity: sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.0': + resolution: {integrity: sha512-AZqQzADaj742oqn2xjl5JbIOzZB/DGCYF/7bpvhA8KvjUj9HJkag6bBuwZvH1ps6dfgxNHyuJVlzSr2VpMgdTQ==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.2.0': + resolution: {integrity: sha512-da9mFCaHpoOgtQiWtDGIikTrSpUFBtIZCG3jy/u2BGV+l/X1/pbxzmIUxNt6JWm19N3WtGi4KlJdSH/Si83WOA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} @@ -2736,6 +3945,9 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -2790,6 +4002,9 @@ packages: '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -2808,6 +4023,9 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -2820,6 +4038,9 @@ packages: '@types/get-image-colors@4.0.5': resolution: {integrity: sha512-4d3eLaB8Hz+KpGwkqZx/AO2Omvp5lFbAV5z6MqLV3bUQR1tHLsIbbLgESOS+/APrtad8oDg7BzQbE/hAzrOUHA==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} @@ -2844,6 +4065,9 @@ packages: '@types/luxon@3.7.1': resolution: {integrity: sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mime-types@3.0.1': resolution: {integrity: sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==} @@ -2868,6 +4092,14 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/remove-markdown@0.3.4': resolution: {integrity: sha512-i753EH/p02bw7bLlpfS/4CV1rdikbGiLabWyVsAvsFid3cA5RNU1frG7JycgY+NSnFwtoGlElvZVceCytecTDA==} @@ -2883,6 +4115,12 @@ packages: '@types/ua-parser-js@0.7.39': resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} + '@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==} + '@types/validator@13.15.10': resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} @@ -2960,6 +4198,9 @@ packages: resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -3063,6 +4304,12 @@ packages: cpu: [x64] os: [win32] + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/coverage-v8@4.0.18': resolution: {integrity: sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==} peerDependencies: @@ -3300,6 +4547,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -3353,6 +4604,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + ast-v8-to-istanbul@0.3.11: resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} @@ -3404,6 +4659,9 @@ packages: react-native-b4a: optional: true + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3426,6 +4684,10 @@ packages: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true + basic-ftp@5.1.0: + resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} + engines: {node: '>=10.0.0'} + bcryptjs@3.0.3: resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==} hasBin: true @@ -3500,6 +4762,9 @@ packages: zod: optional: true + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + bin-version-check@5.1.0: resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} engines: {node: '>=12'} @@ -3530,6 +4795,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -3615,6 +4883,9 @@ packages: caniuse-lite@1.0.30001761: resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -3623,9 +4894,25 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + 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@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} @@ -3651,6 +4938,9 @@ packages: class-validator@0.13.2: resolution: {integrity: sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -3683,6 +4973,10 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -3701,6 +4995,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@14.0.2: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} @@ -3838,9 +5135,20 @@ packages: cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -3882,6 +5190,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -3915,6 +5226,10 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -3942,6 +5257,12 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + 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==} @@ -4039,6 +5360,9 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} + engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} @@ -4051,6 +5375,10 @@ packages: resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -4110,6 +5438,11 @@ packages: es-toolkit@1.44.0: resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.27.0: resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} engines: {node: '>=18'} @@ -4139,6 +5472,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-config-prettier@9.1.2: resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} hasBin: true @@ -4352,6 +5690,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==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -4403,6 +5744,9 @@ packages: resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} engines: {node: '>=4'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} @@ -4454,6 +5798,10 @@ packages: fast-wrap-ansi@0.2.0: resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} + hasBin: true + fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} @@ -4478,6 +5826,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -4578,6 +5930,10 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -4611,6 +5967,14 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gaxios@7.1.3: + resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} + engines: {node: '>=18'} + + gcp-metadata@8.1.2: + resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} + engines: {node: '>=18'} + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -4627,6 +5991,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -4650,6 +6018,10 @@ packages: get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4689,6 +6061,14 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + google-auth-library@10.5.0: + resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} + engines: {node: '>=18'} + + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} + engines: {node: '>=14'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -4700,6 +6080,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + gtoken@8.0.0: + resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} + engines: {node: '>=18'} + happy-dom@20.5.0: resolution: {integrity: sha512-VQe+Q5CYiGOgcCERXhcfNsbnrN92FDEKciMH/x6LppU9dd0j4aTjCTlqONFOIMcAm/5JxS3+utowbXV1OoFr+g==} engines: {node: '>=20.0.0'} @@ -4735,6 +6119,33 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} @@ -4757,6 +6168,12 @@ packages: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} @@ -4774,6 +6191,10 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -4839,6 +6260,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + inquirer@13.2.4: resolution: {integrity: sha512-7JJ8+lGhGtJOeVnrH4IqP7mQgOqvHkKS6DNLTkMHEI3iHKzZUaidOivU9q8wrlSRvT0ISCBMweMK7TWYzr5BhA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} @@ -4859,6 +6283,10 @@ packages: resolution: {integrity: sha512-VI5tMCdeoxZWU5vjHWsiE/Su76JGhBvWF1MJnV9ZtGltHk9BmD48oDq8Tj8haZ85aceXZMxLNDQZRVo5QKNgXA==} engines: {node: '>=12.22.0'} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4867,6 +6295,12 @@ packages: resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} engines: {node: '>= 10'} + 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'} @@ -4909,6 +6343,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'} @@ -4933,6 +6370,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-immutable-type@5.0.1: resolution: {integrity: sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==} peerDependencies: @@ -4951,6 +6391,10 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -4963,6 +6407,10 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} + 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'} @@ -5034,6 +6482,9 @@ packages: isomorphic-fetch@2.2.1: resolution: {integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==} + isomorphic.js@0.2.5: + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -5092,6 +6543,9 @@ packages: engines: {node: '>=6'} hasBin: true + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -5164,31 +6618,113 @@ packages: resolution: {integrity: sha512-ksNxfzIW77OcZ+QWSAPC7yDqUSaIVwkTWnTPNiIy//vifNbwsSgQ57OkkncHxxpcBHM3LRfLAZVEh7kjq5twVA==} engines: {node: '>=20.0.0'} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lexical@0.22.0: + resolution: {integrity: sha512-EquENoJZdhwAzsZ+Dz8dGZprlpPY1zez6Gk9yhGkPzmIVPRIGY4aEAmfKQCep1dZgkUUQB8Flr0xK0+u5TrFhw==} + + lexical@0.40.0: + resolution: {integrity: sha512-wNvd/AY13h/QJYvx565M/FSdRjy0l99W5/MFA2x+mbK3KnKa5BifZbHZ1J4/YssCkdyZhSlLwFkyDaYi7l2Dsw==} + + lib0@0.2.117: + resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} + engines: {node: '>=16'} + hasBin: true + + libphonenumber-js@1.12.36: + resolution: {integrity: sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + light-my-request@6.6.0: + resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - leac@0.6.0: - resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - lexical@0.40.0: - resolution: {integrity: sha512-wNvd/AY13h/QJYvx565M/FSdRjy0l99W5/MFA2x+mbK3KnKa5BifZbHZ1J4/YssCkdyZhSlLwFkyDaYi7l2Dsw==} + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - libphonenumber-js@1.12.36: - resolution: {integrity: sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==} + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] - light-my-request@6.6.0: - resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + engines: {node: '>= 12.0.0'} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -5279,6 +6815,12 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + 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 @@ -5297,6 +6839,15 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lucide-react@0.564.0: + resolution: {integrity: sha512-JJ8GVTQqFwuliifD48U6+h7DXEHdkhJ/E87kksGByII3qHxtPciVb8T8woQONHBQgHVOl7rSMrrip3SeVNy7Fg==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + luxon@3.6.1: resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} engines: {node: '>=12'} @@ -5333,6 +6884,9 @@ packages: resolution: {integrity: sha512-PwDvwt/tK70+luLw5k9ySLtzLAzwf7tZTY9GBj63Y010nHRPjwHcQTpTd5JwQqITC2ty7prtxBo71iwyYY0TAg==} engines: {node: '>=20'} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked@17.0.1: resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} engines: {node: '>= 20'} @@ -5342,6 +6896,51 @@ packages: 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.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + 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==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -5367,6 +6966,119 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3: + resolution: {integrity: sha512-gSPnxgHDDqXYOBvQRq6lerrq9mjDhdtKn+7XETuXjxWcL62yZEfUdA28Ml1I2vDIPfAOIKLa0h2XDSGkInGHFQ==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-cjk-friendly-util@2.1.1: + resolution: {integrity: sha512-egs6+12JU2yutskHY55FyR48ZiEcFOJFyk9rsiyIhcJ6IvWB6ABBqVrBw8IobqJTDZ/wdSr9eoXDPb5S2nW1bg==} + engines: {node: '>=16'} + peerDependencies: + micromark-util-types: '*' + peerDependenciesMeta: + micromark-util-types: + optional: true + + micromark-extension-cjk-friendly@1.2.3: + resolution: {integrity: sha512-gRzVLUdjXBLX6zNPSnHGDoo+ZTp5zy+MZm0g3sv+3chPXY7l9gW+DnrcHcZh/jiPR6MjPKO4AEJNp4Aw6V9z5Q==} + engines: {node: '>=16'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true + + 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'} @@ -5594,6 +7306,10 @@ packages: '@nestjs/swagger': optional: true + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + new-find-package-json@2.0.0: resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} engines: {node: '>=12.22.0'} @@ -5601,12 +7317,21 @@ packages: node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} node-fetch@1.7.3: resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} @@ -5681,6 +7406,24 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + openai@6.10.0: + resolution: {integrity: sha512-ITxOGo7rO3XRMiKA5l7tQ43iNNu+iXGFAcf2t+aWVzzqRaS0i7m1K2BhxNdaveB+5eENhO0VY1FkiZzhBk4v3A==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: 4.3.6 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + openai@6.16.0: resolution: {integrity: sha512-fZ1uBqjFUjXzbGc35fFtYKEOxd20kd9fDpFeqWtsOZWiubY8CZ1NAlXHW3iathaFvqmNtCWMIsosCuyeI7Joxg==} hasBin: true @@ -5729,10 +7472,22 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-retry@7.1.1: + resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} + engines: {node: '>=20'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -5750,10 +7505,16 @@ packages: resolution: {integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==} engines: {node: '>=0.10.0'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} @@ -5761,6 +7522,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + partial-json@0.1.7: + resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5867,6 +7631,10 @@ packages: engines: {node: '>=14'} hasBin: true + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5879,10 +7647,21 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -5938,14 +7717,64 @@ packages: peerDependencies: react: ^19.2.4 + react-error-boundary@3.1.4: + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} + peerDependencies: + react: '>=16.13.1' + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-promise-suspense@0.3.4: resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} - react@19.2.3: - resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-router@7.13.0: + resolution: {integrity: sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} readable-stream@2.3.8: @@ -5983,6 +7812,15 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexp-ast-analysis@0.7.1: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -5999,6 +7837,50 @@ packages: resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true + rehype-harden@1.1.8: + resolution: {integrity: sha512-Qn7vR1xrf6fZCrkm9TDWi/AB4ylrHy+jqsNm1EHOAmbARYA6gsnVJBq/sdBh6kmT4NEZxH5vgIjrscefJAOXcw==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + remark-cjk-friendly-gfm-strikethrough@1.2.3: + resolution: {integrity: sha512-bXfMZtsaomK6ysNN/UGRIcasQAYkC10NtPmP0oOHOV8YOhA2TXmwRXCku4qOzjIFxAPfish5+XS0eIug2PzNZA==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + + remark-cjk-friendly@1.2.3: + resolution: {integrity: sha512-UvAgxwlNk+l9Oqgl/9MWK2eWRS7zgBW/nXX9AthV7nd/3lNejF138E7Xbmk9Zs4WjTJGs721r7fAEc7tNFoH7g==} + engines: {node: '>=16'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + + 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==} + + remend@1.2.0: + resolution: {integrity: sha512-NbKrdWweTRuByPYErzQCNpNtsR9M1QQ0hK2UzmnmlSaEqHnkQ5Korlyi8KpdbOJ0rImJfRy4EAY0uDxYnL9Plw==} + remove-markdown@0.6.3: resolution: {integrity: sha512-Qvp2p0Q1irE7AaJO7QemJe04HdObHylJrG+q4hszvPlYp7q4EvfINpEIaIEFdB+3XTDp1h6fiyT60ae00gmRow==} @@ -6216,6 +8098,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@3.22.0: + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -6261,6 +8146,10 @@ packages: resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + snakecase-keys@9.0.2: resolution: {integrity: sha512-Tr4gONsDj1Pa6HJH9D3b411r6tuRyCGgb1l7YpzDFp/thjVSWs7rcbNjyTyRqJi5SUV23sFpzf9epIJRbLR6Yw==} engines: {node: '>=22'} @@ -6268,6 +8157,10 @@ packages: socket.io-adapter@2.5.6: resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + socket.io-parser@4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} @@ -6280,6 +8173,14 @@ packages: resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} engines: {node: '>=10.2.0'} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sort-keys-length@1.0.1: resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} engines: {node: '>=0.10.0'} @@ -6309,6 +8210,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} @@ -6340,6 +8244,11 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + streamdown@2.2.0: + resolution: {integrity: sha512-Y51o1I/sjpAy4Yn7j7R4TbUl9gcUZ7BTrHS+68IhrUBoYpNQZ28z06vww1MBFu4mSwvgF8xQIxIH2b9S9IHDyQ==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} @@ -6395,6 +8304,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'} @@ -6418,10 +8330,19 @@ packages: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + strtok3@10.3.4: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} engines: {node: '>=18'} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} @@ -6453,6 +8374,12 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + + tailwindcss@4.2.0: + resolution: {integrity: sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q==} + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -6535,6 +8462,12 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + 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-algebra@2.0.0: resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} @@ -6619,6 +8552,9 @@ packages: resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} engines: {node: '>= 6.0.0'} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6705,9 +8641,31 @@ packages: resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} engines: {node: '>=20.18.1'} + undici@7.22.0: + resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} + engines: {node: '>=20.18.1'} + unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + 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.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -6747,6 +8705,26 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -6773,11 +8751,60 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-tsconfig-paths@6.0.5: resolution: {integrity: sha512-f/WvY6ekHykUF1rWJUAbCU7iS/5QYDIugwpqJA+ttwKbxSbzNlqlE8vZSrsnxNQciUW+z6lvhlXMaEyZn9MSig==} peerDependencies: vite: '*' + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6859,6 +8886,13 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -6986,6 +9020,10 @@ packages: utf-8-validate: optional: true + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + xss@1.0.15: resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} engines: {node: '>= 0.10.0'} @@ -7022,6 +9060,10 @@ packages: resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} engines: {node: '>=12'} + yjs@13.6.29: + resolution: {integrity: sha512-kHqDPdltoXH+X4w1lVmMtddE3Oeqq48nM40FD5ojTd8xYhQpzIDcfE2keMSU5bAgRPJBe225WTUdyUgj1DtbiQ==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -7040,6 +9082,11 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + peerDependencies: + zod: 4.3.6 + zod-validation-error@3.5.4: resolution: {integrity: sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw==} engines: {node: '>=18.0.0'} @@ -7052,6 +9099,27 @@ packages: zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zustand@5.0.11: + resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@algolia/abtesting@1.13.0': @@ -7203,6 +9271,492 @@ snapshots: optionalDependencies: zod: 4.3.6 + '@anthropic-ai/sdk@0.73.0(zod@4.3.6)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.3.6 + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-bedrock-runtime@3.991.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.10 + '@aws-sdk/credential-provider-node': 3.972.9 + '@aws-sdk/eventstream-handler-node': 3.972.5 + '@aws-sdk/middleware-eventstream': 3.972.3 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.10 + '@aws-sdk/middleware-websocket': 3.972.6 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/token-providers': 3.991.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.991.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.8 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.0 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/eventstream-serde-config-resolver': 4.3.8 + '@smithy/eventstream-serde-node': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.12 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.990.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.10 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.10 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.990.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.8 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.973.10': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/xml-builder': 3.972.4 + '@smithy/core': 3.23.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.8': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.10': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/types': 3.973.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.10 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.12 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.972.8': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/credential-provider-env': 3.972.8 + '@aws-sdk/credential-provider-http': 3.972.10 + '@aws-sdk/credential-provider-login': 3.972.8 + '@aws-sdk/credential-provider-process': 3.972.8 + '@aws-sdk/credential-provider-sso': 3.972.8 + '@aws-sdk/credential-provider-web-identity': 3.972.8 + '@aws-sdk/nested-clients': 3.990.0 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-login@3.972.8': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/nested-clients': 3.990.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.972.9': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.8 + '@aws-sdk/credential-provider-http': 3.972.10 + '@aws-sdk/credential-provider-ini': 3.972.8 + '@aws-sdk/credential-provider-process': 3.972.8 + '@aws-sdk/credential-provider-sso': 3.972.8 + '@aws-sdk/credential-provider-web-identity': 3.972.8 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.972.8': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.972.8': + dependencies: + '@aws-sdk/client-sso': 3.990.0 + '@aws-sdk/core': 3.973.10 + '@aws-sdk/token-providers': 3.990.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.972.8': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/nested-clients': 3.990.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/eventstream-handler-node@3.972.5': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/eventstream-codec': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-eventstream@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.972.10': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.990.0 + '@smithy/core': 3.23.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-websocket@3.972.6': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-format-url': 3.972.3 + '@smithy/eventstream-codec': 4.2.8 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.990.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.10 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.10 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.990.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.8 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/nested-clients@3.991.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.10 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.10 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.991.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.8 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-retry': 4.4.31 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.30 + '@smithy/util-defaults-mode-node': 4.2.33 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/config-resolver': 4.4.6 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.990.0': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/nested-clients': 3.990.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/token-providers@3.991.0': + dependencies: + '@aws-sdk/core': 3.973.10 + '@aws-sdk/nested-clients': 3.991.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.973.1': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.990.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.991.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + + '@aws-sdk/util-format-url@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.965.4': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + bowser: 2.14.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.972.8': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.10 + '@aws-sdk/types': 3.973.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.4': + dependencies: + '@smithy/types': 4.12.0 + fast-xml-parser: 5.3.4 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.3': {} + '@babel/code-frame@7.28.6': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -7372,6 +9926,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -7431,14 +9995,14 @@ snapshots: nanostores: 1.1.0 zod: 4.3.6 - '@better-auth/passkey@1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-auth@1.4.18(mongodb@6.12.0)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)))(better-call@1.1.8(zod@4.3.6))(nanostores@1.1.0)': + '@better-auth/passkey@1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-auth@1.4.18(mongodb@6.12.0(socks@2.8.7))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)))(better-call@1.1.8(zod@4.3.6))(nanostores@1.1.0)': dependencies: '@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 '@simplewebauthn/browser': 13.2.2 '@simplewebauthn/server': 13.2.2 - better-auth: 1.4.18(mongodb@6.12.0)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)) + better-auth: 1.4.18(mongodb@6.12.0(socks@2.8.7))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)) better-call: 1.1.8(zod@4.3.6) nanostores: 1.1.0 zod: 4.3.6 @@ -7515,156 +10079,234 @@ snapshots: '@epic-web/invariant@1.0.0': {} + '@esbuild/aix-ppc64@0.25.12': + optional: true + '@esbuild/aix-ppc64@0.27.0': optional: true '@esbuild/aix-ppc64@0.27.2': optional: true + '@esbuild/android-arm64@0.25.12': + optional: true + '@esbuild/android-arm64@0.27.0': optional: true '@esbuild/android-arm64@0.27.2': optional: true + '@esbuild/android-arm@0.25.12': + optional: true + '@esbuild/android-arm@0.27.0': optional: true '@esbuild/android-arm@0.27.2': optional: true + '@esbuild/android-x64@0.25.12': + optional: true + '@esbuild/android-x64@0.27.0': optional: true '@esbuild/android-x64@0.27.2': optional: true + '@esbuild/darwin-arm64@0.25.12': + optional: true + '@esbuild/darwin-arm64@0.27.0': optional: true '@esbuild/darwin-arm64@0.27.2': optional: true + '@esbuild/darwin-x64@0.25.12': + optional: true + '@esbuild/darwin-x64@0.27.0': optional: true '@esbuild/darwin-x64@0.27.2': optional: true + '@esbuild/freebsd-arm64@0.25.12': + optional: true + '@esbuild/freebsd-arm64@0.27.0': optional: true '@esbuild/freebsd-arm64@0.27.2': optional: true + '@esbuild/freebsd-x64@0.25.12': + optional: true + '@esbuild/freebsd-x64@0.27.0': optional: true '@esbuild/freebsd-x64@0.27.2': optional: true + '@esbuild/linux-arm64@0.25.12': + optional: true + '@esbuild/linux-arm64@0.27.0': optional: true '@esbuild/linux-arm64@0.27.2': optional: true + '@esbuild/linux-arm@0.25.12': + optional: true + '@esbuild/linux-arm@0.27.0': optional: true '@esbuild/linux-arm@0.27.2': optional: true + '@esbuild/linux-ia32@0.25.12': + optional: true + '@esbuild/linux-ia32@0.27.0': optional: true '@esbuild/linux-ia32@0.27.2': optional: true + '@esbuild/linux-loong64@0.25.12': + optional: true + '@esbuild/linux-loong64@0.27.0': optional: true '@esbuild/linux-loong64@0.27.2': optional: true + '@esbuild/linux-mips64el@0.25.12': + optional: true + '@esbuild/linux-mips64el@0.27.0': optional: true '@esbuild/linux-mips64el@0.27.2': optional: true + '@esbuild/linux-ppc64@0.25.12': + optional: true + '@esbuild/linux-ppc64@0.27.0': optional: true '@esbuild/linux-ppc64@0.27.2': optional: true + '@esbuild/linux-riscv64@0.25.12': + optional: true + '@esbuild/linux-riscv64@0.27.0': optional: true '@esbuild/linux-riscv64@0.27.2': optional: true + '@esbuild/linux-s390x@0.25.12': + optional: true + '@esbuild/linux-s390x@0.27.0': optional: true '@esbuild/linux-s390x@0.27.2': optional: true + '@esbuild/linux-x64@0.25.12': + optional: true + '@esbuild/linux-x64@0.27.0': optional: true '@esbuild/linux-x64@0.27.2': optional: true + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-arm64@0.27.0': optional: true '@esbuild/netbsd-arm64@0.27.2': optional: true + '@esbuild/netbsd-x64@0.25.12': + optional: true + '@esbuild/netbsd-x64@0.27.0': optional: true '@esbuild/netbsd-x64@0.27.2': optional: true + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-arm64@0.27.0': optional: true '@esbuild/openbsd-arm64@0.27.2': optional: true + '@esbuild/openbsd-x64@0.25.12': + optional: true + '@esbuild/openbsd-x64@0.27.0': optional: true '@esbuild/openbsd-x64@0.27.2': optional: true + '@esbuild/openharmony-arm64@0.25.12': + optional: true + '@esbuild/openharmony-arm64@0.27.0': optional: true '@esbuild/openharmony-arm64@0.27.2': optional: true + '@esbuild/sunos-x64@0.25.12': + optional: true + '@esbuild/sunos-x64@0.27.0': optional: true '@esbuild/sunos-x64@0.27.2': optional: true + '@esbuild/win32-arm64@0.25.12': + optional: true + '@esbuild/win32-arm64@0.27.0': optional: true '@esbuild/win32-arm64@0.27.2': optional: true + '@esbuild/win32-ia32@0.25.12': + optional: true + '@esbuild/win32-ia32@0.27.0': optional: true '@esbuild/win32-ia32@0.27.2': optional: true + '@esbuild/win32-x64@0.25.12': + optional: true + '@esbuild/win32-x64@0.27.0': optional: true @@ -7859,6 +10501,34 @@ snapshots: fastq: 1.20.1 glob: 13.0.0 + '@floating-ui/core@1.7.4': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.5': + dependencies: + '@floating-ui/core': 1.7.4 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/dom': 1.7.5 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@floating-ui/utils@0.2.10': {} + + '@google/genai@1.41.0': + dependencies: + google-auth-library: 10.5.0 + p-retry: 7.1.1 + protobufjs: 7.5.4 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@hexagon/base64@1.1.28': {} '@humanfs/core@0.19.1': {} @@ -8321,6 +10991,14 @@ snapshots: '@levischuck/tiny-cbor@0.2.11': {} + '@lexical/clipboard@0.22.0': + dependencies: + '@lexical/html': 0.22.0 + '@lexical/list': 0.22.0 + '@lexical/selection': 0.22.0 + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + '@lexical/clipboard@0.40.0': dependencies: '@lexical/html': 0.40.0 @@ -8329,6 +11007,27 @@ snapshots: '@lexical/utils': 0.40.0 lexical: 0.40.0 + '@lexical/code@0.22.0': + dependencies: + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + prismjs: 1.30.0 + + '@lexical/devtools-core@0.22.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@lexical/html': 0.22.0 + '@lexical/link': 0.22.0 + '@lexical/mark': 0.22.0 + '@lexical/table': 0.22.0 + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@lexical/dragon@0.22.0': + dependencies: + lexical: 0.22.0 + '@lexical/dragon@0.40.0': dependencies: '@lexical/extension': 0.40.0 @@ -8340,6 +11039,11 @@ snapshots: '@preact/signals-core': 1.13.0 lexical: 0.40.0 + '@lexical/hashtag@0.22.0': + dependencies: + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + '@lexical/headless@0.40.0': dependencies: happy-dom: 20.5.0 @@ -8348,18 +11052,39 @@ snapshots: - bufferutil - utf-8-validate + '@lexical/history@0.22.0': + dependencies: + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + + '@lexical/html@0.22.0': + dependencies: + '@lexical/selection': 0.22.0 + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + '@lexical/html@0.40.0': dependencies: '@lexical/selection': 0.40.0 '@lexical/utils': 0.40.0 lexical: 0.40.0 + '@lexical/link@0.22.0': + dependencies: + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + '@lexical/link@0.40.0': dependencies: '@lexical/extension': 0.40.0 '@lexical/utils': 0.40.0 lexical: 0.40.0 + '@lexical/list@0.22.0': + dependencies: + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + '@lexical/list@0.40.0': dependencies: '@lexical/extension': 0.40.0 @@ -8367,6 +11092,70 @@ snapshots: '@lexical/utils': 0.40.0 lexical: 0.40.0 + '@lexical/mark@0.22.0': + dependencies: + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + + '@lexical/markdown@0.22.0': + dependencies: + '@lexical/code': 0.22.0 + '@lexical/link': 0.22.0 + '@lexical/list': 0.22.0 + '@lexical/rich-text': 0.22.0 + '@lexical/text': 0.22.0 + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + + '@lexical/offset@0.22.0': + dependencies: + lexical: 0.22.0 + + '@lexical/overflow@0.22.0': + dependencies: + lexical: 0.22.0 + + '@lexical/plain-text@0.22.0': + dependencies: + '@lexical/clipboard': 0.22.0 + '@lexical/selection': 0.22.0 + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + + '@lexical/react@0.22.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(yjs@13.6.29)': + dependencies: + '@lexical/clipboard': 0.22.0 + '@lexical/code': 0.22.0 + '@lexical/devtools-core': 0.22.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@lexical/dragon': 0.22.0 + '@lexical/hashtag': 0.22.0 + '@lexical/history': 0.22.0 + '@lexical/link': 0.22.0 + '@lexical/list': 0.22.0 + '@lexical/mark': 0.22.0 + '@lexical/markdown': 0.22.0 + '@lexical/overflow': 0.22.0 + '@lexical/plain-text': 0.22.0 + '@lexical/rich-text': 0.22.0 + '@lexical/selection': 0.22.0 + '@lexical/table': 0.22.0 + '@lexical/text': 0.22.0 + '@lexical/utils': 0.22.0 + '@lexical/yjs': 0.22.0(yjs@13.6.29) + lexical: 0.22.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-error-boundary: 3.1.4(react@19.2.4) + transitivePeerDependencies: + - yjs + + '@lexical/rich-text@0.22.0': + dependencies: + '@lexical/clipboard': 0.22.0 + '@lexical/selection': 0.22.0 + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + '@lexical/rich-text@0.40.0': dependencies: '@lexical/clipboard': 0.40.0 @@ -8375,15 +11164,43 @@ snapshots: '@lexical/utils': 0.40.0 lexical: 0.40.0 + '@lexical/selection@0.22.0': + dependencies: + lexical: 0.22.0 + '@lexical/selection@0.40.0': dependencies: lexical: 0.40.0 + '@lexical/table@0.22.0': + dependencies: + '@lexical/clipboard': 0.22.0 + '@lexical/utils': 0.22.0 + lexical: 0.22.0 + + '@lexical/text@0.22.0': + dependencies: + lexical: 0.22.0 + + '@lexical/utils@0.22.0': + dependencies: + '@lexical/list': 0.22.0 + '@lexical/selection': 0.22.0 + '@lexical/table': 0.22.0 + lexical: 0.22.0 + '@lexical/utils@0.40.0': dependencies: '@lexical/selection': 0.40.0 lexical: 0.40.0 + '@lexical/yjs@0.22.0(yjs@13.6.29)': + dependencies: + '@lexical/offset': 0.22.0 + '@lexical/selection': 0.22.0 + lexical: 0.22.0 + yjs: 13.6.29 + '@lobehub/eslint-config@2.1.5(@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/utils@8.55.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-plugin-eslint-comments': 4.6.0(eslint@10.0.0(jiti@2.6.1)) @@ -8419,7 +11236,48 @@ snapshots: '@lukeed/csprng@1.1.0': {} - '@lukeed/ms@2.0.2': {} + '@lukeed/ms@2.0.2': {} + + '@mariozechner/pi-agent-core@0.52.12(ws@8.18.3)(zod@4.3.6)': + dependencies: + '@mariozechner/pi-ai': 0.52.12(ws@8.18.3)(zod@4.3.6) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mariozechner/pi-ai@0.52.12(ws@8.18.3)(zod@4.3.6)': + dependencies: + '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) + '@aws-sdk/client-bedrock-runtime': 3.991.0 + '@google/genai': 1.41.0 + '@mistralai/mistralai': 1.10.0 + '@sinclair/typebox': 0.34.48 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + chalk: 5.6.2 + openai: 6.10.0(ws@8.18.3)(zod@4.3.6) + partial-json: 0.1.7 + proxy-agent: 6.5.0 + undici: 7.22.0 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mistralai/mistralai@1.10.0': + dependencies: + zod: 4.3.6 + zod-to-json-schema: 3.25.1(zod@4.3.6) '@mongodb-js/saslprep@1.4.6': dependencies: @@ -8861,16 +11719,337 @@ snapshots: oxc-parser: 0.74.0 optional: true + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@quansync/fs@1.0.0': dependencies: quansync: 1.0.0 - '@react-email/render@1.1.2(react-dom@19.2.4(react@19.2.3))(react@19.2.3)': + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/rect@1.1.1': {} + + '@react-email/render@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: html-to-text: 9.0.5 prettier: 3.8.1 - react: 19.2.3 - react-dom: 19.2.4(react@19.2.3) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) react-promise-suspense: 0.3.4 optional: true @@ -8902,130 +12081,471 @@ snapshots: '@rolldown/binding-linux-x64-gnu@1.0.0-rc.2': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.2': - optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.2': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.2': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.2': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.2': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.2': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rolldown/pluginutils@1.0.0-rc.2': {} + + '@rollup/pluginutils@5.3.0(rollup@4.55.3)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.55.3 + + '@rollup/rollup-android-arm-eabi@4.55.3': + optional: true + + '@rollup/rollup-android-arm64@4.55.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.55.3': + optional: true + + '@rollup/rollup-darwin-x64@4.55.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.55.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.55.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.55.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.55.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.55.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.55.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.55.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.55.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.55.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.55.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.55.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.55.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.55.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.55.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.55.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.55.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.55.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.55.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.55.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.3': + optional: true + + '@selderee/plugin-htmlparser2@0.11.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + optional: true + + '@shikijs/core@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/themes@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/types@3.22.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@simplewebauthn/browser@13.2.2': {} + + '@simplewebauthn/server@13.2.2': + dependencies: + '@hexagon/base64': 1.1.28 + '@levischuck/tiny-cbor': 0.2.11 + '@peculiar/asn1-android': 2.6.0 + '@peculiar/asn1-ecc': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/x509': 1.14.3 + + '@sinclair/typebox@0.34.48': {} + + '@sindresorhus/is@5.6.0': {} + + '@sindresorhus/is@7.2.0': {} + + '@smithy/abort-controller@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.6': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + + '@smithy/core@3.23.0': + dependencies: + '@smithy/middleware-serde': 4.2.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.12 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.2.8': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.2.8': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.2.8': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.8': + dependencies: + '@smithy/eventstream-codec': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.9': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rolldown/binding-openharmony-arm64@1.0.0-rc.2': - optional: true + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 - '@rolldown/binding-wasm32-wasi@1.0.0-rc.2': + '@smithy/is-array-buffer@4.2.0': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true + tslib: 2.8.1 - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.2': - optional: true + '@smithy/middleware-content-length@4.2.8': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.2': - optional: true + '@smithy/middleware-endpoint@4.4.14': + dependencies: + '@smithy/core': 3.23.0 + '@smithy/middleware-serde': 4.2.9 + '@smithy/node-config-provider': 4.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 - '@rolldown/pluginutils@1.0.0-rc.2': {} + '@smithy/middleware-retry@4.4.31': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/service-error-classification': 4.2.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 - '@rollup/pluginutils@5.3.0(rollup@4.55.3)': + '@smithy/middleware-serde@4.2.9': dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.55.3 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-android-arm-eabi@4.55.3': - optional: true + '@smithy/middleware-stack@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-android-arm64@4.55.3': - optional: true + '@smithy/node-config-provider@4.3.8': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-darwin-arm64@4.55.3': - optional: true + '@smithy/node-http-handler@4.4.10': + dependencies: + '@smithy/abort-controller': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-darwin-x64@4.55.3': - optional: true + '@smithy/property-provider@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-freebsd-arm64@4.55.3': - optional: true + '@smithy/protocol-http@5.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-freebsd-x64@4.55.3': - optional: true + '@smithy/querystring-builder@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 - '@rollup/rollup-linux-arm-gnueabihf@4.55.3': - optional: true + '@smithy/querystring-parser@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-linux-arm-musleabihf@4.55.3': - optional: true + '@smithy/service-error-classification@4.2.8': + dependencies: + '@smithy/types': 4.12.0 - '@rollup/rollup-linux-arm64-gnu@4.55.3': - optional: true + '@smithy/shared-ini-file-loader@4.4.3': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-linux-arm64-musl@4.55.3': - optional: true + '@smithy/signature-v4@5.3.8': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@rollup/rollup-linux-loong64-gnu@4.55.3': - optional: true + '@smithy/smithy-client@4.11.3': + dependencies: + '@smithy/core': 3.23.0 + '@smithy/middleware-endpoint': 4.4.14 + '@smithy/middleware-stack': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.12 + tslib: 2.8.1 - '@rollup/rollup-linux-loong64-musl@4.55.3': - optional: true + '@smithy/types@4.12.0': + dependencies: + tslib: 2.8.1 - '@rollup/rollup-linux-ppc64-gnu@4.55.3': - optional: true + '@smithy/url-parser@4.2.8': + dependencies: + '@smithy/querystring-parser': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-linux-ppc64-musl@4.55.3': - optional: true + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@rollup/rollup-linux-riscv64-gnu@4.55.3': - optional: true + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 - '@rollup/rollup-linux-riscv64-musl@4.55.3': - optional: true + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 - '@rollup/rollup-linux-s390x-gnu@4.55.3': - optional: true + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 - '@rollup/rollup-linux-x64-gnu@4.55.3': - optional: true + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 - '@rollup/rollup-linux-x64-musl@4.55.3': - optional: true + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 - '@rollup/rollup-openbsd-x64@4.55.3': - optional: true + '@smithy/util-defaults-mode-browser@4.3.30': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-openharmony-arm64@4.55.3': - optional: true + '@smithy/util-defaults-mode-node@4.2.33': + dependencies: + '@smithy/config-resolver': 4.4.6 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-win32-arm64-msvc@4.55.3': - optional: true + '@smithy/util-endpoints@3.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-win32-ia32-msvc@4.55.3': - optional: true + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 - '@rollup/rollup-win32-x64-gnu@4.55.3': - optional: true + '@smithy/util-middleware@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@rollup/rollup-win32-x64-msvc@4.55.3': - optional: true + '@smithy/util-retry@4.2.8': + dependencies: + '@smithy/service-error-classification': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@selderee/plugin-htmlparser2@0.11.0': + '@smithy/util-stream@4.5.12': dependencies: - domhandler: 5.0.3 - selderee: 0.11.0 - optional: true + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.10 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@simplewebauthn/browser@13.2.2': {} + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 - '@simplewebauthn/server@13.2.2': + '@smithy/util-utf8@2.3.0': dependencies: - '@hexagon/base64': 1.1.28 - '@levischuck/tiny-cbor': 0.2.11 - '@peculiar/asn1-android': 2.6.0 - '@peculiar/asn1-ecc': 2.6.0 - '@peculiar/asn1-rsa': 2.6.0 - '@peculiar/asn1-schema': 2.6.0 - '@peculiar/asn1-x509': 2.6.0 - '@peculiar/x509': 1.14.3 + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 - '@sindresorhus/is@5.6.0': {} + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 - '@sindresorhus/is@7.2.0': {} + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 '@socket.io/component-emitter@3.1.2': {} @@ -9052,6 +12572,23 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@streamdown/cjk@1.0.2(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.4)(unified@11.0.5)': + dependencies: + react: 19.2.4 + remark-cjk-friendly: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-cjk-friendly-gfm-strikethrough: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + unist-util-visit: 5.1.0 + transitivePeerDependencies: + - '@types/mdast' + - micromark + - micromark-util-types + - unified + + '@streamdown/code@1.0.2(react@19.2.4)': + dependencies: + react: 19.2.4 + shiki: 3.22.0 + '@swc/cli@0.7.10(@swc/core@1.15.11)(chokidar@4.0.3)': dependencies: '@swc/core': 1.15.11 @@ -9127,6 +12664,74 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tailwindcss/node@4.2.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.19.0 + jiti: 2.6.1 + lightningcss: 1.31.1 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.0 + + '@tailwindcss/oxide-android-arm64@4.2.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.0': + optional: true + + '@tailwindcss/oxide@4.2.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.0 + '@tailwindcss/oxide-darwin-arm64': 4.2.0 + '@tailwindcss/oxide-darwin-x64': 4.2.0 + '@tailwindcss/oxide-freebsd-x64': 4.2.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.0 + '@tailwindcss/oxide-linux-x64-musl': 4.2.0 + '@tailwindcss/oxide-wasm32-wasi': 4.2.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.0 + + '@tailwindcss/vite@4.2.0(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.2.0 + '@tailwindcss/oxide': 4.2.0 + tailwindcss: 4.2.0 + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) + '@tokenizer/inflate@0.2.7': dependencies: debug: 4.4.3 @@ -9144,6 +12749,8 @@ snapshots: '@tokenizer/token@0.3.0': {} + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -9157,17 +12764,17 @@ snapshots: tslib: 2.8.1 optional: true - '@typegoose/auto-increment@5.0.1(mongoose@9.1.6)': + '@typegoose/auto-increment@5.0.1(mongoose@9.1.6(socks@2.8.7))': dependencies: loglevel: 1.9.2 - mongoose: 9.1.6 + mongoose: 9.1.6(socks@2.8.7) tslib: 2.8.1 - '@typegoose/typegoose@13.1.0(mongoose@9.1.6)': + '@typegoose/typegoose@13.1.0(mongoose@9.1.6(socks@2.8.7))': dependencies: lodash: 4.17.21 loglevel: 1.9.2 - mongoose: 9.1.6 + mongoose: 9.1.6(socks@2.8.7) reflect-metadata: 0.2.2 semver: 7.7.3 tslib: 2.8.1 @@ -9213,6 +12820,10 @@ snapshots: dependencies: '@types/node': 25.0.10 + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} '@types/diff-match-patch@1.0.36': {} @@ -9231,6 +12842,10 @@ snapshots: '@types/esrecurse@4.3.1': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.1.0': @@ -9251,6 +12866,10 @@ snapshots: '@types/chroma-js': 3.1.1 '@types/node': 25.0.10 + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/http-cache-semantics@4.0.4': {} '@types/http-errors@2.0.5': {} @@ -9270,6 +12889,10 @@ snapshots: '@types/luxon@3.7.1': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/mime-types@3.0.1': {} '@types/ms@2.1.0': {} @@ -9290,6 +12913,14 @@ snapshots: '@types/range-parser@1.2.7': {} + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + '@types/remove-markdown@0.3.4': {} '@types/semver@7.7.1': {} @@ -9305,6 +12936,10 @@ snapshots: '@types/ua-parser-js@0.7.39': {} + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/validator@13.15.10': {} '@types/webidl-conversions@7.0.3': {} @@ -9415,6 +13050,8 @@ snapshots: '@typescript-eslint/types': 8.55.0 eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -9474,7 +13111,19 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.6) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -9486,7 +13135,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) '@vitest/expect@4.0.18': dependencies: @@ -9497,13 +13146,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) '@vitest/pretty-format@4.0.18': dependencies: @@ -9801,6 +13450,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -9880,6 +13533,10 @@ snapshots: ast-types-flow@0.0.8: {} + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + ast-v8-to-istanbul@0.3.11: dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -9926,6 +13583,8 @@ snapshots: b4a@1.7.3: {} + bail@2.0.2: {} + balanced-match@1.0.2: {} bare-events@2.8.2: {} @@ -9936,9 +13595,11 @@ snapshots: baseline-browser-mapping@2.9.11: {} + basic-ftp@5.1.0: {} + bcryptjs@3.0.3: {} - better-auth@1.4.18(mongodb@6.12.0)(react-dom@19.2.4(react@19.2.3))(react@19.2.3)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)): + better-auth@1.4.18(mongodb@6.12.0(socks@2.8.7))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)): dependencies: '@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0) '@better-auth/telemetry': 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0)) @@ -9953,10 +13614,10 @@ snapshots: nanostores: 1.1.0 zod: 4.3.6 optionalDependencies: - mongodb: 6.12.0 - react: 19.2.3 - react-dom: 19.2.4(react@19.2.3) - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + mongodb: 6.12.0(socks@2.8.7) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) better-call@1.1.8(zod@4.3.6): dependencies: @@ -9967,6 +13628,8 @@ snapshots: optionalDependencies: zod: 4.3.6 + bignumber.js@9.3.1: {} + bin-version-check@5.1.0: dependencies: bin-version: 6.0.0 @@ -10011,6 +13674,8 @@ snapshots: boolbase@1.0.0: {} + bowser@2.14.1: {} + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -10100,6 +13765,8 @@ snapshots: caniuse-lite@1.0.30001761: {} + ccount@2.0.1: {} + chai@6.2.2: {} chalk@4.1.2: @@ -10107,8 +13774,18 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.2: {} + change-case@5.4.4: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chardet@2.1.1: {} chokidar@4.0.3: @@ -10130,6 +13807,10 @@ snapshots: validator: 13.15.26 optional: true + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -10159,6 +13840,8 @@ snapshots: clone@1.0.4: {} + clsx@2.1.1: {} + cluster-key-slot@1.1.2: {} color-convert@2.0.1: @@ -10173,6 +13856,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + commander@14.0.2: {} commander@2.20.3: {} @@ -10291,8 +13976,14 @@ snapshots: cssom@0.5.0: {} + csstype@3.2.3: {} + damerau-levenshtein@1.0.8: {} + data-uri-to-buffer@4.0.1: {} + + data-uri-to-buffer@6.0.2: {} + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -10325,6 +14016,10 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -10355,6 +14050,12 @@ snapshots: defu@6.1.4: {} + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delayed-stream@1.0.0: {} denque@2.1.0: {} @@ -10369,6 +14070,12 @@ snapshots: detect-libc@2.1.2: {} + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff-match-patch@1.0.5: {} diff-sequences@29.6.3: {} @@ -10447,6 +14154,18 @@ snapshots: dependencies: once: 1.4.0 + engine.io-client@6.6.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-parser: 5.2.3 + ws: 8.18.3 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + engine.io-parser@5.2.3: {} engine.io@6.6.5: @@ -10470,6 +14189,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.0 + enhanced-resolve@5.19.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + entities@4.5.0: {} entities@6.0.1: {} @@ -10589,6 +14313,35 @@ snapshots: es-toolkit@1.44.0: {} + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + esbuild@0.27.0: optionalDependencies: '@esbuild/aix-ppc64': 0.27.0 @@ -10657,6 +14410,14 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-config-prettier@9.1.2(eslint@10.0.0(jiti@2.6.1)): dependencies: eslint: 10.0.0(jiti@2.6.1) @@ -11009,6 +14770,8 @@ snapshots: estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -11092,6 +14855,8 @@ snapshots: ext-list: 2.2.2 sort-keys-length: 1.0.1 + extend@3.0.2: {} + extract-zip@2.0.1: dependencies: debug: 4.4.3 @@ -11152,6 +14917,10 @@ snapshots: dependencies: fast-string-width: 3.0.2 + fast-xml-parser@5.3.4: + dependencies: + strnum: 2.1.2 + fastify-plugin@5.0.1: {} fastify-plugin@5.1.0: {} @@ -11186,6 +14955,11 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + fflate@0.8.2: {} file-entry-cache@8.0.0: @@ -11313,6 +15087,10 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} fresh@0.5.2: {} @@ -11343,6 +15121,23 @@ snapshots: functions-have-names@1.2.3: {} + gaxios@7.1.3: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + rimraf: 5.0.10 + transitivePeerDependencies: + - supports-color + + gcp-metadata@8.1.2: + dependencies: + gaxios: 7.1.3 + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + generator-function@2.0.1: {} gensync@1.0.0-beta.2: {} @@ -11362,6 +15157,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-port@5.1.1: {} get-proto@1.0.1: @@ -11385,6 +15182,14 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: + dependencies: + basic-ftp: 5.1.0 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -11430,6 +15235,20 @@ snapshots: globrex@0.1.2: {} + google-auth-library@10.5.0: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.3 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + gtoken: 8.0.0 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + + google-logging-utils@1.1.3: {} + gopd@1.2.0: {} got@13.0.0: @@ -11448,6 +15267,13 @@ snapshots: graceful-fs@4.2.11: {} + gtoken@8.0.0: + dependencies: + gaxios: 7.1.3 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + happy-dom@20.5.0: dependencies: '@types/node': 25.0.10 @@ -11486,6 +15312,99 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + 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.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + hermes-estree@0.25.1: {} hermes-parser@0.25.1: @@ -11509,6 +15428,10 @@ snapshots: selderee: 0.11.0 optional: true + html-url-attributes@3.0.1: {} + + html-void-elements@3.0.0: {} + htmlparser2@10.0.0: dependencies: domelementtype: 2.3.0 @@ -11542,6 +15465,13 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -11598,6 +15528,8 @@ snapshots: inherits@2.0.4: {} + inline-style-parser@0.2.7: {} + inquirer@13.2.4(@types/node@25.0.10): dependencies: '@inquirer/ansi': 2.0.3 @@ -11634,10 +15566,19 @@ snapshots: transitivePeerDependencies: - supports-color + ip-address@10.1.0: {} + ipaddr.js@1.9.1: {} ipaddr.js@2.3.0: {} + 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 @@ -11688,6 +15629,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: @@ -11712,6 +15655,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-immutable-type@5.0.1(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): dependencies: '@typescript-eslint/type-utils': 8.55.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) @@ -11728,6 +15673,8 @@ snapshots: is-negative-zero@2.0.3: {} + is-network-error@1.3.0: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -11737,6 +15684,8 @@ snapshots: is-plain-obj@1.1.0: {} + is-plain-obj@4.1.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -11799,6 +15748,8 @@ snapshots: node-fetch: 1.7.3 whatwg-fetch: 3.6.20 + isomorphic.js@0.2.5: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -11841,8 +15792,7 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jiti@2.6.1: - optional: true + jiti@2.6.1: {} jose@6.1.3: {} @@ -11858,6 +15808,10 @@ snapshots: jsesc@3.1.0: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -11955,8 +15909,14 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lexical@0.22.0: {} + lexical@0.40.0: {} + lib0@0.2.117: + dependencies: + isomorphic.js: 0.2.5 + libphonenumber-js@1.12.36: optional: true @@ -11970,6 +15930,55 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.2 + lightningcss-android-arm64@1.31.1: + optional: true + + lightningcss-darwin-arm64@1.31.1: + optional: true + + lightningcss-darwin-x64@1.31.1: + optional: true + + lightningcss-freebsd-x64@1.31.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.31.1: + optional: true + + lightningcss-linux-arm64-gnu@1.31.1: + optional: true + + lightningcss-linux-arm64-musl@1.31.1: + optional: true + + lightningcss-linux-x64-gnu@1.31.1: + optional: true + + lightningcss-linux-x64-musl@1.31.1: + optional: true + + lightningcss-win32-arm64-msvc@1.31.1: + optional: true + + lightningcss-win32-x64-msvc@1.31.1: + optional: true + + lightningcss@1.31.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 + lines-and-columns@1.2.4: {} linkedom@0.18.12: @@ -12037,88 +16046,476 @@ snapshots: lodash.once@4.1.1: {} - lodash@4.17.21: {} + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.1.1 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + loglevel@1.9.2: {} + + long@5.3.2: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lowercase-keys@3.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.5: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@7.18.3: {} + + lucide-react@0.564.0(react@19.2.4): + dependencies: + react: 19.2.4 + + luxon@3.6.1: {} + + luxon@3.7.2: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.2: + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + + make-dir@3.1.0: + dependencies: + semver: 7.7.3 + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + + make-error@1.3.6: {} + + map-obj@5.0.2: {} + + map-obj@6.0.0: {} + + markdown-table@3.0.4: {} + + marked@17.0.1: {} + + 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.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.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.1 + + mdast-util-to-hast@13.2.1: + 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.1.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.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-typer@0.3.0: {} + + memfs@3.5.3: + dependencies: + fs-monkey: 1.1.0 + + memory-pager@1.5.0: {} + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.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-cjk-friendly-gfm-strikethrough@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + get-east-asian-width: 1.4.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly-util@2.1.1(micromark-util-types@2.0.2): + dependencies: + get-east-asian-width: 1.4.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 - log-symbols@4.1.0: + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 + 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 - log-update@6.1.0: + micromark-extension-gfm-footnote@2.1.0: dependencies: - ansi-escapes: 7.1.1 - cli-cursor: 5.0.0 - slice-ansi: 7.1.2 - strip-ansi: 7.1.2 - wrap-ansi: 9.0.2 + 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 - loglevel@1.9.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 - loose-envify@1.4.0: + micromark-extension-gfm-table@2.1.1: dependencies: - js-tokens: 4.0.0 + 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 - lowercase-keys@3.0.0: {} + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 - lru-cache@10.4.3: {} + 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 - lru-cache@11.2.5: {} + 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 - lru-cache@5.1.1: + micromark-factory-destination@2.0.1: dependencies: - yallist: 3.1.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - luxon@3.6.1: {} + 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 - luxon@3.7.2: {} + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - magic-string@0.30.17: + micromark-factory-title@2.0.1: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - magic-string@0.30.21: + micromark-factory-whitespace@2.0.1: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - magicast@0.5.2: + micromark-util-character@2.1.1: dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - source-map-js: 1.2.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - make-dir@3.1.0: + micromark-util-chunked@2.0.1: dependencies: - semver: 7.7.3 + micromark-util-symbol: 2.0.1 - make-dir@4.0.0: + micromark-util-classify-character@2.0.1: dependencies: - semver: 7.7.3 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - make-error@1.3.6: {} + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - map-obj@5.0.2: {} + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 - map-obj@6.0.0: {} + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - marked@17.0.1: {} + micromark-util-encode@2.0.1: {} - math-intrinsics@1.1.0: {} + micromark-util-html-tag-name@2.0.1: {} - media-typer@0.3.0: {} + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 - memfs@3.5.3: + micromark-util-resolve-all@2.0.1: dependencies: - fs-monkey: 1.1.0 + micromark-util-types: 2.0.2 - memory-pager@1.5.0: {} + 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 - merge-descriptors@1.0.3: {} + 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 - merge-stream@2.0.0: {} + micromark-util-symbol@2.0.1: {} - merge2@1.4.1: {} + micromark-util-types@2.0.2: {} - methods@1.1.2: {} + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.3.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: @@ -12193,7 +16590,7 @@ snapshots: '@types/whatwg-url': 11.0.5 whatwg-url: 14.1.1 - mongodb-memory-server-core@11.0.1: + mongodb-memory-server-core@11.0.1(socks@2.8.7): dependencies: async-mutex: 0.5.0 camelcase: 6.3.0 @@ -12201,7 +16598,7 @@ snapshots: find-cache-dir: 3.3.2 follow-redirects: 1.15.11(debug@4.4.3) https-proxy-agent: 7.0.6 - mongodb: 6.12.0 + mongodb: 6.12.0(socks@2.8.7) new-find-package-json: 2.0.0 semver: 7.7.3 tar-stream: 3.1.7 @@ -12219,9 +16616,9 @@ snapshots: - socks - supports-color - mongodb-memory-server@11.0.1: + mongodb-memory-server@11.0.1(socks@2.8.7): dependencies: - mongodb-memory-server-core: 11.0.1 + mongodb-memory-server-core: 11.0.1(socks@2.8.7) tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/credential-providers' @@ -12235,21 +16632,23 @@ snapshots: - socks - supports-color - mongodb@6.12.0: + mongodb@6.12.0(socks@2.8.7): dependencies: '@mongodb-js/saslprep': 1.4.6 bson: 6.10.4 mongodb-connection-string-url: 3.0.2 + optionalDependencies: + socks: 2.8.7 mongoose-aggregate-paginate-v2@1.1.4: {} - mongoose-autopopulate@1.2.1(mongoose@9.1.6): + mongoose-autopopulate@1.2.1(mongoose@9.1.6(socks@2.8.7)): dependencies: - mongoose: 9.1.6 + mongoose: 9.1.6(socks@2.8.7) - mongoose-lean-getters@2.3.1: + mongoose-lean-getters@2.3.1(socks@2.8.7): dependencies: - mongoose: 9.1.6 + mongoose: 9.1.6(socks@2.8.7) mpath: 0.9.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' @@ -12260,26 +16659,26 @@ snapshots: - snappy - socks - mongoose-lean-virtuals@1.1.1(mongoose@9.1.6): + mongoose-lean-virtuals@1.1.1(mongoose@9.1.6(socks@2.8.7)): dependencies: - mongoose: 9.1.6 + mongoose: 9.1.6(socks@2.8.7) mpath: 0.8.4 - mongoose-lean-virtuals@2.1.0(mongoose@9.1.6): + mongoose-lean-virtuals@2.1.0(mongoose@9.1.6(socks@2.8.7)): dependencies: - mongoose: 9.1.6 + mongoose: 9.1.6(socks@2.8.7) mpath: 0.8.4 - mongoose-paginate-v2@1.9.1(mongoose@9.1.6): + mongoose-paginate-v2@1.9.1(mongoose@9.1.6(socks@2.8.7)): dependencies: - mongoose-lean-virtuals: 1.1.1(mongoose@9.1.6) + mongoose-lean-virtuals: 1.1.1(mongoose@9.1.6(socks@2.8.7)) transitivePeerDependencies: - mongoose - mongoose@9.1.6: + mongoose@9.1.6(socks@2.8.7): dependencies: kareem: 3.0.0 - mongodb: 6.12.0 + mongodb: 6.12.0(socks@2.8.7) mpath: 0.9.0 mquery: 6.0.0 ms: 2.1.3 @@ -12332,6 +16731,8 @@ snapshots: rxjs: 7.8.2 zod: 4.3.6 + netmask@2.0.2: {} + new-find-package-json@2.0.0: dependencies: debug: 4.4.3 @@ -12340,6 +16741,8 @@ snapshots: node-abort-controller@3.1.1: {} + node-domexception@1.0.0: {} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 @@ -12349,6 +16752,12 @@ snapshots: encoding: 0.1.13 is-stream: 1.1.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-machine-id@1.1.12: {} node-releases@2.0.27: {} @@ -12423,6 +16832,19 @@ snapshots: dependencies: mimic-function: 5.0.1 + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + openai@6.10.0(ws@8.18.3)(zod@4.3.6): + optionalDependencies: + ws: 8.18.3 + zod: 4.3.6 + openai@6.16.0(ws@8.18.3)(zod@4.3.6): optionalDependencies: ws: 8.18.3 @@ -12494,8 +16916,30 @@ snapshots: dependencies: p-limit: 3.1.0 + p-retry@7.1.1: + dependencies: + is-network-error: 1.3.0 + p-try@2.2.0: {} + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + package-json-from-dist@1.0.1: {} package-manager-detector@1.3.0: {} @@ -12510,6 +16954,16 @@ snapshots: dependencies: author-regex: 1.0.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.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.28.6 @@ -12517,6 +16971,10 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parseley@0.12.1: dependencies: leac: 0.6.0 @@ -12525,6 +16983,8 @@ snapshots: parseurl@1.3.3: {} + partial-json@0.1.7: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -12612,6 +17072,8 @@ snapshots: prettier@3.8.1: {} + prismjs@1.30.0: {} + process-nextick-args@2.0.1: {} process-warning@4.0.1: {} @@ -12624,11 +17086,41 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@7.1.0: {} + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 25.0.10 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + proxy-from-env@1.1.0: {} pump@3.0.3: @@ -12673,11 +17165,15 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-dom@19.2.4(react@19.2.3): + react-dom@19.2.4(react@19.2.4): dependencies: - react: 19.2.3 + react: 19.2.4 scheduler: 0.27.0 - optional: true + + react-error-boundary@3.1.4(react@19.2.4): + dependencies: + '@babel/runtime': 7.28.6 + react: 19.2.4 react-is@16.13.1: {} @@ -12686,8 +17182,44 @@ snapshots: fast-deep-equal: 2.0.1 optional: true - react@19.2.3: - optional: true + react-refresh@0.17.0: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + + react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + cookie: 1.1.1 + react: 19.2.4 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.4(react@19.2.4) + + react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + get-nonce: 1.0.1 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + react@19.2.4: {} readable-stream@2.3.8: dependencies: @@ -12750,6 +17282,16 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + regexp-ast-analysis@0.7.1: dependencies: '@eslint-community/regexpp': 4.12.2 @@ -12770,18 +17312,89 @@ snapshots: dependencies: jsesc: 3.1.0 + rehype-harden@1.1.8: + dependencies: + unist-util-visit: 5.1.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + + remark-cjk-friendly-gfm-strikethrough@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + dependencies: + micromark-extension-cjk-friendly-gfm-strikethrough: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + + remark-cjk-friendly@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + dependencies: + micromark-extension-cjk-friendly: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + + 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.1 + 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 + + remend@1.2.0: {} + remove-markdown@0.6.3: {} remove-md-codeblock@0.0.4: {} require-from-string@2.0.2: {} - resend@6.9.2(@react-email/render@1.1.2(react-dom@19.2.4(react@19.2.3))(react@19.2.3)): + resend@6.9.2(@react-email/render@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): dependencies: postal-mime: 2.7.3 svix: 1.84.1 optionalDependencies: - '@react-email/render': 1.1.2(react-dom@19.2.4(react@19.2.3))(react@19.2.3) + '@react-email/render': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) resolve-alpn@1.2.1: {} @@ -12935,8 +17548,7 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.27.0: - optional: true + scheduler@0.27.0: {} schema-utils@3.3.0: dependencies: @@ -13072,6 +17684,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@3.22.0: + dependencies: + '@shikijs/core': 3.22.0 + '@shikijs/engine-javascript': 3.22.0 + '@shikijs/engine-oniguruma': 3.22.0 + '@shikijs/langs': 3.22.0 + '@shikijs/themes': 3.22.0 + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -13119,6 +17742,8 @@ snapshots: slugify@1.6.6: {} + smart-buffer@4.2.0: {} + snakecase-keys@9.0.2: dependencies: change-case: 5.4.4 @@ -13134,6 +17759,17 @@ snapshots: - supports-color - utf-8-validate + socket.io-client@4.8.3: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3 + engine.io-client: 6.6.4 + socket.io-parser: 4.2.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 @@ -13162,6 +17798,19 @@ snapshots: - supports-color - utf-8-validate + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + sort-keys-length@1.0.1: dependencies: sort-keys: 1.1.2 @@ -13185,6 +17834,8 @@ snapshots: source-map@0.7.4: {} + space-separated-tokens@2.0.2: {} + sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 @@ -13211,6 +17862,27 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + streamdown@2.2.0(react@19.2.4): + dependencies: + clsx: 2.1.1 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + marked: 17.0.1 + react: 19.2.4 + rehype-harden: 1.1.8 + rehype-raw: 7.0.0 + rehype-sanitize: 6.0.0 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remend: 1.2.0 + tailwind-merge: 3.5.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + streamx@2.23.0: dependencies: events-universal: 1.0.1 @@ -13305,6 +17977,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 @@ -13324,10 +18001,20 @@ snapshots: strip-indent@4.1.1: {} + strnum@2.1.2: {} + strtok3@10.3.4: dependencies: '@tokenizer/token': 0.3.0 + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + supports-color@10.2.2: {} supports-color@7.2.0: @@ -13354,6 +18041,10 @@ snapshots: tagged-tag@1.0.0: {} + tailwind-merge@3.5.0: {} + + tailwindcss@4.2.0: {} + tapable@2.3.0: {} tar-stream@3.1.7: @@ -13432,6 +18123,10 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + ts-algebra@2.0.0: {} ts-api-utils@2.4.0(typescript@5.9.3): @@ -13517,6 +18212,8 @@ snapshots: dependencies: tslib: 1.14.1 + tw-animate-css@1.4.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -13622,10 +18319,45 @@ snapshots: undici@7.18.2: {} + undici@7.22.0: {} + unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 + 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.1: + 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.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@2.0.1: {} unpipe@1.0.0: {} @@ -13686,6 +18418,21 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + + use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.4): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.14 + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -13701,17 +18448,48 @@ snapshots: vary@1.1.2: {} - vite-tsconfig-paths@6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)): + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + 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 + + vite-tsconfig-paths@6.0.5(typescript@5.9.3)(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1): + vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.55.3 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.10 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.31.1 + terser: 5.44.1 + yaml: 2.8.1 + + vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -13723,13 +18501,14 @@ snapshots: '@types/node': 25.0.10 fsevents: 2.3.3 jiti: 2.6.1 + lightningcss: 1.31.1 terser: 5.44.1 yaml: 2.8.1 - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.0.10)(happy-dom@20.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -13746,7 +18525,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.1) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -13774,6 +18553,10 @@ snapshots: dependencies: defaults: 1.0.4 + web-namespaces@2.0.1: {} + + web-streams-polyfill@3.3.3: {} + webidl-conversions@7.0.0: {} webpack-node-externals@3.0.0: {} @@ -13932,6 +18715,8 @@ snapshots: ws@8.18.3: {} + xmlhttprequest-ssl@2.1.2: {} + xss@1.0.15: dependencies: commander: 2.20.3 @@ -13962,6 +18747,10 @@ snapshots: buffer-crc32: 0.2.13 pend: 1.2.0 + yjs@13.6.29: + dependencies: + lib0: 0.2.117 + yn@3.1.1: {} yocto-queue@0.1.0: {} @@ -13981,6 +18770,10 @@ snapshots: cookie: 1.1.1 youch-core: 0.3.3 + zod-to-json-schema@3.25.1(zod@4.3.6): + dependencies: + zod: 4.3.6 + zod-validation-error@3.5.4(zod@3.24.2): dependencies: zod: 3.24.2 @@ -13988,3 +18781,10 @@ snapshots: zod@3.24.2: {} zod@4.3.6: {} + + zustand@5.0.11(@types/react@19.2.14)(react@19.2.4): + optionalDependencies: + '@types/react': 19.2.14 + react: 19.2.4 + + zwitch@2.0.4: {}