@sarchauhan/chat 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -2
- package/dist/blocks.css +291 -0
- package/dist/chat.css +959 -0
- package/dist/chat.select.css +345 -0
- package/dist/chips.css +248 -0
- package/dist/chunk-5SNRYULC.mjs +2201 -0
- package/dist/chunk-5SNRYULC.mjs.map +1 -0
- package/dist/index-DabpPX_p.d.mts +177 -0
- package/dist/index-DabpPX_p.d.ts +177 -0
- package/dist/index.d.mts +382 -0
- package/dist/index.d.ts +382 -0
- package/dist/index.js +4386 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2247 -0
- package/dist/index.mjs.map +1 -0
- package/dist/markdown.css +247 -0
- package/dist/motion/error-state-shake.css +57 -0
- package/dist/motion/icon-swap.css +30 -0
- package/dist/motion/index.css +6 -0
- package/dist/motion/menu-dropdown.css +35 -0
- package/dist/motion/success-check.css +51 -0
- package/dist/motion/text-states-swap.css +28 -0
- package/dist/motion/tokens.css +96 -0
- package/dist/styles.css +11 -0
- package/dist/theme/tokens.css +253 -0
- package/dist/theme/typography.css +115 -0
- package/dist/widgets.css +570 -0
- package/dist/widgets.d.mts +4 -0
- package/dist/widgets.d.ts +4 -0
- package/dist/widgets.js +1996 -0
- package/dist/widgets.js.map +1 -0
- package/dist/widgets.mjs +48 -0
- package/dist/widgets.mjs.map +1 -0
- package/package.json +76 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Chat.tsx","../src/theme/theme.toggle.tsx","../src/components/Chat/chat.tsx","../src/components/Chat/chat.attachments.tsx","../src/components/Chat/context/index.ts","../src/components/Chat/context/composer.context.tsx","../src/components/Chat/chat.tooltip.tsx","../src/components/Chat/context/message.helpers.ts","../src/components/Chat/context/messages.context.tsx","../src/components/Chat/context/model.context.tsx","../src/components/Chat/context/types.ts","../src/components/Chat/context/thread.context.tsx","../src/components/Chat/context/chat.provider.tsx","../src/components/Chat/chat.input.tsx","../src/components/Chat/chat.references.tsx","../src/components/Chat/chat.send.tsx","../src/components/Chat/chat.select.tsx","../src/ui/select.tsx","../src/components/Message/message.item.tsx","../src/components/Message/message.feedback.tsx","../src/components/Message/message.copy.tsx","../src/components/Message/message.regenerate.tsx","../src/components/Message/message.usage.tsx","../src/components/Message/message.tsx","../src/index.ts"],"sourcesContent":["\"use client\";\n\nimport { PenSquare } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useCallback, useLayoutEffect, useMemo, useRef } from \"react\";\nimport type { ChatAdapter } from \"../types\";\nimport { ThemeProvider, useTheme, type ChatTheme } from \"../theme/theme.context\";\nimport { ThemeToggle } from \"../theme/theme.toggle\";\nimport { ChatComposer, type ComposerCollapsedVariant } from \"./Chat/chat\";\nimport { ChatContextProvider, useMessages } from \"./Chat/chat.context\";\nimport { useThread } from \"./Chat/context\";\nimport { Message } from \"./Message/message\";\nimport {\n createWidgetRegistry,\n WidgetProvider,\n type ChatWidgetInput,\n type WidgetResponse,\n} from \"./Widget/widget.context\";\n\ntype ChatProps = {\n adapter: ChatAdapter;\n className?: string;\n defaultThreadId?: string;\n defaultProvider?: string;\n registryUrl?: string;\n style?: CSSProperties;\n /** Widget map or defineWidget(...) array. */\n widgets?: ChatWidgetInput;\n /** Controlled theme. Omit to manage theme internally. */\n theme?: ChatTheme;\n defaultTheme?: ChatTheme;\n onThemeChange?: (theme: ChatTheme) => void;\n showThemeToggle?: boolean;\n showModelSelector?: boolean;\n collapsedVariant?: ComposerCollapsedVariant;\n defaultExpanded?: boolean;\n};\n\nfunction ChatShell({\n className,\n style,\n widgets,\n showThemeToggle = true,\n showModelSelector = true,\n collapsedVariant = \"pill\",\n defaultExpanded = false,\n}: {\n className?: string;\n style?: CSSProperties;\n widgets?: ChatWidgetInput;\n showThemeToggle?: boolean;\n showModelSelector?: boolean;\n collapsedVariant?: ComposerCollapsedVariant;\n defaultExpanded?: boolean;\n}) {\n const { sendMessage, isSending, messages, status } = useMessages();\n const { createThread } = useThread();\n const { resolvedTheme } = useTheme();\n const registry = useMemo(() => createWidgetRegistry(widgets), [widgets]);\n const messagesRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = messagesRef.current;\n if (!container) {\n return;\n }\n\n container.scrollTop = container.scrollHeight;\n }, [messages, status]);\n\n useLayoutEffect(() => {\n const container = messagesRef.current;\n if (!container || (status !== \"submitted\" && status !== \"streaming\")) {\n return;\n }\n\n const scrollToEnd = () => {\n container.scrollTop = container.scrollHeight;\n };\n\n const observer = new ResizeObserver(scrollToEnd);\n observer.observe(container);\n const inner = container.firstElementChild;\n if (inner) {\n observer.observe(inner);\n }\n\n scrollToEnd();\n\n return () => observer.disconnect();\n }, [status]);\n\n const respondToWidget = useCallback(\n async (response: WidgetResponse) => {\n const text =\n response.label ??\n response.actionId ??\n (typeof response.value === \"string\" ? response.value : JSON.stringify(response.value));\n\n if (!text.trim()) {\n return;\n }\n\n await sendMessage({ text });\n },\n [sendMessage],\n );\n\n return (\n <WidgetProvider\n widgets={registry}\n respondToWidget={respondToWidget}\n disabled={isSending}\n >\n <div\n className={[\"chat-root\", className].filter(Boolean).join(\" \")}\n style={style}\n data-theme={resolvedTheme}\n >\n <div className=\"chat-toolbar\">\n <button\n type=\"button\"\n className=\"chat-theme-toggle\"\n onClick={() => void createThread()}\n aria-label=\"Start a new chat\"\n title=\"New chat\"\n disabled={isSending}\n >\n <PenSquare size={16} strokeWidth={1.75} />\n </button>\n {showThemeToggle && (\n <ThemeToggle />\n )}\n </div>\n <div className=\"chat-messages\" ref={messagesRef}>\n <Message />\n </div>\n <div className=\"chat-composer\">\n <ChatComposer\n showModelSelector={showModelSelector}\n collapsedVariant={collapsedVariant}\n defaultExpanded={defaultExpanded}\n />\n </div>\n </div>\n </WidgetProvider>\n );\n}\n\nexport function Chat({\n adapter,\n className,\n defaultThreadId,\n defaultProvider,\n registryUrl,\n style,\n widgets,\n theme,\n defaultTheme = \"system\",\n onThemeChange,\n showThemeToggle = true,\n showModelSelector = true,\n collapsedVariant = \"pill\",\n defaultExpanded = false,\n}: ChatProps) {\n return (\n <ThemeProvider\n theme={theme}\n defaultTheme={defaultTheme}\n onThemeChange={onThemeChange}\n >\n <ChatContextProvider\n adapter={adapter}\n defaultThreadId={defaultThreadId}\n defaultProvider={defaultProvider}\n registryUrl={registryUrl}\n >\n <ChatShell\n className={className}\n style={style}\n widgets={widgets}\n showThemeToggle={showThemeToggle}\n showModelSelector={showModelSelector}\n collapsedVariant={collapsedVariant}\n defaultExpanded={defaultExpanded}\n />\n </ChatContextProvider>\n </ThemeProvider>\n );\n}\n","\"use client\";\n\nimport { Moon, Sun } from \"lucide-react\";\nimport { useTheme } from \"./theme.context\";\n\nexport function ThemeToggle({ className }: { className?: string }) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const isDark = resolvedTheme === \"dark\";\n\n return (\n <button\n type=\"button\"\n className={[\"chat-theme-toggle\", className].filter(Boolean).join(\" \")}\n onClick={toggleTheme}\n aria-label={isDark ? \"Switch to light theme\" : \"Switch to dark theme\"}\n title={isDark ? \"Light mode\" : \"Dark mode\"}\n >\n {isDark ? <Sun size={16} strokeWidth={1.75} /> : <Moon size={16} strokeWidth={1.75} />}\n </button>\n );\n}\n","\"use client\";\n\nimport { MessageCircle } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { motion, triggerErrorShake } from \"../../motion\";\nimport { ChatAttachButton, ChatAttachments } from \"./chat.attachments\";\nimport { ChatInput } from \"./chat.input\";\nimport { ChatReferences } from \"./chat.references\";\nimport { ChatSend } from \"./chat.send\";\nimport { ChatSelect } from \"./chat.select\";\nimport { useComposer, useMessages } from \"./context\";\n\nconst focusStaysInComposer = (shell: HTMLElement, node: Node | null) => {\n if (node && shell.contains(node)) {\n return true;\n }\n\n return node instanceof Element && node.closest(\"[data-slot='select-content']\") !== null;\n};\n\nexport type ComposerCollapsedVariant = \"pill\" | \"circle\";\n\nexport const ChatComposer = ({\n showModelSelector = true,\n collapsedVariant = \"pill\",\n defaultExpanded = false,\n}: {\n showModelSelector?: boolean;\n /** Resting shape when the composer is empty and blurred. Default is the wide pill. */\n collapsedVariant?: ComposerCollapsedVariant;\n /** Open on the large composer. Used so a story can show the model picker without a click. */\n defaultExpanded?: boolean;\n}) => {\n const { status } = useMessages();\n const { input, attachments, references } = useComposer();\n const shellRef = useRef<HTMLDivElement>(null);\n const [focused, setFocused] = useState(defaultExpanded);\n const expanded =\n focused || input.trim().length > 0 || attachments.length > 0 || references.length > 0;\n\n useEffect(() => {\n if (status !== \"error\" || !shellRef.current) {\n return;\n }\n\n triggerErrorShake(shellRef.current);\n }, [status]);\n\n useEffect(() => {\n if (!focused) {\n return;\n }\n\n const onFocusIn = () => {\n const shell = shellRef.current;\n if (!shell) {\n return;\n }\n if (focusStaysInComposer(shell, document.activeElement)) {\n return;\n }\n setFocused(false);\n };\n\n document.addEventListener(\"focusin\", onFocusIn, true);\n return () => document.removeEventListener(\"focusin\", onFocusIn, true);\n }, [focused]);\n\n return (\n <div\n ref={shellRef}\n className={cn(\"chat-composer-shell\", motion.inputWrap, motion.input)}\n data-expanded={expanded ? \"true\" : \"false\"}\n data-collapsed={collapsedVariant}\n onFocus={() => setFocused(true)}\n onBlur={(event) => {\n const shell = event.currentTarget;\n const next = event.relatedTarget;\n if (next instanceof Node && focusStaysInComposer(shell, next)) {\n return;\n }\n\n window.setTimeout(() => {\n if (focusStaysInComposer(shell, document.activeElement)) {\n return;\n }\n setFocused(false);\n }, 0);\n }}\n >\n {expanded || collapsedVariant !== \"circle\" ? null : (\n <MessageCircle className=\"chat-composer-collapsed-icon\" size={18} aria-hidden=\"true\" />\n )}\n <ChatAttachments />\n <ChatReferences />\n <ChatInput expanded={expanded} />\n <div className=\"chat-composer-row\">\n <div className=\"chat-composer-tools\">\n <ChatAttachButton />\n {showModelSelector && expanded && collapsedVariant === \"circle\" ? <ChatSelect /> : null}\n </div>\n <ChatSend />\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport { FileText, Paperclip, X } from \"lucide-react\";\nimport { useRef } from \"react\";\nimport { useComposer } from \"./context\";\n\nconst isImageMediaType = (mediaType: string) => mediaType.startsWith(\"image/\");\n\nexport const ChatAttachments = () => {\n const { attachments, removeAttachment } = useComposer();\n\n if (attachments.length === 0) {\n return null;\n }\n\n return (\n <div className=\"chat-attachments\">\n {attachments.map((attachment) => {\n const image = isImageMediaType(attachment.mediaType);\n\n return (\n <div\n key={attachment.id}\n className={image ? \"chat-attachment chat-attachment-image\" : \"chat-attachment chat-attachment-file\"}\n >\n {image ? (\n <img src={attachment.url} alt={attachment.filename} />\n ) : (\n <>\n <FileText size={14} aria-hidden=\"true\" />\n <span className=\"chat-attachment-name\">{attachment.filename}</span>\n </>\n )}\n <button\n type=\"button\"\n className=\"chat-attachment-remove\"\n aria-label={`Remove ${attachment.filename}`}\n onClick={() => removeAttachment(attachment.id)}\n >\n <X size={12} />\n </button>\n </div>\n );\n })}\n </div>\n );\n};\n\nexport const ChatAttachButton = () => {\n const { disabled, addFiles } = useComposer();\n const inputRef = useRef<HTMLInputElement>(null);\n\n return (\n <>\n <button\n type=\"button\"\n className=\"chat-attach\"\n aria-label=\"Add attachment\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n >\n <Paperclip size={16} />\n </button>\n <input\n ref={inputRef}\n className=\"chat-attach-input\"\n type=\"file\"\n multiple\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={(event) => {\n const files = event.currentTarget.files;\n if (files && files.length > 0) {\n void addFiles(files);\n }\n event.currentTarget.value = \"\";\n }}\n />\n </>\n );\n};\n","\"use client\";\n\nimport { useMemo, type Dispatch } from \"react\";\nimport { useComposer } from \"./composer.context\";\nimport { useMessages } from \"./messages.context\";\nimport { useModel } from \"./model.context\";\nimport { useThread } from \"./thread.context\";\n\ntype CompatAction =\n | { type: \"setInput\"; data: { input: string } }\n | { type: \"setProvider\"; data: { provider: string; model?: string } }\n | { type: \"setModel\"; data: { model: string } }\n | { type: \"addReference\"; data: { text: string } }\n | { type: \"removeReference\"; data: { id: string } }\n | { type: \"clearReferences\" };\n\n/**\n * Compatibility facade over split contexts.\n * Prefer useComposer / useMessages / useModel / useThread in UI components\n * so typing and streaming do not share one render subscription.\n */\nexport function useChat() {\n const composer = useComposer();\n const messages = useMessages();\n const model = useModel();\n const thread = useThread();\n\n return useMemo(() => {\n const dispatch: Dispatch<CompatAction> = (action) => {\n switch (action.type) {\n case \"setInput\":\n composer.setInput(action.data.input);\n break;\n case \"setProvider\":\n model.setProvider(action.data.provider, action.data.model);\n break;\n case \"setModel\":\n model.setModel(action.data.model);\n break;\n case \"addReference\":\n composer.addReference(action.data.text);\n break;\n case \"removeReference\":\n composer.removeReference(action.data.id);\n break;\n case \"clearReferences\":\n composer.clearReferences();\n break;\n default:\n break;\n }\n };\n\n return {\n state: {\n input: composer.input,\n provider: model.provider,\n model: model.model,\n references: composer.references,\n disabled: composer.disabled,\n sendDisabled: !composer.canSend,\n },\n dispatch,\n messages: messages.messages,\n status: messages.status,\n activeThreadId: thread.activeThreadId,\n threads: thread.threads,\n isLoadingThread: thread.isLoadingThread,\n registry: model.registry,\n sendMessage: messages.sendMessage,\n submitInput: composer.submitInput,\n editAndResendMessage: messages.editAndResendMessage,\n stopResponse: messages.stopResponse,\n selectThread: thread.selectThread,\n createThread: thread.createThread,\n deleteThread: thread.deleteThread,\n };\n }, [composer, messages, model, thread]);\n}\n\nexport {\n ChatContextProvider,\n type ChatContextProviderProps,\n} from \"./chat.provider\";\nexport { useComposer } from \"./composer.context\";\nexport { useMessages } from \"./messages.context\";\nexport { useModel } from \"./model.context\";\nexport { useThread } from \"./thread.context\";\nexport {\n ProviderId,\n defaultRegistry,\n isProviderId,\n parseRegistryConfig,\n type ChatReference,\n type ComposerAttachment,\n type ComposerFile,\n type RegistryConfig,\n type RegistryModel,\n type RegistryProvider,\n type SendMessage,\n} from \"./types\";\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { ChatTooltip } from \"../chat.tooltip\";\nimport { createMessageId, normalizeReferenceText } from \"./message.helpers\";\nimport { useMessages } from \"./messages.context\";\nimport { useModel } from \"./model.context\";\nimport { useThread } from \"./thread.context\";\nimport type { ChatReference, ComposerAttachment } from \"./types\";\n\nconst readFileAsDataUrl = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n return;\n }\n reject(new Error(\"Could not read file\"));\n };\n reader.onerror = () => {\n reject(reader.error ?? new Error(\"Could not read file\"));\n };\n reader.readAsDataURL(file);\n });\n\ntype ComposerContextValue = {\n input: string;\n setInput: (value: string) => void;\n references: ChatReference[];\n addReference: (text: string) => void;\n removeReference: (id: string) => void;\n clearReferences: () => void;\n attachments: ComposerAttachment[];\n addFiles: (files: FileList | readonly File[]) => Promise<void>;\n removeAttachment: (id: string) => void;\n disabled: boolean;\n canSend: boolean;\n submitInput: () => Promise<void>;\n};\n\nconst ComposerContext = createContext<ComposerContextValue | null>(null);\n\ntype ComposerProviderProps = {\n children: ReactNode;\n};\n\nexport function ComposerProvider({ children }: ComposerProviderProps) {\n const { activeThreadId, activeThreadIdRef, isLoadingThread, setThreads } = useThread();\n const { providerRef, modelRef } = useModel();\n const { sendMessage, isSending } = useMessages();\n\n // Local composer state — typing does not hop through a shared reducer/context mega-object.\n const [input, setInputState] = useState(\"\");\n const [references, setReferences] = useState<ChatReference[]>([]);\n const [attachments, setAttachments] = useState<ComposerAttachment[]>([]);\n const inputRef = useRef(input);\n const referencesRef = useRef(references);\n const attachmentsRef = useRef(attachments);\n inputRef.current = input;\n referencesRef.current = references;\n attachmentsRef.current = attachments;\n\n const setInput = useCallback((value: string) => {\n setInputState(value);\n }, []);\n\n const addReference = useCallback((text: string) => {\n const normalized = normalizeReferenceText(text);\n if (!normalized) {\n return;\n }\n\n setReferences((current) => {\n if (current.some((reference) => reference.text === normalized)) {\n return current;\n }\n\n return [\n ...current,\n {\n id: createMessageId(\"ref\"),\n text: normalized,\n },\n ];\n });\n }, []);\n\n const removeReference = useCallback((id: string) => {\n setReferences((current) => current.filter((reference) => reference.id !== id));\n }, []);\n\n const clearReferences = useCallback(() => {\n setReferences([]);\n }, []);\n\n const addFiles = useCallback(async (list: FileList | readonly File[]) => {\n const incoming = Array.from(list);\n const next: ComposerAttachment[] = [];\n\n for (const file of incoming) {\n try {\n const url = await readFileAsDataUrl(file);\n next.push({\n id: createMessageId(\"file\"),\n filename: file.name || \"file\",\n mediaType: file.type || \"application/octet-stream\",\n url,\n });\n } catch {\n // Skip a file the browser could not read. The rest still attach.\n }\n }\n\n if (next.length === 0) {\n return;\n }\n\n setAttachments((current) => [...current, ...next]);\n }, []);\n\n const removeAttachment = useCallback((id: string) => {\n setAttachments((current) => current.filter((attachment) => attachment.id !== id));\n }, []);\n\n const disabled = isSending || isLoadingThread || !activeThreadId;\n const canSend = !disabled && (!!input.trim() || attachments.length > 0);\n const disabledRef = useRef(disabled);\n disabledRef.current = disabled;\n\n const submitInput = useCallback(async () => {\n const text = inputRef.current.trim();\n const threadId = activeThreadIdRef.current;\n const attachmentsSnapshot = attachmentsRef.current;\n\n if ((!text && attachmentsSnapshot.length === 0) || !threadId || disabledRef.current) {\n return;\n }\n\n const nextTitle = (text || attachmentsSnapshot[0]?.filename || \"\").slice(0, 60);\n const referencesSnapshot = referencesRef.current;\n const referenceText = referencesSnapshot\n .map(\n (reference, index) =>\n `<reference ${index + 1}>\\n${reference.text}\\n</reference ${index + 1}>`,\n )\n .join(\"\\n\\n\");\n\n const messageText = referenceText\n ? `Use the following selected references as context:\\n\\n${referenceText}\\n\\nUser message:\\n${text}`\n : text;\n\n setInputState(\"\");\n setReferences([]);\n setAttachments([]);\n\n setThreads((current) => {\n const next = current.map((thread) =>\n thread.id === threadId && thread.title === \"New chat\"\n ? { ...thread, title: nextTitle || thread.title }\n : thread,\n );\n const selected = next.find((thread) => thread.id === threadId);\n const remaining = next.filter((thread) => thread.id !== threadId);\n return selected ? [selected, ...remaining] : next;\n });\n\n try {\n await sendMessage(\n {\n text: messageText,\n files: attachmentsSnapshot.map((file) => ({\n mediaType: file.mediaType,\n url: file.url,\n filename: file.filename,\n })),\n },\n {\n body: {\n provider: providerRef.current,\n model: modelRef.current,\n },\n },\n );\n } catch (error) {\n setInputState(text);\n setReferences(referencesSnapshot);\n setAttachments(attachmentsSnapshot);\n throw error;\n }\n }, [activeThreadIdRef, modelRef, providerRef, sendMessage, setThreads]);\n\n const value = useMemo<ComposerContextValue>(\n () => ({\n input,\n setInput,\n references,\n addReference,\n removeReference,\n clearReferences,\n attachments,\n addFiles,\n removeAttachment,\n disabled,\n canSend,\n submitInput,\n }),\n [\n addReference,\n canSend,\n clearReferences,\n disabled,\n input,\n addFiles,\n attachments,\n references,\n removeAttachment,\n removeReference,\n setInput,\n submitInput,\n ],\n );\n\n return (\n <ComposerContext.Provider value={value}>\n {children}\n <ChatTooltip onAddReference={addReference} />\n </ComposerContext.Provider>\n );\n}\n\nexport function useComposer() {\n const context = useContext(ComposerContext);\n if (!context) {\n throw new Error(\"useComposer must be used inside ComposerProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport { memo, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ntype SelectionAction = {\n text: string;\n top: number;\n left: number;\n container: HTMLElement;\n};\n\nconst isEditableSelection = (selection: Selection) => {\n const anchorElement = selection.anchorNode?.parentElement;\n const focusElement = selection.focusNode?.parentElement;\n\n return Boolean(\n anchorElement?.closest(\"textarea,input,[contenteditable='true']\") ||\n focusElement?.closest(\"textarea,input,[contenteditable='true']\"),\n );\n};\n\nconst getSelectionRect = (range: Range) => {\n const rect = range.getBoundingClientRect();\n const fallbackRect = range.getClientRects()[0];\n return rect.width || rect.height ? rect : fallbackRect;\n};\n\nconst positionFromRange = (\n range: Range,\n container: HTMLElement,\n): Pick<SelectionAction, \"top\" | \"left\"> | null => {\n const selectionRect = getSelectionRect(range);\n if (!selectionRect) {\n return null;\n }\n\n const containerRect = container.getBoundingClientRect();\n\n return {\n top: Math.max(8, selectionRect.top - containerRect.top + container.scrollTop),\n left: selectionRect.left - containerRect.left + container.scrollLeft + selectionRect.width / 2,\n };\n};\n\nconst readSelection = (): { text: string; range: Range } | null => {\n const selection = window.getSelection();\n const text = selection?.toString().replace(/\\s+/g, \" \").trim();\n\n if (!selection || !text || selection.rangeCount === 0 || selection.isCollapsed) {\n return null;\n }\n\n if (isEditableSelection(selection)) {\n return null;\n }\n\n return {\n text,\n range: selection.getRangeAt(0).cloneRange(),\n };\n};\n\nconst getPortalContainer = (range: Range) => {\n const node = range.commonAncestorContainer;\n const element = node instanceof Element ? node : node.parentElement;\n const found = element?.closest(\".chat-messages\");\n return found instanceof HTMLElement ? found : null;\n};\n\ntype ChatTooltipProps = {\n onAddReference: (text: string) => void;\n};\n\nexport const ChatTooltip = memo(function ChatTooltip({\n onAddReference,\n}: ChatTooltipProps) {\n const [selectionAction, setSelectionAction] = useState<SelectionAction | null>(null);\n const rangeRef = useRef<Range | null>(null);\n const textRef = useRef(\"\");\n\n useEffect(() => {\n const clearSelectionAction = () => {\n rangeRef.current = null;\n textRef.current = \"\";\n setSelectionAction(null);\n };\n\n const syncPosition = () => {\n const range = rangeRef.current;\n if (!range) {\n return;\n }\n\n const container = getPortalContainer(range);\n if (!container) {\n clearSelectionAction();\n return;\n }\n\n const position = positionFromRange(range, container);\n if (!position) {\n clearSelectionAction();\n return;\n }\n\n setSelectionAction({\n text: textRef.current,\n top: position.top,\n left: position.left,\n container,\n });\n };\n\n const captureSelection = () => {\n const next = readSelection();\n if (!next) {\n clearSelectionAction();\n return;\n }\n\n rangeRef.current = next.range;\n textRef.current = next.text;\n syncPosition();\n };\n\n document.addEventListener(\"mouseup\", captureSelection);\n document.addEventListener(\"keyup\", captureSelection);\n document.addEventListener(\"selectionchange\", captureSelection);\n window.addEventListener(\"scroll\", syncPosition, true);\n window.addEventListener(\"resize\", syncPosition);\n\n return () => {\n document.removeEventListener(\"mouseup\", captureSelection);\n document.removeEventListener(\"keyup\", captureSelection);\n document.removeEventListener(\"selectionchange\", captureSelection);\n window.removeEventListener(\"scroll\", syncPosition, true);\n window.removeEventListener(\"resize\", syncPosition);\n };\n }, [onAddReference]);\n\n if (!selectionAction) {\n return null;\n }\n\n return createPortal(\n <button\n type=\"button\"\n className=\"chat-reference-action\"\n style={{ top: selectionAction.top, left: selectionAction.left }}\n aria-label=\"Add selected text as reference\"\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => {\n onAddReference(selectionAction.text);\n window.getSelection()?.removeAllRanges();\n rangeRef.current = null;\n textRef.current = \"\";\n setSelectionAction(null);\n }}\n >\n Add reference\n </button>,\n selectionAction.container,\n );\n});\n","import type { ChatMessage } from \"../../../types\";\nimport type { ComposerFile } from \"./types\";\n\nexport const normalizeReferenceText = (text: string) =>\n text.replace(/\\s+/g, \" \").trim().slice(0, 4000);\n\nexport const createMessageId = (prefix: string) =>\n globalThis.crypto?.randomUUID?.() ?? `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\nexport const createUserMessage = (text: string, files: ComposerFile[] = []): ChatMessage => ({\n id: createMessageId(\"msg\"),\n role: \"user\",\n parts: [\n ...files.map((file) => ({\n type: \"file\" as const,\n mediaType: file.mediaType,\n url: file.url,\n filename: file.filename,\n })),\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ],\n});\n\nexport const updateMessageText = (message: ChatMessage, text: string): ChatMessage => ({\n ...message,\n parts: [{ type: \"text\", text }],\n});\n\nexport const upsertAssistantMessage = (current: ChatMessage[], nextMessage: ChatMessage) => {\n const existingIndex = current.findIndex((message) => message.id === nextMessage.id);\n\n if (existingIndex === -1) {\n return [...current, nextMessage];\n }\n\n return current.map((message, index) => (index === existingIndex ? nextMessage : message));\n};\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport type { ChatAdapter, ChatMessage, ChatStatus } from \"../../../types\";\nimport { getUserDisplayText } from \"../../../lib/message/user\";\nimport {\n createUserMessage,\n updateMessageText,\n upsertAssistantMessage,\n} from \"./message.helpers\";\nimport { useModel } from \"./model.context\";\nimport { useThread } from \"./thread.context\";\nimport type { SendMessage } from \"./types\";\n\nconst MINIMUM_RESPONSE_LOADING_MS = 350;\nconst wait = (milliseconds: number) => new Promise<void>((resolve) => window.setTimeout(resolve, milliseconds));\n\nconst hasVisibleAssistantContent = (message: ChatMessage) =>\n message.parts.some((part) => {\n if (part.type === \"text\") {\n return \"text\" in part && typeof part.text === \"string\" && part.text.trim().length > 0;\n }\n\n if (part.type === \"data\") {\n return \"name\" in part && part.name !== \"usage\" && part.name !== \"context\" && part.name !== \"context-warning\";\n }\n\n return [\"reasoning\", \"tool\", \"widget\", \"source-url\", \"source-document\", \"file\", \"unknown\"].includes(part.type);\n });\n\ntype MessagesContextValue = {\n messages: ChatMessage[];\n status: ChatStatus;\n isSending: boolean;\n isWaitingForResponse: boolean;\n sendMessage: SendMessage;\n editAndResendMessage: (messageId: string, text: string) => Promise<void>;\n stopResponse: () => void;\n};\n\nconst MessagesContext = createContext<MessagesContextValue | null>(null);\n\ntype MessagesProviderProps = {\n adapter: ChatAdapter;\n children: ReactNode;\n};\n\nexport function MessagesProvider({ adapter, children }: MessagesProviderProps) {\n const { activeThreadId, activeThreadIdRef, setThreads, setIsLoadingThread } = useThread();\n const { providerRef, modelRef, thinkingLevelsRef } = useModel();\n\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [status, setStatus] = useState<ChatStatus>(\"ready\");\n const [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\n const messagesRef = useRef(messages);\n const statusRef = useRef(status);\n const adapterRef = useRef(adapter);\n const abortRef = useRef<AbortController | null>(null);\n\n messagesRef.current = messages;\n statusRef.current = status;\n adapterRef.current = adapter;\n\n useEffect(() => {\n let cancelled = false;\n\n const loadMessages = async () => {\n if (!activeThreadId) {\n setMessages([]);\n setIsLoadingThread(false);\n return;\n }\n\n const currentAdapter = adapterRef.current;\n if (!currentAdapter.loadMessages) {\n setIsLoadingThread(false);\n return;\n }\n\n setIsLoadingThread(true);\n try {\n const nextMessages = await currentAdapter.loadMessages(activeThreadId);\n if (cancelled) {\n return;\n }\n setMessages(nextMessages);\n setIsLoadingThread(false);\n } catch {\n if (!cancelled) {\n setMessages([]);\n setIsLoadingThread(false);\n setStatus(\"error\");\n }\n }\n };\n\n void loadMessages();\n return () => {\n cancelled = true;\n };\n }, [activeThreadId, setIsLoadingThread]);\n\n const streamMessage = useCallback(\n async ({\n message,\n nextMessages,\n provider,\n model,\n thinkingLevel,\n }: {\n message: ChatMessage;\n nextMessages: ChatMessage[];\n provider?: string;\n model?: string;\n thinkingLevel?: string;\n }) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) {\n setIsWaitingForResponse(false);\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n setStatus(\"submitted\");\n const responseStartedAt = Date.now();\n let receivedVisibleResponse = false;\n\n try {\n for await (const assistantMessage of adapterRef.current.sendMessage({\n threadId,\n message,\n messages: nextMessages,\n provider,\n model,\n thinkingLevel,\n signal: abortController.signal,\n })) {\n if (!receivedVisibleResponse && hasVisibleAssistantContent(assistantMessage)) {\n receivedVisibleResponse = true;\n const remaining = MINIMUM_RESPONSE_LOADING_MS - (Date.now() - responseStartedAt);\n\n if (remaining > 0) {\n await wait(remaining);\n }\n\n if (abortController.signal.aborted) {\n setIsWaitingForResponse(false);\n setStatus(\"ready\");\n return;\n }\n }\n\n if (receivedVisibleResponse) {\n setIsWaitingForResponse(false);\n setStatus(\"streaming\");\n }\n setMessages((current) => upsertAssistantMessage(current, assistantMessage));\n }\n\n setStatus(\"ready\");\n } catch (error) {\n setIsWaitingForResponse(false);\n if (abortController.signal.aborted) {\n setStatus(\"ready\");\n return;\n }\n\n setStatus(\"error\");\n throw error;\n } finally {\n setIsWaitingForResponse(false);\n if (abortRef.current === abortController) {\n abortRef.current = null;\n }\n }\n },\n [activeThreadIdRef],\n );\n\n const sendMessage = useCallback<SendMessage>(\n async (message, options) => {\n const text = message.text.trim();\n const files = message.files ?? [];\n const threadId = activeThreadIdRef.current;\n\n if ((!text && files.length === 0) || !threadId) {\n return;\n }\n\n const userMessage = createUserMessage(text, files);\n const nextMessages = [...messagesRef.current, userMessage];\n flushSync(() => {\n setMessages(nextMessages);\n setIsWaitingForResponse(true);\n });\n\n const resolvedProvider = options?.body?.provider ?? providerRef.current;\n const resolvedModel = options?.body?.model ?? modelRef.current;\n const thinkingLevel = thinkingLevelsRef.current[`${resolvedProvider}::${resolvedModel}`];\n await streamMessage({\n message: userMessage,\n nextMessages,\n provider: resolvedProvider,\n model: resolvedModel,\n thinkingLevel,\n });\n },\n [activeThreadIdRef, modelRef, providerRef, streamMessage],\n );\n\n const editAndResendMessage = useCallback(\n async (messageId: string, text: string) => {\n const trimmedText = text.trim();\n const threadId = activeThreadIdRef.current;\n const isSending =\n statusRef.current === \"submitted\" || statusRef.current === \"streaming\";\n\n if (!trimmedText || !threadId || isSending) {\n return;\n }\n\n const previousMessages = messagesRef.current;\n const messageIndex = previousMessages.findIndex((message) => message.id === messageId);\n const message = previousMessages[messageIndex];\n\n if (!message || message.role !== \"user\") {\n return;\n }\n\n let editedMessages = previousMessages\n .slice(0, messageIndex + 1)\n .map((currentMessage) =>\n currentMessage.id === messageId\n ? updateMessageText(currentMessage, trimmedText)\n : currentMessage,\n );\n\n setThreads((current) => {\n const firstUserMessage = editedMessages.find(\n (currentMessage) => currentMessage.role === \"user\",\n );\n const firstUserTitle = firstUserMessage\n ? getUserDisplayText(firstUserMessage).trim().slice(0, 60)\n : \"\";\n\n return current.map((thread) =>\n thread.id === threadId && firstUserTitle\n ? { ...thread, title: firstUserTitle }\n : thread,\n );\n });\n\n try {\n if (adapterRef.current.editMessage) {\n editedMessages = await adapterRef.current.editMessage({\n threadId,\n messageId,\n text: trimmedText,\n });\n }\n\n const editedMessage =\n editedMessages.find((currentMessage) => currentMessage.id === messageId) ??\n updateMessageText(message, trimmedText);\n\n setMessages(editedMessages);\n setIsWaitingForResponse(true);\n\n const thinkingLevel = thinkingLevelsRef.current[`${providerRef.current}::${modelRef.current}`];\n await streamMessage({\n message: editedMessage,\n nextMessages: editedMessages,\n provider: providerRef.current,\n model: modelRef.current,\n thinkingLevel,\n });\n } catch (error) {\n setIsWaitingForResponse(false);\n setMessages(previousMessages);\n throw error;\n }\n },\n [activeThreadIdRef, modelRef, providerRef, setThreads, streamMessage],\n );\n\n const stopResponse = useCallback(() => {\n const isSending =\n statusRef.current === \"submitted\" || statusRef.current === \"streaming\";\n if (!isSending) {\n return;\n }\n\n abortRef.current?.abort();\n setIsWaitingForResponse(false);\n setStatus(\"ready\");\n }, []);\n\n const isSending = status === \"submitted\" || status === \"streaming\";\n\n const value = useMemo<MessagesContextValue>(\n () => ({\n messages,\n status,\n isSending,\n isWaitingForResponse,\n sendMessage,\n editAndResendMessage,\n stopResponse,\n }),\n [editAndResendMessage, isSending, isWaitingForResponse, messages, sendMessage, status, stopResponse],\n );\n\n return <MessagesContext.Provider value={value}>{children}</MessagesContext.Provider>;\n}\n\nexport function useMessages() {\n const context = useContext(MessagesContext);\n if (!context) {\n throw new Error(\"useMessages must be used inside MessagesProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n defaultRegistry,\n parseRegistryConfig,\n ProviderId,\n type RegistryConfig,\n} from \"./types\";\n\ntype ModelContextValue = {\n registry: RegistryConfig;\n provider: string;\n model: string;\n thinkingLevels: Record<string, string>;\n getThinkingLevel: (providerId: string, modelId: string) => string | undefined;\n setThinkingLevel: (providerId: string, modelId: string, level: string) => void;\n setProvider: (provider: string, model?: string) => void;\n setModel: (model: string) => void;\n providerRef: React.MutableRefObject<string>;\n modelRef: React.MutableRefObject<string>;\n thinkingLevelsRef: React.MutableRefObject<Record<string, string>>;\n};\n\nconst ModelContext = createContext<ModelContextValue | null>(null);\n\ntype ModelProviderProps = {\n children: ReactNode;\n defaultProvider?: string;\n registryUrl?: string;\n};\n\nexport function ModelProvider({\n children,\n defaultProvider = ProviderId.MOCK,\n registryUrl = \"/api/ai/registry\",\n}: ModelProviderProps) {\n const [registry, setRegistry] = useState<RegistryConfig>(defaultRegistry);\n const [provider, setProviderState] = useState(defaultProvider);\n const [model, setModelState] = useState(\n () =>\n defaultRegistry.providers.find((entry) => entry.id === defaultProvider)?.defaultModel ?? \"\",\n );\n const [thinkingLevels, setThinkingLevelsState] = useState<Record<string, string>>(() => {\n const initial: Record<string, string> = {};\n for (const p of defaultRegistry.providers) {\n for (const m of p.models) {\n const levels = m.thinkingLevels;\n if (levels?.length) initial[`${p.id}::${m.id}`] = levels.includes(\"medium\") ? \"medium\" : levels[0];\n }\n }\n return initial;\n });\n\n const providerRef = useRef(provider);\n const modelRef = useRef(model);\n const thinkingLevelsRef = useRef(thinkingLevels);\n providerRef.current = provider;\n modelRef.current = model;\n thinkingLevelsRef.current = thinkingLevels;\n\n useEffect(() => {\n let cancelled = false;\n\n const loadRegistry = async () => {\n try {\n const response = await fetch(registryUrl, { cache: \"no-store\" });\n if (!response.ok) {\n throw new Error(\"Failed to load registry\");\n }\n\n const data = parseRegistryConfig(await response.json());\n if (cancelled || !data) {\n return;\n }\n\n setRegistry(data);\n const nextThinking: Record<string, string> = {};\n for (const p of data.providers) {\n for (const m of p.models) {\n const levels = m.thinkingLevels;\n if (levels?.length) nextThinking[`${p.id}::${m.id}`] = levels.includes(\"medium\") ? \"medium\" : levels[0];\n }\n }\n setThinkingLevelsState((prev) => ({ ...nextThinking, ...prev }));\n const preferred =\n data.providers.find((entry) => entry.id === data.defaultProviderId) ??\n data.providers[0];\n if (preferred) {\n setProviderState(preferred.id);\n setModelState(preferred.defaultModel);\n }\n } catch {\n if (!cancelled) {\n setRegistry(defaultRegistry);\n }\n }\n };\n\n void loadRegistry();\n return () => {\n cancelled = true;\n };\n }, [registryUrl]);\n\n useEffect(() => {\n const nextProvider =\n registry.providers.find((entry) => entry.id === provider) ??\n registry.providers.find((entry) => entry.id === registry.defaultProviderId) ??\n registry.providers[0];\n\n if (!nextProvider) {\n return;\n }\n\n const hasModel = nextProvider.models.some((entry) => entry.id === model);\n if (!hasModel) {\n setProviderState(nextProvider.id);\n setModelState(nextProvider.defaultModel);\n }\n }, [model, provider, registry]);\n\n const setProvider = useCallback((nextProvider: string, nextModel?: string) => {\n setProviderState(nextProvider);\n if (nextModel) {\n setModelState(nextModel);\n }\n }, []);\n\n const getThinkingLevel = useCallback(\n (providerId: string, modelId: string) => thinkingLevels[`${providerId}::${modelId}`],\n [thinkingLevels],\n );\n\n const setThinkingLevel = useCallback((providerId: string, modelId: string, level: string) => {\n setThinkingLevelsState((prev) => ({ ...prev, [`${providerId}::${modelId}`]: level }));\n }, []);\n\n const setModel = useCallback((nextModel: string) => {\n setModelState(nextModel);\n }, []);\n\n const value = useMemo<ModelContextValue>(\n () => ({\n registry,\n provider,\n model,\n thinkingLevels,\n getThinkingLevel,\n setThinkingLevel,\n setProvider,\n setModel,\n providerRef,\n modelRef,\n thinkingLevelsRef,\n }),\n [model, provider, registry, setModel, setProvider, thinkingLevels, getThinkingLevel, setThinkingLevel],\n );\n\n return <ModelContext.Provider value={value}>{children}</ModelContext.Provider>;\n}\n\nexport function useModel() {\n const context = useContext(ModelContext);\n if (!context) {\n throw new Error(\"useModel must be used inside ModelProvider\");\n }\n return context;\n}\n","import type { ChatAdapter, ChatMessage, ChatStatus, ChatThread } from \"../../../types\";\n\nexport enum ProviderId {\n SYMPHONY = \"symphony\",\n MOCK = \"mock\",\n OPENAI = \"openai\",\n GOOGLE = \"google\",\n GEMINI = \"gemini\",\n CLAUDE = \"anthropic\",\n GROK = \"grok\",\n OLLAMA = \"ollama\",\n LOCAL = \"local\",\n}\n\nexport type RegistryModel = {\n id: string;\n label: string;\n description?: string;\n thinkingLevels?: string[];\n};\n\nexport type RegistryProvider = {\n /** Known `ProviderId` values or a Symphony / custom registry id. */\n id: string;\n name?: string;\n label: string;\n logo?: string;\n defaultModel: string;\n models: RegistryModel[];\n};\n\nexport type RegistryConfig = {\n defaultProviderId: string;\n providers: RegistryProvider[];\n};\n\nconst PROVIDER_IDS: ReadonlySet<string> = new Set(Object.values(ProviderId));\n\nexport const isProviderId = (value: unknown): value is ProviderId =>\n typeof value === \"string\" && PROVIDER_IDS.has(value);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isRegistryModel = (value: unknown): value is RegistryModel => {\n if (!isRecord(value) || typeof value.id !== \"string\" || typeof value.label !== \"string\") {\n return false;\n }\n\n if (value.description !== undefined && typeof value.description !== \"string\") {\n return false;\n }\n\n if (\n value.thinkingLevels !== undefined &&\n (!Array.isArray(value.thinkingLevels) ||\n !value.thinkingLevels.every((level) => typeof level === \"string\"))\n ) {\n return false;\n }\n\n return true;\n};\n\nconst isRegistryProvider = (value: unknown): value is RegistryProvider =>\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.label === \"string\" &&\n typeof value.defaultModel === \"string\" &&\n Array.isArray(value.models) &&\n value.models.every(isRegistryModel) &&\n (value.name === undefined || typeof value.name === \"string\") &&\n (value.logo === undefined || typeof value.logo === \"string\");\n\nexport const parseRegistryConfig = (value: unknown): RegistryConfig | undefined => {\n if (!isRecord(value) || typeof value.defaultProviderId !== \"string\" || !Array.isArray(value.providers)) {\n return undefined;\n }\n\n const providers = value.providers.filter(isRegistryProvider);\n if (providers.length === 0) {\n return undefined;\n }\n\n return {\n defaultProviderId: value.defaultProviderId,\n providers,\n };\n};\n\nexport type ChatReference = {\n id: string;\n text: string;\n};\n\n/** File part carried on the existing send payload. `url` is a data URL. */\nexport type ComposerFile = {\n mediaType: string;\n url: string;\n filename?: string;\n};\n\nexport type ComposerAttachment = ComposerFile & {\n id: string;\n filename: string;\n};\n\nexport type SendMessage = (\n message: { text: string; files?: ComposerFile[] },\n options?: { body?: { provider?: string; model?: string } },\n) => Promise<void>;\n\nexport type { ChatAdapter, ChatMessage, ChatStatus, ChatThread };\n\nexport const defaultRegistry: RegistryConfig = {\n defaultProviderId: ProviderId.MOCK,\n providers: [\n {\n id: ProviderId.SYMPHONY,\n label: \"Symphony (custom harness)\",\n defaultModel: \"\",\n models: [],\n },\n {\n id: ProviderId.MOCK,\n label: \"Mock\",\n defaultModel: \"canned\",\n models: [{ id: \"canned\", label: \"Canned replies\" }],\n },\n {\n id: ProviderId.OPENAI,\n label: \"OpenAI\",\n defaultModel: \"gpt-4.1\",\n models: [{ id: \"gpt-4.1\", label: \"GPT-4.1\" }],\n },\n {\n id: ProviderId.CLAUDE,\n label: \"Anthropic\",\n defaultModel: \"claude-3-7-sonnet-20250219\",\n models: [{ id: \"claude-3-7-sonnet-20250219\", label: \"Claude 3.7 Sonnet\" }],\n },\n {\n id: ProviderId.GOOGLE,\n label: \"Google\",\n defaultModel: \"gemini-2.5-flash\",\n models: [{ id: \"gemini-2.5-flash\", label: \"Gemini 2.5 Flash\" }],\n },\n {\n id: ProviderId.OLLAMA,\n label: \"Ollama\",\n defaultModel: \"smallthinker:latest\",\n models: [{ id: \"smallthinker:latest\", label: \"smallthinker:latest\" }],\n },\n ],\n};\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { ChatAdapter, ChatThread } from \"../../../types\";\nimport { createMessageId } from \"./message.helpers\";\n\ntype ThreadContextValue = {\n threads: ChatThread[];\n activeThreadId: string | null;\n isLoadingThread: boolean;\n activeThreadIdRef: React.MutableRefObject<string | null>;\n setThreads: React.Dispatch<React.SetStateAction<ChatThread[]>>;\n setIsLoadingThread: React.Dispatch<React.SetStateAction<boolean>>;\n selectThread: (threadId: string) => Promise<void>;\n createThread: () => Promise<void>;\n deleteThread: (threadId: string) => Promise<void>;\n};\n\nconst ThreadContext = createContext<ThreadContextValue | null>(null);\n\ntype ThreadProviderProps = {\n adapter: ChatAdapter;\n children: ReactNode;\n defaultThreadId?: string;\n};\n\nexport function ThreadProvider({\n adapter,\n children,\n defaultThreadId,\n}: ThreadProviderProps) {\n const [threads, setThreads] = useState<ChatThread[]>([]);\n const [activeThreadId, setActiveThreadId] = useState<string | null>(defaultThreadId ?? null);\n const [isLoadingThread, setIsLoadingThread] = useState(true);\n\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n const adapterRef = useRef(adapter);\n adapterRef.current = adapter;\n\n useEffect(() => {\n let cancelled = false;\n\n const bootstrap = async () => {\n setIsLoadingThread(true);\n\n if (defaultThreadId) {\n setThreads((current) =>\n current.some((thread) => thread.id === defaultThreadId)\n ? current\n : [{ id: defaultThreadId, title: \"New chat\" }, ...current],\n );\n setActiveThreadId(defaultThreadId);\n setIsLoadingThread(false);\n return;\n }\n\n const currentAdapter = adapterRef.current;\n\n if (!currentAdapter.listThreads || !currentAdapter.createThread) {\n const localThread = { id: createMessageId(\"thread\"), title: \"New chat\" };\n setThreads([localThread]);\n setActiveThreadId(localThread.id);\n setIsLoadingThread(false);\n return;\n }\n\n const nextThreads = await currentAdapter.listThreads();\n if (cancelled) {\n return;\n }\n\n if (nextThreads.length > 0) {\n setThreads(nextThreads);\n setActiveThreadId(nextThreads[0].id);\n setIsLoadingThread(false);\n return;\n }\n\n const thread = await currentAdapter.createThread();\n if (cancelled) {\n return;\n }\n\n setThreads([thread]);\n setActiveThreadId(thread.id);\n setIsLoadingThread(false);\n };\n\n bootstrap().catch(() => {\n if (!cancelled) {\n setIsLoadingThread(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [defaultThreadId]);\n\n const selectThread = useCallback(async (threadId: string) => {\n setActiveThreadId((current) => (current === threadId ? current : threadId));\n }, []);\n\n const createThread = useCallback(async () => {\n const currentAdapter = adapterRef.current;\n const thread = currentAdapter.createThread\n ? await currentAdapter.createThread()\n : { id: createMessageId(\"thread\"), title: \"New chat\" };\n\n setThreads((current) => [thread, ...current]);\n setActiveThreadId(thread.id);\n }, []);\n\n const deleteThread = useCallback(\n async (threadId: string) => {\n await adapterRef.current.deleteThread?.(threadId);\n\n setThreads((current) => {\n const remaining = current.filter((thread) => thread.id !== threadId);\n\n setActiveThreadId((active) => {\n if (active !== threadId) {\n return active;\n }\n\n const nextActive = remaining[0]?.id ?? null;\n if (!nextActive) {\n void createThread();\n }\n return nextActive;\n });\n\n return remaining;\n });\n },\n [createThread],\n );\n\n const value = useMemo<ThreadContextValue>(\n () => ({\n threads,\n activeThreadId,\n isLoadingThread,\n activeThreadIdRef,\n setThreads,\n setIsLoadingThread,\n selectThread,\n createThread,\n deleteThread,\n }),\n [\n activeThreadId,\n createThread,\n deleteThread,\n isLoadingThread,\n selectThread,\n threads,\n ],\n );\n\n return <ThreadContext.Provider value={value}>{children}</ThreadContext.Provider>;\n}\n\nexport function useThread() {\n const context = useContext(ThreadContext);\n if (!context) {\n throw new Error(\"useThread must be used inside ThreadProvider\");\n }\n return context;\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport type { ChatAdapter } from \"../../../types\";\nimport { ComposerProvider } from \"./composer.context\";\nimport { MessagesProvider } from \"./messages.context\";\nimport { ModelProvider } from \"./model.context\";\nimport { ThreadProvider } from \"./thread.context\";\nimport { ProviderId } from \"./types\";\n\nexport type ChatContextProviderProps = {\n adapter: ChatAdapter;\n children: ReactNode;\n defaultProvider?: string;\n defaultThreadId?: string;\n registryUrl?: string;\n};\n\nexport function ChatContextProvider({\n adapter,\n children,\n defaultProvider = ProviderId.MOCK,\n defaultThreadId,\n registryUrl = \"/api/ai/registry\",\n}: ChatContextProviderProps) {\n return (\n <ModelProvider defaultProvider={defaultProvider} registryUrl={registryUrl}>\n <ThreadProvider adapter={adapter} defaultThreadId={defaultThreadId}>\n <MessagesProvider adapter={adapter}>\n <ComposerProvider>{children}</ComposerProvider>\n </MessagesProvider>\n </ThreadProvider>\n </ModelProvider>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { clearErrorShake, motion, triggerErrorShake } from \"../../motion\";\nimport { useComposer } from \"./context\";\n\nexport const ChatInput = ({\n placeholder = \"Message...\",\n expanded = true,\n}: {\n placeholder?: string;\n expanded?: boolean;\n}) => {\n const { input, setInput, disabled, submitInput, attachments } = useComposer();\n const ref = useRef<HTMLTextAreaElement>(null);\n const hasDraft = input.trim().length > 0 || attachments.length > 0;\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n if (!expanded) {\n el.style.height = \"\";\n el.style.overflowY = \"hidden\";\n return;\n }\n el.style.height = \"auto\";\n const shell = el.closest<HTMLElement>(\".chat-composer-shell\");\n const isSmall = shell?.dataset.variant === \"small\";\n const max = isSmall ? 128 : 320;\n el.style.height = `${Math.min(el.scrollHeight, max)}px`;\n el.style.overflowY = el.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [expanded, input]);\n\n return (\n <div className=\"chat-composer-input\">\n <textarea\n ref={ref}\n value={input}\n onChange={(event) => {\n const wrap = event.currentTarget.closest<HTMLElement>(`.${motion.inputWrap}`);\n if (wrap) {\n clearErrorShake(wrap);\n }\n setInput(event.target.value);\n }}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\" || event.shiftKey) return;\n if (event.nativeEvent.isComposing) return;\n event.preventDefault();\n if (disabled) {\n return;\n }\n if (!hasDraft) {\n const wrap = event.currentTarget.closest<HTMLElement>(`.${motion.inputWrap}`);\n if (wrap) {\n triggerErrorShake(wrap);\n }\n return;\n }\n void submitInput();\n }}\n />\n </div>\n );\n};\n","\"use client\";\n\nimport { X } from \"lucide-react\";\nimport { useComposer } from \"./context\";\n\nexport const ChatReferences = () => {\n const { references, removeReference } = useComposer();\n\n if (references.length === 0) {\n return null;\n }\n\n return (\n <div className=\"chat-references\">\n {references.map((reference, index) => (\n <div key={reference.id} className=\"chat-reference\" title={reference.text}>\n <span className=\"chat-reference-text\">{reference.text}</span>\n <button\n type=\"button\"\n className=\"chat-icon-button\"\n aria-label={`Remove reference ${index + 1}`}\n onClick={() => removeReference(reference.id)}\n >\n <X size={12} />\n </button>\n </div>\n ))}\n </div>\n );\n};\n","\"use client\";\n\nimport { Send, Square } from \"lucide-react\";\nimport { useComposer, useMessages } from \"./context\";\n\nexport const ChatSend = () => {\n const { canSend, submitInput } = useComposer();\n const { status, stopResponse, isSending } = useMessages();\n\n return (\n <button\n className=\"chat-send\"\n type=\"button\"\n data-state={isSending ? \"stop\" : \"send\"}\n onClick={isSending ? stopResponse : submitInput}\n disabled={isSending ? false : !canSend}\n aria-label={isSending ? \"Stop response\" : \"Send message\"}\n >\n {isSending ? <Square size={14} fill=\"currentColor\" /> : <Send size={16} />}\n </button>\n );\n};\n","\"use client\";\n\nimport { Fragment, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectLabel,\n SelectTrigger,\n SelectItem,\n} from \"../../ui/select\";\nimport { Check, Ellipsis } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { motion, useDropdownPresence, type DropdownOrigin } from \"../../motion\";\nimport { useMessages, useModel } from \"./context\";\n\nconst SELECT_ORIGIN: DropdownOrigin = \"top-left\";\nconst THINKING_ORIGIN: DropdownOrigin = \"top-right\";\n\nconst ProviderBadge = ({ logo, name }: { logo?: string; name: string }) => {\n if (logo) {\n return (\n <img\n className=\"chat-model-provider-logo\"\n src={logo}\n alt=\"\"\n aria-hidden=\"true\"\n />\n );\n }\n\n return (\n <span className=\"chat-model-provider-logo chat-model-provider-fallback\" aria-hidden=\"true\">\n {name.slice(0, 1)}\n </span>\n );\n};\n\nexport const ChatSelect = () => {\n const { provider, model, registry, setProvider, getThinkingLevel, setThinkingLevel } = useModel();\n const { isSending } = useMessages();\n const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const [thinkingOpen, setThinkingOpen] = useState<string | null>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n const rootRef = useRef<HTMLElement | null>(null);\n const menu = useDropdownPresence(menuOpen, rootRef);\n const selectedValue = `${provider}::${model}`;\n const selectedProvider = registry.providers.find((entry) => entry.id === provider);\n const selectedModel = selectedProvider?.models.find((entry) => entry.id === model);\n const providerName = selectedProvider?.name ?? selectedProvider?.label ?? provider;\n const modelLabel = selectedModel?.label ?? (model || \"Loading models…\");\n const filteredProviders = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return registry.providers;\n return registry.providers\n .map((entry) => ({\n ...entry,\n models: entry.models.filter(\n (item) =>\n item.label.toLowerCase().includes(q) ||\n item.id.toLowerCase().includes(q) ||\n (item.description && item.description.toLowerCase().includes(q)) ||\n entry.label.toLowerCase().includes(q),\n ),\n }))\n .filter((entry) => entry.models.length > 0);\n }, [registry.providers, query]);\n const setRootElement = useCallback((node: HTMLDivElement | null) => {\n const found = node?.closest(\".chat-root\");\n rootRef.current = found instanceof HTMLElement ? found : null;\n setPortalContainer(found instanceof HTMLElement ? found : null);\n }, []);\n\n return (\n <div ref={setRootElement}>\n <Select\n open={menuOpen || menu.mounted}\n onOpenChange={setMenuOpen}\n value={selectedValue}\n onValueChange={(value) => {\n const separator = value.indexOf(\"::\");\n if (separator <= 0) {\n return;\n }\n\n const nextProvider = value.slice(0, separator);\n const nextModel = value.slice(separator + 2);\n const match = registry.providers.find((entry) => entry.id === nextProvider);\n if (!match || !nextModel) {\n return;\n }\n\n setProvider(match.id, nextModel);\n }}\n disabled={isSending}\n >\n <SelectTrigger className=\"chat-model-trigger\">\n <span className=\"chat-model-selected\">\n {selectedModel ? (\n <ProviderBadge logo={selectedProvider?.logo} name={providerName} />\n ) : null}\n <span>{modelLabel}</span>\n </span>\n </SelectTrigger>\n <SelectContent\n align=\"start\"\n position=\"popper\"\n sideOffset={6}\n collisionPadding={12}\n className={cn(\"chat-model-content\", motion.dropdown, menu.className)}\n data-origin={SELECT_ORIGIN}\n portalContainer={portalContainer}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n setQuery(\"\");\n setThinkingOpen(null);\n }}\n onPointerDownOutside={() => setThinkingOpen(null)}\n >\n <div className=\"chat-model-search\">\n <input\n autoFocus\n placeholder=\"Search models\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => event.stopPropagation()}\n className=\"chat-model-search-input\"\n />\n </div>\n <div className=\"chat-model-list\">\n {filteredProviders.length === 0 ? (\n <div className=\"chat-model-empty\">No models found</div>\n ) : (\n filteredProviders.map((entry) => {\n const providerName = entry.name ?? entry.label;\n const hideLabel = filteredProviders.length === 1;\n\n return (\n <Fragment key={entry.id}>\n <SelectGroup className=\"chat-model-group\">\n {hideLabel ? null : (\n <SelectLabel className=\"chat-model-label\">\n <ProviderBadge logo={entry.logo} name={providerName} />\n <span>{providerName}</span>\n </SelectLabel>\n )}\n {entry.models.map((item) => {\n const key = `${entry.id}::${item.id}`;\n const levels = item.thinkingLevels;\n const defaultThinking =\n levels && levels.length > 0\n ? (levels.includes(\"medium\") ? \"medium\" : levels[0])\n : undefined;\n const thinking = defaultThinking && levels ? { levels } : undefined;\n const activeThinking = defaultThinking\n ? (getThinkingLevel(entry.id, item.id) ?? defaultThinking)\n : undefined;\n const isOpen = thinkingOpen === key;\n\n return (\n <ModelRow\n key={key}\n itemKey={key}\n item={item}\n thinking={thinking}\n activeThinking={activeThinking}\n isOpen={isOpen}\n onToggleThinking={() => setThinkingOpen(isOpen ? null : key)}\n onPickThinking={(level) => {\n setThinkingLevel(entry.id, item.id, level);\n setThinkingOpen(null);\n }}\n />\n );\n })}\n </SelectGroup>\n </Fragment>\n );\n })\n )}\n </div>\n </SelectContent>\n </Select>\n </div>\n );\n};\n\nconst ModelRow = ({\n itemKey,\n item,\n thinking,\n activeThinking,\n isOpen,\n onToggleThinking,\n onPickThinking,\n}: {\n itemKey: string;\n item: { id: string; label: string; description?: string };\n thinking?: { levels: string[] };\n activeThinking?: string;\n isOpen: boolean;\n onToggleThinking: () => void;\n onPickThinking: (level: string) => void;\n}) => {\n const menu = useDropdownPresence(isOpen);\n\n return (\n <div className=\"chat-model-row\">\n <SelectItem value={itemKey} className=\"chat-model-item\">\n <span className=\"chat-model-item-label\">{item.label}</span>\n {item.description ? (\n <span className=\"chat-model-item-hint\">{item.description}</span>\n ) : thinking && activeThinking ? (\n <span className=\"chat-model-item-hint\">{activeThinking}</span>\n ) : null}\n </SelectItem>\n {thinking ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Thinking settings\"\n className=\"chat-model-thinking-trigger\"\n data-open={isOpen ? \"true\" : \"false\"}\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onToggleThinking();\n }}\n >\n <Ellipsis className=\"chat-model-thinking-icon\" />\n </button>\n {menu.mounted ? (\n <div\n className={cn(\"chat-model-thinking-menu\", motion.dropdown, menu.className)}\n data-origin={THINKING_ORIGIN}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => event.stopPropagation()}\n >\n {thinking.levels.map((level) => {\n const isActive = level === activeThinking;\n return (\n <button\n key={level}\n type=\"button\"\n className=\"chat-model-thinking-option\"\n data-active={isActive ? \"true\" : \"false\"}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onPickThinking(level);\n }}\n >\n <span>{level}</span>\n {isActive ? <Check className=\"chat-model-thinking-check\" /> : null}\n </button>\n );\n })}\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n );\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n portalContainer,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content> & {\n portalContainer?: HTMLElement | null\n}) {\n return (\n <SelectPrimitive.Portal container={portalContainer}>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-slot=\"select-viewport\"\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-3.5 items-center justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\";\n\nimport { Pencil } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { normalizeAgentParts, type AgentDataPart } from \"@sarchauhan/protocol\";\nimport type { ChatMessage } from \"../../types\";\nimport { getUserDisplayText } from \"../../lib/message/user\";\nimport { useMessages } from \"../Chat/context\";\nimport { MessageContent } from \"../Message/message.content\";\nimport { MessageFeedback } from \"../Message/message.feedback\";\nimport { MessageUsage } from \"../Message/message.usage\";\n\nconst getMessageTargetId = (messageId: string) => `chat-message-${messageId}`;\n\nexport const MessageItem = ({ message }: { message: ChatMessage }) => {\n const { editAndResendMessage, isSending, messages } = useMessages();\n const [isEditing, setIsEditing] = useState(false);\n const [draft, setDraft] = useState(() => getUserDisplayText(message));\n const [isSubmittingEdit, setIsSubmittingEdit] = useState(false);\n const isUser = message.role === \"user\";\n const isActiveAssistantMessage =\n isSending && messages[messages.length - 1]?.id === message.id;\n\n const assistantText = message.parts\n .filter((part) => part.type === \"text\")\n .map((part) => (\"text\" in part ? String(part.text) : \"\"))\n .join(\"\\n\")\n .trim();\n const dataParts = normalizeAgentParts(message.parts).filter(\n (part): part is AgentDataPart => part.type === \"data\",\n );\n\n const previousUserMessage = [...messages].reverse().find((item) => item.role === \"user\");\n\n const cancelEdit = () => {\n setDraft(getUserDisplayText(message));\n setIsEditing(false);\n };\n\n const submitEdit = async () => {\n if (!draft.trim() || isSending || isSubmittingEdit) {\n return;\n }\n\n setIsSubmittingEdit(true);\n try {\n await editAndResendMessage(message.id, draft);\n setIsEditing(false);\n } finally {\n setIsSubmittingEdit(false);\n }\n };\n\n if (isUser) {\n return (\n <div id={getMessageTargetId(message.id)} className=\"chat-message chat-message-user\">\n <div className={`chat-message-user-inner${isEditing ? \" is-editing\" : \"\"}`}>\n <div className=\"chat-message-bubble\">\n {isEditing ? (\n <textarea\n className=\"chat-edit-area\"\n value={draft}\n disabled={isSubmittingEdit}\n autoFocus\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\" || event.shiftKey) return;\n if (event.nativeEvent.isComposing) return;\n event.preventDefault();\n void submitEdit();\n }}\n />\n ) : (\n <MessageContent parts={message.parts} isUser />\n )}\n </div>\n {isEditing ? (\n <div className=\"chat-message-actions\">\n <button\n type=\"button\"\n className=\"chat-text-button\"\n onClick={cancelEdit}\n disabled={isSubmittingEdit}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"chat-text-button chat-text-button-done\"\n onClick={submitEdit}\n disabled={!draft.trim() || isSubmittingEdit || isSending}\n >\n Done\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"chat-icon-button\"\n onClick={() => {\n setDraft(getUserDisplayText(message));\n setIsEditing(true);\n }}\n disabled={isSending}\n aria-label=\"Edit and resend message\"\n >\n <Pencil size={14} />\n </button>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"chat-message chat-message-assistant\">\n <div className=\"chat-message-assistant-inner\">\n <MessageContent parts={message.parts} isUser={false} />\n <MessageUsage parts={dataParts} />\n {isActiveAssistantMessage ? null : (\n <MessageFeedback\n responseText={assistantText}\n canRegenerate={!!previousUserMessage}\n disabled={isSending}\n onRegenerate={() => {\n if (previousUserMessage) {\n void editAndResendMessage(\n previousUserMessage.id,\n getUserDisplayText(previousUserMessage),\n );\n }\n }}\n />\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport { ThumbsDown, ThumbsUp } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { MessageCopy } from \"./message.copy\";\nimport { MessageRegenerate } from \"./message.regenerate\";\n\ntype MessageFeedbackProps = {\n responseText: string;\n onRegenerate: () => void;\n canRegenerate: boolean;\n disabled?: boolean;\n};\n\nexport const MessageFeedback = ({\n responseText,\n onRegenerate,\n canRegenerate,\n disabled = false,\n}: MessageFeedbackProps) => {\n const [feedback, setFeedback] = useState<\"up\" | \"down\" | null>(null);\n\n // An assistant placeholder is created before streaming starts. Actions on it\n // are misleading (and copy an empty string), so wait for visible text.\n if (!responseText.trim()) {\n return null;\n }\n\n return (\n <div className=\"chat-message-feedback\" aria-label=\"Message actions\">\n <MessageCopy text={responseText} disabled={disabled} />\n <MessageRegenerate\n onRegenerate={onRegenerate}\n disabled={!canRegenerate || disabled}\n />\n <button\n type=\"button\"\n className={`chat-feedback-button${feedback === \"up\" ? \" is-selected\" : \"\"}`}\n title=\"Good response\"\n aria-label=\"Good response\"\n aria-pressed={feedback === \"up\"}\n onClick={() => setFeedback(feedback === \"up\" ? null : \"up\")}\n disabled={disabled}\n >\n <ThumbsUp size={18} />\n </button>\n <button\n type=\"button\"\n className={`chat-feedback-button${feedback === \"down\" ? \" is-selected\" : \"\"}`}\n title=\"Poor response\"\n aria-label=\"Poor response\"\n aria-pressed={feedback === \"down\"}\n onClick={() => setFeedback(feedback === \"down\" ? null : \"down\")}\n disabled={disabled}\n >\n <ThumbsDown size={18} />\n </button>\n </div>\n );\n};\n","\"use client\";\n\nimport { Check, Copy } from \"lucide-react\";\nimport { useState } from \"react\";\n\nexport const MessageCopy = ({ text, disabled = false }: { text: string; disabled?: boolean }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n const copyMessage = async () => {\n await navigator.clipboard.writeText(text);\n setIsCopied(true);\n window.setTimeout(() => setIsCopied(false), 1500);\n };\n\n return (\n <button\n type=\"button\"\n className=\"chat-feedback-button\"\n title={isCopied ? \"Copied\" : \"Copy response\"}\n aria-label={isCopied ? \"Copied\" : \"Copy response\"}\n onClick={() => void copyMessage()}\n disabled={disabled}\n >\n {isCopied ? <Check size={16} /> : <Copy size={16} />}\n </button>\n );\n};\n","\"use client\";\n\nimport { RotateCcw } from \"lucide-react\";\n\ntype MessageRegenerateProps = {\n onRegenerate: () => void;\n disabled?: boolean;\n};\n\nexport const MessageRegenerate = ({ onRegenerate, disabled = false }: MessageRegenerateProps) => (\n <button\n type=\"button\"\n className=\"chat-feedback-button\"\n title=\"Regenerate response\"\n aria-label=\"Regenerate response\"\n disabled={disabled}\n onClick={onRegenerate}\n >\n <RotateCcw size={17} />\n </button>\n);\n","import {\n parseContext,\n parseUsage,\n type AgentContext,\n type AgentDataPart,\n} from \"@sarchauhan/protocol\";\n\nconst formatTokens = (value: number) => new Intl.NumberFormat(\"en-US\").format(value);\nconst isTokenCount = (value: unknown): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\nconst getContextMetrics = (context: AgentContext | undefined) => {\n const currentTokens = context?.current_tokens;\n const contextWindow = context?.context_window;\n\n return isTokenCount(currentTokens) && isTokenCount(contextWindow)\n ? { currentTokens, contextWindow }\n : null;\n};\n\nexport const MessageUsage = ({ parts }: { parts: AgentDataPart[] }) => {\n const usage = parseUsage(parts.find((part) => part.name === \"usage\")?.data);\n const context = parseContext(parts.find((part) => part.name === \"context\")?.data);\n const contextMetrics = getContextMetrics(context);\n const tokenMetrics = usage\n ? [\n [\"in\", usage.input_tokens],\n [\"out\", usage.output_tokens],\n [\"reasoning\", usage.reasoning_tokens],\n [\"total\", usage.total_tokens],\n ].filter((metric): metric is [string, number] => isTokenCount(metric[1]))\n : [];\n\n if (!contextMetrics && tokenMetrics.length === 0) return null;\n\n return (\n <p className=\"chat-message-usage\" aria-label=\"Context and token usage\">\n {contextMetrics ? (\n <>\n Context {formatTokens(contextMetrics.currentTokens)} / {formatTokens(contextMetrics.contextWindow)} ({Math.round((contextMetrics.currentTokens / contextMetrics.contextWindow) * 100)}%)\n </>\n ) : null}\n {tokenMetrics.length > 0 ? (\n <>\n {contextMetrics ? \" · \" : null}\n Tokens {tokenMetrics.map(([label, value]) => `${label} ${formatTokens(value)}`).join(\" · \")}\n </>\n ) : null}\n </p>\n );\n};\n","\"use client\";\n\nimport { useMessages, useThread } from \"../Chat/context\";\nimport { MessageItem } from \"../Message/message.item\";\nimport { TextSkeleton } from \"./message.skeleton\";\n\nconst WaitingForResponse = () => (\n <div className=\"chat-response-status\" role=\"status\" aria-live=\"polite\">\n <TextSkeleton />\n </div>\n);\n\nexport const Message = () => {\n const { messages, isWaitingForResponse } = useMessages();\n const { isLoadingThread } = useThread();\n\n if (isLoadingThread) {\n return (\n <div className=\"chat-messages-inner\">\n <div className=\"chat-loading chat-loading-initial\" role=\"status\" aria-live=\"polite\">\n Loading conversation…\n </div>\n </div>\n );\n }\n\n if (messages.length === 0) {\n return (\n <div className=\"chat-messages-inner\">\n <div className=\"chat-empty\">\n <div>\n <p className=\"chat-empty-title\">How can I help?</p>\n <p className=\"chat-empty-copy\">\n Ask a question, explore ideas, or use tools and widgets when the agent needs them.\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"chat-messages-inner\">\n {messages.map((message) => (\n <MessageItem key={message.id} message={message} />\n ))}\n {isWaitingForResponse ? <WaitingForResponse /> : null}\n </div>\n );\n};\n","export { Chat } from \"./components/Chat\";\nexport { ChatComposer, type ComposerCollapsedVariant } from \"./components/Chat/chat\";\nexport {\n ChatContextProvider,\n ProviderId,\n isProviderId,\n parseRegistryConfig,\n useChat,\n useComposer,\n useMessages,\n useModel,\n useThread,\n type ChatReference,\n type ComposerAttachment,\n type ComposerFile,\n type SendMessage,\n} from \"./components/Chat/chat.context\";\nexport type {\n RegistryConfig,\n RegistryModel,\n RegistryProvider,\n} from \"./components/Chat/chat.context\";\nexport { Message } from \"./components/Message/message\";\nexport { MessageFeedback } from \"./components/Message/message.feedback\";\nexport { MessageUsage } from \"./components/Message/message.usage\";\nexport { LoadingState, formatElapsed, formatElapsedWords } from \"./components/Message/message.loading\";\nexport { ThinkingBlock } from \"./components/Message/message.thinking\";\nexport { MessageContent } from \"./components/Message/message.content\";\nexport { ThemeProvider, useTheme, type ChatTheme } from \"./theme/theme.context\";\nexport { ThemeToggle } from \"./theme/theme.toggle\";\nexport { BaseWidget, type BaseWidgetProps } from \"./components/Widget/base.widget\";\nexport {\n useWidgets,\n WidgetProvider,\n createWidgetRegistry,\n defineWidget,\n type ChatWidgetDefinition,\n type ChatWidgetComponent,\n type ChatWidgetEntry,\n type ChatWidgetInput,\n type ChatWidgetProps,\n type ChatWidgetRegistry,\n type DefineWidgetOptions,\n type WidgetComponentProps,\n type WidgetControls,\n type WidgetResponse,\n} from \"./components/Widget/widget.context\";\nexport { WidgetRenderer } from \"./components/Widget/widget.renderer\";\nexport type {\n ChatAdapter,\n ChatMessage,\n ChatMessagePart,\n ChatRole,\n ChatStatus,\n ChatThread,\n EditMessageInput,\n SendMessageInput,\n} from \"@sarchauhan/adapter\";\nexport { defineAdapter } from \"@sarchauhan/adapter\";\nexport type {\n AgentEvent,\n AgentMessage,\n AgentPart,\n AgentToolPart,\n AgentWidgetPart,\n} from \"@sarchauhan/protocol\";\nexport {\n TextSwap,\n calibrateCheckPath,\n clearErrorShake,\n closeDropdown,\n dropdownOrigins,\n iconSwapStates,\n motion,\n motionData,\n motionRoot,\n openDropdown,\n prefersReducedMotion,\n readDurationMs,\n successCheckStates,\n swapText,\n triggerErrorShake,\n useDropdownPresence,\n type DropdownOrigin,\n type DropdownPhase,\n type IconSwapState,\n type MotionClass,\n type SuccessCheckState,\n} from \"./motion\";\nexport {\n applyAgentEvent,\n createAgentMessageState,\n createWidgetData,\n normalizeAgentMessage,\n normalizeAgentParts,\n reduceAgentEvents,\n} from \"@sarchauhan/protocol\";\n\nexport * from \"./widgets/index\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,iBAAiB;AAE1B,SAAS,eAAAA,cAAa,iBAAiB,WAAAC,UAAS,UAAAC,gBAAc;;;ACF9D,SAAS,MAAM,WAAW;AAeV;AAZT,SAAS,YAAY,EAAE,UAAU,GAA2B;AACjE,QAAM,EAAE,eAAe,YAAY,IAAI,SAAS;AAChD,QAAM,SAAS,kBAAkB;AAEjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,CAAC,qBAAqB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACpE,SAAS;AAAA,MACT,cAAY,SAAS,0BAA0B;AAAA,MAC/C,OAAO,SAAS,eAAe;AAAA,MAE9B,mBAAS,oBAAC,OAAI,MAAM,IAAI,aAAa,MAAM,IAAK,oBAAC,QAAK,MAAM,IAAI,aAAa,MAAM;AAAA;AAAA,EACtF;AAEJ;;;AClBA,SAAS,qBAAqB;AAC9B,SAAS,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACD5C,SAAS,UAAU,WAAW,SAAS;AACvC,SAAS,UAAAC,eAAc;;;ACDvB,SAAS,WAAAC,gBAA8B;;;ACAvC;AAAA,EACE,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;;;ACRP,SAAS,MAAM,WAAW,QAAQ,gBAAgB;AAClD,SAAS,oBAAoB;AA+IzB,gBAAAC,YAAA;AAtIJ,IAAM,sBAAsB,CAAC,cAAyB;AAZtD;AAaE,QAAM,iBAAgB,eAAU,eAAV,mBAAsB;AAC5C,QAAM,gBAAe,eAAU,cAAV,mBAAqB;AAE1C,SAAO;AAAA,KACL,+CAAe,QAAQ,gDACrB,6CAAc,QAAQ;AAAA,EAC1B;AACF;AAEA,IAAM,mBAAmB,CAAC,UAAiB;AACzC,QAAM,OAAO,MAAM,sBAAsB;AACzC,QAAM,eAAe,MAAM,eAAe,EAAE,CAAC;AAC7C,SAAO,KAAK,SAAS,KAAK,SAAS,OAAO;AAC5C;AAEA,IAAM,oBAAoB,CACxB,OACA,cACiD;AACjD,QAAM,gBAAgB,iBAAiB,KAAK;AAC5C,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,UAAU,sBAAsB;AAEtD,SAAO;AAAA,IACL,KAAK,KAAK,IAAI,GAAG,cAAc,MAAM,cAAc,MAAM,UAAU,SAAS;AAAA,IAC5E,MAAM,cAAc,OAAO,cAAc,OAAO,UAAU,aAAa,cAAc,QAAQ;AAAA,EAC/F;AACF;AAEA,IAAM,gBAAgB,MAA6C;AACjE,QAAM,YAAY,OAAO,aAAa;AACtC,QAAM,OAAO,uCAAW,WAAW,QAAQ,QAAQ,KAAK;AAExD,MAAI,CAAC,aAAa,CAAC,QAAQ,UAAU,eAAe,KAAK,UAAU,aAAa;AAC9E,WAAO;AAAA,EACT;AAEA,MAAI,oBAAoB,SAAS,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,UAAU,WAAW,CAAC,EAAE,WAAW;AAAA,EAC5C;AACF;AAEA,IAAM,qBAAqB,CAAC,UAAiB;AAC3C,QAAM,OAAO,MAAM;AACnB,QAAM,UAAU,gBAAgB,UAAU,OAAO,KAAK;AACtD,QAAM,QAAQ,mCAAS,QAAQ;AAC/B,SAAO,iBAAiB,cAAc,QAAQ;AAChD;AAMO,IAAM,cAAc,KAAK,SAASC,aAAY;AAAA,EACnD;AACF,GAAqB;AACnB,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiC,IAAI;AACnF,QAAM,WAAW,OAAqB,IAAI;AAC1C,QAAM,UAAU,OAAO,EAAE;AAEzB,YAAU,MAAM;AACd,UAAM,uBAAuB,MAAM;AACjC,eAAS,UAAU;AACnB,cAAQ,UAAU;AAClB,yBAAmB,IAAI;AAAA,IACzB;AAEA,UAAM,eAAe,MAAM;AACzB,YAAM,QAAQ,SAAS;AACvB,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,YAAM,YAAY,mBAAmB,KAAK;AAC1C,UAAI,CAAC,WAAW;AACd,6BAAqB;AACrB;AAAA,MACF;AAEA,YAAM,WAAW,kBAAkB,OAAO,SAAS;AACnD,UAAI,CAAC,UAAU;AACb,6BAAqB;AACrB;AAAA,MACF;AAEA,yBAAmB;AAAA,QACjB,MAAM,QAAQ;AAAA,QACd,KAAK,SAAS;AAAA,QACd,MAAM,SAAS;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,mBAAmB,MAAM;AAC7B,YAAM,OAAO,cAAc;AAC3B,UAAI,CAAC,MAAM;AACT,6BAAqB;AACrB;AAAA,MACF;AAEA,eAAS,UAAU,KAAK;AACxB,cAAQ,UAAU,KAAK;AACvB,mBAAa;AAAA,IACf;AAEA,aAAS,iBAAiB,WAAW,gBAAgB;AACrD,aAAS,iBAAiB,SAAS,gBAAgB;AACnD,aAAS,iBAAiB,mBAAmB,gBAAgB;AAC7D,WAAO,iBAAiB,UAAU,cAAc,IAAI;AACpD,WAAO,iBAAiB,UAAU,YAAY;AAE9C,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,gBAAgB;AACxD,eAAS,oBAAoB,SAAS,gBAAgB;AACtD,eAAS,oBAAoB,mBAAmB,gBAAgB;AAChE,aAAO,oBAAoB,UAAU,cAAc,IAAI;AACvD,aAAO,oBAAoB,UAAU,YAAY;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,OAAO,EAAE,KAAK,gBAAgB,KAAK,MAAM,gBAAgB,KAAK;AAAA,QAC9D,cAAW;AAAA,QACX,eAAe,CAAC,UAAU,MAAM,eAAe;AAAA,QAC/C,SAAS,MAAM;AAxJrB;AAyJQ,yBAAe,gBAAgB,IAAI;AACnC,uBAAO,aAAa,MAApB,mBAAuB;AACvB,mBAAS,UAAU;AACnB,kBAAQ,UAAU;AAClB,6BAAmB,IAAI;AAAA,QACzB;AAAA,QACD;AAAA;AAAA,IAED;AAAA,IACA,gBAAgB;AAAA,EAClB;AACF,CAAC;;;ACjKM,IAAM,yBAAyB,CAAC,SACrC,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAI;AAEzC,IAAM,kBAAkB,CAAC,WAAgB;AANhD;AAOE,sCAAW,WAAX,mBAAmB,eAAnB,4CAAqC,GAAG,MAAM,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA;AAE9F,IAAM,oBAAoB,CAAC,MAAc,QAAwB,CAAC,OAAoB;AAAA,EAC3F,IAAI,gBAAgB,KAAK;AAAA,EACzB,MAAM;AAAA,EACN,OAAO;AAAA,IACL,GAAG,MAAM,IAAI,CAAC,UAAU;AAAA,MACtB,MAAM;AAAA,MACN,WAAW,KAAK;AAAA,MAChB,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,IACjB,EAAE;AAAA,IACF,GAAI,OAAO,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC,IAAI,CAAC;AAAA,EAClD;AACF;AAEO,IAAM,oBAAoB,CAAC,SAAsB,UAA+B;AAAA,EACrF,GAAG;AAAA,EACH,OAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAChC;AAEO,IAAM,yBAAyB,CAAC,SAAwB,gBAA6B;AAC1F,QAAM,gBAAgB,QAAQ,UAAU,CAAC,YAAY,QAAQ,OAAO,YAAY,EAAE;AAElF,MAAI,kBAAkB,IAAI;AACxB,WAAO,CAAC,GAAG,SAAS,WAAW;AAAA,EACjC;AAEA,SAAO,QAAQ,IAAI,CAAC,SAAS,UAAW,UAAU,gBAAgB,cAAc,OAAQ;AAC1F;;;AClCA;AAAA,EACE,iBAAAE;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;AACP,SAAS,iBAAiB;;;ACV1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;;;ACTA,IAAK,aAAL,kBAAKC,gBAAL;AACL,EAAAA,YAAA,cAAW;AACX,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,WAAQ;AATE,SAAAA;AAAA,GAAA;AAkCZ,IAAM,eAAoC,IAAI,IAAI,OAAO,OAAO,UAAU,CAAC;AAEpE,IAAM,eAAe,CAAC,UAC3B,OAAO,UAAU,YAAY,aAAa,IAAI,KAAK;AAErD,IAAM,WAAW,CAAC,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAM,kBAAkB,CAAC,UAA2C;AAClE,MAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,OAAO,YAAY,OAAO,MAAM,UAAU,UAAU;AACvF,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,gBAAgB,UAAa,OAAO,MAAM,gBAAgB,UAAU;AAC5E,WAAO;AAAA,EACT;AAEA,MACE,MAAM,mBAAmB,WACxB,CAAC,MAAM,QAAQ,MAAM,cAAc,KAClC,CAAC,MAAM,eAAe,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,IAClE;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,qBAAqB,CAAC,UAC1B,SAAS,KAAK,KACd,OAAO,MAAM,OAAO,YACpB,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,iBAAiB,YAC9B,MAAM,QAAQ,MAAM,MAAM,KAC1B,MAAM,OAAO,MAAM,eAAe,MACjC,MAAM,SAAS,UAAa,OAAO,MAAM,SAAS,cAClD,MAAM,SAAS,UAAa,OAAO,MAAM,SAAS;AAE9C,IAAM,sBAAsB,CAAC,UAA+C;AACjF,MAAI,CAAC,SAAS,KAAK,KAAK,OAAO,MAAM,sBAAsB,YAAY,CAAC,MAAM,QAAQ,MAAM,SAAS,GAAG;AACtG,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,UAAU,OAAO,kBAAkB;AAC3D,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,mBAAmB,MAAM;AAAA,IACzB;AAAA,EACF;AACF;AA0BO,IAAM,kBAAkC;AAAA,EAC7C,mBAAmB;AAAA,EACnB,WAAW;AAAA,IACT;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ,CAAC;AAAA,IACX;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ,CAAC,EAAE,IAAI,UAAU,OAAO,iBAAiB,CAAC;AAAA,IACpD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ,CAAC,EAAE,IAAI,WAAW,OAAO,UAAU,CAAC;AAAA,IAC9C;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ,CAAC,EAAE,IAAI,8BAA8B,OAAO,oBAAoB,CAAC;AAAA,IAC3E;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ,CAAC,EAAE,IAAI,oBAAoB,OAAO,mBAAmB,CAAC;AAAA,IAChE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,QAAQ,CAAC,EAAE,IAAI,uBAAuB,OAAO,sBAAsB,CAAC;AAAA,IACtE;AAAA,EACF;AACF;;;ADcS,gBAAAC,YAAA;AAvIT,IAAM,eAAe,cAAwC,IAAI;AAQ1D,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAuB;AACrB,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAyB,eAAe;AACxE,QAAM,CAAC,UAAU,gBAAgB,IAAIA,UAAS,eAAe;AAC7D,QAAM,CAAC,OAAO,aAAa,IAAIA;AAAA,IAC7B,MAAG;AAjDP;AAkDM,yCAAgB,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,eAAe,MAAtE,mBAAyE,iBAAzE,YAAyF;AAAA;AAAA,EAC7F;AACA,QAAM,CAAC,gBAAgB,sBAAsB,IAAIA,UAAiC,MAAM;AACtF,UAAM,UAAkC,CAAC;AACzC,eAAW,KAAK,gBAAgB,WAAW;AACzC,iBAAW,KAAK,EAAE,QAAQ;AACxB,cAAM,SAAS,EAAE;AACjB,YAAI,iCAAQ,OAAQ,SAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,OAAO,SAAS,QAAQ,IAAI,WAAW,OAAO,CAAC;AAAA,MACnG;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,cAAcC,QAAO,QAAQ;AACnC,QAAM,WAAWA,QAAO,KAAK;AAC7B,QAAM,oBAAoBA,QAAO,cAAc;AAC/C,cAAY,UAAU;AACtB,WAAS,UAAU;AACnB,oBAAkB,UAAU;AAE5B,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY;AAEhB,UAAM,eAAe,YAAY;AAzErC;AA0EM,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,aAAa,EAAE,OAAO,WAAW,CAAC;AAC/D,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,yBAAyB;AAAA,QAC3C;AAEA,cAAM,OAAO,oBAAoB,MAAM,SAAS,KAAK,CAAC;AACtD,YAAI,aAAa,CAAC,MAAM;AACtB;AAAA,QACF;AAEA,oBAAY,IAAI;AAChB,cAAM,eAAuC,CAAC;AAC9C,mBAAW,KAAK,KAAK,WAAW;AAC9B,qBAAW,KAAK,EAAE,QAAQ;AACxB,kBAAM,SAAS,EAAE;AACjB,gBAAI,iCAAQ,OAAQ,cAAa,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,OAAO,SAAS,QAAQ,IAAI,WAAW,OAAO,CAAC;AAAA,UACxG;AAAA,QACF;AACA,+BAAuB,CAAC,UAAU,EAAE,GAAG,cAAc,GAAG,KAAK,EAAE;AAC/D,cAAM,aACJ,UAAK,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,iBAAiB,MAAlE,YACA,KAAK,UAAU,CAAC;AAClB,YAAI,WAAW;AACb,2BAAiB,UAAU,EAAE;AAC7B,wBAAc,UAAU,YAAY;AAAA,QACtC;AAAA,MACF,QAAQ;AACN,YAAI,CAAC,WAAW;AACd,sBAAY,eAAe;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,SAAK,aAAa;AAClB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,EAAAA,WAAU,MAAM;AAlHlB;AAmHI,UAAM,gBACJ,oBAAS,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ,MAAxD,YACA,SAAS,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,SAAS,iBAAiB,MAD1E,YAEA,SAAS,UAAU,CAAC;AAEtB,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,WAAW,aAAa,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK;AACvE,QAAI,CAAC,UAAU;AACb,uBAAiB,aAAa,EAAE;AAChC,oBAAc,aAAa,YAAY;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,OAAO,UAAU,QAAQ,CAAC;AAE9B,QAAM,cAAc,YAAY,CAAC,cAAsB,cAAuB;AAC5E,qBAAiB,YAAY;AAC7B,QAAI,WAAW;AACb,oBAAc,SAAS;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB;AAAA,IACvB,CAAC,YAAoB,YAAoB,eAAe,GAAG,UAAU,KAAK,OAAO,EAAE;AAAA,IACnF,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,mBAAmB,YAAY,CAAC,YAAoB,SAAiB,UAAkB;AAC3F,2BAAuB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,UAAU,KAAK,OAAO,EAAE,GAAG,MAAM,EAAE;AAAA,EACtF,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,YAAY,CAAC,cAAsB;AAClD,kBAAc,SAAS;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,UAAU,UAAU,UAAU,aAAa,gBAAgB,kBAAkB,gBAAgB;AAAA,EACvG;AAEA,SAAO,gBAAAH,KAAC,aAAa,UAAb,EAAsB,OAAe,UAAS;AACxD;AAEO,SAAS,WAAW;AACzB,QAAM,UAAU,WAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;;;AE/KA;AAAA,EACE,iBAAAI;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;AA+JE,gBAAAC,YAAA;AA/IT,IAAM,gBAAgBC,eAAyC,IAAI;AAQ5D,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAuB,CAAC,CAAC;AACvD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAwB,4CAAmB,IAAI;AAC3F,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,IAAI;AAE3D,QAAM,oBAAoBC,QAAO,cAAc;AAC/C,oBAAkB,UAAU;AAC5B,QAAM,aAAaA,QAAO,OAAO;AACjC,aAAW,UAAU;AAErB,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY;AAEhB,UAAM,YAAY,YAAY;AAC5B,yBAAmB,IAAI;AAEvB,UAAI,iBAAiB;AACnB;AAAA,UAAW,CAAC,YACV,QAAQ,KAAK,CAACC,YAAWA,QAAO,OAAO,eAAe,IAClD,UACA,CAAC,EAAE,IAAI,iBAAiB,OAAO,WAAW,GAAG,GAAG,OAAO;AAAA,QAC7D;AACA,0BAAkB,eAAe;AACjC,2BAAmB,KAAK;AACxB;AAAA,MACF;AAEA,YAAM,iBAAiB,WAAW;AAElC,UAAI,CAAC,eAAe,eAAe,CAAC,eAAe,cAAc;AAC/D,cAAM,cAAc,EAAE,IAAI,gBAAgB,QAAQ,GAAG,OAAO,WAAW;AACvE,mBAAW,CAAC,WAAW,CAAC;AACxB,0BAAkB,YAAY,EAAE;AAChC,2BAAmB,KAAK;AACxB;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,eAAe,YAAY;AACrD,UAAI,WAAW;AACb;AAAA,MACF;AAEA,UAAI,YAAY,SAAS,GAAG;AAC1B,mBAAW,WAAW;AACtB,0BAAkB,YAAY,CAAC,EAAE,EAAE;AACnC,2BAAmB,KAAK;AACxB;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,eAAe,aAAa;AACjD,UAAI,WAAW;AACb;AAAA,MACF;AAEA,iBAAW,CAAC,MAAM,CAAC;AACnB,wBAAkB,OAAO,EAAE;AAC3B,yBAAmB,KAAK;AAAA,IAC1B;AAEA,cAAU,EAAE,MAAM,MAAM;AACtB,UAAI,CAAC,WAAW;AACd,2BAAmB,KAAK;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,eAAeC,aAAY,OAAO,aAAqB;AAC3D,sBAAkB,CAAC,YAAa,YAAY,WAAW,UAAU,QAAS;AAAA,EAC5E,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,aAAY,YAAY;AAC3C,UAAM,iBAAiB,WAAW;AAClC,UAAM,SAAS,eAAe,eAC1B,MAAM,eAAe,aAAa,IAClC,EAAE,IAAI,gBAAgB,QAAQ,GAAG,OAAO,WAAW;AAEvD,eAAW,CAAC,YAAY,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC5C,sBAAkB,OAAO,EAAE;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA;AAAA,IACnB,OAAO,aAAqB;AA5HhC;AA6HM,cAAM,sBAAW,SAAQ,iBAAnB,4BAAkC;AAExC,iBAAW,CAAC,YAAY;AACtB,cAAM,YAAY,QAAQ,OAAO,CAAC,WAAW,OAAO,OAAO,QAAQ;AAEnE,0BAAkB,CAAC,WAAW;AAlItC,cAAAC,KAAAC;AAmIU,cAAI,WAAW,UAAU;AACvB,mBAAO;AAAA,UACT;AAEA,gBAAM,cAAaA,OAAAD,MAAA,UAAU,CAAC,MAAX,gBAAAA,IAAc,OAAd,OAAAC,MAAoB;AACvC,cAAI,CAAC,YAAY;AACf,iBAAK,aAAa;AAAA,UACpB;AACA,iBAAO;AAAA,QACT,CAAC;AAED,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,QAAQC;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,gBAAAT,KAAC,cAAc,UAAd,EAAuB,OAAe,UAAS;AACzD;AAEO,SAAS,YAAY;AAC1B,QAAM,UAAUU,YAAW,aAAa;AACxC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO;AACT;;;AHkJS,gBAAAC,YAAA;AA7ST,IAAM,8BAA8B;AACpC,IAAM,OAAO,CAAC,iBAAyB,IAAI,QAAc,CAAC,YAAY,OAAO,WAAW,SAAS,YAAY,CAAC;AAE9G,IAAM,6BAA6B,CAAC,YAClC,QAAQ,MAAM,KAAK,CAAC,SAAS;AAC3B,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,UAAU,QAAQ,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAAS;AAAA,EACtF;AAEA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,UAAU,QAAQ,KAAK,SAAS,WAAW,KAAK,SAAS,aAAa,KAAK,SAAS;AAAA,EAC7F;AAEA,SAAO,CAAC,aAAa,QAAQ,UAAU,cAAc,mBAAmB,QAAQ,SAAS,EAAE,SAAS,KAAK,IAAI;AAC/G,CAAC;AAYH,IAAM,kBAAkBC,eAA2C,IAAI;AAOhE,SAAS,iBAAiB,EAAE,SAAS,SAAS,GAA0B;AAC7E,QAAM,EAAE,gBAAgB,mBAAmB,YAAY,mBAAmB,IAAI,UAAU;AACxF,QAAM,EAAE,aAAa,UAAU,kBAAkB,IAAI,SAAS;AAE9D,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAwB,CAAC,CAAC;AAC1D,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAqB,OAAO;AACxD,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,KAAK;AAEtE,QAAM,cAAcC,QAAO,QAAQ;AACnC,QAAM,YAAYA,QAAO,MAAM;AAC/B,QAAM,aAAaA,QAAO,OAAO;AACjC,QAAM,WAAWA,QAA+B,IAAI;AAEpD,cAAY,UAAU;AACtB,YAAU,UAAU;AACpB,aAAW,UAAU;AAErB,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY;AAEhB,UAAM,eAAe,YAAY;AAC/B,UAAI,CAAC,gBAAgB;AACnB,oBAAY,CAAC,CAAC;AACd,2BAAmB,KAAK;AACxB;AAAA,MACF;AAEA,YAAM,iBAAiB,WAAW;AAClC,UAAI,CAAC,eAAe,cAAc;AAChC,2BAAmB,KAAK;AACxB;AAAA,MACF;AAEA,yBAAmB,IAAI;AACvB,UAAI;AACF,cAAM,eAAe,MAAM,eAAe,aAAa,cAAc;AACrE,YAAI,WAAW;AACb;AAAA,QACF;AACA,oBAAY,YAAY;AACxB,2BAAmB,KAAK;AAAA,MAC1B,QAAQ;AACN,YAAI,CAAC,WAAW;AACd,sBAAY,CAAC,CAAC;AACd,6BAAmB,KAAK;AACxB,oBAAU,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,SAAK,aAAa;AAClB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,gBAAgB,kBAAkB,CAAC;AAEvC,QAAM,gBAAgBC;AAAA,IACpB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAMM;AA9HV;AA+HM,YAAM,WAAW,kBAAkB;AACnC,UAAI,CAAC,UAAU;AACb,gCAAwB,KAAK;AAC7B;AAAA,MACF;AAEA,qBAAS,YAAT,mBAAkB;AAClB,YAAM,kBAAkB,IAAI,gBAAgB;AAC5C,eAAS,UAAU;AACnB,gBAAU,WAAW;AACrB,YAAM,oBAAoB,KAAK,IAAI;AACnC,UAAI,0BAA0B;AAE9B,UAAI;AACF,yBAAiB,oBAAoB,WAAW,QAAQ,YAAY;AAAA,UAClE;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,gBAAgB;AAAA,QAC1B,CAAC,GAAG;AACF,cAAI,CAAC,2BAA2B,2BAA2B,gBAAgB,GAAG;AAC5E,sCAA0B;AAC1B,kBAAM,YAAY,+BAA+B,KAAK,IAAI,IAAI;AAE9D,gBAAI,YAAY,GAAG;AACjB,oBAAM,KAAK,SAAS;AAAA,YACtB;AAEA,gBAAI,gBAAgB,OAAO,SAAS;AAClC,sCAAwB,KAAK;AAC7B,wBAAU,OAAO;AACjB;AAAA,YACF;AAAA,UACF;AAEA,cAAI,yBAAyB;AAC3B,oCAAwB,KAAK;AAC7B,sBAAU,WAAW;AAAA,UACvB;AACA,sBAAY,CAAC,YAAY,uBAAuB,SAAS,gBAAgB,CAAC;AAAA,QAC5E;AAEA,kBAAU,OAAO;AAAA,MACnB,SAAS,OAAO;AACd,gCAAwB,KAAK;AAC7B,YAAI,gBAAgB,OAAO,SAAS;AAClC,oBAAU,OAAO;AACjB;AAAA,QACF;AAEA,kBAAU,OAAO;AACjB,cAAM;AAAA,MACR,UAAE;AACA,gCAAwB,KAAK;AAC7B,YAAI,SAAS,YAAY,iBAAiB;AACxC,mBAAS,UAAU;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,iBAAiB;AAAA,EACpB;AAEA,QAAM,cAAcA;AAAA,IAClB,OAAO,SAAS,YAAY;AAjMhC;AAkMM,YAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,YAAM,SAAQ,aAAQ,UAAR,YAAiB,CAAC;AAChC,YAAM,WAAW,kBAAkB;AAEnC,UAAK,CAAC,QAAQ,MAAM,WAAW,KAAM,CAAC,UAAU;AAC9C;AAAA,MACF;AAEA,YAAM,cAAc,kBAAkB,MAAM,KAAK;AACjD,YAAM,eAAe,CAAC,GAAG,YAAY,SAAS,WAAW;AACzD,gBAAU,MAAM;AACd,oBAAY,YAAY;AACxB,gCAAwB,IAAI;AAAA,MAC9B,CAAC;AAED,YAAM,oBAAmB,8CAAS,SAAT,mBAAe,aAAf,YAA2B,YAAY;AAChE,YAAM,iBAAgB,8CAAS,SAAT,mBAAe,UAAf,YAAwB,SAAS;AACvD,YAAM,gBAAgB,kBAAkB,QAAQ,GAAG,gBAAgB,KAAK,aAAa,EAAE;AACvF,YAAM,cAAc;AAAA,QAClB,SAAS;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,mBAAmB,UAAU,aAAa,aAAa;AAAA,EAC1D;AAEA,QAAM,uBAAuBA;AAAA,IAC3B,OAAO,WAAmB,SAAiB;AAhO/C;AAiOM,YAAM,cAAc,KAAK,KAAK;AAC9B,YAAM,WAAW,kBAAkB;AACnC,YAAMC,aACJ,UAAU,YAAY,eAAe,UAAU,YAAY;AAE7D,UAAI,CAAC,eAAe,CAAC,YAAYA,YAAW;AAC1C;AAAA,MACF;AAEA,YAAM,mBAAmB,YAAY;AACrC,YAAM,eAAe,iBAAiB,UAAU,CAACC,aAAYA,SAAQ,OAAO,SAAS;AACrF,YAAM,UAAU,iBAAiB,YAAY;AAE7C,UAAI,CAAC,WAAW,QAAQ,SAAS,QAAQ;AACvC;AAAA,MACF;AAEA,UAAI,iBAAiB,iBAClB,MAAM,GAAG,eAAe,CAAC,EACzB;AAAA,QAAI,CAAC,mBACJ,eAAe,OAAO,YAClB,kBAAkB,gBAAgB,WAAW,IAC7C;AAAA,MACN;AAEF,iBAAW,CAAC,YAAY;AACtB,cAAM,mBAAmB,eAAe;AAAA,UACtC,CAAC,mBAAmB,eAAe,SAAS;AAAA,QAC9C;AACA,cAAM,iBAAiB,mBACnB,mBAAmB,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE,IACvD;AAEJ,eAAO,QAAQ;AAAA,UAAI,CAAC,WAClB,OAAO,OAAO,YAAY,iBACtB,EAAE,GAAG,QAAQ,OAAO,eAAe,IACnC;AAAA,QACN;AAAA,MACF,CAAC;AAED,UAAI;AACF,YAAI,WAAW,QAAQ,aAAa;AAClC,2BAAiB,MAAM,WAAW,QAAQ,YAAY;AAAA,YACpD;AAAA,YACA;AAAA,YACA,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAEA,cAAM,iBACJ,oBAAe,KAAK,CAAC,mBAAmB,eAAe,OAAO,SAAS,MAAvE,YACA,kBAAkB,SAAS,WAAW;AAExC,oBAAY,cAAc;AAC1B,gCAAwB,IAAI;AAE5B,cAAM,gBAAgB,kBAAkB,QAAQ,GAAG,YAAY,OAAO,KAAK,SAAS,OAAO,EAAE;AAC7F,cAAM,cAAc;AAAA,UAClB,SAAS;AAAA,UACT,cAAc;AAAA,UACd,UAAU,YAAY;AAAA,UACtB,OAAO,SAAS;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,gCAAwB,KAAK;AAC7B,oBAAY,gBAAgB;AAC5B,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,mBAAmB,UAAU,aAAa,YAAY,aAAa;AAAA,EACtE;AAEA,QAAM,eAAeF,aAAY,MAAM;AA1SzC;AA2SI,UAAMC,aACJ,UAAU,YAAY,eAAe,UAAU,YAAY;AAC7D,QAAI,CAACA,YAAW;AACd;AAAA,IACF;AAEA,mBAAS,YAAT,mBAAkB;AAClB,4BAAwB,KAAK;AAC7B,cAAU,OAAO;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,QAAM,YAAY,WAAW,eAAe,WAAW;AAEvD,QAAM,QAAQE;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,sBAAsB,WAAW,sBAAsB,UAAU,aAAa,QAAQ,YAAY;AAAA,EACrG;AAEA,SAAO,gBAAAR,KAAC,gBAAgB,UAAhB,EAAyB,OAAe,UAAS;AAC3D;AAEO,SAAS,cAAc;AAC5B,QAAM,UAAUS,YAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,SAAO;AACT;;;AHtGI,SAEE,OAAAC,MAFF;AAtNJ,IAAM,oBAAoB,CAAC,SACzB,IAAI,QAAgB,CAAC,SAAS,WAAW;AACvC,QAAM,SAAS,IAAI,WAAW;AAC9B,SAAO,SAAS,MAAM;AACpB,QAAI,OAAO,OAAO,WAAW,UAAU;AACrC,cAAQ,OAAO,MAAM;AACrB;AAAA,IACF;AACA,WAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,EACzC;AACA,SAAO,UAAU,MAAM;AA5B3B;AA6BM,YAAO,YAAO,UAAP,YAAgB,IAAI,MAAM,qBAAqB,CAAC;AAAA,EACzD;AACA,SAAO,cAAc,IAAI;AAC3B,CAAC;AAiBH,IAAM,kBAAkBC,eAA2C,IAAI;AAMhE,SAAS,iBAAiB,EAAE,SAAS,GAA0B;AACpE,QAAM,EAAE,gBAAgB,mBAAmB,iBAAiB,WAAW,IAAI,UAAU;AACrF,QAAM,EAAE,aAAa,SAAS,IAAI,SAAS;AAC3C,QAAM,EAAE,aAAa,UAAU,IAAI,YAAY;AAG/C,QAAM,CAAC,OAAO,aAAa,IAAIC,UAAS,EAAE;AAC1C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA0B,CAAC,CAAC;AAChE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA+B,CAAC,CAAC;AACvE,QAAM,WAAWC,QAAO,KAAK;AAC7B,QAAM,gBAAgBA,QAAO,UAAU;AACvC,QAAM,iBAAiBA,QAAO,WAAW;AACzC,WAAS,UAAU;AACnB,gBAAc,UAAU;AACxB,iBAAe,UAAU;AAEzB,QAAM,WAAWC,aAAY,CAACC,WAAkB;AAC9C,kBAAcA,MAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeD,aAAY,CAAC,SAAiB;AACjD,UAAM,aAAa,uBAAuB,IAAI;AAC9C,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAEA,kBAAc,CAAC,YAAY;AACzB,UAAI,QAAQ,KAAK,CAAC,cAAc,UAAU,SAAS,UAAU,GAAG;AAC9D,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,UACE,IAAI,gBAAgB,KAAK;AAAA,UACzB,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBA,aAAY,CAAC,OAAe;AAClD,kBAAc,CAAC,YAAY,QAAQ,OAAO,CAAC,cAAc,UAAU,OAAO,EAAE,CAAC;AAAA,EAC/E,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBA,aAAY,MAAM;AACxC,kBAAc,CAAC,CAAC;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,WAAWA,aAAY,OAAO,SAAqC;AACvE,UAAM,WAAW,MAAM,KAAK,IAAI;AAChC,UAAM,OAA6B,CAAC;AAEpC,eAAW,QAAQ,UAAU;AAC3B,UAAI;AACF,cAAM,MAAM,MAAM,kBAAkB,IAAI;AACxC,aAAK,KAAK;AAAA,UACR,IAAI,gBAAgB,MAAM;AAAA,UAC1B,UAAU,KAAK,QAAQ;AAAA,UACvB,WAAW,KAAK,QAAQ;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB;AAAA,IACF;AAEA,mBAAe,CAAC,YAAY,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,CAAC,OAAe;AACnD,mBAAe,CAAC,YAAY,QAAQ,OAAO,CAAC,eAAe,WAAW,OAAO,EAAE,CAAC;AAAA,EAClF,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,aAAa,mBAAmB,CAAC;AAClD,QAAM,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,KAAK,YAAY,SAAS;AACrE,QAAM,cAAcD,QAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,cAAcC,aAAY,YAAY;AA1I9C;AA2II,UAAM,OAAO,SAAS,QAAQ,KAAK;AACnC,UAAM,WAAW,kBAAkB;AACnC,UAAM,sBAAsB,eAAe;AAE3C,QAAK,CAAC,QAAQ,oBAAoB,WAAW,KAAM,CAAC,YAAY,YAAY,SAAS;AACnF;AAAA,IACF;AAEA,UAAM,aAAa,UAAQ,yBAAoB,CAAC,MAArB,mBAAwB,aAAY,IAAI,MAAM,GAAG,EAAE;AAC9E,UAAM,qBAAqB,cAAc;AACzC,UAAM,gBAAgB,mBACnB;AAAA,MACC,CAAC,WAAW,UACV,cAAc,QAAQ,CAAC;AAAA,EAAM,UAAU,IAAI;AAAA,cAAiB,QAAQ,CAAC;AAAA,IACzE,EACC,KAAK,MAAM;AAEd,UAAM,cAAc,gBAChB;AAAA;AAAA,EAAwD,aAAa;AAAA;AAAA;AAAA,EAAsB,IAAI,KAC/F;AAEJ,kBAAc,EAAE;AAChB,kBAAc,CAAC,CAAC;AAChB,mBAAe,CAAC,CAAC;AAEjB,eAAW,CAAC,YAAY;AACtB,YAAM,OAAO,QAAQ;AAAA,QAAI,CAAC,WACxB,OAAO,OAAO,YAAY,OAAO,UAAU,aACvC,EAAE,GAAG,QAAQ,OAAO,aAAa,OAAO,MAAM,IAC9C;AAAA,MACN;AACA,YAAM,WAAW,KAAK,KAAK,CAAC,WAAW,OAAO,OAAO,QAAQ;AAC7D,YAAM,YAAY,KAAK,OAAO,CAAC,WAAW,OAAO,OAAO,QAAQ;AAChE,aAAO,WAAW,CAAC,UAAU,GAAG,SAAS,IAAI;AAAA,IAC/C,CAAC;AAED,QAAI;AACF,YAAM;AAAA,QACJ;AAAA,UACE,MAAM;AAAA,UACN,OAAO,oBAAoB,IAAI,CAAC,UAAU;AAAA,YACxC,WAAW,KAAK;AAAA,YAChB,KAAK,KAAK;AAAA,YACV,UAAU,KAAK;AAAA,UACjB,EAAE;AAAA,QACJ;AAAA,QACA;AAAA,UACE,MAAM;AAAA,YACJ,UAAU,YAAY;AAAA,YACtB,OAAO,SAAS;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,oBAAc,IAAI;AAClB,oBAAc,kBAAkB;AAChC,qBAAe,mBAAmB;AAClC,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,mBAAmB,UAAU,aAAa,aAAa,UAAU,CAAC;AAEtE,QAAM,QAAQE;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,qBAAC,gBAAgB,UAAhB,EAAyB,OACvB;AAAA;AAAA,IACD,gBAAAN,KAAC,eAAY,gBAAgB,cAAc;AAAA,KAC7C;AAEJ;AAEO,SAAS,cAAc;AAC5B,QAAM,UAAUO,YAAW,eAAe;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,SAAO;AACT;;;AOxNU,gBAAAC,YAAA;AAXH,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAA6B;AAC3B,SACE,gBAAAA,KAAC,iBAAc,iBAAkC,aAC/C,0BAAAA,KAAC,kBAAe,SAAkB,iBAChC,0BAAAA,KAAC,oBAAiB,SAChB,0BAAAA,KAAC,oBAAkB,UAAS,GAC9B,GACF,GACF;AAEJ;;;ARbO,SAAS,UAAU;AACxB,QAAM,WAAW,YAAY;AAC7B,QAAM,WAAW,YAAY;AAC7B,QAAM,QAAQ,SAAS;AACvB,QAAM,SAAS,UAAU;AAEzB,SAAOC,SAAQ,MAAM;AACnB,UAAM,WAAmC,CAAC,WAAW;AACnD,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,mBAAS,SAAS,OAAO,KAAK,KAAK;AACnC;AAAA,QACF,KAAK;AACH,gBAAM,YAAY,OAAO,KAAK,UAAU,OAAO,KAAK,KAAK;AACzD;AAAA,QACF,KAAK;AACH,gBAAM,SAAS,OAAO,KAAK,KAAK;AAChC;AAAA,QACF,KAAK;AACH,mBAAS,aAAa,OAAO,KAAK,IAAI;AACtC;AAAA,QACF,KAAK;AACH,mBAAS,gBAAgB,OAAO,KAAK,EAAE;AACvC;AAAA,QACF,KAAK;AACH,mBAAS,gBAAgB;AACzB;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,QACL,OAAO,SAAS;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA,QACnB,cAAc,CAAC,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,UAAU,SAAS;AAAA,MACnB,QAAQ,SAAS;AAAA,MACjB,gBAAgB,OAAO;AAAA,MACvB,SAAS,OAAO;AAAA,MAChB,iBAAiB,OAAO;AAAA,MACxB,UAAU,MAAM;AAAA,MAChB,aAAa,SAAS;AAAA,MACtB,aAAa,SAAS;AAAA,MACtB,sBAAsB,SAAS;AAAA,MAC/B,cAAc,SAAS;AAAA,MACvB,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,UAAU,UAAU,OAAO,MAAM,CAAC;AACxC;;;ADpDc,SAEA,UAFA,OAAAC,MAEA,QAAAC,aAFA;AApBd,IAAM,mBAAmB,CAAC,cAAsB,UAAU,WAAW,QAAQ;AAEtE,IAAM,kBAAkB,MAAM;AACnC,QAAM,EAAE,aAAa,iBAAiB,IAAI,YAAY;AAEtD,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SACE,gBAAAD,KAAC,SAAI,WAAU,oBACZ,sBAAY,IAAI,CAAC,eAAe;AAC/B,UAAM,QAAQ,iBAAiB,WAAW,SAAS;AAEnD,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,QAAQ,0CAA0C;AAAA,QAE5D;AAAA,kBACC,gBAAAD,KAAC,SAAI,KAAK,WAAW,KAAK,KAAK,WAAW,UAAU,IAEpD,gBAAAC,MAAA,YACE;AAAA,4BAAAD,KAAC,YAAS,MAAM,IAAI,eAAY,QAAO;AAAA,YACvC,gBAAAA,KAAC,UAAK,WAAU,wBAAwB,qBAAW,UAAS;AAAA,aAC9D;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,cAAY,UAAU,WAAW,QAAQ;AAAA,cACzC,SAAS,MAAM,iBAAiB,WAAW,EAAE;AAAA,cAE7C,0BAAAA,KAAC,KAAE,MAAM,IAAI;AAAA;AAAA,UACf;AAAA;AAAA;AAAA,MAlBK,WAAW;AAAA,IAmBlB;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEO,IAAM,mBAAmB,MAAM;AACpC,QAAM,EAAE,UAAU,SAAS,IAAI,YAAY;AAC3C,QAAM,WAAWE,QAAyB,IAAI;AAE9C,SACE,gBAAAD,MAAA,YACE;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAW;AAAA,QACX;AAAA,QACA,SAAS,MAAG;AA3DpB;AA2DuB,gCAAS,YAAT,mBAAkB;AAAA;AAAA,QAEjC,0BAAAA,KAAC,aAAU,MAAM,IAAI;AAAA;AAAA,IACvB;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAQ;AAAA,QACR,UAAU;AAAA,QACV,eAAY;AAAA,QACZ,UAAU,CAAC,UAAU;AACnB,gBAAM,QAAQ,MAAM,cAAc;AAClC,cAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,iBAAK,SAAS,KAAK;AAAA,UACrB;AACA,gBAAM,cAAc,QAAQ;AAAA,QAC9B;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AU9EA,SAAS,aAAAG,YAAW,UAAAC,eAAc;AAiC5B,gBAAAC,YAAA;AA7BC,IAAM,YAAY,CAAC;AAAA,EACxB,cAAc;AAAA,EACd,WAAW;AACb,MAGM;AACJ,QAAM,EAAE,OAAO,UAAU,UAAU,aAAa,YAAY,IAAI,YAAY;AAC5E,QAAM,MAAMC,QAA4B,IAAI;AAC5C,QAAM,WAAW,MAAM,KAAK,EAAE,SAAS,KAAK,YAAY,SAAS;AAEjE,EAAAC,WAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,QAAI,CAAC,UAAU;AACb,SAAG,MAAM,SAAS;AAClB,SAAG,MAAM,YAAY;AACrB;AAAA,IACF;AACA,OAAG,MAAM,SAAS;AAClB,UAAM,QAAQ,GAAG,QAAqB,sBAAsB;AAC5D,UAAM,WAAU,+BAAO,QAAQ,aAAY;AAC3C,UAAM,MAAM,UAAU,MAAM;AAC5B,OAAG,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,cAAc,GAAG,CAAC;AACnD,OAAG,MAAM,YAAY,GAAG,eAAe,MAAM,SAAS;AAAA,EACxD,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,SACE,gBAAAF,KAAC,SAAI,WAAU,uBACb,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC,UAAU;AACnB,cAAM,OAAO,MAAM,cAAc,QAAqB,IAAI,OAAO,SAAS,EAAE;AAC5E,YAAI,MAAM;AACR,0BAAgB,IAAI;AAAA,QACtB;AACA,iBAAS,MAAM,OAAO,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,WAAW,CAAC,UAAU;AACpB,YAAI,MAAM,QAAQ,WAAW,MAAM,SAAU;AAC7C,YAAI,MAAM,YAAY,YAAa;AACnC,cAAM,eAAe;AACrB,YAAI,UAAU;AACZ;AAAA,QACF;AACA,YAAI,CAAC,UAAU;AACb,gBAAM,OAAO,MAAM,cAAc,QAAqB,IAAI,OAAO,SAAS,EAAE;AAC5E,cAAI,MAAM;AACR,8BAAkB,IAAI;AAAA,UACxB;AACA;AAAA,QACF;AACA,aAAK,YAAY;AAAA,MACnB;AAAA;AAAA,EACF,GACF;AAEJ;;;ACjEA,SAAS,KAAAG,UAAS;AAaV,SACE,OAAAC,OADF,QAAAC,aAAA;AAVD,IAAM,iBAAiB,MAAM;AAClC,QAAM,EAAE,YAAY,gBAAgB,IAAI,YAAY;AAEpD,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SACE,gBAAAD,MAAC,SAAI,WAAU,mBACZ,qBAAW,IAAI,CAAC,WAAW,UAC1B,gBAAAC,MAAC,SAAuB,WAAU,kBAAiB,OAAO,UAAU,MAClE;AAAA,oBAAAD,MAAC,UAAK,WAAU,uBAAuB,oBAAU,MAAK;AAAA,IACtD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAY,oBAAoB,QAAQ,CAAC;AAAA,QACzC,SAAS,MAAM,gBAAgB,UAAU,EAAE;AAAA,QAE3C,0BAAAA,MAACE,IAAA,EAAE,MAAM,IAAI;AAAA;AAAA,IACf;AAAA,OATQ,UAAU,EAUpB,CACD,GACH;AAEJ;;;AC3BA,SAAS,MAAM,cAAc;AAgBV,gBAAAC,aAAA;AAbZ,IAAM,WAAW,MAAM;AAC5B,QAAM,EAAE,SAAS,YAAY,IAAI,YAAY;AAC7C,QAAM,EAAE,QAAQ,cAAc,UAAU,IAAI,YAAY;AAExD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAY,YAAY,SAAS;AAAA,MACjC,SAAS,YAAY,eAAe;AAAA,MACpC,UAAU,YAAY,QAAQ,CAAC;AAAA,MAC/B,cAAY,YAAY,kBAAkB;AAAA,MAEzC,sBAAY,gBAAAA,MAAC,UAAO,MAAM,IAAI,MAAK,gBAAe,IAAK,gBAAAA,MAAC,QAAK,MAAM,IAAI;AAAA;AAAA,EAC1E;AAEJ;;;ACnBA,SAAS,YAAAC,WAAU,eAAAC,cAAa,WAAAC,UAAS,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACCjE,SAAS,WAAW,iBAAiB,qBAAqB;AAC1D,SAAS,UAAU,uBAAuB;AAOjC,gBAAAC,OAwBL,QAAAC,aAxBK;AAHT,SAAS,OAAO;AAAA,EACd,GAAG;AACL,GAAsD;AACpD,SAAO,gBAAAD,MAAC,gBAAgB,MAAhB,EAAqB,aAAU,UAAU,GAAG,OAAO;AAC7D;AAEA,SAAS,YAAY;AAAA,EACnB,GAAG;AACL,GAAuD;AACrD,SAAO,gBAAAA,MAAC,gBAAgB,OAAhB,EAAsB,aAAU,gBAAgB,GAAG,OAAO;AACpE;AAQA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACL,GAEG;AACD,SACE,gBAAAE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,aAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,gBAAAC,MAAC,gBAAgB,MAAhB,EAAqB,SAAO,MAC3B,0BAAAA,MAAC,mBAAgB,WAAU,qBAAoB,GACjD;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,GAAG;AACL,GAEG;AACD,SACE,gBAAAA,MAAC,gBAAgB,QAAhB,EAAuB,WAAW,iBACjC,0BAAAD;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA,aAAa,YACX;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,wBAAAC,MAAC,wBAAqB;AAAA,QACtB,gBAAAA;AAAA,UAAC,gBAAgB;AAAA,UAAhB;AAAA,YACC,aAAU;AAAA,YACV,WAAW;AAAA,cACT;AAAA,cACA,aAAa,YACX;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QACA,gBAAAA,MAAC,0BAAuB;AAAA;AAAA;AAAA,EAC1B,GACF;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA,GAAG;AACL,GAAuD;AACrD,SACE,gBAAAA;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,6CAA6C,SAAS;AAAA,MACnE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsD;AACpD,SACE,gBAAAD;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAU;AAAA,YAEV,0BAAAA,MAAC,gBAAgB,eAAhB,EACC,0BAAAA,MAAC,aAAU,WAAU,UAAS,GAChC;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA,MAAC,gBAAgB,UAAhB,EAA0B,UAAS;AAAA;AAAA;AAAA,EACtC;AAEJ;AAeA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA,GAAG;AACL,GAAgE;AAC9D,SACE,gBAAAC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAA,MAAC,iBAAc,WAAU,UAAS;AAAA;AAAA,EACpC;AAEJ;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAAkE;AAChE,SACE,gBAAAA;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAA,MAAC,mBAAgB,WAAU,UAAS;AAAA;AAAA,EACtC;AAEJ;;;ADzKA,SAAS,OAAO,gBAAgB;AAW1B,SAoME,YAAAC,WApMF,OAAAC,OA4EI,QAAAC,aA5EJ;AANN,IAAM,gBAAgC;AACtC,IAAM,kBAAkC;AAExC,IAAM,gBAAgB,CAAC,EAAE,MAAM,KAAK,MAAuC;AACzE,MAAI,MAAM;AACR,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,eAAY;AAAA;AAAA,IACd;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,UAAK,WAAU,yDAAwD,eAAY,QACjF,eAAK,MAAM,GAAG,CAAC,GAClB;AAEJ;AAEO,IAAM,aAAa,MAAM;AAtChC;AAuCE,QAAM,EAAE,UAAU,OAAO,UAAU,aAAa,kBAAkB,iBAAiB,IAAI,SAAS;AAChG,QAAM,EAAE,UAAU,IAAI,YAAY;AAClC,QAAM,CAAC,iBAAiB,kBAAkB,IAAIE,UAA6B,IAAI;AAC/E,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AACpE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,UAAUC,QAA2B,IAAI;AAC/C,QAAM,OAAO,oBAAoB,UAAU,OAAO;AAClD,QAAM,gBAAgB,GAAG,QAAQ,KAAK,KAAK;AAC3C,QAAM,mBAAmB,SAAS,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ;AACjF,QAAM,gBAAgB,qDAAkB,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO;AAC5E,QAAM,gBAAe,gEAAkB,SAAlB,YAA0B,qDAAkB,UAA5C,YAAqD;AAC1E,QAAM,cAAa,oDAAe,UAAf,YAAyB,SAAS;AACrD,QAAM,oBAAoBC,SAAQ,MAAM;AACtC,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAI,CAAC,EAAG,QAAO,SAAS;AACxB,WAAO,SAAS,UACb,IAAI,CAAC,WAAW;AAAA,MACf,GAAG;AAAA,MACH,QAAQ,MAAM,OAAO;AAAA,QACnB,CAAC,SACC,KAAK,MAAM,YAAY,EAAE,SAAS,CAAC,KACnC,KAAK,GAAG,YAAY,EAAE,SAAS,CAAC,KAC/B,KAAK,eAAe,KAAK,YAAY,YAAY,EAAE,SAAS,CAAC,KAC9D,MAAM,MAAM,YAAY,EAAE,SAAS,CAAC;AAAA,MACxC;AAAA,IACF,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,OAAO,SAAS,CAAC;AAAA,EAC9C,GAAG,CAAC,SAAS,WAAW,KAAK,CAAC;AAC9B,QAAM,iBAAiBC,aAAY,CAAC,SAAgC;AAClE,UAAM,QAAQ,6BAAM,QAAQ;AAC5B,YAAQ,UAAU,iBAAiB,cAAc,QAAQ;AACzD,uBAAmB,iBAAiB,cAAc,QAAQ,IAAI;AAAA,EAChE,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAL,MAAC,SAAI,KAAK,gBACR,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,YAAY,KAAK;AAAA,MACvB,cAAc;AAAA,MACd,OAAO;AAAA,MACP,eAAe,CAAC,UAAU;AACxB,cAAM,YAAY,MAAM,QAAQ,IAAI;AACpC,YAAI,aAAa,GAAG;AAClB;AAAA,QACF;AAEA,cAAM,eAAe,MAAM,MAAM,GAAG,SAAS;AAC7C,cAAM,YAAY,MAAM,MAAM,YAAY,CAAC;AAC3C,cAAM,QAAQ,SAAS,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,YAAY;AAC1E,YAAI,CAAC,SAAS,CAAC,WAAW;AACxB;AAAA,QACF;AAEA,oBAAY,MAAM,IAAI,SAAS;AAAA,MACjC;AAAA,MACA,UAAU;AAAA,MAEV;AAAA,wBAAAD,MAAC,iBAAc,WAAU,sBACvB,0BAAAC,MAAC,UAAK,WAAU,uBACb;AAAA,0BACC,gBAAAD,MAAC,iBAAc,MAAM,qDAAkB,MAAM,MAAM,cAAc,IAC/D;AAAA,UACJ,gBAAAA,MAAC,UAAM,sBAAW;AAAA,WACpB,GACF;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,UAAS;AAAA,YACT,YAAY;AAAA,YACZ,kBAAkB;AAAA,YAClB,WAAW,GAAG,sBAAsB,OAAO,UAAU,KAAK,SAAS;AAAA,YACnE,eAAa;AAAA,YACb;AAAA,YACA,kBAAkB,CAAC,UAAU;AAC3B,oBAAM,eAAe;AACrB,uBAAS,EAAE;AACX,8BAAgB,IAAI;AAAA,YACtB;AAAA,YACA,sBAAsB,MAAM,gBAAgB,IAAI;AAAA,YAEhD;AAAA,8BAAAD,MAAC,SAAI,WAAU,qBACb,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAS;AAAA,kBACT,aAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,kBAChD,WAAW,CAAC,UAAU,MAAM,gBAAgB;AAAA,kBAC5C,WAAU;AAAA;AAAA,cACZ,GACF;AAAA,cACA,gBAAAA,MAAC,SAAI,WAAU,mBACZ,4BAAkB,WAAW,IAC5B,gBAAAA,MAAC,SAAI,WAAU,oBAAmB,6BAAe,IAEjD,kBAAkB,IAAI,CAAC,UAAU;AAtI/C,oBAAAM;AAuIgB,sBAAMC,iBAAeD,MAAA,MAAM,SAAN,OAAAA,MAAc,MAAM;AACzC,sBAAM,YAAY,kBAAkB,WAAW;AAE/C,uBACE,gBAAAN,MAACD,WAAA,EACC,0BAAAE,MAAC,eAAY,WAAU,oBACpB;AAAA,8BAAY,OACX,gBAAAA,MAAC,eAAY,WAAU,oBACrB;AAAA,oCAAAD,MAAC,iBAAc,MAAM,MAAM,MAAM,MAAMO,eAAc;AAAA,oBACrD,gBAAAP,MAAC,UAAM,UAAAO,eAAa;AAAA,qBACtB;AAAA,kBAED,MAAM,OAAO,IAAI,CAAC,SAAS;AAnJlD,wBAAAD;AAoJwB,0BAAM,MAAM,GAAG,MAAM,EAAE,KAAK,KAAK,EAAE;AACnC,0BAAM,SAAS,KAAK;AACpB,0BAAM,kBACJ,UAAU,OAAO,SAAS,IACrB,OAAO,SAAS,QAAQ,IAAI,WAAW,OAAO,CAAC,IAChD;AACN,0BAAM,WAAW,mBAAmB,SAAS,EAAE,OAAO,IAAI;AAC1D,0BAAM,iBAAiB,mBAClBA,MAAA,iBAAiB,MAAM,IAAI,KAAK,EAAE,MAAlC,OAAAA,MAAuC,kBACxC;AACJ,0BAAM,SAAS,iBAAiB;AAEhC,2BACE,gBAAAN;AAAA,sBAAC;AAAA;AAAA,wBAEC,SAAS;AAAA,wBACT;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA,kBAAkB,MAAM,gBAAgB,SAAS,OAAO,GAAG;AAAA,wBAC3D,gBAAgB,CAAC,UAAU;AACzB,2CAAiB,MAAM,IAAI,KAAK,IAAI,KAAK;AACzC,0CAAgB,IAAI;AAAA,wBACtB;AAAA;AAAA,sBAVK;AAAA,oBAWP;AAAA,kBAEJ,CAAC;AAAA,mBACH,KArCa,MAAM,EAsCrB;AAAA,cAEJ,CAAC,GAEL;AAAA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;AAEA,IAAM,WAAW,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQM;AACJ,QAAM,OAAO,oBAAoB,MAAM;AAEvC,SACE,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,oBAAAA,MAAC,cAAW,OAAO,SAAS,WAAU,mBACpC;AAAA,sBAAAD,MAAC,UAAK,WAAU,yBAAyB,eAAK,OAAM;AAAA,MACnD,KAAK,cACJ,gBAAAA,MAAC,UAAK,WAAU,wBAAwB,eAAK,aAAY,IACvD,YAAY,iBACd,gBAAAA,MAAC,UAAK,WAAU,wBAAwB,0BAAe,IACrD;AAAA,OACN;AAAA,IACC,WACC,gBAAAC,MAAAF,WAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAU;AAAA,UACV,aAAW,SAAS,SAAS;AAAA,UAC7B,eAAe,CAAC,UAAU;AACxB,kBAAM,eAAe;AACrB,kBAAM,gBAAgB;AAAA,UACxB;AAAA,UACA,SAAS,CAAC,UAAU;AAClB,kBAAM,eAAe;AACrB,kBAAM,gBAAgB;AACtB,6BAAiB;AAAA,UACnB;AAAA,UAEA,0BAAAA,MAAC,YAAS,WAAU,4BAA2B;AAAA;AAAA,MACjD;AAAA,MACC,KAAK,UACJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,4BAA4B,OAAO,UAAU,KAAK,SAAS;AAAA,UACzE,eAAa;AAAA,UACb,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAChD,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAEzC,mBAAS,OAAO,IAAI,CAAC,UAAU;AAC9B,kBAAM,WAAW,UAAU;AAC3B,mBACE,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,eAAa,WAAW,SAAS;AAAA,gBACjC,SAAS,CAAC,UAAU;AAClB,wBAAM,eAAe;AACrB,wBAAM,gBAAgB;AACtB,iCAAe,KAAK;AAAA,gBACtB;AAAA,gBAEA;AAAA,kCAAAD,MAAC,UAAM,iBAAM;AAAA,kBACZ,WAAW,gBAAAA,MAAC,SAAM,WAAU,6BAA4B,IAAK;AAAA;AAAA;AAAA,cAXzD;AAAA,YAYP;AAAA,UAEJ,CAAC;AAAA;AAAA,MACH,IACE;AAAA,OACN,IACE;AAAA,KACN;AAEJ;;;AdhLQ,gBAAAQ,OAMA,QAAAC,aANA;AA/ER,IAAM,uBAAuB,CAAC,OAAoB,SAAsB;AACtE,MAAI,QAAQ,MAAM,SAAS,IAAI,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,gBAAgB,WAAW,KAAK,QAAQ,8BAA8B,MAAM;AACrF;AAIO,IAAM,eAAe,CAAC;AAAA,EAC3B,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AACpB,MAMM;AACJ,QAAM,EAAE,OAAO,IAAI,YAAY;AAC/B,QAAM,EAAE,OAAO,aAAa,WAAW,IAAI,YAAY;AACvD,QAAM,WAAWC,QAAuB,IAAI;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,eAAe;AACtD,QAAM,WACJ,WAAW,MAAM,KAAK,EAAE,SAAS,KAAK,YAAY,SAAS,KAAK,WAAW,SAAS;AAEtF,EAAAC,WAAU,MAAM;AACd,QAAI,WAAW,WAAW,CAAC,SAAS,SAAS;AAC3C;AAAA,IACF;AAEA,sBAAkB,SAAS,OAAO;AAAA,EACpC,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,YAAY,MAAM;AACtB,YAAM,QAAQ,SAAS;AACvB,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACA,UAAI,qBAAqB,OAAO,SAAS,aAAa,GAAG;AACvD;AAAA,MACF;AACA,iBAAW,KAAK;AAAA,IAClB;AAEA,aAAS,iBAAiB,WAAW,WAAW,IAAI;AACpD,WAAO,MAAM,SAAS,oBAAoB,WAAW,WAAW,IAAI;AAAA,EACtE,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,GAAG,uBAAuB,OAAO,WAAW,OAAO,KAAK;AAAA,MACnE,iBAAe,WAAW,SAAS;AAAA,MACnC,kBAAgB;AAAA,MAChB,SAAS,MAAM,WAAW,IAAI;AAAA,MAC9B,QAAQ,CAAC,UAAU;AACjB,cAAM,QAAQ,MAAM;AACpB,cAAM,OAAO,MAAM;AACnB,YAAI,gBAAgB,QAAQ,qBAAqB,OAAO,IAAI,GAAG;AAC7D;AAAA,QACF;AAEA,eAAO,WAAW,MAAM;AACtB,cAAI,qBAAqB,OAAO,SAAS,aAAa,GAAG;AACvD;AAAA,UACF;AACA,qBAAW,KAAK;AAAA,QAClB,GAAG,CAAC;AAAA,MACN;AAAA,MAEC;AAAA,oBAAY,qBAAqB,WAAW,OAC3C,gBAAAD,MAAC,iBAAc,WAAU,gCAA+B,MAAM,IAAI,eAAY,QAAO;AAAA,QAEvF,gBAAAA,MAAC,mBAAgB;AAAA,QACjB,gBAAAA,MAAC,kBAAe;AAAA,QAChB,gBAAAA,MAAC,aAAU,UAAoB;AAAA,QAC/B,gBAAAC,MAAC,SAAI,WAAU,qBACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,uBACb;AAAA,4BAAAD,MAAC,oBAAiB;AAAA,YACjB,qBAAqB,YAAY,qBAAqB,WAAW,gBAAAA,MAAC,cAAW,IAAK;AAAA,aACrF;AAAA,UACA,gBAAAA,MAAC,YAAS;AAAA,WACZ;AAAA;AAAA;AAAA,EACF;AAEJ;;;AgBxGA,SAAS,cAAc;AACvB,SAAS,YAAAK,kBAAgB;AACzB,SAAS,2BAA+C;;;ACFxD,SAAS,YAAY,gBAAgB;AACrC,SAAS,YAAAC,iBAAgB;;;ACDzB,SAAS,SAAAC,QAAO,YAAY;AAC5B,SAAS,YAAAC,iBAAgB;AAoBP,gBAAAC,aAAA;AAlBX,IAAM,cAAc,CAAC,EAAE,MAAM,WAAW,MAAM,MAA4C;AAC/F,QAAM,CAAC,UAAU,WAAW,IAAID,UAAS,KAAK;AAE9C,QAAM,cAAc,YAAY;AAC9B,UAAM,UAAU,UAAU,UAAU,IAAI;AACxC,gBAAY,IAAI;AAChB,WAAO,WAAW,MAAM,YAAY,KAAK,GAAG,IAAI;AAAA,EAClD;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,OAAO,WAAW,WAAW;AAAA,MAC7B,cAAY,WAAW,WAAW;AAAA,MAClC,SAAS,MAAM,KAAK,YAAY;AAAA,MAChC;AAAA,MAEC,qBAAW,gBAAAA,MAACF,QAAA,EAAM,MAAM,IAAI,IAAK,gBAAAE,MAAC,QAAK,MAAM,IAAI;AAAA;AAAA,EACpD;AAEJ;;;ACxBA,SAAS,iBAAiB;AAgBtB,gBAAAC,aAAA;AATG,IAAM,oBAAoB,CAAC,EAAE,cAAc,WAAW,MAAM,MACjE,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,WAAU;AAAA,IACV,OAAM;AAAA,IACN,cAAW;AAAA,IACX;AAAA,IACA,SAAS;AAAA,IAET,0BAAAA,MAAC,aAAU,MAAM,IAAI;AAAA;AACvB;;;AFUE,SACE,OAAAC,OADF,QAAAC,aAAA;AAfG,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,MAA4B;AAC1B,QAAM,CAAC,UAAU,WAAW,IAAIC,UAA+B,IAAI;AAInE,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SACE,gBAAAD,MAAC,SAAI,WAAU,yBAAwB,cAAW,mBAChD;AAAA,oBAAAD,MAAC,eAAY,MAAM,cAAc,UAAoB;AAAA,IACrD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,CAAC,iBAAiB;AAAA;AAAA,IAC9B;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,uBAAuB,aAAa,OAAO,iBAAiB,EAAE;AAAA,QACzE,OAAM;AAAA,QACN,cAAW;AAAA,QACX,gBAAc,aAAa;AAAA,QAC3B,SAAS,MAAM,YAAY,aAAa,OAAO,OAAO,IAAI;AAAA,QAC1D;AAAA,QAEA,0BAAAA,MAAC,YAAS,MAAM,IAAI;AAAA;AAAA,IACtB;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,uBAAuB,aAAa,SAAS,iBAAiB,EAAE;AAAA,QAC3E,OAAM;AAAA,QACN,cAAW;AAAA,QACX,gBAAc,aAAa;AAAA,QAC3B,SAAS,MAAM,YAAY,aAAa,SAAS,OAAO,MAAM;AAAA,QAC9D;AAAA,QAEA,0BAAAA,MAAC,cAAW,MAAM,IAAI;AAAA;AAAA,IACxB;AAAA,KACF;AAEJ;;;AG3DA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAgCC,qBAAAG,WAAA,QAAAC,aAAA;AA9BR,IAAM,eAAe,CAAC,UAAkB,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK;AACnF,IAAM,eAAe,CAAC,UACpB,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AACpD,IAAM,oBAAoB,CAAC,YAAsC;AAC/D,QAAM,gBAAgB,mCAAS;AAC/B,QAAM,gBAAgB,mCAAS;AAE/B,SAAO,aAAa,aAAa,KAAK,aAAa,aAAa,IAC5D,EAAE,eAAe,cAAc,IAC/B;AACN;AAEO,IAAM,eAAe,CAAC,EAAE,MAAM,MAAkC;AAnBvE;AAoBE,QAAM,QAAQ,YAAW,WAAM,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO,MAA1C,mBAA6C,IAAI;AAC1E,QAAM,UAAU,cAAa,WAAM,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS,MAA5C,mBAA+C,IAAI;AAChF,QAAM,iBAAiB,kBAAkB,OAAO;AAChD,QAAM,eAAe,QACjB;AAAA,IACE,CAAC,MAAM,MAAM,YAAY;AAAA,IACzB,CAAC,OAAO,MAAM,aAAa;AAAA,IAC3B,CAAC,aAAa,MAAM,gBAAgB;AAAA,IACpC,CAAC,SAAS,MAAM,YAAY;AAAA,EAC9B,EAAE,OAAO,CAAC,WAAuC,aAAa,OAAO,CAAC,CAAC,CAAC,IACxE,CAAC;AAEL,MAAI,CAAC,kBAAkB,aAAa,WAAW,EAAG,QAAO;AAEzD,SACE,gBAAAA,MAAC,OAAE,WAAU,sBAAqB,cAAW,2BAC1C;AAAA,qBACC,gBAAAA,MAAAD,WAAA,EAAE;AAAA;AAAA,MACS,aAAa,eAAe,aAAa;AAAA,MAAE;AAAA,MAAI,aAAa,eAAe,aAAa;AAAA,MAAE;AAAA,MAAG,KAAK,MAAO,eAAe,gBAAgB,eAAe,gBAAiB,GAAG;AAAA,MAAE;AAAA,OACxL,IACE;AAAA,IACH,aAAa,SAAS,IACrB,gBAAAC,MAAAD,WAAA,EACG;AAAA,uBAAiB,WAAQ;AAAA,MAAK;AAAA,MACvB,aAAa,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,GAAG,KAAK,IAAI,aAAa,KAAK,CAAC,EAAE,EAAE,KAAK,QAAK;AAAA,OAC5F,IACE;AAAA,KACN;AAEJ;;;AJUc,gBAAAE,OAkBF,QAAAC,aAlBE;AA/Cd,IAAM,qBAAqB,CAAC,cAAsB,gBAAgB,SAAS;AAEpE,IAAM,cAAc,CAAC,EAAE,QAAQ,MAAgC;AAdtE;AAeE,QAAM,EAAE,sBAAsB,WAAW,SAAS,IAAI,YAAY;AAClE,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,MAAM,mBAAmB,OAAO,CAAC;AACpE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,KAAK;AAC9D,QAAM,SAAS,QAAQ,SAAS;AAChC,QAAM,2BACJ,eAAa,cAAS,SAAS,SAAS,CAAC,MAA5B,mBAA+B,QAAO,QAAQ;AAE7D,QAAM,gBAAgB,QAAQ,MAC3B,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAU,UAAU,OAAO,OAAO,KAAK,IAAI,IAAI,EAAG,EACvD,KAAK,IAAI,EACT,KAAK;AACR,QAAM,YAAY,oBAAoB,QAAQ,KAAK,EAAE;AAAA,IACnD,CAAC,SAAgC,KAAK,SAAS;AAAA,EACjD;AAEA,QAAM,sBAAsB,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM;AAEvF,QAAM,aAAa,MAAM;AACvB,aAAS,mBAAmB,OAAO,CAAC;AACpC,iBAAa,KAAK;AAAA,EACpB;AAEA,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,MAAM,KAAK,KAAK,aAAa,kBAAkB;AAClD;AAAA,IACF;AAEA,wBAAoB,IAAI;AACxB,QAAI;AACF,YAAM,qBAAqB,QAAQ,IAAI,KAAK;AAC5C,mBAAa,KAAK;AAAA,IACpB,UAAE;AACA,0BAAoB,KAAK;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,WACE,gBAAAF,MAAC,SAAI,IAAI,mBAAmB,QAAQ,EAAE,GAAG,WAAU,kCACjD,0BAAAC,MAAC,SAAI,WAAW,0BAA0B,YAAY,gBAAgB,EAAE,IACtE;AAAA,sBAAAD,MAAC,SAAI,WAAU,uBACZ,sBACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU;AAAA,UACV,WAAS;AAAA,UACT,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,UAChD,WAAW,CAAC,UAAU;AACpB,gBAAI,MAAM,QAAQ,WAAW,MAAM,SAAU;AAC7C,gBAAI,MAAM,YAAY,YAAa;AACnC,kBAAM,eAAe;AACrB,iBAAK,WAAW;AAAA,UAClB;AAAA;AAAA,MACF,IAEA,gBAAAA,MAAC,kBAAe,OAAO,QAAQ,OAAO,QAAM,MAAC,GAEjD;AAAA,MACC,YACC,gBAAAC,MAAC,SAAI,WAAU,wBACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACT,UAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YACT,UAAU,CAAC,MAAM,KAAK,KAAK,oBAAoB;AAAA,YAChD;AAAA;AAAA,QAED;AAAA,SACF,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,qBAAS,mBAAmB,OAAO,CAAC;AACpC,yBAAa,IAAI;AAAA,UACnB;AAAA,UACA,UAAU;AAAA,UACV,cAAW;AAAA,UAEX,0BAAAA,MAAC,UAAO,MAAM,IAAI;AAAA;AAAA,MACpB;AAAA,OAEJ,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAU,uCACb,0BAAAC,MAAC,SAAI,WAAU,gCACb;AAAA,oBAAAD,MAAC,kBAAe,OAAO,QAAQ,OAAO,QAAQ,OAAO;AAAA,IACrD,gBAAAA,MAAC,gBAAa,OAAO,WAAW;AAAA,IAC/B,2BAA2B,OAC1B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAc;AAAA,QACd,eAAe,CAAC,CAAC;AAAA,QACjB,UAAU;AAAA,QACV,cAAc,MAAM;AAClB,cAAI,qBAAqB;AACvB,iBAAK;AAAA,cACH,oBAAoB;AAAA,cACpB,mBAAmB,mBAAmB;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KAEJ,GACF;AAEJ;;;AKjII,gBAAAG,OAsBM,QAAAC,cAtBN;AAFJ,IAAM,qBAAqB,MACzB,gBAAAD,MAAC,SAAI,WAAU,wBAAuB,MAAK,UAAS,aAAU,UAC5D,0BAAAA,MAAC,gBAAa,GAChB;AAGK,IAAM,UAAU,MAAM;AAC3B,QAAM,EAAE,UAAU,qBAAqB,IAAI,YAAY;AACvD,QAAM,EAAE,gBAAgB,IAAI,UAAU;AAEtC,MAAI,iBAAiB;AACnB,WACE,gBAAAA,MAAC,SAAI,WAAU,uBACb,0BAAAA,MAAC,SAAI,WAAU,qCAAoC,MAAK,UAAS,aAAU,UAAS,wCAEpF,GACF;AAAA,EAEJ;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,WACE,gBAAAA,MAAC,SAAI,WAAU,uBACb,0BAAAA,MAAC,SAAI,WAAU,cACb,0BAAAC,OAAC,SACC;AAAA,sBAAAD,MAAC,OAAE,WAAU,oBAAmB,6BAAe;AAAA,MAC/C,gBAAAA,MAAC,OAAE,WAAU,mBAAkB,gGAE/B;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,uBACZ;AAAA,aAAS,IAAI,CAAC,YACb,gBAAAD,MAAC,eAA6B,WAAZ,QAAQ,EAAsB,CACjD;AAAA,IACA,uBAAuB,gBAAAA,MAAC,sBAAmB,IAAK;AAAA,KACnD;AAEJ;;;AvBsEQ,SASI,OAAAE,OATJ,QAAAC,cAAA;AAjFR,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AACpB,GAQG;AACD,QAAM,EAAE,aAAa,WAAW,UAAU,OAAO,IAAI,YAAY;AACjE,QAAM,EAAE,aAAa,IAAI,UAAU;AACnC,QAAM,EAAE,cAAc,IAAI,SAAS;AACnC,QAAM,WAAWC,SAAQ,MAAM,qBAAqB,OAAO,GAAG,CAAC,OAAO,CAAC;AACvE,QAAM,cAAcC,SAAuB,IAAI;AAE/C,kBAAgB,MAAM;AACpB,UAAM,YAAY,YAAY;AAC9B,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,cAAU,YAAY,UAAU;AAAA,EAClC,GAAG,CAAC,UAAU,MAAM,CAAC;AAErB,kBAAgB,MAAM;AACpB,UAAM,YAAY,YAAY;AAC9B,QAAI,CAAC,aAAc,WAAW,eAAe,WAAW,aAAc;AACpE;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AACxB,gBAAU,YAAY,UAAU;AAAA,IAClC;AAEA,UAAM,WAAW,IAAI,eAAe,WAAW;AAC/C,aAAS,QAAQ,SAAS;AAC1B,UAAM,QAAQ,UAAU;AACxB,QAAI,OAAO;AACT,eAAS,QAAQ,KAAK;AAAA,IACxB;AAEA,gBAAY;AAEZ,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,kBAAkBC;AAAA,IACtB,OAAO,aAA6B;AA7FxC;AA8FM,YAAM,QACJ,oBAAS,UAAT,YACA,SAAS,aADT,YAEC,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ,KAAK,UAAU,SAAS,KAAK;AAEtF,UAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,MACF;AAEA,YAAM,YAAY,EAAE,KAAK,CAAC;AAAA,IAC5B;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA,MACA,UAAU;AAAA,MAEV,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,CAAC,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAC5D;AAAA,UACA,cAAY;AAAA,UAEZ;AAAA,4BAAAA,OAAC,SAAI,WAAU,gBACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,KAAK,aAAa;AAAA,kBACjC,cAAW;AAAA,kBACX,OAAM;AAAA,kBACN,UAAU;AAAA,kBAEV,0BAAAA,MAAC,aAAU,MAAM,IAAI,aAAa,MAAM;AAAA;AAAA,cAC1C;AAAA,cACC,mBACC,gBAAAA,MAAC,eAAY;AAAA,eAEjB;AAAA,YACA,gBAAAA,MAAC,SAAI,WAAU,iBAAgB,KAAK,aAClC,0BAAAA,MAAC,WAAQ,GACX;AAAA,YACA,gBAAAA,MAAC,SAAI,WAAU,iBACb,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AACpB,GAAc;AACZ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UAEA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AwBnIA,SAAS,qBAAqB;AA+B9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAAK;AAAA,EACA;AAAA,OACK;","names":["useCallback","useMemo","useRef","useEffect","useRef","useState","useRef","useMemo","createContext","useCallback","useContext","useMemo","useRef","useState","jsx","ChatTooltip","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","useEffect","useRef","useState","ProviderId","jsx","useState","useRef","useEffect","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","createContext","useState","useRef","useEffect","thread","useCallback","_a","_b","useMemo","useContext","jsx","createContext","useState","useRef","useEffect","useCallback","isSending","message","useMemo","useContext","jsx","createContext","useState","useRef","useCallback","value","useMemo","useContext","jsx","useMemo","jsx","jsxs","useRef","useEffect","useRef","jsx","useRef","useEffect","X","jsx","jsxs","X","jsx","Fragment","useCallback","useMemo","useRef","useState","jsx","jsxs","jsxs","jsx","jsx","Fragment","jsx","jsxs","useState","useRef","useMemo","useCallback","_a","providerName","jsx","jsxs","useRef","useState","useEffect","useState","useState","Check","useState","jsx","jsx","jsx","jsxs","useState","Fragment","jsxs","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useMemo","useRef","useCallback","normalizeAgentParts"]}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
@keyframes chat-think-pulse {
|
|
3
|
+
0%,
|
|
4
|
+
100% {
|
|
5
|
+
opacity: 0.42;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
50% {
|
|
9
|
+
opacity: 1;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.md-thinking {
|
|
14
|
+
margin: 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.md-thinking > summary {
|
|
18
|
+
display: inline-flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: var(--chat-space-2);
|
|
21
|
+
color: var(--chat-fg-muted);
|
|
22
|
+
font-size: var(--chat-text-sm);
|
|
23
|
+
font-weight: var(--chat-weight-medium);
|
|
24
|
+
line-height: var(--chat-leading-tight);
|
|
25
|
+
list-style: none;
|
|
26
|
+
transition: color var(--chat-transition);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.md-thinking-complete > summary {
|
|
30
|
+
cursor: pointer;
|
|
31
|
+
opacity: 0.72;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.md-thinking-complete > summary:hover {
|
|
35
|
+
color: var(--chat-fg);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.md-thinking > summary::-webkit-details-marker {
|
|
39
|
+
display: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.md-thinking-label {
|
|
43
|
+
display: block;
|
|
44
|
+
font-size: inherit;
|
|
45
|
+
font-weight: var(--chat-weight-medium);
|
|
46
|
+
letter-spacing: var(--chat-tracking-normal);
|
|
47
|
+
line-height: var(--chat-leading-tight);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.md-thinking-sparkle {
|
|
51
|
+
width: 1rem;
|
|
52
|
+
height: 1rem;
|
|
53
|
+
flex: 0 0 auto;
|
|
54
|
+
stroke-width: 1.8;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.md-thinking-pending .md-thinking-sparkle {
|
|
58
|
+
animation: chat-think-pulse 1.4s ease-in-out infinite;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.md-thinking-chevron {
|
|
62
|
+
width: 0.85rem;
|
|
63
|
+
height: 0.85rem;
|
|
64
|
+
opacity: 0.65;
|
|
65
|
+
transition: transform var(--chat-transition);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.md-thinking-complete[open] .md-thinking-chevron {
|
|
69
|
+
transform: rotate(180deg);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.md-thinking[open] > summary {
|
|
73
|
+
color: var(--chat-fg);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.md-thinking-pending > summary {
|
|
77
|
+
cursor: default;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.md-thinking-body {
|
|
81
|
+
margin-top: var(--chat-space-2);
|
|
82
|
+
padding-left: 1.5rem;
|
|
83
|
+
color: var(--chat-fg-muted);
|
|
84
|
+
font-size: var(--chat-text-sm);
|
|
85
|
+
line-height: var(--chat-leading);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.md-thinking-body > :first-child {
|
|
89
|
+
margin-top: 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.md-thinking-body > :last-child {
|
|
93
|
+
margin-bottom: 0;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.chat-message-content .md-thinking > summary,
|
|
97
|
+
.chat-message-content .md-thinking > summary .md-thinking-label {
|
|
98
|
+
font-family: var(--chat-font-sans);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.md-content-assistant,
|
|
102
|
+
.md-content-user {
|
|
103
|
+
color: inherit;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.md-content p {
|
|
107
|
+
margin-block: 0.85em;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.md-content p:first-child {
|
|
111
|
+
margin-top: 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.md-content p:last-child {
|
|
115
|
+
margin-bottom: 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.md-content strong {
|
|
119
|
+
color: inherit;
|
|
120
|
+
font-weight: var(--chat-weight-semibold);
|
|
121
|
+
letter-spacing: var(--chat-tracking-normal);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.md-content em {
|
|
125
|
+
color: inherit;
|
|
126
|
+
font-style: italic;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.md-content strong em,
|
|
130
|
+
.md-content em strong {
|
|
131
|
+
font-weight: var(--chat-weight-semibold);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.md-blockquote {
|
|
135
|
+
position: relative;
|
|
136
|
+
margin: var(--chat-space-5) 0;
|
|
137
|
+
padding: var(--chat-space-3_5) var(--chat-space-4) var(--chat-space-3_5) var(--chat-space-4);
|
|
138
|
+
border-left: 2px solid var(--chat-border-strong);
|
|
139
|
+
border-radius: var(--chat-radius-xs);
|
|
140
|
+
background: var(--chat-control-bg);
|
|
141
|
+
color: var(--chat-fg);
|
|
142
|
+
font-size: var(--chat-body-size);
|
|
143
|
+
font-style: italic;
|
|
144
|
+
line-height: var(--chat-body-leading);
|
|
145
|
+
letter-spacing: 0;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.md-blockquote p {
|
|
149
|
+
margin: 0;
|
|
150
|
+
color: inherit;
|
|
151
|
+
font-size: inherit;
|
|
152
|
+
line-height: inherit;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.md-blockquote em {
|
|
156
|
+
font-style: italic;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.md-inline-code {
|
|
160
|
+
display: inline;
|
|
161
|
+
padding: var(--chat-space-05) var(--chat-space-1_5);
|
|
162
|
+
border: 0;
|
|
163
|
+
border-radius: var(--chat-radius-xs);
|
|
164
|
+
background: var(--chat-control-bg);
|
|
165
|
+
color: var(--chat-fg);
|
|
166
|
+
font-family: var(--chat-font-mono);
|
|
167
|
+
font-size: var(--chat-code-size);
|
|
168
|
+
line-height: var(--chat-leading-snug);
|
|
169
|
+
white-space: normal;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.chat-code-markdown {
|
|
173
|
+
border: 1px solid var(--chat-border) !important;
|
|
174
|
+
border-radius: var(--chat-radius) !important;
|
|
175
|
+
background: var(--chat-bg-elevated) !important;
|
|
176
|
+
box-shadow: none !important;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.chat-message-content .md-thinking-label {
|
|
180
|
+
font-size: var(--chat-text-sm);
|
|
181
|
+
font-weight: var(--chat-weight-medium);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.md-table-wrapper {
|
|
185
|
+
width: 100%;
|
|
186
|
+
margin: var(--chat-space-5) 0;
|
|
187
|
+
overflow: auto;
|
|
188
|
+
border: 0;
|
|
189
|
+
background: transparent;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.md-table {
|
|
193
|
+
width: 100%;
|
|
194
|
+
border-collapse: collapse;
|
|
195
|
+
caption-side: bottom;
|
|
196
|
+
font-size: var(--chat-fs-14);
|
|
197
|
+
line-height: var(--chat-leading-snug);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.md-table thead tr {
|
|
201
|
+
border-bottom: 1px solid var(--chat-border);
|
|
202
|
+
background: transparent;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.md-table thead th {
|
|
206
|
+
padding: 0 var(--chat-space-5) var(--chat-space-2) 0;
|
|
207
|
+
color: var(--chat-fg-subtle);
|
|
208
|
+
font-size: var(--chat-label-size);
|
|
209
|
+
font-weight: var(--chat-weight-semibold);
|
|
210
|
+
letter-spacing: var(--chat-label-tracking);
|
|
211
|
+
line-height: var(--chat-label-leading);
|
|
212
|
+
text-align: left;
|
|
213
|
+
text-transform: uppercase;
|
|
214
|
+
vertical-align: bottom;
|
|
215
|
+
white-space: nowrap;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.md-table tbody tr {
|
|
219
|
+
border-bottom: 1px solid color-mix(in srgb, var(--chat-border) 55%, transparent);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.md-table tbody tr:last-child {
|
|
223
|
+
border-bottom: 0;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.md-table tbody td {
|
|
227
|
+
padding: var(--chat-space-2_5) var(--chat-space-5) var(--chat-space-2_5) 0;
|
|
228
|
+
color: var(--chat-fg);
|
|
229
|
+
font-size: var(--chat-fs-14);
|
|
230
|
+
font-weight: var(--chat-weight-regular);
|
|
231
|
+
line-height: var(--chat-leading-snug);
|
|
232
|
+
letter-spacing: var(--chat-tracking-normal);
|
|
233
|
+
overflow-wrap: anywhere;
|
|
234
|
+
vertical-align: top;
|
|
235
|
+
white-space: normal;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.md-table tbody td code {
|
|
239
|
+
white-space: nowrap;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
@media (prefers-reduced-motion: reduce) {
|
|
243
|
+
.md-thinking-pending .md-thinking-sparkle {
|
|
244
|
+
animation: none;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/* transitions-dev — 12-error-state-shake.md (verbatim) */
|
|
2
|
+
|
|
3
|
+
/* Border-color tween. Define your input's default / focused
|
|
4
|
+
/ error border-color in your own component CSS — this rule
|
|
5
|
+
only owns the interpolation. Use a constant border-width
|
|
6
|
+
across states so the tween never shifts inner content. */
|
|
7
|
+
.t-input {
|
|
8
|
+
transition: border-color 150ms ease-out;
|
|
9
|
+
will-change: transform;
|
|
10
|
+
}
|
|
11
|
+
.t-input.is-error {
|
|
12
|
+
/* Error border auto-reverts on the hold timer, so the
|
|
13
|
+
fade-out uses the slower revert duration (matches the
|
|
14
|
+
message fade). */
|
|
15
|
+
transition: border-color var(--revert-dur, 280ms) ease-out;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Error message reveal. Visibility is delayed by --revert-dur
|
|
19
|
+
on hide so the message stays painted for the full opacity
|
|
20
|
+
fade-out. Entering .is-error drops the delay to 0 so the
|
|
21
|
+
message becomes visible immediately. */
|
|
22
|
+
.t-error-msg {
|
|
23
|
+
opacity: 0;
|
|
24
|
+
visibility: hidden;
|
|
25
|
+
transition:
|
|
26
|
+
opacity var(--revert-dur, 280ms) ease-out,
|
|
27
|
+
visibility 0s linear var(--revert-dur, 280ms);
|
|
28
|
+
}
|
|
29
|
+
.t-input-wrap.is-error .t-error-msg {
|
|
30
|
+
opacity: 1;
|
|
31
|
+
visibility: visible;
|
|
32
|
+
transition:
|
|
33
|
+
opacity var(--revert-dur, 280ms) ease-out,
|
|
34
|
+
visibility 0s linear 0s;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* Multi-segment keyframe with per-stop easing so each leg
|
|
38
|
+
of the shake follows its own cubic-bezier independently.
|
|
39
|
+
%-stops are cumulative durations as a fraction of the
|
|
40
|
+
total (80, 60, 80, 60 = 280ms): 28.57%, 57.14%, 78.57%,
|
|
41
|
+
100%. Recompute if any segment duration changes. */
|
|
42
|
+
.t-input.is-shaking {
|
|
43
|
+
animation: t-input-shake calc(
|
|
44
|
+
var(--shake-dur-a) * 2 + var(--shake-dur-b) * 2
|
|
45
|
+
) linear;
|
|
46
|
+
}
|
|
47
|
+
@keyframes t-input-shake {
|
|
48
|
+
0% { transform: translateX(0); animation-timing-function: var(--shake-ease); }
|
|
49
|
+
28.57% { transform: translateX(var(--shake-distance)); animation-timing-function: var(--shake-ease); }
|
|
50
|
+
57.14% { transform: translateX(calc(var(--shake-distance) * -1)); animation-timing-function: var(--shake-ease); }
|
|
51
|
+
78.57% { transform: translateX(var(--shake-overshoot)); animation-timing-function: var(--shake-ease); }
|
|
52
|
+
100% { transform: translateX(0); }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@media (prefers-reduced-motion: reduce) {
|
|
56
|
+
.t-input { animation: none !important; transform: none !important; }
|
|
57
|
+
}
|