@agents24/chat-react 0.5.35 → 0.5.37

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.
Files changed (46) hide show
  1. package/compatibility.json +5 -5
  2. package/dist/{chunk-INO5DSSJ.js → chunk-DWDHK4FZ.js} +3 -4
  3. package/dist/chunk-DWDHK4FZ.js.map +1 -0
  4. package/dist/generated/delegation-types.d.ts +3 -2
  5. package/dist/generated/run-usage.d.ts +11 -0
  6. package/dist/registry/agents24-chat.json +13 -13
  7. package/dist/runtime/index.cjs +25 -9
  8. package/dist/runtime/index.cjs.map +1 -1
  9. package/dist/runtime/index.js +24 -7
  10. package/dist/runtime/index.js.map +1 -1
  11. package/dist/runtime/input-contract.d.ts +1 -1
  12. package/dist/runtime/use-agent-chat-hitl.d.ts +2 -2
  13. package/dist/runtime/use-agent-chat-runtime.d.ts +4 -6
  14. package/dist/scaffold/app.d.ts +2 -2
  15. package/dist/scaffold/components/chat/chat-composer.d.ts +2 -1
  16. package/dist/scaffold/components/chat/chat-message.d.ts +2 -2
  17. package/dist/scaffold/components/chat/message-parts.d.ts +2 -2
  18. package/dist/scaffold/index.cjs +17 -13
  19. package/dist/scaffold/index.cjs.map +1 -1
  20. package/dist/scaffold/index.js +11 -7
  21. package/dist/scaffold/index.js.map +1 -1
  22. package/dist/styles.css +55 -0
  23. package/dist/ui/agent-chat-composer.d.ts +2 -1
  24. package/dist/ui/agent-chat-message.d.ts +6 -2
  25. package/dist/ui/agent-response-timeline.d.ts +11 -3
  26. package/dist/ui/ask-user-interaction.d.ts +5 -1
  27. package/dist/ui/bubble.d.ts +1 -1
  28. package/dist/ui/code-block.d.ts +33 -0
  29. package/dist/ui/code-highlighter.d.ts +8 -0
  30. package/dist/ui/hitl-submission-status.d.ts +22 -0
  31. package/dist/ui/index.cjs +985 -301
  32. package/dist/ui/index.cjs.map +1 -1
  33. package/dist/ui/index.d.ts +3 -0
  34. package/dist/ui/index.js +969 -296
  35. package/dist/ui/index.js.map +1 -1
  36. package/dist/ui/message-code.d.ts +21 -0
  37. package/dist/ui/use-agent-chat-composer.d.ts +17 -2
  38. package/dist/ui/use-audio-recorder.d.ts +15 -2
  39. package/dist/ui/use-highlighted-code.d.ts +2 -0
  40. package/package.json +4 -3
  41. package/scaffold/src/app.tsx +2 -1
  42. package/scaffold/src/components/chat/chat-composer.tsx +5 -3
  43. package/scaffold/src/components/chat/chat-message.tsx +3 -3
  44. package/scaffold/src/components/chat/chat-shell.tsx +2 -1
  45. package/scaffold/src/components/chat/message-parts.tsx +6 -6
  46. package/dist/chunk-INO5DSSJ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/agent-chat-composer.tsx","../../src/ui/adapters.ts","../../src/ui/attachment.tsx","../../src/ui/utils.ts","../../src/ui/message.tsx","../../src/ui/use-agent-chat-composer.ts","../../src/ui/composer-attachments.ts","../../src/ui/composer-interactions.ts","../../src/ui/use-audio-recorder.ts","../../src/ui/agent-chat-context-status.tsx","../../src/ui/agent-chat-queue.tsx","../../src/ui/agent-chat-actions.tsx","../../src/ui/agent-chat-message.tsx","../../src/ui/agent-response-timeline.tsx","../../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/bubble.tsx","../../src/ui/marker.tsx","../../src/ui/mcp-connect-required-card.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { ArrowUp, Loader2, Mic, Plus, Square } from \"lucide-react\";\n\nimport { ChatAttachmentRows } from \"./adapters\";\nimport type { AgentChatComposerFile } from \"./composer-attachments\";\nimport { cn } from \"./utils\";\nimport { useAgentChatComposer } from \"./use-agent-chat-composer\";\nimport type { AgentChatInputContract } from \"../runtime/input-contract\";\nimport type { ContextWindow } from \"@agents24/client/protocol\";\nimport { AgentChatContextStatus } from \"./agent-chat-context-status\";\n\nexport type { AgentChatComposerFile } from \"./composer-attachments\";\n\nexport type AgentChatComposerSubmit = {\n text: string;\n files: AgentChatComposerFile[];\n attachmentIds?: string[];\n};\n\nexport type AgentChatComposerProps = {\n inputContract?: AgentChatInputContract | null;\n recordingEnabled?: boolean;\n contextWindow?: ContextWindow | null;\n accept?: string;\n allowAttachments?: boolean;\n /** @deprecated Draft attachments are always contained inside the composer. */\n attachmentLayout?: \"flow\" | \"overlay\";\n className?: string;\n disabled?: boolean;\n forceExpanded?: boolean;\n focusKey?: string | null;\n inputToolbarContent?: React.ReactNode;\n isRunning?: boolean;\n isCancelling?: boolean;\n onAttachmentCountChange?: (count: number) => void;\n onStop?: () => void;\n onSubmit: (message: AgentChatComposerSubmit) => Promise<void> | void;\n placeholder?: string;\n restoredDraft?: { revision: number; text: string; files: AgentChatComposerFile[] } | null;\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 inputContract,\n recordingEnabled,\n contextWindow,\n accept,\n allowAttachments = true,\n className,\n disabled = false,\n forceExpanded = false,\n focusKey,\n inputToolbarContent,\n isRunning = false,\n isCancelling = false,\n onAttachmentCountChange,\n onStop,\n onSubmit,\n placeholder = \"Message the agent\",\n restoredDraft,\n textareaRef,\n}: AgentChatComposerProps) {\n const fileInputRef = React.useRef<HTMLInputElement | null>(null);\n const localTextareaRef = React.useRef<HTMLTextAreaElement | null>(null);\n const composer = useAgentChatComposer({ inputContract, recordingEnabled, disabled, isRunning,\n isCancelling, focusKey, restoredDraft, textareaRef: localTextareaRef,\n onSubmit: (text, files) => onSubmit({ text: text.trim(), files, attachmentIds: files.flatMap(file => file.id ? [file.id] : []) }) });\n const { text, files, setText, isSubmitting, canSubmit, action, submit } = composer;\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(() => { onAttachmentCountChange?.(files.length); }, [files, onAttachmentCountChange]);\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 handleFilesChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n composer.addFiles(Array.from(event.target.files || []));\n event.currentTarget.value = \"\";\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\n {composer.attachmentError || composer.recorder.error ? <p role=\"alert\">{composer.attachmentError || composer.recorder.error}</p> : null}\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 {files.length > 0 ? (\n <ChatAttachmentRows\n data-testid=\"agent-chat-composer-attachments\"\n layout=\"composer\"\n attachments={files}\n onRemove={(attachment) => attachment.id && composer.removeFile(attachment.id)}\n />\n ) : null}\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={composer.fileAccept ?? 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 || !allowAttachments || !composer.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}\n name=\"message\"\n onChange={(event) => setText(event.target.value)}\n onKeyDown={composer.onKeyDown}\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 <AgentChatContextStatus contextWindow={contextWindow} />\n {composer.recordingAllowed ? <button type=\"button\" className={pillButtonClass}\n aria-label={composer.recorder.isRecording ? \"Stop recording\" : \"Record audio\"}\n disabled={disabled || isRunning || isSubmitting}\n onClick={() => { if (composer.recorder.isRecording) composer.recorder.stop(); else void composer.recorder.start(); }}>\n {composer.recorder.isRecording ? <Square /> : <Mic />}\n </button> : null}\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\"><AgentChatContextStatus contextWindow={contextWindow} />\n {composer.recordingAllowed ? <button type=\"button\" className={pillButtonClass}\n aria-label={composer.recorder.isRecording ? \"Stop recording\" : \"Record audio\"}\n disabled={disabled || isRunning || isSubmitting}\n onClick={() => { if (composer.recorder.isRecording) composer.recorder.stop(); else void composer.recorder.start(); }}>\n {composer.recorder.isRecording ? <Square /> : <Mic />}\n </button> : null}</div>\n ) : null}\n\n <div style={{ gridArea: \"submit\" }} className=\"a24-composer__submit-slot flex shrink-0 items-center justify-end gap-1\">\n <button\n aria-label={isCancelling ? \"Cancelling response\" : action === \"stop\" ? \"Stop generating\" : files.length > 0 ? `Send ${formatFileCount(files)}` : isRunning ? \"Queue message\" : \"Send message\"}\n className={cn(\"a24-composer__submit\", submitButtonClass, text.trim().length > 0 && \"hover:scale-105\")}\n disabled={isCancelling || (action === \"stop\" ? disabled : !canSubmit)}\n onClick={() => { if (action === \"stop\") onStop?.(); else void submit(); }}\n title={composer.validationError || (action === \"stop\" ? \"Stop\" : isRunning ? \"Queue message\" : \"Send\")}\n type=\"button\"\n >\n {isCancelling ? <Loader2 className=\"size-3.5 animate-spin\" /> : action === \"stop\" ? <Square className=\"size-3.5 fill-current\" /> : <ArrowUp className=\"size-4\" strokeWidth={2.5} />}\n </button>\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 presentation?: \"message\" | \"composer\";\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\" | \"mixed\",\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 presentation = \"message\",\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\", presentation === \"composer\" && \"a24-composer-attachment-card\", 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 presentation === \"composer\"\n ? React.createElement(\"span\", { className: \"a24-composer-image-caption\", title: filename }, filename)\n : null,\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 presentation = \"message\",\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 presentation,\n onRemove,\n resolveContent,\n });\n }\n return React.createElement(\n Attachment,\n {\n className: cn(\"a24-chat-attachment\", presentation === \"composer\" && \"a24-composer-attachment-card\", className),\n orientation: orientation || \"horizontal\",\n size: \"sm\",\n ...props,\n },\n presentation === \"composer\"\n ? React.createElement(\"div\", { className: \"a24-composer-file-preview\", \"aria-hidden\": true },\n React.createElement(FileIcon, { size: 64, type: fileIconType, variant: \"solid\" }))\n : null,\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 /** Composer drafts use one left-aligned row; transcript grouping stays unchanged. */\n layout?: \"message\" | \"composer\";\n onRemove?: (attachment: ChatAttachmentData) => void;\n resolveContent?: ChatAttachmentContentResolver;\n};\n\nexport function ChatAttachmentRows({\n attachments,\n layout = \"message\",\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\" | \"mixed\") =>\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 presentation: layout,\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\", layout === \"composer\" && \"a24-composer-attachment-row\", className),\n dir,\n ...props,\n },\n layout === \"composer\" ? renderRow(attachments, \"mixed\") : renderRow(imageAttachments, \"images\"),\n layout === \"message\" ? renderRow(fileAttachments, \"files\") : null\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 * as React from \"react\";\nimport type { AgentChatInputContract } from \"../runtime/input-contract\";\nimport { attachmentFileAccept, canonicalInputMimeType, inputMimeTypes, validateAgentChatSubmission } from \"../runtime/input-contract\";\nimport { createAgentChatComposerFile, revokeAgentChatComposerFiles, type AgentChatComposerFile } from \"./composer-attachments\";\nimport { chatComposerAction, useChatComposerFocus } from \"./composer-interactions\";\nimport { useAudioRecorder } from \"./use-audio-recorder\";\n\nexport type AgentChatComposerOptions = {\n inputContract?: AgentChatInputContract | null;\n recordingEnabled?: boolean;\n textareaRef?: React.RefObject<HTMLTextAreaElement | null>;\n disabled?: boolean;\n isRunning?: boolean;\n isCancelling?: boolean;\n forceExpanded?: boolean;\n focusKey?: string | null;\n restoredDraft?: { revision: number; text: string; files: AgentChatComposerFile[] } | null;\n onSubmit(text: string, files: AgentChatComposerFile[]): void | Promise<void>;\n /** Observe the shared recorder. Do not stop its tracks or start another capture. */\n onRecordingStreamChange?: (stream: MediaStream | null) => void;\n};\n\nexport function useAgentChatComposer(options: AgentChatComposerOptions) {\n const [text, setTextState] = React.useState(\"\");\n const [files, setFiles] = React.useState<AgentChatComposerFile[]>([]);\n const [attachmentError, setAttachmentError] = React.useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const localTextareaRef = React.useRef<HTMLTextAreaElement>(null);\n const textareaRef = options.textareaRef ?? localTextareaRef;\n const filesRef = React.useRef(files);\n const inFlightFilesRef = React.useRef<AgentChatComposerFile[]>([]);\n const revisionRef = React.useRef(0);\n const submittingRef = React.useRef(false);\n React.useEffect(() => { filesRef.current = files; }, [files]);\n React.useEffect(() => () => {\n revokeAgentChatComposerFiles(filesRef.current);\n revokeAgentChatComposerFiles(inFlightFilesRef.current);\n }, []);\n const focusComposer = useChatComposerFocus({ textareaRef, disabled: Boolean(options.disabled),\n focusKey: options.focusKey, restoredDraft: options.restoredDraft,\n onRestore: draft => {\n revisionRef.current += 1;\n revokeAgentChatComposerFiles(filesRef.current);\n setTextState(draft.text);\n setFiles(draft.files);\n },\n });\n const attachmentMimeTypes = inputMimeTypes(options.inputContract);\n const setText = (value: string) => { revisionRef.current += 1; setTextState(value); };\n const addFiles = (selected: readonly File[]) => {\n const accepted = selected.filter(file => attachmentMimeTypes.includes(canonicalInputMimeType(file.type, file.name)));\n revisionRef.current += 1;\n const additions = accepted.map(createAgentChatComposerFile);\n setFiles(current => [...current, ...additions]);\n setAttachmentError(accepted.length === selected.length ? null : \"One or more selected file types are not supported by this Agent.\");\n };\n const removeFile = (id: string) => {\n revisionRef.current += 1;\n const removed = filesRef.current.find(file => file.id === id);\n if (removed) revokeAgentChatComposerFiles([removed]);\n setFiles(current => current.filter(file => file.id !== id));\n };\n const recorder = useAudioRecorder(file => addFiles([file]), { onStreamChange: options.onRecordingStreamChange });\n const validationError = options.inputContract ? validateAgentChatSubmission(options.inputContract, text,\n files.map(file => ({ data: file.source || new Uint8Array(), mediaType: file.mediaType, name: file.filename, byteSize: file.byteSize }))) : null;\n const canSubmit = Boolean(text.trim() || files.length) && !options.disabled && !options.isCancelling && !isSubmitting && !recorder.isRecording && !validationError;\n const submit = async () => {\n if (!canSubmit || submittingRef.current) return;\n const value = text;\n const selectedFiles = files;\n const clearedRevision = ++revisionRef.current;\n submittingRef.current = true;\n setIsSubmitting(true);\n inFlightFilesRef.current = selectedFiles;\n setTextState(\"\");\n setFiles([]);\n focusComposer();\n try {\n await options.onSubmit(value, selectedFiles);\n revokeAgentChatComposerFiles(selectedFiles);\n } catch {\n if (revisionRef.current === clearedRevision) {\n revisionRef.current += 1;\n setTextState(value);\n setFiles(selectedFiles);\n } else revokeAgentChatComposerFiles(selectedFiles);\n } finally {\n inFlightFilesRef.current = [];\n submittingRef.current = false;\n setIsSubmitting(false);\n }\n };\n return { text, setText, files, addFiles, removeFile, textareaRef, submit, canSubmit, isSubmitting,\n attachmentError, attachmentMimeTypes, validationError, recorder,\n recordingAllowed: options.recordingEnabled ?? options.inputContract?.modalities.audio.recording_enabled ?? false,\n fileAccept: attachmentFileAccept(attachmentMimeTypes),\n onKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault();\n void submit();\n }\n },\n allowAttachments: attachmentMimeTypes.length > 0,\n isExpanded: Boolean(options.forceExpanded || text.includes(\"\\n\") || text.length > 62),\n action: chatComposerAction({ hasDraft: Boolean(text.trim() || files.length), isRunning: Boolean(options.isRunning), isCancelling: Boolean(options.isCancelling) }),\n };\n}\n","import type { ChatAttachment } from \"../types\";\nimport { normalizeAttachmentMimeType, type ThreadMessage } from \"@agents24/client\";\n\nexport type AgentChatComposerFile = ChatAttachment & {\n id: string;\n type: \"file\";\n url: string;\n filename: string;\n mediaType: string;\n source?: File;\n persistedAttachmentId?: string;\n byteSize?: number;\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: normalizeAttachmentMimeType(file.type, file.name),\n source: file,\n };\n}\n\nexport function revokeAgentChatComposerFiles(files: readonly AgentChatComposerFile[]): void {\n files.forEach((file) => {\n try {\n if (file.url.startsWith(\"blob:\")) URL.revokeObjectURL(file.url);\n } catch {\n // The URL may already be gone in tests or older browsers.\n }\n });\n}\n\nexport function queuedMessageComposerFiles(message: Pick<ThreadMessage, \"attachment_ids\" | \"attachments\">): AgentChatComposerFile[] {\n const byId = new Map((message.attachments || []).map((attachment) => [attachment.id, attachment]));\n return message.attachment_ids.map((id) => {\n const attachment = byId.get(id);\n return { id, persistedAttachmentId: id, type: \"file\", url: \"\",\n filename: attachment?.filename || \"Attachment\",\n mediaType: attachment?.mime_type || \"application/octet-stream\",\n byteSize: attachment?.byte_size || 0 };\n });\n}\n","import * as React from \"react\";\n\nexport function chatComposerAction({ hasDraft, isRunning, isCancelling }: {\n hasDraft: boolean; isRunning: boolean; isCancelling: boolean;\n}): \"stop\" | \"send\" {\n return isRunning && (!hasDraft || isCancelling) ? \"stop\" : \"send\";\n}\n\nexport function useChatComposerFocus<TDraft>({ textareaRef, disabled, focusKey, restoredDraft, onRestore }: {\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\n disabled: boolean;\n focusKey?: string | null;\n restoredDraft?: (TDraft & { revision: number }) | null;\n onRestore: (draft: TDraft & { revision: number }) => void;\n}) {\n const restoreRef = React.useRef(onRestore);\n restoreRef.current = onRestore;\n const focus = React.useCallback(() => {\n window.requestAnimationFrame(() => textareaRef.current?.focus({ preventScroll: true }));\n }, [textareaRef]);\n React.useEffect(() => {\n if (!restoredDraft) return;\n restoreRef.current(restoredDraft);\n focus();\n }, [restoredDraft?.revision, focus]);\n React.useEffect(() => {\n const supportsFinePointer = typeof window.matchMedia === \"function\"\n && window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches;\n if (disabled || !supportsFinePointer) return;\n focus();\n }, [disabled, focusKey, focus]);\n return focus;\n}\n","import * as React from \"react\";\n\nconst RECORDING_CANDIDATES = [\"audio/webm;codecs=opus\", \"audio/webm\", \"audio/mp4\"];\n\nexport type AudioRecorderOptions = {\n /** Subscribe to the recorder-owned stream; consumers must not stop its tracks. */\n onStreamChange?: (stream: MediaStream | null) => void;\n};\n\nexport function useAudioRecorder(onRecorded: (file: File) => void, options: AudioRecorderOptions = {}) {\n const recorderRef = React.useRef<MediaRecorder | null>(null);\n const streamRef = React.useRef<MediaStream | null>(null);\n const pendingRef = React.useRef(false);\n const generationRef = React.useRef(0);\n const onRecordedRef = React.useRef(onRecorded);\n const onStreamChangeRef = React.useRef(options.onStreamChange);\n React.useEffect(() => { onRecordedRef.current = onRecorded; onStreamChangeRef.current = options.onStreamChange; });\n const [isRecording, setIsRecording] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const release = React.useCallback(() => {\n streamRef.current?.getTracks().forEach(track => track.stop());\n streamRef.current = null;\n recorderRef.current = null;\n onStreamChangeRef.current?.(null);\n }, []);\n const stop = React.useCallback(() => {\n const recorder = recorderRef.current;\n if (recorder && recorder.state !== \"inactive\") recorder.stop();\n }, []);\n const start = React.useCallback(async () => {\n if (pendingRef.current || recorderRef.current) return;\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 pendingRef.current = true;\n const generation = generationRef.current;\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 if (generation !== generationRef.current) {\n stream.getTracks().forEach(track => track.stop());\n return;\n }\n streamRef.current = stream;\n const recorder = new MediaRecorder(stream, { mimeType });\n recorderRef.current = recorder;\n const chunks: BlobPart[] = [];\n recorder.ondataavailable = event => { if (event.data.size) chunks.push(event.data); };\n recorder.onstop = () => {\n if (generation !== generationRef.current) return;\n const actualType = recorder.mimeType || mimeType;\n const extension = actualType.startsWith(\"audio/mp4\") ? \"m4a\" : \"webm\";\n try {\n onRecordedRef.current(new File([new Blob(chunks, { type: actualType })], `recording-${Date.now()}.${extension}`, { type: actualType }));\n } finally {\n release();\n setIsRecording(false);\n }\n };\n recorder.onerror = () => {\n recorder.onstop = null;\n if (recorder.state !== \"inactive\") recorder.stop();\n release();\n setIsRecording(false);\n setError(\"Audio recording failed. Try again.\");\n };\n recorder.start();\n setIsRecording(true);\n onStreamChangeRef.current?.(stream);\n } catch {\n if (generation === generationRef.current) {\n release();\n setIsRecording(false);\n setError(\"Microphone access is unavailable.\");\n }\n } finally {\n if (generation === generationRef.current) pendingRef.current = false;\n }\n }, [release]);\n\n React.useEffect(() => () => {\n generationRef.current += 1;\n pendingRef.current = false;\n const recorder = recorderRef.current;\n if (recorder) {\n recorder.onstop = null;\n recorder.onerror = null;\n if (recorder.state !== \"inactive\") recorder.stop();\n }\n release();\n }, [release]);\n\n return { error, isRecording, start, stop };\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 { CornerDownLeft, Ellipsis, Trash2 } from \"lucide-react\";\nimport type { ThreadMessage, ThreadMessageQueueState } from \"@agents24/client\";\nimport { cn } from \"./utils\";\n\nexport type AgentChatQueueProps = {\n pending: readonly ThreadMessage[];\n queue: ThreadMessageQueueState | null;\n onRemove(message: ThreadMessage): Promise<void>;\n onEdit(message: ThreadMessage): Promise<void>;\n onResume(): Promise<void>;\n className?: string;\n};\n\nfunction QueueRow({ message, onRemove, onEdit }: Pick<AgentChatQueueProps,\n \"onRemove\" | \"onEdit\"> & { message: ThreadMessage }) {\n const [busy, setBusy] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const editable = message.revision > 0 && (message.status === \"queued\" || message.status === \"blocked\");\n const act = async (operation: () => Promise<void>) => {\n setBusy(true);\n setError(null);\n try { await operation(); }\n catch (cause) { setError(cause instanceof Error ? cause.message : \"Message action failed. Try again.\"); }\n finally { setBusy(false); }\n };\n return <div data-message-id={message.id} className=\"a24-queue__row min-w-0 border-b border-border/40 last:border-b-0\">\n <div className=\"a24-queue__row-content flex min-h-9 items-center gap-2 px-3 text-sm\">\n <CornerDownLeft aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"a24-queue__text min-w-0 flex-1 truncate text-foreground\" title={message.text}>\n {message.text || `${message.attachment_ids.length} attachment${message.attachment_ids.length === 1 ? \"\" : \"s\"}`}\n </span>\n {message.status === \"blocked\" ? <span className=\"shrink-0 text-xs text-amber-700\">Needs attention</span> : null}\n {[\"steer_pending\", \"delivering\"].includes(message.status) ? <span className=\"shrink-0 text-xs text-muted-foreground\">Sending…</span> : null}\n {editable ? <>\n <button type=\"button\" aria-label=\"Delete queued message\" disabled={busy}\n onClick={() => void act(() => onRemove(message))}\n className=\"a24-queue__icon flex size-8 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground disabled:opacity-50\">\n <Trash2 aria-hidden className=\"size-4\" />\n </button>\n <details className=\"a24-queue__menu relative group/queue-menu\">\n <summary aria-label=\"Queued message options\" className=\"a24-queue__icon flex size-8 cursor-pointer list-none items-center justify-center text-muted-foreground hover:text-foreground [&::-webkit-details-marker]:hidden\">\n <Ellipsis aria-hidden className=\"size-4\" />\n </summary>\n <div className=\"a24-queue__menu-content mt-1 min-w-28 rounded-md border bg-background p-1\">\n <button type=\"button\" disabled={busy} onClick={() => void act(() => onEdit(message))}\n className=\"w-full rounded px-2 py-1 text-left text-sm hover:bg-muted disabled:opacity-50\">Edit message</button>\n </div>\n </details>\n </> : null}\n </div>\n {error ? <p role=\"alert\" className=\"px-9 pb-2 text-xs text-destructive\">{error}</p> : null}\n </div>;\n}\n\nexport function AgentChatQueue({ pending, queue, onRemove, onEdit, onResume, className }: AgentChatQueueProps) {\n const [resumeError, setResumeError] = React.useState<string | null>(null);\n if (!pending.length && !queue?.paused) return null;\n return <section aria-label=\"Message queue\" className={cn(\"a24-queue relative z-0 -mb-2 overflow-visible rounded-t-xl border border-b-0 border-border/50 bg-background pb-2\", className)}>\n {queue?.paused ? <div className=\"flex min-h-9 items-center justify-between gap-2 px-3 text-xs text-muted-foreground\">\n <span>Queue paused</span>\n <button type=\"button\" onClick={() => { void onResume().then(() => setResumeError(null)).catch((cause) => setResumeError(cause instanceof Error ? cause.message : \"Could not resume queue\")); }} className=\"font-medium text-foreground hover:underline\">Resume queue</button>\n </div> : null}\n {resumeError ? <p role=\"alert\" className=\"px-3 pb-2 text-xs text-destructive\">{resumeError}</p> : null}\n <div className=\"max-h-40 overflow-y-auto\">\n {pending.map((message) => <QueueRow key={message.client_submission_id || message.id} message={message} onRemove={onRemove} onEdit={onEdit} />)}\n </div>\n </section>;\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 animateCompletion?: boolean;\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\nconst enteredCompletionRuns = new Set<string>();\n\nexport function useLiveCompletionRuns(runId: string | null | undefined, isRunning: boolean): (candidate: string | null | undefined) => boolean {\n const liveRuns = React.useRef(new Set<string>());\n React.useEffect(() => {\n if (!runId || !isRunning) return;\n liveRuns.current.add(runId);\n if (liveRuns.current.size > 256) liveRuns.current.delete(liveRuns.current.values().next().value!);\n }, [runId, isRunning]);\n return (candidate) => Boolean(candidate && liveRuns.current.has(candidate));\n}\n\nexport function useCompletionActionEntrance(isComplete: boolean, runId?: string | null, wasLive = false): boolean {\n const sawIncomplete = React.useRef(!isComplete);\n const entered = React.useRef(false);\n const shouldEnter = isComplete && !entered.current\n && (runId ? wasLive && !enteredCompletionRuns.has(runId) : sawIncomplete.current);\n\n React.useEffect(() => {\n if (!isComplete) sawIncomplete.current = true;\n else if (shouldEnter) {\n entered.current = true;\n if (runId) {\n enteredCompletionRuns.add(runId);\n if (enteredCompletionRuns.size > 256) enteredCompletionRuns.delete(enteredCompletionRuns.values().next().value!);\n }\n }\n }, [isComplete, runId, shouldEnter]);\n\n return shouldEnter || entered.current;\n}\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 animateCompletion = false,\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 [feedbackPending, setFeedbackPending] = React.useState(false);\n const feedbackInFlight = React.useRef(false);\n const writeFeedback = async (input: Parameters<NonNullable<NonNullable<typeof handlers>[\"onSetFeedback\"]>>[1], close = false) => {\n if (feedbackInFlight.current) return;\n feedbackInFlight.current = true;\n setFeedbackPending(true);\n try {\n await handlers?.onSetFeedback?.(message, input);\n if (close) setFeedbackOpen(false);\n } catch {\n // The controller owns the operation error notice; the click owns its rejection.\n } finally {\n feedbackInFlight.current = false;\n setFeedbackPending(false);\n }\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 className={animateCompletion ? \"a24-chat-completion-actions\" : undefined}>\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 disabled={feedbackPending}\n onClick={() => void writeFeedback({\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 disabled={feedbackPending}\n label=\"Dislike\"\n onClick={() => {\n if (handlers.feedback?.rating !== \"dislike\") {\n void writeFeedback({ 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 disabled={feedbackPending}\n className=\"rounded-md px-3 py-2 text-sm font-medium hover:bg-muted\"\n onClick={() => {\n void writeFeedback({ rating: null }, true);\n }}\n type=\"button\"\n >\n Remove feedback\n </button>\n <button\n disabled={feedbackPending}\n className=\"rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90\"\n onClick={() => {\n void writeFeedback({ rating: \"dislike\", reason, comment }, true);\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 && !message.responseCompletion;\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, ChatUiBlocksPart } 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 } 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 onNodeSelect?: (part: ChatNodeActivityPart) => void;\n parts?: readonly ChatPart[];\n renderUiBlocks?: (part: ChatUiBlocksPart) => React.ReactNode;\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 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) return null;\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 onNodeSelect,\n parts: displayParts,\n renderUiBlocks,\n responseProps,\n toolSlots,\n toolViewMode = \"closed\",\n}: AgentResponseTimelineProps) {\n isLoading = isLoading && !message.responseCompletion;\n const parts = (displayParts || message.parts || []).filter((part) => (\n (part.kind !== \"tool\" || !isInternalAskUserTool(part))\n && (part.kind !== \"hitl\" || part.hitlKind === \"user_input\" || part.status === \"pending\")\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 renderActivityIcon={toolSlots?.renderActivityIcon} 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 renderActivityIcon={toolSlots?.renderActivityIcon} key={key} label={part.label} onSelect={onNodeSelect ? () => onNodeSelect(part as ChatNodeActivityPart) : undefined} />\n : <AgentChatNodeActivityRow renderActivityIcon={toolSlots?.renderActivityIcon} key={part.id} onSelect={onNodeSelect} part={part as ChatNodeActivityPart} />,\n );\n continue;\n }\n if (part.kind === \"ui-blocks\" && renderUiBlocks) {\n rendered.push(<React.Fragment key={part.id}>{renderUiBlocks(part)}</React.Fragment>);\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 renderActivityIcon={toolSlots?.renderActivityIcon} key={`${message.id}-active-activity`} label=\"Thinking\" />);\n }\n return <div className=\"space-y-3\">{rendered}</div>;\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 { ChatComputerResourceTarget, 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 resourceTargets: readonly ChatComputerResourceTarget[];\n openResource: (target: ChatComputerResourceTarget) => void;\n};\n\nexport type AgentChatActivityIconContext = {\n label: string;\n kind: \"tool\" | \"group\" | \"planning\" | \"node\";\n part?: ChatToolPart | ChatNodeActivityPart;\n};\n\nexport type AgentChatToolSlots = {\n renderActivityIcon?: (context: AgentChatActivityIconContext) => React.ReactNode;\n onExpandedChange?: (open: boolean, part?: ChatToolPart) => void;\n onToolSelect?: (part: ChatToolPart) => void;\n onResourceAction?: (target: ChatComputerResourceTarget, 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\nfunction toolSlotContext(isActive: boolean, label: string, part: ChatToolPart, slots?: AgentChatToolSlots): AgentChatToolSlotContext {\n return { isActive, label, part, resourceTargets: part.resourceTargets || [],\n openResource: target => slots?.onResourceAction?.(target, part) };\n}\n\nfunction resourceTargetName(target: ChatComputerResourceTarget): string {\n const normalized = target.path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n return normalized.split(\"/\").filter(Boolean).pop() || \"workspace\";\n}\n\nfunction ToolResourceAction({ context }: { context: AgentChatToolSlotContext }) {\n const target = context.resourceTargets[0];\n if (!target) return null;\n const name = resourceTargetName(target);\n return (\n <button\n aria-label={`Open ${target.kind} ${target.path}`}\n className=\"a24-tool-resource-action\"\n data-agents24-resource-path={target.path}\n onClick={() => context.openResource(target)}\n title={target.path}\n type=\"button\"\n >\n {name}\n </button>\n );\n}\n\nfunction toolAccessory(context: AgentChatToolSlotContext, slots?: AgentChatToolSlots): React.ReactNode {\n return (\n <>\n {slots?.onResourceAction ? <ToolResourceAction context={context} /> : null}\n {slots?.renderToolAccessory?.(context)}\n </>\n );\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 = \"Working\", kind = \"tool\", part, renderActivityIcon }: AgentChatActivityIconContext & {\n renderActivityIcon?: AgentChatToolSlots[\"renderActivityIcon\"];\n}) {\n return (\n <span className=\"a24-tool-orb\">\n {renderActivityIcon ? renderActivityIcon({ label, kind, part }) : <ThinkingOrb aria-label={label} size={20} speed={0.8} state=\"searching\" />}\n </span>\n );\n}\n\nexport function AgentChatActivityRow({\n label,\n modelTurnId,\n renderActivityIcon,\n onSelect,\n}: {\n label: string;\n modelTurnId?: string;\n renderActivityIcon?: AgentChatToolSlots[\"renderActivityIcon\"];\n onSelect?: () => void;\n}) {\n const content = (\n <>\n <ToolActivityOrb label={label} kind=\"planning\" renderActivityIcon={renderActivityIcon} />\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 a24-tool-trigger-row--root\" 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 renderActivityIcon,\n onSelect,\n part,\n}: {\n renderActivityIcon?: AgentChatToolSlots[\"renderActivityIcon\"];\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} kind=\"node\" part={part} renderActivityIcon={renderActivityIcon} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </button>\n ) : (\n <div className={triggerClassName}>\n {running ? <ToolActivityOrb label={part.label} kind=\"node\" part={part} renderActivityIcon={renderActivityIcon} /> : 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, separateResource = false): string {\n const label = agentChatToolLabel(part);\n const lifecycleLabel = isAgentChatToolRunning(part) ? label : label.replace(/^(?:running|ran)\\s+/i, \"\");\n const targetPath = separateResource ? part.resourceTargets?.[0]?.path : null;\n if (!targetPath) return lifecycleLabel;\n const candidates = [targetPath, targetPath.replace(/^\\/workspace\\/?/, \"\")]\n .filter(Boolean)\n .sort((left, right) => right.length - left.length);\n const suffix = candidates.find((candidate) => lifecycleLabel.endsWith(candidate));\n return suffix ? lifecycleLabel.slice(0, -suffix.length).trimEnd() : lifecycleLabel;\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 renderActivityIcon,\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 renderActivityIcon?: AgentChatToolSlots[\"renderActivityIcon\"];\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={cn(\"a24-tool-trigger-row\", root && \"a24-tool-trigger-row--root\")}>\n {onSelect && part ? (\n <button className={triggerClassName} onClick={() => onSelect(part)} type=\"button\">\n {showOrb ? <ToolActivityOrb label={statusLabel || \"Working\"} kind={grouped ? \"group\" : \"tool\"} part={part} renderActivityIcon={renderActivityIcon} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </button>\n ) : (\n <div className={triggerClassName}>\n {showOrb ? <ToolActivityOrb label={statusLabel || \"Working\"} kind={grouped ? \"group\" : \"tool\"} part={part} renderActivityIcon={renderActivityIcon} /> : 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\", root && \"a24-tool-trigger-row--root\")}>\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 || \"Working\"} kind={grouped ? \"group\" : \"tool\"} part={part} renderActivityIcon={renderActivityIcon} /> : 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?.(toolSlotContext(active, label, part, slots)) ?? 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 = toolSlotContext(active, toolRowLabel(part, Boolean(slots?.onResourceAction)), part, slots);\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <ToolDisclosure\n renderActivityIcon={slots?.renderActivityIcon}\n error={failed}\n accessory={toolAccessory(context, slots)}\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 = toolRowLabel(visiblePart, true);\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 ? toolRowLabel(visiblePart, true)\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 return (\n <ToolDisclosure\n renderActivityIcon={slots?.renderActivityIcon}\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 = toolSlotContext(presentingActivity, state.label, part, slots);\n return (\n <ToolDisclosure\n renderActivityIcon={slots?.renderActivityIcon}\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 * 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"],"mappings":"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","names":["React","jsx","React","React","React","React","jsx","jsx","jsxs","text","files","React","jsx","jsxs","React","jsx","jsxs","React","ChevronDown","React","React","jsx","jsxs","jsx","React","Fragment","jsx","React","ChevronDown","ChevronRight","Fragment","jsx","jsxs","isActive","candidate","ChevronDown","ChevronRight","jsx","jsxs","jsx","jsxs","ChevronDown","cva","Slot","jsx","cva","Slot","cva","Slot","jsx","cva","Slot","jsx","jsxs"]}
