@agents24/chat-react 0.5.6 → 0.5.7
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/dist/index.cjs +11 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -6
- package/dist/index.js.map +1 -1
- package/dist/latest-thread-scroller.d.ts +2 -1
- package/dist/scaffold/components/chat/turn-outline.d.ts +1 -1
- package/dist/scaffold/index.cjs +144 -133
- package/dist/scaffold/index.cjs.map +1 -1
- package/dist/scaffold/index.js +154 -143
- package/dist/scaffold/index.js.map +1 -1
- package/dist/styles.css +12 -5
- package/dist/ui/agent-chat-message.d.ts +4 -0
- package/dist/ui/index.cjs +138 -52
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.js +137 -52
- package/dist/ui/index.js.map +1 -1
- package/package.json +1 -1
- package/scaffold/src/components/chat/chat-message.tsx +12 -2
- package/scaffold/src/components/chat/chat-shell.tsx +58 -30
- package/scaffold/src/components/chat/turn-outline.tsx +17 -59
- package/scaffold/src/components/ui/message-scroller.tsx +1 -1
- package/scaffold/src/components/ui/message.tsx +1 -1
- package/scaffold/src/components/ui/sidebar.tsx +1 -1
package/dist/ui/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/index.ts","../../src/ui/agent-chat-composer.tsx","../../src/ui/adapters.ts","../../src/ui/attachment.tsx","../../src/ui/utils.ts","../../src/ui/message.tsx","../../src/ui/composer-attachments.ts","../../src/ui/agent-chat-actions.tsx","../../src/ui/agent-chat-message.tsx","../../src/ui/agent-response-timeline.tsx","../../src/streaming-text.ts","../../src/ui/ask-user-interaction.tsx","../../src/ui/ask-user-interaction-state.ts","../../src/ui/agent-chat-context-compression-row.tsx","../../src/ui/message-response.tsx","../../src/active-content.ts","../../src/ui/hitl-presentation.ts","../../src/ui/tool-sessions.tsx","../../src/ui/agent-chat-context-status.tsx","../../src/ui/bubble.tsx","../../src/ui/marker.tsx","../../src/ui/mcp-connect-required-card.tsx","../../src/ui/use-audio-recorder.ts"],"sourcesContent":["export * from \"./agent-chat-composer\";\nexport * from \"./composer-attachments\";\nexport * from \"./agent-chat-actions\";\nexport * from \"./agent-chat-message\";\nexport * from \"./agent-chat-context-status\";\nexport * from \"./agent-chat-context-compression-row\";\nexport * from \"./agent-response-timeline\";\nexport * from \"./tool-sessions\";\nexport * from \"./ask-user-interaction\";\nexport * from \"./hitl-presentation\";\nexport * from \"./adapters\";\nexport * from \"./attachment\";\nexport * from \"./bubble\";\nexport * from \"./marker\";\nexport * from \"./mcp-connect-required-card\";\nexport {\n Message as ShadcnMessage,\n MessageAvatar,\n MessageContent as ShadcnMessageContent,\n MessageFooter,\n MessageGroup,\n MessageHeader,\n} from \"./message\";\nexport * from \"./message-response\";\nexport * from \"./utils\";\nexport * from \"./use-audio-recorder\";\n","import * as React from \"react\";\nimport { ArrowUp, Plus, Square } from \"lucide-react\";\n\nimport { ChatAttachmentRows } from \"./adapters\";\nimport {\n createAgentChatComposerFile,\n revokeAgentChatComposerFiles,\n type AgentChatComposerFile,\n} from \"./composer-attachments\";\nimport { cn } from \"./utils\";\n\nexport type { AgentChatComposerFile } from \"./composer-attachments\";\n\nexport type AgentChatComposerSubmit = {\n text: string;\n files: AgentChatComposerFile[];\n};\n\nexport type AgentChatComposerProps = {\n accept?: string;\n allowAttachments?: boolean;\n attachmentLayout?: \"flow\" | \"overlay\";\n className?: string;\n disabled?: boolean;\n forceExpanded?: boolean;\n inputToolbarContent?: React.ReactNode;\n isRunning?: boolean;\n onAttachmentCountChange?: (count: number) => void;\n onStop?: () => void;\n onSubmit: (message: AgentChatComposerSubmit) => Promise<void> | void;\n placeholder?: string;\n textareaRef?: React.Ref<HTMLTextAreaElement>;\n};\n\nfunction formatFileCount(files: AgentChatComposerFile[]) {\n if (files.length === 1) return files[0].filename;\n return `${files.length} files`;\n}\n\nconst pillButtonClass =\n \"inline-flex size-8 shrink-0 items-center justify-center gap-2 rounded-lg border-0 bg-muted text-sm text-muted-foreground shadow-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\";\n\nconst submitButtonClass =\n \"inline-flex size-9 shrink-0 items-center justify-center gap-2 rounded-lg border-0 bg-primary text-sm text-primary-foreground shadow-none transition-[background-color,color,opacity,transform] duration-200 hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\";\n\nexport function AgentChatComposer({\n accept,\n allowAttachments = true,\n attachmentLayout = \"flow\",\n className,\n disabled = false,\n forceExpanded = false,\n inputToolbarContent,\n isRunning = false,\n onAttachmentCountChange,\n onStop,\n onSubmit,\n placeholder = \"Message the agent\",\n textareaRef,\n}: AgentChatComposerProps) {\n const fileInputRef = React.useRef<HTMLInputElement | null>(null);\n const filesRef = React.useRef<AgentChatComposerFile[]>([]);\n const inFlightFilesRef = React.useRef<AgentChatComposerFile[]>([]);\n const localTextareaRef = React.useRef<HTMLTextAreaElement | null>(null);\n const draftRevisionRef = React.useRef(0);\n const [text, setText] = React.useState(\"\");\n const [files, setFiles] = React.useState<AgentChatComposerFile[]>([]);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const isExpanded = forceExpanded || text.includes(\"\\n\") || text.length > 62;\n\n const setTextareaRef = React.useCallback(\n (node: HTMLTextAreaElement | null) => {\n localTextareaRef.current = node;\n if (typeof textareaRef === \"function\") {\n textareaRef(node);\n } else if (textareaRef) {\n (textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n }\n },\n [textareaRef]\n );\n\n React.useEffect(() => {\n filesRef.current = files;\n onAttachmentCountChange?.(files.length);\n }, [files, onAttachmentCountChange]);\n\n React.useEffect(() => () => {\n revokeAgentChatComposerFiles(filesRef.current);\n revokeAgentChatComposerFiles(inFlightFilesRef.current);\n }, []);\n\n React.useLayoutEffect(() => {\n const textarea = localTextareaRef.current;\n if (!textarea) return;\n if (isExpanded) {\n textarea.style.height = \"auto\";\n const scrollHeight = textarea.scrollHeight;\n textarea.style.height = `${Math.min(scrollHeight, 224)}px`;\n textarea.style.overflowY = scrollHeight >= 224 ? \"auto\" : \"hidden\";\n return;\n }\n textarea.style.height = \"\";\n textarea.style.overflowY = \"hidden\";\n }, [isExpanded, text]);\n\n const canSubmit =\n !disabled &&\n !isSubmitting &&\n !isRunning &&\n (text.trim().length > 0 || files.length > 0);\n\n const handleFilesChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const selected = Array.from(event.target.files || []).map(createAgentChatComposerFile);\n if (selected.length > 0) {\n draftRevisionRef.current += 1;\n setFiles((current) => [...current, ...selected]);\n }\n event.currentTarget.value = \"\";\n };\n\n const removeFile = (fileId: string) => {\n draftRevisionRef.current += 1;\n setFiles((current) => {\n const target = current.find((file) => file.id === fileId);\n if (target) revokeAgentChatComposerFiles([target]);\n return current.filter((file) => file.id !== fileId);\n });\n };\n\n const submit = async () => {\n if (!canSubmit) return;\n const submittedText = text.trim();\n const submittedFiles = files;\n const clearedRevision = draftRevisionRef.current + 1;\n draftRevisionRef.current = clearedRevision;\n inFlightFilesRef.current = submittedFiles;\n setIsSubmitting(true);\n setText(\"\");\n setFiles([]);\n try {\n await onSubmit({ text: submittedText, files: submittedFiles });\n revokeAgentChatComposerFiles(submittedFiles);\n inFlightFilesRef.current = [];\n } catch {\n if (draftRevisionRef.current === clearedRevision) {\n draftRevisionRef.current += 1;\n setText(submittedText);\n setFiles(submittedFiles);\n inFlightFilesRef.current = [];\n } else {\n revokeAgentChatComposerFiles(submittedFiles);\n inFlightFilesRef.current = [];\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n void submit();\n }\n };\n\n return (\n <div className={cn(\"a24-composer relative mx-auto w-full max-w-3xl overflow-visible\", className)} data-agents24-chat-composer=\"\">\n {files.length > 0 ? (\n <div\n data-testid=\"agent-chat-composer-attachments\"\n data-layout={attachmentLayout}\n className={cn(\n \"a24-composer__attachments min-w-0 py-1\",\n attachmentLayout === \"overlay\"\n ? \"absolute bottom-full left-0 right-0 mb-1.5 flex-nowrap overflow-x-auto overflow-y-hidden overscroll-x-contain px-2\"\n : \"mb-2 flex-wrap px-1\"\n )}\n >\n <ChatAttachmentRows\n attachments={files}\n onRemove={(attachment) => attachment.id && removeFile(attachment.id)}\n />\n </div>\n ) : null}\n\n <div\n data-expanded={isExpanded ? \"\" : undefined}\n className={cn(\n \"a24-composer__surface relative w-full border border-input bg-background shadow-sm\",\n isExpanded ? \"rounded-xl p-2 pb-1.5\" : \"rounded-xl px-2 py-[3px]\"\n )}\n >\n <div\n className=\"a24-composer__grid w-full\"\n style={{\n alignItems: \"center\",\n display: \"grid\",\n gridTemplateAreas: isExpanded\n ? `\"textarea textarea textarea\" \"plus toolbar submit\"`\n : `\"plus textarea composer mic submit\"`,\n gridTemplateColumns: isExpanded ? \"auto 1fr auto\" : \"auto 1fr auto auto auto\",\n gap: isExpanded ? \"3px 10px\" : \"8px\",\n }}\n >\n <div style={{ gridArea: \"plus\" }} className=\"a24-composer__attach-slot flex shrink-0 items-center justify-center\">\n <input\n ref={fileInputRef}\n accept={accept}\n aria-label=\"Attach files\"\n className=\"hidden\"\n multiple\n name=\"attachments\"\n onChange={handleFilesChange}\n type=\"file\"\n />\n <button\n aria-label=\"Attach files\"\n className={cn(\"a24-composer__attach\", pillButtonClass)}\n disabled={disabled || isSubmitting || isRunning || !allowAttachments}\n onClick={() => fileInputRef.current?.click()}\n title=\"Attach files\"\n type=\"button\"\n >\n <Plus className=\"size-4\" />\n </button>\n </div>\n\n <div style={{ gridArea: \"textarea\" }} className=\"a24-composer__textarea-slot min-w-0 w-full\">\n <textarea\n ref={setTextareaRef}\n aria-label=\"Message\"\n autoComplete=\"off\"\n className={cn(\n \"a24-composer__textarea w-full resize-none border-0 bg-transparent px-1 text-[15px] leading-relaxed text-foreground shadow-none outline-none placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0\",\n isExpanded ? \"min-h-9 max-h-[224px] py-1\" : \"min-h-9 h-9 max-h-9 py-2\"\n )}\n disabled={disabled || isSubmitting || isRunning}\n name=\"message\"\n onChange={(event) => {\n draftRevisionRef.current += 1;\n setText(event.target.value);\n }}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={isExpanded ? 2 : 1}\n value={text}\n />\n </div>\n\n {isExpanded ? (\n <div style={{ gridArea: \"toolbar\" }} className=\"a24-composer__toolbar flex min-w-0 items-center gap-1.5\">\n {inputToolbarContent}\n </div>\n ) : null}\n\n {!isExpanded ? (\n <div style={{ gridArea: \"composer\" }} className=\"flex min-w-0 items-center gap-1.5\" />\n ) : null}\n\n {!isExpanded ? (\n <div style={{ gridArea: \"mic\" }} className=\"flex shrink-0 items-center justify-end\" />\n ) : null}\n\n <div style={{ gridArea: \"submit\" }} className=\"a24-composer__submit-slot flex shrink-0 items-center justify-end\">\n {isRunning ? (\n <button\n aria-label=\"Stop generating\"\n className={cn(\"a24-composer__submit\", submitButtonClass)}\n disabled={disabled || !onStop}\n onClick={onStop}\n title=\"Stop\"\n type=\"button\"\n >\n <Square className=\"size-3.5 fill-current\" />\n </button>\n ) : (\n <button\n aria-label={files.length > 0 ? `Send ${formatFileCount(files)}` : \"Send message\"}\n className={cn(\"a24-composer__submit\", submitButtonClass, text.trim().length > 0 && \"hover:scale-105\")}\n disabled={!canSubmit}\n onClick={() => void submit()}\n title=\"Send\"\n type=\"button\"\n >\n <ArrowUp className=\"size-4\" strokeWidth={2.5} />\n </button>\n )}\n </div>\n </div>\n </div>\n\n {!isExpanded && inputToolbarContent ? (\n <div className=\"a24-composer__toolbar a24-composer__toolbar--external mt-2 flex items-center gap-2 px-1\">{inputToolbarContent}</div>\n ) : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { FileIcon } from \"@untitledui/file-icons\";\nimport {\n ImageOff,\n LoaderCircle,\n X,\n} from \"lucide-react\";\n\nimport type {\n ChatAttachment as Agents24ChatAttachment,\n ChatMessage as Agents24ChatMessage,\n} from \"../types\";\nimport {\n Attachment,\n AttachmentContent,\n AttachmentGroup,\n AttachmentMedia,\n AttachmentTitle,\n} from \"./attachment\";\nimport { Message } from \"./message\";\nimport { cn } from \"./utils\";\n\nexport type ChatMessageRole = Agents24ChatMessage[\"role\"] | \"system\" | \"data\";\nconst ChatMessageRoleContext = React.createContext<ChatMessageRole>(\"assistant\");\n\nexport type ChatMessageProps = Omit<\n React.ComponentProps<typeof Message>,\n \"align\"\n> & {\n from: ChatMessageRole;\n align?: \"start\" | \"end\";\n};\n\ntype ShadcnMessageProps = React.ComponentProps<\"div\"> & {\n align?: \"start\" | \"end\";\n};\n\nexport function ChatMessage(input: ChatMessageProps): React.ReactElement {\n const { className, from, align, ...props } = input;\n const isUser = from === \"user\";\n const resolvedAlign = align || \"start\";\n const messageProps: ShadcnMessageProps = Object.assign({}, props);\n messageProps.align = resolvedAlign;\n messageProps.className = cn(\n \"a24-chat-message group flex w-full flex-col gap-2\",\n isUser\n ? \"a24-chat-message--user is-user max-w-full justify-end\"\n : \"a24-chat-message--assistant is-assistant max-w-full\",\n className\n );\n return React.createElement(\n ChatMessageRoleContext.Provider,\n { value: from },\n React.createElement(Message, messageProps),\n );\n}\n\nexport type ChatMessageContentProps = React.ComponentProps<\"div\"> & {\n from?: ChatMessageRole;\n};\n\nexport function ChatMessageContent({\n className,\n from,\n ...props\n}: ChatMessageContentProps): React.ReactElement {\n const inheritedRole = React.useContext(ChatMessageRoleContext);\n const isUser = (from ?? inheritedRole) === \"user\";\n return React.createElement(\"div\", {\n className: cn(\n \"a24-chat-message-content flex max-w-full min-w-0 flex-col gap-2 text-sm\",\n isUser\n ? \"a24-chat-message-content--user is-user:dark w-fit overflow-visible rounded-lg bg-secondary px-4 py-3 text-foreground\"\n : \"a24-chat-message-content--assistant w-full overflow-visible text-foreground\",\n className\n ),\n \"data-slot\": \"bubble-content\",\n ...props,\n });\n}\n\nexport type ChatMessageActionsProps = React.ComponentProps<\"div\">;\n\nexport function ChatMessageActions({\n className,\n ...props\n}: ChatMessageActionsProps): React.ReactElement {\n return React.createElement(\"div\", {\n className: cn(\"flex items-center gap-1\", className),\n \"data-slot\": \"message-actions\",\n ...props,\n });\n}\n\nexport type ChatMessageActionProps = React.ComponentProps<\"button\"> & {\n label?: string;\n tooltip?: React.ReactNode;\n};\n\nexport function ChatMessageAction({\n children,\n className,\n label,\n tooltip,\n type = \"button\",\n ...props\n}: ChatMessageActionProps): React.ReactElement {\n const tooltipLabel = typeof tooltip === \"string\" ? tooltip : undefined;\n return React.createElement(\n \"button\",\n {\n \"aria-label\": label || tooltipLabel,\n className: cn(\n \"inline-flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\",\n className\n ),\n title: tooltipLabel,\n type,\n ...props,\n },\n children,\n React.createElement(\n \"span\",\n { className: \"sr-only\" },\n label || tooltipLabel\n )\n );\n}\n\nexport type ChatAttachmentData = Agents24ChatAttachment & {\n type?: string;\n name?: string;\n mediaType?: string;\n contentType?: string;\n};\n\nexport type ChatAttachmentProps = React.ComponentProps<typeof Attachment> & {\n data: ChatAttachmentData;\n onRemove?: () => void;\n resolveContent?: ChatAttachmentContentResolver;\n};\n\nexport type ChatAttachmentContentResult = {\n url: string;\n validUntil?: string | null;\n};\n\nexport type ChatAttachmentContentResolver = (\n attachment: ChatAttachmentData,\n signal: AbortSignal,\n) => Promise<ChatAttachmentContentResult>;\n\nconst resolvedContentCache = new WeakMap<\n ChatAttachmentContentResolver,\n Map<string, ChatAttachmentContentResult>\n>();\nconst CONTENT_CACHE_EXPIRY_BUFFER_MS = 15_000;\nconst CONTENT_CACHE_MAX_ENTRIES = 100;\n\nfunction attachmentCacheKey(data: ChatAttachmentData): string | null {\n const id = typeof data.id === \"string\" ? data.id.trim() : \"\";\n return id || null;\n}\n\nfunction cachedAttachmentContent(\n resolver: ChatAttachmentContentResolver,\n data: ChatAttachmentData,\n): ChatAttachmentContentResult | null {\n const key = attachmentCacheKey(data);\n if (!key) return null;\n const cached = resolvedContentCache.get(resolver)?.get(key);\n if (!cached) return null;\n if (!cached.validUntil) return cached;\n const validUntil = Date.parse(cached.validUntil);\n if (Number.isFinite(validUntil) && validUntil - CONTENT_CACHE_EXPIRY_BUFFER_MS > Date.now()) {\n return cached;\n }\n resolvedContentCache.get(resolver)?.delete(key);\n return null;\n}\n\nfunction cacheAttachmentContent(\n resolver: ChatAttachmentContentResolver,\n data: ChatAttachmentData,\n result: ChatAttachmentContentResult,\n) {\n const key = attachmentCacheKey(data);\n if (!key) return;\n const cache = resolvedContentCache.get(resolver) || new Map<string, ChatAttachmentContentResult>();\n cache.delete(key);\n cache.set(key, result);\n while (cache.size > CONTENT_CACHE_MAX_ENTRIES) {\n const oldestKey = cache.keys().next().value;\n if (typeof oldestKey !== \"string\") break;\n cache.delete(oldestKey);\n }\n resolvedContentCache.set(resolver, cache);\n}\n\nfunction invalidateAttachmentContent(\n resolver: ChatAttachmentContentResolver,\n data: ChatAttachmentData,\n) {\n const key = attachmentCacheKey(data);\n if (key) resolvedContentCache.get(resolver)?.delete(key);\n}\n\ntype ChatAttachmentKind =\n | \"archive\"\n | \"audio\"\n | \"code\"\n | \"document\"\n | \"file\"\n | \"image\"\n | \"pdf\"\n | \"presentation\"\n | \"spreadsheet\"\n | \"video\";\n\nfunction attachmentMediaType(data: ChatAttachmentData): string {\n return data.mediaType || data.contentType || String(data.type || \"application/octet-stream\");\n}\n\nfunction attachmentFilename(data: ChatAttachmentData): string {\n return data.filename || data.name || \"Attachment\";\n}\n\nfunction attachmentExtension(filename: string): string {\n const extension = filename.split(\".\").pop();\n return extension && extension !== filename ? extension.toLowerCase() : \"\";\n}\n\nfunction resolveAttachmentVisual(data: ChatAttachmentData): {\n fileIconType: React.ComponentProps<typeof FileIcon>[\"type\"];\n kind: ChatAttachmentKind;\n} {\n const mediaType = attachmentMediaType(data).toLowerCase();\n const extension = attachmentExtension(attachmentFilename(data));\n\n if (mediaType.startsWith(\"image/\") || [\"avif\", \"gif\", \"heic\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"].includes(extension)) {\n return { fileIconType: extension || \"image\", kind: \"image\" };\n }\n if (mediaType === \"application/pdf\" || extension === \"pdf\") {\n return { fileIconType: \"pdf\", kind: \"pdf\" };\n }\n if (\n mediaType.includes(\"spreadsheet\") ||\n mediaType.includes(\"csv\") ||\n [\"csv\", \"numbers\", \"ods\", \"xls\", \"xlsm\", \"xlsx\"].includes(extension)\n ) {\n if ([\"csv\", \"xls\", \"xlsx\"].includes(extension)) {\n return { fileIconType: extension, kind: \"spreadsheet\" };\n }\n return { fileIconType: \"spreadsheets\", kind: \"spreadsheet\" };\n }\n if (\n mediaType.includes(\"presentation\") ||\n [\"key\", \"odp\", \"ppt\", \"pptx\"].includes(extension)\n ) {\n return { fileIconType: extension === \"ppt\" ? \"ppt\" : \"pptx\", kind: \"presentation\" };\n }\n if (\n mediaType.includes(\"word\") ||\n mediaType.includes(\"rtf\") ||\n [\"doc\", \"docx\", \"odt\", \"rtf\"].includes(extension)\n ) {\n if (extension === \"doc\" || extension === \"docx\") {\n return { fileIconType: extension, kind: \"document\" };\n }\n return { fileIconType: \"document\", kind: \"document\" };\n }\n if (mediaType.startsWith(\"audio/\") || [\"aac\", \"flac\", \"m4a\", \"mp3\", \"ogg\", \"wav\"].includes(extension)) {\n if (extension === \"mp3\" || extension === \"wav\") {\n return { fileIconType: extension, kind: \"audio\" };\n }\n return { fileIconType: \"audio\", kind: \"audio\" };\n }\n if (mediaType.startsWith(\"video/\") || [\"avi\", \"m4v\", \"mkv\", \"mov\", \"mp4\", \"webm\"].includes(extension)) {\n if ([\"avi\", \"mkv\", \"mp4\", \"mpeg\"].includes(extension)) {\n return { fileIconType: extension, kind: \"video\" };\n }\n return { fileIconType: \"video\", kind: \"video\" };\n }\n if (\n mediaType.includes(\"zip\") ||\n mediaType.includes(\"compressed\") ||\n [\"7z\", \"bz2\", \"gz\", \"rar\", \"tar\", \"tgz\", \"zip\"].includes(extension)\n ) {\n return { fileIconType: extension === \"rar\" ? \"rar\" : \"zip\", kind: \"archive\" };\n }\n if (\n mediaType.includes(\"json\") ||\n mediaType.includes(\"javascript\") ||\n mediaType.includes(\"typescript\") ||\n mediaType.includes(\"xml\") ||\n [\"css\", \"html\", \"js\", \"jsx\", \"json\", \"py\", \"sql\", \"ts\", \"tsx\", \"xml\", \"yaml\", \"yml\"].includes(extension)\n ) {\n if ([\"css\", \"html\", \"java\", \"js\", \"json\", \"sql\", \"xml\"].includes(extension)) {\n return { fileIconType: extension, kind: \"code\" };\n }\n return { fileIconType: \"code\", kind: \"code\" };\n }\n if (mediaType.startsWith(\"text/\") || [\"md\", \"markdown\", \"txt\"].includes(extension)) {\n return { fileIconType: \"txt\", kind: \"file\" };\n }\n return { fileIconType: \"empty\", kind: \"file\" };\n}\n\nfunction solidFileIconBackground(\n fileIconType: React.ComponentProps<typeof FileIcon>[\"type\"],\n kind: ChatAttachmentKind,\n): string {\n if ([\"txt\", \"zip\", \"rar\"].includes(fileIconType)) return \"#344054\";\n if (kind === \"pdf\") return \"#D92D20\";\n if (kind === \"spreadsheet\") return \"#079455\";\n if (kind === \"document\" || kind === \"video\") return \"#155EEF\";\n if (kind === \"presentation\") return \"#E62E05\";\n if (kind === \"audio\") return \"#DD2590\";\n if (kind === \"code\") return \"#444CE7\";\n return \"#7F56D9\";\n}\n\nfunction isImageAttachment(data: ChatAttachmentData): boolean {\n return resolveAttachmentVisual(data).kind === \"image\";\n}\n\nfunction attachmentRenderKey(\n data: ChatAttachmentData,\n index: number,\n rowKind: \"images\" | \"files\",\n): string {\n const id = typeof data.id === \"string\" ? data.id.trim() : \"\";\n const identity = id || `${attachmentFilename(data)}:${attachmentMediaType(data)}`;\n return `${rowKind}:${identity}:${index}`;\n}\n\nfunction ChatImageAttachment({\n className,\n data,\n onRemove,\n resolveContent,\n ...props\n}: ChatAttachmentProps): React.ReactElement {\n const filename = attachmentFilename(data);\n const initialUrl = typeof data.url === \"string\" ? data.url.trim() : \"\";\n const contentStatus = String(data.contentStatus || data.content_status || \"available\");\n const attachmentKey = attachmentCacheKey(data);\n const dataRef = React.useRef(data);\n dataRef.current = data;\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const retryCountRef = React.useRef(0);\n const [isNearViewport, setIsNearViewport] = React.useState(Boolean(initialUrl));\n const [sourceUrl, setSourceUrl] = React.useState(initialUrl);\n const [status, setStatus] = React.useState<\"idle\" | \"resolving\" | \"loading\" | \"done\" | \"error\">(\n initialUrl ? \"loading\" : contentStatus === \"expired\" || !resolveContent ? \"error\" : \"idle\"\n );\n const [resolutionAttempt, setResolutionAttempt] = React.useState(0);\n\n React.useEffect(() => {\n if ((initialUrl && resolutionAttempt === 0) || contentStatus === \"expired\" || !resolveContent) return;\n const node = rootRef.current;\n if (!node || typeof IntersectionObserver === \"undefined\") {\n setIsNearViewport(true);\n return;\n }\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setIsNearViewport(true);\n observer.disconnect();\n }\n },\n { rootMargin: \"240px\" },\n );\n observer.observe(node);\n return () => observer.disconnect();\n }, [contentStatus, initialUrl, resolutionAttempt, resolveContent]);\n\n React.useEffect(() => {\n if (initialUrl && resolutionAttempt === 0) {\n setSourceUrl(initialUrl);\n setStatus(\"loading\");\n return;\n }\n if (!isNearViewport || !resolveContent || contentStatus === \"expired\") return;\n\n const attachment = dataRef.current;\n const cached = cachedAttachmentContent(resolveContent, attachment);\n if (cached) {\n setSourceUrl(cached.url);\n setStatus(\"loading\");\n return;\n }\n\n const controller = new AbortController();\n setStatus(\"resolving\");\n void resolveContent(attachment, controller.signal)\n .then((result) => {\n if (controller.signal.aborted) return;\n if (!result.url?.trim()) throw new Error(\"Attachment content resolver returned an empty URL\");\n cacheAttachmentContent(resolveContent, attachment, result);\n setSourceUrl(result.url);\n setStatus(\"loading\");\n })\n .catch(() => {\n if (!controller.signal.aborted) setStatus(\"error\");\n });\n return () => controller.abort();\n }, [attachmentKey, contentStatus, initialUrl, isNearViewport, resolutionAttempt, resolveContent]);\n\n const handleImageError = () => {\n if (resolveContent && retryCountRef.current === 0) {\n retryCountRef.current = 1;\n invalidateAttachmentContent(resolveContent, dataRef.current);\n setSourceUrl(\"\");\n setStatus(\"resolving\");\n setResolutionAttempt((current) => current + 1);\n return;\n }\n setStatus(\"error\");\n };\n\n return React.createElement(\n Attachment,\n {\n ...props,\n className: cn(\"a24-chat-image-attachment\", className),\n orientation: \"vertical\",\n ref: rootRef,\n state: status === \"error\" ? \"error\" : status === \"done\" ? \"done\" : \"processing\",\n title: filename,\n },\n React.createElement(\n AttachmentMedia,\n { className: \"a24-chat-image-media\", variant: \"image\" },\n sourceUrl\n ? React.createElement(\"img\", {\n alt: filename,\n decoding: \"async\",\n loading: \"lazy\",\n onError: handleImageError,\n onLoad: () => setStatus(\"done\"),\n src: sourceUrl,\n })\n : status === \"error\"\n ? React.createElement(ImageOff, { \"aria-hidden\": \"true\", className: \"size-5\" })\n : React.createElement(LoaderCircle, {\n \"aria-hidden\": \"true\",\n className: \"a24-chat-image-spinner size-5 animate-spin\",\n }),\n status !== \"done\" && status !== \"error\"\n ? React.createElement(\"span\", { className: \"sr-only\", role: \"status\" }, `Loading ${filename}`)\n : null,\n status === \"error\"\n ? React.createElement(\"span\", { className: \"sr-only\" }, `${filename} preview unavailable`)\n : null,\n ),\n onRemove\n ? React.createElement(\n \"button\",\n {\n \"aria-label\": `Remove ${filename}`,\n className: \"a24-chat-image-remove\",\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n onRemove();\n },\n type: \"button\",\n },\n React.createElement(X, { \"aria-hidden\": \"true\", className: \"size-3.5\" }),\n )\n : null,\n );\n}\n\nexport function ChatAttachment({\n className,\n data,\n onRemove,\n orientation,\n resolveContent,\n ...props\n}: ChatAttachmentProps): React.ReactElement {\n const filename = attachmentFilename(data);\n const { fileIconType, kind } = resolveAttachmentVisual(data);\n if (kind === \"image\") {\n return React.createElement(ChatImageAttachment, {\n ...props,\n className,\n data,\n onRemove,\n resolveContent,\n });\n }\n return React.createElement(\n Attachment,\n {\n className: cn(\"a24-chat-attachment\", className),\n orientation: orientation || \"horizontal\",\n size: \"sm\",\n ...props,\n },\n React.createElement(\n AttachmentMedia,\n Object.assign(\n {\n className: \"a24-chat-attachment-icon\",\n style: { backgroundColor: solidFileIconBackground(fileIconType, kind) },\n variant: \"icon\" as const,\n },\n { \"data-file-kind\": kind }\n ),\n React.createElement(FileIcon, {\n \"aria-hidden\": \"true\",\n size: 28,\n type: fileIconType,\n variant: \"solid\",\n })\n ),\n React.createElement(\n AttachmentContent,\n { className: \"a24-chat-attachment-content\" },\n React.createElement(AttachmentTitle, { title: filename }, filename)\n ),\n onRemove\n ? React.createElement(\n \"button\",\n {\n \"aria-label\": \"Remove attachment\",\n className:\n \"relative z-20 inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground\",\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n onRemove();\n },\n type: \"button\",\n },\n React.createElement(X, { \"aria-hidden\": \"true\", className: \"size-3.5\" })\n )\n : null\n );\n}\n\nexport type ChatAttachmentsProps = React.ComponentProps<typeof AttachmentGroup>;\n\nexport function ChatAttachments({\n children,\n className,\n ...props\n}: ChatAttachmentsProps): React.ReactElement | null {\n if (!children) return null;\n return React.createElement(\n AttachmentGroup,\n {\n className: cn(\n \"a24-chat-attachments w-full flex-nowrap\",\n className\n ),\n ...props,\n },\n children\n );\n}\n\nexport type ChatAttachmentRowsProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n attachments: readonly ChatAttachmentData[];\n onRemove?: (attachment: ChatAttachmentData) => void;\n resolveContent?: ChatAttachmentContentResolver;\n};\n\nexport function ChatAttachmentRows({\n attachments,\n className,\n dir,\n onRemove,\n resolveContent,\n ...props\n}: ChatAttachmentRowsProps): React.ReactElement | null {\n if (attachments.length === 0) return null;\n const imageAttachments = attachments.filter(isImageAttachment);\n const fileAttachments = attachments.filter((attachment) => !isImageAttachment(attachment));\n const renderRow = (items: readonly ChatAttachmentData[], kind: \"images\" | \"files\") =>\n items.length > 0\n ? React.createElement(\n ChatAttachments,\n Object.assign({ dir, key: kind }, { \"data-attachment-row\": kind }),\n items.map((attachment, index) =>\n React.createElement(ChatAttachment, {\n data: attachment,\n dir: \"ltr\",\n key: attachmentRenderKey(attachment, index, kind),\n onRemove: onRemove ? () => onRemove(attachment) : undefined,\n resolveContent,\n })\n )\n )\n : null;\n\n return React.createElement(\n \"div\",\n {\n className: cn(\"a24-chat-attachment-rows\", className),\n dir,\n ...props,\n },\n renderRow(imageAttachments, \"images\"),\n renderRow(fileAttachments, \"files\")\n );\n}\n\nexport {\n ChatAttachment as MessageAttachment,\n ChatAttachmentRows as MessageAttachmentRows,\n ChatAttachments as MessageAttachments,\n ChatMessage as Message,\n ChatMessageAction as MessageAction,\n ChatMessageActions as MessageActions,\n ChatMessageContent as MessageContent,\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { cn } from \"./utils\";\n\nconst attachmentVariants = cva(\n \"group/attachment relative flex w-fit max-w-full min-w-0 shrink-0 flex-wrap rounded-xl border bg-card text-card-foreground transition-colors focus-within:border-neutral-300 focus-within:ring-0 has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed\",\n {\n variants: {\n size: {\n default:\n \"gap-2 text-sm has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2 has-data-[slot=attachment-media]:p-2\",\n sm: \"gap-2.5 text-xs has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5 has-data-[slot=attachment-media]:p-1.5\",\n xs: \"gap-1.5 rounded-lg text-xs has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1 has-data-[slot=attachment-media]:p-1\",\n },\n orientation: {\n horizontal: \"min-w-40 items-center\",\n vertical: \"w-24 flex-col has-data-[slot=attachment-content]:w-30\",\n },\n },\n }\n);\n\nfunction Attachment({\n className,\n state = \"done\",\n size = \"default\",\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof attachmentVariants> & {\n state?: \"idle\" | \"uploading\" | \"processing\" | \"error\" | \"done\";\n }) {\n return (\n <div\n data-slot=\"attachment\"\n data-state={state}\n data-size={size}\n data-orientation={orientation}\n className={cn(attachmentVariants({ size, orientation }), className)}\n {...props}\n />\n );\n}\n\nconst attachmentMediaVariants = cva(\n \"relative flex aspect-square w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg text-foreground group-data-[orientation=vertical]/attachment:w-full group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md group-data-[state=error]/attachment:text-destructive group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5\",\n {\n variants: {\n variant: {\n icon: \"\",\n image:\n \"bg-muted opacity-60 group-data-[state=done]/attachment:opacity-100 group-data-[state=idle]/attachment:opacity-100 *:[img]:aspect-square *:[img]:w-full *:[img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"icon\",\n },\n }\n);\n\nfunction AttachmentMedia({\n className,\n variant = \"icon\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof attachmentMediaVariants>) {\n return (\n <div\n data-slot=\"attachment-media\"\n data-variant={variant}\n className={cn(attachmentMediaVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AttachmentContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-content\"\n className={cn(\n \"max-w-full min-w-0 flex-1 leading-tight group-data-[orientation=vertical]/attachment:px-1\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentTitle({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"attachment-title\"\n className={cn(\n \"block max-w-full min-w-0 truncate font-medium group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentDescription({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"attachment-description\"\n className={cn(\n \"mt-0.5 block min-w-0 truncate text-xs text-muted-foreground group-data-[state=error]/attachment:text-destructive/80\",\n \"max-w-full\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentActions({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-actions\"\n className={cn(\n \"relative z-20 flex shrink-0 items-center group-data-[orientation=vertical]/attachment:absolute group-data-[orientation=vertical]/attachment:top-3 group-data-[orientation=vertical]/attachment:right-3 group-data-[orientation=vertical]/attachment:gap-1\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentAction({\n className,\n type = \"button\",\n ...props\n}: React.ComponentProps<\"button\">) {\n return (\n <button\n data-slot=\"attachment-action\"\n type={type}\n className={cn(\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentTrigger({\n className,\n asChild = false,\n type,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"attachment-trigger\"\n type={asChild ? undefined : (type ?? \"button\")}\n className={cn(\"absolute inset-0 z-10 outline-none\", className)}\n {...props}\n />\n );\n}\n\nfunction AttachmentGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-group\"\n className={cn(\n \"flex min-w-0 scroll-fade-x snap-x snap-mandatory scroll-px-1 scrollbar-none gap-3 overflow-x-auto overscroll-x-contain py-1 *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Attachment,\n AttachmentGroup,\n AttachmentMedia,\n AttachmentContent,\n AttachmentTitle,\n AttachmentDescription,\n AttachmentActions,\n AttachmentAction,\n AttachmentTrigger,\n attachmentVariants,\n attachmentMediaVariants,\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...values: ClassValue[]) {\n return twMerge(clsx(values));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nfunction MessageGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction Message({\n className,\n align = \"start\",\n ...props\n}: React.ComponentProps<\"div\"> & { align?: \"start\" | \"end\" }) {\n return (\n <div\n data-slot=\"message\"\n data-align={align}\n className={cn(\n \"group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MessageAvatar({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-avatar\"\n className={cn(\n \"flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MessageContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-content\"\n className={cn(\n \"flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:*:data-slot:self-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MessageHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-header\"\n className={cn(\n \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MessageFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-footer\"\n className={cn(\n \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n MessageGroup,\n Message,\n MessageAvatar,\n MessageContent,\n MessageFooter,\n MessageHeader,\n};\n","import type { ChatAttachment } from \"../types\";\n\nexport type AgentChatComposerFile = ChatAttachment & {\n id: string;\n type: \"file\";\n url: string;\n filename: string;\n mediaType: string;\n source: File;\n};\n\nconst createId = () =>\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `file-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\nexport function createAgentChatComposerFile(file: File): AgentChatComposerFile {\n return {\n id: createId(),\n type: \"file\",\n url: URL.createObjectURL(file),\n filename: file.name || \"attachment\",\n mediaType: file.type || \"application/octet-stream\",\n source: file,\n };\n}\n\nexport function revokeAgentChatComposerFiles(files: readonly AgentChatComposerFile[]): void {\n files.forEach((file) => {\n try {\n URL.revokeObjectURL(file.url);\n } catch {\n // The URL may already be gone in tests or older browsers.\n }\n });\n}\n","import * as React from \"react\";\nimport { Check, Copy, RefreshCcw, ThumbsDown, ThumbsUp } from \"lucide-react\";\nimport { Popover } from \"radix-ui\";\n\nimport type { ChatMessage } from \"../types\";\nimport type { FeedbackReason, ResponseFeedback } from \"@agents24/client\";\nimport { MessageAction, MessageActions } from \"./adapters\";\n\nexport type AgentChatFeedbackInput = {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n};\n\nexport type AgentChatMessageActionHandlers = {\n copied?: boolean;\n feedback?: ResponseFeedback | null;\n onCopy?: (content: string, messageId: string) => void;\n onRetry?: (message: ChatMessage) => void | Promise<void>;\n onSetFeedback?: (\n message: ChatMessage,\n input: AgentChatFeedbackInput,\n ) => void | Promise<void>;\n};\n\nexport type AgentChatDefaultActionsProps = {\n additionalActions?: React.ReactNode;\n dir?: \"ltr\" | \"rtl\";\n handlers?: AgentChatMessageActionHandlers;\n message: ChatMessage;\n};\n\nconst FEEDBACK_REASONS = [\n [\"incorrect\", \"Incorrect\"],\n [\"irrelevant\", \"Irrelevant\"],\n [\"incomplete\", \"Incomplete\"],\n [\"unsafe\", \"Unsafe\"],\n [\"citation_issue\", \"Citation issue\"],\n [\"other\", \"Other\"],\n] as const satisfies ReadonlyArray<readonly [FeedbackReason, string]>;\n\nexport function AgentChatDefaultActions({\n additionalActions,\n dir,\n handlers,\n message,\n}: AgentChatDefaultActionsProps) {\n const [feedbackOpen, setFeedbackOpen] = React.useState(false);\n const [feedbackTrigger, setFeedbackTrigger] = React.useState<HTMLButtonElement | null>(null);\n const [reason, setReason] = React.useState<FeedbackReason | null>(handlers?.feedback?.reason ?? null);\n const [comment, setComment] = React.useState(handlers?.feedback?.comment ?? \"\");\n\n React.useEffect(() => {\n setReason(handlers?.feedback?.reason ?? null);\n setComment(handlers?.feedback?.comment ?? \"\");\n }, [handlers?.feedback?.comment, handlers?.feedback?.reason]);\n\n if (!handlers || message.role !== \"assistant\" || message.isFinal === false) return null;\n const canWriteFeedback = Boolean(message.runId && handlers.onSetFeedback);\n return (\n <MessageActions>\n {handlers.onRetry ? (\n <MessageAction\n label=\"Retry\"\n onClick={() => void handlers.onRetry?.(message)}\n tooltip=\"Regenerate response\"\n >\n <RefreshCcw className=\"size-4\" />\n </MessageAction>\n ) : null}\n {canWriteFeedback ? (\n <MessageAction\n label=\"Like\"\n onClick={() => void handlers.onSetFeedback?.(message, {\n rating: handlers.feedback?.rating === \"like\" ? null : \"like\",\n })}\n tooltip=\"Like this response\"\n >\n <ThumbsUp className=\"size-4\" fill={handlers.feedback?.rating === \"like\" ? \"currentColor\" : \"none\"} />\n </MessageAction>\n ) : null}\n {canWriteFeedback ? (\n <Popover.Root onOpenChange={setFeedbackOpen} open={feedbackOpen}>\n <Popover.Trigger asChild>\n <MessageAction\n label=\"Dislike\"\n onClick={() => {\n if (handlers.feedback?.rating !== \"dislike\") {\n void handlers.onSetFeedback?.(message, { rating: \"dislike\" });\n }\n setFeedbackOpen(true);\n }}\n ref={setFeedbackTrigger}\n tooltip=\"Dislike this response\"\n >\n <ThumbsDown className=\"size-4\" fill={handlers.feedback?.rating === \"dislike\" ? \"currentColor\" : \"none\"} />\n </MessageAction>\n </Popover.Trigger>\n <Popover.Portal\n container={feedbackTrigger?.closest<HTMLElement>(\"[data-agents24-theme-root]\") ?? undefined}\n >\n <Popover.Content\n align=\"end\"\n aria-label=\"Dislike details\"\n className=\"z-50 w-80 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none\"\n dir={dir}\n side=\"top\"\n sideOffset={8}\n >\n <p className=\"text-sm font-medium\">What could be better?</p>\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {FEEDBACK_REASONS.map(([value, label]) => (\n <button\n aria-pressed={reason === value}\n className=\"rounded-md border border-border px-2.5 py-1.5 text-xs font-medium transition-colors hover:bg-muted aria-pressed:border-transparent aria-pressed:bg-secondary\"\n key={value}\n onClick={() => setReason(reason === value ? null : value)}\n type=\"button\"\n >\n {label}\n </button>\n ))}\n </div>\n <textarea\n aria-label=\"Optional feedback comment\"\n className=\"mt-3 min-h-20 w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n maxLength={1000}\n onChange={(event) => setComment(event.target.value)}\n placeholder=\"Add a comment (optional)\"\n value={comment}\n />\n <div className=\"mt-3 flex items-center justify-between gap-2\">\n <button\n className=\"rounded-md px-3 py-2 text-sm font-medium hover:bg-muted\"\n onClick={() => {\n void Promise.resolve(handlers.onSetFeedback?.(message, { rating: null }))\n .then(() => setFeedbackOpen(false))\n .catch(() => undefined);\n }}\n type=\"button\"\n >\n Remove feedback\n </button>\n <button\n className=\"rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90\"\n onClick={() => {\n void Promise.resolve(handlers.onSetFeedback?.(message, { rating: \"dislike\", reason, comment }))\n .then(() => setFeedbackOpen(false))\n .catch(() => undefined);\n }}\n type=\"button\"\n >\n Save\n </button>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n ) : null}\n {additionalActions}\n {handlers.onCopy ? (\n <MessageAction\n label=\"Copy\"\n onClick={() => handlers.onCopy?.(message.content || \"\", message.id)}\n tooltip={handlers.copied ? \"Copied!\" : \"Copy to clipboard\"}\n >\n {handlers.copied ? (\n <Check className=\"size-4 text-green-600\" />\n ) : (\n <Copy className=\"size-4\" />\n )}\n </MessageAction>\n ) : null}\n </MessageActions>\n );\n}\n","import * as React from \"react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\n\nimport type { ChatHitlPart, ChatHitlResponse, ChatMessage } from \"../types\";\nimport {\n ChatAttachmentRows,\n type ChatAttachmentContentResolver,\n ChatMessage as Message,\n ChatMessageContent as MessageContent,\n} from \"./adapters\";\nimport {\n AgentChatDefaultActions,\n type AgentChatMessageActionHandlers,\n} from \"./agent-chat-actions\";\nimport {\n AgentResponseTimeline,\n type AgentChatPartActionState,\n type AgentChatTimelineComponent,\n} from \"./agent-response-timeline\";\nimport { cn } from \"./utils\";\n\nconst DEFAULT_USER_MESSAGE_COLLAPSE_THRESHOLD = 360;\nconst DEFAULT_USER_MESSAGE_COLLAPSED_LINES = 4;\n\nexport type AgentChatUserMessageContentProps = {\n collapsedLines?: number;\n collapseThreshold?: number | null;\n content: string;\n showLessLabel?: string;\n showMoreLabel?: string;\n};\n\nexport type AgentChatMessageProps = {\n actionHandlers?: AgentChatMessageActionHandlers;\n additionalActions?: React.ReactNode;\n actions?: React.ReactNode;\n actionsClassName?: string;\n attachmentContentResolver?: ChatAttachmentContentResolver;\n className?: string;\n contentClassName?: string;\n dir?: \"ltr\" | \"rtl\";\n getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;\n message: ChatMessage;\n nodeActivityMode?: \"default\" | \"all\" | \"hidden\";\n onHitlAction?: (part: ChatHitlPart, response: ChatHitlResponse) => void;\n Timeline?: AgentChatTimelineComponent;\n renderAssistantContent?: (input: {\n isStreaming: boolean;\n message: ChatMessage;\n }) => React.ReactNode;\n renderUserContent?: (input: {\n message: ChatMessage;\n }) => React.ReactNode;\n showAssistantAttachments?: boolean;\n streamingMessageId?: string | null;\n userMessageCollapsedLines?: number;\n userMessageContent?: string;\n userMessageCollapseThreshold?: number | null;\n userMessageShowLessLabel?: string;\n userMessageShowMoreLabel?: string;\n};\n\nexport function shouldCollapseUserMessage(\n content: string,\n threshold: number | null | undefined = DEFAULT_USER_MESSAGE_COLLAPSE_THRESHOLD\n) {\n return typeof threshold === \"number\" && threshold > 0 && content.length > threshold;\n}\n\nexport function AgentChatUserMessageContent({\n collapsedLines = DEFAULT_USER_MESSAGE_COLLAPSED_LINES,\n collapseThreshold = DEFAULT_USER_MESSAGE_COLLAPSE_THRESHOLD,\n content,\n showLessLabel = \"Show less\",\n showMoreLabel = \"Show more\",\n}: AgentChatUserMessageContentProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n const contentId = React.useId();\n const shouldCollapse = shouldCollapseUserMessage(content, collapseThreshold);\n const Icon = isExpanded ? ChevronUp : ChevronDown;\n const clampedStyle = shouldCollapse && !isExpanded\n ? {\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: Math.max(1, collapsedLines),\n display: \"-webkit-box\",\n overflow: \"hidden\",\n } satisfies React.CSSProperties\n : undefined;\n\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div id={contentId} className=\"min-w-0\" style={clampedStyle}>\n {content}\n </div>\n {shouldCollapse ? (\n <button\n aria-controls={contentId}\n aria-expanded={isExpanded}\n className={cn(\n \"inline-flex w-fit items-center gap-1 rounded-md text-left text-sm font-medium text-muted-foreground transition-colors\",\n \"hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0\"\n )}\n onClick={() => setIsExpanded((current) => !current)}\n type=\"button\"\n >\n {isExpanded ? showLessLabel : showMoreLabel}\n <Icon aria-hidden=\"true\" className=\"size-4\" strokeWidth={2} />\n </button>\n ) : null}\n </div>\n );\n}\n\nexport function AgentChatMessage({\n actionHandlers,\n additionalActions,\n actions,\n actionsClassName,\n attachmentContentResolver,\n className,\n contentClassName,\n dir,\n getHitlActionState,\n message,\n nodeActivityMode,\n onHitlAction,\n Timeline = AgentResponseTimeline,\n renderAssistantContent,\n renderUserContent,\n showAssistantAttachments = false,\n streamingMessageId,\n userMessageCollapsedLines,\n userMessageContent,\n userMessageCollapseThreshold,\n userMessageShowLessLabel,\n userMessageShowMoreLabel,\n}: AgentChatMessageProps) {\n const isAssistant = message.role === \"assistant\";\n const isStreaming = isAssistant && message.id === streamingMessageId;\n const resolvedUserContent = userMessageContent ?? message.content;\n const shouldRenderContent = isAssistant || Boolean(renderUserContent || resolvedUserContent);\n const showAttachments =\n Boolean(message.attachments?.length) &&\n (message.role === \"user\" || showAssistantAttachments);\n const renderedActions = actions ?? (\n actionHandlers ? (\n <AgentChatDefaultActions\n additionalActions={additionalActions}\n dir={dir}\n handlers={actionHandlers}\n message={message}\n />\n ) : null\n );\n\n return (\n <Message className={className} dir={dir} from={message.role}>\n {showAttachments ? (\n <ChatAttachmentRows\n attachments={message.attachments || []}\n className=\"mb-2\"\n dir={dir}\n resolveContent={attachmentContentResolver}\n />\n ) : null}\n\n {shouldRenderContent ? (\n <MessageContent\n className={cn(isAssistant ? \"bg-transparent p-0\" : undefined, contentClassName)}\n dir={dir}\n from={message.role}\n >\n {isAssistant ? (\n renderAssistantContent ? (\n renderAssistantContent({ isStreaming, message })\n ) : (\n <Timeline\n getHitlActionState={getHitlActionState}\n isLoading={isStreaming}\n message={message}\n nodeActivityMode={nodeActivityMode}\n onHitlAction={onHitlAction}\n parts={message.parts}\n />\n )\n ) : null}\n {!isAssistant ? (\n renderUserContent ? (\n renderUserContent({ message })\n ) : resolvedUserContent ? (\n <AgentChatUserMessageContent\n collapsedLines={userMessageCollapsedLines}\n collapseThreshold={userMessageCollapseThreshold}\n content={resolvedUserContent}\n showLessLabel={userMessageShowLessLabel}\n showMoreLabel={userMessageShowMoreLabel}\n />\n ) : null\n ) : null}\n </MessageContent>\n ) : null}\n\n {renderedActions ? (\n <div className={cn(dir === \"rtl\" ? \"mt-1 h-9 w-full\" : \"mt-1 h-9 w-full -translate-x-2\", actionsClassName)}>\n {renderedActions}\n </div>\n ) : null}\n </Message>\n );\n}\n","import * as React from \"react\";\n\nimport type { ChatHitlPart, ChatHitlResponse, ChatMessage, ChatNodeActivityPart, ChatPart, ChatToolPart } from \"../types\";\nimport { getActiveStreamingTextPartId } from \"../streaming-text\";\nimport { AskUserInteraction } from \"./ask-user-interaction\";\nimport { AgentChatContextCompressionRow } from \"./agent-chat-context-compression-row\";\nimport type { McpConnectRequiredStatus } from \"./mcp-connect-required-card\";\nimport { MessageResponse, type MessageResponseProps } from \"./message-response\";\nimport { hitlActionLabel, hitlTitle, resolvedHitlLabel } from \"./hitl-presentation\";\nimport { cn } from \"./utils\";\nimport {\n AgentChatActivityRow,\n AgentChatNodeActivityRow,\n AgentChatSubagentGroup,\n AgentChatModelTurnRow,\n AgentChatToolRow,\n AgentChatToolSession,\n isAgentChatSubagent,\n latestRunningAgentChatToolId,\n partitionAgentChatToolTimeline,\n type AgentChatToolSlots,\n type AgentChatToolViewMode,\n} from \"./tool-sessions\";\n\nexport type AgentChatPartActionState = {\n status?: McpConnectRequiredStatus | string;\n error?: string | null;\n};\n\nexport type HitlActionState = AgentChatPartActionState;\n\nexport type AgentResponseTimelineProps = {\n getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;\n isLoading?: boolean;\n message: ChatMessage;\n nodeActivityMode?: \"default\" | \"all\" | \"hidden\";\n onHitlAction?: (part: ChatHitlPart, response: ChatHitlResponse) => void;\n parts?: readonly ChatPart[];\n responseProps?: Omit<MessageResponseProps, \"children\" | \"streaming\" | \"streamingId\">;\n toolSlots?: AgentChatToolSlots;\n toolViewMode?: AgentChatToolViewMode;\n};\n\nexport type AgentChatTimelineSlotProps = Omit<AgentResponseTimelineProps, \"parts\"> & {\n parts: readonly ChatPart[];\n};\n\nexport type AgentChatTimelineComponent = React.ComponentType<AgentChatTimelineSlotProps>;\n\nfunction isInternalAskUserTool(part: ChatToolPart): boolean {\n return [part.toolName, part.toolKey, part.action]\n .some((value) => value?.trim().toLowerCase() === \"runtime__ask_user\");\n}\n\nfunction Shimmer({ children, className }: { children: React.ReactNode; className?: string }) {\n return <span className={cn(\"inline-block animate-pulse\", className)}>{children}</span>;\n}\n\nexport function AgentChatToolPart({\n activeToolId,\n part,\n}: {\n activeToolId?: string | null;\n part: ChatToolPart;\n}) {\n return <AgentChatToolRow activeToolId={activeToolId} part={part} />;\n}\n\nexport function AgentChatToolGroup({\n activeToolId,\n parts,\n}: {\n activeToolId?: string | null;\n parts: ChatToolPart[];\n}) {\n return <AgentChatToolSession activeToolId={activeToolId} parts={parts} />;\n}\n\nfunction HitlPartRow({\n getHitlActionState,\n isLoading,\n onHitlAction,\n part,\n}: {\n getHitlActionState?: AgentResponseTimelineProps[\"getHitlActionState\"];\n isLoading?: boolean;\n onHitlAction?: AgentResponseTimelineProps[\"onHitlAction\"];\n part: ChatHitlPart;\n}) {\n const state = getHitlActionState?.(part);\n const [comment, setComment] = React.useState(\"\");\n const presentation = part.presentation || {};\n const requireComment = presentation.require_comment === true;\n const isTerminal = part.status !== \"pending\";\n const resolvedRef = React.useRef<HTMLDivElement>(null);\n const wasTerminal = React.useRef(isTerminal);\n React.useEffect(() => {\n if (isTerminal && !wasTerminal.current) resolvedRef.current?.focus();\n wasTerminal.current = isTerminal;\n }, [isTerminal]);\n if (part.hitlKind === \"user_input\") {\n return (\n <AskUserInteraction\n error={state?.error}\n isBusy={isLoading || state?.status === \"resuming\"}\n onSubmit={onHitlAction ? (answers) => onHitlAction(part, {\n action: \"respond\",\n answers: answers.map((answer) => ({\n question_id: answer.questionId,\n selected_option_ids: answer.selectedOptionIds,\n ...(answer.customText ? { custom_text: answer.customText } : {}),\n })),\n }) : undefined}\n part={part}\n />\n );\n }\n if (isTerminal) {\n return (\n <div className=\"a24-hitl a24-hitl--resolved px-1 py-1 text-sm text-muted-foreground\" ref={resolvedRef} role=\"status\" tabIndex={-1}>{resolvedHitlLabel(part)}</div>\n );\n }\n return (\n <div className=\"a24-hitl space-y-2.5 px-1 py-2\">\n <div className=\"a24-hitl__title text-sm font-medium text-foreground text-pretty\">{hitlTitle(part)}</div>\n {requireComment ? (\n <textarea\n aria-label=\"Approval comment\"\n autoComplete=\"off\"\n className=\"a24-hitl__comment min-h-20 w-full resize-y rounded-md border border-border/60 bg-background px-3 py-2 text-sm outline-none focus-visible:border-neutral-300 focus-visible:ring-0 dark:focus-visible:border-neutral-600\"\n name=\"hitl-comment\"\n onChange={(event) => setComment(event.target.value)}\n placeholder=\"Comment required…\"\n value={comment}\n />\n ) : null}\n {state?.error ? <div className=\"a24-hitl__error text-sm text-destructive\">{state.error}</div> : null}\n <div className=\"a24-hitl__actions flex flex-wrap items-center gap-1.5\">\n {part.allowedActions.map((action) => (\n <button\n key={action}\n aria-label={hitlActionLabel(part, action)}\n className={cn(\n \"a24-hitl__action min-h-10 rounded-md px-3 text-sm font-medium transition-[background-color,color,opacity,transform] duration-150 ease-out active:scale-[0.96] disabled:pointer-events-none disabled:opacity-60\",\n action === \"approve\" || action === \"connect\"\n ? \"bg-neutral-900 text-white hover:bg-neutral-800 dark:bg-neutral-100 dark:text-neutral-900 dark:hover:bg-white\"\n : \"bg-transparent text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n )}\n data-primary={action === \"approve\" || action === \"connect\" ? \"\" : undefined}\n disabled={!onHitlAction || isLoading || state?.status === \"connecting\" || state?.status === \"resuming\" || (requireComment && !comment.trim())}\n onClick={() => onHitlAction?.(part, {\n action,\n ...(comment.trim() ? { comment: comment.trim() } : {}),\n })}\n type=\"button\"\n >\n {hitlActionLabel(part, action)}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nexport type AgentChatPartProps = {\n activeToolId?: string | null;\n getHitlActionState?: AgentResponseTimelineProps[\"getHitlActionState\"];\n isLoading?: boolean;\n isTextStreaming?: boolean;\n message: ChatMessage;\n onHitlAction?: AgentResponseTimelineProps[\"onHitlAction\"];\n part: ChatPart;\n responseProps?: AgentResponseTimelineProps[\"responseProps\"];\n toolSlots?: AgentChatToolSlots;\n};\n\nexport function AgentChatPart({\n activeToolId,\n getHitlActionState,\n isLoading,\n isTextStreaming,\n message,\n onHitlAction,\n part,\n responseProps,\n toolSlots,\n}: AgentChatPartProps) {\n if (part.kind === \"text\") {\n return (\n <MessageResponse\n {...responseProps}\n streaming={isTextStreaming ?? Boolean(isLoading && part.raw?.status === \"streaming\")}\n streamingId={part.id}\n >\n {part.text}\n </MessageResponse>\n );\n }\n if (part.kind === \"tool\") return isAgentChatSubagent(part)\n ? <AgentChatSubagentGroup part={part} slots={toolSlots} />\n : <AgentChatToolRow activeToolId={activeToolId} part={part} slots={toolSlots} />;\n if (part.kind === \"model-turn\") return <AgentChatModelTurnRow part={part} />;\n if (part.kind === \"reasoning\") {\n const label = part.text || part.label || \"Thinking\";\n return part.status === \"running\" || part.status === \"streaming\"\n ? <Shimmer className=\"text-sm text-muted-foreground\">{label}</Shimmer>\n : <div className=\"text-sm text-muted-foreground\">{label}</div>;\n }\n if (part.kind === \"context-compression\") {\n return <AgentChatContextCompressionRow part={part} />;\n }\n if (part.kind === \"ui-blocks\") {\n if (part.state === \"output-error\") {\n return <div className=\"a24-timeline-error text-sm text-destructive\">{part.errorText || \"Failed to render UI content.\"}</div>;\n }\n return part.bundle ? <SafeUiBlocks bundle={part.bundle} /> : <div className=\"text-sm text-muted-foreground\">{part.state === \"input-streaming\" ? <Shimmer>Rendering UI block</Shimmer> : \"Rendered UI block\"}</div>;\n }\n if (part.kind === \"hitl\") {\n return (\n <HitlPartRow\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n onHitlAction={onHitlAction}\n part={part}\n />\n );\n }\n if (part.kind === \"error\") return <div className=\"a24-timeline-error text-sm text-destructive\" role=\"alert\">{part.errorText}</div>;\n if (part.kind === \"source\") {\n const href = safeExternalUrl(part.url);\n return href ? <a className=\"a24-source-link\" href={href} rel=\"noopener noreferrer\" target=\"_blank\">{part.title}</a> : <span className=\"a24-source-link\">{part.title}</span>;\n }\n if (part.kind === \"citation\") {\n const href = safeExternalUrl(part.url);\n const label = part.label || \"Citation\";\n return href ? <a className=\"a24-citation\" href={href} rel=\"noopener noreferrer\" target=\"_blank\">{label}</a> : <span className=\"a24-citation\">{label}</span>;\n }\n if (part.kind === \"attachment\") return <div className=\"a24-output-attachment\">{part.attachment.filename || \"Attachment\"}</div>;\n if (part.kind === \"data\") return <div data-agents24-data-part={part.name} className=\"hidden\">{message.id}</div>;\n return null;\n}\n\nfunction safeExternalUrl(value?: string | null): string | null {\n if (!value) return null;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.href : null;\n } catch {\n return null;\n }\n}\n\nfunction SafeUiBlocks({ bundle }: { bundle: Record<string, unknown> }) {\n const rows = Array.isArray(bundle.rows) ? bundle.rows : [];\n return (\n <section aria-label={typeof bundle.title === \"string\" ? bundle.title : \"Agent result\"} className=\"a24-ui-blocks\">\n {typeof bundle.title === \"string\" ? <h3>{bundle.title}</h3> : null}\n {rows.map((rawRow, rowIndex) => {\n const row = rawRow && typeof rawRow === \"object\" && !Array.isArray(rawRow) ? rawRow as Record<string, unknown> : {};\n const blocks = Array.isArray(row.blocks) ? row.blocks : [];\n return <div className=\"a24-ui-blocks__row\" key={`row-${rowIndex}`}>{blocks.map((rawBlock, blockIndex) => {\n const block = rawBlock && typeof rawBlock === \"object\" && !Array.isArray(rawBlock) ? rawBlock as Record<string, unknown> : {};\n const title = typeof block.title === \"string\" ? block.title : \"Result\";\n const kind = String(block.kind || \"note\");\n if (kind === \"table\" && Array.isArray(block.columns) && Array.isArray(block.rows)) {\n return (\n <div className=\"a24-ui-block\" key={String(block.id || blockIndex)}>\n <h4>{title}</h4>\n <div className=\"a24-ui-table-scroll\"><table><thead><tr>{block.columns.map((column, index) => <th key={index}>{String(column)}</th>)}</tr></thead><tbody>{block.rows.map((rawCells, index) => <tr key={index}>{(Array.isArray(rawCells) ? rawCells : []).map((cell, cellIndex) => <td key={cellIndex}>{String(cell)}</td>)}</tr>)}</tbody></table></div>\n </div>\n );\n }\n const value = block.value ?? block.text ?? \"\";\n return <div className=\"a24-ui-block\" key={String(block.id || blockIndex)}><h4>{title}</h4><p>{String(value)}</p></div>;\n })}</div>;\n })}\n </section>\n );\n}\n\nexport function AgentResponseTimeline({\n getHitlActionState,\n isLoading = false,\n message,\n nodeActivityMode = \"default\",\n onHitlAction,\n parts: displayParts,\n responseProps,\n toolSlots,\n toolViewMode = \"closed\",\n}: AgentResponseTimelineProps) {\n const parts = (displayParts || message.parts || []).filter((part) => (\n (part.kind !== \"tool\" || !isInternalAskUserTool(part))\n && (part.kind !== \"model-turn\" || part.turnKind === \"agent\")\n && (\n part.kind !== \"node-activity\"\n || nodeActivityMode === \"all\"\n || (nodeActivityMode === \"default\" && part.defaultChatVisible)\n )\n ));\n const toolParts = parts.filter((part): part is ChatToolPart => part.kind === \"tool\");\n const activeToolId = latestRunningAgentChatToolId(toolParts);\n const activeTextPartId = getActiveStreamingTextPartId(\n { ...message, parts: [...parts] },\n isLoading ? message.id : null,\n );\n const rendered = [];\n let activeActivityClaimed = false;\n const segments = partitionAgentChatToolTimeline(parts, toolViewMode);\n for (const [segmentIndex, segment] of segments.entries()) {\n if (segment.kind === \"tool\") {\n const isLatestActivity = segmentIndex === segments.length - 1;\n const showOrb = toolViewMode === \"closed\"\n ? isLoading && isLatestActivity\n : Boolean(activeToolId && (segment.part.id === activeToolId || segment.part.toolCallId === activeToolId));\n rendered.push(<AgentChatToolRow activeToolId={activeToolId} key={segment.part.id} part={segment.part} showOrb={showOrb} slots={toolSlots} />);\n continue;\n }\n if (segment.kind === \"tool-session\") {\n rendered.push(<AgentChatToolSession activeToolId={activeToolId} isLatestActivity={segmentIndex === segments.length - 1} isLive={isLoading} key={`tool-session-${segment.parts[0].id}`} leadingModelTurn={segment.leadingModelTurn} modelTurn={segment.modelTurn} parts={segment.parts} slots={toolSlots} />);\n continue;\n }\n if (segment.kind === \"subagent\") {\n rendered.push(<AgentChatSubagentGroup isLatestActivity={segmentIndex === segments.length - 1} isLive={isLoading} key={segment.part.id} part={segment.part} slots={toolSlots} />);\n continue;\n }\n const part = segment.part;\n if (part.kind === \"model-turn\") {\n const key = activeActivityClaimed ? part.id : `${message.id}-active-activity`;\n activeActivityClaimed = true;\n rendered.push(<AgentChatActivityRow key={key} label=\"Planning next moves\" modelTurnId={part.modelTurnId} />);\n continue;\n }\n if (part.kind === \"node-activity\") {\n const key = activeActivityClaimed ? part.id : `${message.id}-active-activity`;\n if (part.status === \"running\") activeActivityClaimed = true;\n rendered.push(\n part.status === \"running\"\n ? <AgentChatActivityRow key={key} label={part.label} />\n : <AgentChatNodeActivityRow key={part.id} part={part as ChatNodeActivityPart} />,\n );\n continue;\n }\n rendered.push(\n <React.Fragment key={part.id}>\n <AgentChatPart\n activeToolId={activeToolId}\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n isTextStreaming={part.kind === \"text\" && part.id === activeTextPartId}\n message={message}\n onHitlAction={onHitlAction}\n part={part}\n responseProps={responseProps}\n toolSlots={toolSlots}\n />\n </React.Fragment>\n );\n }\n if (rendered.length === 0 && message.content) {\n rendered.push(<MessageResponse key={`${message.id}-fallback`}>{message.content}</MessageResponse>);\n }\n if (rendered.length === 0 && isLoading) {\n rendered.push(<AgentChatActivityRow key={`${message.id}-active-activity`} label=\"Thinking\" />);\n }\n return <div className=\"space-y-3\">{rendered}</div>;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { ChatMessage, ChatPart } from \"./types\";\n\nexport type StreamingTextMode = \"streaming\" | \"static\";\n\nexport type StreamingTextCache = {\n get: (id: string) => string | undefined;\n set: (id: string, text: string) => void;\n};\n\nexport type UseStreamingTextOptions = {\n id: string;\n isStreaming: boolean;\n text: string;\n cache?: StreamingTextCache | false;\n charsPerSecond?: number;\n catchupThreshold?: number;\n maxCatchupChars?: number;\n};\n\nexport type UseStreamingTextResult = {\n displayedText: string;\n isAnimating: boolean;\n mode: StreamingTextMode;\n parseIncompleteMarkdown: boolean;\n};\n\nconst DEFAULT_COMPLETED_TEXT_CACHE_SIZE = 200;\nconst STREAM_RUNWAY_MS = 80;\nconst STREAM_IDLE_RELEASE_MS = 120;\nconst defaultCompletedTextCache = new Map<string, string>();\n\nconst defaultStreamingTextCache: StreamingTextCache = {\n get: (id) => defaultCompletedTextCache.get(id),\n set: (id, text) => {\n defaultCompletedTextCache.set(id, text);\n if (defaultCompletedTextCache.size > DEFAULT_COMPLETED_TEXT_CACHE_SIZE) {\n const firstKey = defaultCompletedTextCache.keys().next().value;\n if (firstKey) defaultCompletedTextCache.delete(firstKey);\n }\n },\n};\n\nexport const getActiveStreamingTextPartId = (\n message: ChatMessage,\n streamingMessageId: string | null\n) => {\n if (message.role !== \"assistant\" || streamingMessageId !== message.id) return null;\n const trailingPart = message.parts[message.parts.length - 1];\n return trailingPart?.kind === \"text\" ? trailingPart.id : null;\n};\n\nexport const isActiveStreamingTextPart = (\n message: ChatMessage,\n part: ChatPart,\n streamingMessageId: string | null\n) => part.kind === \"text\" && part.id === getActiveStreamingTextPartId(message, streamingMessageId);\n\nconst graphemeEndOffsets = (value: string): number[] => {\n if (!value) return [];\n\n if (typeof Intl !== \"undefined\" && \"Segmenter\" in Intl) {\n const segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n return Array.from(segmenter.segment(value), ({ index, segment }) => index + segment.length);\n }\n\n const characters = Array.from(value);\n const offsets: number[] = [];\n let offset = 0;\n let regionalIndicators = 0;\n characters.forEach((character, index) => {\n const previous = characters[index - 1];\n const codePoint = character.codePointAt(0) ?? 0;\n const isRegionalIndicator = codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff;\n const continuesCluster =\n index > 0 &&\n (/^\\p{Mark}$/u.test(character) ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n (codePoint >= 0x1f3fb && codePoint <= 0x1f3ff) ||\n character === \"\\u200d\" ||\n previous === \"\\u200d\" ||\n (isRegionalIndicator && regionalIndicators % 2 === 1));\n if (!continuesCluster) {\n if (offset > 0) offsets.push(offset);\n regionalIndicators = 0;\n }\n offset += character.length;\n regionalIndicators = isRegionalIndicator ? regionalIndicators + 1 : 0;\n });\n offsets.push(offset);\n return offsets;\n};\n\nexport function useStreamingText({\n id,\n isStreaming,\n text,\n cache = defaultStreamingTextCache,\n charsPerSecond = 72,\n catchupThreshold = 40,\n maxCatchupChars = 20,\n}: UseStreamingTextOptions): UseStreamingTextResult {\n const cacheAdapter = cache === false ? null : cache;\n const [displayedText, setDisplayedText] = useState(() => {\n const cachedText = cacheAdapter?.get(id);\n return cachedText && text.startsWith(cachedText) ? cachedText : text;\n });\n const targetRef = useRef(text);\n const displayedRef = useRef(displayedText);\n const rafRef = useRef<number | null>(null);\n const lastFrameAtRef = useRef<number | null>(null);\n const targetUpdatedAtRef = useRef<number | null>(null);\n const progressRemainderRef = useRef(0);\n const idRef = useRef(id);\n const streamingRef = useRef(isStreaming);\n const reduceMotionRef = useRef(false);\n\n useEffect(() => {\n if (isStreaming || !text) return;\n cacheAdapter?.set(id, text);\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n targetRef.current = text;\n targetUpdatedAtRef.current =\n typeof performance === \"undefined\" ? null : performance.now();\n\n if (\n !isStreaming ||\n reduceMotionRef.current ||\n !text.startsWith(displayedRef.current)\n ) {\n displayedRef.current = text;\n setDisplayedText(text);\n progressRemainderRef.current = 0;\n }\n }, [isStreaming, text]);\n\n useEffect(() => {\n if (idRef.current === id) return;\n\n idRef.current = id;\n const cachedText = cacheAdapter?.get(id);\n const initial = cachedText && text.startsWith(cachedText) ? cachedText : text;\n displayedRef.current = initial;\n setDisplayedText(initial);\n lastFrameAtRef.current = null;\n targetUpdatedAtRef.current =\n typeof performance === \"undefined\" ? null : performance.now();\n progressRemainderRef.current = 0;\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n streamingRef.current = isStreaming;\n\n if (typeof window === \"undefined\") {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n const reduceMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n reduceMotionRef.current = reduceMotion;\n\n if (reduceMotion || !isStreaming) {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n const cachedText = cacheAdapter?.get(id);\n if (cachedText === text) {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n if (!text.startsWith(displayedRef.current)) {\n displayedRef.current = text;\n setDisplayedText(text);\n }\n\n const tick = (timestamp: number) => {\n const previousTimestamp = lastFrameAtRef.current ?? timestamp;\n lastFrameAtRef.current = timestamp;\n\n const target = targetRef.current;\n const current = displayedRef.current;\n\n if (!streamingRef.current || reduceMotionRef.current) {\n displayedRef.current = target;\n setDisplayedText(target);\n rafRef.current = null;\n return;\n }\n\n if (!target.startsWith(current)) {\n displayedRef.current = target;\n setDisplayedText(target);\n progressRemainderRef.current = 0;\n rafRef.current = window.requestAnimationFrame(tick);\n return;\n }\n\n const pending = target.slice(current.length);\n const pendingOffsets = graphemeEndOffsets(pending);\n if (pendingOffsets.length === 0) {\n rafRef.current = window.requestAnimationFrame(tick);\n return;\n }\n\n const elapsedMs = Math.max(0, timestamp - previousTimestamp);\n const targetIdleMs =\n targetUpdatedAtRef.current === null\n ? STREAM_IDLE_RELEASE_MS\n : Math.max(0, timestamp - targetUpdatedAtRef.current);\n const runway =\n targetIdleMs >= STREAM_IDLE_RELEASE_MS\n ? 0\n : Math.min(\n pendingOffsets.length - 1,\n Math.max(1, Math.ceil((charsPerSecond * STREAM_RUNWAY_MS) / 1000))\n );\n const eligibleGraphemes = pendingOffsets.length - runway;\n\n progressRemainderRef.current += (elapsedMs / 1000) * charsPerSecond;\n let step = Math.floor(progressRemainderRef.current);\n if (current.length === 0 && eligibleGraphemes > 0) step = Math.max(1, step);\n\n const catchupStep =\n pendingOffsets.length > catchupThreshold\n ? Math.min(maxCatchupChars, Math.ceil(pendingOffsets.length / 10))\n : 0;\n step = Math.min(eligibleGraphemes, Math.max(step, catchupStep));\n\n if (step > 0) {\n progressRemainderRef.current = Math.max(0, progressRemainderRef.current - step);\n const next = current + pending.slice(0, pendingOffsets[step - 1]);\n displayedRef.current = next;\n setDisplayedText(next);\n }\n rafRef.current = window.requestAnimationFrame(tick);\n };\n\n if (rafRef.current === null) {\n rafRef.current = window.requestAnimationFrame(tick);\n }\n\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameAtRef.current = null;\n progressRemainderRef.current = 0;\n };\n }, [cacheAdapter, catchupThreshold, charsPerSecond, id, isStreaming, maxCatchupChars]);\n\n const reduceMotion =\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n return {\n displayedText: !isStreaming || reduceMotion ? text : displayedText,\n isAnimating: isStreaming,\n mode: isStreaming ? \"streaming\" : \"static\",\n parseIncompleteMarkdown: isStreaming,\n };\n}\n","import * as React from \"react\";\nimport {\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n Pencil,\n} from \"lucide-react\";\n\nimport type { ChatHitlAnswer, ChatHitlPart, ChatHitlQuestion } from \"../types\";\nimport {\n askUserAnswersFromDrafts,\n askUserDraftHasAnswer,\n emptyAskUserDrafts,\n selectAskUserOption,\n updateAskUserCustomText,\n type AskUserDrafts,\n} from \"./ask-user-interaction-state\";\nimport { cn } from \"./utils\";\n\nexport type AskUserInteractionProps = {\n error?: string | null;\n isBusy?: boolean;\n onSubmit?: (answers: ChatHitlAnswer[]) => void;\n part: ChatHitlPart;\n};\n\nfunction resolvedAnswerText(\n question: ChatHitlQuestion,\n answer: ChatHitlAnswer | undefined,\n): string[] {\n if (!answer) return [\"No response recorded\"];\n const labels = answer.selectedOptionIds.flatMap((optionId) => {\n const option = question.options.find((item) => item.id === optionId);\n return option ? [option.label] : [];\n });\n if (answer.customText) labels.push(answer.customText);\n return labels.length ? labels : [\"No response recorded\"];\n}\n\nfunction ResolvedQuestions({\n buttonRef,\n part,\n}: {\n buttonRef?: React.RefObject<HTMLButtonElement | null>;\n part: ChatHitlPart;\n}) {\n const [open, setOpen] = React.useState(false);\n const count = part.questions.length;\n const answers = new Map(\n (part.resolution?.answers || []).map((answer) => [\n answer.questionId,\n answer,\n ]),\n );\n\n return (\n <div className=\"a24-ask-user a24-ask-user--resolved w-full\">\n <button\n aria-expanded={open}\n className=\"group flex min-w-0 items-center gap-1.5 rounded-md px-0 py-0.5 text-start text-sm text-muted-foreground transition-colors hover:text-foreground motion-reduce:transition-none\"\n onClick={() => setOpen((value) => !value)}\n ref={buttonRef}\n type=\"button\"\n >\n <span>\n Asked {count} question{count === 1 ? \"\" : \"s\"}\n </span>\n {open ? (\n <ChevronDown aria-hidden=\"true\" className=\"size-3.5\" />\n ) : (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-3.5 opacity-70 rtl:rotate-180\"\n />\n )}\n </button>\n {open ? (\n <div className=\"mt-2 space-y-3 ps-4\">\n {part.questions.map((question) => (\n <div className=\"min-w-0\" key={question.id}>\n <div className=\"text-sm font-medium text-foreground\">\n {question.question}\n </div>\n <div className=\"mt-1 space-y-1 text-sm text-muted-foreground\">\n {resolvedAnswerText(\n question,\n answers.get(question.id),\n ).map((value, index) => (\n <div\n className=\"whitespace-pre-wrap break-words\"\n key={`${question.id}:${index}`}\n >\n {value}\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function AskUserInteraction({\n error,\n isBusy = false,\n onSubmit,\n part,\n}: AskUserInteractionProps) {\n const questions = part.questions;\n const [step, setStep] = React.useState(0);\n const [drafts, setDrafts] = React.useState<AskUserDrafts>(() =>\n emptyAskUserDrafts(questions),\n );\n const headingRef = React.useRef<HTMLHeadingElement>(null);\n const questionsRef = React.useRef(questions);\n const resolvedButtonRef = React.useRef<HTMLButtonElement>(null);\n const wasResolvedRef = React.useRef(part.status !== \"pending\");\n questionsRef.current = questions;\n\n React.useEffect(() => {\n setStep(0);\n setDrafts(emptyAskUserDrafts(questionsRef.current));\n }, [part.interruptId]);\n\n React.useEffect(() => {\n headingRef.current?.focus();\n }, [step]);\n\n React.useEffect(() => {\n const isResolved = part.status !== \"pending\";\n if (isResolved && !wasResolvedRef.current) {\n resolvedButtonRef.current?.focus();\n }\n wasResolvedRef.current = isResolved;\n }, [part.status]);\n\n if (part.status !== \"pending\") {\n return <ResolvedQuestions buttonRef={resolvedButtonRef} part={part} />;\n }\n\n const question = questions[step];\n if (!question) {\n return (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n This question request is unavailable.\n </div>\n );\n }\n\n const draft = drafts[question.id] || {\n customText: \"\",\n selectedOptionIds: [],\n };\n const isLastQuestion = step === questions.length - 1;\n const canMoveForward = askUserDraftHasAnswer(draft);\n\n const completeStep = (nextDrafts: AskUserDrafts) => {\n if (isLastQuestion) {\n onSubmit?.(askUserAnswersFromDrafts(questions, nextDrafts));\n return;\n }\n setStep((current) => Math.min(current + 1, questions.length - 1));\n };\n\n const selectOption = (optionId: string) => {\n const nextDrafts = selectAskUserOption({\n draft,\n drafts,\n optionId,\n question,\n });\n setDrafts(nextDrafts);\n if (!question.multiSelect) completeStep(nextDrafts);\n };\n\n const updateCustomText = (customText: string) => {\n setDrafts((current) =>\n updateAskUserCustomText({\n customText,\n drafts: current,\n question,\n }),\n );\n };\n\n return (\n <div className=\"a24-ask-user space-y-3 rounded-xl border border-border/50 bg-background p-4 shadow-sm\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <h3\n className=\"min-w-0 flex-1 text-base font-medium leading-6 text-foreground outline-none\"\n ref={headingRef}\n tabIndex={-1}\n >\n {question.question}\n </h3>\n <div className=\"flex shrink-0 items-center gap-1 text-muted-foreground\">\n <button\n aria-label=\"Previous question\"\n className=\"flex size-8 items-center justify-center rounded-full transition-colors hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30\"\n disabled={isBusy || step === 0}\n onClick={() => setStep((current) => Math.max(0, current - 1))}\n type=\"button\"\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"size-4 rtl:rotate-180\"\n />\n </button>\n <span\n aria-label={`Question ${step + 1} of ${questions.length}`}\n className=\"min-w-12 text-center text-sm tabular-nums\"\n >\n {step + 1} / {questions.length}\n </span>\n <button\n aria-label={isLastQuestion ? \"Submit answers\" : \"Next question\"}\n className=\"flex size-8 items-center justify-center rounded-full transition-colors hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30\"\n disabled={isBusy || !onSubmit || !canMoveForward}\n onClick={() => completeStep(drafts)}\n type=\"button\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-4 rtl:rotate-180\"\n />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-1\">\n {question.options.map((option, index) => {\n const selected = draft.selectedOptionIds.includes(option.id);\n return (\n <button\n aria-pressed={selected}\n className={cn(\n \"group flex min-h-11 w-full items-center gap-3 rounded-xl px-2.5 py-2 text-start text-sm transition-colors motion-reduce:transition-none\",\n selected ? \"bg-muted\" : \"hover:bg-muted/70\",\n )}\n disabled={isBusy || !onSubmit}\n key={option.id}\n onClick={() => selectOption(option.id)}\n type=\"button\"\n >\n <span\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-full border text-sm tabular-nums transition-colors\",\n selected\n ? \"border-border bg-background text-foreground\"\n : \"border-border/70 bg-muted/60 text-muted-foreground\",\n )}\n >\n {index + 1}\n </span>\n <span className=\"min-w-0 flex-1 font-medium text-foreground\">\n {option.label}\n </span>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 group-focus-visible:opacity-100 rtl:rotate-180\"\n />\n </button>\n );\n })}\n\n <div className=\"flex min-h-11 items-center gap-2 rounded-xl bg-muted px-2.5 py-1.5 focus-within:ring-1 focus-within:ring-ring\">\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-full border border-border/70 bg-background/70 text-muted-foreground\">\n <Pencil aria-hidden=\"true\" className=\"size-4\" />\n </span>\n <input\n aria-label=\"Other response\"\n autoComplete=\"off\"\n className=\"h-8 min-w-0 flex-1 bg-transparent px-1 text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n disabled={isBusy || !onSubmit}\n maxLength={2000}\n onChange={(event) => updateCustomText(event.target.value)}\n onKeyDown={(event) => {\n if (\n event.key === \"Enter\" &&\n !event.nativeEvent.isComposing &&\n draft.customText.trim()\n ) {\n event.preventDefault();\n completeStep(drafts);\n }\n }}\n placeholder=\"Other…\"\n value={draft.customText}\n />\n {draft.customText.trim() ? (\n <button\n className=\"h-8 shrink-0 rounded-full bg-foreground px-4 text-sm font-medium text-background transition-colors hover:opacity-85 disabled:opacity-50\"\n disabled={isBusy || !onSubmit}\n onClick={() => completeStep(drafts)}\n type=\"button\"\n >\n {isLastQuestion ? \"Submit\" : \"Next\"}\n </button>\n ) : null}\n </div>\n </div>\n\n {error ? (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n ) : null}\n </div>\n );\n}\n","import type {\n ChatHitlAnswer,\n ChatHitlQuestion,\n} from \"../types\";\n\nexport type AskUserDraftAnswer = {\n customText: string;\n selectedOptionIds: string[];\n};\n\nexport type AskUserDrafts = Record<string, AskUserDraftAnswer>;\n\nexport function emptyAskUserDrafts(\n questions: ChatHitlQuestion[],\n): AskUserDrafts {\n return Object.fromEntries(\n questions.map((question) => [\n question.id,\n { customText: \"\", selectedOptionIds: [] },\n ]),\n );\n}\n\nexport function askUserDraftHasAnswer(\n draft: AskUserDraftAnswer | undefined,\n): boolean {\n return Boolean(\n draft &&\n (draft.selectedOptionIds.length > 0 ||\n draft.customText.trim().length > 0),\n );\n}\n\nexport function selectAskUserOption({\n draft,\n drafts,\n optionId,\n question,\n}: {\n draft: AskUserDraftAnswer;\n drafts: AskUserDrafts;\n optionId: string;\n question: ChatHitlQuestion;\n}): AskUserDrafts {\n const selectedOptionIds = question.multiSelect\n ? draft.selectedOptionIds.includes(optionId)\n ? draft.selectedOptionIds.filter((id) => id !== optionId)\n : [...draft.selectedOptionIds, optionId]\n : [optionId];\n return {\n ...drafts,\n [question.id]: {\n customText: \"\",\n selectedOptionIds,\n },\n };\n}\n\nexport function updateAskUserCustomText({\n customText,\n drafts,\n question,\n}: {\n customText: string;\n drafts: AskUserDrafts;\n question: ChatHitlQuestion;\n}): AskUserDrafts {\n return {\n ...drafts,\n [question.id]: {\n customText,\n selectedOptionIds: question.multiSelect\n ? drafts[question.id]?.selectedOptionIds || []\n : [],\n },\n };\n}\n\nexport function askUserAnswersFromDrafts(\n questions: ChatHitlQuestion[],\n drafts: AskUserDrafts,\n): ChatHitlAnswer[] {\n return questions.map((question) => {\n const answer = drafts[question.id];\n return {\n questionId: question.id,\n selectedOptionIds: answer?.selectedOptionIds || [],\n ...(answer?.customText.trim()\n ? { customText: answer.customText.trim() }\n : {}),\n };\n });\n}\n","import type { ChatContextCompressionPart } from \"@agents24/react\";\nimport * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nfunction compressionPresentation(part: ChatContextCompressionPart): {\n label: string;\n status: \"completed\" | \"failed\" | \"running\";\n} {\n if (part.status === \"failed\") {\n return { label: \"Could not compact message history\", status: \"failed\" };\n }\n if (part.status === \"completed\") {\n return { label: \"Compacted message history\", status: \"completed\" };\n }\n return { label: \"Compacting message history\", status: \"running\" };\n}\n\nexport function AgentChatContextCompressionRow({\n className,\n part,\n}: {\n className?: string;\n part: ChatContextCompressionPart;\n}) {\n const presentation = compressionPresentation(part);\n return (\n <div\n aria-live=\"polite\"\n className={cn(\"a24-context-compression-row\", className)}\n data-agents24-context-compression=\"\"\n data-status={part.status}\n role=\"status\"\n >\n <div className=\"a24-tool-trigger-row\">\n <div className={cn(\n \"a24-tool-trigger a24-tool-trigger--root a24-tool-trigger--without-orb\",\n presentation.status === \"failed\" && \"a24-tool-trigger--error\",\n presentation.status === \"running\" && \"a24-tool-trigger--active\",\n )}>\n <span className={cn(\n \"a24-tool-trigger__label\",\n presentation.status === \"running\" && \"a24-tool-shimmer\",\n )}>\n {presentation.label}\n </span>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { defaultRehypePlugins, Streamdown } from \"streamdown\";\n\nimport { CHAT_MARKDOWN_HARDEN_OPTIONS, safeChatMarkdownHref } from \"../active-content\";\nimport { useStreamingText } from \"../streaming-text\";\nimport { cn } from \"./utils\";\n\nexport type MessageResponseProps = React.ComponentProps<typeof Streamdown> & {\n streaming?: boolean;\n streamingId?: string;\n};\n\ntype MarkdownNode = {\n tagName?: string;\n position?: {\n start?: { line?: number };\n end?: { line?: number };\n };\n};\n\ntype MarkdownElementProps = {\n children?: React.ReactNode;\n node?: MarkdownNode;\n};\n\nfunction SafeMarkdownLink({ children, href, ...props }: React.ComponentProps<\"a\"> & MarkdownElementProps) {\n const domProps = { ...props };\n delete domProps.node;\n const safeHref = safeChatMarkdownHref(href);\n if (!safeHref) return <span>{children}</span>;\n if (safeHref.startsWith(\"#\")) return <a {...domProps} href={safeHref}>{children}</a>;\n return <a {...domProps} href={safeHref} rel=\"noopener noreferrer\" target=\"_blank\">{children}</a>;\n}\n\nfunction BlockedMarkdownImage({ alt }: React.ComponentProps<\"img\"> & MarkdownElementProps) {\n return alt ? <span aria-label={`Image blocked: ${alt}`} role=\"img\">{alt}</span> : null;\n}\n\nconst BLOCK_MARKDOWN_TAGS = new Set([\n \"blockquote\",\n \"div\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"ol\",\n \"pre\",\n \"table\",\n \"ul\",\n]);\n\nfunction isMultilineCodeNode(node?: MarkdownNode) {\n return (\n node?.tagName === \"code\" &&\n node.position?.start?.line !== undefined &&\n node.position?.end?.line !== undefined &&\n node.position.start.line !== node.position.end.line\n );\n}\n\nfunction hasBlockMarkdownChild(child: React.ReactNode): boolean {\n if (!React.isValidElement(child)) {\n return false;\n }\n\n if (typeof child.type === \"string\" && BLOCK_MARKDOWN_TAGS.has(child.type)) {\n return true;\n }\n\n const props = child.props as MarkdownElementProps;\n if (BLOCK_MARKDOWN_TAGS.has(props.node?.tagName || \"\") || isMultilineCodeNode(props.node)) {\n return true;\n }\n\n return React.Children.toArray(props.children).some(hasBlockMarkdownChild);\n}\n\nfunction MessageMarkdownParagraph({\n children,\n ...props\n}: React.ComponentProps<\"p\"> & MarkdownElementProps) {\n const domProps = { ...props };\n delete domProps.node;\n const childArray = React.Children.toArray(children).filter(\n (child) => child !== null && child !== \"\"\n );\n const isImageOnly =\n childArray.length === 1 &&\n React.isValidElement(childArray[0]) &&\n (childArray[0].props as MarkdownElementProps).node?.tagName === \"img\";\n\n if (isImageOnly) {\n return <>{children}</>;\n }\n\n if (childArray.some(hasBlockMarkdownChild)) {\n return <div {...domProps}>{children}</div>;\n }\n\n return <p {...domProps}>{children}</p>;\n}\n\ntype StreamdownComponents = NonNullable<\n React.ComponentProps<typeof Streamdown>[\"components\"]\n>;\n\nconst MESSAGE_RESPONSE_COMPONENTS = {\n a: SafeMarkdownLink,\n img: BlockedMarkdownImage,\n p: MessageMarkdownParagraph,\n} satisfies StreamdownComponents;\n\ntype StreamdownRehypePlugins = NonNullable<\n React.ComponentProps<typeof Streamdown>[\"rehypePlugins\"]\n>;\n\nconst streamdownDefaultRehypePlugins = (defaultRehypePlugins || {}) as Record<\n string,\n unknown\n>;\nconst streamdownHardenPlugin = Array.isArray(\n streamdownDefaultRehypePlugins.harden\n)\n ? streamdownDefaultRehypePlugins.harden[0]\n : streamdownDefaultRehypePlugins.harden;\n\nconst MESSAGE_RESPONSE_REHYPE_PLUGINS = [\n ...Object.entries(streamdownDefaultRehypePlugins)\n .filter(([key]) => key !== \"harden\")\n .map(([, plugin]) => plugin),\n ...(streamdownHardenPlugin\n ? [\n [\n streamdownHardenPlugin,\n CHAT_MARKDOWN_HARDEN_OPTIONS,\n ],\n ]\n : []),\n] as StreamdownRehypePlugins;\n\nexport const MessageResponse = React.memo(\n ({\n children,\n className,\n components,\n rehypePlugins,\n streaming = false,\n streamingId,\n ...props\n }: MessageResponseProps) => {\n const text =\n typeof children === \"string\" || typeof children === \"number\"\n ? String(children)\n : \"\";\n const streamingText = useStreamingText({\n charsPerSecond: 120,\n id: streamingId || text,\n isStreaming: streaming && text.length > 0,\n maxCatchupChars: 32,\n text,\n });\n const streamdownComponents = React.useMemo<StreamdownComponents>(\n () => ({ ...MESSAGE_RESPONSE_COMPONENTS, ...components }) as StreamdownComponents,\n [components]\n );\n\n return (\n <Streamdown\n className={cn(\"a24-message-response\", className)}\n components={streamdownComponents}\n rehypePlugins={rehypePlugins || MESSAGE_RESPONSE_REHYPE_PLUGINS}\n {...props}\n >\n {text ? streamingText.displayedText : children}\n </Streamdown>\n );\n },\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children &&\n prevProps.className === nextProps.className &&\n prevProps.streaming === nextProps.streaming &&\n prevProps.streamingId === nextProps.streamingId &&\n prevProps.components === nextProps.components\n);\n\nMessageResponse.displayName = \"MessageResponse\";\n","export const CHAT_MARKDOWN_HARDEN_OPTIONS = Object.freeze({\n allowDataImages: false,\n allowedImagePrefixes: [] as string[],\n allowedLinkPrefixes: [\"*\"],\n allowedProtocols: [] as string[],\n defaultOrigin: undefined,\n imageBlockPolicy: \"text-only\" as const,\n linkBlockPolicy: \"text-only\" as const,\n});\n\nexport function safeChatMarkdownHref(value?: string): string | undefined {\n if (!value) return undefined;\n if (value.startsWith(\"#\")) return value;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n","import type { ChatHitlAction, ChatHitlPart } from \"../types\";\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nexport function hitlActionLabel(part: ChatHitlPart, action: ChatHitlAction): string {\n if (action === \"approve\") return [\"tool_review\", \"app_data_permission\"].includes(part.hitlKind) ? \"Allow once\" : \"Approve\";\n if (action === \"reject\") return [\"tool_review\", \"app_data_permission\"].includes(part.hitlKind) ? \"Don’t allow\" : \"Reject\";\n if (action === \"connect\") return \"Connect\";\n if (action === \"respond\") return \"Submit\";\n return \"Skip\";\n}\n\nexport function hitlTitle(part: ChatHitlPart): string {\n const presentation = part.presentation || {};\n if (part.hitlKind === \"tool_review\") return `Run ${optionalString(presentation.tool_name) || \"this tool\"}?`;\n if (part.hitlKind === \"mcp_auth\") {\n const serverName = optionalString(presentation.server_name);\n return serverName ? `Connect ${serverName} to continue` : part.message;\n }\n if (part.hitlKind === \"app_data_permission\") return \"Allow this data change?\";\n return part.message;\n}\n\nexport function resolvedHitlLabel(part: ChatHitlPart): string {\n const outcome = String(part.resolution?.outcome || part.status).trim().toLowerCase();\n return {\n approved: part.hitlKind === \"user_approval\" ? \"Approved\" : \"Allowed\",\n rejected: part.hitlKind === \"user_approval\" ? \"Rejected\" : \"Not allowed\",\n connected: \"connected\",\n skipped: \"Skipped\",\n timeout: \"Timed out\",\n expired: \"Timed out\",\n cancelled: \"Cancelled\",\n invalidated: \"No longer available\",\n policy_denied: \"Not allowed\",\n }[outcome] || outcome.replace(/_/g, \" \");\n}\n","import * as React from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { ThinkingOrb } from \"thinking-orbs\";\n\nimport type { ChatModelTurnPart, ChatNodeActivityPart, ChatPart, ChatToolChild, ChatToolPart } from \"../types\";\nimport { cn } from \"./utils\";\n\nexport type AgentChatToolViewMode = \"closed\" | \"expanded\";\n\nexport type AgentChatToolTimelineSegment =\n | { kind: \"part\"; part: ChatPart }\n | { kind: \"subagent\"; part: ChatToolPart }\n | { kind: \"tool\"; part: ChatToolPart }\n | { kind: \"tool-session\"; parts: ChatToolPart[]; leadingModelTurn?: ChatModelTurnPart; modelTurn?: ChatModelTurnPart };\n\nexport type AgentChatToolSlotContext = {\n isActive: boolean;\n label: string;\n part: ChatToolPart;\n};\n\nexport type AgentChatToolSlots = {\n onExpandedChange?: (open: boolean, part?: ChatToolPart) => void;\n onToolSelect?: (part: ChatToolPart) => void;\n renderChildTool?: (child: ChatToolChild, part: ChatToolPart) => React.ReactNode;\n renderToolAccessory?: (context: AgentChatToolSlotContext) => React.ReactNode;\n renderToolDetails?: (part: ChatToolPart) => React.ReactNode;\n renderToolLabel?: (context: AgentChatToolSlotContext) => React.ReactNode;\n};\n\nexport function agentChatToolLabel(part: ChatToolPart): string {\n const presentation = part.presentation || {};\n return optionalText(presentation.activity)\n || optionalText(presentation.title)\n || optionalText(part.displayName)\n || optionalText(part.summary)\n || optionalText(part.toolName)\n || \"Tool activity\";\n}\n\nexport function isAgentChatSubagent(part: ChatToolPart): boolean {\n const sourceKind = String(part.sourceKind || \"\").trim().toLowerCase();\n return sourceKind === \"agent\" || sourceKind === \"agent_call\" || Boolean(part.presentation.childRun);\n}\n\nexport function isAgentChatToolRunning(part: ChatToolPart): boolean {\n return part.state === \"input-available\" || part.state === \"input-streaming\";\n}\n\nexport function latestRunningAgentChatToolId(parts: readonly ChatToolPart[]): string | null {\n const active = [...parts].reverse().find(isAgentChatToolRunning);\n return active?.toolCallId || active?.id || null;\n}\n\nexport function partitionAgentChatToolTimeline(\n parts: readonly ChatPart[],\n toolViewMode: AgentChatToolViewMode = \"closed\",\n): AgentChatToolTimelineSegment[] {\n const segments: AgentChatToolTimelineSegment[] = [];\n let index = 0;\n while (index < parts.length) {\n const part = parts[index];\n const leadingModelTurn = part.kind === \"model-turn\"\n && parts[index + 1]?.kind === \"tool\"\n && !isAgentChatSubagent(parts[index + 1] as ChatToolPart)\n ? part as ChatModelTurnPart\n : undefined;\n if (leadingModelTurn) index += 1;\n const candidate = parts[index];\n if (candidate.kind !== \"tool\") {\n segments.push({ kind: \"part\", part: candidate });\n index += 1;\n continue;\n }\n if (isAgentChatSubagent(candidate)) {\n segments.push({ kind: \"subagent\", part: candidate });\n index += 1;\n continue;\n }\n const streak: ChatToolPart[] = [];\n while (index < parts.length) {\n const candidate = parts[index];\n if (candidate.kind !== \"tool\" || isAgentChatSubagent(candidate)) break;\n streak.push(candidate);\n index += 1;\n }\n const modelTurn = parts[index]?.kind === \"model-turn\" ? parts[index] as ChatModelTurnPart : undefined;\n if (modelTurn) index += 1;\n if (toolViewMode === \"expanded\") {\n if (leadingModelTurn) segments.push({ kind: \"part\", part: leadingModelTurn });\n segments.push(...streak.map((toolPart) => ({ kind: \"tool\" as const, part: toolPart })));\n if (modelTurn) segments.push({ kind: \"part\", part: modelTurn });\n } else if (streak.length === 1 && !modelTurn && !leadingModelTurn) {\n segments.push({ kind: \"tool\", part: streak[0] });\n } else {\n segments.push({\n kind: \"tool-session\",\n parts: streak,\n ...(leadingModelTurn ? { leadingModelTurn } : {}),\n ...(modelTurn ? { modelTurn } : {}),\n });\n }\n }\n return segments;\n}\n\nfunction optionalText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction isActive(part: ChatToolPart, activeToolId?: string | null): boolean {\n return Boolean(activeToolId && (part.id === activeToolId || part.toolCallId === activeToolId));\n}\n\nfunction ToolActivityReel({\n announce = true,\n initialLabel,\n initialShownAt,\n label,\n}: {\n announce?: boolean;\n initialLabel?: string;\n initialShownAt?: string | null;\n label: string;\n}) {\n const initial = initialLabel && initialLabel !== label ? initialLabel : label;\n const parsedInitialShownAt = initialShownAt ? Date.parse(initialShownAt) : Number.NaN;\n const [displayed, setDisplayed] = React.useState(initial);\n const [previous, setPrevious] = React.useState<string | null>(null);\n const displayedRef = React.useRef(initial);\n const latestRef = React.useRef(label);\n const shownAtRef = React.useRef(Number.isFinite(parsedInitialShownAt) ? parsedInitialShownAt : Date.now());\n React.useEffect(() => {\n latestRef.current = label;\n if (displayedRef.current === label) return;\n const showLatest = () => {\n const next = latestRef.current;\n if (displayedRef.current === next) return;\n const old = displayedRef.current;\n displayedRef.current = next;\n shownAtRef.current = Date.now();\n setPrevious(old);\n setDisplayed(next);\n };\n const remaining = Math.max(0, 500 - (Date.now() - shownAtRef.current));\n if (remaining === 0) {\n showLatest();\n return;\n }\n const timer = window.setTimeout(showLatest, remaining);\n return () => window.clearTimeout(timer);\n }, [label]);\n React.useEffect(() => {\n if (!previous) return;\n const timer = window.setTimeout(() => setPrevious(null), 200);\n return () => window.clearTimeout(timer);\n }, [previous]);\n return (\n <span className=\"a24-tool-reel\" aria-live={announce ? \"polite\" : \"off\"}>\n {previous ? <span aria-hidden=\"true\" className=\"a24-tool-reel__previous\">{previous}</span> : null}\n <span className={previous ? \"a24-tool-reel__current\" : undefined}>{displayed}</span>\n </span>\n );\n}\n\nfunction ToolActivityOrb({ label }: { label?: string }) {\n return (\n <span className=\"a24-tool-orb\">\n <ThinkingOrb aria-label={label || \"Working\"} size={20} speed={0.8} state=\"searching\" />\n </span>\n );\n}\n\nexport function AgentChatActivityRow({\n label,\n modelTurnId,\n onSelect,\n}: {\n label: string;\n modelTurnId?: string;\n onSelect?: () => void;\n}) {\n const content = (\n <>\n <ToolActivityOrb label={label} />\n <span className=\"a24-tool-trigger__label a24-tool-shimmer\"><ToolActivityReel label={label} /></span>\n </>\n );\n return (\n <div className=\"a24-tool-trigger-row\" data-agents24-model-turn={modelTurnId} role=\"status\">\n {onSelect ? (\n <button className=\"a24-tool-trigger a24-tool-trigger--root a24-tool-trigger--active\" onClick={onSelect} type=\"button\">{content}</button>\n ) : (\n <div className=\"a24-tool-trigger a24-tool-trigger--root a24-tool-trigger--active\">{content}</div>\n )}\n </div>\n );\n}\n\nexport function AgentChatModelTurnRow({ part }: { part: ChatModelTurnPart }) {\n return <AgentChatActivityRow label=\"Planning next moves\" modelTurnId={part.modelTurnId} />;\n}\n\nexport function AgentChatNodeActivityRow({\n onSelect,\n part,\n}: {\n onSelect?: (part: ChatNodeActivityPart) => void;\n part: ChatNodeActivityPart;\n}) {\n const [open, setOpen] = React.useState(false);\n const contentId = React.useId();\n const running = part.status === \"running\";\n const failed = part.status === \"failed\";\n const failureMessage = part.failure?.message || \"The node could not complete the request.\";\n const triggerClassName = cn(\n \"a24-tool-trigger\",\n \"a24-tool-trigger--root\",\n !running && \"a24-tool-trigger--without-orb\",\n running && \"a24-tool-trigger--active\",\n failed && \"a24-tool-trigger--error\",\n );\n const label = running\n ? <span className=\"a24-tool-shimmer\"><ToolActivityReel label={part.label} /></span>\n : part.label;\n if (!failed) {\n return (\n <div className=\"a24-tool-trigger-row\" role=\"status\">\n {onSelect ? (\n <button className={triggerClassName} onClick={() => onSelect(part)} type=\"button\">\n {running ? <ToolActivityOrb label={part.label} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </button>\n ) : (\n <div className={triggerClassName}>\n {running ? <ToolActivityOrb label={part.label} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </div>\n )}\n </div>\n );\n }\n return (\n <div className=\"a24-tool-disclosure\">\n <div className=\"a24-tool-trigger-row\">\n <button\n aria-controls={contentId}\n aria-expanded={open}\n className={triggerClassName}\n onClick={() => {\n onSelect?.(part);\n setOpen((value) => !value);\n }}\n type=\"button\"\n >\n <span className=\"a24-tool-trigger__label\">{label}</span>\n {open ? <ChevronDown aria-hidden=\"true\" className=\"a24-tool-trigger__chevron\" /> : <ChevronRight aria-hidden=\"true\" className=\"a24-tool-trigger__chevron\" />}\n </button>\n </div>\n {open ? <div className=\"a24-tool-detail a24-tool-detail--error\" id={contentId}>{failureMessage}</div> : null}\n </div>\n );\n}\n\nfunction toolRowLabel(part: ChatToolPart): string {\n const label = agentChatToolLabel(part);\n return isAgentChatToolRunning(part) ? label : label.replace(/^(?:running|ran)\\s+/i, \"\");\n}\n\nfunction ToolDisclosure({\n children,\n error,\n grouped,\n label,\n loading,\n onExpandedChange,\n onSelect,\n part,\n root,\n showOrb,\n statusLabel,\n accessory,\n}: {\n accessory?: React.ReactNode;\n children?: React.ReactNode;\n error?: boolean;\n grouped?: boolean;\n label: React.ReactNode;\n loading?: boolean;\n onExpandedChange?: AgentChatToolSlots[\"onExpandedChange\"];\n onSelect?: AgentChatToolSlots[\"onToolSelect\"];\n part?: ChatToolPart;\n root?: boolean;\n showOrb?: boolean;\n statusLabel?: string;\n}) {\n const [open, setOpen] = React.useState(false);\n const contentId = React.useId();\n const expandable = React.Children.toArray(children).length > 0;\n const textOnlyRoot = Boolean(root && !grouped && !showOrb);\n if (!expandable) {\n const triggerClassName = cn(\"a24-tool-trigger\", root && \"a24-tool-trigger--root\", root && !showOrb && \"a24-tool-trigger--without-orb\", error && \"a24-tool-trigger--error\", loading && \"a24-tool-trigger--active\");\n return (\n <div className={cn(\"a24-tool-trigger-row\", textOnlyRoot && \"a24-tool-trigger-row--text\")}>\n {onSelect && part ? (\n <button className={triggerClassName} onClick={() => onSelect(part)} type=\"button\">\n {showOrb ? <ToolActivityOrb label={statusLabel} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </button>\n ) : (\n <div className={triggerClassName}>\n {showOrb ? <ToolActivityOrb label={statusLabel} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </div>\n )}\n {accessory}\n </div>\n );\n }\n return (\n <div className=\"a24-tool-disclosure\">\n <div className={cn(\"a24-tool-trigger-row\", textOnlyRoot && \"a24-tool-trigger-row--text\")}>\n <button\n aria-controls={contentId}\n aria-expanded={open}\n className={cn(\"a24-tool-trigger\", root && \"a24-tool-trigger--root\", root && !showOrb && \"a24-tool-trigger--without-orb\", error && \"a24-tool-trigger--error\", loading && \"a24-tool-trigger--active\")}\n onClick={() => {\n const nextOpen = !open;\n setOpen(nextOpen);\n if (part) onSelect?.(part);\n onExpandedChange?.(nextOpen, part);\n }}\n type=\"button\"\n >\n {showOrb ? <ToolActivityOrb label={statusLabel} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n {open ? <ChevronDown aria-hidden=\"true\" className=\"a24-tool-trigger__chevron\" /> : <ChevronRight aria-hidden=\"true\" className=\"a24-tool-trigger__chevron\" />}\n </button>\n {accessory}\n </div>\n {open ? <div className=\"a24-tool-disclosure__content\" id={contentId}>{children}</div> : null}\n </div>\n );\n}\n\nfunction ToolLabel({ active, label, part, slots }: { active: boolean; label: string; part: ChatToolPart; slots?: AgentChatToolSlots }) {\n const rendered = slots?.renderToolLabel?.({ isActive: active, label, part }) ?? label;\n return active ? <span className=\"a24-tool-shimmer\">{rendered}</span> : <>{rendered}</>;\n}\n\nfunction ToolList({ children }: { children: React.ReactNode }) {\n const listRef = React.useRef<HTMLDivElement>(null);\n const [fades, setFades] = React.useState({ bottom: false, top: false });\n const updateFades = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return;\n const next = {\n bottom: list.scrollTop + list.clientHeight < list.scrollHeight - 1,\n top: list.scrollTop > 1,\n };\n setFades((current) => current.bottom === next.bottom && current.top === next.top ? current : next);\n }, []);\n\n React.useEffect(() => {\n updateFades();\n const list = listRef.current;\n if (!list || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(updateFades);\n observer.observe(list);\n return () => observer.disconnect();\n }, [children, updateFades]);\n\n return (\n <div\n className=\"a24-tool-list-frame\"\n data-scroll-fade-bottom={fades.bottom ? \"\" : undefined}\n data-scroll-fade-top={fades.top ? \"\" : undefined}\n >\n <div className=\"a24-tool-list\" onScroll={updateFades} ref={listRef} role=\"list\">\n {children}\n </div>\n </div>\n );\n}\n\nexport function AgentChatToolRow({\n activeToolId,\n part,\n root = true,\n showOrb,\n slots,\n}: {\n activeToolId?: string | null;\n part: ChatToolPart;\n root?: boolean;\n showOrb?: boolean;\n slots?: AgentChatToolSlots;\n}) {\n const active = isActive(part, activeToolId);\n const failed = part.state === \"output-error\";\n const failureMessage = part.failure?.message || null;\n const detail = failed ? failureMessage : optionalText(part.presentation.detail);\n const hostDetails = failed ? null : slots?.renderToolDetails?.(part);\n const context = { isActive: active, label: toolRowLabel(part), part };\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <ToolDisclosure\n error={failed}\n accessory={slots?.renderToolAccessory?.(context)}\n label={<ToolLabel active={active} label={context.label} part={part} slots={slots} />}\n loading={active}\n onExpandedChange={slots?.onExpandedChange}\n onSelect={slots?.onToolSelect}\n part={part}\n root={root}\n showOrb={showOrb ?? active}\n statusLabel={active ? context.label : undefined}\n >\n {detail ? <div className={cn(\"a24-tool-detail\", failed && \"a24-tool-detail--error\")}>{detail}</div> : null}\n {hostDetails}\n </ToolDisclosure>\n </div>\n );\n}\n\nfunction sessionLabel(parts: readonly ChatToolPart[], visiblePart: ChatToolPart, running: boolean): string {\n const label = agentChatToolLabel(visiblePart);\n const terminalLabel = label.replace(/^(?:running|ran)\\s+/i, \"\");\n return running ? label : `Ran ${terminalLabel} + ${parts.length - 1} more`;\n}\n\nexport function AgentChatToolSession({\n activeToolId,\n isLatestActivity = true,\n isLive = false,\n leadingModelTurn,\n modelTurn,\n parts,\n slots,\n}: {\n activeToolId?: string | null;\n isLatestActivity?: boolean;\n isLive?: boolean;\n leadingModelTurn?: ChatModelTurnPart;\n modelTurn?: ChatModelTurnPart;\n parts: readonly ChatToolPart[];\n slots?: AgentChatToolSlots;\n}) {\n const presentedLiveRef = React.useRef(false);\n if (isLive && isLatestActivity) presentedLiveRef.current = true;\n const activeIndex = parts.findLastIndex((part) => isActive(part, activeToolId));\n const running = activeIndex >= 0;\n if (parts.length === 1 && !modelTurn && !leadingModelTurn) return <AgentChatToolRow activeToolId={activeToolId} part={parts[0]} slots={slots} />;\n const visibleIndex = running ? activeIndex : parts.length - 1;\n const visiblePart = parts[visibleIndex];\n const planning = Boolean(modelTurn);\n const presentingActivity = isLatestActivity && (planning || running || isLive);\n const failed = isLatestActivity\n && (visiblePart.state === \"output-error\" || visiblePart.state === \"cancelled\");\n const label = planning\n ? \"Planning next moves\"\n : isLive && isLatestActivity\n ? agentChatToolLabel(visiblePart)\n : sessionLabel(parts, visiblePart, running);\n const labelContent = presentedLiveRef.current\n ? <span className={presentingActivity ? \"a24-tool-shimmer\" : undefined}><ToolActivityReel initialLabel={leadingModelTurn ? \"Planning next moves\" : undefined} initialShownAt={leadingModelTurn?.timestamp} label={label} /></span>\n : label;\n const context = { isActive: presentingActivity, label, part: visiblePart };\n return (\n <ToolDisclosure\n accessory={slots?.renderToolAccessory?.(context)}\n error={failed}\n grouped\n label={labelContent}\n loading={presentingActivity}\n onExpandedChange={slots?.onExpandedChange}\n part={visiblePart}\n root\n showOrb={isLive && isLatestActivity}\n statusLabel={planning ? \"Planning next moves\" : label}\n >\n <ToolList>\n {parts.map((part) => <div key={part.id} role=\"listitem\"><AgentChatToolRow activeToolId={activeToolId} part={part} root={false} showOrb={false} slots={slots} /></div>)}\n </ToolList>\n </ToolDisclosure>\n );\n}\n\nfunction childLabel(child: ChatToolChild): string {\n return optionalText(child.title) || optionalText(child.toolName) || \"Tool\";\n}\n\nfunction subagentLabel(part: ChatToolPart): { label: string; running: boolean } {\n const childRun = part.presentation.childRun;\n const children = part.presentation.childTools || [];\n const name = optionalText(childRun?.agentName) || optionalText(part.displayName) || \"agent\";\n const status = String(childRun?.status || (isAgentChatToolRunning(part) ? \"running\" : \"completed\")).toLowerCase();\n const activeChild = children.find((child) => child.id === part.presentation.activeChildToolId)\n || [...children].reverse().find((child) => child.status === \"running\")\n || children[children.length - 1];\n if (status === \"running\" && activeChild) return { label: `Agent ${name}, running ${childLabel(activeChild)}`, running: true };\n if (status === \"running\") return { label: `Agent ${name}, starting`, running: true };\n if (status === \"failed\" || part.state === \"output-error\") return { label: `Agent ${name}, failed`, running: false };\n if (status === \"cancelled\" || status === \"canceled\" || part.state === \"cancelled\") return { label: `Agent ${name}, cancelled`, running: false };\n if (status === \"paused\") return { label: `Agent ${name}, paused`, running: false };\n return { label: `Agent ${name}, ran ${children.length} ${children.length === 1 ? \"tool\" : \"tools\"}`, running: false };\n}\n\nexport function AgentChatSubagentGroup({ isLatestActivity = true, isLive = false, part, slots }: { isLatestActivity?: boolean; isLive?: boolean; part: ChatToolPart; slots?: AgentChatToolSlots }) {\n const presentedLiveRef = React.useRef(false);\n if (isLive && isLatestActivity) presentedLiveRef.current = true;\n const children = part.presentation.childTools || [];\n const state = subagentLabel(part);\n const childRunStatus = String(part.presentation.childRun?.status || \"\").toLowerCase();\n const failed = part.state === \"output-error\"\n || part.state === \"cancelled\"\n || childRunStatus === \"failed\"\n || childRunStatus === \"cancelled\"\n || childRunStatus === \"canceled\";\n const hostDetails = failed ? null : slots?.renderToolDetails?.(part);\n const failureMessage = part.failure?.message || null;\n const presentingActivity = isLatestActivity && state.running;\n const labelContent = presentedLiveRef.current\n ? <span className={presentingActivity ? \"a24-tool-shimmer\" : undefined}><ToolActivityReel label={state.label} /></span>\n : state.label;\n const context = { isActive: presentingActivity, label: state.label, part };\n return (\n <ToolDisclosure\n accessory={slots?.renderToolAccessory?.(context)}\n error={failed}\n grouped\n label={labelContent}\n loading={presentingActivity}\n onExpandedChange={slots?.onExpandedChange}\n part={part}\n root\n showOrb={isLive && isLatestActivity}\n statusLabel={state.label}\n >\n <ToolList>\n {children.map((child) => (\n <div className={cn(\"a24-child-tool\", child.status === \"failed\" && \"a24-child-tool--error\")} key={child.id} role=\"listitem\">\n {slots?.renderChildTool?.(child, part) ?? (\n <>\n <span className={cn(isLive && isLatestActivity && child.status === \"running\" && \"a24-tool-shimmer\")}>{childLabel(child)}</span>\n {child.detail ? <span className=\"a24-child-tool__detail\">{child.detail}</span> : null}\n </>\n )}\n </div>\n ))}\n {failureMessage ? <div className=\"a24-tool-detail a24-tool-detail--error\">{failureMessage}</div> : null}\n {hostDetails}\n </ToolList>\n </ToolDisclosure>\n );\n}\n","import type { ContextWindow } from \"@agents24/client/protocol\";\nimport * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nconst COMPACT_TOKENS = new Intl.NumberFormat(\"en-US\", { notation: \"compact\" });\nconst PERCENT = new Intl.NumberFormat(\"en-US\", {\n style: \"percent\",\n maximumFractionDigits: 1,\n});\nconst EXACT_SOURCES = new Set([\"exact\", \"provider_usage\"]);\n\nexport type AgentChatContextStatusProps = {\n className?: string;\n contextWindow?: ContextWindow | null;\n};\n\nexport function contextStatusMetrics(contextWindow?: ContextWindow | null) {\n const maximum = Number(contextWindow?.max_tokens || 0);\n const input = Math.max(0, Number(contextWindow?.input_tokens || 0));\n const admissionInput = Math.max(0, Number(contextWindow?.admission_input_tokens ?? input));\n const usageRatio = Math.max(0, Math.min(1, Number(\n contextWindow?.usage_ratio ?? (input / maximum),\n )));\n const admissionRatio = Math.max(0, Math.min(1, Number(\n contextWindow?.admission_ratio ?? (admissionInput / maximum),\n )));\n return { maximum, input, admissionInput, usageRatio, admissionRatio };\n}\n\nexport function AgentChatContextStatus({\n className,\n contextWindow,\n}: AgentChatContextStatusProps) {\n const tooltipId = React.useId();\n const [open, setOpen] = React.useState(false);\n const { maximum, input, admissionInput, usageRatio, admissionRatio } = contextStatusMetrics(contextWindow);\n const percentage = Math.round(usageRatio * 100);\n const exact = EXACT_SOURCES.has(contextWindow?.source || \"unknown\");\n\n if (!Number.isFinite(maximum) || maximum <= 0) return null;\n\n return (\n <div\n className={cn(\"a24-context-status\", className)}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOpen(false);\n }}\n onFocusCapture={() => setOpen(true)}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button\n aria-describedby={open ? tooltipId : undefined}\n aria-label={`Context window ${percentage}% used`}\n className=\"a24-context-status__trigger\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\") setOpen(false);\n }}\n type=\"button\"\n >\n <svg aria-hidden=\"true\" className=\"a24-context-status__ring\" viewBox=\"0 0 24 24\">\n <circle className=\"a24-context-status__track\" cx=\"12\" cy=\"12\" r=\"10\" />\n <circle\n className=\"a24-context-status__value\"\n cx=\"12\"\n cy=\"12\"\n pathLength=\"100\"\n r=\"10\"\n strokeDasharray={`${percentage} 100`}\n />\n </svg>\n <span>{percentage}%</span>\n </button>\n {open ? (\n <div className=\"a24-context-status__popover\" id={tooltipId} role=\"tooltip\">\n <span className=\"a24-context-status__sr-only\">Context window</span>\n <strong>{PERCENT.format(usageRatio)} context used</strong>\n <span>\n {exact ? \"Input\" : \"Estimated input\"}: {COMPACT_TOKENS.format(input)} / {COMPACT_TOKENS.format(maximum)} tokens\n </span>\n {admissionInput !== input ? (\n <span>\n Safety bound: {COMPACT_TOKENS.format(admissionInput)} tokens ({PERCENT.format(admissionRatio)})\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { cn } from \"./utils\";\n\nfunction BubbleGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bubble-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n );\n}\n\nconst bubbleVariants = cva(\n \"group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full\",\n {\n variants: {\n variant: {\n default:\n \"*:data-[slot=bubble-content]:bg-neutral-900 *:data-[slot=bubble-content]:text-white [&>[data-slot=bubble-content]:is(button,a):hover]:bg-neutral-800\",\n secondary:\n \"*:data-[slot=bubble-content]:bg-muted *:data-[slot=bubble-content]:text-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted\",\n muted:\n \"*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]\",\n tinted:\n \"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-muted *:data-[slot=bubble-content]:text-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted\",\n outline:\n \"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30\",\n ghost:\n \"border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50\",\n destructive:\n \"*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nfunction Bubble({\n variant = \"default\",\n align = \"start\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof bubbleVariants> & {\n align?: \"start\" | \"end\";\n }) {\n return (\n <div\n data-slot=\"bubble\"\n data-variant={variant}\n data-align={align}\n className={cn(bubbleVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction BubbleContent({\n asChild = false,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"bubble-content\"\n className={cn(\n \"w-fit max-w-full min-w-0 overflow-hidden rounded-xl border border-transparent px-3 py-2 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-neutral-300 [button,a]:focus-visible:ring-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nconst bubbleReactionsVariants = cva(\n \"absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0\",\n {\n variants: {\n side: {\n top: \"top-0 -translate-y-3/4\",\n bottom: \"bottom-0 translate-y-3/4\",\n },\n align: {\n start: \"left-3\",\n end: \"right-3\",\n },\n },\n defaultVariants: {\n side: \"bottom\",\n align: \"end\",\n },\n }\n);\n\nfunction BubbleReactions({\n side = \"bottom\",\n align = \"end\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n align?: \"start\" | \"end\";\n side?: \"top\" | \"bottom\";\n}) {\n return (\n <div\n data-slot=\"bubble-reactions\"\n data-align={align}\n data-side={side}\n className={cn(bubbleReactionsVariants({ side, align }), className)}\n {...props}\n />\n );\n}\n\nexport { BubbleGroup, Bubble, BubbleContent, BubbleReactions, bubbleVariants };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { cn } from \"./utils\";\n\nconst markerVariants = cva(\n \"group/marker relative flex min-h-4 w-full items-center gap-2 text-left text-sm text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [a]:underline [a]:underline-offset-3 [a]:hover:text-foreground\",\n {\n variants: {\n variant: {\n default: \"\",\n separator:\n \"before:mr-1 before:h-px before:min-w-0 before:flex-1 before:bg-border after:ml-1 after:h-px after:min-w-0 after:flex-1 after:bg-border\",\n border: \"border-b border-border pb-2\",\n },\n },\n }\n);\n\nfunction Marker({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof markerVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"marker\"\n data-variant={variant}\n className={cn(markerVariants({ variant, className }))}\n {...props}\n />\n );\n}\n\nfunction MarkerIcon({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"marker-icon\"\n aria-hidden=\"true\"\n className={cn(\n \"size-4 shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MarkerContent({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"marker-content\"\n className={cn(\n \"min-w-0 wrap-break-word group-data-[variant=separator]/marker:flex-none group-data-[variant=separator]/marker:text-center *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Marker, MarkerIcon, MarkerContent, markerVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nexport type McpConnectRequiredStatus =\n | \"pending\"\n | \"connecting\"\n | \"connected\"\n | \"resuming\"\n | \"error\";\n\nexport type McpConnectRequiredCardProps = React.ComponentProps<\"div\"> & {\n serverName?: string | null;\n providerKey?: string | null;\n message?: string | null;\n status?: McpConnectRequiredStatus;\n disabled?: boolean;\n loading?: boolean;\n error?: string | null;\n onConnect?: () => void;\n};\n\nconst STATUS_LABELS: Record<McpConnectRequiredStatus, string> = {\n pending: \"Connect\",\n connecting: \"Connecting\",\n connected: \"Connected\",\n resuming: \"Resuming\",\n error: \"Try again\",\n};\n\nexport function McpConnectRequiredCard({\n serverName,\n providerKey,\n message,\n status = \"pending\",\n disabled = false,\n loading = false,\n error,\n onConnect,\n className,\n ...props\n}: McpConnectRequiredCardProps) {\n const label = String(serverName || providerKey || \"MCP server\").trim();\n const isBusy = loading || status === \"connecting\" || status === \"resuming\";\n const isConnected = status === \"connected\";\n const buttonDisabled = disabled || isBusy || isConnected || !onConnect;\n\n return (\n <div\n data-agents24-mcp-connect-card\n data-status={status}\n className={cn(\n \"w-full rounded-lg border border-border/50 bg-muted/25 p-3 text-sm text-foreground\",\n className\n )}\n {...props}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{label}</div>\n <div className=\"mt-1 text-sm text-muted-foreground\">\n {message || \"Connect your account to continue.\"}\n </div>\n {status === \"error\" && error ? (\n <div className=\"mt-2 text-sm text-destructive\">{error}</div>\n ) : null}\n </div>\n <button\n type=\"button\"\n className={cn(\n \"shrink-0 rounded-md border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-60\",\n status === \"pending\" || status === \"error\"\n ? \"border-neutral-900 bg-neutral-900 text-white hover:bg-neutral-800\"\n : \"border-border bg-background text-foreground hover:bg-muted\"\n )}\n disabled={buttonDisabled}\n onClick={onConnect}\n >\n {STATUS_LABELS[status]}\n </button>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nconst RECORDING_CANDIDATES = [\"audio/webm;codecs=opus\", \"audio/webm\", \"audio/mp4\"];\n\nfunction recordingExtension(mimeType: string): string {\n return mimeType.startsWith(\"audio/mp4\") ? \"m4a\" : \"webm\";\n}\n\nexport function useAudioRecorder(\n onRecorded: (file: File) => void,\n options: { onStreamChange?: (stream: MediaStream | null) => void } = {},\n) {\n const recorderRef = React.useRef<MediaRecorder | null>(null);\n const streamRef = React.useRef<MediaStream | null>(null);\n const onRecordedRef = React.useRef(onRecorded);\n const onStreamChangeRef = React.useRef(options.onStreamChange);\n onRecordedRef.current = onRecorded;\n onStreamChangeRef.current = options.onStreamChange;\n const [isRecording, setIsRecording] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const stop = React.useCallback(() => recorderRef.current?.stop(), []);\n const start = React.useCallback(async () => {\n setError(null);\n if (!navigator.mediaDevices?.getUserMedia || typeof MediaRecorder === \"undefined\") {\n setError(\"Audio recording is not supported in this browser.\");\n return;\n }\n try {\n const mimeType = RECORDING_CANDIDATES.find((candidate) => MediaRecorder.isTypeSupported(candidate));\n if (!mimeType) {\n setError(\"Audio recording is not supported in this browser.\");\n return;\n }\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n onStreamChangeRef.current?.(stream);\n const recorder = new MediaRecorder(stream, { mimeType });\n const chunks: BlobPart[] = [];\n recorder.ondataavailable = (event) => { if (event.data.size) chunks.push(event.data); };\n recorder.onstop = () => {\n const actualType = recorder.mimeType || \"audio/webm\";\n onRecordedRef.current(new File([new Blob(chunks, { type: actualType })], `recording-${Date.now()}.${recordingExtension(actualType)}`, { type: actualType }));\n stream.getTracks().forEach((track) => track.stop());\n onStreamChangeRef.current?.(null);\n recorderRef.current = null;\n streamRef.current = null;\n setIsRecording(false);\n };\n recorderRef.current = recorder;\n streamRef.current = stream;\n recorder.start();\n setIsRecording(true);\n } catch {\n streamRef.current?.getTracks().forEach((track) => track.stop());\n onStreamChangeRef.current?.(null);\n setError(\"Microphone access is unavailable.\");\n }\n }, []);\n\n React.useEffect(() => () => {\n recorderRef.current?.stop();\n streamRef.current?.getTracks().forEach((track) => track.stop());\n onStreamChangeRef.current?.(null);\n }, []);\n\n return { error, isRecording, start, stop };\n}\n"],"mappings":"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","names":["React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","React","import_lucide_react","React","reduceMotion","React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","candidate","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","import_react_slot","import_jsx_runtime","import_class_variance_authority","import_react_slot","import_jsx_runtime","import_jsx_runtime","React"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/index.ts","../../src/ui/agent-chat-composer.tsx","../../src/ui/adapters.ts","../../src/ui/attachment.tsx","../../src/ui/utils.ts","../../src/ui/message.tsx","../../src/ui/composer-attachments.ts","../../src/ui/agent-chat-actions.tsx","../../src/ui/agent-chat-message.tsx","../../src/ui/agent-response-timeline.tsx","../../src/streaming-text.ts","../../src/ui/ask-user-interaction.tsx","../../src/ui/ask-user-interaction-state.ts","../../src/ui/agent-chat-context-compression-row.tsx","../../src/ui/message-response.tsx","../../src/active-content.ts","../../src/ui/hitl-presentation.ts","../../src/ui/tool-sessions.tsx","../../src/ui/agent-chat-context-status.tsx","../../src/ui/bubble.tsx","../../src/ui/marker.tsx","../../src/ui/mcp-connect-required-card.tsx","../../src/ui/use-audio-recorder.ts"],"sourcesContent":["export * from \"./agent-chat-composer\";\nexport * from \"./composer-attachments\";\nexport * from \"./agent-chat-actions\";\nexport * from \"./agent-chat-message\";\nexport * from \"./agent-chat-context-status\";\nexport * from \"./agent-chat-context-compression-row\";\nexport * from \"./agent-response-timeline\";\nexport * from \"./tool-sessions\";\nexport * from \"./ask-user-interaction\";\nexport * from \"./hitl-presentation\";\nexport * from \"./adapters\";\nexport * from \"./attachment\";\nexport * from \"./bubble\";\nexport * from \"./marker\";\nexport * from \"./mcp-connect-required-card\";\nexport {\n Message as ShadcnMessage,\n MessageAvatar,\n MessageContent as ShadcnMessageContent,\n MessageFooter,\n MessageGroup,\n MessageHeader,\n} from \"./message\";\nexport * from \"./message-response\";\nexport * from \"./utils\";\nexport * from \"./use-audio-recorder\";\n","import * as React from \"react\";\nimport { ArrowUp, Plus, Square } from \"lucide-react\";\n\nimport { ChatAttachmentRows } from \"./adapters\";\nimport {\n createAgentChatComposerFile,\n revokeAgentChatComposerFiles,\n type AgentChatComposerFile,\n} from \"./composer-attachments\";\nimport { cn } from \"./utils\";\n\nexport type { AgentChatComposerFile } from \"./composer-attachments\";\n\nexport type AgentChatComposerSubmit = {\n text: string;\n files: AgentChatComposerFile[];\n};\n\nexport type AgentChatComposerProps = {\n accept?: string;\n allowAttachments?: boolean;\n attachmentLayout?: \"flow\" | \"overlay\";\n className?: string;\n disabled?: boolean;\n forceExpanded?: boolean;\n inputToolbarContent?: React.ReactNode;\n isRunning?: boolean;\n onAttachmentCountChange?: (count: number) => void;\n onStop?: () => void;\n onSubmit: (message: AgentChatComposerSubmit) => Promise<void> | void;\n placeholder?: string;\n textareaRef?: React.Ref<HTMLTextAreaElement>;\n};\n\nfunction formatFileCount(files: AgentChatComposerFile[]) {\n if (files.length === 1) return files[0].filename;\n return `${files.length} files`;\n}\n\nconst pillButtonClass =\n \"inline-flex size-8 shrink-0 items-center justify-center gap-2 rounded-lg border-0 bg-muted text-sm text-muted-foreground shadow-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\";\n\nconst submitButtonClass =\n \"inline-flex size-9 shrink-0 items-center justify-center gap-2 rounded-lg border-0 bg-primary text-sm text-primary-foreground shadow-none transition-[background-color,color,opacity,transform] duration-200 hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\";\n\nexport function AgentChatComposer({\n accept,\n allowAttachments = true,\n attachmentLayout = \"flow\",\n className,\n disabled = false,\n forceExpanded = false,\n inputToolbarContent,\n isRunning = false,\n onAttachmentCountChange,\n onStop,\n onSubmit,\n placeholder = \"Message the agent\",\n textareaRef,\n}: AgentChatComposerProps) {\n const fileInputRef = React.useRef<HTMLInputElement | null>(null);\n const filesRef = React.useRef<AgentChatComposerFile[]>([]);\n const inFlightFilesRef = React.useRef<AgentChatComposerFile[]>([]);\n const localTextareaRef = React.useRef<HTMLTextAreaElement | null>(null);\n const draftRevisionRef = React.useRef(0);\n const [text, setText] = React.useState(\"\");\n const [files, setFiles] = React.useState<AgentChatComposerFile[]>([]);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const isExpanded = forceExpanded || text.includes(\"\\n\") || text.length > 62;\n\n const setTextareaRef = React.useCallback(\n (node: HTMLTextAreaElement | null) => {\n localTextareaRef.current = node;\n if (typeof textareaRef === \"function\") {\n textareaRef(node);\n } else if (textareaRef) {\n (textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n }\n },\n [textareaRef]\n );\n\n React.useEffect(() => {\n filesRef.current = files;\n onAttachmentCountChange?.(files.length);\n }, [files, onAttachmentCountChange]);\n\n React.useEffect(() => () => {\n revokeAgentChatComposerFiles(filesRef.current);\n revokeAgentChatComposerFiles(inFlightFilesRef.current);\n }, []);\n\n React.useLayoutEffect(() => {\n const textarea = localTextareaRef.current;\n if (!textarea) return;\n if (isExpanded) {\n textarea.style.height = \"auto\";\n const scrollHeight = textarea.scrollHeight;\n textarea.style.height = `${Math.min(scrollHeight, 224)}px`;\n textarea.style.overflowY = scrollHeight >= 224 ? \"auto\" : \"hidden\";\n return;\n }\n textarea.style.height = \"\";\n textarea.style.overflowY = \"hidden\";\n }, [isExpanded, text]);\n\n const canSubmit =\n !disabled &&\n !isSubmitting &&\n !isRunning &&\n (text.trim().length > 0 || files.length > 0);\n\n const handleFilesChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const selected = Array.from(event.target.files || []).map(createAgentChatComposerFile);\n if (selected.length > 0) {\n draftRevisionRef.current += 1;\n setFiles((current) => [...current, ...selected]);\n }\n event.currentTarget.value = \"\";\n };\n\n const removeFile = (fileId: string) => {\n draftRevisionRef.current += 1;\n setFiles((current) => {\n const target = current.find((file) => file.id === fileId);\n if (target) revokeAgentChatComposerFiles([target]);\n return current.filter((file) => file.id !== fileId);\n });\n };\n\n const submit = async () => {\n if (!canSubmit) return;\n const submittedText = text.trim();\n const submittedFiles = files;\n const clearedRevision = draftRevisionRef.current + 1;\n draftRevisionRef.current = clearedRevision;\n inFlightFilesRef.current = submittedFiles;\n setIsSubmitting(true);\n setText(\"\");\n setFiles([]);\n try {\n await onSubmit({ text: submittedText, files: submittedFiles });\n revokeAgentChatComposerFiles(submittedFiles);\n inFlightFilesRef.current = [];\n } catch {\n if (draftRevisionRef.current === clearedRevision) {\n draftRevisionRef.current += 1;\n setText(submittedText);\n setFiles(submittedFiles);\n inFlightFilesRef.current = [];\n } else {\n revokeAgentChatComposerFiles(submittedFiles);\n inFlightFilesRef.current = [];\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n void submit();\n }\n };\n\n return (\n <div className={cn(\"a24-composer relative mx-auto w-full max-w-3xl overflow-visible\", className)} data-agents24-chat-composer=\"\">\n {files.length > 0 ? (\n <div\n data-testid=\"agent-chat-composer-attachments\"\n data-layout={attachmentLayout}\n className={cn(\n \"a24-composer__attachments min-w-0 py-1\",\n attachmentLayout === \"overlay\"\n ? \"absolute bottom-full left-0 right-0 mb-1.5 flex-nowrap overflow-x-auto overflow-y-hidden overscroll-x-contain px-2\"\n : \"mb-2 flex-wrap px-1\"\n )}\n >\n <ChatAttachmentRows\n attachments={files}\n onRemove={(attachment) => attachment.id && removeFile(attachment.id)}\n />\n </div>\n ) : null}\n\n <div\n data-expanded={isExpanded ? \"\" : undefined}\n className={cn(\n \"a24-composer__surface relative w-full border border-input bg-background shadow-sm\",\n isExpanded ? \"rounded-xl p-2 pb-1.5\" : \"rounded-xl px-2 py-[3px]\"\n )}\n >\n <div\n className=\"a24-composer__grid w-full\"\n style={{\n alignItems: \"center\",\n display: \"grid\",\n gridTemplateAreas: isExpanded\n ? `\"textarea textarea textarea\" \"plus toolbar submit\"`\n : `\"plus textarea composer mic submit\"`,\n gridTemplateColumns: isExpanded ? \"auto 1fr auto\" : \"auto 1fr auto auto auto\",\n gap: isExpanded ? \"3px 10px\" : \"8px\",\n }}\n >\n <div style={{ gridArea: \"plus\" }} className=\"a24-composer__attach-slot flex shrink-0 items-center justify-center\">\n <input\n ref={fileInputRef}\n accept={accept}\n aria-label=\"Attach files\"\n className=\"hidden\"\n multiple\n name=\"attachments\"\n onChange={handleFilesChange}\n type=\"file\"\n />\n <button\n aria-label=\"Attach files\"\n className={cn(\"a24-composer__attach\", pillButtonClass)}\n disabled={disabled || isSubmitting || isRunning || !allowAttachments}\n onClick={() => fileInputRef.current?.click()}\n title=\"Attach files\"\n type=\"button\"\n >\n <Plus className=\"size-4\" />\n </button>\n </div>\n\n <div style={{ gridArea: \"textarea\" }} className=\"a24-composer__textarea-slot min-w-0 w-full\">\n <textarea\n ref={setTextareaRef}\n aria-label=\"Message\"\n autoComplete=\"off\"\n className={cn(\n \"a24-composer__textarea w-full resize-none border-0 bg-transparent px-1 text-[15px] leading-relaxed text-foreground shadow-none outline-none placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-0\",\n isExpanded ? \"min-h-9 max-h-[224px] py-1\" : \"min-h-9 h-9 max-h-9 py-2\"\n )}\n disabled={disabled || isSubmitting || isRunning}\n name=\"message\"\n onChange={(event) => {\n draftRevisionRef.current += 1;\n setText(event.target.value);\n }}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={isExpanded ? 2 : 1}\n value={text}\n />\n </div>\n\n {isExpanded ? (\n <div style={{ gridArea: \"toolbar\" }} className=\"a24-composer__toolbar flex min-w-0 items-center gap-1.5\">\n {inputToolbarContent}\n </div>\n ) : null}\n\n {!isExpanded ? (\n <div style={{ gridArea: \"composer\" }} className=\"flex min-w-0 items-center gap-1.5\" />\n ) : null}\n\n {!isExpanded ? (\n <div style={{ gridArea: \"mic\" }} className=\"flex shrink-0 items-center justify-end\" />\n ) : null}\n\n <div style={{ gridArea: \"submit\" }} className=\"a24-composer__submit-slot flex shrink-0 items-center justify-end\">\n {isRunning ? (\n <button\n aria-label=\"Stop generating\"\n className={cn(\"a24-composer__submit\", submitButtonClass)}\n disabled={disabled || !onStop}\n onClick={onStop}\n title=\"Stop\"\n type=\"button\"\n >\n <Square className=\"size-3.5 fill-current\" />\n </button>\n ) : (\n <button\n aria-label={files.length > 0 ? `Send ${formatFileCount(files)}` : \"Send message\"}\n className={cn(\"a24-composer__submit\", submitButtonClass, text.trim().length > 0 && \"hover:scale-105\")}\n disabled={!canSubmit}\n onClick={() => void submit()}\n title=\"Send\"\n type=\"button\"\n >\n <ArrowUp className=\"size-4\" strokeWidth={2.5} />\n </button>\n )}\n </div>\n </div>\n </div>\n\n {!isExpanded && inputToolbarContent ? (\n <div className=\"a24-composer__toolbar a24-composer__toolbar--external mt-2 flex items-center gap-2 px-1\">{inputToolbarContent}</div>\n ) : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { FileIcon } from \"@untitledui/file-icons\";\nimport {\n ImageOff,\n LoaderCircle,\n X,\n} from \"lucide-react\";\n\nimport type {\n ChatAttachment as Agents24ChatAttachment,\n ChatMessage as Agents24ChatMessage,\n} from \"../types\";\nimport {\n Attachment,\n AttachmentContent,\n AttachmentGroup,\n AttachmentMedia,\n AttachmentTitle,\n} from \"./attachment\";\nimport { Message } from \"./message\";\nimport { cn } from \"./utils\";\n\nexport type ChatMessageRole = Agents24ChatMessage[\"role\"] | \"system\" | \"data\";\nconst ChatMessageRoleContext = React.createContext<ChatMessageRole>(\"assistant\");\n\nexport type ChatMessageProps = Omit<\n React.ComponentProps<typeof Message>,\n \"align\"\n> & {\n from: ChatMessageRole;\n align?: \"start\" | \"end\";\n};\n\ntype ShadcnMessageProps = React.ComponentProps<\"div\"> & {\n align?: \"start\" | \"end\";\n};\n\nexport function ChatMessage(input: ChatMessageProps): React.ReactElement {\n const { className, from, align, ...props } = input;\n const isUser = from === \"user\";\n const resolvedAlign = align || \"start\";\n const messageProps: ShadcnMessageProps = Object.assign({}, props);\n messageProps.align = resolvedAlign;\n messageProps.className = cn(\n \"a24-chat-message group flex w-full flex-col\",\n isUser\n ? \"a24-chat-message--user is-user max-w-full justify-end gap-0\"\n : \"a24-chat-message--assistant is-assistant max-w-full gap-2\",\n className\n );\n return React.createElement(\n ChatMessageRoleContext.Provider,\n { value: from },\n React.createElement(Message, messageProps),\n );\n}\n\nexport type ChatMessageContentProps = React.ComponentProps<\"div\"> & {\n from?: ChatMessageRole;\n};\n\nexport function ChatMessageContent({\n className,\n from,\n ...props\n}: ChatMessageContentProps): React.ReactElement {\n const inheritedRole = React.useContext(ChatMessageRoleContext);\n const isUser = (from ?? inheritedRole) === \"user\";\n return React.createElement(\"div\", {\n className: cn(\n \"a24-chat-message-content flex max-w-full min-w-0 flex-col gap-2 text-sm\",\n isUser\n ? \"a24-chat-message-content--user is-user:dark w-fit overflow-visible rounded-lg bg-secondary px-4 py-3 text-foreground\"\n : \"a24-chat-message-content--assistant w-full overflow-visible text-foreground\",\n className\n ),\n \"data-slot\": \"bubble-content\",\n ...props,\n });\n}\n\nexport type ChatMessageActionsProps = React.ComponentProps<\"div\">;\n\nexport function ChatMessageActions({\n className,\n ...props\n}: ChatMessageActionsProps): React.ReactElement {\n return React.createElement(\"div\", {\n className: cn(\"flex items-center gap-1\", className),\n \"data-slot\": \"message-actions\",\n ...props,\n });\n}\n\nexport type ChatMessageActionProps = React.ComponentProps<\"button\"> & {\n label?: string;\n tooltip?: React.ReactNode;\n};\n\nexport function ChatMessageAction({\n children,\n className,\n label,\n tooltip,\n type = \"button\",\n ...props\n}: ChatMessageActionProps): React.ReactElement {\n const tooltipLabel = typeof tooltip === \"string\" ? tooltip : undefined;\n return React.createElement(\n \"button\",\n {\n \"aria-label\": label || tooltipLabel,\n className: cn(\n \"inline-flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\",\n className\n ),\n title: tooltipLabel,\n type,\n ...props,\n },\n children,\n React.createElement(\n \"span\",\n { className: \"sr-only\" },\n label || tooltipLabel\n )\n );\n}\n\nexport type ChatAttachmentData = Agents24ChatAttachment & {\n type?: string;\n name?: string;\n mediaType?: string;\n contentType?: string;\n};\n\nexport type ChatAttachmentProps = React.ComponentProps<typeof Attachment> & {\n data: ChatAttachmentData;\n onRemove?: () => void;\n resolveContent?: ChatAttachmentContentResolver;\n};\n\nexport type ChatAttachmentContentResult = {\n url: string;\n validUntil?: string | null;\n};\n\nexport type ChatAttachmentContentResolver = (\n attachment: ChatAttachmentData,\n signal: AbortSignal,\n) => Promise<ChatAttachmentContentResult>;\n\nconst resolvedContentCache = new WeakMap<\n ChatAttachmentContentResolver,\n Map<string, ChatAttachmentContentResult>\n>();\nconst CONTENT_CACHE_EXPIRY_BUFFER_MS = 15_000;\nconst CONTENT_CACHE_MAX_ENTRIES = 100;\n\nfunction attachmentCacheKey(data: ChatAttachmentData): string | null {\n const id = typeof data.id === \"string\" ? data.id.trim() : \"\";\n return id || null;\n}\n\nfunction cachedAttachmentContent(\n resolver: ChatAttachmentContentResolver,\n data: ChatAttachmentData,\n): ChatAttachmentContentResult | null {\n const key = attachmentCacheKey(data);\n if (!key) return null;\n const cached = resolvedContentCache.get(resolver)?.get(key);\n if (!cached) return null;\n if (!cached.validUntil) return cached;\n const validUntil = Date.parse(cached.validUntil);\n if (Number.isFinite(validUntil) && validUntil - CONTENT_CACHE_EXPIRY_BUFFER_MS > Date.now()) {\n return cached;\n }\n resolvedContentCache.get(resolver)?.delete(key);\n return null;\n}\n\nfunction cacheAttachmentContent(\n resolver: ChatAttachmentContentResolver,\n data: ChatAttachmentData,\n result: ChatAttachmentContentResult,\n) {\n const key = attachmentCacheKey(data);\n if (!key) return;\n const cache = resolvedContentCache.get(resolver) || new Map<string, ChatAttachmentContentResult>();\n cache.delete(key);\n cache.set(key, result);\n while (cache.size > CONTENT_CACHE_MAX_ENTRIES) {\n const oldestKey = cache.keys().next().value;\n if (typeof oldestKey !== \"string\") break;\n cache.delete(oldestKey);\n }\n resolvedContentCache.set(resolver, cache);\n}\n\nfunction invalidateAttachmentContent(\n resolver: ChatAttachmentContentResolver,\n data: ChatAttachmentData,\n) {\n const key = attachmentCacheKey(data);\n if (key) resolvedContentCache.get(resolver)?.delete(key);\n}\n\ntype ChatAttachmentKind =\n | \"archive\"\n | \"audio\"\n | \"code\"\n | \"document\"\n | \"file\"\n | \"image\"\n | \"pdf\"\n | \"presentation\"\n | \"spreadsheet\"\n | \"video\";\n\nfunction attachmentMediaType(data: ChatAttachmentData): string {\n return data.mediaType || data.contentType || String(data.type || \"application/octet-stream\");\n}\n\nfunction attachmentFilename(data: ChatAttachmentData): string {\n return data.filename || data.name || \"Attachment\";\n}\n\nfunction attachmentExtension(filename: string): string {\n const extension = filename.split(\".\").pop();\n return extension && extension !== filename ? extension.toLowerCase() : \"\";\n}\n\nfunction resolveAttachmentVisual(data: ChatAttachmentData): {\n fileIconType: React.ComponentProps<typeof FileIcon>[\"type\"];\n kind: ChatAttachmentKind;\n} {\n const mediaType = attachmentMediaType(data).toLowerCase();\n const extension = attachmentExtension(attachmentFilename(data));\n\n if (mediaType.startsWith(\"image/\") || [\"avif\", \"gif\", \"heic\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"].includes(extension)) {\n return { fileIconType: extension || \"image\", kind: \"image\" };\n }\n if (mediaType === \"application/pdf\" || extension === \"pdf\") {\n return { fileIconType: \"pdf\", kind: \"pdf\" };\n }\n if (\n mediaType.includes(\"spreadsheet\") ||\n mediaType.includes(\"csv\") ||\n [\"csv\", \"numbers\", \"ods\", \"xls\", \"xlsm\", \"xlsx\"].includes(extension)\n ) {\n if ([\"csv\", \"xls\", \"xlsx\"].includes(extension)) {\n return { fileIconType: extension, kind: \"spreadsheet\" };\n }\n return { fileIconType: \"spreadsheets\", kind: \"spreadsheet\" };\n }\n if (\n mediaType.includes(\"presentation\") ||\n [\"key\", \"odp\", \"ppt\", \"pptx\"].includes(extension)\n ) {\n return { fileIconType: extension === \"ppt\" ? \"ppt\" : \"pptx\", kind: \"presentation\" };\n }\n if (\n mediaType.includes(\"word\") ||\n mediaType.includes(\"rtf\") ||\n [\"doc\", \"docx\", \"odt\", \"rtf\"].includes(extension)\n ) {\n if (extension === \"doc\" || extension === \"docx\") {\n return { fileIconType: extension, kind: \"document\" };\n }\n return { fileIconType: \"document\", kind: \"document\" };\n }\n if (mediaType.startsWith(\"audio/\") || [\"aac\", \"flac\", \"m4a\", \"mp3\", \"ogg\", \"wav\"].includes(extension)) {\n if (extension === \"mp3\" || extension === \"wav\") {\n return { fileIconType: extension, kind: \"audio\" };\n }\n return { fileIconType: \"audio\", kind: \"audio\" };\n }\n if (mediaType.startsWith(\"video/\") || [\"avi\", \"m4v\", \"mkv\", \"mov\", \"mp4\", \"webm\"].includes(extension)) {\n if ([\"avi\", \"mkv\", \"mp4\", \"mpeg\"].includes(extension)) {\n return { fileIconType: extension, kind: \"video\" };\n }\n return { fileIconType: \"video\", kind: \"video\" };\n }\n if (\n mediaType.includes(\"zip\") ||\n mediaType.includes(\"compressed\") ||\n [\"7z\", \"bz2\", \"gz\", \"rar\", \"tar\", \"tgz\", \"zip\"].includes(extension)\n ) {\n return { fileIconType: extension === \"rar\" ? \"rar\" : \"zip\", kind: \"archive\" };\n }\n if (\n mediaType.includes(\"json\") ||\n mediaType.includes(\"javascript\") ||\n mediaType.includes(\"typescript\") ||\n mediaType.includes(\"xml\") ||\n [\"css\", \"html\", \"js\", \"jsx\", \"json\", \"py\", \"sql\", \"ts\", \"tsx\", \"xml\", \"yaml\", \"yml\"].includes(extension)\n ) {\n if ([\"css\", \"html\", \"java\", \"js\", \"json\", \"sql\", \"xml\"].includes(extension)) {\n return { fileIconType: extension, kind: \"code\" };\n }\n return { fileIconType: \"code\", kind: \"code\" };\n }\n if (mediaType.startsWith(\"text/\") || [\"md\", \"markdown\", \"txt\"].includes(extension)) {\n return { fileIconType: \"txt\", kind: \"file\" };\n }\n return { fileIconType: \"empty\", kind: \"file\" };\n}\n\nfunction solidFileIconBackground(\n fileIconType: React.ComponentProps<typeof FileIcon>[\"type\"],\n kind: ChatAttachmentKind,\n): string {\n if ([\"txt\", \"zip\", \"rar\"].includes(fileIconType)) return \"#344054\";\n if (kind === \"pdf\") return \"#D92D20\";\n if (kind === \"spreadsheet\") return \"#079455\";\n if (kind === \"document\" || kind === \"video\") return \"#155EEF\";\n if (kind === \"presentation\") return \"#E62E05\";\n if (kind === \"audio\") return \"#DD2590\";\n if (kind === \"code\") return \"#444CE7\";\n return \"#7F56D9\";\n}\n\nfunction isImageAttachment(data: ChatAttachmentData): boolean {\n return resolveAttachmentVisual(data).kind === \"image\";\n}\n\nfunction attachmentRenderKey(\n data: ChatAttachmentData,\n index: number,\n rowKind: \"images\" | \"files\",\n): string {\n const id = typeof data.id === \"string\" ? data.id.trim() : \"\";\n const identity = id || `${attachmentFilename(data)}:${attachmentMediaType(data)}`;\n return `${rowKind}:${identity}:${index}`;\n}\n\nfunction ChatImageAttachment({\n className,\n data,\n onRemove,\n resolveContent,\n ...props\n}: ChatAttachmentProps): React.ReactElement {\n const filename = attachmentFilename(data);\n const initialUrl = typeof data.url === \"string\" ? data.url.trim() : \"\";\n const contentStatus = String(data.contentStatus || data.content_status || \"available\");\n const attachmentKey = attachmentCacheKey(data);\n const dataRef = React.useRef(data);\n dataRef.current = data;\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const retryCountRef = React.useRef(0);\n const [isNearViewport, setIsNearViewport] = React.useState(Boolean(initialUrl));\n const [sourceUrl, setSourceUrl] = React.useState(initialUrl);\n const [status, setStatus] = React.useState<\"idle\" | \"resolving\" | \"loading\" | \"done\" | \"error\">(\n initialUrl ? \"loading\" : contentStatus === \"expired\" || !resolveContent ? \"error\" : \"idle\"\n );\n const [resolutionAttempt, setResolutionAttempt] = React.useState(0);\n\n React.useEffect(() => {\n if ((initialUrl && resolutionAttempt === 0) || contentStatus === \"expired\" || !resolveContent) return;\n const node = rootRef.current;\n if (!node || typeof IntersectionObserver === \"undefined\") {\n setIsNearViewport(true);\n return;\n }\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setIsNearViewport(true);\n observer.disconnect();\n }\n },\n { rootMargin: \"240px\" },\n );\n observer.observe(node);\n return () => observer.disconnect();\n }, [contentStatus, initialUrl, resolutionAttempt, resolveContent]);\n\n React.useEffect(() => {\n if (initialUrl && resolutionAttempt === 0) {\n setSourceUrl(initialUrl);\n setStatus(\"loading\");\n return;\n }\n if (!isNearViewport || !resolveContent || contentStatus === \"expired\") return;\n\n const attachment = dataRef.current;\n const cached = cachedAttachmentContent(resolveContent, attachment);\n if (cached) {\n setSourceUrl(cached.url);\n setStatus(\"loading\");\n return;\n }\n\n const controller = new AbortController();\n setStatus(\"resolving\");\n void resolveContent(attachment, controller.signal)\n .then((result) => {\n if (controller.signal.aborted) return;\n if (!result.url?.trim()) throw new Error(\"Attachment content resolver returned an empty URL\");\n cacheAttachmentContent(resolveContent, attachment, result);\n setSourceUrl(result.url);\n setStatus(\"loading\");\n })\n .catch(() => {\n if (!controller.signal.aborted) setStatus(\"error\");\n });\n return () => controller.abort();\n }, [attachmentKey, contentStatus, initialUrl, isNearViewport, resolutionAttempt, resolveContent]);\n\n const handleImageError = () => {\n if (resolveContent && retryCountRef.current === 0) {\n retryCountRef.current = 1;\n invalidateAttachmentContent(resolveContent, dataRef.current);\n setSourceUrl(\"\");\n setStatus(\"resolving\");\n setResolutionAttempt((current) => current + 1);\n return;\n }\n setStatus(\"error\");\n };\n\n return React.createElement(\n Attachment,\n {\n ...props,\n className: cn(\"a24-chat-image-attachment\", className),\n orientation: \"vertical\",\n ref: rootRef,\n state: status === \"error\" ? \"error\" : status === \"done\" ? \"done\" : \"processing\",\n title: filename,\n },\n React.createElement(\n AttachmentMedia,\n { className: \"a24-chat-image-media\", variant: \"image\" },\n sourceUrl\n ? React.createElement(\"img\", {\n alt: filename,\n decoding: \"async\",\n loading: \"lazy\",\n onError: handleImageError,\n onLoad: () => setStatus(\"done\"),\n src: sourceUrl,\n })\n : status === \"error\"\n ? React.createElement(ImageOff, { \"aria-hidden\": \"true\", className: \"size-5\" })\n : React.createElement(LoaderCircle, {\n \"aria-hidden\": \"true\",\n className: \"a24-chat-image-spinner size-5 animate-spin\",\n }),\n status !== \"done\" && status !== \"error\"\n ? React.createElement(\"span\", { className: \"sr-only\", role: \"status\" }, `Loading ${filename}`)\n : null,\n status === \"error\"\n ? React.createElement(\"span\", { className: \"sr-only\" }, `${filename} preview unavailable`)\n : null,\n ),\n onRemove\n ? React.createElement(\n \"button\",\n {\n \"aria-label\": `Remove ${filename}`,\n className: \"a24-chat-image-remove\",\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n onRemove();\n },\n type: \"button\",\n },\n React.createElement(X, { \"aria-hidden\": \"true\", className: \"size-3.5\" }),\n )\n : null,\n );\n}\n\nexport function ChatAttachment({\n className,\n data,\n onRemove,\n orientation,\n resolveContent,\n ...props\n}: ChatAttachmentProps): React.ReactElement {\n const filename = attachmentFilename(data);\n const { fileIconType, kind } = resolveAttachmentVisual(data);\n if (kind === \"image\") {\n return React.createElement(ChatImageAttachment, {\n ...props,\n className,\n data,\n onRemove,\n resolveContent,\n });\n }\n return React.createElement(\n Attachment,\n {\n className: cn(\"a24-chat-attachment\", className),\n orientation: orientation || \"horizontal\",\n size: \"sm\",\n ...props,\n },\n React.createElement(\n AttachmentMedia,\n Object.assign(\n {\n className: \"a24-chat-attachment-icon\",\n style: { backgroundColor: solidFileIconBackground(fileIconType, kind) },\n variant: \"icon\" as const,\n },\n { \"data-file-kind\": kind }\n ),\n React.createElement(FileIcon, {\n \"aria-hidden\": \"true\",\n size: 28,\n type: fileIconType,\n variant: \"solid\",\n })\n ),\n React.createElement(\n AttachmentContent,\n { className: \"a24-chat-attachment-content\" },\n React.createElement(AttachmentTitle, { title: filename }, filename)\n ),\n onRemove\n ? React.createElement(\n \"button\",\n {\n \"aria-label\": \"Remove attachment\",\n className:\n \"relative z-20 inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground\",\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n onRemove();\n },\n type: \"button\",\n },\n React.createElement(X, { \"aria-hidden\": \"true\", className: \"size-3.5\" })\n )\n : null\n );\n}\n\nexport type ChatAttachmentsProps = React.ComponentProps<typeof AttachmentGroup>;\n\nexport function ChatAttachments({\n children,\n className,\n ...props\n}: ChatAttachmentsProps): React.ReactElement | null {\n if (!children) return null;\n return React.createElement(\n AttachmentGroup,\n {\n className: cn(\n \"a24-chat-attachments w-full flex-nowrap\",\n className\n ),\n ...props,\n },\n children\n );\n}\n\nexport type ChatAttachmentRowsProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n attachments: readonly ChatAttachmentData[];\n onRemove?: (attachment: ChatAttachmentData) => void;\n resolveContent?: ChatAttachmentContentResolver;\n};\n\nexport function ChatAttachmentRows({\n attachments,\n className,\n dir,\n onRemove,\n resolveContent,\n ...props\n}: ChatAttachmentRowsProps): React.ReactElement | null {\n if (attachments.length === 0) return null;\n const imageAttachments = attachments.filter(isImageAttachment);\n const fileAttachments = attachments.filter((attachment) => !isImageAttachment(attachment));\n const renderRow = (items: readonly ChatAttachmentData[], kind: \"images\" | \"files\") =>\n items.length > 0\n ? React.createElement(\n ChatAttachments,\n Object.assign({ dir, key: kind }, { \"data-attachment-row\": kind }),\n items.map((attachment, index) =>\n React.createElement(ChatAttachment, {\n data: attachment,\n dir: \"ltr\",\n key: attachmentRenderKey(attachment, index, kind),\n onRemove: onRemove ? () => onRemove(attachment) : undefined,\n resolveContent,\n })\n )\n )\n : null;\n\n return React.createElement(\n \"div\",\n {\n className: cn(\"a24-chat-attachment-rows\", className),\n dir,\n ...props,\n },\n renderRow(imageAttachments, \"images\"),\n renderRow(fileAttachments, \"files\")\n );\n}\n\nexport {\n ChatAttachment as MessageAttachment,\n ChatAttachmentRows as MessageAttachmentRows,\n ChatAttachments as MessageAttachments,\n ChatMessage as Message,\n ChatMessageAction as MessageAction,\n ChatMessageActions as MessageActions,\n ChatMessageContent as MessageContent,\n};\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { cn } from \"./utils\";\n\nconst attachmentVariants = cva(\n \"group/attachment relative flex w-fit max-w-full min-w-0 shrink-0 flex-wrap rounded-xl border bg-card text-card-foreground transition-colors focus-within:border-neutral-300 focus-within:ring-0 has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed\",\n {\n variants: {\n size: {\n default:\n \"gap-2 text-sm has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2 has-data-[slot=attachment-media]:p-2\",\n sm: \"gap-2.5 text-xs has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5 has-data-[slot=attachment-media]:p-1.5\",\n xs: \"gap-1.5 rounded-lg text-xs has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1 has-data-[slot=attachment-media]:p-1\",\n },\n orientation: {\n horizontal: \"min-w-40 items-center\",\n vertical: \"w-24 flex-col has-data-[slot=attachment-content]:w-30\",\n },\n },\n }\n);\n\nfunction Attachment({\n className,\n state = \"done\",\n size = \"default\",\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof attachmentVariants> & {\n state?: \"idle\" | \"uploading\" | \"processing\" | \"error\" | \"done\";\n }) {\n return (\n <div\n data-slot=\"attachment\"\n data-state={state}\n data-size={size}\n data-orientation={orientation}\n className={cn(attachmentVariants({ size, orientation }), className)}\n {...props}\n />\n );\n}\n\nconst attachmentMediaVariants = cva(\n \"relative flex aspect-square w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg text-foreground group-data-[orientation=vertical]/attachment:w-full group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md group-data-[state=error]/attachment:text-destructive group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5\",\n {\n variants: {\n variant: {\n icon: \"\",\n image:\n \"bg-muted opacity-60 group-data-[state=done]/attachment:opacity-100 group-data-[state=idle]/attachment:opacity-100 *:[img]:aspect-square *:[img]:w-full *:[img]:object-cover\",\n },\n },\n defaultVariants: {\n variant: \"icon\",\n },\n }\n);\n\nfunction AttachmentMedia({\n className,\n variant = \"icon\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof attachmentMediaVariants>) {\n return (\n <div\n data-slot=\"attachment-media\"\n data-variant={variant}\n className={cn(attachmentMediaVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AttachmentContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-content\"\n className={cn(\n \"max-w-full min-w-0 flex-1 leading-tight group-data-[orientation=vertical]/attachment:px-1\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentTitle({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"attachment-title\"\n className={cn(\n \"block max-w-full min-w-0 truncate font-medium group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentDescription({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"attachment-description\"\n className={cn(\n \"mt-0.5 block min-w-0 truncate text-xs text-muted-foreground group-data-[state=error]/attachment:text-destructive/80\",\n \"max-w-full\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentActions({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-actions\"\n className={cn(\n \"relative z-20 flex shrink-0 items-center group-data-[orientation=vertical]/attachment:absolute group-data-[orientation=vertical]/attachment:top-3 group-data-[orientation=vertical]/attachment:right-3 group-data-[orientation=vertical]/attachment:gap-1\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentAction({\n className,\n type = \"button\",\n ...props\n}: React.ComponentProps<\"button\">) {\n return (\n <button\n data-slot=\"attachment-action\"\n type={type}\n className={cn(\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AttachmentTrigger({\n className,\n asChild = false,\n type,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"attachment-trigger\"\n type={asChild ? undefined : (type ?? \"button\")}\n className={cn(\"absolute inset-0 z-10 outline-none\", className)}\n {...props}\n />\n );\n}\n\nfunction AttachmentGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"attachment-group\"\n className={cn(\n \"flex min-w-0 scroll-fade-x snap-x snap-mandatory scroll-px-1 scrollbar-none gap-3 overflow-x-auto overscroll-x-contain py-1 *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n Attachment,\n AttachmentGroup,\n AttachmentMedia,\n AttachmentContent,\n AttachmentTitle,\n AttachmentDescription,\n AttachmentActions,\n AttachmentAction,\n AttachmentTrigger,\n attachmentVariants,\n attachmentMediaVariants,\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...values: ClassValue[]) {\n return twMerge(clsx(values));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nfunction MessageGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n );\n}\n\nfunction Message({\n className,\n align = \"start\",\n ...props\n}: React.ComponentProps<\"div\"> & { align?: \"start\" | \"end\" }) {\n return (\n <div\n data-slot=\"message\"\n data-align={align}\n className={cn(\n \"group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MessageAvatar({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-avatar\"\n className={cn(\n \"flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MessageContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-content\"\n className={cn(\n \"flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:*:data-slot:self-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MessageHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-header\"\n className={cn(\n \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MessageFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"message-footer\"\n className={cn(\n \"flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport {\n MessageGroup,\n Message,\n MessageAvatar,\n MessageContent,\n MessageFooter,\n MessageHeader,\n};\n","import type { ChatAttachment } from \"../types\";\n\nexport type AgentChatComposerFile = ChatAttachment & {\n id: string;\n type: \"file\";\n url: string;\n filename: string;\n mediaType: string;\n source: File;\n};\n\nconst createId = () =>\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `file-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\nexport function createAgentChatComposerFile(file: File): AgentChatComposerFile {\n return {\n id: createId(),\n type: \"file\",\n url: URL.createObjectURL(file),\n filename: file.name || \"attachment\",\n mediaType: file.type || \"application/octet-stream\",\n source: file,\n };\n}\n\nexport function revokeAgentChatComposerFiles(files: readonly AgentChatComposerFile[]): void {\n files.forEach((file) => {\n try {\n URL.revokeObjectURL(file.url);\n } catch {\n // The URL may already be gone in tests or older browsers.\n }\n });\n}\n","import * as React from \"react\";\nimport { Check, Copy, RefreshCcw, ThumbsDown, ThumbsUp } from \"lucide-react\";\nimport { Popover } from \"radix-ui\";\n\nimport type { ChatMessage } from \"../types\";\nimport type { FeedbackReason, ResponseFeedback } from \"@agents24/client\";\nimport { MessageAction, MessageActions } from \"./adapters\";\n\nexport type AgentChatFeedbackInput = {\n rating: \"like\" | \"dislike\" | null;\n reason?: FeedbackReason | null;\n comment?: string | null;\n};\n\nexport type AgentChatMessageActionHandlers = {\n copied?: boolean;\n feedback?: ResponseFeedback | null;\n onCopy?: (content: string, messageId: string) => void;\n onRetry?: (message: ChatMessage) => void | Promise<void>;\n onSetFeedback?: (\n message: ChatMessage,\n input: AgentChatFeedbackInput,\n ) => void | Promise<void>;\n};\n\nexport type AgentChatDefaultActionsProps = {\n additionalActions?: React.ReactNode;\n dir?: \"ltr\" | \"rtl\";\n handlers?: AgentChatMessageActionHandlers;\n message: ChatMessage;\n};\n\nconst FEEDBACK_REASONS = [\n [\"incorrect\", \"Incorrect\"],\n [\"irrelevant\", \"Irrelevant\"],\n [\"incomplete\", \"Incomplete\"],\n [\"unsafe\", \"Unsafe\"],\n [\"citation_issue\", \"Citation issue\"],\n [\"other\", \"Other\"],\n] as const satisfies ReadonlyArray<readonly [FeedbackReason, string]>;\n\nfunction formatSentAt(value: Date | string | number | null | undefined): { dateTime: string; label: string } | null {\n if (!value) return null;\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return {\n dateTime: date.toISOString(),\n label: new Intl.DateTimeFormat(undefined, { timeStyle: \"short\" }).format(date),\n };\n}\n\nexport function AgentChatDefaultActions({\n additionalActions,\n dir,\n handlers,\n message,\n}: AgentChatDefaultActionsProps) {\n const [feedbackOpen, setFeedbackOpen] = React.useState(false);\n const [feedbackTrigger, setFeedbackTrigger] = React.useState<HTMLButtonElement | null>(null);\n const [reason, setReason] = React.useState<FeedbackReason | null>(handlers?.feedback?.reason ?? null);\n const [comment, setComment] = React.useState(handlers?.feedback?.comment ?? \"\");\n const [optimisticCopied, setOptimisticCopied] = React.useState(false);\n const copyResetTimer = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n setReason(handlers?.feedback?.reason ?? null);\n setComment(handlers?.feedback?.comment ?? \"\");\n }, [handlers?.feedback?.comment, handlers?.feedback?.reason]);\n\n React.useEffect(() => () => {\n if (copyResetTimer.current !== null) window.clearTimeout(copyResetTimer.current);\n }, []);\n\n const copied = handlers?.copied ?? optimisticCopied;\n const copyMessage = () => {\n handlers?.onCopy?.(message.content || \"\", message.id);\n if (handlers?.copied !== undefined) return;\n setOptimisticCopied(true);\n if (copyResetTimer.current !== null) window.clearTimeout(copyResetTimer.current);\n copyResetTimer.current = window.setTimeout(() => {\n copyResetTimer.current = null;\n setOptimisticCopied(false);\n }, 1_200);\n };\n\n if (!handlers || message.isFinal === false) return null;\n if (message.role === \"user\") {\n const sentAt = formatSentAt(message.createdAt);\n return (\n <MessageActions className=\"a24-user-message-actions\">\n {sentAt ? <time dateTime={sentAt.dateTime}>{sentAt.label}</time> : null}\n {handlers.onCopy ? (\n <MessageAction\n label=\"Copy\"\n onClick={copyMessage}\n tooltip={copied ? \"Copied!\" : \"Copy to clipboard\"}\n className=\"a24-user-message-copy\"\n >\n {copied ? (\n <Check className=\"a24-user-message-copy__check text-green-600\" />\n ) : (\n <Copy className=\"a24-user-message-copy__icon\" />\n )}\n </MessageAction>\n ) : null}\n </MessageActions>\n );\n }\n const canWriteFeedback = Boolean(message.runId && handlers.onSetFeedback);\n return (\n <MessageActions>\n {handlers.onRetry ? (\n <MessageAction\n label=\"Retry\"\n onClick={() => void handlers.onRetry?.(message)}\n tooltip=\"Regenerate response\"\n >\n <RefreshCcw className=\"size-4\" />\n </MessageAction>\n ) : null}\n {canWriteFeedback ? (\n <MessageAction\n label=\"Like\"\n onClick={() => void handlers.onSetFeedback?.(message, {\n rating: handlers.feedback?.rating === \"like\" ? null : \"like\",\n })}\n tooltip=\"Like this response\"\n >\n <ThumbsUp className=\"size-4\" fill={handlers.feedback?.rating === \"like\" ? \"currentColor\" : \"none\"} />\n </MessageAction>\n ) : null}\n {canWriteFeedback ? (\n <Popover.Root onOpenChange={setFeedbackOpen} open={feedbackOpen}>\n <Popover.Trigger asChild>\n <MessageAction\n label=\"Dislike\"\n onClick={() => {\n if (handlers.feedback?.rating !== \"dislike\") {\n void handlers.onSetFeedback?.(message, { rating: \"dislike\" });\n }\n setFeedbackOpen(true);\n }}\n ref={setFeedbackTrigger}\n tooltip=\"Dislike this response\"\n >\n <ThumbsDown className=\"size-4\" fill={handlers.feedback?.rating === \"dislike\" ? \"currentColor\" : \"none\"} />\n </MessageAction>\n </Popover.Trigger>\n <Popover.Portal\n container={feedbackTrigger?.closest<HTMLElement>(\"[data-agents24-theme-root]\") ?? undefined}\n >\n <Popover.Content\n align=\"end\"\n aria-label=\"Dislike details\"\n className=\"z-50 w-80 rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none\"\n dir={dir}\n side=\"top\"\n sideOffset={8}\n >\n <p className=\"text-sm font-medium\">What could be better?</p>\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {FEEDBACK_REASONS.map(([value, label]) => (\n <button\n aria-pressed={reason === value}\n className=\"rounded-md border border-border px-2.5 py-1.5 text-xs font-medium transition-colors hover:bg-muted aria-pressed:border-transparent aria-pressed:bg-secondary\"\n key={value}\n onClick={() => setReason(reason === value ? null : value)}\n type=\"button\"\n >\n {label}\n </button>\n ))}\n </div>\n <textarea\n aria-label=\"Optional feedback comment\"\n className=\"mt-3 min-h-20 w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n maxLength={1000}\n onChange={(event) => setComment(event.target.value)}\n placeholder=\"Add a comment (optional)\"\n value={comment}\n />\n <div className=\"mt-3 flex items-center justify-between gap-2\">\n <button\n className=\"rounded-md px-3 py-2 text-sm font-medium hover:bg-muted\"\n onClick={() => {\n void Promise.resolve(handlers.onSetFeedback?.(message, { rating: null }))\n .then(() => setFeedbackOpen(false))\n .catch(() => undefined);\n }}\n type=\"button\"\n >\n Remove feedback\n </button>\n <button\n className=\"rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90\"\n onClick={() => {\n void Promise.resolve(handlers.onSetFeedback?.(message, { rating: \"dislike\", reason, comment }))\n .then(() => setFeedbackOpen(false))\n .catch(() => undefined);\n }}\n type=\"button\"\n >\n Save\n </button>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n ) : null}\n {additionalActions}\n {handlers.onCopy ? (\n <MessageAction\n label=\"Copy\"\n onClick={copyMessage}\n tooltip={copied ? \"Copied!\" : \"Copy to clipboard\"}\n >\n {copied ? (\n <Check className=\"size-4 text-green-600\" />\n ) : (\n <Copy className=\"size-4\" />\n )}\n </MessageAction>\n ) : null}\n </MessageActions>\n );\n}\n","import * as React from \"react\";\nimport { ChevronDown, ChevronUp } from \"lucide-react\";\n\nimport type { ChatHitlPart, ChatHitlResponse, ChatMessage } from \"../types\";\nimport {\n ChatAttachmentRows,\n type ChatAttachmentContentResolver,\n ChatMessage as Message,\n ChatMessageContent as MessageContent,\n} from \"./adapters\";\nimport {\n AgentChatDefaultActions,\n type AgentChatMessageActionHandlers,\n} from \"./agent-chat-actions\";\nimport {\n AgentResponseTimeline,\n type AgentChatPartActionState,\n type AgentChatTimelineComponent,\n} from \"./agent-response-timeline\";\nimport { cn } from \"./utils\";\n\nconst DEFAULT_USER_MESSAGE_COLLAPSE_THRESHOLD = 360;\nconst DEFAULT_USER_MESSAGE_COLLAPSED_LINES = 4;\n\nexport type AgentChatUserMessageContentProps = {\n collapsedLines?: number;\n collapseThreshold?: number | null;\n content: string;\n showLessLabel?: string;\n showMoreLabel?: string;\n};\n\nexport type AgentChatMessageProps = {\n actionHandlers?: AgentChatMessageActionHandlers;\n additionalActions?: React.ReactNode;\n actions?: React.ReactNode;\n actionsClassName?: string;\n attachmentContentResolver?: ChatAttachmentContentResolver;\n className?: string;\n contentClassName?: string;\n dir?: \"ltr\" | \"rtl\";\n getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;\n message: ChatMessage;\n nodeActivityMode?: \"default\" | \"all\" | \"hidden\";\n onHitlAction?: (part: ChatHitlPart, response: ChatHitlResponse) => void;\n Timeline?: AgentChatTimelineComponent;\n renderAssistantContent?: (input: {\n isStreaming: boolean;\n message: ChatMessage;\n }) => React.ReactNode;\n renderUserContent?: (input: {\n message: ChatMessage;\n }) => React.ReactNode;\n showAssistantAttachments?: boolean;\n streamingMessageId?: string | null;\n userMessageCollapsedLines?: number;\n userMessageContent?: string;\n userMessageCollapseThreshold?: number | null;\n userMessageShowLessLabel?: string;\n userMessageShowMoreLabel?: string;\n};\n\nexport function shouldCollapseUserMessage(\n content: string,\n threshold: number | null | undefined = DEFAULT_USER_MESSAGE_COLLAPSE_THRESHOLD\n) {\n return typeof threshold === \"number\" && threshold > 0 && content.length > threshold;\n}\n\nexport function AgentChatUserMessageContent({\n collapsedLines = DEFAULT_USER_MESSAGE_COLLAPSED_LINES,\n collapseThreshold = DEFAULT_USER_MESSAGE_COLLAPSE_THRESHOLD,\n content,\n showLessLabel = \"Show less\",\n showMoreLabel = \"Show more\",\n}: AgentChatUserMessageContentProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n const contentId = React.useId();\n const shouldCollapse = shouldCollapseUserMessage(content, collapseThreshold);\n const Icon = isExpanded ? ChevronUp : ChevronDown;\n const clampedStyle = shouldCollapse && !isExpanded\n ? {\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: Math.max(1, collapsedLines),\n display: \"-webkit-box\",\n overflow: \"hidden\",\n } satisfies React.CSSProperties\n : undefined;\n\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div id={contentId} className=\"min-w-0\" style={clampedStyle}>\n {content}\n </div>\n {shouldCollapse ? (\n <button\n aria-controls={contentId}\n aria-expanded={isExpanded}\n className={cn(\n \"inline-flex w-fit items-center gap-1 rounded-md text-left text-sm font-medium text-muted-foreground transition-colors\",\n \"hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0\"\n )}\n onClick={() => setIsExpanded((current) => !current)}\n type=\"button\"\n >\n {isExpanded ? showLessLabel : showMoreLabel}\n <Icon aria-hidden=\"true\" className=\"size-4\" strokeWidth={2} />\n </button>\n ) : null}\n </div>\n );\n}\n\nexport function AgentChatUserMessageActionRow({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n const rowRef = React.useRef<HTMLDivElement>(null);\n const [visible, setVisible] = React.useState(false);\n\n React.useEffect(() => {\n const message = rowRef.current?.closest<HTMLElement>('[data-slot=\"message\"]');\n if (!message) return;\n\n const show = () => setVisible(true);\n const hide = () => setVisible(false);\n const hideWhenFocusLeaves = (event: FocusEvent) => {\n if (!message.contains(event.relatedTarget as Node | null)) hide();\n };\n\n message.addEventListener(\"mouseenter\", show);\n message.addEventListener(\"mouseleave\", hide);\n message.addEventListener(\"focusin\", show);\n message.addEventListener(\"focusout\", hideWhenFocusLeaves);\n return () => {\n message.removeEventListener(\"mouseenter\", show);\n message.removeEventListener(\"mouseleave\", hide);\n message.removeEventListener(\"focusin\", show);\n message.removeEventListener(\"focusout\", hideWhenFocusLeaves);\n };\n }, []);\n\n return (\n <div\n ref={rowRef}\n className={cn(\"a24-chat-message-action-row--user\", visible && \"is-visible\", className)}\n style={{ opacity: visible ? 1 : 0, pointerEvents: visible ? \"auto\" : \"none\" }}\n >\n {children}\n </div>\n );\n}\n\nexport function AgentChatMessage({\n actionHandlers,\n additionalActions,\n actions,\n actionsClassName,\n attachmentContentResolver,\n className,\n contentClassName,\n dir,\n getHitlActionState,\n message,\n nodeActivityMode,\n onHitlAction,\n Timeline = AgentResponseTimeline,\n renderAssistantContent,\n renderUserContent,\n showAssistantAttachments = false,\n streamingMessageId,\n userMessageCollapsedLines,\n userMessageContent,\n userMessageCollapseThreshold,\n userMessageShowLessLabel,\n userMessageShowMoreLabel,\n}: AgentChatMessageProps) {\n const isAssistant = message.role === \"assistant\";\n const isStreaming = isAssistant && message.id === streamingMessageId;\n const resolvedUserContent = userMessageContent ?? message.content;\n const shouldRenderContent = isAssistant || Boolean(renderUserContent || resolvedUserContent);\n const showAttachments =\n Boolean(message.attachments?.length) &&\n (message.role === \"user\" || showAssistantAttachments);\n const renderedActions = actions ?? (\n actionHandlers ? (\n <AgentChatDefaultActions\n additionalActions={additionalActions}\n dir={dir}\n handlers={actionHandlers}\n message={message}\n />\n ) : null\n );\n const defaultUserActions = !actions && Boolean(actionHandlers) && !isAssistant;\n\n return (\n <Message\n className={className}\n dir={dir}\n from={message.role}\n >\n {showAttachments ? (\n <ChatAttachmentRows\n attachments={message.attachments || []}\n className=\"mb-2\"\n dir={dir}\n resolveContent={attachmentContentResolver}\n />\n ) : null}\n\n {shouldRenderContent ? (\n <MessageContent\n className={cn(isAssistant ? \"bg-transparent p-0\" : undefined, contentClassName)}\n dir={dir}\n from={message.role}\n >\n {isAssistant ? (\n renderAssistantContent ? (\n renderAssistantContent({ isStreaming, message })\n ) : (\n <Timeline\n getHitlActionState={getHitlActionState}\n isLoading={isStreaming}\n message={message}\n nodeActivityMode={nodeActivityMode}\n onHitlAction={onHitlAction}\n parts={message.parts}\n />\n )\n ) : null}\n {!isAssistant ? (\n renderUserContent ? (\n renderUserContent({ message })\n ) : resolvedUserContent ? (\n <AgentChatUserMessageContent\n collapsedLines={userMessageCollapsedLines}\n collapseThreshold={userMessageCollapseThreshold}\n content={resolvedUserContent}\n showLessLabel={userMessageShowLessLabel}\n showMoreLabel={userMessageShowMoreLabel}\n />\n ) : null\n ) : null}\n </MessageContent>\n ) : null}\n\n {renderedActions ? (\n defaultUserActions ? (\n <AgentChatUserMessageActionRow className={actionsClassName}>\n {renderedActions}\n </AgentChatUserMessageActionRow>\n ) : (\n <div className={cn(dir === \"rtl\" ? \"mt-1 h-9 w-full\" : \"mt-1 h-9 w-full -translate-x-2\", actionsClassName)}>\n {renderedActions}\n </div>\n )\n ) : null}\n </Message>\n );\n}\n","import * as React from \"react\";\n\nimport type { ChatHitlPart, ChatHitlResponse, ChatMessage, ChatNodeActivityPart, ChatPart, ChatToolPart } from \"../types\";\nimport { getActiveStreamingTextPartId } from \"../streaming-text\";\nimport { AskUserInteraction } from \"./ask-user-interaction\";\nimport { AgentChatContextCompressionRow } from \"./agent-chat-context-compression-row\";\nimport type { McpConnectRequiredStatus } from \"./mcp-connect-required-card\";\nimport { MessageResponse, type MessageResponseProps } from \"./message-response\";\nimport { hitlActionLabel, hitlTitle, resolvedHitlLabel } from \"./hitl-presentation\";\nimport { cn } from \"./utils\";\nimport {\n AgentChatActivityRow,\n AgentChatNodeActivityRow,\n AgentChatSubagentGroup,\n AgentChatModelTurnRow,\n AgentChatToolRow,\n AgentChatToolSession,\n isAgentChatSubagent,\n latestRunningAgentChatToolId,\n partitionAgentChatToolTimeline,\n type AgentChatToolSlots,\n type AgentChatToolViewMode,\n} from \"./tool-sessions\";\n\nexport type AgentChatPartActionState = {\n status?: McpConnectRequiredStatus | string;\n error?: string | null;\n};\n\nexport type HitlActionState = AgentChatPartActionState;\n\nexport type AgentResponseTimelineProps = {\n getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;\n isLoading?: boolean;\n message: ChatMessage;\n nodeActivityMode?: \"default\" | \"all\" | \"hidden\";\n onHitlAction?: (part: ChatHitlPart, response: ChatHitlResponse) => void;\n parts?: readonly ChatPart[];\n responseProps?: Omit<MessageResponseProps, \"children\" | \"streaming\" | \"streamingId\">;\n toolSlots?: AgentChatToolSlots;\n toolViewMode?: AgentChatToolViewMode;\n};\n\nexport type AgentChatTimelineSlotProps = Omit<AgentResponseTimelineProps, \"parts\"> & {\n parts: readonly ChatPart[];\n};\n\nexport type AgentChatTimelineComponent = React.ComponentType<AgentChatTimelineSlotProps>;\n\nfunction isInternalAskUserTool(part: ChatToolPart): boolean {\n return [part.toolName, part.toolKey, part.action]\n .some((value) => value?.trim().toLowerCase() === \"runtime__ask_user\");\n}\n\nfunction Shimmer({ children, className }: { children: React.ReactNode; className?: string }) {\n return <span className={cn(\"inline-block animate-pulse\", className)}>{children}</span>;\n}\n\nexport function AgentChatToolPart({\n activeToolId,\n part,\n}: {\n activeToolId?: string | null;\n part: ChatToolPart;\n}) {\n return <AgentChatToolRow activeToolId={activeToolId} part={part} />;\n}\n\nexport function AgentChatToolGroup({\n activeToolId,\n parts,\n}: {\n activeToolId?: string | null;\n parts: ChatToolPart[];\n}) {\n return <AgentChatToolSession activeToolId={activeToolId} parts={parts} />;\n}\n\nfunction HitlPartRow({\n getHitlActionState,\n isLoading,\n onHitlAction,\n part,\n}: {\n getHitlActionState?: AgentResponseTimelineProps[\"getHitlActionState\"];\n isLoading?: boolean;\n onHitlAction?: AgentResponseTimelineProps[\"onHitlAction\"];\n part: ChatHitlPart;\n}) {\n const state = getHitlActionState?.(part);\n const [comment, setComment] = React.useState(\"\");\n const presentation = part.presentation || {};\n const requireComment = presentation.require_comment === true;\n const isTerminal = part.status !== \"pending\";\n const resolvedRef = React.useRef<HTMLDivElement>(null);\n const wasTerminal = React.useRef(isTerminal);\n React.useEffect(() => {\n if (isTerminal && !wasTerminal.current) resolvedRef.current?.focus();\n wasTerminal.current = isTerminal;\n }, [isTerminal]);\n if (part.hitlKind === \"user_input\") {\n return (\n <AskUserInteraction\n error={state?.error}\n isBusy={isLoading || state?.status === \"resuming\"}\n onSubmit={onHitlAction ? (answers) => onHitlAction(part, {\n action: \"respond\",\n answers: answers.map((answer) => ({\n question_id: answer.questionId,\n selected_option_ids: answer.selectedOptionIds,\n ...(answer.customText ? { custom_text: answer.customText } : {}),\n })),\n }) : undefined}\n part={part}\n />\n );\n }\n if (isTerminal) {\n return (\n <div className=\"a24-hitl a24-hitl--resolved px-1 py-1 text-sm text-muted-foreground\" ref={resolvedRef} role=\"status\" tabIndex={-1}>{resolvedHitlLabel(part)}</div>\n );\n }\n return (\n <div className=\"a24-hitl space-y-2.5 px-1 py-2\">\n <div className=\"a24-hitl__title text-sm font-medium text-foreground text-pretty\">{hitlTitle(part)}</div>\n {requireComment ? (\n <textarea\n aria-label=\"Approval comment\"\n autoComplete=\"off\"\n className=\"a24-hitl__comment min-h-20 w-full resize-y rounded-md border border-border/60 bg-background px-3 py-2 text-sm outline-none focus-visible:border-neutral-300 focus-visible:ring-0 dark:focus-visible:border-neutral-600\"\n name=\"hitl-comment\"\n onChange={(event) => setComment(event.target.value)}\n placeholder=\"Comment required…\"\n value={comment}\n />\n ) : null}\n {state?.error ? <div className=\"a24-hitl__error text-sm text-destructive\">{state.error}</div> : null}\n <div className=\"a24-hitl__actions flex flex-wrap items-center gap-1.5\">\n {part.allowedActions.map((action) => (\n <button\n key={action}\n aria-label={hitlActionLabel(part, action)}\n className={cn(\n \"a24-hitl__action min-h-10 rounded-md px-3 text-sm font-medium transition-[background-color,color,opacity,transform] duration-150 ease-out active:scale-[0.96] disabled:pointer-events-none disabled:opacity-60\",\n action === \"approve\" || action === \"connect\"\n ? \"bg-neutral-900 text-white hover:bg-neutral-800 dark:bg-neutral-100 dark:text-neutral-900 dark:hover:bg-white\"\n : \"bg-transparent text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n )}\n data-primary={action === \"approve\" || action === \"connect\" ? \"\" : undefined}\n disabled={!onHitlAction || isLoading || state?.status === \"connecting\" || state?.status === \"resuming\" || (requireComment && !comment.trim())}\n onClick={() => onHitlAction?.(part, {\n action,\n ...(comment.trim() ? { comment: comment.trim() } : {}),\n })}\n type=\"button\"\n >\n {hitlActionLabel(part, action)}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nexport type AgentChatPartProps = {\n activeToolId?: string | null;\n getHitlActionState?: AgentResponseTimelineProps[\"getHitlActionState\"];\n isLoading?: boolean;\n isTextStreaming?: boolean;\n message: ChatMessage;\n onHitlAction?: AgentResponseTimelineProps[\"onHitlAction\"];\n part: ChatPart;\n responseProps?: AgentResponseTimelineProps[\"responseProps\"];\n toolSlots?: AgentChatToolSlots;\n};\n\nexport function AgentChatPart({\n activeToolId,\n getHitlActionState,\n isLoading,\n isTextStreaming,\n message,\n onHitlAction,\n part,\n responseProps,\n toolSlots,\n}: AgentChatPartProps) {\n if (part.kind === \"text\") {\n return (\n <MessageResponse\n {...responseProps}\n streaming={isTextStreaming ?? Boolean(isLoading && part.raw?.status === \"streaming\")}\n streamingId={part.id}\n >\n {part.text}\n </MessageResponse>\n );\n }\n if (part.kind === \"tool\") return isAgentChatSubagent(part)\n ? <AgentChatSubagentGroup part={part} slots={toolSlots} />\n : <AgentChatToolRow activeToolId={activeToolId} part={part} slots={toolSlots} />;\n if (part.kind === \"model-turn\") return <AgentChatModelTurnRow part={part} />;\n if (part.kind === \"reasoning\") {\n const label = part.text || part.label || \"Thinking\";\n return part.status === \"running\" || part.status === \"streaming\"\n ? <Shimmer className=\"text-sm text-muted-foreground\">{label}</Shimmer>\n : <div className=\"text-sm text-muted-foreground\">{label}</div>;\n }\n if (part.kind === \"context-compression\") {\n return <AgentChatContextCompressionRow part={part} />;\n }\n if (part.kind === \"ui-blocks\") {\n if (part.state === \"output-error\") {\n return <div className=\"a24-timeline-error text-sm text-destructive\">{part.errorText || \"Failed to render UI content.\"}</div>;\n }\n return part.bundle ? <SafeUiBlocks bundle={part.bundle} /> : <div className=\"text-sm text-muted-foreground\">{part.state === \"input-streaming\" ? <Shimmer>Rendering UI block</Shimmer> : \"Rendered UI block\"}</div>;\n }\n if (part.kind === \"hitl\") {\n return (\n <HitlPartRow\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n onHitlAction={onHitlAction}\n part={part}\n />\n );\n }\n if (part.kind === \"error\") return <div className=\"a24-timeline-error text-sm text-destructive\" role=\"alert\">{part.errorText}</div>;\n if (part.kind === \"source\") {\n const href = safeExternalUrl(part.url);\n return href ? <a className=\"a24-source-link\" href={href} rel=\"noopener noreferrer\" target=\"_blank\">{part.title}</a> : <span className=\"a24-source-link\">{part.title}</span>;\n }\n if (part.kind === \"citation\") {\n const href = safeExternalUrl(part.url);\n const label = part.label || \"Citation\";\n return href ? <a className=\"a24-citation\" href={href} rel=\"noopener noreferrer\" target=\"_blank\">{label}</a> : <span className=\"a24-citation\">{label}</span>;\n }\n if (part.kind === \"attachment\") return <div className=\"a24-output-attachment\">{part.attachment.filename || \"Attachment\"}</div>;\n if (part.kind === \"data\") return <div data-agents24-data-part={part.name} className=\"hidden\">{message.id}</div>;\n return null;\n}\n\nfunction safeExternalUrl(value?: string | null): string | null {\n if (!value) return null;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.href : null;\n } catch {\n return null;\n }\n}\n\nfunction SafeUiBlocks({ bundle }: { bundle: Record<string, unknown> }) {\n const rows = Array.isArray(bundle.rows) ? bundle.rows : [];\n return (\n <section aria-label={typeof bundle.title === \"string\" ? bundle.title : \"Agent result\"} className=\"a24-ui-blocks\">\n {typeof bundle.title === \"string\" ? <h3>{bundle.title}</h3> : null}\n {rows.map((rawRow, rowIndex) => {\n const row = rawRow && typeof rawRow === \"object\" && !Array.isArray(rawRow) ? rawRow as Record<string, unknown> : {};\n const blocks = Array.isArray(row.blocks) ? row.blocks : [];\n return <div className=\"a24-ui-blocks__row\" key={`row-${rowIndex}`}>{blocks.map((rawBlock, blockIndex) => {\n const block = rawBlock && typeof rawBlock === \"object\" && !Array.isArray(rawBlock) ? rawBlock as Record<string, unknown> : {};\n const title = typeof block.title === \"string\" ? block.title : \"Result\";\n const kind = String(block.kind || \"note\");\n if (kind === \"table\" && Array.isArray(block.columns) && Array.isArray(block.rows)) {\n return (\n <div className=\"a24-ui-block\" key={String(block.id || blockIndex)}>\n <h4>{title}</h4>\n <div className=\"a24-ui-table-scroll\"><table><thead><tr>{block.columns.map((column, index) => <th key={index}>{String(column)}</th>)}</tr></thead><tbody>{block.rows.map((rawCells, index) => <tr key={index}>{(Array.isArray(rawCells) ? rawCells : []).map((cell, cellIndex) => <td key={cellIndex}>{String(cell)}</td>)}</tr>)}</tbody></table></div>\n </div>\n );\n }\n const value = block.value ?? block.text ?? \"\";\n return <div className=\"a24-ui-block\" key={String(block.id || blockIndex)}><h4>{title}</h4><p>{String(value)}</p></div>;\n })}</div>;\n })}\n </section>\n );\n}\n\nexport function AgentResponseTimeline({\n getHitlActionState,\n isLoading = false,\n message,\n nodeActivityMode = \"default\",\n onHitlAction,\n parts: displayParts,\n responseProps,\n toolSlots,\n toolViewMode = \"closed\",\n}: AgentResponseTimelineProps) {\n const parts = (displayParts || message.parts || []).filter((part) => (\n (part.kind !== \"tool\" || !isInternalAskUserTool(part))\n && (part.kind !== \"model-turn\" || part.turnKind === \"agent\")\n && (\n part.kind !== \"node-activity\"\n || nodeActivityMode === \"all\"\n || (nodeActivityMode === \"default\" && part.defaultChatVisible)\n )\n ));\n const toolParts = parts.filter((part): part is ChatToolPart => part.kind === \"tool\");\n const activeToolId = latestRunningAgentChatToolId(toolParts);\n const activeTextPartId = getActiveStreamingTextPartId(\n { ...message, parts: [...parts] },\n isLoading ? message.id : null,\n );\n const rendered = [];\n let activeActivityClaimed = false;\n const segments = partitionAgentChatToolTimeline(parts, toolViewMode);\n for (const [segmentIndex, segment] of segments.entries()) {\n if (segment.kind === \"tool\") {\n const isLatestActivity = segmentIndex === segments.length - 1;\n const showOrb = toolViewMode === \"closed\"\n ? isLoading && isLatestActivity\n : Boolean(activeToolId && (segment.part.id === activeToolId || segment.part.toolCallId === activeToolId));\n rendered.push(<AgentChatToolRow activeToolId={activeToolId} key={segment.part.id} part={segment.part} showOrb={showOrb} slots={toolSlots} />);\n continue;\n }\n if (segment.kind === \"tool-session\") {\n rendered.push(<AgentChatToolSession activeToolId={activeToolId} isLatestActivity={segmentIndex === segments.length - 1} isLive={isLoading} key={`tool-session-${segment.parts[0].id}`} leadingModelTurn={segment.leadingModelTurn} modelTurn={segment.modelTurn} parts={segment.parts} slots={toolSlots} />);\n continue;\n }\n if (segment.kind === \"subagent\") {\n rendered.push(<AgentChatSubagentGroup isLatestActivity={segmentIndex === segments.length - 1} isLive={isLoading} key={segment.part.id} part={segment.part} slots={toolSlots} />);\n continue;\n }\n const part = segment.part;\n if (part.kind === \"model-turn\") {\n const key = activeActivityClaimed ? part.id : `${message.id}-active-activity`;\n activeActivityClaimed = true;\n rendered.push(<AgentChatActivityRow key={key} label=\"Planning next moves\" modelTurnId={part.modelTurnId} />);\n continue;\n }\n if (part.kind === \"node-activity\") {\n const key = activeActivityClaimed ? part.id : `${message.id}-active-activity`;\n if (part.status === \"running\") activeActivityClaimed = true;\n rendered.push(\n part.status === \"running\"\n ? <AgentChatActivityRow key={key} label={part.label} />\n : <AgentChatNodeActivityRow key={part.id} part={part as ChatNodeActivityPart} />,\n );\n continue;\n }\n rendered.push(\n <React.Fragment key={part.id}>\n <AgentChatPart\n activeToolId={activeToolId}\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n isTextStreaming={part.kind === \"text\" && part.id === activeTextPartId}\n message={message}\n onHitlAction={onHitlAction}\n part={part}\n responseProps={responseProps}\n toolSlots={toolSlots}\n />\n </React.Fragment>\n );\n }\n if (rendered.length === 0 && message.content) {\n rendered.push(<MessageResponse key={`${message.id}-fallback`}>{message.content}</MessageResponse>);\n }\n if (rendered.length === 0 && isLoading) {\n rendered.push(<AgentChatActivityRow key={`${message.id}-active-activity`} label=\"Thinking\" />);\n }\n return <div className=\"space-y-3\">{rendered}</div>;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { ChatMessage, ChatPart } from \"./types\";\n\nexport type StreamingTextMode = \"streaming\" | \"static\";\n\nexport type StreamingTextCache = {\n get: (id: string) => string | undefined;\n set: (id: string, text: string) => void;\n};\n\nexport type UseStreamingTextOptions = {\n id: string;\n isStreaming: boolean;\n text: string;\n cache?: StreamingTextCache | false;\n charsPerSecond?: number;\n catchupThreshold?: number;\n maxCatchupChars?: number;\n};\n\nexport type UseStreamingTextResult = {\n displayedText: string;\n isAnimating: boolean;\n mode: StreamingTextMode;\n parseIncompleteMarkdown: boolean;\n};\n\nconst DEFAULT_COMPLETED_TEXT_CACHE_SIZE = 200;\nconst STREAM_RUNWAY_MS = 80;\nconst STREAM_IDLE_RELEASE_MS = 120;\nconst defaultCompletedTextCache = new Map<string, string>();\n\nconst defaultStreamingTextCache: StreamingTextCache = {\n get: (id) => defaultCompletedTextCache.get(id),\n set: (id, text) => {\n defaultCompletedTextCache.set(id, text);\n if (defaultCompletedTextCache.size > DEFAULT_COMPLETED_TEXT_CACHE_SIZE) {\n const firstKey = defaultCompletedTextCache.keys().next().value;\n if (firstKey) defaultCompletedTextCache.delete(firstKey);\n }\n },\n};\n\nexport const getActiveStreamingTextPartId = (\n message: ChatMessage,\n streamingMessageId: string | null\n) => {\n if (message.role !== \"assistant\" || streamingMessageId !== message.id) return null;\n const trailingPart = message.parts[message.parts.length - 1];\n return trailingPart?.kind === \"text\" ? trailingPart.id : null;\n};\n\nexport const isActiveStreamingTextPart = (\n message: ChatMessage,\n part: ChatPart,\n streamingMessageId: string | null\n) => part.kind === \"text\" && part.id === getActiveStreamingTextPartId(message, streamingMessageId);\n\nconst graphemeEndOffsets = (value: string): number[] => {\n if (!value) return [];\n\n if (typeof Intl !== \"undefined\" && \"Segmenter\" in Intl) {\n const segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n return Array.from(segmenter.segment(value), ({ index, segment }) => index + segment.length);\n }\n\n const characters = Array.from(value);\n const offsets: number[] = [];\n let offset = 0;\n let regionalIndicators = 0;\n characters.forEach((character, index) => {\n const previous = characters[index - 1];\n const codePoint = character.codePointAt(0) ?? 0;\n const isRegionalIndicator = codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff;\n const continuesCluster =\n index > 0 &&\n (/^\\p{Mark}$/u.test(character) ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n (codePoint >= 0x1f3fb && codePoint <= 0x1f3ff) ||\n character === \"\\u200d\" ||\n previous === \"\\u200d\" ||\n (isRegionalIndicator && regionalIndicators % 2 === 1));\n if (!continuesCluster) {\n if (offset > 0) offsets.push(offset);\n regionalIndicators = 0;\n }\n offset += character.length;\n regionalIndicators = isRegionalIndicator ? regionalIndicators + 1 : 0;\n });\n offsets.push(offset);\n return offsets;\n};\n\nexport function useStreamingText({\n id,\n isStreaming,\n text,\n cache = defaultStreamingTextCache,\n charsPerSecond = 72,\n catchupThreshold = 40,\n maxCatchupChars = 20,\n}: UseStreamingTextOptions): UseStreamingTextResult {\n const cacheAdapter = cache === false ? null : cache;\n const [displayedText, setDisplayedText] = useState(() => {\n const cachedText = cacheAdapter?.get(id);\n return cachedText && text.startsWith(cachedText) ? cachedText : text;\n });\n const targetRef = useRef(text);\n const displayedRef = useRef(displayedText);\n const rafRef = useRef<number | null>(null);\n const lastFrameAtRef = useRef<number | null>(null);\n const targetUpdatedAtRef = useRef<number | null>(null);\n const progressRemainderRef = useRef(0);\n const idRef = useRef(id);\n const streamingRef = useRef(isStreaming);\n const reduceMotionRef = useRef(false);\n\n useEffect(() => {\n if (isStreaming || !text) return;\n cacheAdapter?.set(id, text);\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n targetRef.current = text;\n targetUpdatedAtRef.current =\n typeof performance === \"undefined\" ? null : performance.now();\n\n if (\n !isStreaming ||\n reduceMotionRef.current ||\n !text.startsWith(displayedRef.current)\n ) {\n displayedRef.current = text;\n setDisplayedText(text);\n progressRemainderRef.current = 0;\n }\n }, [isStreaming, text]);\n\n useEffect(() => {\n if (idRef.current === id) return;\n\n idRef.current = id;\n const cachedText = cacheAdapter?.get(id);\n const initial = cachedText && text.startsWith(cachedText) ? cachedText : text;\n displayedRef.current = initial;\n setDisplayedText(initial);\n lastFrameAtRef.current = null;\n targetUpdatedAtRef.current =\n typeof performance === \"undefined\" ? null : performance.now();\n progressRemainderRef.current = 0;\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n streamingRef.current = isStreaming;\n\n if (typeof window === \"undefined\") {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n const reduceMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n reduceMotionRef.current = reduceMotion;\n\n if (reduceMotion || !isStreaming) {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n const cachedText = cacheAdapter?.get(id);\n if (cachedText === text) {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n if (!text.startsWith(displayedRef.current)) {\n displayedRef.current = text;\n setDisplayedText(text);\n }\n\n const tick = (timestamp: number) => {\n const previousTimestamp = lastFrameAtRef.current ?? timestamp;\n lastFrameAtRef.current = timestamp;\n\n const target = targetRef.current;\n const current = displayedRef.current;\n\n if (!streamingRef.current || reduceMotionRef.current) {\n displayedRef.current = target;\n setDisplayedText(target);\n rafRef.current = null;\n return;\n }\n\n if (!target.startsWith(current)) {\n displayedRef.current = target;\n setDisplayedText(target);\n progressRemainderRef.current = 0;\n rafRef.current = window.requestAnimationFrame(tick);\n return;\n }\n\n const pending = target.slice(current.length);\n const pendingOffsets = graphemeEndOffsets(pending);\n if (pendingOffsets.length === 0) {\n rafRef.current = window.requestAnimationFrame(tick);\n return;\n }\n\n const elapsedMs = Math.max(0, timestamp - previousTimestamp);\n const targetIdleMs =\n targetUpdatedAtRef.current === null\n ? STREAM_IDLE_RELEASE_MS\n : Math.max(0, timestamp - targetUpdatedAtRef.current);\n const runway =\n targetIdleMs >= STREAM_IDLE_RELEASE_MS\n ? 0\n : Math.min(\n pendingOffsets.length - 1,\n Math.max(1, Math.ceil((charsPerSecond * STREAM_RUNWAY_MS) / 1000))\n );\n const eligibleGraphemes = pendingOffsets.length - runway;\n\n progressRemainderRef.current += (elapsedMs / 1000) * charsPerSecond;\n let step = Math.floor(progressRemainderRef.current);\n if (current.length === 0 && eligibleGraphemes > 0) step = Math.max(1, step);\n\n const catchupStep =\n pendingOffsets.length > catchupThreshold\n ? Math.min(maxCatchupChars, Math.ceil(pendingOffsets.length / 10))\n : 0;\n step = Math.min(eligibleGraphemes, Math.max(step, catchupStep));\n\n if (step > 0) {\n progressRemainderRef.current = Math.max(0, progressRemainderRef.current - step);\n const next = current + pending.slice(0, pendingOffsets[step - 1]);\n displayedRef.current = next;\n setDisplayedText(next);\n }\n rafRef.current = window.requestAnimationFrame(tick);\n };\n\n if (rafRef.current === null) {\n rafRef.current = window.requestAnimationFrame(tick);\n }\n\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameAtRef.current = null;\n progressRemainderRef.current = 0;\n };\n }, [cacheAdapter, catchupThreshold, charsPerSecond, id, isStreaming, maxCatchupChars]);\n\n const reduceMotion =\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n return {\n displayedText: !isStreaming || reduceMotion ? text : displayedText,\n isAnimating: isStreaming,\n mode: isStreaming ? \"streaming\" : \"static\",\n parseIncompleteMarkdown: isStreaming,\n };\n}\n","import * as React from \"react\";\nimport {\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n Pencil,\n} from \"lucide-react\";\n\nimport type { ChatHitlAnswer, ChatHitlPart, ChatHitlQuestion } from \"../types\";\nimport {\n askUserAnswersFromDrafts,\n askUserDraftHasAnswer,\n emptyAskUserDrafts,\n selectAskUserOption,\n updateAskUserCustomText,\n type AskUserDrafts,\n} from \"./ask-user-interaction-state\";\nimport { cn } from \"./utils\";\n\nexport type AskUserInteractionProps = {\n error?: string | null;\n isBusy?: boolean;\n onSubmit?: (answers: ChatHitlAnswer[]) => void;\n part: ChatHitlPart;\n};\n\nfunction resolvedAnswerText(\n question: ChatHitlQuestion,\n answer: ChatHitlAnswer | undefined,\n): string[] {\n if (!answer) return [\"No response recorded\"];\n const labels = answer.selectedOptionIds.flatMap((optionId) => {\n const option = question.options.find((item) => item.id === optionId);\n return option ? [option.label] : [];\n });\n if (answer.customText) labels.push(answer.customText);\n return labels.length ? labels : [\"No response recorded\"];\n}\n\nfunction ResolvedQuestions({\n buttonRef,\n part,\n}: {\n buttonRef?: React.RefObject<HTMLButtonElement | null>;\n part: ChatHitlPart;\n}) {\n const [open, setOpen] = React.useState(false);\n const count = part.questions.length;\n const answers = new Map(\n (part.resolution?.answers || []).map((answer) => [\n answer.questionId,\n answer,\n ]),\n );\n\n return (\n <div className=\"a24-ask-user a24-ask-user--resolved w-full\">\n <button\n aria-expanded={open}\n className=\"group flex min-w-0 items-center gap-1.5 rounded-md px-0 py-0.5 text-start text-sm text-muted-foreground transition-colors hover:text-foreground motion-reduce:transition-none\"\n onClick={() => setOpen((value) => !value)}\n ref={buttonRef}\n type=\"button\"\n >\n <span>\n Asked {count} question{count === 1 ? \"\" : \"s\"}\n </span>\n {open ? (\n <ChevronDown aria-hidden=\"true\" className=\"size-3.5\" />\n ) : (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-3.5 opacity-70 rtl:rotate-180\"\n />\n )}\n </button>\n {open ? (\n <div className=\"mt-2 space-y-3 ps-4\">\n {part.questions.map((question) => (\n <div className=\"min-w-0\" key={question.id}>\n <div className=\"text-sm font-medium text-foreground\">\n {question.question}\n </div>\n <div className=\"mt-1 space-y-1 text-sm text-muted-foreground\">\n {resolvedAnswerText(\n question,\n answers.get(question.id),\n ).map((value, index) => (\n <div\n className=\"whitespace-pre-wrap break-words\"\n key={`${question.id}:${index}`}\n >\n {value}\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function AskUserInteraction({\n error,\n isBusy = false,\n onSubmit,\n part,\n}: AskUserInteractionProps) {\n const questions = part.questions;\n const [step, setStep] = React.useState(0);\n const [drafts, setDrafts] = React.useState<AskUserDrafts>(() =>\n emptyAskUserDrafts(questions),\n );\n const headingRef = React.useRef<HTMLHeadingElement>(null);\n const questionsRef = React.useRef(questions);\n const resolvedButtonRef = React.useRef<HTMLButtonElement>(null);\n const wasResolvedRef = React.useRef(part.status !== \"pending\");\n questionsRef.current = questions;\n\n React.useEffect(() => {\n setStep(0);\n setDrafts(emptyAskUserDrafts(questionsRef.current));\n }, [part.interruptId]);\n\n React.useEffect(() => {\n headingRef.current?.focus();\n }, [step]);\n\n React.useEffect(() => {\n const isResolved = part.status !== \"pending\";\n if (isResolved && !wasResolvedRef.current) {\n resolvedButtonRef.current?.focus();\n }\n wasResolvedRef.current = isResolved;\n }, [part.status]);\n\n if (part.status !== \"pending\") {\n return <ResolvedQuestions buttonRef={resolvedButtonRef} part={part} />;\n }\n\n const question = questions[step];\n if (!question) {\n return (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n This question request is unavailable.\n </div>\n );\n }\n\n const draft = drafts[question.id] || {\n customText: \"\",\n selectedOptionIds: [],\n };\n const isLastQuestion = step === questions.length - 1;\n const canMoveForward = askUserDraftHasAnswer(draft);\n\n const completeStep = (nextDrafts: AskUserDrafts) => {\n if (isLastQuestion) {\n onSubmit?.(askUserAnswersFromDrafts(questions, nextDrafts));\n return;\n }\n setStep((current) => Math.min(current + 1, questions.length - 1));\n };\n\n const selectOption = (optionId: string) => {\n const nextDrafts = selectAskUserOption({\n draft,\n drafts,\n optionId,\n question,\n });\n setDrafts(nextDrafts);\n if (!question.multiSelect) completeStep(nextDrafts);\n };\n\n const updateCustomText = (customText: string) => {\n setDrafts((current) =>\n updateAskUserCustomText({\n customText,\n drafts: current,\n question,\n }),\n );\n };\n\n return (\n <div className=\"a24-ask-user space-y-3 rounded-xl border border-border/50 bg-background p-4 shadow-sm\">\n <div className=\"flex min-w-0 items-start justify-between gap-4\">\n <h3\n className=\"min-w-0 flex-1 text-base font-medium leading-6 text-foreground outline-none\"\n ref={headingRef}\n tabIndex={-1}\n >\n {question.question}\n </h3>\n <div className=\"flex shrink-0 items-center gap-1 text-muted-foreground\">\n <button\n aria-label=\"Previous question\"\n className=\"flex size-8 items-center justify-center rounded-full transition-colors hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30\"\n disabled={isBusy || step === 0}\n onClick={() => setStep((current) => Math.max(0, current - 1))}\n type=\"button\"\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"size-4 rtl:rotate-180\"\n />\n </button>\n <span\n aria-label={`Question ${step + 1} of ${questions.length}`}\n className=\"min-w-12 text-center text-sm tabular-nums\"\n >\n {step + 1} / {questions.length}\n </span>\n <button\n aria-label={isLastQuestion ? \"Submit answers\" : \"Next question\"}\n className=\"flex size-8 items-center justify-center rounded-full transition-colors hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30\"\n disabled={isBusy || !onSubmit || !canMoveForward}\n onClick={() => completeStep(drafts)}\n type=\"button\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-4 rtl:rotate-180\"\n />\n </button>\n </div>\n </div>\n\n <div className=\"space-y-1\">\n {question.options.map((option, index) => {\n const selected = draft.selectedOptionIds.includes(option.id);\n return (\n <button\n aria-pressed={selected}\n className={cn(\n \"group flex min-h-11 w-full items-center gap-3 rounded-xl px-2.5 py-2 text-start text-sm transition-colors motion-reduce:transition-none\",\n selected ? \"bg-muted\" : \"hover:bg-muted/70\",\n )}\n disabled={isBusy || !onSubmit}\n key={option.id}\n onClick={() => selectOption(option.id)}\n type=\"button\"\n >\n <span\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-full border text-sm tabular-nums transition-colors\",\n selected\n ? \"border-border bg-background text-foreground\"\n : \"border-border/70 bg-muted/60 text-muted-foreground\",\n )}\n >\n {index + 1}\n </span>\n <span className=\"min-w-0 flex-1 font-medium text-foreground\">\n {option.label}\n </span>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 group-focus-visible:opacity-100 rtl:rotate-180\"\n />\n </button>\n );\n })}\n\n <div className=\"flex min-h-11 items-center gap-2 rounded-xl bg-muted px-2.5 py-1.5 focus-within:ring-1 focus-within:ring-ring\">\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-full border border-border/70 bg-background/70 text-muted-foreground\">\n <Pencil aria-hidden=\"true\" className=\"size-4\" />\n </span>\n <input\n aria-label=\"Other response\"\n autoComplete=\"off\"\n className=\"h-8 min-w-0 flex-1 bg-transparent px-1 text-sm text-foreground outline-none placeholder:text-muted-foreground\"\n disabled={isBusy || !onSubmit}\n maxLength={2000}\n onChange={(event) => updateCustomText(event.target.value)}\n onKeyDown={(event) => {\n if (\n event.key === \"Enter\" &&\n !event.nativeEvent.isComposing &&\n draft.customText.trim()\n ) {\n event.preventDefault();\n completeStep(drafts);\n }\n }}\n placeholder=\"Other…\"\n value={draft.customText}\n />\n {draft.customText.trim() ? (\n <button\n className=\"h-8 shrink-0 rounded-full bg-foreground px-4 text-sm font-medium text-background transition-colors hover:opacity-85 disabled:opacity-50\"\n disabled={isBusy || !onSubmit}\n onClick={() => completeStep(drafts)}\n type=\"button\"\n >\n {isLastQuestion ? \"Submit\" : \"Next\"}\n </button>\n ) : null}\n </div>\n </div>\n\n {error ? (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {error}\n </div>\n ) : null}\n </div>\n );\n}\n","import type {\n ChatHitlAnswer,\n ChatHitlQuestion,\n} from \"../types\";\n\nexport type AskUserDraftAnswer = {\n customText: string;\n selectedOptionIds: string[];\n};\n\nexport type AskUserDrafts = Record<string, AskUserDraftAnswer>;\n\nexport function emptyAskUserDrafts(\n questions: ChatHitlQuestion[],\n): AskUserDrafts {\n return Object.fromEntries(\n questions.map((question) => [\n question.id,\n { customText: \"\", selectedOptionIds: [] },\n ]),\n );\n}\n\nexport function askUserDraftHasAnswer(\n draft: AskUserDraftAnswer | undefined,\n): boolean {\n return Boolean(\n draft &&\n (draft.selectedOptionIds.length > 0 ||\n draft.customText.trim().length > 0),\n );\n}\n\nexport function selectAskUserOption({\n draft,\n drafts,\n optionId,\n question,\n}: {\n draft: AskUserDraftAnswer;\n drafts: AskUserDrafts;\n optionId: string;\n question: ChatHitlQuestion;\n}): AskUserDrafts {\n const selectedOptionIds = question.multiSelect\n ? draft.selectedOptionIds.includes(optionId)\n ? draft.selectedOptionIds.filter((id) => id !== optionId)\n : [...draft.selectedOptionIds, optionId]\n : [optionId];\n return {\n ...drafts,\n [question.id]: {\n customText: \"\",\n selectedOptionIds,\n },\n };\n}\n\nexport function updateAskUserCustomText({\n customText,\n drafts,\n question,\n}: {\n customText: string;\n drafts: AskUserDrafts;\n question: ChatHitlQuestion;\n}): AskUserDrafts {\n return {\n ...drafts,\n [question.id]: {\n customText,\n selectedOptionIds: question.multiSelect\n ? drafts[question.id]?.selectedOptionIds || []\n : [],\n },\n };\n}\n\nexport function askUserAnswersFromDrafts(\n questions: ChatHitlQuestion[],\n drafts: AskUserDrafts,\n): ChatHitlAnswer[] {\n return questions.map((question) => {\n const answer = drafts[question.id];\n return {\n questionId: question.id,\n selectedOptionIds: answer?.selectedOptionIds || [],\n ...(answer?.customText.trim()\n ? { customText: answer.customText.trim() }\n : {}),\n };\n });\n}\n","import type { ChatContextCompressionPart } from \"@agents24/react\";\nimport * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nfunction compressionPresentation(part: ChatContextCompressionPart): {\n label: string;\n status: \"completed\" | \"failed\" | \"running\";\n} {\n if (part.status === \"failed\") {\n return { label: \"Could not compact message history\", status: \"failed\" };\n }\n if (part.status === \"completed\") {\n return { label: \"Compacted message history\", status: \"completed\" };\n }\n return { label: \"Compacting message history\", status: \"running\" };\n}\n\nexport function AgentChatContextCompressionRow({\n className,\n part,\n}: {\n className?: string;\n part: ChatContextCompressionPart;\n}) {\n const presentation = compressionPresentation(part);\n return (\n <div\n aria-live=\"polite\"\n className={cn(\"a24-context-compression-row\", className)}\n data-agents24-context-compression=\"\"\n data-status={part.status}\n role=\"status\"\n >\n <div className=\"a24-tool-trigger-row\">\n <div className={cn(\n \"a24-tool-trigger a24-tool-trigger--root a24-tool-trigger--without-orb\",\n presentation.status === \"failed\" && \"a24-tool-trigger--error\",\n presentation.status === \"running\" && \"a24-tool-trigger--active\",\n )}>\n <span className={cn(\n \"a24-tool-trigger__label\",\n presentation.status === \"running\" && \"a24-tool-shimmer\",\n )}>\n {presentation.label}\n </span>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { defaultRehypePlugins, Streamdown } from \"streamdown\";\n\nimport { CHAT_MARKDOWN_HARDEN_OPTIONS, safeChatMarkdownHref } from \"../active-content\";\nimport { useStreamingText } from \"../streaming-text\";\nimport { cn } from \"./utils\";\n\nexport type MessageResponseProps = React.ComponentProps<typeof Streamdown> & {\n streaming?: boolean;\n streamingId?: string;\n};\n\ntype MarkdownNode = {\n tagName?: string;\n position?: {\n start?: { line?: number };\n end?: { line?: number };\n };\n};\n\ntype MarkdownElementProps = {\n children?: React.ReactNode;\n node?: MarkdownNode;\n};\n\nfunction SafeMarkdownLink({ children, href, ...props }: React.ComponentProps<\"a\"> & MarkdownElementProps) {\n const domProps = { ...props };\n delete domProps.node;\n const safeHref = safeChatMarkdownHref(href);\n if (!safeHref) return <span>{children}</span>;\n if (safeHref.startsWith(\"#\")) return <a {...domProps} href={safeHref}>{children}</a>;\n return <a {...domProps} href={safeHref} rel=\"noopener noreferrer\" target=\"_blank\">{children}</a>;\n}\n\nfunction BlockedMarkdownImage({ alt }: React.ComponentProps<\"img\"> & MarkdownElementProps) {\n return alt ? <span aria-label={`Image blocked: ${alt}`} role=\"img\">{alt}</span> : null;\n}\n\nconst BLOCK_MARKDOWN_TAGS = new Set([\n \"blockquote\",\n \"div\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"ol\",\n \"pre\",\n \"table\",\n \"ul\",\n]);\n\nfunction isMultilineCodeNode(node?: MarkdownNode) {\n return (\n node?.tagName === \"code\" &&\n node.position?.start?.line !== undefined &&\n node.position?.end?.line !== undefined &&\n node.position.start.line !== node.position.end.line\n );\n}\n\nfunction hasBlockMarkdownChild(child: React.ReactNode): boolean {\n if (!React.isValidElement(child)) {\n return false;\n }\n\n if (typeof child.type === \"string\" && BLOCK_MARKDOWN_TAGS.has(child.type)) {\n return true;\n }\n\n const props = child.props as MarkdownElementProps;\n if (BLOCK_MARKDOWN_TAGS.has(props.node?.tagName || \"\") || isMultilineCodeNode(props.node)) {\n return true;\n }\n\n return React.Children.toArray(props.children).some(hasBlockMarkdownChild);\n}\n\nfunction MessageMarkdownParagraph({\n children,\n ...props\n}: React.ComponentProps<\"p\"> & MarkdownElementProps) {\n const domProps = { ...props };\n delete domProps.node;\n const childArray = React.Children.toArray(children).filter(\n (child) => child !== null && child !== \"\"\n );\n const isImageOnly =\n childArray.length === 1 &&\n React.isValidElement(childArray[0]) &&\n (childArray[0].props as MarkdownElementProps).node?.tagName === \"img\";\n\n if (isImageOnly) {\n return <>{children}</>;\n }\n\n if (childArray.some(hasBlockMarkdownChild)) {\n return <div {...domProps}>{children}</div>;\n }\n\n return <p {...domProps}>{children}</p>;\n}\n\ntype StreamdownComponents = NonNullable<\n React.ComponentProps<typeof Streamdown>[\"components\"]\n>;\n\nconst MESSAGE_RESPONSE_COMPONENTS = {\n a: SafeMarkdownLink,\n img: BlockedMarkdownImage,\n p: MessageMarkdownParagraph,\n} satisfies StreamdownComponents;\n\ntype StreamdownRehypePlugins = NonNullable<\n React.ComponentProps<typeof Streamdown>[\"rehypePlugins\"]\n>;\n\nconst streamdownDefaultRehypePlugins = (defaultRehypePlugins || {}) as Record<\n string,\n unknown\n>;\nconst streamdownHardenPlugin = Array.isArray(\n streamdownDefaultRehypePlugins.harden\n)\n ? streamdownDefaultRehypePlugins.harden[0]\n : streamdownDefaultRehypePlugins.harden;\n\nconst MESSAGE_RESPONSE_REHYPE_PLUGINS = [\n ...Object.entries(streamdownDefaultRehypePlugins)\n .filter(([key]) => key !== \"harden\")\n .map(([, plugin]) => plugin),\n ...(streamdownHardenPlugin\n ? [\n [\n streamdownHardenPlugin,\n CHAT_MARKDOWN_HARDEN_OPTIONS,\n ],\n ]\n : []),\n] as StreamdownRehypePlugins;\n\nexport const MessageResponse = React.memo(\n ({\n children,\n className,\n components,\n rehypePlugins,\n streaming = false,\n streamingId,\n ...props\n }: MessageResponseProps) => {\n const text =\n typeof children === \"string\" || typeof children === \"number\"\n ? String(children)\n : \"\";\n const streamingText = useStreamingText({\n charsPerSecond: 120,\n id: streamingId || text,\n isStreaming: streaming && text.length > 0,\n maxCatchupChars: 32,\n text,\n });\n const streamdownComponents = React.useMemo<StreamdownComponents>(\n () => ({ ...MESSAGE_RESPONSE_COMPONENTS, ...components }) as StreamdownComponents,\n [components]\n );\n\n return (\n <Streamdown\n className={cn(\"a24-message-response\", className)}\n components={streamdownComponents}\n rehypePlugins={rehypePlugins || MESSAGE_RESPONSE_REHYPE_PLUGINS}\n {...props}\n >\n {text ? streamingText.displayedText : children}\n </Streamdown>\n );\n },\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children &&\n prevProps.className === nextProps.className &&\n prevProps.streaming === nextProps.streaming &&\n prevProps.streamingId === nextProps.streamingId &&\n prevProps.components === nextProps.components\n);\n\nMessageResponse.displayName = \"MessageResponse\";\n","export const CHAT_MARKDOWN_HARDEN_OPTIONS = Object.freeze({\n allowDataImages: false,\n allowedImagePrefixes: [] as string[],\n allowedLinkPrefixes: [\"*\"],\n allowedProtocols: [] as string[],\n defaultOrigin: undefined,\n imageBlockPolicy: \"text-only\" as const,\n linkBlockPolicy: \"text-only\" as const,\n});\n\nexport function safeChatMarkdownHref(value?: string): string | undefined {\n if (!value) return undefined;\n if (value.startsWith(\"#\")) return value;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n","import type { ChatHitlAction, ChatHitlPart } from \"../types\";\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nexport function hitlActionLabel(part: ChatHitlPart, action: ChatHitlAction): string {\n if (action === \"approve\") return [\"tool_review\", \"app_data_permission\"].includes(part.hitlKind) ? \"Allow once\" : \"Approve\";\n if (action === \"reject\") return [\"tool_review\", \"app_data_permission\"].includes(part.hitlKind) ? \"Don’t allow\" : \"Reject\";\n if (action === \"connect\") return \"Connect\";\n if (action === \"respond\") return \"Submit\";\n return \"Skip\";\n}\n\nexport function hitlTitle(part: ChatHitlPart): string {\n const presentation = part.presentation || {};\n if (part.hitlKind === \"tool_review\") return `Run ${optionalString(presentation.tool_name) || \"this tool\"}?`;\n if (part.hitlKind === \"mcp_auth\") {\n const serverName = optionalString(presentation.server_name);\n return serverName ? `Connect ${serverName} to continue` : part.message;\n }\n if (part.hitlKind === \"app_data_permission\") return \"Allow this data change?\";\n return part.message;\n}\n\nexport function resolvedHitlLabel(part: ChatHitlPart): string {\n const outcome = String(part.resolution?.outcome || part.status).trim().toLowerCase();\n return {\n approved: part.hitlKind === \"user_approval\" ? \"Approved\" : \"Allowed\",\n rejected: part.hitlKind === \"user_approval\" ? \"Rejected\" : \"Not allowed\",\n connected: \"connected\",\n skipped: \"Skipped\",\n timeout: \"Timed out\",\n expired: \"Timed out\",\n cancelled: \"Cancelled\",\n invalidated: \"No longer available\",\n policy_denied: \"Not allowed\",\n }[outcome] || outcome.replace(/_/g, \" \");\n}\n","import * as React from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { ThinkingOrb } from \"thinking-orbs\";\n\nimport type { ChatModelTurnPart, ChatNodeActivityPart, ChatPart, ChatToolChild, ChatToolPart } from \"../types\";\nimport { cn } from \"./utils\";\n\nexport type AgentChatToolViewMode = \"closed\" | \"expanded\";\n\nexport type AgentChatToolTimelineSegment =\n | { kind: \"part\"; part: ChatPart }\n | { kind: \"subagent\"; part: ChatToolPart }\n | { kind: \"tool\"; part: ChatToolPart }\n | { kind: \"tool-session\"; parts: ChatToolPart[]; leadingModelTurn?: ChatModelTurnPart; modelTurn?: ChatModelTurnPart };\n\nexport type AgentChatToolSlotContext = {\n isActive: boolean;\n label: string;\n part: ChatToolPart;\n};\n\nexport type AgentChatToolSlots = {\n onExpandedChange?: (open: boolean, part?: ChatToolPart) => void;\n onToolSelect?: (part: ChatToolPart) => void;\n renderChildTool?: (child: ChatToolChild, part: ChatToolPart) => React.ReactNode;\n renderToolAccessory?: (context: AgentChatToolSlotContext) => React.ReactNode;\n renderToolDetails?: (part: ChatToolPart) => React.ReactNode;\n renderToolLabel?: (context: AgentChatToolSlotContext) => React.ReactNode;\n};\n\nexport function agentChatToolLabel(part: ChatToolPart): string {\n const presentation = part.presentation || {};\n return optionalText(presentation.activity)\n || optionalText(presentation.title)\n || optionalText(part.displayName)\n || optionalText(part.summary)\n || optionalText(part.toolName)\n || \"Tool activity\";\n}\n\nexport function isAgentChatSubagent(part: ChatToolPart): boolean {\n const sourceKind = String(part.sourceKind || \"\").trim().toLowerCase();\n return sourceKind === \"agent\" || sourceKind === \"agent_call\" || Boolean(part.presentation.childRun);\n}\n\nexport function isAgentChatToolRunning(part: ChatToolPart): boolean {\n return part.state === \"input-available\" || part.state === \"input-streaming\";\n}\n\nexport function latestRunningAgentChatToolId(parts: readonly ChatToolPart[]): string | null {\n const active = [...parts].reverse().find(isAgentChatToolRunning);\n return active?.toolCallId || active?.id || null;\n}\n\nexport function partitionAgentChatToolTimeline(\n parts: readonly ChatPart[],\n toolViewMode: AgentChatToolViewMode = \"closed\",\n): AgentChatToolTimelineSegment[] {\n const segments: AgentChatToolTimelineSegment[] = [];\n let index = 0;\n while (index < parts.length) {\n const part = parts[index];\n const leadingModelTurn = part.kind === \"model-turn\"\n && parts[index + 1]?.kind === \"tool\"\n && !isAgentChatSubagent(parts[index + 1] as ChatToolPart)\n ? part as ChatModelTurnPart\n : undefined;\n if (leadingModelTurn) index += 1;\n const candidate = parts[index];\n if (candidate.kind !== \"tool\") {\n segments.push({ kind: \"part\", part: candidate });\n index += 1;\n continue;\n }\n if (isAgentChatSubagent(candidate)) {\n segments.push({ kind: \"subagent\", part: candidate });\n index += 1;\n continue;\n }\n const streak: ChatToolPart[] = [];\n while (index < parts.length) {\n const candidate = parts[index];\n if (candidate.kind !== \"tool\" || isAgentChatSubagent(candidate)) break;\n streak.push(candidate);\n index += 1;\n }\n const modelTurn = parts[index]?.kind === \"model-turn\" ? parts[index] as ChatModelTurnPart : undefined;\n if (modelTurn) index += 1;\n if (toolViewMode === \"expanded\") {\n if (leadingModelTurn) segments.push({ kind: \"part\", part: leadingModelTurn });\n segments.push(...streak.map((toolPart) => ({ kind: \"tool\" as const, part: toolPart })));\n if (modelTurn) segments.push({ kind: \"part\", part: modelTurn });\n } else if (streak.length === 1 && !modelTurn && !leadingModelTurn) {\n segments.push({ kind: \"tool\", part: streak[0] });\n } else {\n segments.push({\n kind: \"tool-session\",\n parts: streak,\n ...(leadingModelTurn ? { leadingModelTurn } : {}),\n ...(modelTurn ? { modelTurn } : {}),\n });\n }\n }\n return segments;\n}\n\nfunction optionalText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction isActive(part: ChatToolPart, activeToolId?: string | null): boolean {\n return Boolean(activeToolId && (part.id === activeToolId || part.toolCallId === activeToolId));\n}\n\nfunction ToolActivityReel({\n announce = true,\n initialLabel,\n initialShownAt,\n label,\n}: {\n announce?: boolean;\n initialLabel?: string;\n initialShownAt?: string | null;\n label: string;\n}) {\n const initial = initialLabel && initialLabel !== label ? initialLabel : label;\n const parsedInitialShownAt = initialShownAt ? Date.parse(initialShownAt) : Number.NaN;\n const [displayed, setDisplayed] = React.useState(initial);\n const [previous, setPrevious] = React.useState<string | null>(null);\n const displayedRef = React.useRef(initial);\n const latestRef = React.useRef(label);\n const shownAtRef = React.useRef(Number.isFinite(parsedInitialShownAt) ? parsedInitialShownAt : Date.now());\n React.useEffect(() => {\n latestRef.current = label;\n if (displayedRef.current === label) return;\n const showLatest = () => {\n const next = latestRef.current;\n if (displayedRef.current === next) return;\n const old = displayedRef.current;\n displayedRef.current = next;\n shownAtRef.current = Date.now();\n setPrevious(old);\n setDisplayed(next);\n };\n const remaining = Math.max(0, 500 - (Date.now() - shownAtRef.current));\n if (remaining === 0) {\n showLatest();\n return;\n }\n const timer = window.setTimeout(showLatest, remaining);\n return () => window.clearTimeout(timer);\n }, [label]);\n React.useEffect(() => {\n if (!previous) return;\n const timer = window.setTimeout(() => setPrevious(null), 200);\n return () => window.clearTimeout(timer);\n }, [previous]);\n return (\n <span className=\"a24-tool-reel\" aria-live={announce ? \"polite\" : \"off\"}>\n {previous ? <span aria-hidden=\"true\" className=\"a24-tool-reel__previous\">{previous}</span> : null}\n <span className={previous ? \"a24-tool-reel__current\" : undefined}>{displayed}</span>\n </span>\n );\n}\n\nfunction ToolActivityOrb({ label }: { label?: string }) {\n return (\n <span className=\"a24-tool-orb\">\n <ThinkingOrb aria-label={label || \"Working\"} size={20} speed={0.8} state=\"searching\" />\n </span>\n );\n}\n\nexport function AgentChatActivityRow({\n label,\n modelTurnId,\n onSelect,\n}: {\n label: string;\n modelTurnId?: string;\n onSelect?: () => void;\n}) {\n const content = (\n <>\n <ToolActivityOrb label={label} />\n <span className=\"a24-tool-trigger__label a24-tool-shimmer\"><ToolActivityReel label={label} /></span>\n </>\n );\n return (\n <div className=\"a24-tool-trigger-row\" data-agents24-model-turn={modelTurnId} role=\"status\">\n {onSelect ? (\n <button className=\"a24-tool-trigger a24-tool-trigger--root a24-tool-trigger--active\" onClick={onSelect} type=\"button\">{content}</button>\n ) : (\n <div className=\"a24-tool-trigger a24-tool-trigger--root a24-tool-trigger--active\">{content}</div>\n )}\n </div>\n );\n}\n\nexport function AgentChatModelTurnRow({ part }: { part: ChatModelTurnPart }) {\n return <AgentChatActivityRow label=\"Planning next moves\" modelTurnId={part.modelTurnId} />;\n}\n\nexport function AgentChatNodeActivityRow({\n onSelect,\n part,\n}: {\n onSelect?: (part: ChatNodeActivityPart) => void;\n part: ChatNodeActivityPart;\n}) {\n const [open, setOpen] = React.useState(false);\n const contentId = React.useId();\n const running = part.status === \"running\";\n const failed = part.status === \"failed\";\n const failureMessage = part.failure?.message || \"The node could not complete the request.\";\n const triggerClassName = cn(\n \"a24-tool-trigger\",\n \"a24-tool-trigger--root\",\n !running && \"a24-tool-trigger--without-orb\",\n running && \"a24-tool-trigger--active\",\n failed && \"a24-tool-trigger--error\",\n );\n const label = running\n ? <span className=\"a24-tool-shimmer\"><ToolActivityReel label={part.label} /></span>\n : part.label;\n if (!failed) {\n return (\n <div className=\"a24-tool-trigger-row\" role=\"status\">\n {onSelect ? (\n <button className={triggerClassName} onClick={() => onSelect(part)} type=\"button\">\n {running ? <ToolActivityOrb label={part.label} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </button>\n ) : (\n <div className={triggerClassName}>\n {running ? <ToolActivityOrb label={part.label} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </div>\n )}\n </div>\n );\n }\n return (\n <div className=\"a24-tool-disclosure\">\n <div className=\"a24-tool-trigger-row\">\n <button\n aria-controls={contentId}\n aria-expanded={open}\n className={triggerClassName}\n onClick={() => {\n onSelect?.(part);\n setOpen((value) => !value);\n }}\n type=\"button\"\n >\n <span className=\"a24-tool-trigger__label\">{label}</span>\n {open ? <ChevronDown aria-hidden=\"true\" className=\"a24-tool-trigger__chevron\" /> : <ChevronRight aria-hidden=\"true\" className=\"a24-tool-trigger__chevron\" />}\n </button>\n </div>\n {open ? <div className=\"a24-tool-detail a24-tool-detail--error\" id={contentId}>{failureMessage}</div> : null}\n </div>\n );\n}\n\nfunction toolRowLabel(part: ChatToolPart): string {\n const label = agentChatToolLabel(part);\n return isAgentChatToolRunning(part) ? label : label.replace(/^(?:running|ran)\\s+/i, \"\");\n}\n\nfunction ToolDisclosure({\n children,\n error,\n grouped,\n label,\n loading,\n onExpandedChange,\n onSelect,\n part,\n root,\n showOrb,\n statusLabel,\n accessory,\n}: {\n accessory?: React.ReactNode;\n children?: React.ReactNode;\n error?: boolean;\n grouped?: boolean;\n label: React.ReactNode;\n loading?: boolean;\n onExpandedChange?: AgentChatToolSlots[\"onExpandedChange\"];\n onSelect?: AgentChatToolSlots[\"onToolSelect\"];\n part?: ChatToolPart;\n root?: boolean;\n showOrb?: boolean;\n statusLabel?: string;\n}) {\n const [open, setOpen] = React.useState(false);\n const contentId = React.useId();\n const expandable = React.Children.toArray(children).length > 0;\n if (!expandable) {\n const triggerClassName = cn(\"a24-tool-trigger\", root && \"a24-tool-trigger--root\", root && !showOrb && \"a24-tool-trigger--without-orb\", error && \"a24-tool-trigger--error\", loading && \"a24-tool-trigger--active\");\n return (\n <div className=\"a24-tool-trigger-row\">\n {onSelect && part ? (\n <button className={triggerClassName} onClick={() => onSelect(part)} type=\"button\">\n {showOrb ? <ToolActivityOrb label={statusLabel} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </button>\n ) : (\n <div className={triggerClassName}>\n {showOrb ? <ToolActivityOrb label={statusLabel} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </div>\n )}\n {accessory}\n </div>\n );\n }\n return (\n <div className=\"a24-tool-disclosure\">\n <div className=\"a24-tool-trigger-row\">\n <button\n aria-controls={contentId}\n aria-expanded={open}\n className={cn(\"a24-tool-trigger\", root && \"a24-tool-trigger--root\", root && !showOrb && \"a24-tool-trigger--without-orb\", error && \"a24-tool-trigger--error\", loading && \"a24-tool-trigger--active\")}\n onClick={() => {\n const nextOpen = !open;\n setOpen(nextOpen);\n if (part) onSelect?.(part);\n onExpandedChange?.(nextOpen, part);\n }}\n type=\"button\"\n >\n {showOrb ? <ToolActivityOrb label={statusLabel} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n {open ? <ChevronDown aria-hidden=\"true\" className=\"a24-tool-trigger__chevron\" /> : <ChevronRight aria-hidden=\"true\" className=\"a24-tool-trigger__chevron\" />}\n </button>\n {accessory}\n </div>\n {open ? <div className=\"a24-tool-disclosure__content\" id={contentId}>{children}</div> : null}\n </div>\n );\n}\n\nfunction ToolLabel({ active, label, part, slots }: { active: boolean; label: string; part: ChatToolPart; slots?: AgentChatToolSlots }) {\n const rendered = slots?.renderToolLabel?.({ isActive: active, label, part }) ?? label;\n return active ? <span className=\"a24-tool-shimmer\">{rendered}</span> : <>{rendered}</>;\n}\n\nfunction ToolList({ children }: { children: React.ReactNode }) {\n const listRef = React.useRef<HTMLDivElement>(null);\n const [fades, setFades] = React.useState({ bottom: false, top: false });\n const updateFades = React.useCallback(() => {\n const list = listRef.current;\n if (!list) return;\n const next = {\n bottom: list.scrollTop + list.clientHeight < list.scrollHeight - 1,\n top: list.scrollTop > 1,\n };\n setFades((current) => current.bottom === next.bottom && current.top === next.top ? current : next);\n }, []);\n\n React.useEffect(() => {\n updateFades();\n const list = listRef.current;\n if (!list || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(updateFades);\n observer.observe(list);\n return () => observer.disconnect();\n }, [children, updateFades]);\n\n return (\n <div\n className=\"a24-tool-list-frame\"\n data-scroll-fade-bottom={fades.bottom ? \"\" : undefined}\n data-scroll-fade-top={fades.top ? \"\" : undefined}\n >\n <div className=\"a24-tool-list\" onScroll={updateFades} ref={listRef} role=\"list\">\n {children}\n </div>\n </div>\n );\n}\n\nexport function AgentChatToolRow({\n activeToolId,\n part,\n root = true,\n showOrb,\n slots,\n}: {\n activeToolId?: string | null;\n part: ChatToolPart;\n root?: boolean;\n showOrb?: boolean;\n slots?: AgentChatToolSlots;\n}) {\n const active = isActive(part, activeToolId);\n const failed = part.state === \"output-error\";\n const failureMessage = part.failure?.message || null;\n const detail = failed ? failureMessage : optionalText(part.presentation.detail);\n const hostDetails = failed ? null : slots?.renderToolDetails?.(part);\n const context = { isActive: active, label: toolRowLabel(part), part };\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <ToolDisclosure\n error={failed}\n accessory={slots?.renderToolAccessory?.(context)}\n label={<ToolLabel active={active} label={context.label} part={part} slots={slots} />}\n loading={active}\n onExpandedChange={slots?.onExpandedChange}\n onSelect={slots?.onToolSelect}\n part={part}\n root={root}\n showOrb={showOrb ?? active}\n statusLabel={active ? context.label : undefined}\n >\n {detail ? <div className={cn(\"a24-tool-detail\", failed && \"a24-tool-detail--error\")}>{detail}</div> : null}\n {hostDetails}\n </ToolDisclosure>\n </div>\n );\n}\n\nfunction sessionLabel(parts: readonly ChatToolPart[], visiblePart: ChatToolPart, running: boolean): string {\n const label = agentChatToolLabel(visiblePart);\n const terminalLabel = label.replace(/^(?:running|ran)\\s+/i, \"\");\n return running ? label : `Ran ${terminalLabel} + ${parts.length - 1} more`;\n}\n\nexport function AgentChatToolSession({\n activeToolId,\n isLatestActivity = true,\n isLive = false,\n leadingModelTurn,\n modelTurn,\n parts,\n slots,\n}: {\n activeToolId?: string | null;\n isLatestActivity?: boolean;\n isLive?: boolean;\n leadingModelTurn?: ChatModelTurnPart;\n modelTurn?: ChatModelTurnPart;\n parts: readonly ChatToolPart[];\n slots?: AgentChatToolSlots;\n}) {\n const presentedLiveRef = React.useRef(false);\n if (isLive && isLatestActivity) presentedLiveRef.current = true;\n const activeIndex = parts.findLastIndex((part) => isActive(part, activeToolId));\n const running = activeIndex >= 0;\n if (parts.length === 1 && !modelTurn && !leadingModelTurn) return <AgentChatToolRow activeToolId={activeToolId} part={parts[0]} slots={slots} />;\n const visibleIndex = running ? activeIndex : parts.length - 1;\n const visiblePart = parts[visibleIndex];\n const planning = Boolean(modelTurn);\n const presentingActivity = isLatestActivity && (planning || running || isLive);\n const failed = isLatestActivity\n && (visiblePart.state === \"output-error\" || visiblePart.state === \"cancelled\");\n const label = planning\n ? \"Planning next moves\"\n : isLive && isLatestActivity\n ? agentChatToolLabel(visiblePart)\n : sessionLabel(parts, visiblePart, running);\n const labelContent = presentedLiveRef.current\n ? <span className={presentingActivity ? \"a24-tool-shimmer\" : undefined}><ToolActivityReel initialLabel={leadingModelTurn ? \"Planning next moves\" : undefined} initialShownAt={leadingModelTurn?.timestamp} label={label} /></span>\n : label;\n const context = { isActive: presentingActivity, label, part: visiblePart };\n return (\n <ToolDisclosure\n accessory={slots?.renderToolAccessory?.(context)}\n error={failed}\n grouped\n label={labelContent}\n loading={presentingActivity}\n onExpandedChange={slots?.onExpandedChange}\n part={visiblePart}\n root\n showOrb={isLive && isLatestActivity}\n statusLabel={planning ? \"Planning next moves\" : label}\n >\n <ToolList>\n {parts.map((part) => <div key={part.id} role=\"listitem\"><AgentChatToolRow activeToolId={activeToolId} part={part} root={false} showOrb={false} slots={slots} /></div>)}\n </ToolList>\n </ToolDisclosure>\n );\n}\n\nfunction childLabel(child: ChatToolChild): string {\n return optionalText(child.title) || optionalText(child.toolName) || \"Tool\";\n}\n\nfunction subagentLabel(part: ChatToolPart): { label: string; running: boolean } {\n const childRun = part.presentation.childRun;\n const children = part.presentation.childTools || [];\n const name = optionalText(childRun?.agentName) || optionalText(part.displayName) || \"agent\";\n const status = String(childRun?.status || (isAgentChatToolRunning(part) ? \"running\" : \"completed\")).toLowerCase();\n const activeChild = children.find((child) => child.id === part.presentation.activeChildToolId)\n || [...children].reverse().find((child) => child.status === \"running\")\n || children[children.length - 1];\n if (status === \"running\" && activeChild) return { label: `Agent ${name}, running ${childLabel(activeChild)}`, running: true };\n if (status === \"running\") return { label: `Agent ${name}, starting`, running: true };\n if (status === \"failed\" || part.state === \"output-error\") return { label: `Agent ${name}, failed`, running: false };\n if (status === \"cancelled\" || status === \"canceled\" || part.state === \"cancelled\") return { label: `Agent ${name}, cancelled`, running: false };\n if (status === \"paused\") return { label: `Agent ${name}, paused`, running: false };\n return { label: `Agent ${name}, ran ${children.length} ${children.length === 1 ? \"tool\" : \"tools\"}`, running: false };\n}\n\nexport function AgentChatSubagentGroup({ isLatestActivity = true, isLive = false, part, slots }: { isLatestActivity?: boolean; isLive?: boolean; part: ChatToolPart; slots?: AgentChatToolSlots }) {\n const presentedLiveRef = React.useRef(false);\n if (isLive && isLatestActivity) presentedLiveRef.current = true;\n const children = part.presentation.childTools || [];\n const state = subagentLabel(part);\n const childRunStatus = String(part.presentation.childRun?.status || \"\").toLowerCase();\n const failed = part.state === \"output-error\"\n || part.state === \"cancelled\"\n || childRunStatus === \"failed\"\n || childRunStatus === \"cancelled\"\n || childRunStatus === \"canceled\";\n const hostDetails = failed ? null : slots?.renderToolDetails?.(part);\n const failureMessage = part.failure?.message || null;\n const presentingActivity = isLatestActivity && state.running;\n const labelContent = presentedLiveRef.current\n ? <span className={presentingActivity ? \"a24-tool-shimmer\" : undefined}><ToolActivityReel label={state.label} /></span>\n : state.label;\n const context = { isActive: presentingActivity, label: state.label, part };\n return (\n <ToolDisclosure\n accessory={slots?.renderToolAccessory?.(context)}\n error={failed}\n grouped\n label={labelContent}\n loading={presentingActivity}\n onExpandedChange={slots?.onExpandedChange}\n part={part}\n root\n showOrb={isLive && isLatestActivity}\n statusLabel={state.label}\n >\n <ToolList>\n {children.map((child) => (\n <div className={cn(\"a24-child-tool\", child.status === \"failed\" && \"a24-child-tool--error\")} key={child.id} role=\"listitem\">\n {slots?.renderChildTool?.(child, part) ?? (\n <>\n <span className={cn(isLive && isLatestActivity && child.status === \"running\" && \"a24-tool-shimmer\")}>{childLabel(child)}</span>\n {child.detail ? <span className=\"a24-child-tool__detail\">{child.detail}</span> : null}\n </>\n )}\n </div>\n ))}\n {failureMessage ? <div className=\"a24-tool-detail a24-tool-detail--error\">{failureMessage}</div> : null}\n {hostDetails}\n </ToolList>\n </ToolDisclosure>\n );\n}\n","import type { ContextWindow } from \"@agents24/client/protocol\";\nimport * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nconst COMPACT_TOKENS = new Intl.NumberFormat(\"en-US\", { notation: \"compact\" });\nconst PERCENT = new Intl.NumberFormat(\"en-US\", {\n style: \"percent\",\n maximumFractionDigits: 1,\n});\nconst EXACT_SOURCES = new Set([\"exact\", \"provider_usage\"]);\n\nexport type AgentChatContextStatusProps = {\n className?: string;\n contextWindow?: ContextWindow | null;\n};\n\nexport function contextStatusMetrics(contextWindow?: ContextWindow | null) {\n const maximum = Number(contextWindow?.max_tokens || 0);\n const input = Math.max(0, Number(contextWindow?.input_tokens || 0));\n const admissionInput = Math.max(0, Number(contextWindow?.admission_input_tokens ?? input));\n const usageRatio = Math.max(0, Math.min(1, Number(\n contextWindow?.usage_ratio ?? (input / maximum),\n )));\n const admissionRatio = Math.max(0, Math.min(1, Number(\n contextWindow?.admission_ratio ?? (admissionInput / maximum),\n )));\n return { maximum, input, admissionInput, usageRatio, admissionRatio };\n}\n\nexport function AgentChatContextStatus({\n className,\n contextWindow,\n}: AgentChatContextStatusProps) {\n const tooltipId = React.useId();\n const [open, setOpen] = React.useState(false);\n const { maximum, input, admissionInput, usageRatio, admissionRatio } = contextStatusMetrics(contextWindow);\n const percentage = Math.round(usageRatio * 100);\n const exact = EXACT_SOURCES.has(contextWindow?.source || \"unknown\");\n\n if (!Number.isFinite(maximum) || maximum <= 0) return null;\n\n return (\n <div\n className={cn(\"a24-context-status\", className)}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOpen(false);\n }}\n onFocusCapture={() => setOpen(true)}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button\n aria-describedby={open ? tooltipId : undefined}\n aria-label={`Context window ${percentage}% used`}\n className=\"a24-context-status__trigger\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\") setOpen(false);\n }}\n type=\"button\"\n >\n <svg aria-hidden=\"true\" className=\"a24-context-status__ring\" viewBox=\"0 0 24 24\">\n <circle className=\"a24-context-status__track\" cx=\"12\" cy=\"12\" r=\"10\" />\n <circle\n className=\"a24-context-status__value\"\n cx=\"12\"\n cy=\"12\"\n pathLength=\"100\"\n r=\"10\"\n strokeDasharray={`${percentage} 100`}\n />\n </svg>\n <span>{percentage}%</span>\n </button>\n {open ? (\n <div className=\"a24-context-status__popover\" id={tooltipId} role=\"tooltip\">\n <span className=\"a24-context-status__sr-only\">Context window</span>\n <strong>{PERCENT.format(usageRatio)} context used</strong>\n <span>\n {exact ? \"Input\" : \"Estimated input\"}: {COMPACT_TOKENS.format(input)} / {COMPACT_TOKENS.format(maximum)} tokens\n </span>\n {admissionInput !== input ? (\n <span>\n Safety bound: {COMPACT_TOKENS.format(admissionInput)} tokens ({PERCENT.format(admissionRatio)})\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { cn } from \"./utils\";\n\nfunction BubbleGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"bubble-group\"\n className={cn(\"flex min-w-0 flex-col gap-2\", className)}\n {...props}\n />\n );\n}\n\nconst bubbleVariants = cva(\n \"group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full\",\n {\n variants: {\n variant: {\n default:\n \"*:data-[slot=bubble-content]:bg-neutral-900 *:data-[slot=bubble-content]:text-white [&>[data-slot=bubble-content]:is(button,a):hover]:bg-neutral-800\",\n secondary:\n \"*:data-[slot=bubble-content]:bg-muted *:data-[slot=bubble-content]:text-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted\",\n muted:\n \"*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]\",\n tinted:\n \"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-muted *:data-[slot=bubble-content]:text-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted\",\n outline:\n \"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30\",\n ghost:\n \"border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50\",\n destructive:\n \"*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nfunction Bubble({\n variant = \"default\",\n align = \"start\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof bubbleVariants> & {\n align?: \"start\" | \"end\";\n }) {\n return (\n <div\n data-slot=\"bubble\"\n data-variant={variant}\n data-align={align}\n className={cn(bubbleVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction BubbleContent({\n asChild = false,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"bubble-content\"\n className={cn(\n \"w-fit max-w-full min-w-0 overflow-hidden rounded-xl border border-transparent px-3 py-2 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-neutral-300 [button,a]:focus-visible:ring-0\",\n className\n )}\n {...props}\n />\n );\n}\n\nconst bubbleReactionsVariants = cva(\n \"absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0\",\n {\n variants: {\n side: {\n top: \"top-0 -translate-y-3/4\",\n bottom: \"bottom-0 translate-y-3/4\",\n },\n align: {\n start: \"left-3\",\n end: \"right-3\",\n },\n },\n defaultVariants: {\n side: \"bottom\",\n align: \"end\",\n },\n }\n);\n\nfunction BubbleReactions({\n side = \"bottom\",\n align = \"end\",\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n align?: \"start\" | \"end\";\n side?: \"top\" | \"bottom\";\n}) {\n return (\n <div\n data-slot=\"bubble-reactions\"\n data-align={align}\n data-side={side}\n className={cn(bubbleReactionsVariants({ side, align }), className)}\n {...props}\n />\n );\n}\n\nexport { BubbleGroup, Bubble, BubbleContent, BubbleReactions, bubbleVariants };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { cn } from \"./utils\";\n\nconst markerVariants = cva(\n \"group/marker relative flex min-h-4 w-full items-center gap-2 text-left text-sm text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [a]:underline [a]:underline-offset-3 [a]:hover:text-foreground\",\n {\n variants: {\n variant: {\n default: \"\",\n separator:\n \"before:mr-1 before:h-px before:min-w-0 before:flex-1 before:bg-border after:ml-1 after:h-px after:min-w-0 after:flex-1 after:bg-border\",\n border: \"border-b border-border pb-2\",\n },\n },\n }\n);\n\nfunction Marker({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof markerVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"marker\"\n data-variant={variant}\n className={cn(markerVariants({ variant, className }))}\n {...props}\n />\n );\n}\n\nfunction MarkerIcon({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"marker-icon\"\n aria-hidden=\"true\"\n className={cn(\n \"size-4 shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction MarkerContent({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"marker-content\"\n className={cn(\n \"min-w-0 wrap-break-word group-data-[variant=separator]/marker:flex-none group-data-[variant=separator]/marker:text-center *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Marker, MarkerIcon, MarkerContent, markerVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nexport type McpConnectRequiredStatus =\n | \"pending\"\n | \"connecting\"\n | \"connected\"\n | \"resuming\"\n | \"error\";\n\nexport type McpConnectRequiredCardProps = React.ComponentProps<\"div\"> & {\n serverName?: string | null;\n providerKey?: string | null;\n message?: string | null;\n status?: McpConnectRequiredStatus;\n disabled?: boolean;\n loading?: boolean;\n error?: string | null;\n onConnect?: () => void;\n};\n\nconst STATUS_LABELS: Record<McpConnectRequiredStatus, string> = {\n pending: \"Connect\",\n connecting: \"Connecting\",\n connected: \"Connected\",\n resuming: \"Resuming\",\n error: \"Try again\",\n};\n\nexport function McpConnectRequiredCard({\n serverName,\n providerKey,\n message,\n status = \"pending\",\n disabled = false,\n loading = false,\n error,\n onConnect,\n className,\n ...props\n}: McpConnectRequiredCardProps) {\n const label = String(serverName || providerKey || \"MCP server\").trim();\n const isBusy = loading || status === \"connecting\" || status === \"resuming\";\n const isConnected = status === \"connected\";\n const buttonDisabled = disabled || isBusy || isConnected || !onConnect;\n\n return (\n <div\n data-agents24-mcp-connect-card\n data-status={status}\n className={cn(\n \"w-full rounded-lg border border-border/50 bg-muted/25 p-3 text-sm text-foreground\",\n className\n )}\n {...props}\n >\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">{label}</div>\n <div className=\"mt-1 text-sm text-muted-foreground\">\n {message || \"Connect your account to continue.\"}\n </div>\n {status === \"error\" && error ? (\n <div className=\"mt-2 text-sm text-destructive\">{error}</div>\n ) : null}\n </div>\n <button\n type=\"button\"\n className={cn(\n \"shrink-0 rounded-md border px-3 py-1.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-60\",\n status === \"pending\" || status === \"error\"\n ? \"border-neutral-900 bg-neutral-900 text-white hover:bg-neutral-800\"\n : \"border-border bg-background text-foreground hover:bg-muted\"\n )}\n disabled={buttonDisabled}\n onClick={onConnect}\n >\n {STATUS_LABELS[status]}\n </button>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nconst RECORDING_CANDIDATES = [\"audio/webm;codecs=opus\", \"audio/webm\", \"audio/mp4\"];\n\nfunction recordingExtension(mimeType: string): string {\n return mimeType.startsWith(\"audio/mp4\") ? \"m4a\" : \"webm\";\n}\n\nexport function useAudioRecorder(\n onRecorded: (file: File) => void,\n options: { onStreamChange?: (stream: MediaStream | null) => void } = {},\n) {\n const recorderRef = React.useRef<MediaRecorder | null>(null);\n const streamRef = React.useRef<MediaStream | null>(null);\n const onRecordedRef = React.useRef(onRecorded);\n const onStreamChangeRef = React.useRef(options.onStreamChange);\n onRecordedRef.current = onRecorded;\n onStreamChangeRef.current = options.onStreamChange;\n const [isRecording, setIsRecording] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const stop = React.useCallback(() => recorderRef.current?.stop(), []);\n const start = React.useCallback(async () => {\n setError(null);\n if (!navigator.mediaDevices?.getUserMedia || typeof MediaRecorder === \"undefined\") {\n setError(\"Audio recording is not supported in this browser.\");\n return;\n }\n try {\n const mimeType = RECORDING_CANDIDATES.find((candidate) => MediaRecorder.isTypeSupported(candidate));\n if (!mimeType) {\n setError(\"Audio recording is not supported in this browser.\");\n return;\n }\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n onStreamChangeRef.current?.(stream);\n const recorder = new MediaRecorder(stream, { mimeType });\n const chunks: BlobPart[] = [];\n recorder.ondataavailable = (event) => { if (event.data.size) chunks.push(event.data); };\n recorder.onstop = () => {\n const actualType = recorder.mimeType || \"audio/webm\";\n onRecordedRef.current(new File([new Blob(chunks, { type: actualType })], `recording-${Date.now()}.${recordingExtension(actualType)}`, { type: actualType }));\n stream.getTracks().forEach((track) => track.stop());\n onStreamChangeRef.current?.(null);\n recorderRef.current = null;\n streamRef.current = null;\n setIsRecording(false);\n };\n recorderRef.current = recorder;\n streamRef.current = stream;\n recorder.start();\n setIsRecording(true);\n } catch {\n streamRef.current?.getTracks().forEach((track) => track.stop());\n onStreamChangeRef.current?.(null);\n setError(\"Microphone access is unavailable.\");\n }\n }, []);\n\n React.useEffect(() => () => {\n recorderRef.current?.stop();\n streamRef.current?.getTracks().forEach((track) => track.stop());\n onStreamChangeRef.current?.(null);\n }, []);\n\n return { error, isRecording, start, stop };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,SAAuB;AACvB,IAAAC,uBAAsC;;;ACDtC,YAAuB;AACvB,wBAAyB;AACzB,0BAIO;;;ACLP,sCAAuC;AACvC,wBAAqB;;;ACFrB,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;AD8BI;AA7BJ,IAAM,yBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,SACE;AAAA,QACF,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,aAAa;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,cAAc;AAAA,EACd,GAAG;AACL,GAGK;AACH,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,aAAW;AAAA,MACX,oBAAkB;AAAA,MAClB,WAAW,GAAG,mBAAmB,EAAE,MAAM,YAAY,CAAC,GAAG,SAAS;AAAA,MACjE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,8BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAA+E;AAC7E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,wBAAwB,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAC5D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA,GAAG;AACL,GAAiC;AAC/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA,GAAG;AACL,GAAiC;AAC/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAAmC;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GAEG;AACD,QAAM,OAAO,UAAU,yBAAO;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAM,UAAU,SAAa,QAAQ;AAAA,MACrC,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC7E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;AEzLI,IAAAC,sBAAA;AAFJ,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACrD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,EACR,GAAG;AACL,GAA8D;AAC5D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC5E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;AH3DA,IAAM,yBAA+B,oBAA+B,WAAW;AAcxE,SAAS,YAAY,OAA6C;AACvE,QAAM,EAAE,WAAW,MAAM,OAAO,GAAG,MAAM,IAAI;AAC7C,QAAM,SAAS,SAAS;AACxB,QAAM,gBAAgB,SAAS;AAC/B,QAAM,eAAmC,OAAO,OAAO,CAAC,GAAG,KAAK;AAChE,eAAa,QAAQ;AACrB,eAAa,YAAY;AAAA,IACvB;AAAA,IACA,SACI,gEACA;AAAA,IACJ;AAAA,EACF;AACA,SAAa;AAAA,IACX,uBAAuB;AAAA,IACvB,EAAE,OAAO,KAAK;AAAA,IACR,oBAAc,SAAS,YAAY;AAAA,EAC3C;AACF;AAMO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgD;AAC9C,QAAM,gBAAsB,iBAAW,sBAAsB;AAC7D,QAAM,UAAU,QAAQ,mBAAmB;AAC3C,SAAa,oBAAc,OAAO;AAAA,IAChC,WAAW;AAAA,MACT;AAAA,MACA,SACI,yHACA;AAAA,MACJ;AAAA,IACF;AAAA,IACA,aAAa;AAAA,IACb,GAAG;AAAA,EACL,CAAC;AACH;AAIO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,GAAG;AACL,GAAgD;AAC9C,SAAa,oBAAc,OAAO;AAAA,IAChC,WAAW,GAAG,2BAA2B,SAAS;AAAA,IAClD,aAAa;AAAA,IACb,GAAG;AAAA,EACL,CAAC;AACH;AAOO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,GAA+C;AAC7C,QAAM,eAAe,OAAO,YAAY,WAAW,UAAU;AAC7D,SAAa;AAAA,IACX;AAAA,IACA;AAAA,MACE,cAAc,SAAS;AAAA,MACvB,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,IACM;AAAA,MACJ;AAAA,MACA,EAAE,WAAW,UAAU;AAAA,MACvB,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAyBA,IAAM,uBAAuB,oBAAI,QAG/B;AACF,IAAM,iCAAiC;AACvC,IAAM,4BAA4B;AAElC,SAAS,mBAAmB,MAAyC;AACnE,QAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,GAAG,KAAK,IAAI;AAC1D,SAAO,MAAM;AACf;AAEA,SAAS,wBACP,UACA,MACoC;AACpC,QAAM,MAAM,mBAAmB,IAAI;AACnC,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,qBAAqB,IAAI,QAAQ,GAAG,IAAI,GAAG;AAC1D,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,CAAC,OAAO,WAAY,QAAO;AAC/B,QAAM,aAAa,KAAK,MAAM,OAAO,UAAU;AAC/C,MAAI,OAAO,SAAS,UAAU,KAAK,aAAa,iCAAiC,KAAK,IAAI,GAAG;AAC3F,WAAO;AAAA,EACT;AACA,uBAAqB,IAAI,QAAQ,GAAG,OAAO,GAAG;AAC9C,SAAO;AACT;AAEA,SAAS,uBACP,UACA,MACA,QACA;AACA,QAAM,MAAM,mBAAmB,IAAI;AACnC,MAAI,CAAC,IAAK;AACV,QAAM,QAAQ,qBAAqB,IAAI,QAAQ,KAAK,oBAAI,IAAyC;AACjG,QAAM,OAAO,GAAG;AAChB,QAAM,IAAI,KAAK,MAAM;AACrB,SAAO,MAAM,OAAO,2BAA2B;AAC7C,UAAM,YAAY,MAAM,KAAK,EAAE,KAAK,EAAE;AACtC,QAAI,OAAO,cAAc,SAAU;AACnC,UAAM,OAAO,SAAS;AAAA,EACxB;AACA,uBAAqB,IAAI,UAAU,KAAK;AAC1C;AAEA,SAAS,4BACP,UACA,MACA;AACA,QAAM,MAAM,mBAAmB,IAAI;AACnC,MAAI,IAAK,sBAAqB,IAAI,QAAQ,GAAG,OAAO,GAAG;AACzD;AAcA,SAAS,oBAAoB,MAAkC;AAC7D,SAAO,KAAK,aAAa,KAAK,eAAe,OAAO,KAAK,QAAQ,0BAA0B;AAC7F;AAEA,SAAS,mBAAmB,MAAkC;AAC5D,SAAO,KAAK,YAAY,KAAK,QAAQ;AACvC;AAEA,SAAS,oBAAoB,UAA0B;AACrD,QAAM,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI;AAC1C,SAAO,aAAa,cAAc,WAAW,UAAU,YAAY,IAAI;AACzE;AAEA,SAAS,wBAAwB,MAG/B;AACA,QAAM,YAAY,oBAAoB,IAAI,EAAE,YAAY;AACxD,QAAM,YAAY,oBAAoB,mBAAmB,IAAI,CAAC;AAE9D,MAAI,UAAU,WAAW,QAAQ,KAAK,CAAC,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,SAAS,GAAG;AACtH,WAAO,EAAE,cAAc,aAAa,SAAS,MAAM,QAAQ;AAAA,EAC7D;AACA,MAAI,cAAc,qBAAqB,cAAc,OAAO;AAC1D,WAAO,EAAE,cAAc,OAAO,MAAM,MAAM;AAAA,EAC5C;AACA,MACE,UAAU,SAAS,aAAa,KAChC,UAAU,SAAS,KAAK,KACxB,CAAC,OAAO,WAAW,OAAO,OAAO,QAAQ,MAAM,EAAE,SAAS,SAAS,GACnE;AACA,QAAI,CAAC,OAAO,OAAO,MAAM,EAAE,SAAS,SAAS,GAAG;AAC9C,aAAO,EAAE,cAAc,WAAW,MAAM,cAAc;AAAA,IACxD;AACA,WAAO,EAAE,cAAc,gBAAgB,MAAM,cAAc;AAAA,EAC7D;AACA,MACE,UAAU,SAAS,cAAc,KACjC,CAAC,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,SAAS,GAChD;AACA,WAAO,EAAE,cAAc,cAAc,QAAQ,QAAQ,QAAQ,MAAM,eAAe;AAAA,EACpF;AACA,MACE,UAAU,SAAS,MAAM,KACzB,UAAU,SAAS,KAAK,KACxB,CAAC,OAAO,QAAQ,OAAO,KAAK,EAAE,SAAS,SAAS,GAChD;AACA,QAAI,cAAc,SAAS,cAAc,QAAQ;AAC/C,aAAO,EAAE,cAAc,WAAW,MAAM,WAAW;AAAA,IACrD;AACA,WAAO,EAAE,cAAc,YAAY,MAAM,WAAW;AAAA,EACtD;AACA,MAAI,UAAU,WAAW,QAAQ,KAAK,CAAC,OAAO,QAAQ,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,SAAS,GAAG;AACrG,QAAI,cAAc,SAAS,cAAc,OAAO;AAC9C,aAAO,EAAE,cAAc,WAAW,MAAM,QAAQ;AAAA,IAClD;AACA,WAAO,EAAE,cAAc,SAAS,MAAM,QAAQ;AAAA,EAChD;AACA,MAAI,UAAU,WAAW,QAAQ,KAAK,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,SAAS,GAAG;AACrG,QAAI,CAAC,OAAO,OAAO,OAAO,MAAM,EAAE,SAAS,SAAS,GAAG;AACrD,aAAO,EAAE,cAAc,WAAW,MAAM,QAAQ;AAAA,IAClD;AACA,WAAO,EAAE,cAAc,SAAS,MAAM,QAAQ;AAAA,EAChD;AACA,MACE,UAAU,SAAS,KAAK,KACxB,UAAU,SAAS,YAAY,KAC/B,CAAC,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,KAAK,EAAE,SAAS,SAAS,GAClE;AACA,WAAO,EAAE,cAAc,cAAc,QAAQ,QAAQ,OAAO,MAAM,UAAU;AAAA,EAC9E;AACA,MACE,UAAU,SAAS,MAAM,KACzB,UAAU,SAAS,YAAY,KAC/B,UAAU,SAAS,YAAY,KAC/B,UAAU,SAAS,KAAK,KACxB,CAAC,OAAO,QAAQ,MAAM,OAAO,QAAQ,MAAM,OAAO,MAAM,OAAO,OAAO,QAAQ,KAAK,EAAE,SAAS,SAAS,GACvG;AACA,QAAI,CAAC,OAAO,QAAQ,QAAQ,MAAM,QAAQ,OAAO,KAAK,EAAE,SAAS,SAAS,GAAG;AAC3E,aAAO,EAAE,cAAc,WAAW,MAAM,OAAO;AAAA,IACjD;AACA,WAAO,EAAE,cAAc,QAAQ,MAAM,OAAO;AAAA,EAC9C;AACA,MAAI,UAAU,WAAW,OAAO,KAAK,CAAC,MAAM,YAAY,KAAK,EAAE,SAAS,SAAS,GAAG;AAClF,WAAO,EAAE,cAAc,OAAO,MAAM,OAAO;AAAA,EAC7C;AACA,SAAO,EAAE,cAAc,SAAS,MAAM,OAAO;AAC/C;AAEA,SAAS,wBACP,cACA,MACQ;AACR,MAAI,CAAC,OAAO,OAAO,KAAK,EAAE,SAAS,YAAY,EAAG,QAAO;AACzD,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,SAAS,cAAe,QAAO;AACnC,MAAI,SAAS,cAAc,SAAS,QAAS,QAAO;AACpD,MAAI,SAAS,eAAgB,QAAO;AACpC,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,SAAS,OAAQ,QAAO;AAC5B,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAmC;AAC5D,SAAO,wBAAwB,IAAI,EAAE,SAAS;AAChD;AAEA,SAAS,oBACP,MACA,OACA,SACQ;AACR,QAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,GAAG,KAAK,IAAI;AAC1D,QAAM,WAAW,MAAM,GAAG,mBAAmB,IAAI,CAAC,IAAI,oBAAoB,IAAI,CAAC;AAC/E,SAAO,GAAG,OAAO,IAAI,QAAQ,IAAI,KAAK;AACxC;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4C;AAC1C,QAAM,WAAW,mBAAmB,IAAI;AACxC,QAAM,aAAa,OAAO,KAAK,QAAQ,WAAW,KAAK,IAAI,KAAK,IAAI;AACpE,QAAM,gBAAgB,OAAO,KAAK,iBAAiB,KAAK,kBAAkB,WAAW;AACrF,QAAM,gBAAgB,mBAAmB,IAAI;AAC7C,QAAM,UAAgB,aAAO,IAAI;AACjC,UAAQ,UAAU;AAClB,QAAM,UAAgB,aAA8B,IAAI;AACxD,QAAM,gBAAsB,aAAO,CAAC;AACpC,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,eAAS,QAAQ,UAAU,CAAC;AAC9E,QAAM,CAAC,WAAW,YAAY,IAAU,eAAS,UAAU;AAC3D,QAAM,CAAC,QAAQ,SAAS,IAAU;AAAA,IAChC,aAAa,YAAY,kBAAkB,aAAa,CAAC,iBAAiB,UAAU;AAAA,EACtF;AACA,QAAM,CAAC,mBAAmB,oBAAoB,IAAU,eAAS,CAAC;AAElE,EAAM,gBAAU,MAAM;AACpB,QAAK,cAAc,sBAAsB,KAAM,kBAAkB,aAAa,CAAC,eAAgB;AAC/F,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,QAAQ,OAAO,yBAAyB,aAAa;AACxD,wBAAkB,IAAI;AACtB;AAAA,IACF;AACA,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,YAAY;AACX,YAAI,QAAQ,KAAK,CAAC,UAAU,MAAM,cAAc,GAAG;AACjD,4BAAkB,IAAI;AACtB,mBAAS,WAAW;AAAA,QACtB;AAAA,MACF;AAAA,MACA,EAAE,YAAY,QAAQ;AAAA,IACxB;AACA,aAAS,QAAQ,IAAI;AACrB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,eAAe,YAAY,mBAAmB,cAAc,CAAC;AAEjE,EAAM,gBAAU,MAAM;AACpB,QAAI,cAAc,sBAAsB,GAAG;AACzC,mBAAa,UAAU;AACvB,gBAAU,SAAS;AACnB;AAAA,IACF;AACA,QAAI,CAAC,kBAAkB,CAAC,kBAAkB,kBAAkB,UAAW;AAEvE,UAAM,aAAa,QAAQ;AAC3B,UAAM,SAAS,wBAAwB,gBAAgB,UAAU;AACjE,QAAI,QAAQ;AACV,mBAAa,OAAO,GAAG;AACvB,gBAAU,SAAS;AACnB;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,gBAAgB;AACvC,cAAU,WAAW;AACrB,SAAK,eAAe,YAAY,WAAW,MAAM,EAC9C,KAAK,CAAC,WAAW;AAChB,UAAI,WAAW,OAAO,QAAS;AAC/B,UAAI,CAAC,OAAO,KAAK,KAAK,EAAG,OAAM,IAAI,MAAM,mDAAmD;AAC5F,6BAAuB,gBAAgB,YAAY,MAAM;AACzD,mBAAa,OAAO,GAAG;AACvB,gBAAU,SAAS;AAAA,IACrB,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,WAAW,OAAO,QAAS,WAAU,OAAO;AAAA,IACnD,CAAC;AACH,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,eAAe,eAAe,YAAY,gBAAgB,mBAAmB,cAAc,CAAC;AAEhG,QAAM,mBAAmB,MAAM;AAC7B,QAAI,kBAAkB,cAAc,YAAY,GAAG;AACjD,oBAAc,UAAU;AACxB,kCAA4B,gBAAgB,QAAQ,OAAO;AAC3D,mBAAa,EAAE;AACf,gBAAU,WAAW;AACrB,2BAAqB,CAAC,YAAY,UAAU,CAAC;AAC7C;AAAA,IACF;AACA,cAAU,OAAO;AAAA,EACnB;AAEA,SAAa;AAAA,IACX;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,WAAW,GAAG,6BAA6B,SAAS;AAAA,MACpD,aAAa;AAAA,MACb,KAAK;AAAA,MACL,OAAO,WAAW,UAAU,UAAU,WAAW,SAAS,SAAS;AAAA,MACnE,OAAO;AAAA,IACT;AAAA,IACM;AAAA,MACJ;AAAA,MACA,EAAE,WAAW,wBAAwB,SAAS,QAAQ;AAAA,MACtD,YACU,oBAAc,OAAO;AAAA,QACzB,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ,MAAM,UAAU,MAAM;AAAA,QAC9B,KAAK;AAAA,MACP,CAAC,IACD,WAAW,UACH,oBAAc,8BAAU,EAAE,eAAe,QAAQ,WAAW,SAAS,CAAC,IACtE,oBAAc,kCAAc;AAAA,QAChC,eAAe;AAAA,QACf,WAAW;AAAA,MACb,CAAC;AAAA,MACP,WAAW,UAAU,WAAW,UACtB,oBAAc,QAAQ,EAAE,WAAW,WAAW,MAAM,SAAS,GAAG,WAAW,QAAQ,EAAE,IAC3F;AAAA,MACJ,WAAW,UACD,oBAAc,QAAQ,EAAE,WAAW,UAAU,GAAG,GAAG,QAAQ,sBAAsB,IACvF;AAAA,IACN;AAAA,IACA,WACU;AAAA,MACJ;AAAA,MACA;AAAA,QACE,cAAc,UAAU,QAAQ;AAAA,QAChC,WAAW;AAAA,QACX,SAAS,CAAC,UAA+C;AACvD,gBAAM,gBAAgB;AACtB,mBAAS;AAAA,QACX;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACM,oBAAc,uBAAG,EAAE,eAAe,QAAQ,WAAW,WAAW,CAAC;AAAA,IACzE,IACA;AAAA,EACN;AACF;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4C;AAC1C,QAAM,WAAW,mBAAmB,IAAI;AACxC,QAAM,EAAE,cAAc,KAAK,IAAI,wBAAwB,IAAI;AAC3D,MAAI,SAAS,SAAS;AACpB,WAAa,oBAAc,qBAAqB;AAAA,MAC9C,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAa;AAAA,IACX;AAAA,IACA;AAAA,MACE,WAAW,GAAG,uBAAuB,SAAS;AAAA,MAC9C,aAAa,eAAe;AAAA,MAC5B,MAAM;AAAA,MACN,GAAG;AAAA,IACL;AAAA,IACM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL;AAAA,UACE,WAAW;AAAA,UACX,OAAO,EAAE,iBAAiB,wBAAwB,cAAc,IAAI,EAAE;AAAA,UACtE,SAAS;AAAA,QACX;AAAA,QACA,EAAE,kBAAkB,KAAK;AAAA,MAC3B;AAAA,MACM,oBAAc,4BAAU;AAAA,QAC5B,eAAe;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACM;AAAA,MACJ;AAAA,MACA,EAAE,WAAW,8BAA8B;AAAA,MACrC,oBAAc,iBAAiB,EAAE,OAAO,SAAS,GAAG,QAAQ;AAAA,IACpE;AAAA,IACA,WACU;AAAA,MACJ;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,WACE;AAAA,QACF,SAAS,CAAC,UAA+C;AACvD,gBAAM,gBAAgB;AACtB,mBAAS;AAAA,QACX;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACM,oBAAc,uBAAG,EAAE,eAAe,QAAQ,WAAW,WAAW,CAAC;AAAA,IACzE,IACA;AAAA,EACN;AACF;AAIO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAoD;AAClD,MAAI,CAAC,SAAU,QAAO;AACtB,SAAa;AAAA,IACX;AAAA,IACA;AAAA,MACE,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAQO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAuD;AACrD,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAM,mBAAmB,YAAY,OAAO,iBAAiB;AAC7D,QAAM,kBAAkB,YAAY,OAAO,CAAC,eAAe,CAAC,kBAAkB,UAAU,CAAC;AACzF,QAAM,YAAY,CAAC,OAAsC,SACvD,MAAM,SAAS,IACL;AAAA,IACJ;AAAA,IACA,OAAO,OAAO,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,uBAAuB,KAAK,CAAC;AAAA,IACjE,MAAM;AAAA,MAAI,CAAC,YAAY,UACf,oBAAc,gBAAgB;AAAA,QAClC,MAAM;AAAA,QACN,KAAK;AAAA,QACL,KAAK,oBAAoB,YAAY,OAAO,IAAI;AAAA,QAChD,UAAU,WAAW,MAAM,SAAS,UAAU,IAAI;AAAA,QAClD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,IACA;AAEN,SAAa;AAAA,IACX;AAAA,IACA;AAAA,MACE,WAAW,GAAG,4BAA4B,SAAS;AAAA,MACnD;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,kBAAkB,QAAQ;AAAA,IACpC,UAAU,iBAAiB,OAAO;AAAA,EACpC;AACF;;;AIrlBA,IAAM,WAAW,MACf,OAAO,WAAW,eAAe,gBAAgB,SAC7C,OAAO,WAAW,IAClB,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAExD,SAAS,4BAA4B,MAAmC;AAC7E,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,MAAM;AAAA,IACN,KAAK,IAAI,gBAAgB,IAAI;AAAA,IAC7B,UAAU,KAAK,QAAQ;AAAA,IACvB,WAAW,KAAK,QAAQ;AAAA,IACxB,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,6BAA6B,OAA+C;AAC1F,QAAM,QAAQ,CAAC,SAAS;AACtB,QAAI;AACF,UAAI,gBAAgB,KAAK,GAAG;AAAA,IAC9B,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AACH;;;ALgJU,IAAAC,sBAAA;AAjJV,SAAS,gBAAgB,OAAgC;AACvD,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC,EAAE;AACxC,SAAO,GAAG,MAAM,MAAM;AACxB;AAEA,IAAM,kBACJ;AAEF,IAAM,oBACJ;AAEK,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACF,GAA2B;AACzB,QAAM,eAAqB,cAAgC,IAAI;AAC/D,QAAM,WAAiB,cAAgC,CAAC,CAAC;AACzD,QAAM,mBAAyB,cAAgC,CAAC,CAAC;AACjE,QAAM,mBAAyB,cAAmC,IAAI;AACtE,QAAM,mBAAyB,cAAO,CAAC;AACvC,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,EAAE;AACzC,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAkC,CAAC,CAAC;AACpE,QAAM,CAAC,cAAc,eAAe,IAAU,gBAAS,KAAK;AAC5D,QAAM,aAAa,iBAAiB,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;AAEzE,QAAM,iBAAuB;AAAA,IAC3B,CAAC,SAAqC;AACpC,uBAAiB,UAAU;AAC3B,UAAI,OAAO,gBAAgB,YAAY;AACrC,oBAAY,IAAI;AAAA,MAClB,WAAW,aAAa;AACtB,QAAC,YAAmE,UAAU;AAAA,MAChF;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,EAAM,iBAAU,MAAM;AACpB,aAAS,UAAU;AACnB,8BAA0B,MAAM,MAAM;AAAA,EACxC,GAAG,CAAC,OAAO,uBAAuB,CAAC;AAEnC,EAAM,iBAAU,MAAM,MAAM;AAC1B,iCAA6B,SAAS,OAAO;AAC7C,iCAA6B,iBAAiB,OAAO;AAAA,EACvD,GAAG,CAAC,CAAC;AAEL,EAAM,uBAAgB,MAAM;AAC1B,UAAM,WAAW,iBAAiB;AAClC,QAAI,CAAC,SAAU;AACf,QAAI,YAAY;AACd,eAAS,MAAM,SAAS;AACxB,YAAM,eAAe,SAAS;AAC9B,eAAS,MAAM,SAAS,GAAG,KAAK,IAAI,cAAc,GAAG,CAAC;AACtD,eAAS,MAAM,YAAY,gBAAgB,MAAM,SAAS;AAC1D;AAAA,IACF;AACA,aAAS,MAAM,SAAS;AACxB,aAAS,MAAM,YAAY;AAAA,EAC7B,GAAG,CAAC,YAAY,IAAI,CAAC;AAErB,QAAM,YACJ,CAAC,YACD,CAAC,gBACD,CAAC,cACA,KAAK,KAAK,EAAE,SAAS,KAAK,MAAM,SAAS;AAE5C,QAAM,oBAAoB,CAAC,UAA+C;AACxE,UAAM,WAAW,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC,EAAE,IAAI,2BAA2B;AACrF,QAAI,SAAS,SAAS,GAAG;AACvB,uBAAiB,WAAW;AAC5B,eAAS,CAAC,YAAY,CAAC,GAAG,SAAS,GAAG,QAAQ,CAAC;AAAA,IACjD;AACA,UAAM,cAAc,QAAQ;AAAA,EAC9B;AAEA,QAAM,aAAa,CAAC,WAAmB;AACrC,qBAAiB,WAAW;AAC5B,aAAS,CAAC,YAAY;AACpB,YAAM,SAAS,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM;AACxD,UAAI,OAAQ,8BAA6B,CAAC,MAAM,CAAC;AACjD,aAAO,QAAQ,OAAO,CAAC,SAAS,KAAK,OAAO,MAAM;AAAA,IACpD,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,YAAY;AACzB,QAAI,CAAC,UAAW;AAChB,UAAM,gBAAgB,KAAK,KAAK;AAChC,UAAM,iBAAiB;AACvB,UAAM,kBAAkB,iBAAiB,UAAU;AACnD,qBAAiB,UAAU;AAC3B,qBAAiB,UAAU;AAC3B,oBAAgB,IAAI;AACpB,YAAQ,EAAE;AACV,aAAS,CAAC,CAAC;AACX,QAAI;AACF,YAAM,SAAS,EAAE,MAAM,eAAe,OAAO,eAAe,CAAC;AAC7D,mCAA6B,cAAc;AAC3C,uBAAiB,UAAU,CAAC;AAAA,IAC9B,QAAQ;AACN,UAAI,iBAAiB,YAAY,iBAAiB;AAChD,yBAAiB,WAAW;AAC5B,gBAAQ,aAAa;AACrB,iBAAS,cAAc;AACvB,yBAAiB,UAAU,CAAC;AAAA,MAC9B,OAAO;AACL,qCAA6B,cAAc;AAC3C,yBAAiB,UAAU,CAAC;AAAA,MAC9B;AAAA,IACF,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,UAAoD;AACzE,QAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,UAAU;AAC5C,YAAM,eAAe;AACrB,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAEA,SACE,8CAAC,SAAI,WAAW,GAAG,mEAAmE,SAAS,GAAG,+BAA4B,IAC3H;AAAA,UAAM,SAAS,IACd;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,eAAa;AAAA,QACb,WAAW;AAAA,UACT;AAAA,UACA,qBAAqB,YACjB,uHACA;AAAA,QACN;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa;AAAA,YACb,UAAU,CAAC,eAAe,WAAW,MAAM,WAAW,WAAW,EAAE;AAAA;AAAA,QACrE;AAAA;AAAA,IACF,IACE;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACC,iBAAe,aAAa,KAAK;AAAA,QACjC,WAAW;AAAA,UACT;AAAA,UACA,aAAa,0BAA0B;AAAA,QACzC;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,mBAAmB,aACf,uDACA;AAAA,cACJ,qBAAqB,aAAa,kBAAkB;AAAA,cACpD,KAAK,aAAa,aAAa;AAAA,YACjC;AAAA,YAEA;AAAA,4DAAC,SAAI,OAAO,EAAE,UAAU,OAAO,GAAG,WAAU,uEAC1C;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL;AAAA,oBACA,cAAW;AAAA,oBACX,WAAU;AAAA,oBACV,UAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,UAAU;AAAA,oBACV,MAAK;AAAA;AAAA,gBACP;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,cAAW;AAAA,oBACX,WAAW,GAAG,wBAAwB,eAAe;AAAA,oBACrD,UAAU,YAAY,gBAAgB,aAAa,CAAC;AAAA,oBACpD,SAAS,MAAM,aAAa,SAAS,MAAM;AAAA,oBAC3C,OAAM;AAAA,oBACN,MAAK;AAAA,oBAEL,uDAAC,6BAAK,WAAU,UAAS;AAAA;AAAA,gBAC3B;AAAA,iBACF;AAAA,cAEA,6CAAC,SAAI,OAAO,EAAE,UAAU,WAAW,GAAG,WAAU,8CAC9C;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,cAAW;AAAA,kBACX,cAAa;AAAA,kBACb,WAAW;AAAA,oBACT;AAAA,oBACA,aAAa,+BAA+B;AAAA,kBAC9C;AAAA,kBACA,UAAU,YAAY,gBAAgB;AAAA,kBACtC,MAAK;AAAA,kBACL,UAAU,CAAC,UAAU;AACnB,qCAAiB,WAAW;AAC5B,4BAAQ,MAAM,OAAO,KAAK;AAAA,kBAC5B;AAAA,kBACA,WAAW;AAAA,kBACX;AAAA,kBACA,MAAM,aAAa,IAAI;AAAA,kBACvB,OAAO;AAAA;AAAA,cACT,GACF;AAAA,cAEC,aACC,6CAAC,SAAI,OAAO,EAAE,UAAU,UAAU,GAAG,WAAU,2DAC5C,+BACH,IACE;AAAA,cAEH,CAAC,aACA,6CAAC,SAAI,OAAO,EAAE,UAAU,WAAW,GAAG,WAAU,qCAAoC,IAClF;AAAA,cAEH,CAAC,aACA,6CAAC,SAAI,OAAO,EAAE,UAAU,MAAM,GAAG,WAAU,0CAAyC,IAClF;AAAA,cAEJ,6CAAC,SAAI,OAAO,EAAE,UAAU,SAAS,GAAG,WAAU,oEAC3C,sBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,cAAW;AAAA,kBACX,WAAW,GAAG,wBAAwB,iBAAiB;AAAA,kBACvD,UAAU,YAAY,CAAC;AAAA,kBACvB,SAAS;AAAA,kBACT,OAAM;AAAA,kBACN,MAAK;AAAA,kBAEL,uDAAC,+BAAO,WAAU,yBAAwB;AAAA;AAAA,cAC5C,IAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,cAAY,MAAM,SAAS,IAAI,QAAQ,gBAAgB,KAAK,CAAC,KAAK;AAAA,kBAClE,WAAW,GAAG,wBAAwB,mBAAmB,KAAK,KAAK,EAAE,SAAS,KAAK,iBAAiB;AAAA,kBACpG,UAAU,CAAC;AAAA,kBACX,SAAS,MAAM,KAAK,OAAO;AAAA,kBAC3B,OAAM;AAAA,kBACN,MAAK;AAAA,kBAEL,uDAAC,gCAAQ,WAAU,UAAS,aAAa,KAAK;AAAA;AAAA,cAChD,GAEJ;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEC,CAAC,cAAc,sBACd,6CAAC,SAAI,WAAU,2FAA2F,+BAAoB,IAC5H;AAAA,KACN;AAEJ;;;AMzSA,IAAAC,SAAuB;AACvB,IAAAC,uBAA8D;AAC9D,sBAAwB;AAuFlB,IAAAC,sBAAA;AAzDN,IAAM,mBAAmB;AAAA,EACvB,CAAC,aAAa,WAAW;AAAA,EACzB,CAAC,cAAc,YAAY;AAAA,EAC3B,CAAC,cAAc,YAAY;AAAA,EAC3B,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,kBAAkB,gBAAgB;AAAA,EACnC,CAAC,SAAS,OAAO;AACnB;AAEA,SAAS,aAAa,OAA8F;AAClH,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAK;AAC3D,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AACzC,SAAO;AAAA,IACL,UAAU,KAAK,YAAY;AAAA,IAC3B,OAAO,IAAI,KAAK,eAAe,QAAW,EAAE,WAAW,QAAQ,CAAC,EAAE,OAAO,IAAI;AAAA,EAC/E;AACF;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,CAAC,cAAc,eAAe,IAAU,gBAAS,KAAK;AAC5D,QAAM,CAAC,iBAAiB,kBAAkB,IAAU,gBAAmC,IAAI;AAC3F,QAAM,CAAC,QAAQ,SAAS,IAAU,gBAAgC,UAAU,UAAU,UAAU,IAAI;AACpG,QAAM,CAAC,SAAS,UAAU,IAAU,gBAAS,UAAU,UAAU,WAAW,EAAE;AAC9E,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAS,KAAK;AACpE,QAAM,iBAAuB,cAAsB,IAAI;AAEvD,EAAM,iBAAU,MAAM;AACpB,cAAU,UAAU,UAAU,UAAU,IAAI;AAC5C,eAAW,UAAU,UAAU,WAAW,EAAE;AAAA,EAC9C,GAAG,CAAC,UAAU,UAAU,SAAS,UAAU,UAAU,MAAM,CAAC;AAE5D,EAAM,iBAAU,MAAM,MAAM;AAC1B,QAAI,eAAe,YAAY,KAAM,QAAO,aAAa,eAAe,OAAO;AAAA,EACjF,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,UAAU,UAAU;AACnC,QAAM,cAAc,MAAM;AACxB,cAAU,SAAS,QAAQ,WAAW,IAAI,QAAQ,EAAE;AACpD,QAAI,UAAU,WAAW,OAAW;AACpC,wBAAoB,IAAI;AACxB,QAAI,eAAe,YAAY,KAAM,QAAO,aAAa,eAAe,OAAO;AAC/E,mBAAe,UAAU,OAAO,WAAW,MAAM;AAC/C,qBAAe,UAAU;AACzB,0BAAoB,KAAK;AAAA,IAC3B,GAAG,IAAK;AAAA,EACV;AAEA,MAAI,CAAC,YAAY,QAAQ,YAAY,MAAO,QAAO;AACnD,MAAI,QAAQ,SAAS,QAAQ;AAC3B,UAAM,SAAS,aAAa,QAAQ,SAAS;AAC7C,WACE,8CAAC,sBAAe,WAAU,4BACvB;AAAA,eAAS,6CAAC,UAAK,UAAU,OAAO,UAAW,iBAAO,OAAM,IAAU;AAAA,MAClE,SAAS,SACR;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,SAAS,YAAY;AAAA,UAC9B,WAAU;AAAA,UAET,mBACC,6CAAC,8BAAM,WAAU,+CAA8C,IAE/D,6CAAC,6BAAK,WAAU,+BAA8B;AAAA;AAAA,MAElD,IACE;AAAA,OACN;AAAA,EAEJ;AACA,QAAM,mBAAmB,QAAQ,QAAQ,SAAS,SAAS,aAAa;AACxE,SACE,8CAAC,sBACE;AAAA,aAAS,UACR;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,MAAM,KAAK,SAAS,UAAU,OAAO;AAAA,QAC9C,SAAQ;AAAA,QAER,uDAAC,mCAAW,WAAU,UAAS;AAAA;AAAA,IACjC,IACE;AAAA,IACH,mBACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,MAAM,KAAK,SAAS,gBAAgB,SAAS;AAAA,UACpD,QAAQ,SAAS,UAAU,WAAW,SAAS,OAAO;AAAA,QACxD,CAAC;AAAA,QACD,SAAQ;AAAA,QAER,uDAAC,iCAAS,WAAU,UAAS,MAAM,SAAS,UAAU,WAAW,SAAS,iBAAiB,QAAQ;AAAA;AAAA,IACrG,IACE;AAAA,IACH,mBACC,8CAAC,wBAAQ,MAAR,EAAa,cAAc,iBAAiB,MAAM,cACjD;AAAA,mDAAC,wBAAQ,SAAR,EAAgB,SAAO,MACtB;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,SAAS,MAAM;AACb,gBAAI,SAAS,UAAU,WAAW,WAAW;AAC3C,mBAAK,SAAS,gBAAgB,SAAS,EAAE,QAAQ,UAAU,CAAC;AAAA,YAC9D;AACA,4BAAgB,IAAI;AAAA,UACtB;AAAA,UACA,KAAK;AAAA,UACL,SAAQ;AAAA,UAER,uDAAC,mCAAW,WAAU,UAAS,MAAM,SAAS,UAAU,WAAW,YAAY,iBAAiB,QAAQ;AAAA;AAAA,MAC1G,GACF;AAAA,MACA;AAAA,QAAC,wBAAQ;AAAA,QAAR;AAAA,UACC,WAAW,iBAAiB,QAAqB,4BAA4B,KAAK;AAAA,UAElF;AAAA,YAAC,wBAAQ;AAAA,YAAR;AAAA,cACC,OAAM;AAAA,cACN,cAAW;AAAA,cACX,WAAU;AAAA,cACV;AAAA,cACA,MAAK;AAAA,cACL,YAAY;AAAA,cAEZ;AAAA,6DAAC,OAAE,WAAU,uBAAsB,mCAAqB;AAAA,gBACxD,6CAAC,SAAI,WAAU,+BACZ,2BAAiB,IAAI,CAAC,CAAC,OAAO,KAAK,MAClC;AAAA,kBAAC;AAAA;AAAA,oBACC,gBAAc,WAAW;AAAA,oBACzB,WAAU;AAAA,oBAEV,SAAS,MAAM,UAAU,WAAW,QAAQ,OAAO,KAAK;AAAA,oBACxD,MAAK;AAAA,oBAEJ;AAAA;AAAA,kBAJI;AAAA,gBAKP,CACD,GACH;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,cAAW;AAAA,oBACX,WAAU;AAAA,oBACV,WAAW;AAAA,oBACX,UAAU,CAAC,UAAU,WAAW,MAAM,OAAO,KAAK;AAAA,oBAClD,aAAY;AAAA,oBACZ,OAAO;AAAA;AAAA,gBACT;AAAA,gBACA,8CAAC,SAAI,WAAU,gDACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,SAAS,MAAM;AACb,6BAAK,QAAQ,QAAQ,SAAS,gBAAgB,SAAS,EAAE,QAAQ,KAAK,CAAC,CAAC,EACrE,KAAK,MAAM,gBAAgB,KAAK,CAAC,EACjC,MAAM,MAAM,MAAS;AAAA,sBAC1B;AAAA,sBACA,MAAK;AAAA,sBACN;AAAA;AAAA,kBAED;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,SAAS,MAAM;AACb,6BAAK,QAAQ,QAAQ,SAAS,gBAAgB,SAAS,EAAE,QAAQ,WAAW,QAAQ,QAAQ,CAAC,CAAC,EAC3F,KAAK,MAAM,gBAAgB,KAAK,CAAC,EACjC,MAAM,MAAM,MAAS;AAAA,sBAC1B;AAAA,sBACA,MAAK;AAAA,sBACN;AAAA;AAAA,kBAED;AAAA,mBACF;AAAA;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OACF,IACE;AAAA,IACH;AAAA,IACA,SAAS,SACR;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,SAAS,YAAY;AAAA,QAE7B,mBACC,6CAAC,8BAAM,WAAU,yBAAwB,IAEzC,6CAAC,6BAAK,WAAU,UAAS;AAAA;AAAA,IAE7B,IACE;AAAA,KACN;AAEJ;;;ACjOA,IAAAC,SAAuB;AACvB,IAAAC,uBAAuC;;;ACDvC,IAAAC,SAAuB;;;ACAvB,mBAA4C;AA4B5C,IAAM,oCAAoC;AAC1C,IAAM,mBAAmB;AACzB,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B,oBAAI,IAAoB;AAE1D,IAAM,4BAAgD;AAAA,EACpD,KAAK,CAAC,OAAO,0BAA0B,IAAI,EAAE;AAAA,EAC7C,KAAK,CAAC,IAAI,SAAS;AACjB,8BAA0B,IAAI,IAAI,IAAI;AACtC,QAAI,0BAA0B,OAAO,mCAAmC;AACtE,YAAM,WAAW,0BAA0B,KAAK,EAAE,KAAK,EAAE;AACzD,UAAI,SAAU,2BAA0B,OAAO,QAAQ;AAAA,IACzD;AAAA,EACF;AACF;AAEO,IAAM,+BAA+B,CAC1C,SACA,uBACG;AACH,MAAI,QAAQ,SAAS,eAAe,uBAAuB,QAAQ,GAAI,QAAO;AAC9E,QAAM,eAAe,QAAQ,MAAM,QAAQ,MAAM,SAAS,CAAC;AAC3D,SAAO,cAAc,SAAS,SAAS,aAAa,KAAK;AAC3D;AAQA,IAAM,qBAAqB,CAAC,UAA4B;AACtD,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,MAAI,OAAO,SAAS,eAAe,eAAe,MAAM;AACtD,UAAM,YAAY,IAAI,KAAK,UAAU,QAAW,EAAE,aAAa,WAAW,CAAC;AAC3E,WAAO,MAAM,KAAK,UAAU,QAAQ,KAAK,GAAG,CAAC,EAAE,OAAO,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AAAA,EAC5F;AAEA,QAAM,aAAa,MAAM,KAAK,KAAK;AACnC,QAAM,UAAoB,CAAC;AAC3B,MAAI,SAAS;AACb,MAAI,qBAAqB;AACzB,aAAW,QAAQ,CAAC,WAAW,UAAU;AACvC,UAAM,WAAW,WAAW,QAAQ,CAAC;AACrC,UAAM,YAAY,UAAU,YAAY,CAAC,KAAK;AAC9C,UAAM,sBAAsB,aAAa,UAAW,aAAa;AACjE,UAAM,mBACJ,QAAQ,MACP,cAAc,KAAK,SAAS,KAC1B,aAAa,SAAU,aAAa,SACpC,aAAa,UAAW,aAAa,UACtC,cAAc,YACd,aAAa,YACZ,uBAAuB,qBAAqB,MAAM;AACvD,QAAI,CAAC,kBAAkB;AACrB,UAAI,SAAS,EAAG,SAAQ,KAAK,MAAM;AACnC,2BAAqB;AAAA,IACvB;AACA,cAAU,UAAU;AACpB,yBAAqB,sBAAsB,qBAAqB,IAAI;AAAA,EACtE,CAAC;AACD,UAAQ,KAAK,MAAM;AACnB,SAAO;AACT;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,kBAAkB;AACpB,GAAoD;AAClD,QAAM,eAAe,UAAU,QAAQ,OAAO;AAC9C,QAAM,CAAC,eAAe,gBAAgB,QAAI,uBAAS,MAAM;AACvD,UAAM,aAAa,cAAc,IAAI,EAAE;AACvC,WAAO,cAAc,KAAK,WAAW,UAAU,IAAI,aAAa;AAAA,EAClE,CAAC;AACD,QAAM,gBAAY,qBAAO,IAAI;AAC7B,QAAM,mBAAe,qBAAO,aAAa;AACzC,QAAM,aAAS,qBAAsB,IAAI;AACzC,QAAM,qBAAiB,qBAAsB,IAAI;AACjD,QAAM,yBAAqB,qBAAsB,IAAI;AACrD,QAAM,2BAAuB,qBAAO,CAAC;AACrC,QAAM,YAAQ,qBAAO,EAAE;AACvB,QAAM,mBAAe,qBAAO,WAAW;AACvC,QAAM,sBAAkB,qBAAO,KAAK;AAEpC,8BAAU,MAAM;AACd,QAAI,eAAe,CAAC,KAAM;AAC1B,kBAAc,IAAI,IAAI,IAAI;AAAA,EAC5B,GAAG,CAAC,cAAc,IAAI,aAAa,IAAI,CAAC;AAExC,8BAAU,MAAM;AACd,cAAU,UAAU;AACpB,uBAAmB,UACjB,OAAO,gBAAgB,cAAc,OAAO,YAAY,IAAI;AAE9D,QACE,CAAC,eACD,gBAAgB,WAChB,CAAC,KAAK,WAAW,aAAa,OAAO,GACrC;AACA,mBAAa,UAAU;AACvB,uBAAiB,IAAI;AACrB,2BAAqB,UAAU;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,aAAa,IAAI,CAAC;AAEtB,8BAAU,MAAM;AACd,QAAI,MAAM,YAAY,GAAI;AAE1B,UAAM,UAAU;AAChB,UAAM,aAAa,cAAc,IAAI,EAAE;AACvC,UAAM,UAAU,cAAc,KAAK,WAAW,UAAU,IAAI,aAAa;AACzE,iBAAa,UAAU;AACvB,qBAAiB,OAAO;AACxB,mBAAe,UAAU;AACzB,uBAAmB,UACjB,OAAO,gBAAgB,cAAc,OAAO,YAAY,IAAI;AAC9D,yBAAqB,UAAU;AAAA,EACjC,GAAG,CAAC,cAAc,IAAI,aAAa,IAAI,CAAC;AAExC,8BAAU,MAAM;AACd,iBAAa,UAAU;AAEvB,QAAI,OAAO,WAAW,aAAa;AACjC,mBAAa,UAAU;AACvB,uBAAiB,IAAI;AACrB;AAAA,IACF;AAEA,UAAMC,gBACJ,OAAO,OAAO,eAAe,cAC7B,OAAO,WAAW,kCAAkC,EAAE;AACxD,oBAAgB,UAAUA;AAE1B,QAAIA,iBAAgB,CAAC,aAAa;AAChC,mBAAa,UAAU;AACvB,uBAAiB,IAAI;AACrB;AAAA,IACF;AAEA,UAAM,aAAa,cAAc,IAAI,EAAE;AACvC,QAAI,eAAe,MAAM;AACvB,mBAAa,UAAU;AACvB,uBAAiB,IAAI;AACrB;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,WAAW,aAAa,OAAO,GAAG;AAC1C,mBAAa,UAAU;AACvB,uBAAiB,IAAI;AAAA,IACvB;AAEA,UAAM,OAAO,CAAC,cAAsB;AAClC,YAAM,oBAAoB,eAAe,WAAW;AACpD,qBAAe,UAAU;AAEzB,YAAM,SAAS,UAAU;AACzB,YAAM,UAAU,aAAa;AAE7B,UAAI,CAAC,aAAa,WAAW,gBAAgB,SAAS;AACpD,qBAAa,UAAU;AACvB,yBAAiB,MAAM;AACvB,eAAO,UAAU;AACjB;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,WAAW,OAAO,GAAG;AAC/B,qBAAa,UAAU;AACvB,yBAAiB,MAAM;AACvB,6BAAqB,UAAU;AAC/B,eAAO,UAAU,OAAO,sBAAsB,IAAI;AAClD;AAAA,MACF;AAEA,YAAM,UAAU,OAAO,MAAM,QAAQ,MAAM;AAC3C,YAAM,iBAAiB,mBAAmB,OAAO;AACjD,UAAI,eAAe,WAAW,GAAG;AAC/B,eAAO,UAAU,OAAO,sBAAsB,IAAI;AAClD;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,IAAI,GAAG,YAAY,iBAAiB;AAC3D,YAAM,eACJ,mBAAmB,YAAY,OAC3B,yBACA,KAAK,IAAI,GAAG,YAAY,mBAAmB,OAAO;AACxD,YAAM,SACJ,gBAAgB,yBACZ,IACA,KAAK;AAAA,QACH,eAAe,SAAS;AAAA,QACxB,KAAK,IAAI,GAAG,KAAK,KAAM,iBAAiB,mBAAoB,GAAI,CAAC;AAAA,MACnE;AACN,YAAM,oBAAoB,eAAe,SAAS;AAElD,2BAAqB,WAAY,YAAY,MAAQ;AACrD,UAAI,OAAO,KAAK,MAAM,qBAAqB,OAAO;AAClD,UAAI,QAAQ,WAAW,KAAK,oBAAoB,EAAG,QAAO,KAAK,IAAI,GAAG,IAAI;AAE1E,YAAM,cACJ,eAAe,SAAS,mBACpB,KAAK,IAAI,iBAAiB,KAAK,KAAK,eAAe,SAAS,EAAE,CAAC,IAC/D;AACN,aAAO,KAAK,IAAI,mBAAmB,KAAK,IAAI,MAAM,WAAW,CAAC;AAE9D,UAAI,OAAO,GAAG;AACZ,6BAAqB,UAAU,KAAK,IAAI,GAAG,qBAAqB,UAAU,IAAI;AAC9E,cAAM,OAAO,UAAU,QAAQ,MAAM,GAAG,eAAe,OAAO,CAAC,CAAC;AAChE,qBAAa,UAAU;AACvB,yBAAiB,IAAI;AAAA,MACvB;AACA,aAAO,UAAU,OAAO,sBAAsB,IAAI;AAAA,IACpD;AAEA,QAAI,OAAO,YAAY,MAAM;AAC3B,aAAO,UAAU,OAAO,sBAAsB,IAAI;AAAA,IACpD;AAEA,WAAO,MAAM;AACX,UAAI,OAAO,YAAY,MAAM;AAC3B,6BAAqB,OAAO,OAAO;AACnC,eAAO,UAAU;AAAA,MACnB;AACA,qBAAe,UAAU;AACzB,2BAAqB,UAAU;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,cAAc,kBAAkB,gBAAgB,IAAI,aAAa,eAAe,CAAC;AAErF,QAAM,eACJ,OAAO,WAAW,eAClB,OAAO,OAAO,eAAe,cAC7B,OAAO,WAAW,kCAAkC,EAAE;AAExD,SAAO;AAAA,IACL,eAAe,CAAC,eAAe,eAAe,OAAO;AAAA,IACrD,aAAa;AAAA,IACb,MAAM,cAAc,cAAc;AAAA,IAClC,yBAAyB;AAAA,EAC3B;AACF;;;AChRA,IAAAC,SAAuB;AACvB,IAAAC,uBAKO;;;ACMA,SAAS,mBACd,WACe;AACf,SAAO,OAAO;AAAA,IACZ,UAAU,IAAI,CAAC,aAAa;AAAA,MAC1B,SAAS;AAAA,MACT,EAAE,YAAY,IAAI,mBAAmB,CAAC,EAAE;AAAA,IAC1C,CAAC;AAAA,EACH;AACF;AAEO,SAAS,sBACd,OACS;AACT,SAAO;AAAA,IACL,UACG,MAAM,kBAAkB,SAAS,KAChC,MAAM,WAAW,KAAK,EAAE,SAAS;AAAA,EACvC;AACF;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKkB;AAChB,QAAM,oBAAoB,SAAS,cAC/B,MAAM,kBAAkB,SAAS,QAAQ,IACvC,MAAM,kBAAkB,OAAO,CAAC,OAAO,OAAO,QAAQ,IACtD,CAAC,GAAG,MAAM,mBAAmB,QAAQ,IACvC,CAAC,QAAQ;AACb,SAAO;AAAA,IACL,GAAG;AAAA,IACH,CAAC,SAAS,EAAE,GAAG;AAAA,MACb,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAIkB;AAChB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,CAAC,SAAS,EAAE,GAAG;AAAA,MACb;AAAA,MACA,mBAAmB,SAAS,cACxB,OAAO,SAAS,EAAE,GAAG,qBAAqB,CAAC,IAC3C,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAEO,SAAS,yBACd,WACA,QACkB;AAClB,SAAO,UAAU,IAAI,CAAC,aAAa;AACjC,UAAM,SAAS,OAAO,SAAS,EAAE;AACjC,WAAO;AAAA,MACL,YAAY,SAAS;AAAA,MACrB,mBAAmB,QAAQ,qBAAqB,CAAC;AAAA,MACjD,GAAI,QAAQ,WAAW,KAAK,IACxB,EAAE,YAAY,OAAO,WAAW,KAAK,EAAE,IACvC,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AACH;;;AD5BQ,IAAAC,sBAAA;AAtCR,SAAS,mBACP,UACA,QACU;AACV,MAAI,CAAC,OAAQ,QAAO,CAAC,sBAAsB;AAC3C,QAAM,SAAS,OAAO,kBAAkB,QAAQ,CAAC,aAAa;AAC5D,UAAM,SAAS,SAAS,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ;AACnE,WAAO,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC;AAAA,EACpC,CAAC;AACD,MAAI,OAAO,WAAY,QAAO,KAAK,OAAO,UAAU;AACpD,SAAO,OAAO,SAAS,SAAS,CAAC,sBAAsB;AACzD;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,KAAK;AAC5C,QAAM,QAAQ,KAAK,UAAU;AAC7B,QAAM,UAAU,IAAI;AAAA,KACjB,KAAK,YAAY,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW;AAAA,MAC/C,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SACE,8CAAC,SAAI,WAAU,8CACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,iBAAe;AAAA,QACf,WAAU;AAAA,QACV,SAAS,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK;AAAA,QACxC,KAAK;AAAA,QACL,MAAK;AAAA,QAEL;AAAA,wDAAC,UAAK;AAAA;AAAA,YACG;AAAA,YAAM;AAAA,YAAU,UAAU,IAAI,KAAK;AAAA,aAC5C;AAAA,UACC,OACC,6CAAC,oCAAY,eAAY,QAAO,WAAU,YAAW,IAErD;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA;AAAA,UACZ;AAAA;AAAA;AAAA,IAEJ;AAAA,IACC,OACC,6CAAC,SAAI,WAAU,uBACZ,eAAK,UAAU,IAAI,CAAC,aACnB,8CAAC,SAAI,WAAU,WACb;AAAA,mDAAC,SAAI,WAAU,uCACZ,mBAAS,UACZ;AAAA,MACA,6CAAC,SAAI,WAAU,gDACZ;AAAA,QACC;AAAA,QACA,QAAQ,IAAI,SAAS,EAAE;AAAA,MACzB,EAAE,IAAI,CAAC,OAAO,UACZ;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UAGT;AAAA;AAAA,QAFI,GAAG,SAAS,EAAE,IAAI,KAAK;AAAA,MAG9B,CACD,GACH;AAAA,SAhB4B,SAAS,EAiBvC,CACD,GACH,IACE;AAAA,KACN;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,YAAY,KAAK;AACvB,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,CAAC;AACxC,QAAM,CAAC,QAAQ,SAAS,IAAU;AAAA,IAAwB,MACxD,mBAAmB,SAAS;AAAA,EAC9B;AACA,QAAM,aAAmB,cAA2B,IAAI;AACxD,QAAM,eAAqB,cAAO,SAAS;AAC3C,QAAM,oBAA0B,cAA0B,IAAI;AAC9D,QAAM,iBAAuB,cAAO,KAAK,WAAW,SAAS;AAC7D,eAAa,UAAU;AAEvB,EAAM,iBAAU,MAAM;AACpB,YAAQ,CAAC;AACT,cAAU,mBAAmB,aAAa,OAAO,CAAC;AAAA,EACpD,GAAG,CAAC,KAAK,WAAW,CAAC;AAErB,EAAM,iBAAU,MAAM;AACpB,eAAW,SAAS,MAAM;AAAA,EAC5B,GAAG,CAAC,IAAI,CAAC;AAET,EAAM,iBAAU,MAAM;AACpB,UAAM,aAAa,KAAK,WAAW;AACnC,QAAI,cAAc,CAAC,eAAe,SAAS;AACzC,wBAAkB,SAAS,MAAM;AAAA,IACnC;AACA,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,KAAK,MAAM,CAAC;AAEhB,MAAI,KAAK,WAAW,WAAW;AAC7B,WAAO,6CAAC,qBAAkB,WAAW,mBAAmB,MAAY;AAAA,EACtE;AAEA,QAAM,WAAW,UAAU,IAAI;AAC/B,MAAI,CAAC,UAAU;AACb,WACE,6CAAC,SAAI,WAAU,4BAA2B,MAAK,SAAQ,mDAEvD;AAAA,EAEJ;AAEA,QAAM,QAAQ,OAAO,SAAS,EAAE,KAAK;AAAA,IACnC,YAAY;AAAA,IACZ,mBAAmB,CAAC;AAAA,EACtB;AACA,QAAM,iBAAiB,SAAS,UAAU,SAAS;AACnD,QAAM,iBAAiB,sBAAsB,KAAK;AAElD,QAAM,eAAe,CAAC,eAA8B;AAClD,QAAI,gBAAgB;AAClB,iBAAW,yBAAyB,WAAW,UAAU,CAAC;AAC1D;AAAA,IACF;AACA,YAAQ,CAAC,YAAY,KAAK,IAAI,UAAU,GAAG,UAAU,SAAS,CAAC,CAAC;AAAA,EAClE;AAEA,QAAM,eAAe,CAAC,aAAqB;AACzC,UAAM,aAAa,oBAAoB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,cAAU,UAAU;AACpB,QAAI,CAAC,SAAS,YAAa,cAAa,UAAU;AAAA,EACpD;AAEA,QAAM,mBAAmB,CAAC,eAAuB;AAC/C;AAAA,MAAU,CAAC,YACT,wBAAwB;AAAA,QACtB;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SACE,8CAAC,SAAI,WAAU,yFACb;AAAA,kDAAC,SAAI,WAAU,kDACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,KAAK;AAAA,UACL,UAAU;AAAA,UAET,mBAAS;AAAA;AAAA,MACZ;AAAA,MACA,8CAAC,SAAI,WAAU,0DACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,WAAU;AAAA,YACV,UAAU,UAAU,SAAS;AAAA,YAC7B,SAAS,MAAM,QAAQ,CAAC,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC;AAAA,YAC5D,MAAK;AAAA,YAEL;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,YAAY,OAAO,CAAC,OAAO,UAAU,MAAM;AAAA,YACvD,WAAU;AAAA,YAET;AAAA,qBAAO;AAAA,cAAE;AAAA,cAAI,UAAU;AAAA;AAAA;AAAA,QAC1B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,iBAAiB,mBAAmB;AAAA,YAChD,WAAU;AAAA,YACV,UAAU,UAAU,CAAC,YAAY,CAAC;AAAA,YAClC,SAAS,MAAM,aAAa,MAAM;AAAA,YAClC,MAAK;AAAA,YAEL;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF;AAAA,IAEA,8CAAC,SAAI,WAAU,aACZ;AAAA,eAAS,QAAQ,IAAI,CAAC,QAAQ,UAAU;AACvC,cAAM,WAAW,MAAM,kBAAkB,SAAS,OAAO,EAAE;AAC3D,eACE;AAAA,UAAC;AAAA;AAAA,YACC,gBAAc;AAAA,YACd,WAAW;AAAA,cACT;AAAA,cACA,WAAW,aAAa;AAAA,YAC1B;AAAA,YACA,UAAU,UAAU,CAAC;AAAA,YAErB,SAAS,MAAM,aAAa,OAAO,EAAE;AAAA,YACrC,MAAK;AAAA,YAEL;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,WACI,gDACA;AAAA,kBACN;AAAA,kBAEC,kBAAQ;AAAA;AAAA,cACX;AAAA,cACA,6CAAC,UAAK,WAAU,8CACb,iBAAO,OACV;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAU;AAAA;AAAA,cACZ;AAAA;AAAA;AAAA,UApBK,OAAO;AAAA,QAqBd;AAAA,MAEJ,CAAC;AAAA,MAED,8CAAC,SAAI,WAAU,iHACb;AAAA,qDAAC,UAAK,WAAU,gIACd,uDAAC,+BAAO,eAAY,QAAO,WAAU,UAAS,GAChD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,cAAa;AAAA,YACb,WAAU;AAAA,YACV,UAAU,UAAU,CAAC;AAAA,YACrB,WAAW;AAAA,YACX,UAAU,CAAC,UAAU,iBAAiB,MAAM,OAAO,KAAK;AAAA,YACxD,WAAW,CAAC,UAAU;AACpB,kBACE,MAAM,QAAQ,WACd,CAAC,MAAM,YAAY,eACnB,MAAM,WAAW,KAAK,GACtB;AACA,sBAAM,eAAe;AACrB,6BAAa,MAAM;AAAA,cACrB;AAAA,YACF;AAAA,YACA,aAAY;AAAA,YACZ,OAAO,MAAM;AAAA;AAAA,QACf;AAAA,QACC,MAAM,WAAW,KAAK,IACrB;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,UAAU,UAAU,CAAC;AAAA,YACrB,SAAS,MAAM,aAAa,MAAM;AAAA,YAClC,MAAK;AAAA,YAEJ,2BAAiB,WAAW;AAAA;AAAA,QAC/B,IACE;AAAA,SACN;AAAA,OACF;AAAA,IAEC,QACC,6CAAC,SAAI,WAAU,4BAA2B,MAAK,SAC5C,iBACH,IACE;AAAA,KACN;AAEJ;;;AE/QU,IAAAC,sBAAA;AAnCV,SAAS,wBAAwB,MAG/B;AACA,MAAI,KAAK,WAAW,UAAU;AAC5B,WAAO,EAAE,OAAO,qCAAqC,QAAQ,SAAS;AAAA,EACxE;AACA,MAAI,KAAK,WAAW,aAAa;AAC/B,WAAO,EAAE,OAAO,6BAA6B,QAAQ,YAAY;AAAA,EACnE;AACA,SAAO,EAAE,OAAO,8BAA8B,QAAQ,UAAU;AAClE;AAEO,SAAS,+BAA+B;AAAA,EAC7C;AAAA,EACA;AACF,GAGG;AACD,QAAM,eAAe,wBAAwB,IAAI;AACjD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACtD,qCAAkC;AAAA,MAClC,eAAa,KAAK;AAAA,MAClB,MAAK;AAAA,MAEL,uDAAC,SAAI,WAAU,wBACb,uDAAC,SAAI,WAAW;AAAA,QACd;AAAA,QACA,aAAa,WAAW,YAAY;AAAA,QACpC,aAAa,WAAW,aAAa;AAAA,MACvC,GACE,uDAAC,UAAK,WAAW;AAAA,QACf;AAAA,QACA,aAAa,WAAW,aAAa;AAAA,MACvC,GACG,uBAAa,OAChB,GACF,GACF;AAAA;AAAA,EACF;AAEJ;;;AClDA,IAAAC,SAAuB;AACvB,wBAAiD;;;ACD1C,IAAM,+BAA+B,OAAO,OAAO;AAAA,EACxD,iBAAiB;AAAA,EACjB,sBAAsB,CAAC;AAAA,EACvB,qBAAqB,CAAC,GAAG;AAAA,EACzB,kBAAkB,CAAC;AAAA,EACnB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,iBAAiB;AACnB,CAAC;AAEM,SAAS,qBAAqB,OAAoC;AACvE,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,WAAW,GAAG,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,IAAI,aAAa,YAAY,IAAI,aAAa,UAAU,IAAI,OAAO;AAAA,EAC5E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADUwB,IAAAC,sBAAA;AAJxB,SAAS,iBAAiB,EAAE,UAAU,MAAM,GAAG,MAAM,GAAqD;AACxG,QAAM,WAAW,EAAE,GAAG,MAAM;AAC5B,SAAO,SAAS;AAChB,QAAM,WAAW,qBAAqB,IAAI;AAC1C,MAAI,CAAC,SAAU,QAAO,6CAAC,UAAM,UAAS;AACtC,MAAI,SAAS,WAAW,GAAG,EAAG,QAAO,6CAAC,OAAG,GAAG,UAAU,MAAM,UAAW,UAAS;AAChF,SAAO,6CAAC,OAAG,GAAG,UAAU,MAAM,UAAU,KAAI,uBAAsB,QAAO,UAAU,UAAS;AAC9F;AAEA,SAAS,qBAAqB,EAAE,IAAI,GAAuD;AACzF,SAAO,MAAM,6CAAC,UAAK,cAAY,kBAAkB,GAAG,IAAI,MAAK,OAAO,eAAI,IAAU;AACpF;AAEA,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,oBAAoB,MAAqB;AAChD,SACE,MAAM,YAAY,UAClB,KAAK,UAAU,OAAO,SAAS,UAC/B,KAAK,UAAU,KAAK,SAAS,UAC7B,KAAK,SAAS,MAAM,SAAS,KAAK,SAAS,IAAI;AAEnD;AAEA,SAAS,sBAAsB,OAAiC;AAC9D,MAAI,CAAO,sBAAe,KAAK,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAM,SAAS,YAAY,oBAAoB,IAAI,MAAM,IAAI,GAAG;AACzE,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM;AACpB,MAAI,oBAAoB,IAAI,MAAM,MAAM,WAAW,EAAE,KAAK,oBAAoB,MAAM,IAAI,GAAG;AACzF,WAAO;AAAA,EACT;AAEA,SAAa,gBAAS,QAAQ,MAAM,QAAQ,EAAE,KAAK,qBAAqB;AAC1E;AAEA,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA,GAAG;AACL,GAAqD;AACnD,QAAM,WAAW,EAAE,GAAG,MAAM;AAC5B,SAAO,SAAS;AAChB,QAAM,aAAmB,gBAAS,QAAQ,QAAQ,EAAE;AAAA,IAClD,CAAC,UAAU,UAAU,QAAQ,UAAU;AAAA,EACzC;AACA,QAAM,cACJ,WAAW,WAAW,KAChB,sBAAe,WAAW,CAAC,CAAC,KACjC,WAAW,CAAC,EAAE,MAA+B,MAAM,YAAY;AAElE,MAAI,aAAa;AACf,WAAO,6EAAG,UAAS;AAAA,EACrB;AAEA,MAAI,WAAW,KAAK,qBAAqB,GAAG;AAC1C,WAAO,6CAAC,SAAK,GAAG,UAAW,UAAS;AAAA,EACtC;AAEA,SAAO,6CAAC,OAAG,GAAG,UAAW,UAAS;AACpC;AAMA,IAAM,8BAA8B;AAAA,EAClC,GAAG;AAAA,EACH,KAAK;AAAA,EACL,GAAG;AACL;AAMA,IAAM,iCAAkC,0CAAwB,CAAC;AAIjE,IAAM,yBAAyB,MAAM;AAAA,EACnC,+BAA+B;AACjC,IACI,+BAA+B,OAAO,CAAC,IACvC,+BAA+B;AAEnC,IAAM,kCAAkC;AAAA,EACtC,GAAG,OAAO,QAAQ,8BAA8B,EAC7C,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,QAAQ,EAClC,IAAI,CAAC,CAAC,EAAE,MAAM,MAAM,MAAM;AAAA,EAC7B,GAAI,yBACA;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,EACF,IACA,CAAC;AACP;AAEO,IAAM,kBAAwB;AAAA,EACnC,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,MAA4B;AAC1B,UAAM,OACJ,OAAO,aAAa,YAAY,OAAO,aAAa,WAChD,OAAO,QAAQ,IACf;AACN,UAAM,gBAAgB,iBAAiB;AAAA,MACrC,gBAAgB;AAAA,MAChB,IAAI,eAAe;AAAA,MACnB,aAAa,aAAa,KAAK,SAAS;AAAA,MACxC,iBAAiB;AAAA,MACjB;AAAA,IACF,CAAC;AACD,UAAM,uBAA6B;AAAA,MACjC,OAAO,EAAE,GAAG,6BAA6B,GAAG,WAAW;AAAA,MACvD,CAAC,UAAU;AAAA,IACb;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,wBAAwB,SAAS;AAAA,QAC/C,YAAY;AAAA,QACZ,eAAe,iBAAiB;AAAA,QAC/B,GAAG;AAAA,QAEH,iBAAO,cAAc,gBAAgB;AAAA;AAAA,IACxC;AAAA,EAEJ;AAAA,EACA,CAAC,WAAW,cACV,UAAU,aAAa,UAAU,YACjC,UAAU,cAAc,UAAU,aAClC,UAAU,cAAc,UAAU,aAClC,UAAU,gBAAgB,UAAU,eACpC,UAAU,eAAe,UAAU;AACvC;AAEA,gBAAgB,cAAc;;;AE1L9B,SAAS,eAAe,OAA+B;AACrD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEO,SAAS,gBAAgB,MAAoB,QAAgC;AAClF,MAAI,WAAW,UAAW,QAAO,CAAC,eAAe,qBAAqB,EAAE,SAAS,KAAK,QAAQ,IAAI,eAAe;AACjH,MAAI,WAAW,SAAU,QAAO,CAAC,eAAe,qBAAqB,EAAE,SAAS,KAAK,QAAQ,IAAI,qBAAgB;AACjH,MAAI,WAAW,UAAW,QAAO;AACjC,MAAI,WAAW,UAAW,QAAO;AACjC,SAAO;AACT;AAEO,SAAS,UAAU,MAA4B;AACpD,QAAM,eAAe,KAAK,gBAAgB,CAAC;AAC3C,MAAI,KAAK,aAAa,cAAe,QAAO,OAAO,eAAe,aAAa,SAAS,KAAK,WAAW;AACxG,MAAI,KAAK,aAAa,YAAY;AAChC,UAAM,aAAa,eAAe,aAAa,WAAW;AAC1D,WAAO,aAAa,WAAW,UAAU,iBAAiB,KAAK;AAAA,EACjE;AACA,MAAI,KAAK,aAAa,sBAAuB,QAAO;AACpD,SAAO,KAAK;AACd;AAEO,SAAS,kBAAkB,MAA4B;AAC5D,QAAM,UAAU,OAAO,KAAK,YAAY,WAAW,KAAK,MAAM,EAAE,KAAK,EAAE,YAAY;AACnF,SAAO;AAAA,IACL,UAAU,KAAK,aAAa,kBAAkB,aAAa;AAAA,IAC3D,UAAU,KAAK,aAAa,kBAAkB,aAAa;AAAA,IAC3D,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb,eAAe;AAAA,EACjB,EAAE,OAAO,KAAK,QAAQ,QAAQ,MAAM,GAAG;AACzC;;;ACtCA,IAAAC,SAAuB;AACvB,IAAAC,uBAA0C;AAC1C,2BAA4B;AA4JxB,IAAAC,sBAAA;AAhIG,SAAS,mBAAmB,MAA4B;AAC7D,QAAM,eAAe,KAAK,gBAAgB,CAAC;AAC3C,SAAO,aAAa,aAAa,QAAQ,KACpC,aAAa,aAAa,KAAK,KAC/B,aAAa,KAAK,WAAW,KAC7B,aAAa,KAAK,OAAO,KACzB,aAAa,KAAK,QAAQ,KAC1B;AACP;AAEO,SAAS,oBAAoB,MAA6B;AAC/D,QAAM,aAAa,OAAO,KAAK,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY;AACpE,SAAO,eAAe,WAAW,eAAe,gBAAgB,QAAQ,KAAK,aAAa,QAAQ;AACpG;AAEO,SAAS,uBAAuB,MAA6B;AAClE,SAAO,KAAK,UAAU,qBAAqB,KAAK,UAAU;AAC5D;AAEO,SAAS,6BAA6B,OAA+C;AAC1F,QAAM,SAAS,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,sBAAsB;AAC/D,SAAO,QAAQ,cAAc,QAAQ,MAAM;AAC7C;AAEO,SAAS,+BACd,OACA,eAAsC,UACN;AAChC,QAAM,WAA2C,CAAC;AAClD,MAAI,QAAQ;AACZ,SAAO,QAAQ,MAAM,QAAQ;AAC3B,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,mBAAmB,KAAK,SAAS,gBAClC,MAAM,QAAQ,CAAC,GAAG,SAAS,UAC3B,CAAC,oBAAoB,MAAM,QAAQ,CAAC,CAAiB,IACtD,OACA;AACJ,QAAI,iBAAkB,UAAS;AAC/B,UAAM,YAAY,MAAM,KAAK;AAC7B,QAAI,UAAU,SAAS,QAAQ;AAC7B,eAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC;AAC/C,eAAS;AACT;AAAA,IACF;AACA,QAAI,oBAAoB,SAAS,GAAG;AAClC,eAAS,KAAK,EAAE,MAAM,YAAY,MAAM,UAAU,CAAC;AACnD,eAAS;AACT;AAAA,IACF;AACA,UAAM,SAAyB,CAAC;AAChC,WAAO,QAAQ,MAAM,QAAQ;AAC3B,YAAMC,aAAY,MAAM,KAAK;AAC7B,UAAIA,WAAU,SAAS,UAAU,oBAAoBA,UAAS,EAAG;AACjE,aAAO,KAAKA,UAAS;AACrB,eAAS;AAAA,IACX;AACA,UAAM,YAAY,MAAM,KAAK,GAAG,SAAS,eAAe,MAAM,KAAK,IAAyB;AAC5F,QAAI,UAAW,UAAS;AACxB,QAAI,iBAAiB,YAAY;AAC/B,UAAI,iBAAkB,UAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,iBAAiB,CAAC;AAC5E,eAAS,KAAK,GAAG,OAAO,IAAI,CAAC,cAAc,EAAE,MAAM,QAAiB,MAAM,SAAS,EAAE,CAAC;AACtF,UAAI,UAAW,UAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC;AAAA,IAChE,WAAW,OAAO,WAAW,KAAK,CAAC,aAAa,CAAC,kBAAkB;AACjE,eAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC,EAAE,CAAC;AAAA,IACjD,OAAO;AACL,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,QAC/C,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAA+B;AACnD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,SAAS,MAAoB,cAAuC;AAC3E,SAAO,QAAQ,iBAAiB,KAAK,OAAO,gBAAgB,KAAK,eAAe,aAAa;AAC/F;AAEA,SAAS,iBAAiB;AAAA,EACxB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,UAAU,gBAAgB,iBAAiB,QAAQ,eAAe;AACxE,QAAM,uBAAuB,iBAAiB,KAAK,MAAM,cAAc,IAAI,OAAO;AAClF,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAS,OAAO;AACxD,QAAM,CAAC,UAAU,WAAW,IAAU,gBAAwB,IAAI;AAClE,QAAM,eAAqB,cAAO,OAAO;AACzC,QAAM,YAAkB,cAAO,KAAK;AACpC,QAAM,aAAmB,cAAO,OAAO,SAAS,oBAAoB,IAAI,uBAAuB,KAAK,IAAI,CAAC;AACzG,EAAM,iBAAU,MAAM;AACpB,cAAU,UAAU;AACpB,QAAI,aAAa,YAAY,MAAO;AACpC,UAAM,aAAa,MAAM;AACvB,YAAM,OAAO,UAAU;AACvB,UAAI,aAAa,YAAY,KAAM;AACnC,YAAM,MAAM,aAAa;AACzB,mBAAa,UAAU;AACvB,iBAAW,UAAU,KAAK,IAAI;AAC9B,kBAAY,GAAG;AACf,mBAAa,IAAI;AAAA,IACnB;AACA,UAAM,YAAY,KAAK,IAAI,GAAG,OAAO,KAAK,IAAI,IAAI,WAAW,QAAQ;AACrE,QAAI,cAAc,GAAG;AACnB,iBAAW;AACX;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,WAAW,YAAY,SAAS;AACrD,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EACxC,GAAG,CAAC,KAAK,CAAC;AACV,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,SAAU;AACf,UAAM,QAAQ,OAAO,WAAW,MAAM,YAAY,IAAI,GAAG,GAAG;AAC5D,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EACxC,GAAG,CAAC,QAAQ,CAAC;AACb,SACE,8CAAC,UAAK,WAAU,iBAAgB,aAAW,WAAW,WAAW,OAC9D;AAAA,eAAW,6CAAC,UAAK,eAAY,QAAO,WAAU,2BAA2B,oBAAS,IAAU;AAAA,IAC7F,6CAAC,UAAK,WAAW,WAAW,2BAA2B,QAAY,qBAAU;AAAA,KAC/E;AAEJ;AAEA,SAAS,gBAAgB,EAAE,MAAM,GAAuB;AACtD,SACE,6CAAC,UAAK,WAAU,gBACd,uDAAC,oCAAY,cAAY,SAAS,WAAW,MAAM,IAAI,OAAO,KAAK,OAAM,aAAY,GACvF;AAEJ;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,UACJ,8EACE;AAAA,iDAAC,mBAAgB,OAAc;AAAA,IAC/B,6CAAC,UAAK,WAAU,4CAA2C,uDAAC,oBAAiB,OAAc,GAAE;AAAA,KAC/F;AAEF,SACE,6CAAC,SAAI,WAAU,wBAAuB,4BAA0B,aAAa,MAAK,UAC/E,qBACC,6CAAC,YAAO,WAAU,oEAAmE,SAAS,UAAU,MAAK,UAAU,mBAAQ,IAE/H,6CAAC,SAAI,WAAU,oEAAoE,mBAAQ,GAE/F;AAEJ;AAEO,SAAS,sBAAsB,EAAE,KAAK,GAAgC;AAC3E,SAAO,6CAAC,wBAAqB,OAAM,uBAAsB,aAAa,KAAK,aAAa;AAC1F;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,KAAK;AAC5C,QAAM,YAAkB,aAAM;AAC9B,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,SAAS,KAAK,WAAW;AAC/B,QAAM,iBAAiB,KAAK,SAAS,WAAW;AAChD,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,CAAC,WAAW;AAAA,IACZ,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AACA,QAAM,QAAQ,UACV,6CAAC,UAAK,WAAU,oBAAmB,uDAAC,oBAAiB,OAAO,KAAK,OAAO,GAAE,IAC1E,KAAK;AACT,MAAI,CAAC,QAAQ;AACX,WACE,6CAAC,SAAI,WAAU,wBAAuB,MAAK,UACxC,qBACC,8CAAC,YAAO,WAAW,kBAAkB,SAAS,MAAM,SAAS,IAAI,GAAG,MAAK,UACtE;AAAA,gBAAU,6CAAC,mBAAgB,OAAO,KAAK,OAAO,IAAK;AAAA,MACpD,6CAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,OACnD,IAEA,8CAAC,SAAI,WAAW,kBACb;AAAA,gBAAU,6CAAC,mBAAgB,OAAO,KAAK,OAAO,IAAK;AAAA,MACpD,6CAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,OACnD,GAEJ;AAAA,EAEJ;AACA,SACE,8CAAC,SAAI,WAAU,uBACb;AAAA,iDAAC,SAAI,WAAU,wBACb;AAAA,MAAC;AAAA;AAAA,QACC,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,WAAW;AAAA,QACX,SAAS,MAAM;AACb,qBAAW,IAAI;AACf,kBAAQ,CAAC,UAAU,CAAC,KAAK;AAAA,QAC3B;AAAA,QACA,MAAK;AAAA,QAEL;AAAA,uDAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,UAChD,OAAO,6CAAC,oCAAY,eAAY,QAAO,WAAU,6BAA4B,IAAK,6CAAC,qCAAa,eAAY,QAAO,WAAU,6BAA4B;AAAA;AAAA;AAAA,IAC5J,GACF;AAAA,IACC,OAAO,6CAAC,SAAI,WAAU,0CAAyC,IAAI,WAAY,0BAAe,IAAS;AAAA,KAC1G;AAEJ;AAEA,SAAS,aAAa,MAA4B;AAChD,QAAM,QAAQ,mBAAmB,IAAI;AACrC,SAAO,uBAAuB,IAAI,IAAI,QAAQ,MAAM,QAAQ,wBAAwB,EAAE;AACxF;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAaG;AACD,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,KAAK;AAC5C,QAAM,YAAkB,aAAM;AAC9B,QAAM,aAAmB,gBAAS,QAAQ,QAAQ,EAAE,SAAS;AAC7D,MAAI,CAAC,YAAY;AACf,UAAM,mBAAmB,GAAG,oBAAoB,QAAQ,0BAA0B,QAAQ,CAAC,WAAW,iCAAiC,SAAS,2BAA2B,WAAW,0BAA0B;AAChN,WACE,8CAAC,SAAI,WAAU,wBACZ;AAAA,kBAAY,OACX,8CAAC,YAAO,WAAW,kBAAkB,SAAS,MAAM,SAAS,IAAI,GAAG,MAAK,UACtE;AAAA,kBAAU,6CAAC,mBAAgB,OAAO,aAAa,IAAK;AAAA,QACrD,6CAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,SACnD,IAEA,8CAAC,SAAI,WAAW,kBACb;AAAA,kBAAU,6CAAC,mBAAgB,OAAO,aAAa,IAAK;AAAA,QACrD,6CAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,SACnD;AAAA,MAED;AAAA,OACH;AAAA,EAEJ;AACA,SACE,8CAAC,SAAI,WAAU,uBACb;AAAA,kDAAC,SAAI,WAAU,wBACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,WAAW,GAAG,oBAAoB,QAAQ,0BAA0B,QAAQ,CAAC,WAAW,iCAAiC,SAAS,2BAA2B,WAAW,0BAA0B;AAAA,UAClM,SAAS,MAAM;AACb,kBAAM,WAAW,CAAC;AAClB,oBAAQ,QAAQ;AAChB,gBAAI,KAAM,YAAW,IAAI;AACzB,+BAAmB,UAAU,IAAI;AAAA,UACnC;AAAA,UACA,MAAK;AAAA,UAEJ;AAAA,sBAAU,6CAAC,mBAAgB,OAAO,aAAa,IAAK;AAAA,YACrD,6CAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,YAChD,OAAO,6CAAC,oCAAY,eAAY,QAAO,WAAU,6BAA4B,IAAK,6CAAC,qCAAa,eAAY,QAAO,WAAU,6BAA4B;AAAA;AAAA;AAAA,MAC5J;AAAA,MACC;AAAA,OACH;AAAA,IACC,OAAO,6CAAC,SAAI,WAAU,gCAA+B,IAAI,WAAY,UAAS,IAAS;AAAA,KAC1F;AAEJ;AAEA,SAAS,UAAU,EAAE,QAAQ,OAAO,MAAM,MAAM,GAAuF;AACrI,QAAM,WAAW,OAAO,kBAAkB,EAAE,UAAU,QAAQ,OAAO,KAAK,CAAC,KAAK;AAChF,SAAO,SAAS,6CAAC,UAAK,WAAU,oBAAoB,oBAAS,IAAU,6EAAG,oBAAS;AACrF;AAEA,SAAS,SAAS,EAAE,SAAS,GAAkC;AAC7D,QAAM,UAAgB,cAAuB,IAAI;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAS,EAAE,QAAQ,OAAO,KAAK,MAAM,CAAC;AACtE,QAAM,cAAoB,mBAAY,MAAM;AAC1C,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM;AACX,UAAM,OAAO;AAAA,MACX,QAAQ,KAAK,YAAY,KAAK,eAAe,KAAK,eAAe;AAAA,MACjE,KAAK,KAAK,YAAY;AAAA,IACxB;AACA,aAAS,CAAC,YAAY,QAAQ,WAAW,KAAK,UAAU,QAAQ,QAAQ,KAAK,MAAM,UAAU,IAAI;AAAA,EACnG,GAAG,CAAC,CAAC;AAEL,EAAM,iBAAU,MAAM;AACpB,gBAAY;AACZ,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,QAAQ,OAAO,mBAAmB,YAAa;AACpD,UAAM,WAAW,IAAI,eAAe,WAAW;AAC/C,aAAS,QAAQ,IAAI;AACrB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,2BAAyB,MAAM,SAAS,KAAK;AAAA,MAC7C,wBAAsB,MAAM,MAAM,KAAK;AAAA,MAEvC,uDAAC,SAAI,WAAU,iBAAgB,UAAU,aAAa,KAAK,SAAS,MAAK,QACtE,UACH;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAMG;AACD,QAAM,SAAS,SAAS,MAAM,YAAY;AAC1C,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,iBAAiB,KAAK,SAAS,WAAW;AAChD,QAAM,SAAS,SAAS,iBAAiB,aAAa,KAAK,aAAa,MAAM;AAC9E,QAAM,cAAc,SAAS,OAAO,OAAO,oBAAoB,IAAI;AACnE,QAAM,UAAU,EAAE,UAAU,QAAQ,OAAO,aAAa,IAAI,GAAG,KAAK;AACpE,SACE,6CAAC,SAAI,2BAAyB,KAAK,MAAM,cAAY,KAAK,OACxD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,WAAW,OAAO,sBAAsB,OAAO;AAAA,MAC/C,OAAO,6CAAC,aAAU,QAAgB,OAAO,QAAQ,OAAO,MAAY,OAAc;AAAA,MAClF,SAAS;AAAA,MACT,kBAAkB,OAAO;AAAA,MACzB,UAAU,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA,SAAS,WAAW;AAAA,MACpB,aAAa,SAAS,QAAQ,QAAQ;AAAA,MAErC;AAAA,iBAAS,6CAAC,SAAI,WAAW,GAAG,mBAAmB,UAAU,wBAAwB,GAAI,kBAAO,IAAS;AAAA,QACrG;AAAA;AAAA;AAAA,EACH,GACF;AAEJ;AAEA,SAAS,aAAa,OAAgC,aAA2B,SAA0B;AACzG,QAAM,QAAQ,mBAAmB,WAAW;AAC5C,QAAM,gBAAgB,MAAM,QAAQ,wBAAwB,EAAE;AAC9D,SAAO,UAAU,QAAQ,OAAO,aAAa,MAAM,MAAM,SAAS,CAAC;AACrE;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,mBAAyB,cAAO,KAAK;AAC3C,MAAI,UAAU,iBAAkB,kBAAiB,UAAU;AAC3D,QAAM,cAAc,MAAM,cAAc,CAAC,SAAS,SAAS,MAAM,YAAY,CAAC;AAC9E,QAAM,UAAU,eAAe;AAC/B,MAAI,MAAM,WAAW,KAAK,CAAC,aAAa,CAAC,iBAAkB,QAAO,6CAAC,oBAAiB,cAA4B,MAAM,MAAM,CAAC,GAAG,OAAc;AAC9I,QAAM,eAAe,UAAU,cAAc,MAAM,SAAS;AAC5D,QAAM,cAAc,MAAM,YAAY;AACtC,QAAM,WAAW,QAAQ,SAAS;AAClC,QAAM,qBAAqB,qBAAqB,YAAY,WAAW;AACvE,QAAM,SAAS,qBACT,YAAY,UAAU,kBAAkB,YAAY,UAAU;AACpE,QAAM,QAAQ,WACV,wBACA,UAAU,mBACR,mBAAmB,WAAW,IAC9B,aAAa,OAAO,aAAa,OAAO;AAC9C,QAAM,eAAe,iBAAiB,UAClC,6CAAC,UAAK,WAAW,qBAAqB,qBAAqB,QAAW,uDAAC,oBAAiB,cAAc,mBAAmB,wBAAwB,QAAW,gBAAgB,kBAAkB,WAAW,OAAc,GAAE,IACzN;AACJ,QAAM,UAAU,EAAE,UAAU,oBAAoB,OAAO,MAAM,YAAY;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,OAAO,sBAAsB,OAAO;AAAA,MAC/C,OAAO;AAAA,MACP,SAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,kBAAkB,OAAO;AAAA,MACzB,MAAM;AAAA,MACN,MAAI;AAAA,MACJ,SAAS,UAAU;AAAA,MACnB,aAAa,WAAW,wBAAwB;AAAA,MAEhD,uDAAC,YACE,gBAAM,IAAI,CAAC,SAAS,6CAAC,SAAkB,MAAK,YAAW,uDAAC,oBAAiB,cAA4B,MAAY,MAAM,OAAO,SAAS,OAAO,OAAc,KAA9H,KAAK,EAA2H,CAAM,GACvK;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,WAAW,OAA8B;AAChD,SAAO,aAAa,MAAM,KAAK,KAAK,aAAa,MAAM,QAAQ,KAAK;AACtE;AAEA,SAAS,cAAc,MAAyD;AAC9E,QAAM,WAAW,KAAK,aAAa;AACnC,QAAM,WAAW,KAAK,aAAa,cAAc,CAAC;AAClD,QAAM,OAAO,aAAa,UAAU,SAAS,KAAK,aAAa,KAAK,WAAW,KAAK;AACpF,QAAM,SAAS,OAAO,UAAU,WAAW,uBAAuB,IAAI,IAAI,YAAY,YAAY,EAAE,YAAY;AAChH,QAAM,cAAc,SAAS,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,aAAa,iBAAiB,KACxF,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,SAAS,KAClE,SAAS,SAAS,SAAS,CAAC;AACjC,MAAI,WAAW,aAAa,YAAa,QAAO,EAAE,OAAO,SAAS,IAAI,aAAa,WAAW,WAAW,CAAC,IAAI,SAAS,KAAK;AAC5H,MAAI,WAAW,UAAW,QAAO,EAAE,OAAO,SAAS,IAAI,cAAc,SAAS,KAAK;AACnF,MAAI,WAAW,YAAY,KAAK,UAAU,eAAgB,QAAO,EAAE,OAAO,SAAS,IAAI,YAAY,SAAS,MAAM;AAClH,MAAI,WAAW,eAAe,WAAW,cAAc,KAAK,UAAU,YAAa,QAAO,EAAE,OAAO,SAAS,IAAI,eAAe,SAAS,MAAM;AAC9I,MAAI,WAAW,SAAU,QAAO,EAAE,OAAO,SAAS,IAAI,YAAY,SAAS,MAAM;AACjF,SAAO,EAAE,OAAO,SAAS,IAAI,SAAS,SAAS,MAAM,IAAI,SAAS,WAAW,IAAI,SAAS,OAAO,IAAI,SAAS,MAAM;AACtH;AAEO,SAAS,uBAAuB,EAAE,mBAAmB,MAAM,SAAS,OAAO,MAAM,MAAM,GAAqG;AACjM,QAAM,mBAAyB,cAAO,KAAK;AAC3C,MAAI,UAAU,iBAAkB,kBAAiB,UAAU;AAC3D,QAAM,WAAW,KAAK,aAAa,cAAc,CAAC;AAClD,QAAM,QAAQ,cAAc,IAAI;AAChC,QAAM,iBAAiB,OAAO,KAAK,aAAa,UAAU,UAAU,EAAE,EAAE,YAAY;AACpF,QAAM,SAAS,KAAK,UAAU,kBACzB,KAAK,UAAU,eACf,mBAAmB,YACnB,mBAAmB,eACnB,mBAAmB;AACxB,QAAM,cAAc,SAAS,OAAO,OAAO,oBAAoB,IAAI;AACnE,QAAM,iBAAiB,KAAK,SAAS,WAAW;AAChD,QAAM,qBAAqB,oBAAoB,MAAM;AACrD,QAAM,eAAe,iBAAiB,UAClC,6CAAC,UAAK,WAAW,qBAAqB,qBAAqB,QAAW,uDAAC,oBAAiB,OAAO,MAAM,OAAO,GAAE,IAC9G,MAAM;AACV,QAAM,UAAU,EAAE,UAAU,oBAAoB,OAAO,MAAM,OAAO,KAAK;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,OAAO,sBAAsB,OAAO;AAAA,MAC/C,OAAO;AAAA,MACP,SAAO;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,MACT,kBAAkB,OAAO;AAAA,MACzB;AAAA,MACA,MAAI;AAAA,MACJ,SAAS,UAAU;AAAA,MACnB,aAAa,MAAM;AAAA,MAEnB,wDAAC,YACE;AAAA,iBAAS,IAAI,CAAC,UACb,6CAAC,SAAI,WAAW,GAAG,kBAAkB,MAAM,WAAW,YAAY,uBAAuB,GAAkB,MAAK,YAC7G,iBAAO,kBAAkB,OAAO,IAAI,KACnC,8EACE;AAAA,uDAAC,UAAK,WAAW,GAAG,UAAU,oBAAoB,MAAM,WAAW,aAAa,kBAAkB,GAAI,qBAAW,KAAK,GAAE;AAAA,UACvH,MAAM,SAAS,6CAAC,UAAK,WAAU,0BAA0B,gBAAM,QAAO,IAAU;AAAA,WACnF,KAL6F,MAAM,EAOvG,CACD;AAAA,QACA,iBAAiB,6CAAC,SAAI,WAAU,0CAA0C,0BAAe,IAAS;AAAA,QAClG;AAAA,SACH;AAAA;AAAA,EACF;AAEJ;;;ARnfS,IAAAC,sBAAA;AANT,SAAS,sBAAsB,MAA6B;AAC1D,SAAO,CAAC,KAAK,UAAU,KAAK,SAAS,KAAK,MAAM,EAC7C,KAAK,CAAC,UAAU,OAAO,KAAK,EAAE,YAAY,MAAM,mBAAmB;AACxE;AAEA,SAAS,QAAQ,EAAE,UAAU,UAAU,GAAsD;AAC3F,SAAO,6CAAC,UAAK,WAAW,GAAG,8BAA8B,SAAS,GAAI,UAAS;AACjF;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAGG;AACD,SAAO,6CAAC,oBAAiB,cAA4B,MAAY;AACnE;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAGG;AACD,SAAO,6CAAC,wBAAqB,cAA4B,OAAc;AACzE;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,QAAQ,qBAAqB,IAAI;AACvC,QAAM,CAAC,SAAS,UAAU,IAAU,gBAAS,EAAE;AAC/C,QAAM,eAAe,KAAK,gBAAgB,CAAC;AAC3C,QAAM,iBAAiB,aAAa,oBAAoB;AACxD,QAAM,aAAa,KAAK,WAAW;AACnC,QAAM,cAAoB,cAAuB,IAAI;AACrD,QAAM,cAAoB,cAAO,UAAU;AAC3C,EAAM,iBAAU,MAAM;AACpB,QAAI,cAAc,CAAC,YAAY,QAAS,aAAY,SAAS,MAAM;AACnE,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,UAAU,CAAC;AACf,MAAI,KAAK,aAAa,cAAc;AAClC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,OAAO;AAAA,QACd,QAAQ,aAAa,OAAO,WAAW;AAAA,QACvC,UAAU,eAAe,CAAC,YAAY,aAAa,MAAM;AAAA,UACvD,QAAQ;AAAA,UACR,SAAS,QAAQ,IAAI,CAAC,YAAY;AAAA,YAChC,aAAa,OAAO;AAAA,YACpB,qBAAqB,OAAO;AAAA,YAC5B,GAAI,OAAO,aAAa,EAAE,aAAa,OAAO,WAAW,IAAI,CAAC;AAAA,UAChE,EAAE;AAAA,QACJ,CAAC,IAAI;AAAA,QACL;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,MAAI,YAAY;AACd,WACE,6CAAC,SAAI,WAAU,uEAAsE,KAAK,aAAa,MAAK,UAAS,UAAU,IAAK,4BAAkB,IAAI,GAAE;AAAA,EAEhK;AACA,SACE,8CAAC,SAAI,WAAU,kCACb;AAAA,iDAAC,SAAI,WAAU,mEAAmE,oBAAU,IAAI,GAAE;AAAA,IACjG,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,cAAa;AAAA,QACb,WAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU,CAAC,UAAU,WAAW,MAAM,OAAO,KAAK;AAAA,QAClD,aAAY;AAAA,QACZ,OAAO;AAAA;AAAA,IACT,IACE;AAAA,IACH,OAAO,QAAQ,6CAAC,SAAI,WAAU,4CAA4C,gBAAM,OAAM,IAAS;AAAA,IAChG,6CAAC,SAAI,WAAU,yDACZ,eAAK,eAAe,IAAI,CAAC,WACxB;AAAA,MAAC;AAAA;AAAA,QAEC,cAAY,gBAAgB,MAAM,MAAM;AAAA,QACxC,WAAW;AAAA,UACT;AAAA,UACA,WAAW,aAAa,WAAW,YAC/B,iHACA;AAAA,QACN;AAAA,QACA,gBAAc,WAAW,aAAa,WAAW,YAAY,KAAK;AAAA,QAClE,UAAU,CAAC,gBAAgB,aAAa,OAAO,WAAW,gBAAgB,OAAO,WAAW,cAAe,kBAAkB,CAAC,QAAQ,KAAK;AAAA,QAC3I,SAAS,MAAM,eAAe,MAAM;AAAA,UAClC;AAAA,UACA,GAAI,QAAQ,KAAK,IAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,QACtD,CAAC;AAAA,QACD,MAAK;AAAA,QAEJ,0BAAgB,MAAM,MAAM;AAAA;AAAA,MAhBxB;AAAA,IAiBP,CACD,GACH;AAAA,KACF;AAEJ;AAcO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,MAAI,KAAK,SAAS,QAAQ;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,WAAW,mBAAmB,QAAQ,aAAa,KAAK,KAAK,WAAW,WAAW;AAAA,QACnF,aAAa,KAAK;AAAA,QAEjB,eAAK;AAAA;AAAA,IACR;AAAA,EAEJ;AACA,MAAI,KAAK,SAAS,OAAQ,QAAO,oBAAoB,IAAI,IACrD,6CAAC,0BAAuB,MAAY,OAAO,WAAW,IACtD,6CAAC,oBAAiB,cAA4B,MAAY,OAAO,WAAW;AAChF,MAAI,KAAK,SAAS,aAAc,QAAO,6CAAC,yBAAsB,MAAY;AAC1E,MAAI,KAAK,SAAS,aAAa;AAC7B,UAAM,QAAQ,KAAK,QAAQ,KAAK,SAAS;AACzC,WAAO,KAAK,WAAW,aAAa,KAAK,WAAW,cAChD,6CAAC,WAAQ,WAAU,iCAAiC,iBAAM,IAC1D,6CAAC,SAAI,WAAU,iCAAiC,iBAAM;AAAA,EAC5D;AACA,MAAI,KAAK,SAAS,uBAAuB;AACvC,WAAO,6CAAC,kCAA+B,MAAY;AAAA,EACrD;AACA,MAAI,KAAK,SAAS,aAAa;AAC7B,QAAI,KAAK,UAAU,gBAAgB;AACjC,aAAO,6CAAC,SAAI,WAAU,+CAA+C,eAAK,aAAa,gCAA+B;AAAA,IACxH;AACA,WAAO,KAAK,SAAS,6CAAC,gBAAa,QAAQ,KAAK,QAAQ,IAAK,6CAAC,SAAI,WAAU,iCAAiC,eAAK,UAAU,oBAAoB,6CAAC,WAAQ,gCAAkB,IAAa,qBAAoB;AAAA,EAC9M;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,MAAI,KAAK,SAAS,QAAS,QAAO,6CAAC,SAAI,WAAU,+CAA8C,MAAK,SAAS,eAAK,WAAU;AAC5H,MAAI,KAAK,SAAS,UAAU;AAC1B,UAAM,OAAO,gBAAgB,KAAK,GAAG;AACrC,WAAO,OAAO,6CAAC,OAAE,WAAU,mBAAkB,MAAY,KAAI,uBAAsB,QAAO,UAAU,eAAK,OAAM,IAAO,6CAAC,UAAK,WAAU,mBAAmB,eAAK,OAAM;AAAA,EACtK;AACA,MAAI,KAAK,SAAS,YAAY;AAC5B,UAAM,OAAO,gBAAgB,KAAK,GAAG;AACrC,UAAM,QAAQ,KAAK,SAAS;AAC5B,WAAO,OAAO,6CAAC,OAAE,WAAU,gBAAe,MAAY,KAAI,uBAAsB,QAAO,UAAU,iBAAM,IAAO,6CAAC,UAAK,WAAU,gBAAgB,iBAAM;AAAA,EACtJ;AACA,MAAI,KAAK,SAAS,aAAc,QAAO,6CAAC,SAAI,WAAU,yBAAyB,eAAK,WAAW,YAAY,cAAa;AACxH,MAAI,KAAK,SAAS,OAAQ,QAAO,6CAAC,SAAI,2BAAyB,KAAK,MAAM,WAAU,UAAU,kBAAQ,IAAG;AACzG,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,IAAI,aAAa,YAAY,IAAI,aAAa,UAAU,IAAI,OAAO;AAAA,EAC5E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,EAAE,OAAO,GAAwC;AACrE,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,OAAO,CAAC;AACzD,SACE,8CAAC,aAAQ,cAAY,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,gBAAgB,WAAU,iBAC9F;AAAA,WAAO,OAAO,UAAU,WAAW,6CAAC,QAAI,iBAAO,OAAM,IAAQ;AAAA,IAC7D,KAAK,IAAI,CAAC,QAAQ,aAAa;AAC9B,YAAM,MAAM,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAAI,SAAoC,CAAC;AAClH,YAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,SAAS,CAAC;AACzD,aAAO,6CAAC,SAAI,WAAU,sBAA8C,iBAAO,IAAI,CAAC,UAAU,eAAe;AACvG,cAAM,QAAQ,YAAY,OAAO,aAAa,YAAY,CAAC,MAAM,QAAQ,QAAQ,IAAI,WAAsC,CAAC;AAC5H,cAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAC9D,cAAM,OAAO,OAAO,MAAM,QAAQ,MAAM;AACxC,YAAI,SAAS,WAAW,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,IAAI,GAAG;AACjF,iBACE,8CAAC,SAAI,WAAU,gBACb;AAAA,yDAAC,QAAI,iBAAM;AAAA,YACX,6CAAC,SAAI,WAAU,uBAAsB,wDAAC,WAAM;AAAA,2DAAC,WAAM,uDAAC,QAAI,gBAAM,QAAQ,IAAI,CAAC,QAAQ,UAAU,6CAAC,QAAgB,iBAAO,MAAM,KAArB,KAAuB,CAAK,GAAE,GAAK;AAAA,cAAQ,6CAAC,WAAO,gBAAM,KAAK,IAAI,CAAC,UAAU,UAAU,6CAAC,QAAiB,iBAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,cAAc,6CAAC,QAAoB,iBAAO,IAAI,KAAvB,SAAyB,CAAK,KAAlH,KAAoH,CAAK,GAAE;AAAA,eAAQ,GAAQ;AAAA,eAFhT,OAAO,MAAM,MAAM,UAAU,CAGhE;AAAA,QAEJ;AACA,cAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ;AAC3C,eAAO,8CAAC,SAAI,WAAU,gBAAoD;AAAA,uDAAC,QAAI,iBAAM;AAAA,UAAK,6CAAC,OAAG,iBAAO,KAAK,GAAE;AAAA,aAAlE,OAAO,MAAM,MAAM,UAAU,CAAyC;AAAA,MAClH,CAAC,KAd+C,OAAO,QAAQ,EAc5D;AAAA,IACL,CAAC;AAAA,KACH;AAEJ;AAEO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAA+B;AAC7B,QAAM,SAAS,gBAAgB,QAAQ,SAAS,CAAC,GAAG,OAAO,CAAC,UACzD,KAAK,SAAS,UAAU,CAAC,sBAAsB,IAAI,OAChD,KAAK,SAAS,gBAAgB,KAAK,aAAa,aAElD,KAAK,SAAS,mBACX,qBAAqB,SACpB,qBAAqB,aAAa,KAAK,mBAE9C;AACD,QAAM,YAAY,MAAM,OAAO,CAAC,SAA+B,KAAK,SAAS,MAAM;AACnF,QAAM,eAAe,6BAA6B,SAAS;AAC3D,QAAM,mBAAmB;AAAA,IACvB,EAAE,GAAG,SAAS,OAAO,CAAC,GAAG,KAAK,EAAE;AAAA,IAChC,YAAY,QAAQ,KAAK;AAAA,EAC3B;AACA,QAAM,WAAW,CAAC;AAClB,MAAI,wBAAwB;AAC5B,QAAM,WAAW,+BAA+B,OAAO,YAAY;AACnE,aAAW,CAAC,cAAc,OAAO,KAAK,SAAS,QAAQ,GAAG;AACxD,QAAI,QAAQ,SAAS,QAAQ;AAC3B,YAAM,mBAAmB,iBAAiB,SAAS,SAAS;AAC5D,YAAM,UAAU,iBAAiB,WAC7B,aAAa,mBACb,QAAQ,iBAAiB,QAAQ,KAAK,OAAO,gBAAgB,QAAQ,KAAK,eAAe,aAAa;AAC1G,eAAS,KAAK,6CAAC,oBAAiB,cAAkD,MAAM,QAAQ,MAAM,SAAkB,OAAO,aAA9D,QAAQ,KAAK,EAA4D,CAAE;AAC5I;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,gBAAgB;AACnC,eAAS,KAAK,6CAAC,wBAAqB,cAA4B,kBAAkB,iBAAiB,SAAS,SAAS,GAAG,QAAQ,WAAuD,kBAAkB,QAAQ,kBAAkB,WAAW,QAAQ,WAAW,OAAO,QAAQ,OAAO,OAAO,aAA9I,gBAAgB,QAAQ,MAAM,CAAC,EAAE,EAAE,EAAsH,CAAE;AAC3S;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,YAAY;AAC/B,eAAS,KAAK,6CAAC,0BAAuB,kBAAkB,iBAAiB,SAAS,SAAS,GAAG,QAAQ,WAAiC,MAAM,QAAQ,MAAM,OAAO,aAA5C,QAAQ,KAAK,EAA0C,CAAE;AAC/K;AAAA,IACF;AACA,UAAM,OAAO,QAAQ;AACrB,QAAI,KAAK,SAAS,cAAc;AAC9B,YAAM,MAAM,wBAAwB,KAAK,KAAK,GAAG,QAAQ,EAAE;AAC3D,8BAAwB;AACxB,eAAS,KAAK,6CAAC,wBAA+B,OAAM,uBAAsB,aAAa,KAAK,eAAnD,GAAgE,CAAE;AAC3G;AAAA,IACF;AACA,QAAI,KAAK,SAAS,iBAAiB;AACjC,YAAM,MAAM,wBAAwB,KAAK,KAAK,GAAG,QAAQ,EAAE;AAC3D,UAAI,KAAK,WAAW,UAAW,yBAAwB;AACvD,eAAS;AAAA,QACP,KAAK,WAAW,YACZ,6CAAC,wBAA+B,OAAO,KAAK,SAAjB,GAAwB,IACnD,6CAAC,4BAAuC,QAAT,KAAK,EAAwC;AAAA,MAClF;AACA;AAAA,IACF;AACA,aAAS;AAAA,MACP,6CAAO,iBAAN,EACC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,iBAAiB,KAAK,SAAS,UAAU,KAAK,OAAO;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF,KAXmB,KAAK,EAY1B;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,WAAW,KAAK,QAAQ,SAAS;AAC5C,aAAS,KAAK,6CAAC,mBAAgD,kBAAQ,WAAnC,GAAG,QAAQ,EAAE,WAA8B,CAAkB;AAAA,EACnG;AACA,MAAI,SAAS,WAAW,KAAK,WAAW;AACtC,aAAS,KAAK,6CAAC,wBAA2D,OAAM,cAAvC,GAAG,QAAQ,EAAE,kBAAqC,CAAE;AAAA,EAC/F;AACA,SAAO,6CAAC,SAAI,WAAU,aAAa,oBAAS;AAC9C;;;ADnRM,IAAAC,uBAAA;AAtEN,IAAM,0CAA0C;AAChD,IAAM,uCAAuC;AAwCtC,SAAS,0BACd,SACA,YAAuC,yCACvC;AACA,SAAO,OAAO,cAAc,YAAY,YAAY,KAAK,QAAQ,SAAS;AAC5E;AAEO,SAAS,4BAA4B;AAAA,EAC1C,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB;AAAA,EACA,gBAAgB;AAAA,EAChB,gBAAgB;AAClB,GAAqC;AACnC,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAS,KAAK;AACxD,QAAM,YAAkB,aAAM;AAC9B,QAAM,iBAAiB,0BAA0B,SAAS,iBAAiB;AAC3E,QAAM,OAAO,aAAa,iCAAY;AACtC,QAAM,eAAe,kBAAkB,CAAC,aACpC;AAAA,IACE,iBAAiB;AAAA,IACjB,iBAAiB,KAAK,IAAI,GAAG,cAAc;AAAA,IAC3C,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,IACA;AAEJ,SACE,+CAAC,SAAI,WAAU,+BACb;AAAA,kDAAC,SAAI,IAAI,WAAW,WAAU,WAAU,OAAO,cAC5C,mBACH;AAAA,IACC,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA,SAAS,MAAM,cAAc,CAAC,YAAY,CAAC,OAAO;AAAA,QAClD,MAAK;AAAA,QAEJ;AAAA,uBAAa,gBAAgB;AAAA,UAC9B,8CAAC,QAAK,eAAY,QAAO,WAAU,UAAS,aAAa,GAAG;AAAA;AAAA;AAAA,IAC9D,IACE;AAAA,KACN;AAEJ;AAEO,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AACF,GAGG;AACD,QAAM,SAAe,cAAuB,IAAI;AAChD,QAAM,CAAC,SAAS,UAAU,IAAU,gBAAS,KAAK;AAElD,EAAM,iBAAU,MAAM;AACpB,UAAM,UAAU,OAAO,SAAS,QAAqB,uBAAuB;AAC5E,QAAI,CAAC,QAAS;AAEd,UAAM,OAAO,MAAM,WAAW,IAAI;AAClC,UAAM,OAAO,MAAM,WAAW,KAAK;AACnC,UAAM,sBAAsB,CAAC,UAAsB;AACjD,UAAI,CAAC,QAAQ,SAAS,MAAM,aAA4B,EAAG,MAAK;AAAA,IAClE;AAEA,YAAQ,iBAAiB,cAAc,IAAI;AAC3C,YAAQ,iBAAiB,cAAc,IAAI;AAC3C,YAAQ,iBAAiB,WAAW,IAAI;AACxC,YAAQ,iBAAiB,YAAY,mBAAmB;AACxD,WAAO,MAAM;AACX,cAAQ,oBAAoB,cAAc,IAAI;AAC9C,cAAQ,oBAAoB,cAAc,IAAI;AAC9C,cAAQ,oBAAoB,WAAW,IAAI;AAC3C,cAAQ,oBAAoB,YAAY,mBAAmB;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,GAAG,qCAAqC,WAAW,cAAc,SAAS;AAAA,MACrF,OAAO,EAAE,SAAS,UAAU,IAAI,GAAG,eAAe,UAAU,SAAS,OAAO;AAAA,MAE3E;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,2BAA2B;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,cAAc,QAAQ,SAAS;AACrC,QAAM,cAAc,eAAe,QAAQ,OAAO;AAClD,QAAM,sBAAsB,sBAAsB,QAAQ;AAC1D,QAAM,sBAAsB,eAAe,QAAQ,qBAAqB,mBAAmB;AAC3F,QAAM,kBACJ,QAAQ,QAAQ,aAAa,MAAM,MAClC,QAAQ,SAAS,UAAU;AAC9B,QAAM,kBAAkB,YACtB,iBACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA;AAAA,EACF,IACE;AAEN,QAAM,qBAAqB,CAAC,WAAW,QAAQ,cAAc,KAAK,CAAC;AAEnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,MAEb;AAAA,0BACC;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,QAAQ,eAAe,CAAC;AAAA,YACrC,WAAU;AAAA,YACV;AAAA,YACA,gBAAgB;AAAA;AAAA,QAClB,IACE;AAAA,QAEH,sBACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,cAAc,uBAAuB,QAAW,gBAAgB;AAAA,YAC9E;AAAA,YACA,MAAM,QAAQ;AAAA,YAEb;AAAA,4BACC,yBACE,uBAAuB,EAAE,aAAa,QAAQ,CAAC,IAE/C;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,WAAW;AAAA,kBACX;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,OAAO,QAAQ;AAAA;AAAA,cACjB,IAEA;AAAA,cACH,CAAC,cACA,oBACE,kBAAkB,EAAE,QAAQ,CAAC,IAC3B,sBACF;AAAA,gBAAC;AAAA;AAAA,kBACC,gBAAgB;AAAA,kBAChB,mBAAmB;AAAA,kBACnB,SAAS;AAAA,kBACT,eAAe;AAAA,kBACf,eAAe;AAAA;AAAA,cACjB,IACE,OACF;AAAA;AAAA;AAAA,QACN,IACE;AAAA,QAEH,kBACC,qBACE,8CAAC,iCAA8B,WAAW,kBACvC,2BACH,IAEA,8CAAC,SAAI,WAAW,GAAG,QAAQ,QAAQ,oBAAoB,kCAAkC,gBAAgB,GACtG,2BACH,IAEA;AAAA;AAAA;AAAA,EACN;AAEJ;;;AUtQA,IAAAC,SAAuB;AA4Df,IAAAC,uBAAA;AAxDR,IAAM,iBAAiB,IAAI,KAAK,aAAa,SAAS,EAAE,UAAU,UAAU,CAAC;AAC7E,IAAM,UAAU,IAAI,KAAK,aAAa,SAAS;AAAA,EAC7C,OAAO;AAAA,EACP,uBAAuB;AACzB,CAAC;AACD,IAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,gBAAgB,CAAC;AAOlD,SAAS,qBAAqB,eAAsC;AACzE,QAAM,UAAU,OAAO,eAAe,cAAc,CAAC;AACrD,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,eAAe,gBAAgB,CAAC,CAAC;AAClE,QAAM,iBAAiB,KAAK,IAAI,GAAG,OAAO,eAAe,0BAA0B,KAAK,CAAC;AACzF,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG;AAAA,IACzC,eAAe,eAAgB,QAAQ;AAAA,EACzC,CAAC,CAAC;AACF,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG;AAAA,IAC7C,eAAe,mBAAoB,iBAAiB;AAAA,EACtD,CAAC,CAAC;AACF,SAAO,EAAE,SAAS,OAAO,gBAAgB,YAAY,eAAe;AACtE;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,YAAkB,aAAM;AAC9B,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,KAAK;AAC5C,QAAM,EAAE,SAAS,OAAO,gBAAgB,YAAY,eAAe,IAAI,qBAAqB,aAAa;AACzG,QAAM,aAAa,KAAK,MAAM,aAAa,GAAG;AAC9C,QAAM,QAAQ,cAAc,IAAI,eAAe,UAAU,SAAS;AAElE,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,EAAG,QAAO;AAEtD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,sBAAsB,SAAS;AAAA,MAC7C,eAAe,CAAC,UAAU;AACxB,YAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAA4B,EAAG,SAAQ,KAAK;AAAA,MACtF;AAAA,MACA,gBAAgB,MAAM,QAAQ,IAAI;AAAA,MAClC,cAAc,MAAM,QAAQ,IAAI;AAAA,MAChC,cAAc,MAAM,QAAQ,KAAK;AAAA,MAEjC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,oBAAkB,OAAO,YAAY;AAAA,YACrC,cAAY,kBAAkB,UAAU;AAAA,YACxC,WAAU;AAAA,YACV,WAAW,CAAC,UAAU;AACpB,kBAAI,MAAM,QAAQ,SAAU,SAAQ,KAAK;AAAA,YAC3C;AAAA,YACA,MAAK;AAAA,YAEL;AAAA,6DAAC,SAAI,eAAY,QAAO,WAAU,4BAA2B,SAAQ,aACnE;AAAA,8DAAC,YAAO,WAAU,6BAA4B,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,gBACrE;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,IAAG;AAAA,oBACH,IAAG;AAAA,oBACH,YAAW;AAAA,oBACX,GAAE;AAAA,oBACF,iBAAiB,GAAG,UAAU;AAAA;AAAA,gBAChC;AAAA,iBACF;AAAA,cACA,+CAAC,UAAM;AAAA;AAAA,gBAAW;AAAA,iBAAC;AAAA;AAAA;AAAA,QACrB;AAAA,QACC,OACC,+CAAC,SAAI,WAAU,+BAA8B,IAAI,WAAW,MAAK,WAC/D;AAAA,wDAAC,UAAK,WAAU,+BAA8B,4BAAc;AAAA,UAC5D,+CAAC,YAAQ;AAAA,oBAAQ,OAAO,UAAU;AAAA,YAAE;AAAA,aAAa;AAAA,UACjD,+CAAC,UACE;AAAA,oBAAQ,UAAU;AAAA,YAAkB;AAAA,YAAG,eAAe,OAAO,KAAK;AAAA,YAAE;AAAA,YAAI,eAAe,OAAO,OAAO;AAAA,YAAE;AAAA,aAC1G;AAAA,UACC,mBAAmB,QAClB,+CAAC,UAAK;AAAA;AAAA,YACW,eAAe,OAAO,cAAc;AAAA,YAAE;AAAA,YAAU,QAAQ,OAAO,cAAc;AAAA,YAAE;AAAA,aAChG,IACE;AAAA,WACN,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;;;ACzFA,IAAAC,mCAAuC;AACvC,IAAAC,qBAAqB;AAMjB,IAAAC,uBAAA;AAFJ,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,+BAA+B,SAAS;AAAA,MACrD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,qBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,QACF,QACE;AAAA,QACF,SACE;AAAA,QACF,OACE;AAAA,QACF,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,OAAO;AAAA,EACd,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,GAGK;AACH,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,cAAY;AAAA,MACZ,WAAW,GAAG,eAAe,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,GAEG;AACD,QAAM,OAAO,UAAU,0BAAO;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,8BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB;AAAA,EACvB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,GAGG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,aAAW;AAAA,MACX,WAAW,GAAG,wBAAwB,EAAE,MAAM,MAAM,CAAC,GAAG,SAAS;AAAA,MAChE,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACzHA,IAAAC,mCAAuC;AACvC,IAAAC,qBAAqB;AA8BjB,IAAAC,uBAAA;AA1BJ,IAAM,qBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WACE;AAAA,QACF,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,OAAO;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,GAAG;AACL,GAGK;AACH,QAAM,OAAO,UAAU,0BAAO;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,eAAe,EAAE,SAAS,UAAU,CAAC,CAAC;AAAA,MACnD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAiC;AACzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,eAAY;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAiC;AAC5E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACRQ,IAAAC,uBAAA;AApCR,IAAM,gBAA0D;AAAA,EAC9D,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AACT;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,QAAM,QAAQ,OAAO,cAAc,eAAe,YAAY,EAAE,KAAK;AACrE,QAAM,SAAS,WAAW,WAAW,gBAAgB,WAAW;AAChE,QAAM,cAAc,WAAW;AAC/B,QAAM,iBAAiB,YAAY,UAAU,eAAe,CAAC;AAE7D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,kCAA8B;AAAA,MAC9B,eAAa;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,yDAAC,SAAI,WAAU,kDACb;AAAA,uDAAC,SAAI,WAAU,WACb;AAAA,wDAAC,SAAI,WAAU,gCAAgC,iBAAM;AAAA,UACrD,8CAAC,SAAI,WAAU,sCACZ,qBAAW,qCACd;AAAA,UACC,WAAW,WAAW,QACrB,8CAAC,SAAI,WAAU,iCAAiC,iBAAM,IACpD;AAAA,WACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,cACA,WAAW,aAAa,WAAW,UAC/B,sEACA;AAAA,YACN;AAAA,YACA,UAAU;AAAA,YACV,SAAS;AAAA,YAER,wBAAc,MAAM;AAAA;AAAA,QACvB;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ACnFA,IAAAC,UAAuB;AAEvB,IAAM,uBAAuB,CAAC,0BAA0B,cAAc,WAAW;AAEjF,SAAS,mBAAmB,UAA0B;AACpD,SAAO,SAAS,WAAW,WAAW,IAAI,QAAQ;AACpD;AAEO,SAAS,iBACd,YACA,UAAqE,CAAC,GACtE;AACA,QAAM,cAAoB,eAA6B,IAAI;AAC3D,QAAM,YAAkB,eAA2B,IAAI;AACvD,QAAM,gBAAsB,eAAO,UAAU;AAC7C,QAAM,oBAA0B,eAAO,QAAQ,cAAc;AAC7D,gBAAc,UAAU;AACxB,oBAAkB,UAAU,QAAQ;AACpC,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAS,KAAK;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAwB,IAAI;AAE5D,QAAM,OAAa,oBAAY,MAAM,YAAY,SAAS,KAAK,GAAG,CAAC,CAAC;AACpE,QAAM,QAAc,oBAAY,YAAY;AAC1C,aAAS,IAAI;AACb,QAAI,CAAC,UAAU,cAAc,gBAAgB,OAAO,kBAAkB,aAAa;AACjF,eAAS,mDAAmD;AAC5D;AAAA,IACF;AACA,QAAI;AACF,YAAM,WAAW,qBAAqB,KAAK,CAAC,cAAc,cAAc,gBAAgB,SAAS,CAAC;AAClG,UAAI,CAAC,UAAU;AACb,iBAAS,mDAAmD;AAC5D;AAAA,MACF;AACA,YAAM,SAAS,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,KAAK,CAAC;AACxE,wBAAkB,UAAU,MAAM;AAClC,YAAM,WAAW,IAAI,cAAc,QAAQ,EAAE,SAAS,CAAC;AACvD,YAAM,SAAqB,CAAC;AAC5B,eAAS,kBAAkB,CAAC,UAAU;AAAE,YAAI,MAAM,KAAK,KAAM,QAAO,KAAK,MAAM,IAAI;AAAA,MAAG;AACtF,eAAS,SAAS,MAAM;AACtB,cAAM,aAAa,SAAS,YAAY;AACxC,sBAAc,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC,CAAC,GAAG,aAAa,KAAK,IAAI,CAAC,IAAI,mBAAmB,UAAU,CAAC,IAAI,EAAE,MAAM,WAAW,CAAC,CAAC;AAC3J,eAAO,UAAU,EAAE,QAAQ,CAAC,UAAU,MAAM,KAAK,CAAC;AAClD,0BAAkB,UAAU,IAAI;AAChC,oBAAY,UAAU;AACtB,kBAAU,UAAU;AACpB,uBAAe,KAAK;AAAA,MACtB;AACA,kBAAY,UAAU;AACtB,gBAAU,UAAU;AACpB,eAAS,MAAM;AACf,qBAAe,IAAI;AAAA,IACrB,QAAQ;AACN,gBAAU,SAAS,UAAU,EAAE,QAAQ,CAAC,UAAU,MAAM,KAAK,CAAC;AAC9D,wBAAkB,UAAU,IAAI;AAChC,eAAS,mCAAmC;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAM,kBAAU,MAAM,MAAM;AAC1B,gBAAY,SAAS,KAAK;AAC1B,cAAU,SAAS,UAAU,EAAE,QAAQ,CAAC,UAAU,MAAM,KAAK,CAAC;AAC9D,sBAAkB,UAAU,IAAI;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,OAAO,aAAa,OAAO,KAAK;AAC3C;","names":["React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","React","import_lucide_react","React","reduceMotion","React","import_lucide_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","candidate","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","import_react_slot","import_jsx_runtime","import_class_variance_authority","import_react_slot","import_jsx_runtime","import_jsx_runtime","React"]}
|