@agents24/chat-react 0.3.2 → 0.4.0

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 (58) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +21 -66
  3. package/compatibility.json +54 -0
  4. package/dist/active-content.d.ts +10 -0
  5. package/dist/{chunk-EWZO4QJI.js → chunk-CHAU7FNW.js} +3 -3
  6. package/dist/chunk-CHAU7FNW.js.map +1 -0
  7. package/dist/{chunk-FFO6KEB4.js → chunk-LI67M74F.js} +98 -12
  8. package/dist/chunk-LI67M74F.js.map +1 -0
  9. package/dist/chunk-NLEOWTZG.js +1327 -0
  10. package/dist/chunk-NLEOWTZG.js.map +1 -0
  11. package/dist/index.cjs +66 -1852
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.ts +0 -6
  14. package/dist/index.js +6 -1841
  15. package/dist/index.js.map +1 -1
  16. package/dist/latest-thread-scroller.d.ts +7 -7
  17. package/dist/mcp-oauth.d.ts +3 -1
  18. package/dist/renderers.d.ts +3 -3
  19. package/dist/styles.css +407 -0
  20. package/dist/templates/agent-chat-app.d.ts +18 -0
  21. package/dist/templates/agent-chat-layout.d.ts +69 -0
  22. package/dist/templates/agent-chat-shell.d.ts +1 -1
  23. package/dist/templates/index.cjs +1904 -18
  24. package/dist/templates/index.cjs.map +1 -1
  25. package/dist/templates/index.d.ts +2 -0
  26. package/dist/templates/index.js +529 -11
  27. package/dist/templates/index.js.map +1 -1
  28. package/dist/types.d.ts +12 -380
  29. package/dist/ui/agent-chat-actions.d.ts +1 -2
  30. package/dist/ui/agent-chat-composer.d.ts +2 -1
  31. package/dist/ui/agent-chat-message.d.ts +3 -3
  32. package/dist/ui/agent-response-timeline.d.ts +2 -2
  33. package/dist/ui/attachment.d.ts +9 -9
  34. package/dist/ui/bubble.d.ts +4 -4
  35. package/dist/ui/index.cjs +137 -43
  36. package/dist/ui/index.cjs.map +1 -1
  37. package/dist/ui/index.js +62 -1220
  38. package/dist/ui/index.js.map +1 -1
  39. package/dist/ui/marker.d.ts +3 -3
  40. package/dist/ui/mcp-connect-required-card.d.ts +1 -1
  41. package/dist/ui/message-response.d.ts +1 -1
  42. package/dist/ui/message.d.ts +6 -6
  43. package/package.json +27 -8
  44. package/dist/chunk-EWZO4QJI.js.map +0 -1
  45. package/dist/chunk-FFO6KEB4.js.map +0 -1
  46. package/dist/chunk-UU7OXHL3.js +0 -11
  47. package/dist/chunk-UU7OXHL3.js.map +0 -1
  48. package/dist/context-window.d.ts +0 -38
  49. package/dist/controller-actions.d.ts +0 -45
  50. package/dist/controller-helpers.d.ts +0 -27
  51. package/dist/controller-hitl.d.ts +0 -22
  52. package/dist/controller-options.d.ts +0 -15
  53. package/dist/controller-thread-events.d.ts +0 -7
  54. package/dist/controller.d.ts +0 -5
  55. package/dist/message-lifecycle.d.ts +0 -15
  56. package/dist/model.d.ts +0 -30
  57. package/dist/sse.d.ts +0 -5
  58. package/dist/transport.d.ts +0 -43
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/agent-chat-composer.tsx","../../src/ui/agent-chat-actions.tsx","../../src/ui/adapters.ts","../../src/ui/attachment.tsx","../../src/ui/message.tsx","../../src/ui/agent-chat-message.tsx","../../src/ui/agent-response-timeline.tsx","../../src/ui/message-response.tsx","../../src/ui/hitl-presentation.ts","../../src/ui/bubble.tsx","../../src/ui/marker.tsx","../../src/ui/mcp-connect-required-card.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { ArrowUp, Paperclip, Plus, Square, X } from \"lucide-react\";\n\nimport type { ChatAttachment } from \"../types\";\nimport { cn } from \"./utils\";\n\nexport type AgentChatComposerFile = ChatAttachment & {\n id: string;\n type: \"file\";\n url: string;\n filename: string;\n mediaType: string;\n};\n\nexport type AgentChatComposerSubmit = {\n text: string;\n files: AgentChatComposerFile[];\n};\n\nexport type AgentChatComposerProps = {\n accept?: string;\n allowAttachments?: boolean;\n attachmentLayout?: \"flow\" | \"overlay\";\n className?: string;\n disabled?: boolean;\n inputToolbarContent?: React.ReactNode;\n isRunning?: boolean;\n onAttachmentCountChange?: (count: number) => void;\n onStop?: () => void;\n onSubmit: (message: AgentChatComposerSubmit) => Promise<void> | void;\n placeholder?: string;\n textareaRef?: React.Ref<HTMLTextAreaElement>;\n};\n\nconst createId = () =>\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `file-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\nfunction createComposerFile(file: File): AgentChatComposerFile {\n return {\n id: createId(),\n type: \"file\",\n url: URL.createObjectURL(file),\n filename: file.name || \"attachment\",\n mediaType: file.type || \"application/octet-stream\",\n };\n}\n\nfunction revokeComposerFiles(files: AgentChatComposerFile[]) {\n files.forEach((file) => {\n try {\n URL.revokeObjectURL(file.url);\n } catch {\n // Object URLs can already be gone in tests or older browsers.\n }\n });\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-full border-0 bg-neutral-100 text-sm text-neutral-600 shadow-none transition-colors hover:bg-neutral-200 hover:text-neutral-800 focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50 dark:bg-neutral-800 dark:text-neutral-300 dark:hover:bg-neutral-700\";\n\nconst submitButtonClass =\n \"inline-flex size-9 shrink-0 items-center justify-center gap-2 rounded-full border-0 bg-neutral-900 text-sm text-white shadow-none transition-all duration-200 hover:bg-neutral-800 hover:text-white focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50 dark:bg-neutral-100 dark:text-neutral-900 dark:hover:bg-white\";\n\nexport function AgentChatComposer({\n accept,\n allowAttachments = true,\n attachmentLayout = \"flow\",\n className,\n disabled = false,\n inputToolbarContent,\n isRunning = false,\n onAttachmentCountChange,\n onStop,\n onSubmit,\n placeholder = \"Send follow-up\",\n textareaRef,\n}: AgentChatComposerProps) {\n const fileInputRef = React.useRef<HTMLInputElement | null>(null);\n const filesRef = React.useRef<AgentChatComposerFile[]>([]);\n const localTextareaRef = React.useRef<HTMLTextAreaElement | null>(null);\n const [text, setText] = React.useState(\"\");\n const [files, setFiles] = React.useState<AgentChatComposerFile[]>([]);\n const [isSubmitting, setIsSubmitting] = React.useState(false);\n const isExpanded = text.includes(\"\\n\") || text.length > 62;\n\n const setTextareaRef = React.useCallback(\n (node: HTMLTextAreaElement | null) => {\n localTextareaRef.current = node;\n if (typeof textareaRef === \"function\") {\n textareaRef(node);\n } else if (textareaRef) {\n (textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node;\n }\n },\n [textareaRef]\n );\n\n React.useEffect(() => {\n filesRef.current = files;\n onAttachmentCountChange?.(files.length);\n }, [files, onAttachmentCountChange]);\n\n React.useEffect(() => () => revokeComposerFiles(filesRef.current), []);\n\n React.useLayoutEffect(() => {\n const textarea = localTextareaRef.current;\n if (!textarea) return;\n if (isExpanded) {\n textarea.style.height = \"auto\";\n const scrollHeight = textarea.scrollHeight;\n textarea.style.height = `${Math.min(scrollHeight, 224)}px`;\n textarea.style.overflowY = scrollHeight >= 224 ? \"auto\" : \"hidden\";\n return;\n }\n textarea.style.height = \"\";\n textarea.style.overflowY = \"hidden\";\n }, [isExpanded, text]);\n\n const canSubmit =\n !disabled &&\n !isSubmitting &&\n !isRunning &&\n (text.trim().length > 0 || files.length > 0);\n\n const handleFilesChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const selected = Array.from(event.target.files || []).map(createComposerFile);\n if (selected.length > 0) {\n setFiles((current) => [...current, ...selected]);\n }\n event.currentTarget.value = \"\";\n };\n\n const removeFile = (fileId: string) => {\n setFiles((current) => {\n const target = current.find((file) => file.id === fileId);\n if (target) revokeComposerFiles([target]);\n return current.filter((file) => file.id !== fileId);\n });\n };\n\n const submit = async () => {\n if (!canSubmit) return;\n const submittedText = text.trim();\n const submittedFiles = files;\n setIsSubmitting(true);\n try {\n await onSubmit({ text: submittedText, files: submittedFiles });\n setText(\"\");\n setFiles([]);\n revokeComposerFiles(submittedFiles);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n void submit();\n }\n };\n\n return (\n <div className={cn(\"relative mx-auto w-full max-w-3xl overflow-visible\", className)}>\n {files.length > 0 ? (\n <div\n data-testid=\"agent-chat-composer-attachments\"\n className={cn(\n \"flex min-w-0 gap-2 py-1\",\n attachmentLayout === \"overlay\"\n ? \"absolute bottom-full left-0 right-0 mb-1.5 flex-nowrap overflow-x-auto overflow-y-hidden overscroll-x-contain px-2\"\n : \"mb-2 flex-wrap px-1\"\n )}\n >\n {files.map((file) => (\n <div\n key={file.id}\n className=\"group relative flex h-8 max-w-[min(20rem,calc(100vw-2rem))] cursor-default select-none items-center gap-1.5 rounded-md border border-neutral-200 bg-white px-1.5 text-sm font-medium text-foreground transition-colors hover:bg-neutral-50\"\n >\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded bg-background text-muted-foreground\">\n <Paperclip className=\"size-3\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{file.filename}</span>\n <button\n aria-label={`Remove ${file.filename}`}\n className=\"inline-flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground opacity-70 transition-colors hover:bg-muted hover:text-foreground hover:opacity-100 focus-visible:outline-none\"\n onClick={() => removeFile(file.id)}\n type=\"button\"\n >\n <X className=\"size-3\" />\n </button>\n </div>\n ))}\n </div>\n ) : null}\n\n <div\n className={cn(\n \"relative w-full border border-neutral-200 bg-white shadow-sm transition-colors duration-200 focus-within:border-neutral-300 dark:border-neutral-700 dark:bg-card dark:focus-within:border-neutral-600\",\n isExpanded ? \"rounded-[18px] p-2 pb-1.5\" : \"rounded-full px-2 py-[3px]\"\n )}\n >\n <div\n className=\"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=\"flex shrink-0 items-center justify-center\">\n <input\n ref={fileInputRef}\n accept={accept}\n aria-label=\"Attach files\"\n className=\"hidden\"\n multiple\n onChange={handleFilesChange}\n type=\"file\"\n />\n <button\n aria-label=\"Attach files\"\n className={pillButtonClass}\n disabled={disabled || isSubmitting || isRunning || !allowAttachments}\n onClick={() => fileInputRef.current?.click()}\n title=\"Attach files\"\n type=\"button\"\n >\n <Plus className=\"size-4\" />\n </button>\n </div>\n\n <div style={{ gridArea: \"textarea\" }} className=\"min-w-0 w-full\">\n <textarea\n ref={setTextareaRef}\n aria-label=\"Message\"\n className={cn(\n \"w-full resize-none border-0 bg-transparent px-1 text-[15px] leading-relaxed text-foreground shadow-none outline-none placeholder:text-neutral-400 focus-visible:ring-0 scrollbar-thin\",\n isExpanded ? \"min-h-9 max-h-[224px] py-1\" : \"min-h-9 h-9 max-h-9 py-2\"\n )}\n disabled={disabled || isSubmitting || isRunning}\n onChange={(event) => setText(event.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={isExpanded ? 2 : 1}\n value={text}\n />\n </div>\n\n {isExpanded ? (\n <div style={{ gridArea: \"toolbar\" }} className=\"flex min-w-0 items-center gap-1.5\">\n {inputToolbarContent}\n </div>\n ) : null}\n\n {!isExpanded ? (\n <div style={{ gridArea: \"composer\" }} className=\"flex min-w-0 items-center gap-1.5\" />\n ) : null}\n\n {!isExpanded ? (\n <div style={{ gridArea: \"mic\" }} className=\"flex shrink-0 items-center justify-end\" />\n ) : null}\n\n <div style={{ gridArea: \"submit\" }} className=\"flex shrink-0 items-center justify-end\">\n {isRunning ? (\n <button\n aria-label=\"Stop generating\"\n className={submitButtonClass}\n disabled={disabled || !onStop}\n onClick={onStop}\n title=\"Stop\"\n type=\"button\"\n >\n <Square className=\"size-3.5 fill-current\" />\n </button>\n ) : (\n <button\n aria-label={files.length > 0 ? `Send ${formatFileCount(files)}` : \"Send message\"}\n className={cn(submitButtonClass, text.trim().length > 0 && \"hover:scale-105\")}\n disabled={!canSubmit}\n onClick={() => void submit()}\n title=\"Send\"\n type=\"button\"\n >\n <ArrowUp className=\"size-4\" strokeWidth={2.5} />\n </button>\n )}\n </div>\n </div>\n </div>\n\n {!isExpanded && inputToolbarContent ? (\n <div className=\"mt-2 flex items-center gap-2 px-1\">{inputToolbarContent}</div>\n ) : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Check, Copy, RefreshCcw, ThumbsDown, ThumbsUp } from \"lucide-react\";\n\nimport type { ChatMessage } from \"../types\";\nimport { MessageAction, MessageActions } from \"./adapters\";\n\nexport type AgentChatMessageActionHandlers = {\n copied?: boolean;\n disliked?: boolean;\n liked?: boolean;\n onCopy?: (content: string, messageId: string) => void;\n onDislike?: (message: ChatMessage) => void | Promise<void>;\n onLike?: (message: ChatMessage) => void | Promise<void>;\n onRetry?: (message: ChatMessage) => void | Promise<void>;\n};\n\nexport type AgentChatDefaultActionsProps = {\n handlers?: AgentChatMessageActionHandlers;\n message: ChatMessage;\n};\n\nexport function AgentChatDefaultActions({\n handlers,\n message,\n}: AgentChatDefaultActionsProps) {\n if (!handlers || message.role !== \"assistant\" || message.isFinal === false) return null;\n return (\n <MessageActions>\n {handlers.onRetry ? (\n <MessageAction\n label=\"Retry\"\n onClick={() => void handlers.onRetry?.(message)}\n tooltip=\"Regenerate response\"\n >\n <RefreshCcw className=\"size-4\" />\n </MessageAction>\n ) : null}\n {handlers.onLike ? (\n <MessageAction\n label=\"Like\"\n onClick={() => void handlers.onLike?.(message)}\n tooltip=\"Like this response\"\n >\n <ThumbsUp className=\"size-4\" fill={handlers.liked ? \"currentColor\" : \"none\"} />\n </MessageAction>\n ) : null}\n {handlers.onDislike ? (\n <MessageAction\n label=\"Dislike\"\n onClick={() => void handlers.onDislike?.(message)}\n tooltip=\"Dislike this response\"\n >\n <ThumbsDown className=\"size-4\" fill={handlers.disliked ? \"currentColor\" : \"none\"} />\n </MessageAction>\n ) : null}\n {handlers.onCopy ? (\n <MessageAction\n label=\"Copy\"\n onClick={() => handlers.onCopy?.(message.content || \"\", message.id)}\n tooltip={handlers.copied ? \"Copied!\" : \"Copy to clipboard\"}\n >\n {handlers.copied ? (\n <Check className=\"size-4 text-green-600\" />\n ) : (\n <Copy className=\"size-4\" />\n )}\n </MessageAction>\n ) : null}\n </MessageActions>\n );\n}\n","import * as React from \"react\";\n\nimport type {\n ChatAttachment as Agents24ChatAttachment,\n ChatMessage as Agents24ChatMessage,\n} from \"../types\";\nimport {\n Attachment,\n AttachmentContent,\n AttachmentDescription,\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\";\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 isRtl = props.dir === \"rtl\";\n const resolvedAlign = align || \"start\";\n const messageProps: ShadcnMessageProps = Object.assign({}, props);\n messageProps.align = resolvedAlign;\n messageProps.className = cn(\n \"group flex w-full max-w-[80%] flex-col gap-2\",\n isUser\n ? cn(\"is-user justify-end\", isRtl ? \"mr-auto\" : \"ml-auto\")\n : \"is-assistant\",\n className\n );\n return React.createElement(Message, messageProps);\n}\n\nexport type ChatMessageContentProps = React.ComponentProps<\"div\"> & {\n from?: ChatMessageRole;\n};\n\nexport function ChatMessageContent({\n className,\n ...props\n}: ChatMessageContentProps): React.ReactElement {\n return React.createElement(\"div\", {\n className: cn(\n \"is-user:dark flex w-fit max-w-full min-w-0 flex-col gap-2 overflow-hidden text-sm\",\n \"group-[.is-user]:rounded-lg group-[.is-user]:bg-secondary group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground\",\n \"group-[.is-assistant]:w-full group-[.is-assistant]:max-w-full group-[.is-assistant]:text-foreground\",\n props.dir === \"rtl\" ? \"group-[.is-user]:mr-auto\" : \"group-[.is-user]:ml-auto\",\n className\n ),\n \"data-slot\": \"message-content\",\n ...props,\n });\n}\n\nexport type ChatMessageActionsProps = React.ComponentProps<\"div\">;\n\nexport function ChatMessageActions({\n className,\n ...props\n}: ChatMessageActionsProps): React.ReactElement {\n return React.createElement(\"div\", {\n className: cn(\"flex items-center gap-1\", className),\n \"data-slot\": \"message-actions\",\n ...props,\n });\n}\n\nexport type ChatMessageActionProps = React.ComponentProps<\"button\"> & {\n label?: string;\n tooltip?: React.ReactNode;\n};\n\nexport function ChatMessageAction({\n children,\n className,\n label,\n tooltip,\n type = \"button\",\n ...props\n}: ChatMessageActionProps): React.ReactElement {\n const tooltipLabel = typeof tooltip === \"string\" ? tooltip : undefined;\n return React.createElement(\n \"button\",\n {\n \"aria-label\": label || tooltipLabel,\n className: cn(\n \"inline-flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\",\n className\n ),\n title: tooltipLabel,\n type,\n ...props,\n },\n children,\n React.createElement(\n \"span\",\n { className: \"sr-only\" },\n label || tooltipLabel\n )\n );\n}\n\nexport type ChatAttachmentData = Agents24ChatAttachment & {\n type?: string;\n name?: string;\n mediaType?: string;\n contentType?: string;\n};\n\nexport type ChatAttachmentProps = React.ComponentProps<typeof Attachment> & {\n data: ChatAttachmentData;\n onRemove?: () => void;\n};\n\nexport function ChatAttachment({\n data,\n onRemove,\n orientation,\n ...props\n}: ChatAttachmentProps): React.ReactElement {\n const mediaType =\n data.mediaType || data.contentType || String(data.type || \"application/octet-stream\");\n const filename = data.filename || data.name || \"Attachment\";\n const isImage = mediaType.startsWith(\"image/\") && Boolean(data.url);\n return React.createElement(\n Attachment,\n {\n orientation: orientation || (isImage ? \"vertical\" : \"horizontal\"),\n ...props,\n },\n React.createElement(\n AttachmentMedia,\n { variant: isImage ? \"image\" : \"icon\" },\n isImage\n ? React.createElement(\"img\", {\n alt: filename,\n className: \"size-full object-cover\",\n src: data.url,\n })\n : React.createElement(\n \"span\",\n { \"aria-hidden\": \"true\", className: \"text-sm\" },\n filename.slice(0, 1).toUpperCase()\n )\n ),\n React.createElement(\n AttachmentContent,\n null,\n React.createElement(AttachmentTitle, null, filename),\n React.createElement(AttachmentDescription, null, mediaType)\n ),\n onRemove\n ? React.createElement(\n \"button\",\n {\n \"aria-label\": \"Remove attachment\",\n className:\n \"relative z-20 mr-1 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(\"span\", { \"aria-hidden\": \"true\" }, \"x\")\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 props.dir === \"rtl\" ? \"mr-auto\" : \"ml-auto\",\n \"w-fit flex-wrap overflow-visible\",\n className\n ),\n ...props,\n },\n children\n );\n}\n\nexport {\n ChatAttachment as MessageAttachment,\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 bg-muted 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:bg-destructive/10 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 \"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 * 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 { ChevronDown, ChevronUp } from \"lucide-react\";\n\nimport type { ChatHitlPart, ChatMessage, ChatPart } from \"../types\";\nimport {\n ChatAttachment,\n ChatAttachments,\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} 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 actions?: React.ReactNode;\n actionsClassName?: string;\n className?: string;\n contentClassName?: string;\n dir?: \"ltr\" | \"rtl\";\n getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;\n message: ChatMessage;\n onHitlAction?: (part: ChatHitlPart, decision: string) => void;\n renderAssistantContent?: (input: {\n isStreaming: boolean;\n message: ChatMessage;\n }) => React.ReactNode;\n renderPart?: (part: ChatPart, message: ChatMessage) => React.ReactNode;\n renderUserContent?: (input: {\n message: ChatMessage;\n }) => React.ReactNode;\n showAssistantAttachments?: boolean;\n streamingMessageId?: string | null;\n userMessageCollapsedLines?: number;\n userMessageContent?: string;\n userMessageCollapseThreshold?: number | null;\n userMessageShowLessLabel?: string;\n userMessageShowMoreLabel?: string;\n};\n\nexport function shouldCollapseUserMessage(\n content: string,\n threshold: number | null | undefined = DEFAULT_USER_MESSAGE_COLLAPSE_THRESHOLD\n) {\n return typeof threshold === \"number\" && threshold > 0 && content.length > threshold;\n}\n\nexport function AgentChatUserMessageContent({\n collapsedLines = DEFAULT_USER_MESSAGE_COLLAPSED_LINES,\n collapseThreshold = DEFAULT_USER_MESSAGE_COLLAPSE_THRESHOLD,\n content,\n showLessLabel = \"Show less\",\n showMoreLabel = \"Show more\",\n}: AgentChatUserMessageContentProps) {\n const [isExpanded, setIsExpanded] = React.useState(false);\n const contentId = React.useId();\n const shouldCollapse = shouldCollapseUserMessage(content, collapseThreshold);\n const Icon = isExpanded ? ChevronUp : ChevronDown;\n const clampedStyle = shouldCollapse && !isExpanded\n ? {\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: Math.max(1, collapsedLines),\n display: \"-webkit-box\",\n overflow: \"hidden\",\n } satisfies React.CSSProperties\n : undefined;\n\n return (\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div id={contentId} className=\"min-w-0\" style={clampedStyle}>\n {content}\n </div>\n {shouldCollapse ? (\n <button\n aria-controls={contentId}\n aria-expanded={isExpanded}\n className={cn(\n \"inline-flex w-fit items-center gap-1 rounded-md text-left text-sm font-medium text-muted-foreground transition-colors\",\n \"hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0\"\n )}\n onClick={() => setIsExpanded((current) => !current)}\n type=\"button\"\n >\n {isExpanded ? showLessLabel : showMoreLabel}\n <Icon aria-hidden=\"true\" className=\"size-4\" strokeWidth={2} />\n </button>\n ) : null}\n </div>\n );\n}\n\nexport function AgentChatMessage({\n actionHandlers,\n actions,\n actionsClassName,\n className,\n contentClassName,\n dir,\n getHitlActionState,\n message,\n onHitlAction,\n renderAssistantContent,\n renderPart,\n renderUserContent,\n showAssistantAttachments = false,\n streamingMessageId,\n userMessageCollapsedLines,\n userMessageContent,\n userMessageCollapseThreshold,\n userMessageShowLessLabel,\n userMessageShowMoreLabel,\n}: AgentChatMessageProps) {\n const isAssistant = message.role === \"assistant\";\n const isStreaming = isAssistant && message.id === streamingMessageId;\n const resolvedUserContent = userMessageContent ?? message.content;\n const shouldRenderContent = isAssistant || Boolean(renderUserContent || resolvedUserContent);\n const showAttachments =\n Boolean(message.attachments?.length) &&\n (message.role === \"user\" || showAssistantAttachments);\n const renderedActions = actions ?? (\n actionHandlers ? <AgentChatDefaultActions handlers={actionHandlers} message={message} /> : null\n );\n\n return (\n <Message className={className} dir={dir} from={message.role}>\n {showAttachments ? (\n <ChatAttachments className=\"mb-2\" dir={dir}>\n {message.attachments?.map((attachment, index) => (\n <ChatAttachment\n data={attachment}\n dir=\"ltr\"\n key={String(attachment.url || attachment.filename || index)}\n />\n ))}\n </ChatAttachments>\n ) : null}\n\n {shouldRenderContent ? (\n <MessageContent\n className={cn(isAssistant ? \"bg-transparent p-0\" : undefined, contentClassName)}\n dir={dir}\n >\n {isAssistant ? (\n renderAssistantContent ? (\n renderAssistantContent({ isStreaming, message })\n ) : (\n <AgentResponseTimeline\n getHitlActionState={getHitlActionState}\n isLoading={isStreaming}\n message={message}\n onHitlAction={onHitlAction}\n renderPart={renderPart}\n />\n )\n ) : null}\n {!isAssistant ? (\n renderUserContent ? (\n renderUserContent({ message })\n ) : resolvedUserContent ? (\n <AgentChatUserMessageContent\n collapsedLines={userMessageCollapsedLines}\n collapseThreshold={userMessageCollapseThreshold}\n content={resolvedUserContent}\n showLessLabel={userMessageShowLessLabel}\n showMoreLabel={userMessageShowMoreLabel}\n />\n ) : null\n ) : null}\n </MessageContent>\n ) : null}\n\n {renderedActions ? (\n <div className={cn(dir === \"rtl\" ? \"mt-1 h-9 w-full translate-x-2\" : \"mt-1 h-9 w-full -translate-x-2\", actionsClassName)}>\n {renderedActions}\n </div>\n ) : null}\n </Message>\n );\n}\n","import * as React from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\n\nimport type { ChatHitlAction, ChatHitlPart, ChatMessage, ChatPart, ChatToolPart } from \"../types\";\nimport type { McpConnectRequiredStatus } from \"./mcp-connect-required-card\";\nimport { MessageResponse } from \"./message-response\";\nimport { hitlActionLabel, hitlTitle, resolvedHitlLabel } from \"./hitl-presentation\";\nimport { cn } from \"./utils\";\n\nexport type AgentChatPartActionState = {\n status?: McpConnectRequiredStatus | string;\n error?: string | null;\n};\n\nexport type AgentResponseTimelineProps = {\n getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;\n isLoading?: boolean;\n message: ChatMessage;\n onHitlAction?: (part: ChatHitlPart, action: ChatHitlAction, comment?: string) => void;\n renderPart?: (part: ChatPart, message: ChatMessage) => React.ReactNode;\n};\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction presentationValue(part: ChatToolPart, key: string): string | null {\n const presentation = part.presentation || {};\n const snakeKey = key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n return optionalString((presentation as Record<string, unknown>)[key]) ||\n optionalString((presentation as Record<string, unknown>)[snakeKey]);\n}\n\nfunction groupKey(part: ChatToolPart): string | null {\n return presentationValue(part, \"groupKey\");\n}\n\nfunction groupLabel(part: ChatToolPart): string {\n return presentationValue(part, \"groupLabel\") || toolLabel(part);\n}\n\nfunction toolLabel(part: ChatToolPart): string {\n return presentationValue(part, \"activity\") ||\n presentationValue(part, \"title\") ||\n part.toolName ||\n \"Tool activity\";\n}\n\nfunction toolDetail(part: ChatToolPart): string | null {\n return presentationValue(part, \"detail\") || part.errorText || null;\n}\n\nfunction isActiveTool(part: ChatToolPart, activeToolId?: string | null) {\n return part.id === activeToolId ||\n part.toolCallId === activeToolId ||\n part.state === \"input-available\" ||\n part.state === \"input-streaming\";\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\nfunction CompactTask({\n children,\n defaultOpen = false,\n detail,\n error,\n label,\n loading,\n}: {\n children?: React.ReactNode;\n defaultOpen?: boolean;\n detail?: string | null;\n error?: boolean;\n label: string;\n loading?: boolean;\n}) {\n const [open, setOpen] = React.useState(defaultOpen);\n const expandable = Boolean(children || detail);\n const content = loading ? <Shimmer>{label}</Shimmer> : <span>{label}</span>;\n if (!expandable) {\n return (\n <div className={cn(\"flex min-w-0 items-center gap-1.5 text-sm\", error ? \"text-destructive\" : \"text-muted-foreground\")}>\n {content}\n </div>\n );\n }\n return (\n <div className=\"w-full\">\n <button\n aria-expanded={open}\n className={cn(\n \"group flex min-w-0 items-center gap-1.5 rounded-md px-0 py-0.5 text-left text-sm transition-colors hover:text-foreground\",\n error ? \"text-destructive\" : \"text-muted-foreground\"\n )}\n onClick={() => setOpen((value) => !value)}\n type=\"button\"\n >\n {content}\n {open ? <ChevronDown className=\"size-3\" /> : <ChevronRight className=\"size-3 opacity-70\" />}\n </button>\n {open ? (\n <div className=\"mt-1 pl-4 text-sm text-muted-foreground\">\n {detail ? <div>{detail}</div> : null}\n {children}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ToolPartRow({\n activeToolId,\n part,\n}: {\n activeToolId?: string | null;\n part: ChatToolPart;\n}) {\n return (\n <div data-agents24-tool-part={part.type} data-state={part.state}>\n <CompactTask\n defaultOpen={part.state === \"output-error\"}\n detail={toolDetail(part)}\n error={part.state === \"output-error\"}\n label={toolLabel(part)}\n loading={isActiveTool(part, activeToolId)}\n />\n </div>\n );\n}\n\nfunction ToolGroup({\n activeToolId,\n parts,\n}: {\n activeToolId?: string | null;\n parts: ChatToolPart[];\n}) {\n const loading = parts.some((part) => isActiveTool(part, activeToolId));\n return (\n <CompactTask label={groupLabel(parts[0])} loading={loading}>\n <div className=\"space-y-1\">\n {parts.map((part) => (\n <div\n key={part.id}\n className={cn(\"text-sm\", part.state === \"output-error\" ? \"text-destructive\" : \"text-muted-foreground\")}\n >\n {isActiveTool(part, activeToolId) ? <Shimmer>{toolLabel(part)}</Shimmer> : toolLabel(part)}\n {toolDetail(part) ? <span className=\"ml-1 text-xs text-muted-foreground/75\">{toolDetail(part)}</span> : null}\n </div>\n ))}\n </div>\n </CompactTask>\n );\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 (isTerminal) {\n return (\n <div className=\"px-1 py-1 text-sm text-muted-foreground\">{resolvedHitlLabel(part)}</div>\n );\n }\n return (\n <div className=\"space-y-2.5 rounded-lg bg-muted/45 px-3 py-2.5\">\n <div className=\"text-sm font-medium text-foreground text-pretty\">{hitlTitle(part)}</div>\n {requireComment ? (\n <textarea\n aria-label=\"Approval comment\"\n className=\"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 onChange={(event) => setComment(event.target.value)}\n placeholder=\"Comment required\"\n value={comment}\n />\n ) : null}\n {state?.error ? <div className=\"text-sm text-destructive\">{state.error}</div> : null}\n <div className=\"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 \"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 disabled={!onHitlAction || isLoading || state?.status === \"connecting\" || state?.status === \"resuming\" || (requireComment && !comment.trim())}\n onClick={() => onHitlAction?.(part, action, comment.trim() || undefined)}\n type=\"button\"\n >\n {hitlActionLabel(part, action)}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction DefaultPartRow({\n activeToolId,\n getHitlActionState,\n isLoading,\n message,\n onHitlAction,\n part,\n}: {\n activeToolId?: string | null;\n getHitlActionState?: AgentResponseTimelineProps[\"getHitlActionState\"];\n isLoading?: boolean;\n message: ChatMessage;\n onHitlAction?: AgentResponseTimelineProps[\"onHitlAction\"];\n part: ChatPart;\n}) {\n if (part.kind === \"text\") return <MessageResponse>{part.text}</MessageResponse>;\n if (part.kind === \"tool\") return <ToolPartRow activeToolId={activeToolId} 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 === \"ui-blocks\") {\n if (part.state === \"output-error\") {\n return <div className=\"text-sm text-destructive\">{part.errorText || \"Failed to render UI content.\"}</div>;\n }\n return <CompactTask label={part.state === \"input-streaming\" ? \"Rendering UI block\" : \"Rendered UI block\"} loading={part.state === \"input-streaming\"} />;\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=\"text-sm text-destructive\">{part.errorText}</div>;\n if (part.kind === \"data\") return <div data-agents24-data-part={part.name} className=\"hidden\">{message.id}</div>;\n return null;\n}\n\nexport function AgentResponseTimeline({\n getHitlActionState,\n isLoading = false,\n message,\n onHitlAction,\n renderPart,\n}: AgentResponseTimelineProps) {\n const parts = message.parts || [];\n const activeToolId = [...parts]\n .reverse()\n .find((part): part is ChatToolPart => part.kind === \"tool\" && (part.state === \"input-available\" || part.state === \"input-streaming\"))\n ?.id;\n const rendered = [];\n let index = 0;\n while (index < parts.length) {\n const part = parts[index];\n if (part.kind === \"tool\" && groupKey(part)) {\n const key = groupKey(part);\n const group: ChatToolPart[] = [];\n while (index < parts.length) {\n const candidate = parts[index];\n if (candidate.kind !== \"tool\" || groupKey(candidate) !== key) break;\n group.push(candidate);\n index += 1;\n }\n rendered.push(group.length === 1\n ? <ToolPartRow activeToolId={activeToolId} key={group[0].id} part={group[0]} />\n : <ToolGroup activeToolId={activeToolId} key={`tool-group-${key}-${group[0].id}`} parts={group} />);\n continue;\n }\n rendered.push(\n <React.Fragment key={part.id}>\n {renderPart ? renderPart(part, message) : (\n <DefaultPartRow\n activeToolId={activeToolId}\n getHitlActionState={getHitlActionState}\n isLoading={isLoading}\n message={message}\n onHitlAction={onHitlAction}\n part={part}\n />\n )}\n </React.Fragment>\n );\n index += 1;\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(<div key={`${message.id}-thinking`} className=\"text-sm text-muted-foreground\">Thinking</div>);\n }\n return <div className=\"space-y-3\">{rendered}</div>;\n}\n\nexport { DefaultPartRow as AgentChatPartRow };\n","import * as React from \"react\";\nimport { defaultRehypePlugins, Streamdown } from \"streamdown\";\n\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\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\nconst MESSAGE_RESPONSE_COMPONENTS = {\n p: MessageMarkdownParagraph,\n} satisfies NonNullable<React.ComponentProps<typeof Streamdown>[\"components\"]>;\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 {\n allowDataImages: true,\n allowedImagePrefixes: [\"*\"],\n allowedLinkPrefixes: [\"*\"],\n allowedProtocols: [\"*\", \"reshet:\", \"source:\"],\n defaultOrigin: undefined,\n },\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(\n () => ({ ...MESSAGE_RESPONSE_COMPONENTS, ...components }),\n [components]\n );\n\n return (\n <Streamdown\n className={cn(\"size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\", 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","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 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\") return `Connect ${optionalString(presentation.server_name) || \"this service\"} to continue`;\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 { 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","jsx","jsx","jsxs","React","ChevronDown","React","React","jsx","jsx","jsxs","optionalString","jsx","jsxs","ChevronDown","cva","Slot","jsx","cva","Slot","cva","Slot","jsx","cva","Slot","jsx","jsxs"]}
1
+ {"version":3,"sources":["../../src/ui/bubble.tsx","../../src/ui/marker.tsx","../../src/ui/mcp-connect-required-card.tsx"],"sourcesContent":["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":["cva","Slot","jsx","cva","Slot","jsx"]}
@@ -5,7 +5,7 @@ declare const markerVariants: (props?: ({
5
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
6
  declare function Marker({ className, variant, asChild, ...props }: React.ComponentProps<"div"> & VariantProps<typeof markerVariants> & {
7
7
  asChild?: boolean;
8
- }): React.JSX.Element;
9
- declare function MarkerIcon({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
10
- declare function MarkerContent({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
8
+ }): import("react/jsx-runtime").JSX.Element;
9
+ declare function MarkerIcon({ className, ...props }: React.ComponentProps<"span">): import("react/jsx-runtime").JSX.Element;
10
+ declare function MarkerContent({ className, ...props }: React.ComponentProps<"span">): import("react/jsx-runtime").JSX.Element;
11
11
  export { Marker, MarkerIcon, MarkerContent, markerVariants };
@@ -10,4 +10,4 @@ export type McpConnectRequiredCardProps = React.ComponentProps<"div"> & {
10
10
  error?: string | null;
11
11
  onConnect?: () => void;
12
12
  };
13
- export declare function McpConnectRequiredCard({ serverName, providerKey, message, status, disabled, loading, error, onConnect, className, ...props }: McpConnectRequiredCardProps): React.JSX.Element;
13
+ export declare function McpConnectRequiredCard({ serverName, providerKey, message, status, disabled, loading, error, onConnect, className, ...props }: McpConnectRequiredCardProps): import("react/jsx-runtime").JSX.Element;
@@ -4,4 +4,4 @@ export type MessageResponseProps = React.ComponentProps<typeof Streamdown> & {
4
4
  streaming?: boolean;
5
5
  streamingId?: string;
6
6
  };
7
- export declare const MessageResponse: React.MemoExoticComponent<({ children, className, components, rehypePlugins, streaming, streamingId, ...props }: MessageResponseProps) => React.JSX.Element>;
7
+ export declare const MessageResponse: React.MemoExoticComponent<({ children, className, components, rehypePlugins, streaming, streamingId, ...props }: MessageResponseProps) => import("react/jsx-runtime").JSX.Element>;
@@ -1,10 +1,10 @@
1
1
  import * as React from "react";
2
- declare function MessageGroup({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
2
+ declare function MessageGroup({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
3
3
  declare function Message({ className, align, ...props }: React.ComponentProps<"div"> & {
4
4
  align?: "start" | "end";
5
- }): React.JSX.Element;
6
- declare function MessageAvatar({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
7
- declare function MessageContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
8
- declare function MessageHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
9
- declare function MessageFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ declare function MessageAvatar({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
7
+ declare function MessageContent({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
8
+ declare function MessageHeader({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
9
+ declare function MessageFooter({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
10
10
  export { MessageGroup, Message, MessageAvatar, MessageContent, MessageFooter, MessageHeader, };
package/package.json CHANGED
@@ -1,7 +1,13 @@
1
1
  {
2
2
  "name": "@agents24/chat-react",
3
- "version": "0.3.2",
4
- "description": "Headless React controller and MessageScroller primitives for Agents24 chat surfaces.",
3
+ "version": "0.4.0",
4
+ "description": "Accessible web UI and complete default layout for Agents24 chat applications.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/daniel5426/talmudpedia.git",
9
+ "directory": "packages/agents24-chat-react"
10
+ },
5
11
  "private": false,
6
12
  "type": "module",
7
13
  "main": "./dist/index.cjs",
@@ -22,20 +28,31 @@
22
28
  "types": "./dist/templates/index.d.ts",
23
29
  "import": "./dist/templates/index.js",
24
30
  "require": "./dist/templates/index.cjs"
25
- }
31
+ },
32
+ "./styles.css": "./dist/styles.css",
33
+ "./compatibility.json": "./compatibility.json"
26
34
  },
27
35
  "files": [
28
36
  "dist",
29
- "README.md"
37
+ "compatibility.json",
38
+ "README.md",
39
+ "LICENSE"
30
40
  ],
31
41
  "publishConfig": {
32
- "access": "public"
42
+ "access": "public",
43
+ "provenance": false
33
44
  },
34
45
  "scripts": {
35
- "build": "tsup && tsc -p tsconfig.build.json",
36
- "test": "tsx --test tests/*.test.ts"
46
+ "sync:contract": "node scripts/sync-contract.mjs",
47
+ "check:contract": "node scripts/sync-contract.mjs --check",
48
+ "build": "pnpm run sync:contract && tsup && tsc -p tsconfig.build.json",
49
+ "test": "tsx --test tests/*.test.ts",
50
+ "check:boundaries": "node tests/check-boundaries.mjs",
51
+ "prepack": "pnpm run build && pnpm run check:boundaries"
37
52
  },
38
53
  "dependencies": {
54
+ "@agents24/client": "0.1.0",
55
+ "@agents24/react": "0.1.0",
39
56
  "@radix-ui/react-slot": "^1.2.4",
40
57
  "@shadcn/react": "0.1.0",
41
58
  "class-variance-authority": "^0.7.1",
@@ -45,11 +62,13 @@
45
62
  "tailwind-merge": "^3.6.0"
46
63
  },
47
64
  "peerDependencies": {
48
- "react": ">=19.0.0"
65
+ "react": ">=19.0.0 <20.0.0",
66
+ "react-dom": ">=19.0.0 <20.0.0"
49
67
  },
50
68
  "devDependencies": {
51
69
  "@types/react": "^19.2.3",
52
70
  "react": "^19.2.3",
71
+ "react-dom": "^19.2.3",
53
72
  "tsup": "^8.5.1",
54
73
  "tsx": "^4.20.6",
55
74
  "typescript": "^5.9.3"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/streaming-text.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nimport type { ChatMessage, ChatPart } from \"./types\";\n\nexport type StreamingTextMode = \"streaming\" | \"static\";\n\nexport type StreamingTextCache = {\n get: (id: string) => string | undefined;\n set: (id: string, text: string) => void;\n};\n\nexport type UseStreamingTextOptions = {\n id: string;\n isStreaming: boolean;\n text: string;\n cache?: StreamingTextCache | false;\n charsPerSecond?: number;\n catchupThreshold?: number;\n maxCatchupChars?: number;\n};\n\nexport type UseStreamingTextResult = {\n displayedText: string;\n isAnimating: boolean;\n mode: StreamingTextMode;\n parseIncompleteMarkdown: boolean;\n};\n\nconst DEFAULT_COMPLETED_TEXT_CACHE_SIZE = 200;\nconst defaultCompletedTextCache = new Map<string, string>();\n\nconst defaultStreamingTextCache: StreamingTextCache = {\n get: (id) => defaultCompletedTextCache.get(id),\n set: (id, text) => {\n defaultCompletedTextCache.set(id, text);\n if (defaultCompletedTextCache.size > DEFAULT_COMPLETED_TEXT_CACHE_SIZE) {\n const firstKey = defaultCompletedTextCache.keys().next().value;\n if (firstKey) defaultCompletedTextCache.delete(firstKey);\n }\n },\n};\n\nexport const getActiveStreamingTextPartId = (\n message: ChatMessage,\n streamingMessageId: string | null\n) => {\n if (message.role !== \"assistant\" || streamingMessageId !== message.id) return null;\n return (\n message.parts\n .slice()\n .reverse()\n .find((part) => part.kind === \"text\")?.id || null\n );\n};\n\nexport const isActiveStreamingTextPart = (\n message: ChatMessage,\n part: ChatPart,\n streamingMessageId: string | null\n) => part.kind === \"text\" && part.id === getActiveStreamingTextPartId(message, streamingMessageId);\n\nexport function useStreamingText({\n id,\n isStreaming,\n text,\n cache = defaultStreamingTextCache,\n charsPerSecond = 72,\n catchupThreshold = 40,\n maxCatchupChars = 20,\n}: UseStreamingTextOptions): UseStreamingTextResult {\n const cacheAdapter = cache === false ? null : cache;\n const [displayedText, setDisplayedText] = useState(() => {\n const cachedText = cacheAdapter?.get(id);\n return isStreaming && cachedText !== text ? \"\" : text;\n });\n const targetRef = useRef(text);\n const displayedRef = useRef(displayedText);\n const rafRef = useRef<number | null>(null);\n const lastFrameAtRef = useRef<number | null>(null);\n const idRef = useRef(id);\n const shouldAnimateRef = useRef(isStreaming);\n\n useEffect(() => {\n if (isStreaming || !text) return;\n cacheAdapter?.set(id, text);\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n targetRef.current = text;\n }, [text]);\n\n useEffect(() => {\n if (idRef.current === id) return;\n\n idRef.current = id;\n const cachedText = cacheAdapter?.get(id);\n const initial = isStreaming && cachedText !== text ? \"\" : text;\n shouldAnimateRef.current = isStreaming && initial !== text;\n displayedRef.current = initial;\n setDisplayedText(initial);\n\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameAtRef.current = null;\n }, [cacheAdapter, id, isStreaming, text]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n const reduceMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\n if (reduceMotion) {\n displayedRef.current = text;\n setDisplayedText(text);\n shouldAnimateRef.current = false;\n return;\n }\n\n const cachedText = cacheAdapter?.get(id);\n if (cachedText === text) {\n displayedRef.current = text;\n setDisplayedText(text);\n shouldAnimateRef.current = false;\n return;\n }\n\n if (isStreaming) {\n shouldAnimateRef.current = true;\n }\n\n if (!shouldAnimateRef.current) {\n displayedRef.current = text;\n setDisplayedText(text);\n return;\n }\n\n if (!text.startsWith(displayedRef.current)) {\n displayedRef.current = \"\";\n setDisplayedText(\"\");\n }\n\n const tick = (timestamp: number) => {\n const previousTimestamp = lastFrameAtRef.current ?? timestamp;\n lastFrameAtRef.current = timestamp;\n\n const target = targetRef.current;\n const current = displayedRef.current;\n\n if (current.length >= target.length) {\n shouldAnimateRef.current = false;\n rafRef.current = null;\n return;\n }\n\n const elapsedMs = Math.max(8, timestamp - previousTimestamp);\n const charsFromTime = Math.max(1, Math.floor((elapsedMs / 1000) * charsPerSecond));\n const gap = target.length - current.length;\n const catchupStep =\n gap > catchupThreshold ? Math.min(maxCatchupChars, Math.ceil(gap / 10)) : charsFromTime;\n const nextLength = Math.min(\n target.length,\n current.length + Math.max(charsFromTime, catchupStep)\n );\n\n const next = target.slice(0, nextLength);\n displayedRef.current = next;\n setDisplayedText(next);\n rafRef.current = window.requestAnimationFrame(tick);\n };\n\n if (rafRef.current === null && displayedRef.current.length < text.length) {\n rafRef.current = window.requestAnimationFrame(tick);\n }\n\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameAtRef.current = null;\n };\n }, [cacheAdapter, catchupThreshold, charsPerSecond, id, isStreaming, maxCatchupChars, text]);\n\n return {\n displayedText,\n isAnimating: isStreaming,\n mode: isStreaming ? \"streaming\" : \"static\",\n parseIncompleteMarkdown: isStreaming,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/latest-thread-scroller.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n MessageScroller,\n useMessageScroller,\n useMessageScrollerVisibility,\n} from \"@shadcn/react/message-scroller\";\n\nconst cx = (...values: Array<string | false | null | undefined>) =>\n values.filter(Boolean).join(\" \");\n\ntype MessageScrollerProviderProps = React.ComponentProps<\n typeof MessageScroller.Provider\n>;\ntype MessageScrollerRootProps = React.ComponentProps<typeof MessageScroller.Root>;\ntype MessageScrollerViewportProps = React.ComponentProps<\n typeof MessageScroller.Viewport\n>;\ntype MessageScrollerContentProps = React.ComponentProps<\n typeof MessageScroller.Content\n>;\ntype MessageScrollerItemProps = React.ComponentProps<typeof MessageScroller.Item>;\ntype MessageScrollerButtonProps = React.ComponentProps<typeof MessageScroller.Button>;\n\ntype LatestThreadScrollerLayoutContextValue = {\n contentElement: HTMLElement | null;\n rootElement: HTMLElement | null;\n setContentElement: (node: HTMLElement | null) => void;\n setRootElement: (node: HTMLElement | null) => void;\n};\n\nconst LatestThreadScrollerLayoutContext =\n React.createContext<LatestThreadScrollerLayoutContextValue | null>(null);\n\nconst useLatestThreadScrollerLayout = () =>\n React.useContext(LatestThreadScrollerLayoutContext);\n\nexport type LatestThreadScrollerProviderProps = MessageScrollerProviderProps;\n\nexport function LatestThreadScrollerProvider({\n autoScroll = true,\n defaultScrollPosition = \"last-anchor\",\n scrollPreviousItemPeek = 64,\n ...props\n}: LatestThreadScrollerProviderProps) {\n return (\n <MessageScroller.Provider\n autoScroll={autoScroll}\n defaultScrollPosition={defaultScrollPosition}\n scrollPreviousItemPeek={scrollPreviousItemPeek}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerRootProps = MessageScrollerRootProps;\n\nexport function LatestThreadScrollerRoot({\n className,\n ref,\n ...props\n}: LatestThreadScrollerRootProps) {\n const [rootElement, setRootElement] = React.useState<HTMLElement | null>(null);\n const [contentElement, setContentElement] =\n React.useState<HTMLElement | null>(null);\n const layoutContext = React.useMemo<LatestThreadScrollerLayoutContextValue>(\n () => ({\n contentElement,\n rootElement,\n setContentElement,\n setRootElement,\n }),\n [contentElement, rootElement]\n );\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setRootElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref]\n );\n\n return (\n <LatestThreadScrollerLayoutContext.Provider value={layoutContext}>\n <MessageScroller.Root\n ref={setRef}\n className={cx(\n \"relative flex size-full min-h-0 flex-1 flex-col overflow-hidden\",\n className\n )}\n {...props}\n />\n </LatestThreadScrollerLayoutContext.Provider>\n );\n}\n\nexport type LatestThreadScrollerViewportProps =\n MessageScrollerViewportProps & {\n onViewportChange?: (node: HTMLElement | null) => void;\n };\n\nexport function LatestThreadScrollerViewport({\n className,\n onViewportChange,\n preserveScrollOnPrepend = true,\n ref,\n ...props\n}: LatestThreadScrollerViewportProps) {\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n onViewportChange?.(node);\n },\n [onViewportChange, ref]\n );\n\n return (\n <MessageScroller.Viewport\n ref={setRef}\n className={cx(\n \"size-full min-h-0 min-w-0 flex-1 overflow-y-auto overscroll-contain\",\n className\n )}\n preserveScrollOnPrepend={preserveScrollOnPrepend}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerContentProps = MessageScrollerContentProps;\n\nexport function LatestThreadScrollerContent({\n className,\n ref,\n ...props\n}: LatestThreadScrollerContentProps) {\n const layout = useLatestThreadScrollerLayout();\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n layout?.setContentElement(node);\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [layout, ref]\n );\n\n return (\n <MessageScroller.Content\n ref={setRef}\n data-agents24-latest-thread-content=\"\"\n className={cx(\"flex h-max min-h-full flex-col gap-8 p-4\", className)}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerItemProps = Omit<\n MessageScrollerItemProps,\n \"messageId\"\n> & {\n messageId: string;\n};\n\nexport function LatestThreadScrollerItem({\n className,\n messageId,\n ...props\n}: LatestThreadScrollerItemProps) {\n return (\n <MessageScroller.Item\n className={cx(\n \"min-w-0 shrink-0 overflow-visible\",\n className\n )}\n messageId={messageId}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerButtonProps = Omit<\n MessageScrollerButtonProps,\n \"render\"\n> & {\n className?: string;\n render?: MessageScrollerButtonProps[\"render\"];\n};\n\nexport function LatestThreadScrollerButton({\n children,\n className,\n direction = \"end\",\n render,\n ...props\n}: LatestThreadScrollerButtonProps) {\n if (render) {\n return (\n <MessageScroller.Button\n direction={direction}\n render={render}\n {...props}\n />\n );\n }\n\n return (\n <MessageScroller.Button\n direction={direction}\n render={(buttonProps) => (\n <button\n {...(buttonProps as Record<string, unknown>)}\n aria-label={\n direction === \"end\"\n ? \"Scroll to latest message\"\n : \"Scroll to first message\"\n }\n className={cx(\n \"absolute bottom-4 left-1/2 z-50 flex size-9 -translate-x-1/2 items-center justify-center rounded-full border border-border bg-background text-foreground shadow-md transition-all duration-200 data-[active=false]:pointer-events-none data-[active=false]:translate-y-2 data-[active=false]:opacity-0 data-[active=true]:translate-y-0 data-[active=true]:opacity-100\",\n className\n )}\n type=\"button\"\n >\n {children ?? (direction === \"end\" ? \"↓\" : \"↑\")}\n </button>\n )}\n {...props}\n />\n );\n}\n\nexport type LatestThreadScrollerOutlineItem = {\n id: string;\n label: string;\n messageIds?: string[];\n responsePreview?: string;\n};\n\nexport type LatestThreadScrollerOutlineProps = {\n cardClassName?: string;\n className?: string;\n contentMaxWidth?: number;\n dir?: \"ltr\" | \"rtl\";\n items: LatestThreadScrollerOutlineItem[];\n minContainerWidthForRail?: number;\n minSideGutterForRail?: number;\n side?: \"left\" | \"right\";\n};\n\nexport function LatestThreadScrollerOutline({\n cardClassName,\n className,\n contentMaxWidth = 768,\n dir = \"ltr\",\n items,\n minContainerWidthForRail = 0,\n minSideGutterForRail = 48,\n side,\n}: LatestThreadScrollerOutlineProps) {\n const navRef = React.useRef<HTMLElement | null>(null);\n const layout = useLatestThreadScrollerLayout();\n const [hasSideRoom, setHasSideRoom] = React.useState(false);\n const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\n const { scrollToMessage } = useMessageScroller();\n const { currentAnchorId, visibleMessageIds } = useMessageScrollerVisibility();\n const visibleMessageIdSet = React.useMemo(\n () => new Set(visibleMessageIds),\n [visibleMessageIds]\n );\n const focusIndex = hoveredIndex ?? -1;\n const railSide = side ?? (dir === \"rtl\" ? \"right\" : \"left\");\n\n React.useEffect(() => {\n const root = layout?.rootElement ?? navRef.current?.parentElement;\n if (!root) return;\n\n const updateSideRoom = () => {\n const rootRect = root.getBoundingClientRect();\n const rootWidth = rootRect.width;\n const content = layout?.contentElement;\n const sideGutter = content\n ? Math.max(\n 0,\n railSide === \"left\"\n ? content.getBoundingClientRect().left - rootRect.left\n : rootRect.right - content.getBoundingClientRect().right\n )\n : Math.max(0, (rootWidth - contentMaxWidth) / 2);\n const nextHasSideRoom =\n rootWidth >= minContainerWidthForRail &&\n sideGutter >= minSideGutterForRail;\n setHasSideRoom((current) =>\n current === nextHasSideRoom ? current : nextHasSideRoom\n );\n };\n\n updateSideRoom();\n if (typeof ResizeObserver === \"undefined\") return;\n const resizeObserver = new ResizeObserver(updateSideRoom);\n resizeObserver.observe(root);\n const content = layout?.contentElement;\n if (content) {\n resizeObserver.observe(content);\n }\n return () => resizeObserver.disconnect();\n }, [\n contentMaxWidth,\n layout?.contentElement,\n layout?.rootElement,\n minContainerWidthForRail,\n minSideGutterForRail,\n railSide,\n ]);\n\n if (items.length < 2) {\n return null;\n }\n\n return (\n <nav\n ref={navRef}\n aria-label=\"Transcript outline\"\n className={cx(\n \"pointer-events-none absolute top-[46%] z-10 max-h-[min(18rem,calc(100%-10rem))] w-16 -translate-y-1/2 overflow-visible\",\n hasSideRoom ? \"hidden md:block\" : \"hidden\",\n railSide === \"left\" ? \"left-1\" : \"right-1\",\n className\n )}\n dir={dir}\n >\n <div className=\"pointer-events-auto flex flex-col gap-0 py-1\">\n {items.map((item, index) => {\n const itemMessageIds =\n item.messageIds && item.messageIds.length > 0\n ? item.messageIds\n : [item.id];\n const active = itemMessageIds.some(\n (messageId) =>\n visibleMessageIdSet.has(messageId) || messageId === currentAnchorId\n );\n const distance =\n focusIndex >= 0 ? Math.abs(index - focusIndex) : Number.POSITIVE_INFINITY;\n const isFocused = distance === 0;\n const isNear = distance === 1;\n const isNextNear = distance === 2;\n const barWidth = isFocused\n ? 50\n : isNear\n ? 36\n : isNextNear\n ? 23\n : 10;\n const barOpacity = isFocused ? 1 : isNear ? 0.78 : isNextNear ? 0.58 : 0.36;\n const fallbackLabel = `Turn ${index + 1}`;\n const previewLabel =\n item.label && item.label !== fallbackLabel ? item.label : \"\";\n const responsePreview = (item.responsePreview || \"\").trim();\n\n return (\n <button\n key={item.id}\n type=\"button\"\n data-active={active}\n dir=\"ltr\"\n className={cx(\n \"group relative flex h-2 w-16 items-center rounded-sm outline-none\",\n railSide === \"left\" ? \"justify-start\" : \"justify-end\"\n )}\n aria-label={`Jump to ${item.label || fallbackLabel}`}\n onBlur={() => setHoveredIndex(null)}\n onFocus={() => setHoveredIndex(index)}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={() =>\n scrollToMessage(item.id, {\n align: \"start\",\n behavior: \"smooth\",\n })\n }\n >\n <span\n className=\"h-0.5 rounded-full bg-muted-foreground/55 transition-[width,background-color,opacity] duration-150 ease-out group-hover:bg-foreground group-focus-visible:bg-foreground group-data-[active=true]:bg-foreground\"\n style={{\n opacity: barOpacity,\n width: barWidth,\n }}\n />\n {previewLabel ? (\n <span\n dir={dir}\n className={cx(\n \"pointer-events-none absolute top-1/2 z-20 max-h-32 w-64 -translate-y-1/2 overflow-hidden rounded-lg border border-border/80 bg-background p-3 text-start opacity-0 shadow-lg transition-all duration-200 group-hover:pointer-events-auto group-hover:opacity-100 group-focus-visible:pointer-events-auto group-focus-visible:opacity-100\",\n railSide === \"left\"\n ? \"left-full ml-2 -translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0\"\n : \"right-full mr-2 translate-x-1 group-hover:translate-x-0 group-focus-visible:translate-x-0\",\n cardClassName\n )}\n >\n <span\n className=\"block overflow-hidden text-sm leading-5 text-foreground\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: responsePreview ? 2 : 4,\n }}\n >\n {previewLabel}\n </span>\n {responsePreview ? (\n <span\n className=\"mt-1 block overflow-hidden text-sm leading-5 text-muted-foreground\"\n style={{\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n }}\n >\n {responsePreview}\n </span>\n ) : null}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n </nav>\n );\n}\n\nexport const LatestThreadScroller = {\n Provider: LatestThreadScrollerProvider,\n Root: LatestThreadScrollerRoot,\n Viewport: LatestThreadScrollerViewport,\n Content: LatestThreadScrollerContent,\n Item: LatestThreadScrollerItem,\n Button: LatestThreadScrollerButton,\n Outline: LatestThreadScrollerOutline,\n};\n"],"mappings":"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","names":["content"]}
@@ -1,11 +0,0 @@
1
- // src/ui/utils.ts
2
- import { clsx } from "clsx";
3
- import { twMerge } from "tailwind-merge";
4
- function cn(...values) {
5
- return twMerge(clsx(values));
6
- }
7
-
8
- export {
9
- cn
10
- };
11
- //# sourceMappingURL=chunk-UU7OXHL3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/utils.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...values: ClassValue[]) {\n return twMerge(clsx(values));\n}\n"],"mappings":";AAAA,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
@@ -1,38 +0,0 @@
1
- export type ContextWindowSource = "exact" | "estimated" | "provider_count_api" | "provider_usage" | "runtime_tokenizer" | "hf_tokenizer" | "multimodal_estimate" | "text_estimate" | "tokenizer_estimate" | "heuristic_estimate" | "unknown";
2
- export type ContextWindowStage = "preflight" | "sent_prompt" | "final_usage";
3
- export type ContextWindowConfidence = "exact" | "high" | "medium" | "low" | "unknown";
4
- export type ContextCompressionStatus = {
5
- active: boolean;
6
- reason?: string | null;
7
- input_tokens?: number | null;
8
- max_tokens?: number | null;
9
- usage_ratio?: number | null;
10
- full_frame_count?: number | null;
11
- compact_frame_count?: number | null;
12
- dropped_frame_count?: number | null;
13
- artifact_ref_count?: number | null;
14
- compression_trigger_budget?: number | null;
15
- compression_target_budget?: number | null;
16
- compression_target_ratio?: number | null;
17
- threshold_used?: number | null;
18
- };
19
- export type ContextWindow = {
20
- source: ContextWindowSource;
21
- run_id?: string | null;
22
- stage?: ContextWindowStage | null;
23
- confidence?: ContextWindowConfidence | null;
24
- counter?: string | null;
25
- model_id?: string | null;
26
- max_tokens?: number | null;
27
- max_tokens_source?: string | null;
28
- input_tokens?: number | null;
29
- remaining_tokens?: number | null;
30
- usage_ratio?: number | null;
31
- assembly?: Record<string, unknown> | null;
32
- context_compression?: ContextCompressionStatus | null;
33
- };
34
- export declare function normalizeContextCompression(value: unknown): ContextCompressionStatus | null;
35
- export declare function normalizeContextWindow(value: unknown): ContextWindow | null;
36
- export declare function mergeContextWindow(current: ContextWindow | null | undefined, incoming: ContextWindow | null | undefined): ContextWindow | null;
37
- export declare function mergeContextWindowUpdate(current: ContextWindow | null | undefined, incoming: unknown): ContextWindow | null;
38
- export declare function compressionFromContextWindow(contextWindow: ContextWindow | null | undefined): ContextCompressionStatus | null;
@@ -1,45 +0,0 @@
1
- import { type Dispatch, type MutableRefObject, type SetStateAction } from "react";
2
- import type { ChatCitation, ChatMessage, ChatReasoningStep, ChatStorageAdapter, ChatSubmitMessage } from "./types";
3
- type PagingRef = MutableRefObject<number | null>;
4
- export declare function useControllerMessageActions(input: {
5
- activeThreadIdRef: MutableRefObject<string | null>;
6
- createId: () => string;
7
- detachActiveStream: () => void;
8
- disliked: Record<string, boolean>;
9
- handleSubmit: (message: ChatSubmitMessage) => Promise<void>;
10
- hasOlderTurnsRef: MutableRefObject<boolean>;
11
- liked: Record<string, boolean>;
12
- liveVoiceIdsRef: MutableRefObject<{
13
- user?: string;
14
- assistant?: string;
15
- }>;
16
- loadedThreadIdRef: MutableRefObject<string | null>;
17
- messagesRef: MutableRefObject<ChatMessage[]>;
18
- nextBeforeTurnIndexRef: PagingRef;
19
- onActiveThreadIdChange?: (threadId: string | null) => void;
20
- persistThread: (threadId: string, nextMessages: ChatMessage[]) => void;
21
- requestSeqRef: MutableRefObject<number>;
22
- setContextStatus: Dispatch<SetStateAction<any>>;
23
- setCopiedMessageId: Dispatch<SetStateAction<string | null>>;
24
- setDisliked: Dispatch<SetStateAction<Record<string, boolean>>>;
25
- setHasOlderTurns: Dispatch<SetStateAction<boolean>>;
26
- setIsLoadingOlder: Dispatch<SetStateAction<boolean>>;
27
- setLiked: Dispatch<SetStateAction<Record<string, boolean>>>;
28
- setLoadingHistory: (value: boolean) => void;
29
- setMessages: Dispatch<SetStateAction<ChatMessage[]>>;
30
- storage: ChatStorageAdapter;
31
- }): {
32
- handleCopy: (content: string, messageId: string) => void;
33
- handleDislike: (msg: ChatMessage) => Promise<void>;
34
- handleLike: (msg: ChatMessage) => Promise<void>;
35
- handleRetry: (msg: ChatMessage) => Promise<void>;
36
- startNewThread: () => void;
37
- upsertLiveVoiceMessage: (payload: {
38
- role: "user" | "assistant";
39
- content: string;
40
- isFinal?: boolean;
41
- citations?: ChatCitation[];
42
- reasoningSteps?: ChatReasoningStep[];
43
- }) => void;
44
- };
45
- export {};
@@ -1,27 +0,0 @@
1
- import type { ChatMessage, ChatReasoningStep, ChatPart, ChatThreadSummaryEvent, StoredChatThread } from "./types";
2
- export type ChatRuntimeEventContext = {
3
- mode: "submit" | "attach";
4
- assistantMessageId: string;
5
- threadId: string | null;
6
- runId: string | null;
7
- startedAt: number;
8
- };
9
- export type FinalizeInput = {
10
- threadId: string | null;
11
- baseMessages: ChatMessage[];
12
- assistantText: string;
13
- reasoning: ChatReasoningStep[];
14
- thinkingDurationMs: number;
15
- messageId?: string | null;
16
- runId?: string | null;
17
- parts?: ChatPart[];
18
- error?: string;
19
- };
20
- export declare const threadSummaryToStored: (thread: Record<string, unknown>) => StoredChatThread;
21
- export declare const isThreadNotFoundError: (error: unknown) => boolean;
22
- export declare const isAbortError: (error: unknown) => boolean;
23
- export declare const abortDetachedStream: (controller: AbortController | null) => void;
24
- export declare const mergeStoredThreadsForRefresh: (currentThreads: StoredChatThread[], serverThreads: StoredChatThread[]) => StoredChatThread[];
25
- export declare const hasRunningStoredThreads: (threads: StoredChatThread[]) => boolean;
26
- export declare const sameStoredThread: (left: StoredChatThread | undefined, right: StoredChatThread | undefined) => boolean;
27
- export declare const applyThreadSummaryEvent: (currentThreads: StoredChatThread[], event: ChatThreadSummaryEvent) => StoredChatThread[];
@@ -1,22 +0,0 @@
1
- import { type MutableRefObject } from "react";
2
- import type { ChatHitlPart, ChatHitlResumeInput, ChatHitlResumeResult, ChatMessage, ChatTransport } from "./types";
3
- type RunStream = (input: {
4
- mode: "attach";
5
- threadId: string;
6
- runId: string;
7
- }) => Promise<void>;
8
- export declare function useControllerHitl({ messages, transport, activeRunId, activeRunIdRef, activeThreadIdRef, runStream, }: {
9
- messages: ChatMessage[];
10
- transport: ChatTransport;
11
- activeRunId: string | null;
12
- activeRunIdRef: MutableRefObject<string | null>;
13
- activeThreadIdRef: MutableRefObject<string | null>;
14
- runStream: RunStream;
15
- }): {
16
- pendingHitl: ChatHitlPart | null;
17
- isResolvingHitl: boolean;
18
- resumeHitl: (input: Omit<ChatHitlResumeInput, "runId"> & {
19
- runId?: string;
20
- }) => Promise<ChatHitlResumeResult>;
21
- };
22
- export {};