1
+ {"version":3,"sources":["../../src/ui/agent-chat-composer.tsx","../../src/ui/adapters.ts","../../src/ui/attachment.tsx","../../src/ui/utils.ts","../../src/ui/message.tsx","../../src/ui/use-agent-chat-composer.ts","../../src/ui/composer-attachments.ts","../../src/ui/composer-interactions.ts","../../src/ui/use-audio-recorder.ts","../../src/ui/agent-chat-context-status.tsx","../../src/ui/agent-chat-queue.tsx","../../src/ui/agent-chat-actions.tsx","../../src/ui/agent-chat-message.tsx","../../src/ui/hitl-submission-status.tsx","../../src/ui/agent-response-timeline.tsx","../../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/message-code.tsx","../../src/ui/code-block.tsx","../../src/ui/use-highlighted-code.ts","../../src/ui/code-highlighter.tsx","../../src/ui/hitl-presentation.ts","../../src/ui/tool-sessions.tsx","../../src/ui/bubble.tsx","../../src/ui/marker.tsx","../../src/ui/mcp-connect-required-card.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { ArrowUp, Loader2, Mic, Plus, Square } from \"lucide-react\";\n\nimport { ChatAttachmentRows } from \"./adapters\";\nimport type { AgentChatComposerFile } from \"./composer-attachments\";\nimport { cn } from \"./utils\";\nimport { useAgentChatComposer } from \"./use-agent-chat-composer\";\nimport type { AgentChatInputContract } from \"../runtime/input-contract\";\nimport type { ContextWindow } from \"@agents24/client/protocol\";\nimport { AgentChatContextStatus } from \"./agent-chat-context-status\";\n\nexport type { AgentChatComposerFile } from \"./composer-attachments\";\n\nexport type AgentChatComposerSubmit = {\n text: string;\n files: AgentChatComposerFile[];\n attachmentIds?: string[];\n};\n\nexport type AgentChatComposerProps = {\n inputContract?: AgentChatInputContract | null;\n recordingEnabled?: boolean;\n contextWindow?: ContextWindow | null;\n accept?: string;\n allowAttachments?: boolean;\n /** @deprecated Draft attachments are always contained inside the composer. */\n attachmentLayout?: \"flow\" | \"overlay\";\n className?: string;\n disabled?: boolean;\n forceExpanded?: boolean;\n focusKey?: string | null;\n scopeKey?: string | null;\n inputToolbarContent?: React.ReactNode;\n isRunning?: boolean;\n isCancelling?: boolean;\n onAttachmentCountChange?: (count: number) => void;\n onStop?: () => void;\n onSubmit: (message: AgentChatComposerSubmit) => Promise<void> | void;\n placeholder?: string;\n restoredDraft?: { revision: number; text: string; files: AgentChatComposerFile[] } | null;\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 inputContract,\n recordingEnabled,\n contextWindow,\n accept,\n allowAttachments = true,\n className,\n disabled = false,\n forceExpanded = false,\n focusKey,\n scopeKey,\n inputToolbarContent,\n isRunning = false,\n isCancelling = false,\n onAttachmentCountChange,\n onStop,\n onSubmit,\n placeholder = \"Message the agent\",\n restoredDraft,\n textareaRef,\n}: AgentChatComposerProps) {\n const fileInputRef = React.useRef<HTMLInputElement | null>(null);\n const localTextareaRef = React.useRef<HTMLTextAreaElement | null>(null);\n const composer = useAgentChatComposer({ inputContract, recordingEnabled, disabled, isRunning,\n isCancelling, scopeKey, focusKey, restoredDraft, textareaRef: localTextareaRef,\n onSubmit: (text, files) => onSubmit({ text: text.trim(), files, attachmentIds: files.flatMap(file => file.id ? [file.id] : []) }) });\n const { text, files, setText, isSubmitting, canSubmit, action, submit } = composer;\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(() => { onAttachmentCountChange?.(files.length); }, [files, onAttachmentCountChange]);\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 handleFilesChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n composer.addFiles(Array.from(event.target.files || []));\n event.currentTarget.value = \"\";\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\n {composer.attachmentError || composer.recorder.error ? <p role=\"alert\">{composer.attachmentError || composer.recorder.error}</p> : null}\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 {files.length > 0 ? (\n <ChatAttachmentRows\n data-testid=\"agent-chat-composer-attachments\"\n layout=\"composer\"\n attachments={files}\n onRemove={(attachment) => attachment.id && composer.removeFile(attachment.id)}\n />\n ) : null}\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={composer.fileAccept ?? 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 || !allowAttachments || !composer.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}\n name=\"message\"\n onChange={(event) => setText(event.target.value)}\n onKeyDown={composer.onKeyDown}\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 <AgentChatContextStatus contextWindow={contextWindow} />\n {composer.recordingAllowed ? <button type=\"button\" className={pillButtonClass}\n aria-label={composer.recorder.isRecording ? \"Stop recording\" : \"Record audio\"}\n disabled={disabled || isRunning || isSubmitting}\n onClick={() => { if (composer.recorder.isRecording) composer.recorder.stop(); else void composer.recorder.start(); }}>\n {composer.recorder.isRecording ? <Square /> : <Mic />}\n </button> : null}\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\"><AgentChatContextStatus contextWindow={contextWindow} />\n {composer.recordingAllowed ? <button type=\"button\" className={pillButtonClass}\n aria-label={composer.recorder.isRecording ? \"Stop recording\" : \"Record audio\"}\n disabled={disabled || isRunning || isSubmitting}\n onClick={() => { if (composer.recorder.isRecording) composer.recorder.stop(); else void composer.recorder.start(); }}>\n {composer.recorder.isRecording ? <Square /> : <Mic />}\n </button> : null}</div>\n ) : null}\n\n <div style={{ gridArea: \"submit\" }} className=\"a24-composer__submit-slot flex shrink-0 items-center justify-end gap-1\">\n <button\n aria-label={isCancelling ? \"Cancelling response\" : action === \"stop\" ? \"Stop generating\" : files.length > 0 ? `Send ${formatFileCount(files)}` : isRunning ? \"Queue message\" : \"Send message\"}\n className={cn(\"a24-composer__submit\", submitButtonClass, text.trim().length > 0 && \"hover:scale-105\")}\n disabled={isCancelling || (action === \"stop\" ? disabled : !canSubmit)}\n onClick={() => { if (action === \"stop\") onStop?.(); else void submit(); }}\n title={composer.validationError || (action === \"stop\" ? \"Stop\" : isRunning ? \"Queue message\" : \"Send\")}\n type=\"button\"\n >\n {isCancelling ? <Loader2 className=\"size-3.5 animate-spin\" /> : action === \"stop\" ? <Square className=\"size-3.5 fill-current\" /> : <ArrowUp className=\"size-4\" strokeWidth={2.5} />}\n </button>\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 presentation?: \"message\" | \"composer\";\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\" | \"mixed\",\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 presentation = \"message\",\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\", presentation === \"composer\" && \"a24-composer-attachment-card\", 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 presentation === \"composer\"\n ? React.createElement(\"span\", { className: \"a24-composer-image-caption\", title: filename }, filename)\n : null,\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 presentation = \"message\",\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 presentation,\n onRemove,\n resolveContent,\n });\n }\n return React.createElement(\n Attachment,\n {\n className: cn(\"a24-chat-attachment\", presentation === \"composer\" && \"a24-composer-attachment-card\", className),\n orientation: orientation || \"horizontal\",\n size: \"sm\",\n ...props,\n },\n presentation === \"composer\"\n ? React.createElement(\"div\", { className: \"a24-composer-file-preview\", \"aria-hidden\": true },\n React.createElement(FileIcon, { size: 64, type: fileIconType, variant: \"solid\" }))\n : null,\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 /** Composer drafts use one left-aligned row; transcript grouping stays unchanged. */\n layout?: \"message\" | \"composer\";\n onRemove?: (attachment: ChatAttachmentData) => void;\n resolveContent?: ChatAttachmentContentResolver;\n};\n\nexport function ChatAttachmentRows({\n attachments,\n layout = \"message\",\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\" | \"mixed\") =>\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 presentation: layout,\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\", layout === \"composer\" && \"a24-composer-attachment-row\", className),\n dir,\n ...props,\n },\n layout === \"composer\" ? renderRow(attachments, \"mixed\") : renderRow(imageAttachments, \"images\"),\n layout === \"message\" ? renderRow(fileAttachments, \"files\") : null\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 * as React from \"react\";\nimport type { AgentChatInputContract } from \"../runtime/input-contract\";\nimport { attachmentFileAccept, canonicalInputMimeType, inputMimeTypes, validateAgentChatSubmission } from \"../runtime/input-contract\";\nimport { createAgentChatComposerFile, revokeAgentChatComposerFiles, type AgentChatComposerFile } from \"./composer-attachments\";\nimport { chatComposerAction, useChatComposerFocus } from \"./composer-interactions\";\nimport { useAudioRecorder, type RecordingCompletionContext } from \"./use-audio-recorder\";\n\nexport type AgentChatComposerSubmission = { text: string; files: AgentChatComposerFile[] };\n\nexport type AgentChatComposerOptions = {\n inputContract?: AgentChatInputContract | null;\n recordingEnabled?: boolean;\n textareaRef?: React.RefObject<HTMLTextAreaElement | null>;\n disabled?: boolean;\n isRunning?: boolean;\n isCancelling?: boolean;\n forceExpanded?: boolean;\n focusKey?: string | null;\n scopeKey?: string | null;\n /** Replaces recorded-audio attachment creation; transport and policy remain host-owned. */\n onRecordingComplete?: (file: File, context: RecordingCompletionContext) => void | Promise<void>;\n restoredDraft?: { revision: number; text: string; files: AgentChatComposerFile[] } | null;\n onSubmit(text: string, files: AgentChatComposerFile[]): void | Promise<void>;\n /** Observe the shared recorder. Do not stop its tracks or start another capture. */\n onRecordingStreamChange?: (stream: MediaStream | null) => void;\n};\n\nexport function useAgentChatComposer(options: AgentChatComposerOptions) {\n const [text, setTextState] = React.useState(\"\");\n const [files, setFiles] = React.useState<AgentChatComposerFile[]>([]);\n const [attachmentError, setAttachmentError] = React.useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const localTextareaRef = React.useRef<HTMLTextAreaElement>(null);\n const textareaRef = options.textareaRef ?? localTextareaRef;\n const filesRef = React.useRef(files);\n const inFlightFilesRef = React.useRef(new Map<symbol, AgentChatComposerFile[]>());\n const revisionRef = React.useRef(0);\n const submittingRef = React.useRef(false);\n const generationRef = React.useRef(0);\n const mountedRef = React.useRef(true);\n const textRef = React.useRef(text);\n React.useLayoutEffect(() => {\n mountedRef.current = true;\n submittingRef.current = false;\n setIsSubmitting(false);\n return () => { mountedRef.current = false; generationRef.current += 1; };\n }, [options.scopeKey]);\n React.useEffect(() => () => {\n revokeAgentChatComposerFiles(filesRef.current);\n revokeAgentChatComposerFiles([...inFlightFilesRef.current.values()].flat());\n }, []);\n const revokeUnownedFiles = (candidates: AgentChatComposerFile[]) => {\n const retained = new Set([...filesRef.current, ...[...inFlightFilesRef.current.values()].flat()].map(file => file.url));\n revokeAgentChatComposerFiles(candidates.filter(file => !retained.has(file.url)));\n };\n const focusComposer = useChatComposerFocus({ textareaRef, disabled: Boolean(options.disabled),\n focusKey: options.focusKey, restoredDraft: options.restoredDraft,\n onRestore: draft => {\n revisionRef.current += 1;\n const previousFiles = filesRef.current;\n textRef.current = draft.text;\n filesRef.current = draft.files;\n revokeUnownedFiles(previousFiles);\n setTextState(draft.text);\n setFiles(draft.files);\n },\n });\n const attachmentMimeTypes = inputMimeTypes(options.inputContract);\n const setText = (value: string) => { revisionRef.current += 1; textRef.current = value; setTextState(value); };\n const addFiles = (selected: readonly File[]) => {\n const accepted = selected.filter(file => attachmentMimeTypes.includes(canonicalInputMimeType(file.type, file.name)));\n revisionRef.current += 1;\n const additions = selected.map(createAgentChatComposerFile);\n filesRef.current = [...filesRef.current, ...additions];\n setFiles(filesRef.current);\n setAttachmentError(accepted.length === selected.length ? null : \"One or more selected file types are not supported by this Agent.\");\n };\n const removeFile = (id: string) => {\n revisionRef.current += 1;\n const removed = filesRef.current.find(file => file.id === id);\n filesRef.current = filesRef.current.filter(file => file.id !== id);\n if (removed) revokeUnownedFiles([removed]);\n setFiles(filesRef.current);\n };\n const recorder = useAudioRecorder((file, context) => options.onRecordingComplete\n ? options.onRecordingComplete(file, context) : addFiles([file]),\n { onStreamChange: options.onRecordingStreamChange, scopeKey: options.scopeKey,\n acceptedMimeTypes: options.onRecordingComplete ? undefined : options.inputContract?.modalities.audio.allowed_mime_types ?? [] });\n const validationError = options.inputContract ? validateAgentChatSubmission(options.inputContract, text,\n files.map(file => ({ data: file.source || new Uint8Array(), mediaType: file.mediaType, name: file.filename, byteSize: file.byteSize }))) : null;\n const canSubmit = Boolean(text.trim() || files.length) && !options.disabled && !options.isCancelling && !isSubmitting && !recorder.isRecording && !recorder.isStarting && !recorder.isProcessing && !validationError;\n const submit = async (submission?: AgentChatComposerSubmission): Promise<boolean> => {\n const value = submission?.text ?? textRef.current;\n const selectedFiles = submission?.files ?? filesRef.current;\n const suppliedError = options.inputContract ? validateAgentChatSubmission(options.inputContract, value,\n selectedFiles.map(file => ({ data: file.source || new Uint8Array(), mediaType: file.mediaType, name: file.filename, byteSize: file.byteSize }))) : null;\n if (!mountedRef.current || (!value.trim() && !selectedFiles.length) || options.disabled || options.isCancelling\n || submittingRef.current || recorder.isCapturing() || (!submission && recorder.isProcessing) || suppliedError) return false;\n const generation = generationRef.current;\n const clearedRevision = ++revisionRef.current;\n submittingRef.current = true;\n setIsSubmitting(true);\n // Files replaced by an explicit payload no longer belong to the draft.\n const selectedUrls = new Set(selectedFiles.map(file => file.url));\n const replacedFiles = filesRef.current.filter(file => !selectedUrls.has(file.url));\n const submissionId = Symbol();\n inFlightFilesRef.current.set(submissionId, selectedFiles);\n textRef.current = \"\";\n filesRef.current = [];\n revokeUnownedFiles(replacedFiles);\n setTextState(\"\");\n setFiles([]);\n focusComposer();\n try {\n await options.onSubmit(value, selectedFiles);\n return true;\n } catch {\n if (mountedRef.current && generationRef.current === generation && revisionRef.current === clearedRevision) {\n revisionRef.current += 1;\n textRef.current = value;\n filesRef.current = selectedFiles;\n setTextState(value);\n setFiles(selectedFiles);\n }\n return false;\n } finally {\n inFlightFilesRef.current.delete(submissionId);\n revokeUnownedFiles(selectedFiles);\n if (mountedRef.current && generationRef.current === generation) {\n submittingRef.current = false;\n setIsSubmitting(false);\n }\n }\n };\n return { text, setText, files, addFiles, removeFile, textareaRef, submit, canSubmit, isSubmitting,\n attachmentError, attachmentMimeTypes, validationError, recorder, isProcessing: recorder.isProcessing,\n recordingAllowed: options.recordingEnabled ?? options.inputContract?.modalities.audio.recording_enabled ?? false,\n fileAccept: attachmentFileAccept(attachmentMimeTypes),\n onKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault();\n void submit();\n }\n },\n allowAttachments: attachmentMimeTypes.length > 0,\n isExpanded: Boolean(options.forceExpanded || text.includes(\"\\n\") || text.length > 62),\n action: chatComposerAction({ hasDraft: Boolean(text.trim() || files.length), isRunning: Boolean(options.isRunning), isCancelling: Boolean(options.isCancelling) }),\n };\n}\n","import type { ChatAttachment } from \"../types\";\nimport { normalizeAttachmentMimeType, type ThreadMessage } from \"@agents24/client\";\n\nexport type AgentChatComposerFile = ChatAttachment & {\n id: string;\n type: \"file\";\n url: string;\n filename: string;\n mediaType: string;\n source?: File;\n persistedAttachmentId?: string;\n byteSize?: number;\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: normalizeAttachmentMimeType(file.type, file.name),\n source: file,\n };\n}\n\nexport function revokeAgentChatComposerFiles(files: readonly AgentChatComposerFile[]): void {\n files.forEach((file) => {\n try {\n if (file.url.startsWith(\"blob:\")) URL.revokeObjectURL(file.url);\n } catch {\n // The URL may already be gone in tests or older browsers.\n }\n });\n}\n\nexport function queuedMessageComposerFiles(message: Pick<ThreadMessage, \"attachment_ids\" | \"attachments\">): AgentChatComposerFile[] {\n const byId = new Map((message.attachments || []).map((attachment) => [attachment.id, attachment]));\n return message.attachment_ids.map((id) => {\n const attachment = byId.get(id);\n return { id, persistedAttachmentId: id, type: \"file\", url: \"\",\n filename: attachment?.filename || \"Attachment\",\n mediaType: attachment?.mime_type || \"application/octet-stream\",\n byteSize: attachment?.byte_size || 0 };\n });\n}\n","import * as React from \"react\";\n\nexport function chatComposerAction({ hasDraft, isRunning, isCancelling }: {\n hasDraft: boolean; isRunning: boolean; isCancelling: boolean;\n}): \"stop\" | \"send\" {\n return isRunning && (!hasDraft || isCancelling) ? \"stop\" : \"send\";\n}\n\nexport function useChatComposerFocus<TDraft>({ textareaRef, disabled, focusKey, restoredDraft, onRestore }: {\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\n disabled: boolean;\n focusKey?: string | null;\n restoredDraft?: (TDraft & { revision: number }) | null;\n onRestore: (draft: TDraft & { revision: number }) => void;\n}) {\n const restoreRef = React.useRef(onRestore);\n restoreRef.current = onRestore;\n const focus = React.useCallback(() => {\n window.requestAnimationFrame(() => textareaRef.current?.focus({ preventScroll: true }));\n }, [textareaRef]);\n React.useEffect(() => {\n if (!restoredDraft) return;\n restoreRef.current(restoredDraft);\n focus();\n }, [restoredDraft?.revision, focus]);\n React.useEffect(() => {\n const supportsFinePointer = typeof window.matchMedia === \"function\"\n && window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches;\n if (disabled || !supportsFinePointer) return;\n focus();\n }, [disabled, focusKey, focus]);\n return focus;\n}\n","import * as React from \"react\";\nimport { normalizeAttachmentMimeType } from \"@agents24/client\";\n\nconst RECORDING_CANDIDATES = [\"audio/webm;codecs=opus\", \"audio/webm\", \"audio/mp4\"];\n\nexport type RecordingCompletionContext = { operationId: string; signal: AbortSignal };\nexport type AudioRecorderOptions = {\n /** Subscribe to the recorder-owned stream; consumers must not stop its tracks. */\n onStreamChange?: (stream: MediaStream | null) => void;\n /** Invalidates capture and completion work independently of focus. */\n scopeKey?: string | null;\n acceptedMimeTypes?: readonly string[];\n};\n\nexport function useAudioRecorder(\n onRecorded: (file: File, context: RecordingCompletionContext) => void | Promise<void>,\n options: AudioRecorderOptions = {},\n) {\n const recorderRef = React.useRef<MediaRecorder | null>(null);\n const streamRef = React.useRef<MediaStream | null>(null);\n const operationRef = React.useRef<RecordingCompletionContext & { controller: AbortController } | null>(null);\n const pendingRef = React.useRef(false);\n const callbacksRef = React.useRef({ onRecorded, onStreamChange: options.onStreamChange, acceptedMimeTypes: options.acceptedMimeTypes });\n React.useLayoutEffect(() => { callbacksRef.current = { onRecorded, onStreamChange: options.onStreamChange, acceptedMimeTypes: options.acceptedMimeTypes }; });\n const [isRecording, setIsRecording] = React.useState(false);\n const [isStarting, setIsStarting] = React.useState(false);\n const [isProcessing, setIsProcessing] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const release = React.useCallback(() => {\n streamRef.current?.getTracks().forEach(track => track.stop());\n streamRef.current = null;\n recorderRef.current = null;\n callbacksRef.current.onStreamChange?.(null);\n }, []);\n const discard = React.useCallback(() => {\n operationRef.current?.controller.abort();\n operationRef.current = null;\n pendingRef.current = false;\n const recorder = recorderRef.current;\n if (recorder) {\n recorder.onstop = null;\n recorder.onerror = null;\n recorder.ondataavailable = null;\n if (recorder.state !== \"inactive\") recorder.stop();\n }\n release();\n }, [release]);\n const cancel = React.useCallback(() => {\n discard();\n setIsStarting(false);\n setIsRecording(false);\n setIsProcessing(false);\n setError(null);\n }, [discard]);\n const stop = React.useCallback(() => {\n const recorder = recorderRef.current;\n if (recorder && recorder.state !== \"inactive\") recorder.stop();\n }, []);\n const isCapturing = React.useCallback(() => pendingRef.current || recorderRef.current !== null, []);\n const start = React.useCallback(async (startOptions: { operationId?: string } = {}) => {\n if (operationRef.current) return;\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 const controller = new AbortController();\n const operation = { operationId: startOptions.operationId ?? crypto.randomUUID(), signal: controller.signal, controller };\n operationRef.current = operation;\n pendingRef.current = true;\n setIsStarting(true);\n try {\n const mimeType = RECORDING_CANDIDATES.find(candidate => MediaRecorder.isTypeSupported(candidate)\n && (callbacksRef.current.acceptedMimeTypes === undefined || callbacksRef.current.acceptedMimeTypes.includes(normalizeAttachmentMimeType(candidate))));\n if (!mimeType) throw new Error(\"unsupported\");\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n if (operation.signal.aborted) {\n stream.getTracks().forEach(track => track.stop());\n return;\n }\n streamRef.current = stream;\n const recorder = new MediaRecorder(stream, { mimeType });\n recorderRef.current = recorder;\n const chunks: BlobPart[] = [];\n recorder.ondataavailable = event => { if (event.data.size) chunks.push(event.data); };\n recorder.onstop = () => {\n if (operation.signal.aborted) return;\n const actualType = recorder.mimeType || mimeType;\n const accepted = callbacksRef.current.acceptedMimeTypes;\n if (accepted !== undefined && !accepted.includes(normalizeAttachmentMimeType(actualType))) {\n cancel(); setError(\"This Agent does not accept the recorded audio format.\"); return;\n }\n const extension = actualType.startsWith(\"audio/mp4\") ? \"m4a\" : \"webm\";\n const file = new File(chunks, `recording-${Date.now()}.${extension}`, { type: actualType });\n // Capture has ended before consumers begin async processing or submission.\n release();\n setIsRecording(false);\n setIsProcessing(true);\n void Promise.resolve().then(() => {\n if (!operation.signal.aborted) return callbacksRef.current.onRecorded(file, operation);\n }).catch(() => {\n if (!operation.signal.aborted) setError(\"Recording processing failed.\");\n }).finally(() => {\n if (operationRef.current === operation) {\n operationRef.current = null;\n setIsProcessing(false);\n }\n });\n };\n recorder.onerror = () => {\n cancel();\n setError(\"Audio recording failed. Try again.\");\n };\n recorder.start();\n setIsRecording(true);\n callbacksRef.current.onStreamChange?.(stream);\n } catch {\n if (!operation.signal.aborted) {\n cancel();\n setError(\"Microphone access or audio recording is unavailable.\");\n }\n } finally {\n if (!operation.signal.aborted) {\n pendingRef.current = false;\n setIsStarting(false);\n }\n }\n }, [cancel, discard, release]);\n\n React.useLayoutEffect(() => { cancel(); return discard; }, [options.scopeKey, cancel, discard]);\n return { error, isRecording, isStarting, isProcessing, isCapturing, start, stop, cancel };\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 { CornerDownLeft, Ellipsis, Trash2 } from \"lucide-react\";\nimport type { ThreadMessage, ThreadMessageQueueState } from \"@agents24/client\";\nimport { cn } from \"./utils\";\n\nexport type AgentChatQueueProps = {\n pending: readonly ThreadMessage[];\n queue: ThreadMessageQueueState | null;\n onRemove(message: ThreadMessage): Promise<void>;\n onEdit(message: ThreadMessage): Promise<void>;\n onResume(): Promise<void>;\n className?: string;\n};\n\nfunction QueueRow({ message, onRemove, onEdit }: Pick<AgentChatQueueProps,\n \"onRemove\" | \"onEdit\"> & { message: ThreadMessage }) {\n const [busy, setBusy] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const editable = message.revision > 0 && (message.status === \"queued\" || message.status === \"blocked\");\n const act = async (operation: () => Promise<void>) => {\n setBusy(true);\n setError(null);\n try { await operation(); }\n catch (cause) { setError(cause instanceof Error ? cause.message : \"Message action failed. Try again.\"); }\n finally { setBusy(false); }\n };\n return <div data-message-id={message.id} className=\"a24-queue__row min-w-0 border-b border-border/40 last:border-b-0\">\n <div className=\"a24-queue__row-content flex min-h-9 items-center gap-2 px-3 text-sm\">\n <CornerDownLeft aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"a24-queue__text min-w-0 flex-1 truncate text-foreground\" title={message.text}>\n {message.text || `${message.attachment_ids.length} attachment${message.attachment_ids.length === 1 ? \"\" : \"s\"}`}\n </span>\n {message.status === \"blocked\" ? <span className=\"shrink-0 text-xs text-amber-700\">Needs attention</span> : null}\n {[\"steer_pending\", \"delivering\"].includes(message.status) ? <span className=\"shrink-0 text-xs text-muted-foreground\">Sending…</span> : null}\n {editable ? <>\n <button type=\"button\" aria-label=\"Delete queued message\" disabled={busy}\n onClick={() => void act(() => onRemove(message))}\n className=\"a24-queue__icon flex size-8 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground disabled:opacity-50\">\n <Trash2 aria-hidden className=\"size-4\" />\n </button>\n <details className=\"a24-queue__menu relative group/queue-menu\">\n <summary aria-label=\"Queued message options\" className=\"a24-queue__icon flex size-8 cursor-pointer list-none items-center justify-center text-muted-foreground hover:text-foreground [&::-webkit-details-marker]:hidden\">\n <Ellipsis aria-hidden className=\"size-4\" />\n </summary>\n <div className=\"a24-queue__menu-content mt-1 min-w-28 rounded-md border bg-background p-1\">\n <button type=\"button\" disabled={busy} onClick={() => void act(() => onEdit(message))}\n className=\"w-full rounded px-2 py-1 text-left text-sm hover:bg-muted disabled:opacity-50\">Edit message</button>\n </div>\n </details>\n </> : null}\n </div>\n {error ? <p role=\"alert\" className=\"px-9 pb-2 text-xs text-destructive\">{error}</p> : null}\n </div>;\n}\n\nexport function AgentChatQueue({ pending, queue, onRemove, onEdit, onResume, className }: AgentChatQueueProps) {\n const [resumeError, setResumeError] = React.useState<string | null>(null);\n if (!pending.length) return null;\n return <section aria-label=\"Message queue\" className={cn(\"a24-queue relative z-0 -mb-2 overflow-visible rounded-t-xl border border-b-0 border-border/50 bg-background pb-2\", className)}>\n {queue?.paused ? <div className=\"flex min-h-9 items-center justify-between gap-2 px-3 text-xs text-muted-foreground\">\n <span>Queue paused</span>\n <button type=\"button\" onClick={() => { void onResume().then(() => setResumeError(null)).catch((cause) => setResumeError(cause instanceof Error ? cause.message : \"Could not resume queue\")); }} className=\"font-medium text-foreground hover:underline\">Resume queue</button>\n </div> : null}\n {resumeError ? <p role=\"alert\" className=\"px-3 pb-2 text-xs text-destructive\">{resumeError}</p> : null}\n <div className=\"max-h-40 overflow-y-auto\">\n {pending.map((message) => <QueueRow key={message.client_submission_id || message.id} message={message} onRemove={onRemove} onEdit={onEdit} />)}\n </div>\n </section>;\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 animateCompletion?: boolean;\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\nconst enteredCompletionRuns = new Set<string>();\n\nexport function useLiveCompletionRuns(runId: string | null | undefined, isRunning: boolean): (candidate: string | null | undefined) => boolean {\n const liveRuns = React.useRef(new Set<string>());\n React.useEffect(() => {\n if (!runId || !isRunning) return;\n liveRuns.current.add(runId);\n if (liveRuns.current.size > 256) liveRuns.current.delete(liveRuns.current.values().next().value!);\n }, [runId, isRunning]);\n return (candidate) => Boolean(candidate && liveRuns.current.has(candidate));\n}\n\nexport function useCompletionActionEntrance(isComplete: boolean, runId?: string | null, wasLive = false): boolean {\n const sawIncomplete = React.useRef(!isComplete);\n const entered = React.useRef(false);\n const shouldEnter = isComplete && !entered.current\n && (runId ? wasLive && !enteredCompletionRuns.has(runId) : sawIncomplete.current);\n\n React.useEffect(() => {\n if (!isComplete) sawIncomplete.current = true;\n else if (shouldEnter) {\n entered.current = true;\n if (runId) {\n enteredCompletionRuns.add(runId);\n if (enteredCompletionRuns.size > 256) enteredCompletionRuns.delete(enteredCompletionRuns.values().next().value!);\n }\n }\n }, [isComplete, runId, shouldEnter]);\n\n return shouldEnter || entered.current;\n}\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 animateCompletion = false,\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 [feedbackPending, setFeedbackPending] = React.useState(false);\n const feedbackInFlight = React.useRef(false);\n const writeFeedback = async (input: Parameters<NonNullable<NonNullable<typeof handlers>[\"onSetFeedback\"]>>[1], close = false) => {\n if (feedbackInFlight.current) return;\n feedbackInFlight.current = true;\n setFeedbackPending(true);\n try {\n await handlers?.onSetFeedback?.(message, input);\n if (close) setFeedbackOpen(false);\n } catch {\n // The controller owns the operation error notice; the click owns its rejection.\n } finally {\n feedbackInFlight.current = false;\n setFeedbackPending(false);\n }\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 className={animateCompletion ? \"a24-chat-completion-actions\" : undefined}>\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 disabled={feedbackPending}\n onClick={() => void writeFeedback({\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 disabled={feedbackPending}\n label=\"Dislike\"\n onClick={() => {\n if (handlers.feedback?.rating !== \"dislike\") {\n void writeFeedback({ 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 disabled={feedbackPending}\n className=\"rounded-md px-3 py-2 text-sm font-medium hover:bg-muted\"\n onClick={() => {\n void writeFeedback({ rating: null }, true);\n }}\n type=\"button\"\n >\n Remove feedback\n </button>\n <button\n disabled={feedbackPending}\n className=\"rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:opacity-90\"\n onClick={() => {\n void writeFeedback({ rating: \"dislike\", reason, comment }, true);\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 type { HitlSubmissionOptions } from \"@agents24/react\";\nimport type { HitlSubmissionLabels } from \"./hitl-submission-status\";\nimport * 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 hitlLabels?: Partial<HitlSubmissionLabels>;\n onHitlPaint?: (durationMs: number) => void;\n getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;\n message: ChatMessage;\n nodeActivityMode?: \"default\" | \"all\" | \"hidden\";\n onHitlAction?: (part: ChatHitlPart, response: ChatHitlResponse, options?: HitlSubmissionOptions) => 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 hitlLabels,\n onHitlPaint,\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 && !message.responseCompletion;\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 hitlLabels={hitlLabels}\n onHitlPaint={onHitlPaint}\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(\n dir === \"rtl\" ? \"mt-1 h-9 w-full\" : \"mt-1 h-9 w-full -translate-x-2\",\n isAssistant && \"a24-chat-message-action-row--assistant\",\n actionsClassName\n )}>\n {renderedActions}\n </div>\n )\n ) : null}\n </Message>\n );\n}\n","import * as React from \"react\";\n\nexport type HitlSubmissionLabels = {\n submitting: string;\n checking: string;\n uncertain: string;\n retry: string;\n accepted: string;\n approved: string;\n rejected: string;\n};\nexport const defaultHitlSubmissionLabels: HitlSubmissionLabels = {\n submitting: \"Submitting…\", checking: \"Checking submission…\",\n uncertain: \"Submission could not be confirmed.\", retry: \"Retry submission\",\n accepted: \"Accepted; agent continuing\", approved: \"Approved; agent continuing\", rejected: \"Rejected\",\n};\nexport type HitlSubmissionPresentation = {\n status?: string;\n action?: string;\n retry?: () => Promise<void>;\n};\nexport function isHitlSubmissionCompact(state?: HitlSubmissionPresentation): boolean {\n return [\"submitting\", \"resuming\", \"checking\", \"uncertain\", \"accepted\"].includes(state?.status || \"\");\n}\n\n/** Also available to host-owned approval cards; keeps their decision feedback consistent. */\nexport function HitlSubmissionStatus({ state, labels: overrides, onPaint }: {\n state: HitlSubmissionPresentation;\n labels?: Partial<HitlSubmissionLabels>;\n onPaint?: (durationMs: number) => void;\n}) {\n const labels = { ...defaultHitlSubmissionLabels, ...overrides };\n const started = React.useRef(performance.now());\n const ref = React.useRef<HTMLDivElement>(null);\n const paintCallback = React.useRef(onPaint);\n paintCallback.current = onPaint;\n React.useEffect(() => {\n const frame = requestAnimationFrame(() => paintCallback.current?.(performance.now() - started.current));\n return () => cancelAnimationFrame(frame);\n }, []);\n React.useEffect(() => { ref.current?.focus({ preventScroll: true }); }, []);\n const text = state.status === \"checking\" ? labels.checking\n : state.status === \"uncertain\" ? labels.uncertain\n : state.status === \"accepted\" ? state.action === \"approve\" ? labels.approved\n : state.action === \"reject\" ? labels.rejected : labels.accepted\n : labels.submitting;\n return <div ref={ref} tabIndex={-1} role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"\n data-hitl-submission={state.status} className=\"a24-hitl-submission flex items-center gap-2 py-1 text-start text-sm text-muted-foreground outline-none\">\n <span>{text}</span>\n {state.status === \"uncertain\" && state.retry && <button type=\"button\" className=\"rounded px-2 py-1 text-foreground underline underline-offset-2\"\n onClick={() => { void state.retry?.().catch(() => undefined); }}>{labels.retry}</button>}\n </div>;\n}\n","import type { HitlSubmissionOptions } from \"@agents24/react\";\nimport { HitlSubmissionStatus, isHitlSubmissionCompact, type HitlSubmissionLabels } from \"./hitl-submission-status\";\nimport * as React from \"react\";\n\nimport type { ChatHitlPart, ChatHitlResponse, ChatMessage, ChatNodeActivityPart, ChatPart, ChatToolPart, ChatUiBlocksPart } 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 } 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 action?: string;\n retry?: () => Promise<void>;\n};\n\nexport type HitlActionState = AgentChatPartActionState;\n\nexport type AgentResponseTimelineProps = {\n hitlLabels?: Partial<HitlSubmissionLabels>;\n onHitlPaint?: (durationMs: number) => void;\n getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;\n isLoading?: boolean;\n message: ChatMessage;\n nodeActivityMode?: \"default\" | \"all\" | \"hidden\";\n onHitlAction?: (part: ChatHitlPart, response: ChatHitlResponse, options?: HitlSubmissionOptions) => void;\n onNodeSelect?: (part: ChatNodeActivityPart) => void;\n parts?: readonly ChatPart[];\n renderUiBlocks?: (part: ChatUiBlocksPart) => React.ReactNode;\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 hitlLabels,\n onHitlPaint,\n isLoading,\n onHitlAction,\n part,\n}: {\n getHitlActionState?: AgentResponseTimelineProps[\"getHitlActionState\"];\n hitlLabels?: AgentResponseTimelineProps[\"hitlLabels\"];\n onHitlPaint?: AgentResponseTimelineProps[\"onHitlPaint\"];\n isLoading?: boolean;\n onHitlAction?: AgentResponseTimelineProps[\"onHitlAction\"];\n part: ChatHitlPart;\n}) {\n const state = getHitlActionState?.(part);\n const [comment, setComment] = React.useState(\"\");\n const commentRef = React.useRef<HTMLTextAreaElement>(null);\n const retryActionRef = React.useRef<HTMLButtonElement>(null);\n React.useEffect(() => {\n if (state?.status === \"error\") (commentRef.current || retryActionRef.current)?.focus();\n }, [state?.status]);\n const presentation = part.presentation || {};\n const requireComment = presentation.require_comment === true;\n const isTerminal = part.status !== \"pending\";\n if (part.hitlKind === \"user_input\") {\n return (\n <AskUserInteraction\n error={state?.error}\n submission={state}\n submissionLabels={hitlLabels}\n onSubmissionPaint={onHitlPaint}\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 (isHitlSubmissionCompact(state)) return <HitlSubmissionStatus state={state!} labels={hitlLabels} onPaint={onHitlPaint} />;\n if (isTerminal) return null;\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 ref={commentRef}\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 ref={state?.action === action || (!state?.action && action === part.allowedActions[0]) ? retryActionRef : undefined}\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 hitlLabels?: AgentResponseTimelineProps[\"hitlLabels\"];\n onHitlPaint?: AgentResponseTimelineProps[\"onHitlPaint\"];\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 hitlLabels,\n onHitlPaint,\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 hitlLabels={hitlLabels}\n onHitlPaint={onHitlPaint}\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 hitlLabels,\n onHitlPaint,\n isLoading = false,\n message,\n nodeActivityMode = \"default\",\n onHitlAction,\n onNodeSelect,\n parts: displayParts,\n renderUiBlocks,\n responseProps,\n toolSlots,\n toolViewMode = \"closed\",\n}: AgentResponseTimelineProps) {\n isLoading = isLoading && !message.responseCompletion;\n const parts = (displayParts || message.parts || []).filter((part) => (\n (part.kind !== \"tool\" || !isInternalAskUserTool(part))\n && (part.kind !== \"hitl\" || part.hitlKind === \"user_input\" || part.status === \"pending\" || getHitlActionState?.(part)?.status === \"accepted\")\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 renderActivityIcon={toolSlots?.renderActivityIcon} 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 renderActivityIcon={toolSlots?.renderActivityIcon} key={key} label={part.label} onSelect={onNodeSelect ? () => onNodeSelect(part as ChatNodeActivityPart) : undefined} />\n : <AgentChatNodeActivityRow renderActivityIcon={toolSlots?.renderActivityIcon} key={part.id} onSelect={onNodeSelect} part={part as ChatNodeActivityPart} />,\n );\n continue;\n }\n if (part.kind === \"ui-blocks\" && renderUiBlocks) {\n rendered.push(<React.Fragment key={part.id}>{renderUiBlocks(part)}</React.Fragment>);\n continue;\n }\n rendered.push(\n <React.Fragment key={part.id}>\n <AgentChatPart\n activeToolId={activeToolId}\n getHitlActionState={getHitlActionState}\n hitlLabels={hitlLabels}\n onHitlPaint={onHitlPaint}\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 renderActivityIcon={toolSlots?.renderActivityIcon} key={`${message.id}-active-activity`} label=\"Thinking\" />);\n }\n return <div className=\"space-y-3\">{rendered}</div>;\n}\n","import { HitlSubmissionStatus, isHitlSubmissionCompact, type HitlSubmissionLabels, type HitlSubmissionPresentation } from \"./hitl-submission-status\";\nimport * 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 submission?: HitlSubmissionPresentation;\n submissionLabels?: Partial<HitlSubmissionLabels>;\n onSubmissionPaint?: (durationMs: number) => void;\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 submission,\n submissionLabels,\n onSubmissionPaint,\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 otherRef = React.useRef<HTMLInputElement>(null);\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 React.useEffect(() => { if (submission?.status === \"error\") (otherRef.current?.value ? otherRef.current : headingRef.current)?.focus(); }, [submission?.status]);\n\n if (part.status === \"pending\" && isHitlSubmissionCompact(submission)) {\n return <HitlSubmissionStatus state={submission!} labels={submissionLabels} onPaint={onSubmissionPaint} />;\n }\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 ref={otherRef}\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\";\nimport { formatMessageJson, MessageCodeBlock, MessageMarkdownCode } from \"./message-code\";\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 code: MessageMarkdownCode,\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 const json = React.useMemo(() => formatMessageJson(text), [text]);\n\n if (json !== null && !components?.code) {\n return (\n <div className={cn(\"a24-message-response\", className)}>\n <MessageCodeBlock\n code={streaming || streamingText.isAnimating ? streamingText.displayedText : json}\n language=\"json\"\n />\n </div>\n );\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 * as React from \"react\";\nimport { FileCode2Icon } from \"lucide-react\";\n\nimport {\n CodeBlock,\n CodeBlockActions,\n CodeBlockContent,\n CodeBlockCopyButton,\n CodeBlockDownloadButton,\n CodeBlockHeader,\n CodeBlockLine,\n CodeBlockTitle,\n CodeBlockWrapButton,\n} from \"./code-block\";\nimport { useHighlightedCode } from \"./use-highlighted-code\";\nimport { cn } from \"./utils\";\n\ntype CodeNode = {\n position?: { start?: { line?: number }; end?: { line?: number } };\n};\n\nconst CODE_EXTENSIONS: Record<string, string> = {\n bash: \"sh\", shell: \"sh\", shellscript: \"sh\", sh: \"sh\", zsh: \"sh\",\n javascript: \"js\", js: \"js\", jsx: \"jsx\", typescript: \"ts\", ts: \"ts\", tsx: \"tsx\",\n python: \"py\", py: \"py\", ruby: \"rb\", rust: \"rs\", rs: \"rs\", go: \"go\",\n java: \"java\", kotlin: \"kt\", swift: \"swift\", c: \"c\", cpp: \"cpp\", csharp: \"cs\",\n json: \"json\", jsonc: \"jsonc\", yaml: \"yaml\", yml: \"yml\", toml: \"toml\",\n html: \"html\", xml: \"xml\", css: \"css\", scss: \"scss\", sql: \"sql\",\n markdown: \"md\", md: \"md\", diff: \"diff\", text: \"txt\", plaintext: \"txt\",\n};\n\nexport function MessageCodeBlock({ code, language = \"text\" }: { code: string; language?: string }) {\n const [wrap, setWrap] = React.useState(false);\n const lines = useHighlightedCode(code, language);\n const extension = Object.prototype.hasOwnProperty.call(CODE_EXTENSIONS, language.toLowerCase())\n ? CODE_EXTENSIONS[language.toLowerCase()] : \"txt\";\n return (\n <CodeBlock>\n <CodeBlockHeader>\n <CodeBlockTitle>\n <FileCode2Icon size={14} strokeWidth={1.5} aria-hidden=\"true\" />\n <span>{language}</span>\n </CodeBlockTitle>\n <CodeBlockActions>\n <CodeBlockWrapButton wrap={wrap} onWrapChange={setWrap} />\n <CodeBlockDownloadButton value={code} filename={`code.${extension}`} />\n <CodeBlockCopyButton value={code} />\n </CodeBlockActions>\n </CodeBlockHeader>\n <CodeBlockContent aria-label={`${language} code`} lineNumbers wrap={wrap}>\n {lines.map((line, index) => <CodeBlockLine key={index}>{line}</CodeBlockLine>)}\n </CodeBlockContent>\n </CodeBlock>\n );\n}\n\nexport function MessageMarkdownCode({ children, className, node, ...props }: React.ComponentProps<\"code\"> & { node?: CodeNode; \"data-block\"?: string }) {\n const language = className?.match(/(?:^|\\s)language-([^\\s]+)/)?.[1];\n const multiline = node?.position?.start?.line !== node?.position?.end?.line;\n if (props[\"data-block\"] === undefined && !language && !multiline) {\n return <code {...props} className={cn(\"a24-inline-code\", className)} data-streamdown=\"inline-code\">{children}</code>;\n }\n const code = typeof children === \"string\" ? children.replace(/\\n$/, \"\") : \"\";\n return <MessageCodeBlock code={code} language={language} />;\n}\n\n// Validate first, then indent the original tokens so large integers and numeric\n// spellings survive presentation and copying without a JSON.parse/stringify round trip.\nexport function formatMessageJson(text: string): string | null {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return null;\n try { JSON.parse(trimmed); } catch { return null; }\n const tokens = trimmed.match(/\"(?:\\\\.|[^\"\\\\])*\"|[{}\\[\\],:]|[^\\s{}\\[\\],:]+/g) || [];\n let depth = 0;\n let result = \"\";\n const newline = () => `\\n${\" \".repeat(depth)}`;\n tokens.forEach((token, index) => {\n const previous = tokens[index - 1];\n const next = tokens[index + 1];\n if (token === \"{\" || token === \"[\") {\n result += token;\n depth += 1;\n if (next !== \"}\" && next !== \"]\") result += newline();\n } else if (token === \"}\" || token === \"]\") {\n depth -= 1;\n if (previous !== \"{\" && previous !== \"[\") result += newline();\n result += token;\n } else if (token === \",\") result += `,${newline()}`;\n else if (token === \":\") result += \": \";\n else result += token;\n });\n return result;\n}\n","\"use client\"\n\n// Adapted from shadcn/ui Code Block (Radix); styles ship with the package.\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"./utils\"\n\nimport { CheckIcon, CopyIcon, DownloadIcon, WrapTextIcon } from \"lucide-react\"\n\nconst codeBlockVariants = cva(\n \"a24-code-block\",\n {\n variants: {\n variant: {\n default:\n \"a24-code-block--default\",\n destructive:\n \"a24-code-block--destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction CodeBlock({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof codeBlockVariants> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"code-block\"\n data-variant={variant}\n data-size={size}\n className={cn(codeBlockVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction CodeBlockHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"code-block-header\"\n className={cn(\n \"a24-code-block__header\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CodeBlockTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"code-block-title\"\n className={cn(\n \"a24-code-block__title\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CodeBlockActions({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"code-block-actions\"\n className={cn(\n \"a24-code-block__actions\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CodeBlockCopyButton({\n value,\n className,\n onClick,\n ...props\n}: React.ComponentProps<\"button\"> & { value: string }) {\n const [copied, setCopied] = React.useState(false)\n\n React.useEffect(() => {\n if (!copied) {\n return\n }\n\n const timeout = setTimeout(() => setCopied(false), 2000)\n return () => clearTimeout(timeout)\n }, [copied])\n\n return (\n <>\n <button\n type=\"button\"\n data-slot=\"code-block-copy-button\"\n data-copied={copied || undefined}\n aria-label={copied ? \"Copied\" : \"Copy\"}\n title={copied ? \"Copied\" : \"Copy code\"}\n className={cn(\"a24-code-block__action\", className)}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented || !navigator.clipboard) return\n navigator.clipboard\n .writeText(value)\n .then(() => setCopied(true))\n .catch(() => {})\n }}\n {...props}\n >\n {copied ? (\n <CheckIcon size={12} strokeWidth={1.5} />\n ) : (\n <CopyIcon size={12} strokeWidth={1.5} />\n )}\n </button>\n <span aria-live=\"polite\" className=\"a24-code-block__announcement\">\n {copied ? \"Copied\" : \"\"}\n </span>\n </>\n )\n}\n\nfunction CodeBlockWrapButton({\n wrap,\n onWrapChange,\n className,\n onClick,\n ...props\n}: React.ComponentProps<\"button\"> & {\n wrap: boolean\n onWrapChange: (wrap: boolean) => void\n}) {\n return (\n <button\n type=\"button\"\n data-slot=\"code-block-wrap-button\"\n aria-label=\"Wrap lines\"\n aria-pressed={wrap}\n title={wrap ? \"Unwrap lines\" : \"Wrap lines\"}\n className={cn(\"a24-code-block__action\", className)}\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented) onWrapChange(!wrap)\n }}\n {...props}\n >\n <WrapTextIcon size={12} strokeWidth={1.5} />\n </button>\n )\n}\n\nfunction CodeBlockDownloadButton({\n value,\n filename = \"code.txt\",\n className,\n onClick,\n ...props\n}: React.ComponentProps<\"button\"> & { value: string; filename?: string }) {\n return (\n <button\n type=\"button\"\n data-slot=\"code-block-download-button\"\n aria-label=\"Download code\"\n title=\"Download code\"\n className={cn(\"a24-code-block__action\", className)}\n onClick={(event) => {\n onClick?.(event)\n if (event.defaultPrevented) return\n const url = URL.createObjectURL(new Blob([value], { type: \"text/plain;charset=utf-8\" }))\n const link = document.createElement(\"a\")\n link.href = url\n link.download = filename\n document.body.append(link)\n link.click()\n link.remove()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n }}\n {...props}\n >\n <DownloadIcon size={12} strokeWidth={1.5} />\n </button>\n )\n}\n\nfunction CodeBlockContent({\n className,\n children,\n style,\n wrap = false,\n lineNumbers = false,\n startLine = 1,\n ...props\n}: React.ComponentProps<\"pre\"> & {\n wrap?: boolean\n lineNumbers?: boolean\n startLine?: number\n}) {\n return (\n <pre\n data-slot=\"code-block-content\"\n data-wrap={wrap || undefined}\n data-numbered={lineNumbers || undefined}\n dir=\"ltr\"\n tabIndex={0}\n style={{ counterReset: `line ${startLine - 1}`, ...style }}\n className={cn(\n \"a24-code-block__content\",\n className\n )}\n {...props}\n >\n <code\n data-slot=\"code-block-code\"\n className=\"a24-code-block__code\"\n >\n {lineNumbers && typeof children === \"string\"\n ? children\n .replace(/\\n$/, \"\")\n .split(\"\\n\")\n .map((line, index) => (\n <CodeBlockLine key={index}>{line}</CodeBlockLine>\n ))\n : children}\n </code>\n </pre>\n )\n}\n\nconst codeBlockLineVariants = cva(\n \"a24-code-block__line\",\n {\n variants: {\n variant: {\n default: \"\",\n added: \"a24-code-block__line--added\",\n removed: \"a24-code-block__line--removed\",\n highlighted: \"a24-code-block__line--highlighted\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction CodeBlockLine({\n className,\n variant = \"default\",\n children,\n ...props\n}: React.ComponentProps<\"span\"> & VariantProps<typeof codeBlockLineVariants>) {\n // An empty line holds a newline so copying a selection keeps blank lines.\n const empty =\n children === undefined ||\n children === null ||\n children === \"\" ||\n (Array.isArray(children) && children.length === 0)\n\n return (\n <span\n data-slot=\"code-block-line\"\n data-variant={variant}\n className={cn(codeBlockLineVariants({ variant }), className)}\n {...props}\n >\n <span data-slot=\"code-block-line-content\" className=\"a24-code-block__line-content\">\n {empty ? \"\\n\" : children}\n </span>\n </span>\n )\n}\n\nfunction CodeBlockFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"code-block-footer\"\n className={cn(\n \"a24-code-block__footer\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n CodeBlock,\n CodeBlockHeader,\n CodeBlockTitle,\n CodeBlockActions,\n CodeBlockCopyButton,\n CodeBlockWrapButton,\n CodeBlockDownloadButton,\n CodeBlockContent,\n CodeBlockLine,\n CodeBlockFooter,\n}\n","import * as React from \"react\"\n\nimport { loadHighlighter } from \"./code-highlighter\"\n\nexport function useHighlightedCode(value: string, language: string) {\n // A trailing newline would render as an extra empty line.\n const code = value.endsWith(\"\\n\") ? value.slice(0, -1) : value\n const [loaded, setLoaded] = React.useState<{\n language: string\n highlighter: Awaited<ReturnType<typeof loadHighlighter>>\n } | null>(null)\n const highlighter = loaded?.language === language ? loaded.highlighter : null\n\n React.useEffect(() => {\n let cancelled = false\n\n loadHighlighter(language)\n .then((next) => {\n if (!cancelled) {\n setLoaded({ language, highlighter: next })\n }\n })\n .catch(() => {})\n\n return () => {\n cancelled = true\n }\n }, [language])\n\n // The complete lines, highlighted. While the code streams, only the new\n // lines are tokenized, starting from the grammar state of the last one.\n const [done, setDone] = React.useState<{\n highlighter: typeof highlighter\n text: string\n lines: React.ReactNode[]\n state?: Parameters<NonNullable<typeof highlighter>[\"highlight\"]>[1]\n }>({ highlighter: null, text: \"\", lines: [] })\n\n let next = done\n\n if (next.highlighter !== highlighter || !code.startsWith(next.text)) {\n next = { highlighter, text: \"\", lines: [] }\n }\n\n const end = code.lastIndexOf(\"\\n\") + 1\n\n if (highlighter && end > next.text.length) {\n const result = highlighter.highlight(\n code.slice(next.text.length, end - 1),\n next.state\n )\n\n next = {\n highlighter,\n text: code.slice(0, end),\n lines: [...next.lines, ...result.lines],\n state: result.state,\n }\n }\n\n if (next !== done) {\n setDone(next)\n }\n\n // The last line is still being written, so it is tokenized on every render.\n const tail = code.slice(end)\n\n return React.useMemo(() => {\n if (!highlighter) {\n return code.split(\"\\n\")\n }\n\n return [...next.lines, highlighter.highlight(tail, next.state).lines[0]]\n }, [code, highlighter, next, tail])\n}\n","import * as React from \"react\"\nimport {\n createHighlighterCore,\n type GrammarState,\n type HighlighterCore,\n} from \"shiki/core\"\nimport { createJavaScriptRegexEngine } from \"shiki/engine/javascript\"\n\nimport { bundledLanguages, bundledLanguagesAlias } from \"shiki/langs\"\n\nconst languageLoaders: Record<string, (typeof bundledLanguages)[keyof typeof bundledLanguages]> = {\n ...bundledLanguages,\n ...bundledLanguagesAlias,\n}\n\nlet highlighter: Promise<HighlighterCore> | undefined\n\nfunction getHighlighter() {\n highlighter ??= createHighlighterCore({\n themes: [\n import(\"shiki/themes/github-light.mjs\"),\n import(\"shiki/themes/github-dark.mjs\"),\n ],\n langs: [],\n engine: createJavaScriptRegexEngine({ forgiving: true }),\n })\n\n return highlighter\n}\n\nfunction getLanguage(language: string): string | null {\n const name = language.toLowerCase()\n if (name === \"ansi\") return name\n if (Object.prototype.hasOwnProperty.call(languageLoaders, name)) return name\n return null\n}\n\n// Loads a language and returns a highlighter for it, or null for a language\n// that is not listed.\nexport async function loadHighlighter(language: string) {\n const lang = getLanguage(language)\n\n if (!lang) {\n return null\n }\n\n const shiki = await getHighlighter()\n\n if (lang !== \"ansi\" && !shiki.getLoadedLanguages().includes(lang)) {\n await shiki.loadLanguage(languageLoaders[lang])\n }\n\n return {\n // Returns one React node per line, and the grammar state after the last\n // line. Pass that state back to continue where the code left off.\n highlight(code: string, state?: GrammarState) {\n const tokenize = (text: string) =>\n shiki.codeToTokens(text, {\n lang,\n themes: { light: \"github-light\", dark: \"github-dark\" },\n defaultColor: false,\n grammarState: state,\n }).tokens\n\n // ANSI has no grammar state, so each line is tokenized on its own and\n // gets the same colors whether it arrives in one piece or streams.\n const tokens =\n lang === \"ansi\"\n ? code.split(\"\\n\").flatMap((line) => tokenize(line))\n : tokenize(code)\n\n return {\n lines: tokens.map((line) =>\n line.map((token, index) => (\n <span\n key={index}\n style={token.htmlStyle as React.CSSProperties}\n className=\"a24-code-token\"\n >\n {token.content}\n </span>\n ))\n ),\n state: shiki.getLastGrammarState(tokens),\n }\n },\n }\n}\n\n// Returns one React node per line, or null for a language that is not listed.\nexport async function highlightCode(code: string, language: string) {\n const highlighter = await loadHighlighter(language)\n\n return highlighter ? highlighter.highlight(code).lines : null\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 { ChatComputerResourceTarget, 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 resourceTargets: readonly ChatComputerResourceTarget[];\n openResource: (target: ChatComputerResourceTarget) => void;\n};\n\nexport type AgentChatActivityIconContext = {\n label: string;\n kind: \"tool\" | \"group\" | \"planning\" | \"node\";\n part?: ChatToolPart | ChatNodeActivityPart;\n};\n\nexport type AgentChatToolSlots = {\n renderActivityIcon?: (context: AgentChatActivityIconContext) => React.ReactNode;\n onExpandedChange?: (open: boolean, part?: ChatToolPart) => void;\n onToolSelect?: (part: ChatToolPart) => void;\n onResourceAction?: (target: ChatComputerResourceTarget, 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\nfunction toolSlotContext(isActive: boolean, label: string, part: ChatToolPart, slots?: AgentChatToolSlots): AgentChatToolSlotContext {\n return { isActive, label, part, resourceTargets: part.resourceTargets || [],\n openResource: target => slots?.onResourceAction?.(target, part) };\n}\n\nfunction resourceTargetName(target: ChatComputerResourceTarget): string {\n const normalized = target.path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n return normalized.split(\"/\").filter(Boolean).pop() || \"workspace\";\n}\n\nfunction ToolResourceAction({ context }: { context: AgentChatToolSlotContext }) {\n const target = context.resourceTargets[0];\n if (!target) return null;\n const name = resourceTargetName(target);\n return (\n <button\n aria-label={`Open ${target.kind} ${target.path}`}\n className=\"a24-tool-resource-action\"\n data-agents24-resource-path={target.path}\n onClick={() => context.openResource(target)}\n title={target.path}\n type=\"button\"\n >\n {name}\n </button>\n );\n}\n\nfunction toolAccessory(context: AgentChatToolSlotContext, slots?: AgentChatToolSlots): React.ReactNode {\n return (\n <>\n {slots?.onResourceAction ? <ToolResourceAction context={context} /> : null}\n {slots?.renderToolAccessory?.(context)}\n </>\n );\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 = \"Working\", kind = \"tool\", part, renderActivityIcon }: AgentChatActivityIconContext & {\n renderActivityIcon?: AgentChatToolSlots[\"renderActivityIcon\"];\n}) {\n return (\n <span className=\"a24-tool-orb\">\n {renderActivityIcon ? renderActivityIcon({ label, kind, part }) : <ThinkingOrb aria-label={label} size={20} speed={0.8} state=\"searching\" />}\n </span>\n );\n}\n\nexport function AgentChatActivityRow({\n label,\n modelTurnId,\n renderActivityIcon,\n onSelect,\n}: {\n label: string;\n modelTurnId?: string;\n renderActivityIcon?: AgentChatToolSlots[\"renderActivityIcon\"];\n onSelect?: () => void;\n}) {\n const content = (\n <>\n <ToolActivityOrb label={label} kind=\"planning\" renderActivityIcon={renderActivityIcon} />\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 a24-tool-trigger-row--root\" 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 renderActivityIcon,\n onSelect,\n part,\n}: {\n renderActivityIcon?: AgentChatToolSlots[\"renderActivityIcon\"];\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} kind=\"node\" part={part} renderActivityIcon={renderActivityIcon} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </button>\n ) : (\n <div className={triggerClassName}>\n {running ? <ToolActivityOrb label={part.label} kind=\"node\" part={part} renderActivityIcon={renderActivityIcon} /> : 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, separateResource = false): string {\n const label = agentChatToolLabel(part);\n const lifecycleLabel = isAgentChatToolRunning(part) ? label : label.replace(/^(?:running|ran)\\s+/i, \"\");\n const targetPath = separateResource ? part.resourceTargets?.[0]?.path : null;\n if (!targetPath) return lifecycleLabel;\n const candidates = [targetPath, targetPath.replace(/^\\/workspace\\/?/, \"\")]\n .filter(Boolean)\n .sort((left, right) => right.length - left.length);\n const suffix = candidates.find((candidate) => lifecycleLabel.endsWith(candidate));\n return suffix ? lifecycleLabel.slice(0, -suffix.length).trimEnd() : lifecycleLabel;\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 renderActivityIcon,\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 renderActivityIcon?: AgentChatToolSlots[\"renderActivityIcon\"];\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={cn(\"a24-tool-trigger-row\", root && \"a24-tool-trigger-row--root\")}>\n {onSelect && part ? (\n <button className={triggerClassName} onClick={() => onSelect(part)} type=\"button\">\n {showOrb ? <ToolActivityOrb label={statusLabel || \"Working\"} kind={grouped ? \"group\" : \"tool\"} part={part} renderActivityIcon={renderActivityIcon} /> : null}\n <span className=\"a24-tool-trigger__label\">{label}</span>\n </button>\n ) : (\n <div className={triggerClassName}>\n {showOrb ? <ToolActivityOrb label={statusLabel || \"Working\"} kind={grouped ? \"group\" : \"tool\"} part={part} renderActivityIcon={renderActivityIcon} /> : 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\", root && \"a24-tool-trigger-row--root\")}>\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 || \"Working\"} kind={grouped ? \"group\" : \"tool\"} part={part} renderActivityIcon={renderActivityIcon} /> : 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?.(toolSlotContext(active, label, part, slots)) ?? 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 = toolSlotContext(active, toolRowLabel(part, Boolean(slots?.onResourceAction)), part, slots);\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <ToolDisclosure\n renderActivityIcon={slots?.renderActivityIcon}\n error={failed}\n accessory={toolAccessory(context, slots)}\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 = toolRowLabel(visiblePart, true);\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 ? toolRowLabel(visiblePart, true)\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 return (\n <ToolDisclosure\n renderActivityIcon={slots?.renderActivityIcon}\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 = toolSlotContext(presentingActivity, state.label, part, slots);\n return (\n <ToolDisclosure\n renderActivityIcon={slots?.renderActivityIcon}\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 * 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"],"mappings":"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","names":["React","jsx","React","React","React","normalizeAttachmentMimeType","React","jsx","jsx","jsxs","text","files","React","jsx","jsxs","React","jsx","jsxs","React","ChevronDown","React","jsx","jsxs","React","React","jsx","jsxs","jsx","React","React","React","cva","Fragment","jsx","jsxs","cva","React","jsx","highlighter","next","jsx","jsxs","Fragment","jsx","React","ChevronDown","ChevronRight","Fragment","jsx","jsxs","isActive","candidate","ChevronDown","ChevronRight","jsx","jsxs","jsx","jsxs","ChevronDown","cva","Slot","jsx","cva","Slot","cva","Slot","jsx","cva","Slot","jsx","jsxs"]}