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 */}
+
+
+ {/* 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 && (
+
+ )}
+
+ )
+}
+
+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 (
+
+ )
+}
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: {}