@agents24/chat-react 0.3.2 → 0.5.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 (59) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +24 -64
  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-R7WFL3YR.js +1327 -0
  10. package/dist/chunk-R7WFL3YR.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 +493 -0
  20. package/dist/templates/agent-chat-app.d.ts +18 -0
  21. package/dist/templates/agent-chat-layout.d.ts +77 -0
  22. package/dist/templates/agent-chat-shell.d.ts +1 -1
  23. package/dist/templates/appearance-control.d.ts +5 -0
  24. package/dist/templates/index.cjs +2028 -18
  25. package/dist/templates/index.cjs.map +1 -1
  26. package/dist/templates/index.d.ts +3 -0
  27. package/dist/templates/index.js +652 -11
  28. package/dist/templates/index.js.map +1 -1
  29. package/dist/types.d.ts +12 -380
  30. package/dist/ui/agent-chat-actions.d.ts +1 -2
  31. package/dist/ui/agent-chat-composer.d.ts +2 -1
  32. package/dist/ui/agent-chat-message.d.ts +3 -3
  33. package/dist/ui/agent-response-timeline.d.ts +2 -2
  34. package/dist/ui/attachment.d.ts +9 -9
  35. package/dist/ui/bubble.d.ts +4 -4
  36. package/dist/ui/index.cjs +138 -44
  37. package/dist/ui/index.cjs.map +1 -1
  38. package/dist/ui/index.js +62 -1220
  39. package/dist/ui/index.js.map +1 -1
  40. package/dist/ui/marker.d.ts +3 -3
  41. package/dist/ui/mcp-connect-required-card.d.ts +1 -1
  42. package/dist/ui/message-response.d.ts +1 -1
  43. package/dist/ui/message.d.ts +6 -6
  44. package/package.json +27 -8
  45. package/dist/chunk-EWZO4QJI.js.map +0 -1
  46. package/dist/chunk-FFO6KEB4.js.map +0 -1
  47. package/dist/chunk-UU7OXHL3.js +0 -11
  48. package/dist/chunk-UU7OXHL3.js.map +0 -1
  49. package/dist/context-window.d.ts +0 -38
  50. package/dist/controller-actions.d.ts +0 -45
  51. package/dist/controller-helpers.d.ts +0 -27
  52. package/dist/controller-hitl.d.ts +0 -22
  53. package/dist/controller-options.d.ts +0 -15
  54. package/dist/controller-thread-events.d.ts +0 -7
  55. package/dist/controller.d.ts +0 -5
  56. package/dist/message-lifecycle.d.ts +0 -15
  57. package/dist/model.d.ts +0 -30
  58. package/dist/sse.d.ts +0 -5
  59. package/dist/transport.d.ts +0 -43
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/templates/agent-chat-shell.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport {\n LatestThreadScroller,\n type LatestThreadScrollerOutlineItem,\n} from \"../latest-thread-scroller\";\nimport type { ChatMessage } from \"../types\";\nimport { cn } from \"../ui/utils\";\n\nexport type AgentChatShellMessage = Pick<ChatMessage, \"id\" | \"role\" | \"content\"> & {\n [key: string]: unknown;\n};\n\nexport type AgentChatShellScrollState = {\n canScroll: boolean;\n isScrolled: boolean;\n};\n\nexport type AgentChatShellProps<TMessage extends AgentChatShellMessage> = {\n className?: string;\n contentClassName?: string;\n composer?: React.ReactNode;\n composerOverlayClassName?: string;\n composerOverlayHeight?: number;\n defaultComposerOverlayHeight?: number;\n dir?: \"ltr\" | \"rtl\";\n emptyInputAttachmentCount?: number;\n emptyTitle?: string;\n hideComposer?: boolean;\n isLoadingOlder?: boolean;\n messages: TMessage[];\n onLoadOlder?: (() => Promise<unknown> | unknown) | null;\n onScrollStateChange?: (state: AgentChatShellScrollState) => void;\n outlineItems?: LatestThreadScrollerOutlineItem[];\n outlineSide?: \"left\" | \"right\";\n renderEmptyState?: (input: { composer?: React.ReactNode; title: string }) => React.ReactNode;\n renderMessage: (message: TMessage, index: number) => React.ReactNode;\n renderOlderLoader?: () => React.ReactNode;\n};\n\nexport function getAgentChatShellScrollState(\n viewport: Pick<HTMLElement, \"clientHeight\" | \"scrollHeight\" | \"scrollTop\">\n): AgentChatShellScrollState {\n const canScroll = viewport.scrollHeight - viewport.clientHeight > 1;\n return {\n canScroll,\n isScrolled: canScroll && viewport.scrollTop > 4,\n };\n}\n\nconst defaultOutlineLabel = (content: unknown, index: number) => {\n const label = String(content || \"\").replace(/\\s+/g, \" \").trim();\n return label || `Turn ${index + 1}`;\n};\n\nconst defaultOutlinePreview = (content: unknown) =>\n String(content || \"\").replace(/\\s+/g, \" \").trim();\n\nexport function buildAgentChatOutlineItems<TMessage extends AgentChatShellMessage>(\n messages: TMessage[],\n getLabel: (message: TMessage, index: number) => string = (message, index) =>\n defaultOutlineLabel(message.content, index),\n getResponsePreview: (message: TMessage) => string = (message) =>\n defaultOutlinePreview(message.content)\n): LatestThreadScrollerOutlineItem[] {\n return messages.reduce((items, message) => {\n if (message.role === \"user\") {\n items.push({\n id: message.id,\n label: getLabel(message, items.length),\n messageIds: [message.id],\n });\n return items;\n }\n const currentItem = items[items.length - 1];\n currentItem?.messageIds?.push(message.id);\n if (\n currentItem &&\n !currentItem.responsePreview &&\n message.role === \"assistant\"\n ) {\n currentItem.responsePreview = getResponsePreview(message);\n }\n return items;\n }, [] as LatestThreadScrollerOutlineItem[]);\n}\n\nexport function AgentChatShell<TMessage extends AgentChatShellMessage>({\n className,\n composer,\n composerOverlayClassName,\n composerOverlayHeight,\n contentClassName,\n defaultComposerOverlayHeight = 192,\n dir = \"ltr\",\n emptyInputAttachmentCount = 0,\n emptyTitle = \"Ready when you are.\",\n hideComposer = false,\n isLoadingOlder = false,\n messages,\n onLoadOlder,\n onScrollStateChange,\n outlineItems,\n outlineSide = \"left\",\n renderEmptyState,\n renderMessage,\n renderOlderLoader,\n}: AgentChatShellProps<TMessage>) {\n const overlayRef = React.useRef<HTMLDivElement | null>(null);\n const viewportRef = React.useRef<HTMLElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const lastScrollStateRef = React.useRef<AgentChatShellScrollState | null>(null);\n const [measuredOverlayHeight, setMeasuredOverlayHeight] = React.useState(\n defaultComposerOverlayHeight\n );\n const olderPageRequestRef = React.useRef(false);\n const items = React.useMemo(\n () => outlineItems || buildAgentChatOutlineItems(messages),\n [messages, outlineItems]\n );\n\n const updateScrollState = React.useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport || !onScrollStateChange) return;\n const next = getAgentChatShellScrollState(viewport);\n const previous = lastScrollStateRef.current;\n if (\n previous &&\n previous.canScroll === next.canScroll &&\n previous.isScrolled === next.isScrolled\n ) {\n return;\n }\n lastScrollStateRef.current = next;\n onScrollStateChange(next);\n }, [onScrollStateChange]);\n\n React.useEffect(() => {\n const overlay = overlayRef.current;\n if (!overlay || hideComposer) return;\n const updateHeight = () => {\n setMeasuredOverlayHeight(Math.ceil(overlay.getBoundingClientRect().height));\n };\n updateHeight();\n const observer = new ResizeObserver(updateHeight);\n observer.observe(overlay);\n return () => observer.disconnect();\n }, [hideComposer]);\n\n React.useEffect(() => {\n if (!onScrollStateChange) return;\n updateScrollState();\n const viewport = viewportRef.current;\n const content = contentRef.current;\n if (!viewport || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(updateScrollState);\n observer.observe(viewport);\n if (content) observer.observe(content);\n return () => observer.disconnect();\n }, [messages, onScrollStateChange, updateScrollState]);\n\n const handleScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n updateScrollState();\n if (\n !onLoadOlder ||\n isLoadingOlder ||\n olderPageRequestRef.current ||\n event.currentTarget.scrollTop > 48\n ) {\n return;\n }\n olderPageRequestRef.current = true;\n void Promise.resolve(onLoadOlder()).finally(() => {\n olderPageRequestRef.current = false;\n });\n },\n [isLoadingOlder, onLoadOlder, updateScrollState]\n );\n\n const bottomPadding = hideComposer\n ? 32\n : (composerOverlayHeight ?? measuredOverlayHeight) + 72;\n const isEmptyState = messages.length === 0;\n\n if (isEmptyState) {\n return (\n <div className={cn(\"relative flex h-full min-h-0 w-full flex-col overflow-visible px-4\", className)} dir={dir}>\n {renderEmptyState ? (\n renderEmptyState({ composer: hideComposer ? undefined : composer, title: emptyTitle })\n ) : (\n <div className=\"relative z-10 flex h-full flex-1 flex-col justify-center p-0 pt-13\">\n <div className=\"flex w-full flex-col items-center pb-34 text-center animate-in fade-in slide-in-from-bottom-4 duration-500\">\n <p\n className={cn(\n \"pb-6 text-3xl font-semibold transition-transform duration-200\",\n emptyInputAttachmentCount > 0 && \"-translate-y-12\"\n )}\n >\n {emptyTitle}\n </p>\n {!hideComposer && composer ? (\n <div className=\"mx-auto w-full max-w-3xl px-4\">{composer}</div>\n ) : null}\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={cn(\"relative flex h-full min-h-0 w-full flex-col\", className)} dir={dir}>\n <LatestThreadScroller.Provider>\n <LatestThreadScroller.Root>\n <LatestThreadScroller.Viewport\n onScroll={handleScroll}\n onViewportChange={(node) => {\n viewportRef.current = node;\n updateScrollState();\n }}\n >\n <LatestThreadScroller.Content\n ref={contentRef}\n className={cn(\n \"mx-auto flex min-h-full w-full max-w-3xl flex-col gap-8 px-4 pt-12\",\n contentClassName\n )}\n style={{ paddingBottom: bottomPadding }}\n >\n {isLoadingOlder ? renderOlderLoader?.() : null}\n {messages.map((message, index) => (\n <LatestThreadScroller.Item\n key={message.id}\n messageId={message.id}\n scrollAnchor={message.role === \"user\"}\n >\n {renderMessage(message, index)}\n </LatestThreadScroller.Item>\n ))}\n </LatestThreadScroller.Content>\n </LatestThreadScroller.Viewport>\n <LatestThreadScroller.Outline\n dir={dir}\n items={items}\n side={outlineSide}\n />\n </LatestThreadScroller.Root>\n\n {!hideComposer && composer ? (\n <div\n ref={overlayRef}\n className={cn(\n \"pointer-events-none absolute inset-x-0 bottom-0 z-20 overflow-visible px-4 pb-4 pt-10\",\n composerOverlayClassName\n )}\n style={{\n background:\n \"linear-gradient(to bottom, transparent 0%, color-mix(in oklch, var(--chat-background, var(--background)) 85%, transparent) 45%, var(--chat-background, var(--background)) 65%, var(--chat-background, var(--background)) 100%)\",\n }}\n >\n <div className=\"pointer-events-auto absolute inset-x-0 top-0 flex -translate-y-full justify-center pb-3\">\n <LatestThreadScroller.Button />\n </div>\n <div className=\"pointer-events-auto mx-auto w-full max-w-3xl px-4\">\n {composer}\n </div>\n </div>\n ) : null}\n </LatestThreadScroller.Provider>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/templates/agent-chat-shell.tsx","../../src/templates/agent-chat-layout.tsx","../../src/templates/agent-chat-app.tsx","../../src/templates/appearance-control.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport {\n LatestThreadScroller,\n type LatestThreadScrollerOutlineItem,\n} from \"../latest-thread-scroller\";\nimport type { ChatMessage } from \"../types\";\nimport { cn } from \"../ui/utils\";\n\nexport type AgentChatShellMessage = Pick<ChatMessage, \"id\" | \"role\" | \"content\"> & {\n [key: string]: unknown;\n};\n\nexport type AgentChatShellScrollState = {\n canScroll: boolean;\n isScrolled: boolean;\n};\n\nexport type AgentChatShellProps<TMessage extends AgentChatShellMessage> = {\n className?: string;\n contentClassName?: string;\n composer?: React.ReactNode;\n composerOverlayClassName?: string;\n composerOverlayHeight?: number;\n defaultComposerOverlayHeight?: number;\n dir?: \"ltr\" | \"rtl\";\n emptyInputAttachmentCount?: number;\n emptyTitle?: string;\n hideComposer?: boolean;\n isLoadingOlder?: boolean;\n messages: TMessage[];\n onLoadOlder?: (() => Promise<unknown> | unknown) | null;\n onScrollStateChange?: (state: AgentChatShellScrollState) => void;\n outlineItems?: LatestThreadScrollerOutlineItem[];\n outlineSide?: \"left\" | \"right\";\n renderEmptyState?: (input: { composer?: React.ReactNode; title: string }) => React.ReactNode;\n renderMessage: (message: TMessage, index: number) => React.ReactNode;\n renderOlderLoader?: () => React.ReactNode;\n};\n\nexport function getAgentChatShellScrollState(\n viewport: Pick<HTMLElement, \"clientHeight\" | \"scrollHeight\" | \"scrollTop\">\n): AgentChatShellScrollState {\n const canScroll = viewport.scrollHeight - viewport.clientHeight > 1;\n return {\n canScroll,\n isScrolled: canScroll && viewport.scrollTop > 4,\n };\n}\n\nconst defaultOutlineLabel = (content: unknown, index: number) => {\n const label = String(content || \"\").replace(/\\s+/g, \" \").trim();\n return label || `Turn ${index + 1}`;\n};\n\nconst defaultOutlinePreview = (content: unknown) =>\n String(content || \"\").replace(/\\s+/g, \" \").trim();\n\nexport function buildAgentChatOutlineItems<TMessage extends AgentChatShellMessage>(\n messages: TMessage[],\n getLabel: (message: TMessage, index: number) => string = (message, index) =>\n defaultOutlineLabel(message.content, index),\n getResponsePreview: (message: TMessage) => string = (message) =>\n defaultOutlinePreview(message.content)\n): LatestThreadScrollerOutlineItem[] {\n return messages.reduce((items, message) => {\n if (message.role === \"user\") {\n items.push({\n id: message.id,\n label: getLabel(message, items.length),\n messageIds: [message.id],\n });\n return items;\n }\n const currentItem = items[items.length - 1];\n currentItem?.messageIds?.push(message.id);\n if (\n currentItem &&\n !currentItem.responsePreview &&\n message.role === \"assistant\"\n ) {\n currentItem.responsePreview = getResponsePreview(message);\n }\n return items;\n }, [] as LatestThreadScrollerOutlineItem[]);\n}\n\nexport function AgentChatShell<TMessage extends AgentChatShellMessage>({\n className,\n composer,\n composerOverlayClassName,\n composerOverlayHeight,\n contentClassName,\n defaultComposerOverlayHeight = 192,\n dir = \"ltr\",\n emptyInputAttachmentCount = 0,\n emptyTitle = \"Ready when you are.\",\n hideComposer = false,\n isLoadingOlder = false,\n messages,\n onLoadOlder,\n onScrollStateChange,\n outlineItems,\n outlineSide = \"left\",\n renderEmptyState,\n renderMessage,\n renderOlderLoader,\n}: AgentChatShellProps<TMessage>) {\n const overlayRef = React.useRef<HTMLDivElement | null>(null);\n const viewportRef = React.useRef<HTMLElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const lastScrollStateRef = React.useRef<AgentChatShellScrollState | null>(null);\n const [measuredOverlayHeight, setMeasuredOverlayHeight] = React.useState(\n defaultComposerOverlayHeight\n );\n const olderPageRequestRef = React.useRef(false);\n const items = React.useMemo(\n () => outlineItems || buildAgentChatOutlineItems(messages),\n [messages, outlineItems]\n );\n\n const updateScrollState = React.useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport || !onScrollStateChange) return;\n const next = getAgentChatShellScrollState(viewport);\n const previous = lastScrollStateRef.current;\n if (\n previous &&\n previous.canScroll === next.canScroll &&\n previous.isScrolled === next.isScrolled\n ) {\n return;\n }\n lastScrollStateRef.current = next;\n onScrollStateChange(next);\n }, [onScrollStateChange]);\n\n React.useEffect(() => {\n const overlay = overlayRef.current;\n if (!overlay || hideComposer) return;\n const updateHeight = () => {\n setMeasuredOverlayHeight(Math.ceil(overlay.getBoundingClientRect().height));\n };\n updateHeight();\n const observer = new ResizeObserver(updateHeight);\n observer.observe(overlay);\n return () => observer.disconnect();\n }, [hideComposer]);\n\n React.useEffect(() => {\n if (!onScrollStateChange) return;\n updateScrollState();\n const viewport = viewportRef.current;\n const content = contentRef.current;\n if (!viewport || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(updateScrollState);\n observer.observe(viewport);\n if (content) observer.observe(content);\n return () => observer.disconnect();\n }, [messages, onScrollStateChange, updateScrollState]);\n\n const handleScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n updateScrollState();\n if (\n !onLoadOlder ||\n isLoadingOlder ||\n olderPageRequestRef.current ||\n event.currentTarget.scrollTop > 48\n ) {\n return;\n }\n olderPageRequestRef.current = true;\n void Promise.resolve(onLoadOlder()).finally(() => {\n olderPageRequestRef.current = false;\n });\n },\n [isLoadingOlder, onLoadOlder, updateScrollState]\n );\n\n const bottomPadding = hideComposer\n ? 32\n : (composerOverlayHeight ?? measuredOverlayHeight) + 72;\n const isEmptyState = messages.length === 0;\n\n if (isEmptyState) {\n return (\n <div className={cn(\"a24-shell a24-shell--empty relative flex h-full min-h-0 w-full flex-col overflow-visible px-4\", className)} dir={dir}>\n {renderEmptyState ? (\n renderEmptyState({ composer: hideComposer ? undefined : composer, title: emptyTitle })\n ) : (\n <div className=\"a24-shell__empty relative z-10 flex h-full flex-1 flex-col justify-center p-0 pt-13\">\n <div className=\"a24-shell__empty-content flex w-full flex-col items-center pb-34 text-center animate-in fade-in slide-in-from-bottom-4 duration-500\">\n <p\n className={cn(\n \"a24-shell__empty-title pb-6 text-3xl font-semibold transition-transform duration-200\",\n emptyInputAttachmentCount > 0 && \"-translate-y-12\"\n )}\n >\n {emptyTitle}\n </p>\n {!hideComposer && composer ? (\n <div className=\"a24-shell__empty-composer mx-auto w-full max-w-3xl px-4\">{composer}</div>\n ) : null}\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={cn(\"a24-shell relative flex h-full min-h-0 w-full flex-col\", className)} dir={dir}>\n <LatestThreadScroller.Provider>\n <LatestThreadScroller.Root>\n <LatestThreadScroller.Viewport\n onScroll={handleScroll}\n onViewportChange={(node) => {\n viewportRef.current = node;\n updateScrollState();\n }}\n >\n <LatestThreadScroller.Content\n ref={contentRef}\n className={cn(\n \"a24-shell__content mx-auto flex min-h-full w-full max-w-3xl flex-col gap-8 px-4 pt-12\",\n contentClassName\n )}\n style={{ paddingBottom: bottomPadding }}\n >\n {isLoadingOlder ? renderOlderLoader?.() : null}\n {messages.map((message, index) => (\n <LatestThreadScroller.Item\n key={message.id}\n messageId={message.id}\n scrollAnchor={message.role === \"user\"}\n >\n {renderMessage(message, index)}\n </LatestThreadScroller.Item>\n ))}\n </LatestThreadScroller.Content>\n </LatestThreadScroller.Viewport>\n <LatestThreadScroller.Outline\n dir={dir}\n items={items}\n side={outlineSide}\n />\n </LatestThreadScroller.Root>\n\n {!hideComposer && composer ? (\n <div\n ref={overlayRef}\n className={cn(\n \"a24-shell__composer-overlay pointer-events-none absolute inset-x-0 bottom-0 z-20 overflow-visible px-4 pb-4 pt-10\",\n composerOverlayClassName\n )}\n style={{\n background:\n \"linear-gradient(to bottom, transparent 0%, color-mix(in oklch, var(--chat-background, var(--background)) 85%, transparent) 45%, var(--chat-background, var(--background)) 65%, var(--chat-background, var(--background)) 100%)\",\n }}\n >\n <div className=\"a24-shell__scroll-button pointer-events-auto absolute inset-x-0 top-0 flex -translate-y-full justify-center pb-3\">\n <LatestThreadScroller.Button />\n </div>\n <div className=\"a24-shell__composer-inner pointer-events-auto mx-auto w-full max-w-3xl px-4\">\n {composer}\n </div>\n </div>\n ) : null}\n </LatestThreadScroller.Provider>\n </div>\n );\n}\n","import * as React from \"react\";\nimport {\n ChevronDown,\n Menu,\n MessageSquare,\n MoreHorizontal,\n Plus,\n RefreshCw,\n Search,\n Trash2,\n Wifi,\n WifiOff,\n X,\n} from \"lucide-react\";\n\nimport type { ChatHitlPart, ChatMessage } from \"../types\";\nimport {\n AgentChatComposer,\n type AgentChatComposerSubmit,\n} from \"../ui/agent-chat-composer\";\nimport { AgentChatMessage } from \"../ui/agent-chat-message\";\nimport { cn } from \"../ui/utils\";\nimport { AgentChatShell } from \"./agent-chat-shell\";\n\nexport type AgentChatConnectionState =\n | \"connected\"\n | \"connecting\"\n | \"reconnecting\"\n | \"offline\"\n | \"expired\";\n\nexport type AgentChatViewState =\n | \"ready\"\n | \"loading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"offline\"\n | \"denied\"\n | \"quota\"\n | \"failed\"\n | \"expired\";\n\nexport type AgentChatLayoutThread = {\n id: string;\n title?: string | null;\n updatedAt?: string | null;\n status?: string | null;\n};\n\nexport type AgentChatLayoutModel = {\n id: string;\n label: string;\n};\n\nexport type AgentChatLayoutAgent = {\n name: string;\n description?: string | null;\n avatarUrl?: string | null;\n};\n\nexport type AgentChatTargetSelector = {\n helperText?: string;\n label: string;\n onApply: (value: string) => Promise<void> | void;\n placeholder?: string;\n value: string;\n};\n\nexport type AgentChatLayoutSlots = {\n assistantBody?: (input: {\n isStreaming: boolean;\n message: ChatMessage;\n }) => React.ReactNode;\n empty?: React.ReactNode;\n headerActions?: React.ReactNode;\n messageActions?: (message: ChatMessage) => React.ReactNode;\n threadActions?: (thread: AgentChatLayoutThread) => React.ReactNode;\n};\n\nexport type AgentChatLayoutProps = {\n activeThreadId?: string | null;\n agent: AgentChatLayoutAgent;\n allowAttachments?: boolean;\n className?: string;\n connectionState?: AgentChatConnectionState;\n dir?: \"ltr\" | \"rtl\";\n errorMessage?: string | null;\n hasMoreThreads?: boolean;\n isDeletingThread?: boolean;\n isLoadingOlder?: boolean;\n isLoadingThreads?: boolean;\n isRunning?: boolean;\n messages: ChatMessage[];\n modelId?: string | null;\n models?: AgentChatLayoutModel[];\n onDeleteThread?: (threadId: string) => Promise<void> | void;\n onHitlAction?: (part: ChatHitlPart, action: string, comment?: string) => Promise<void> | void;\n onLoadMoreThreads?: () => Promise<void> | void;\n onLoadOlder?: () => Promise<void> | void;\n onModelChange?: (modelId: string) => void;\n onNewThread: () => void;\n onOpenThread: (threadId: string) => Promise<void> | void;\n onRetryConnection?: () => Promise<void> | void;\n onStop?: () => void;\n onSubmit: (message: AgentChatComposerSubmit) => Promise<void> | void;\n placeholder?: string;\n slots?: AgentChatLayoutSlots;\n state?: AgentChatViewState;\n streamingMessageId?: string | null;\n targetSelector?: AgentChatTargetSelector;\n threads: AgentChatLayoutThread[];\n title?: string;\n};\n\nconst stateCopy: Record<\n Exclude<AgentChatViewState, \"ready\" | \"streaming\" | \"paused\">,\n { title: string; detail: string }\n> = {\n loading: { title: \"Loading chat\", detail: \"Your conversation is being prepared.\" },\n reconnecting: { title: \"Reconnecting\", detail: \"Messages are safe. Trying the connection again.\" },\n offline: { title: \"You’re offline\", detail: \"Reconnect to continue this conversation.\" },\n denied: { title: \"Access denied\", detail: \"This deployment does not allow this request.\" },\n quota: { title: \"Usage limit reached\", detail: \"Try again after the deployment limit resets.\" },\n failed: { title: \"Something went wrong\", detail: \"The request could not be completed safely.\" },\n expired: { title: \"Session expired\", detail: \"Reconnect to start a new secure session.\" },\n};\n\nexport function AgentChatStatePanel({\n errorMessage,\n onRetry,\n state,\n}: {\n errorMessage?: string | null;\n onRetry?: () => Promise<void> | void;\n state: Exclude<AgentChatViewState, \"ready\" | \"streaming\" | \"paused\">;\n}) {\n const copy = stateCopy[state];\n const retryable = state === \"offline\" || state === \"failed\" || state === \"expired\";\n return (\n <div className=\"a24-state\" data-state={state} role={state === \"failed\" ? \"alert\" : \"status\"}>\n <div className=\"a24-state__icon\" aria-hidden=\"true\">\n {state === \"offline\" ? <WifiOff /> : state === \"reconnecting\" ? <RefreshCw /> : <MessageSquare />}\n </div>\n <h2>{copy.title}</h2>\n <p>{errorMessage || copy.detail}</p>\n {retryable && onRetry ? (\n <button className=\"a24-button a24-button--primary\" onClick={() => void onRetry()} type=\"button\">\n Try again\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction connectionLabel(state: AgentChatConnectionState) {\n if (state === \"connected\") return \"Connected\";\n if (state === \"connecting\") return \"Connecting\";\n if (state === \"reconnecting\") return \"Reconnecting\";\n if (state === \"expired\") return \"Session expired\";\n return \"Offline\";\n}\n\nfunction AgentAvatar({ agent }: { agent: AgentChatLayoutAgent }) {\n return agent.avatarUrl ? (\n <img alt=\"\" className=\"a24-avatar\" height={36} src={agent.avatarUrl} width={36} />\n ) : (\n <span aria-hidden=\"true\" className=\"a24-avatar a24-avatar--fallback\">\n {agent.name.trim().slice(0, 1).toUpperCase() || \"A\"}\n </span>\n );\n}\n\nfunction AgentTargetSelector({ agent, selector }: { agent: AgentChatLayoutAgent; selector: AgentChatTargetSelector }) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const inputId = React.useId();\n const [draft, setDraft] = React.useState(selector.value);\n const [error, setError] = React.useState<string | null>(null);\n const [open, setOpen] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n\n React.useEffect(() => setDraft(selector.value), [selector.value]);\n React.useEffect(() => {\n if (!open) return undefined;\n const closeOnPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n const closeOnEscape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n };\n document.addEventListener(\"pointerdown\", closeOnPointerDown);\n document.addEventListener(\"keydown\", closeOnEscape);\n return () => {\n document.removeEventListener(\"pointerdown\", closeOnPointerDown);\n document.removeEventListener(\"keydown\", closeOnEscape);\n };\n }, [open]);\n\n const apply = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const value = draft.trim();\n if (!value) {\n setError(`${selector.label} is required.`);\n return;\n }\n setSubmitting(true);\n setError(null);\n try {\n await selector.onApply(value);\n setOpen(false);\n } catch (nextError) {\n setError(nextError instanceof Error ? nextError.message : \"The target could not be changed.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <div className=\"a24-target-selector\" data-open={open || undefined} ref={rootRef}>\n <button\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={`Change ${selector.label}`}\n className=\"a24-target-selector__trigger\"\n onClick={() => setOpen((value) => !value)}\n ref={triggerRef}\n type=\"button\"\n >\n <AgentAvatar agent={agent} />\n <span className=\"a24-target-selector__copy\">\n <strong>{agent.name}</strong>\n <span>{agent.description || \"Click to change target\"}</span>\n </span>\n <ChevronDown aria-hidden=\"true\" />\n </button>\n {open ? (\n <form aria-label={`Change ${selector.label}`} className=\"a24-target-selector__panel\" onSubmit={(event) => void apply(event)}>\n <label htmlFor={inputId}>{selector.label}</label>\n <input autoComplete=\"off\" id={inputId} onChange={(event) => setDraft(event.target.value)} placeholder={selector.placeholder} spellCheck={false} value={draft} />\n {selector.helperText ? <p>{selector.helperText}</p> : null}\n {error ? <p className=\"a24-target-selector__error\" role=\"alert\">{error}</p> : null}\n <button className=\"a24-button a24-target-selector__apply\" disabled={submitting || !draft.trim()} type=\"submit\">\n {submitting ? \"Switching…\" : \"Use target\"}\n </button>\n </form>\n ) : null}\n </div>\n );\n}\n\nfunction ThreadNavigation({\n activeThreadId,\n agent,\n close,\n hasMoreThreads,\n isDeletingThread,\n isLoadingThreads,\n onDeleteThread,\n onLoadMoreThreads,\n onNewThread,\n onOpenThread,\n slots,\n targetSelector,\n threads,\n}: Pick<\n AgentChatLayoutProps,\n | \"activeThreadId\"\n | \"agent\"\n | \"hasMoreThreads\"\n | \"isDeletingThread\"\n | \"isLoadingThreads\"\n | \"onDeleteThread\"\n | \"onLoadMoreThreads\"\n | \"onNewThread\"\n | \"onOpenThread\"\n | \"slots\"\n | \"targetSelector\"\n | \"threads\"\n> & { close: () => void }) {\n const [query, setQuery] = React.useState(\"\");\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleThreads = normalizedQuery\n ? threads.filter((thread) => String(thread.title || \"New chat\").toLocaleLowerCase().includes(normalizedQuery))\n : threads;\n return (\n <div className=\"a24-sidebar__inner\">\n {targetSelector ? <AgentTargetSelector agent={agent} selector={targetSelector} /> : null}\n <div className=\"a24-sidebar__top\">\n <button\n aria-label=\"New chat\"\n className=\"a24-button a24-button--primary a24-sidebar__new\"\n onClick={() => {\n onNewThread();\n close();\n }}\n type=\"button\"\n >\n <Plus aria-hidden=\"true\" />\n New chat\n </button>\n <button aria-label=\"Close conversations\" className=\"a24-icon-button a24-sidebar__mobile-close\" onClick={close} type=\"button\">\n <X aria-hidden=\"true\" />\n </button>\n </div>\n <label className=\"a24-search\">\n <Search aria-hidden=\"true\" />\n <span className=\"a24-sr-only\">Search conversations</span>\n <input\n autoComplete=\"off\"\n name=\"conversation-search\"\n onChange={(event) => setQuery(event.target.value)}\n placeholder=\"Search conversations…\"\n type=\"search\"\n value={query}\n />\n </label>\n <nav aria-label=\"Conversations\" className=\"a24-thread-list\">\n {isLoadingThreads && threads.length === 0 ? <p className=\"a24-sidebar__hint\" role=\"status\">Loading conversations…</p> : null}\n {!isLoadingThreads && visibleThreads.length === 0 ? <p className=\"a24-sidebar__hint\">No conversations yet.</p> : null}\n {visibleThreads.map((thread) => {\n const selected = thread.id === activeThreadId;\n return (\n <div className=\"a24-thread\" data-selected={selected || undefined} key={thread.id}>\n <button\n aria-current={selected ? \"page\" : undefined}\n className=\"a24-thread__open\"\n onClick={() => {\n void onOpenThread(thread.id);\n close();\n }}\n type=\"button\"\n >\n <span className=\"a24-thread__title\">{thread.title || \"New chat\"}</span>\n {thread.status ? <span className=\"a24-thread__status\">{thread.status}</span> : null}\n </button>\n {slots?.threadActions ? slots.threadActions(thread) : onDeleteThread ? (\n <button\n aria-label={`Delete ${thread.title || \"conversation\"}`}\n className=\"a24-icon-button a24-thread__delete\"\n disabled={isDeletingThread}\n onClick={() => void onDeleteThread(thread.id)}\n type=\"button\"\n >\n <Trash2 aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n );\n })}\n </nav>\n {hasMoreThreads && onLoadMoreThreads ? (\n <button className=\"a24-button a24-button--quiet a24-sidebar__more\" onClick={() => void onLoadMoreThreads()} type=\"button\">\n <MoreHorizontal aria-hidden=\"true\" />\n Load more\n </button>\n ) : null}\n </div>\n );\n}\n\nexport function AgentChatLayout({\n activeThreadId,\n agent,\n allowAttachments = true,\n className,\n connectionState = \"connected\",\n dir = \"ltr\",\n errorMessage,\n hasMoreThreads,\n isDeletingThread,\n isLoadingOlder,\n isLoadingThreads,\n isRunning = false,\n messages,\n modelId,\n models = [],\n onDeleteThread,\n onHitlAction,\n onLoadMoreThreads,\n onLoadOlder,\n onModelChange,\n onNewThread,\n onOpenThread,\n onRetryConnection,\n onStop,\n onSubmit,\n placeholder,\n slots,\n state = \"ready\",\n streamingMessageId,\n targetSelector,\n threads,\n title,\n}: AgentChatLayoutProps) {\n const [sidebarOpen, setSidebarOpen] = React.useState(false);\n const menuButtonRef = React.useRef<HTMLButtonElement>(null);\n const closeSidebar = React.useCallback(() => {\n setSidebarOpen(false);\n menuButtonRef.current?.focus();\n }, []);\n React.useEffect(() => {\n if (!sidebarOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n closeSidebar();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [closeSidebar, sidebarOpen]);\n const shellState = state === \"streaming\" || state === \"paused\" ? \"ready\" : state;\n const showState = shellState !== \"ready\";\n const liveLabel = state === \"streaming\"\n ? \"Agent is responding\"\n : state === \"paused\"\n ? \"Waiting for your response\"\n : connectionLabel(connectionState);\n const composer = (\n <AgentChatComposer\n allowAttachments={allowAttachments}\n disabled={state === \"denied\" || state === \"quota\" || state === \"expired\" || state === \"offline\"}\n inputToolbarContent={models.length > 0 ? (\n <label className=\"a24-model-select\">\n <span className=\"a24-sr-only\">Model</span>\n <select aria-label=\"Model\" onChange={(event) => onModelChange?.(event.target.value)} value={modelId || models[0]?.id}>\n {models.map((model) => <option key={model.id} value={model.id}>{model.label}</option>)}\n </select>\n <ChevronDown aria-hidden=\"true\" />\n </label>\n ) : undefined}\n isRunning={isRunning}\n onStop={onStop}\n onSubmit={onSubmit}\n placeholder={placeholder}\n />\n );\n return (\n <section className={cn(\"a24-chat\", className)} data-agents24-chat-layout=\"\" dir={dir}>\n <a className=\"a24-skip-link\" href=\"#agents24-chat-main\">Skip to messages</a>\n <nav aria-label=\"Chat navigation\" className=\"a24-sidebar\" data-open={sidebarOpen || undefined}>\n <ThreadNavigation\n activeThreadId={activeThreadId}\n agent={agent}\n close={closeSidebar}\n hasMoreThreads={hasMoreThreads}\n isDeletingThread={isDeletingThread}\n isLoadingThreads={isLoadingThreads}\n onDeleteThread={onDeleteThread}\n onLoadMoreThreads={onLoadMoreThreads}\n onNewThread={onNewThread}\n onOpenThread={onOpenThread}\n slots={slots}\n targetSelector={targetSelector}\n threads={threads}\n />\n </nav>\n {sidebarOpen ? <button aria-label=\"Close conversations\" className=\"a24-sidebar-backdrop\" onClick={closeSidebar} type=\"button\" /> : null}\n <div className=\"a24-chat__body\">\n <header className=\"a24-header\" role=\"banner\">\n <button aria-label=\"Open conversations\" className=\"a24-icon-button a24-header__menu\" onClick={() => setSidebarOpen(true)} ref={menuButtonRef} type=\"button\">\n <Menu aria-hidden=\"true\" />\n </button>\n <AgentAvatar agent={agent} />\n <div className=\"a24-header__identity\">\n <h1>{title || agent.name}</h1>\n <div className=\"a24-connection\" data-state={connectionState}>\n {connectionState === \"offline\" || connectionState === \"expired\" ? <WifiOff aria-hidden=\"true\" /> : <Wifi aria-hidden=\"true\" />}\n <span>{connectionLabel(connectionState)}</span>\n </div>\n </div>\n <div className=\"a24-header__actions\">{slots?.headerActions}</div>\n </header>\n <main aria-busy={state === \"loading\" || state === \"reconnecting\"} className=\"a24-main\" id=\"agents24-chat-main\">\n {showState ? (\n <AgentChatStatePanel errorMessage={errorMessage} onRetry={onRetryConnection} state={shellState} />\n ) : (\n <AgentChatShell\n composer={composer}\n dir={dir}\n isLoadingOlder={isLoadingOlder}\n messages={messages}\n onLoadOlder={onLoadOlder}\n renderEmptyState={slots?.empty ? () => slots.empty : undefined}\n renderMessage={(message) => (\n <AgentChatMessage\n actions={slots?.messageActions?.(message)}\n message={message}\n onHitlAction={(part, action, comment) => void onHitlAction?.(part, action, comment)}\n renderAssistantContent={slots?.assistantBody}\n streamingMessageId={streamingMessageId}\n />\n )}\n />\n )}\n </main>\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"a24-sr-only\">{liveLabel}</div>\n </div>\n </section>\n );\n}\n","import type { AgentClient, Agents24ClientError, HitlAction } from \"@agents24/client\";\nimport {\n Agents24Provider,\n type Agents24ProviderProps,\n type ChatHitlPart,\n type ChatMessage,\n useAgentAttachments,\n useAgentChat,\n useAgentMcp,\n} from \"@agents24/react\";\nimport * as React from \"react\";\n\nimport { validateMcpCallbackResult, waitForMcpOauthComplete } from \"../mcp-oauth\";\nimport type { ChatMcpOauthCompletion } from \"../types\";\nimport { AgentChatDefaultActions } from \"../ui/agent-chat-actions\";\nimport type { AgentChatComposerSubmit } from \"../ui/agent-chat-composer\";\nimport {\n AgentChatLayout,\n type AgentChatConnectionState,\n type AgentChatLayoutAgent,\n type AgentChatLayoutProps,\n type AgentChatViewState,\n} from \"./agent-chat-layout\";\n\ntype CryptoLike = {\n getRandomValues<T extends Uint8Array>(array: T): T;\n randomUUID(): string;\n subtle: { digest(algorithm: string, data: Uint8Array): Promise<ArrayBuffer> };\n};\n\nfunction browserCrypto(): CryptoLike {\n const value = (globalThis as unknown as { crypto?: CryptoLike }).crypto;\n if (!value?.subtle || !value.randomUUID) throw new Error(\"Secure browser crypto is required for MCP authorization.\");\n return value;\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n bytes.forEach((byte) => { binary += String.fromCharCode(byte); });\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nasync function createPkceProof(): Promise<{ challenge: string; verifier: string }> {\n const crypto = browserCrypto();\n const verifier = base64Url(crypto.getRandomValues(new Uint8Array(32)));\n const bytes = new TextEncoder().encode(verifier);\n const digest = await crypto.subtle.digest(\"SHA-256\", bytes);\n return { verifier, challenge: base64Url(new Uint8Array(digest)) };\n}\n\nfunction stateFromError(error: unknown): AgentChatViewState {\n const typed = error as Partial<Agents24ClientError> | null;\n if (typed?.kind === \"authentication\") return \"expired\";\n if (typed?.kind === \"authorization\") return \"denied\";\n if (typed?.kind === \"quota\" || typed?.kind === \"rate_limit\") return \"quota\";\n if (typed?.kind === \"network\") return \"offline\";\n return \"failed\";\n}\n\nexport type AgentChatAppProps = Omit<\n AgentChatLayoutProps,\n | \"activeThreadId\"\n | \"agent\"\n | \"connectionState\"\n | \"isLoadingOlder\"\n | \"isLoadingThreads\"\n | \"isRunning\"\n | \"messages\"\n | \"onDeleteThread\"\n | \"onHitlAction\"\n | \"onLoadOlder\"\n | \"onNewThread\"\n | \"onOpenThread\"\n | \"onRetryConnection\"\n | \"onStop\"\n | \"onSubmit\"\n | \"state\"\n | \"streamingMessageId\"\n | \"threads\"\n> & {\n agent?: AgentChatLayoutAgent;\n client: AgentClient;\n createAbortController?: Agents24ProviderProps[\"createAbortController\"];\n createId?: Agents24ProviderProps[\"createId\"];\n completeMcpAuthorization?: (input: {\n completion: ChatMcpOauthCompletion;\n codeVerifier: string;\n serverId: string;\n }) => Promise<void>;\n mcpRedirectUri?: string;\n storage?: Agents24ProviderProps[\"storage\"];\n};\n\nfunction BoundAgentChatApp({\n agent: agentOverride,\n client,\n completeMcpAuthorization,\n mcpRedirectUri,\n modelId,\n models: modelOverrides,\n onModelChange,\n slots,\n ...layoutProps\n}: Omit<AgentChatAppProps, \"createAbortController\" | \"createId\" | \"storage\">) {\n const controller = useAgentChat();\n const attachments = useAgentAttachments();\n const mcp = useAgentMcp();\n const [agent, setAgent] = React.useState<AgentChatLayoutAgent>(agentOverride || { name: \"Agent\" });\n const [capabilities, setCapabilities] = React.useState<readonly string[]>([]);\n const [bootstrapModels, setBootstrapModels] = React.useState<AgentChatLayoutProps[\"models\"]>([]);\n const [selectedModelId, setSelectedModelId] = React.useState<string | null>(modelId || null);\n const [bootstrapLoading, setBootstrapLoading] = React.useState(true);\n const [localError, setLocalError] = React.useState<unknown>(null);\n const [liked, setLiked] = React.useState<Record<string, boolean>>({});\n const [disliked, setDisliked] = React.useState<Record<string, boolean>>({});\n\n const loadBootstrap = React.useCallback(async () => {\n setBootstrapLoading(true);\n setLocalError(null);\n try {\n const bootstrap = await client.bootstrap();\n if (!agentOverride) setAgent({ name: bootstrap.deployment.name || \"Agent\" });\n setCapabilities(bootstrap.capabilities);\n const modelFeatures = bootstrap.features.models as Record<string, unknown> | undefined;\n const allowedModelIds = Array.isArray(modelFeatures?.allowed_ids)\n ? modelFeatures.allowed_ids.filter((value): value is string => typeof value === \"string\")\n : [];\n if (bootstrap.capabilities.includes(\"models.select\") && modelFeatures?.selectable) {\n setBootstrapModels(allowedModelIds.map((id) => ({ id, label: id })));\n if (!modelId) {\n const defaultId = typeof modelFeatures.default_id === \"string\" ? modelFeatures.default_id : allowedModelIds[0];\n setSelectedModelId(defaultId || null);\n }\n } else {\n setBootstrapModels([]);\n }\n await controller.refreshThreads();\n } catch (error) {\n setLocalError(error);\n } finally {\n setBootstrapLoading(false);\n }\n }, [agentOverride, client, controller.refreshThreads, modelId]);\n\n React.useEffect(() => {\n if (modelId !== undefined) setSelectedModelId(modelId);\n }, [modelId]);\n\n React.useEffect(() => { void loadBootstrap(); }, [loadBootstrap]);\n\n const submit = React.useCallback(async (message: AgentChatComposerSubmit) => {\n setLocalError(null);\n try {\n const uploaded = await Promise.all(message.files.map((file) => attachments.upload({\n data: file.source,\n name: file.filename,\n mediaType: file.mediaType,\n threadId: controller.activeThreadId || undefined,\n })));\n await controller.submit({\n text: message.text,\n attachmentIds: uploaded.flatMap((attachment) => attachment.id ? [attachment.id] : []),\n attachments: uploaded,\n requestedModelId: selectedModelId || undefined,\n });\n } catch (error) {\n setLocalError(error);\n }\n }, [attachments, controller, selectedModelId]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n if (!window.confirm(\"Delete this conversation? This cannot be undone.\")) return;\n await controller.deleteThread(threadId);\n }, [controller.deleteThread]);\n\n const changeModel = React.useCallback((nextModelId: string) => {\n if (modelId === undefined) setSelectedModelId(nextModelId);\n onModelChange?.(nextModelId);\n }, [modelId, onModelChange]);\n\n const handleMcp = React.useCallback(async (part: ChatHitlPart) => {\n if (!mcpRedirectUri) throw new Error(\"mcpRedirectUri is required for MCP Connect.\");\n const serverId = String(part.presentation.server_id || \"\").trim();\n if (!serverId) throw new Error(\"MCP authorization is missing its server identity.\");\n const runId = controller.activeRunId || controller.messages.find((message) => message.parts.includes(part))?.runId;\n if (!runId) throw new Error(\"MCP authorization is missing its paused run.\");\n const popupNonce = browserCrypto().randomUUID();\n const proof = await createPkceProof();\n const popup = window.open(\"about:blank\", \"agents24-mcp\", \"popup,width=560,height=720\");\n try {\n const start = await mcp.startAuthorization({\n runId,\n serverId,\n interruptId: part.interruptId,\n redirectUri: mcpRedirectUri,\n popupNonce,\n codeChallenge: proof.challenge,\n });\n if (!start.callback_origin) throw new Error(\"MCP authorization did not return a callback origin.\");\n if (popup) popup.location.replace(start.authorization_url);\n const completion = await waitForMcpOauthComplete({\n popup,\n callbackOrigin: start.callback_origin,\n popupNonce,\n requireConnectionId: Boolean(completeMcpAuthorization),\n serverId,\n });\n if (completeMcpAuthorization) {\n await completeMcpAuthorization({ completion, codeVerifier: proof.verifier, serverId });\n } else {\n const redeemed = await mcp.redeemCallback({ code: completion.code, codeVerifier: proof.verifier });\n validateMcpCallbackResult(redeemed, serverId);\n }\n popup?.close();\n await controller.resumeHitl(part, \"connect\");\n } catch (error) {\n popup?.close();\n throw error;\n }\n }, [completeMcpAuthorization, controller, mcp, mcpRedirectUri]);\n\n const onHitlAction = React.useCallback(async (part: ChatHitlPart, action: string, comment?: string) => {\n setLocalError(null);\n try {\n if (part.hitlKind === \"mcp_auth\" && action === \"connect\") await handleMcp(part);\n else await controller.resumeHitl(part, action as HitlAction, comment);\n } catch (error) {\n setLocalError(error);\n }\n }, [controller, handleMcp]);\n\n const error = localError || controller.error;\n const state: AgentChatViewState = bootstrapLoading\n ? \"loading\"\n : error\n ? stateFromError(error)\n : controller.runState === \"streaming\"\n ? \"streaming\"\n : controller.runState === \"reconnecting\"\n ? \"reconnecting\"\n : controller.runState === \"paused\"\n ? \"paused\"\n : \"ready\";\n const connectionState: AgentChatConnectionState = state === \"offline\"\n ? \"offline\"\n : state === \"expired\"\n ? \"expired\"\n : state === \"reconnecting\"\n ? \"reconnecting\"\n : bootstrapLoading\n ? \"connecting\"\n : \"connected\";\n const defaultMessageActions = (message: ChatMessage) => message.role === \"assistant\" ? (\n <AgentChatDefaultActions\n handlers={{\n copied: false,\n disliked: Boolean(disliked[message.id]),\n liked: Boolean(liked[message.id]),\n onCopy: async (content) => navigator.clipboard.writeText(content),\n onDislike: () => {\n setDisliked((current) => ({ ...current, [message.id]: !current[message.id] }));\n setLiked((current) => ({ ...current, [message.id]: false }));\n },\n onLike: () => {\n setLiked((current) => ({ ...current, [message.id]: !current[message.id] }));\n setDisliked((current) => ({ ...current, [message.id]: false }));\n },\n onRetry: () => controller.regenerate(message),\n }}\n message={message}\n />\n ) : null;\n return (\n <AgentChatLayout\n {...layoutProps}\n activeThreadId={controller.activeThreadId}\n agent={agent}\n allowAttachments={layoutProps.allowAttachments ?? capabilities.includes(\"attachments.write\")}\n connectionState={connectionState}\n errorMessage={error instanceof Error ? error.message : null}\n isLoadingOlder={controller.isLoadingOlder}\n isLoadingThreads={controller.isLoadingThreads}\n isRunning={controller.runState === \"streaming\" || controller.isSubmitting}\n messages={controller.messages}\n hasMoreThreads={controller.hasMoreThreads}\n modelId={selectedModelId}\n models={modelOverrides ?? bootstrapModels}\n onDeleteThread={deleteThread}\n onHitlAction={onHitlAction}\n onLoadOlder={controller.hasOlderTurns ? controller.loadOlder : undefined}\n onLoadMoreThreads={controller.hasMoreThreads ? controller.loadMoreThreads : undefined}\n onModelChange={changeModel}\n onNewThread={controller.startNewThread}\n onOpenThread={controller.openThread}\n onRetryConnection={loadBootstrap}\n onStop={() => void controller.cancelRun()}\n onSubmit={submit}\n slots={{ ...slots, messageActions: slots?.messageActions || defaultMessageActions }}\n state={state}\n streamingMessageId={controller.streamingMessageId}\n threads={controller.threads.map((thread) => ({ id: thread.id, title: thread.title, status: thread.last_run_status || thread.status, updatedAt: thread.updated_at }))}\n />\n );\n}\n\nexport function AgentChatApp({\n client,\n createAbortController,\n createId,\n storage,\n ...props\n}: AgentChatAppProps) {\n return (\n <Agents24Provider\n client={client}\n createAbortController={createAbortController || (() => new AbortController())}\n createId={createId}\n storage={storage}\n >\n <BoundAgentChatApp client={client} {...props} />\n </Agents24Provider>\n );\n}\n","import { Monitor, Moon, Sun } from \"lucide-react\";\nimport * as React from \"react\";\n\nexport type AgentChatColorMode = \"system\" | \"light\" | \"dark\";\n\nexport type AgentChatAppearanceControlProps = {\n storageKey?: string;\n};\n\nconst MODES: readonly AgentChatColorMode[] = [\"system\", \"light\", \"dark\"];\n\nfunction storedMode(storageKey: string): AgentChatColorMode {\n if (typeof window === \"undefined\") return \"system\";\n const value = window.localStorage.getItem(storageKey);\n return value === \"light\" || value === \"dark\" ? value : \"system\";\n}\n\nfunction applyMode(mode: AgentChatColorMode): void {\n if (typeof document === \"undefined\") return;\n document.documentElement.dataset.agents24ColorMode = mode;\n}\n\nexport function AgentChatAppearanceControl({\n storageKey = \"agents24-color-mode\",\n}: AgentChatAppearanceControlProps) {\n const [mode, setMode] = React.useState<AgentChatColorMode>(() => storedMode(storageKey));\n React.useEffect(() => applyMode(mode), [mode]);\n const label = `Appearance: ${mode[0]?.toUpperCase()}${mode.slice(1)}`;\n const Icon = mode === \"light\" ? Sun : mode === \"dark\" ? Moon : Monitor;\n\n return (\n <button\n aria-label={`${label}. Activate to change.`}\n className=\"a24-icon-button a24-appearance\"\n onClick={() => {\n const next = MODES[(MODES.indexOf(mode) + 1) % MODES.length] || \"system\";\n window.localStorage.setItem(storageKey, next);\n setMode(next);\n }}\n title={label}\n type=\"button\"\n >\n <Icon aria-hidden=\"true\" />\n <span className=\"a24-sr-only\">{label}</span>\n </button>\n );\n}\n"],"mappings":"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","names":["React","jsx","jsxs","React","jsx","error","React","jsx","jsxs"]}
package/dist/types.d.ts CHANGED
@@ -1,127 +1,9 @@
1
- import type { ReactNode, RefObject } from "react";
2
- import type { ContextWindow } from "./context-window";
3
- export type ChatRunStatus = "queued" | "running" | "completed" | "cancelled" | "failed" | string;
4
- export type ChatContextWindow = ContextWindow;
5
- export type ChatCitation = {
6
- title: string;
7
- url: string;
8
- description: string;
9
- sourceRef?: string;
10
- ref?: string;
11
- firstRef?: string;
12
- totalSegments?: number;
13
- rangeRef?: string;
14
- };
15
- export type ChatAttachment = {
16
- url?: string;
17
- filename?: string;
18
- mediaType?: string;
19
- contentType?: string;
20
- [key: string]: unknown;
21
- };
22
- export type ChatReasoningStep = {
23
- label: string;
24
- status: "active" | "complete" | "pending";
25
- icon?: unknown;
26
- description?: string;
27
- citations?: ChatCitation[];
28
- query?: string;
29
- sources?: Array<Record<string, unknown>>;
30
- };
31
- export type ChatToolState = "input-streaming" | "input-available" | "output-available" | "output-error" | "cancelled";
32
- export type ToolPresentation = {
33
- title?: string | null;
34
- activity?: string | null;
35
- detail?: string | null;
36
- category?: string | null;
37
- groupKey?: string | null;
38
- groupLabel?: string | null;
39
- showOutput?: boolean;
40
- outputView?: Record<string, unknown> | null;
41
- [key: string]: unknown;
42
- };
43
- export type ChatTextPart = {
44
- id: string;
45
- type: "text";
46
- kind: "text";
47
- text: string;
48
- raw?: Record<string, unknown>;
49
- };
50
- export type ChatToolPart = {
51
- id: string;
52
- type: `tool-${string}`;
53
- kind: "tool";
54
- toolName: string;
55
- toolCallId?: string | null;
56
- state: ChatToolState;
57
- input?: unknown;
58
- output?: unknown;
59
- errorText?: string | null;
60
- presentation?: ToolPresentation | null;
61
- raw: Record<string, unknown>;
62
- };
63
- export type ChatReasoningPart = {
64
- id: string;
65
- type: "reasoning";
66
- kind: "reasoning";
67
- label?: string | null;
68
- text?: string | null;
69
- status?: string | null;
70
- raw: Record<string, unknown>;
71
- };
72
- export type ChatUiBlocksPart = {
73
- id: string;
74
- type: "ui-blocks";
75
- kind: "ui-blocks";
76
- state: ChatToolState;
77
- toolCallId?: string | null;
78
- contractVersion?: string | null;
79
- bundle?: Record<string, unknown> | null;
80
- errorText?: string | null;
81
- raw: Record<string, unknown>;
82
- };
83
- export type ChatHitlKind = "tool_review" | "mcp_auth" | "user_approval" | "app_data_permission";
84
- export type ChatHitlAction = "approve" | "reject" | "connect" | "skip";
85
- export type ChatHitlStatus = "pending" | "resolved" | "expired" | "cancelled" | "invalidated";
86
- export type ChatHitlResolution = {
87
- action?: ChatHitlAction | null;
88
- outcome?: string | null;
89
- reason?: string | null;
90
- resolvedAt?: string | null;
91
- resolver?: {
92
- principalType?: string | null;
93
- principalId?: string | null;
94
- } | null;
95
- };
96
- export type ChatHitlPart = {
97
- id: string;
98
- type: "hitl";
99
- kind: "hitl";
100
- interruptId: string;
101
- hitlKind: ChatHitlKind;
102
- message: string;
103
- allowedActions: ChatHitlAction[];
104
- status: ChatHitlStatus;
105
- presentation: Record<string, unknown>;
106
- resolution?: ChatHitlResolution | null;
107
- raw: Record<string, unknown>;
108
- };
109
- export type ChatErrorPart = {
110
- id: string;
111
- type: "error";
112
- kind: "error";
113
- errorText: string;
114
- raw: Record<string, unknown>;
115
- };
116
- export type ChatDataPart = {
117
- id: string;
118
- type: "data";
119
- kind: "data";
120
- name: string;
121
- data: Record<string, unknown>;
122
- raw: Record<string, unknown>;
123
- };
124
- export type ChatPart = ChatTextPart | ChatToolPart | ChatReasoningPart | ChatUiBlocksPart | ChatHitlPart | ChatErrorPart | ChatDataPart;
1
+ import type { HitlAction } from "@agents24/client";
2
+ import type { ChatMessage, ChatPart, ChatToolPart } from "@agents24/react";
3
+ import type { ReactNode } from "react";
4
+ export type * from "@agents24/react";
5
+ export type { ChatAttachment, ChatHitlPart, ChatMessage, ChatPart, ChatToolPart, } from "@agents24/react";
6
+ export type ChatHitlAction = HitlAction;
125
7
  export type ToolRenderer = (props: {
126
8
  part: ChatToolPart;
127
9
  message: ChatMessage;
@@ -131,267 +13,17 @@ export type Agents24ChatRenderOptions = {
131
13
  toolRenderers?: Partial<Record<`tool-${string}`, ToolRenderer>>;
132
14
  fallbackToolRenderer?: ToolRenderer;
133
15
  };
134
- export type ChatMessage = {
135
- id: string;
136
- role: "user" | "assistant";
137
- runId?: string | null;
138
- content: string;
139
- createdAt: Date;
140
- isFinal?: boolean;
141
- parts: ChatPart[];
142
- attachments?: ChatAttachment[];
143
- citations?: ChatCitation[];
144
- reasoningSteps?: ChatReasoningStep[];
145
- thinkingDurationMs?: number;
146
- liked?: boolean;
147
- disliked?: boolean;
148
- messageIndex?: number;
149
- isVoice?: boolean;
150
- tokenUsage?: {
151
- inputTokens?: number | null;
152
- outputTokens?: number | null;
153
- totalTokens?: number | null;
154
- usageSource?: string | null;
155
- };
156
- };
157
- export type ChatRuntimeEvent = {
158
- version?: string;
159
- seq?: number;
160
- ts?: string;
161
- event: string;
162
- run_id?: string;
163
- stage?: string;
164
- payload?: Record<string, unknown>;
165
- diagnostics?: Array<Record<string, unknown>>;
166
- };
167
- export type ChatActiveRun = {
168
- run_id?: string | null;
169
- status?: string | null;
170
- started_at?: string | null;
171
- created_at?: string | null;
172
- };
173
- export type ChatThreadSummary = {
174
- id: string;
175
- title?: string | null;
176
- status?: string | null;
177
- surface?: string | null;
178
- agent_id?: string | null;
179
- last_run_id?: string | null;
180
- last_run_status?: string | null;
181
- active_run?: ChatActiveRun | null;
182
- activeRun?: ChatActiveRun | null;
183
- updated_at?: string | null;
184
- last_activity_at?: string | null;
185
- created_at?: string | null;
186
- messages?: ChatMessage[];
187
- isHydrated?: boolean;
188
- hasOlderTurns?: boolean;
189
- nextBeforeTurnIndex?: number | null;
190
- lastRunId?: string | null;
191
- lastRunStatus?: string | null;
192
- lastEventSeq?: number | null;
193
- isRunning?: boolean;
194
- [key: string]: unknown;
195
- };
196
- export type ChatThreadSummaryEvent = {
197
- schema_version?: string;
198
- event: "thread.summary.updated";
199
- cursor?: number;
200
- thread: ChatThreadSummary;
201
- } | {
202
- schema_version?: string;
203
- event: "thread.deleted";
204
- cursor?: number;
205
- thread_id: string;
206
- } | {
207
- schema_version?: string;
208
- event: "snapshot_required";
209
- cursor?: number;
210
- reason?: string;
211
- };
212
- export type ChatThreadTurn = {
213
- id?: string;
214
- run_id?: string;
215
- turn_index?: number;
216
- status?: string | null;
217
- user_input_text?: string | null;
218
- assistant_output_text?: string | null;
219
- final_output?: unknown;
220
- response_blocks?: Array<Record<string, unknown>>;
221
- run_events?: ChatRuntimeEvent[];
222
- context_window?: unknown;
223
- run_usage?: {
224
- source?: string | null;
225
- input_tokens?: number | null;
226
- output_tokens?: number | null;
227
- total_tokens?: number | null;
228
- } | null;
229
- attachments?: Array<Record<string, unknown>>;
230
- created_at?: string | null;
231
- completed_at?: string | null;
232
- };
233
- export type ChatThreadDetail = ChatThreadSummary & {
234
- turns?: ChatThreadTurn[];
235
- context_window?: unknown;
236
- paging?: {
237
- has_more?: boolean;
238
- next_before_turn_index?: number | null;
239
- };
240
- };
241
- export type ChatSubmitInput = {
242
- text: string;
243
- threadId?: string | null;
244
- files?: ChatAttachment[];
245
- signal: AbortSignal;
246
- state?: Record<string, unknown>;
247
- [key: string]: unknown;
248
- };
249
- export type ChatSubmitMessage = {
250
- text: string;
251
- files?: ChatAttachment[];
252
- state?: Record<string, unknown>;
253
- [key: string]: unknown;
254
- };
255
- export type ChatHitlResumeInput = {
256
- runId: string;
257
- interruptId: string;
258
- action: ChatHitlAction;
259
- comment?: string;
260
- client?: Record<string, unknown>;
261
- };
262
- export type ChatHitlResumeResult = {
263
- run_id: string;
264
- thread_id?: string | null;
265
- interrupt_id: string;
266
- run_status: string;
267
- resolution_status: string;
268
- idempotent: boolean;
269
- };
270
- export type ChatMcpAuthStartInput = {
271
- runId: string;
272
- interruptId?: string | null;
273
- serverId: string;
274
- principalType?: string | null;
275
- principalId?: string | null;
276
- client?: Record<string, unknown>;
277
- };
278
- export type ChatMcpAuthStartResult = {
279
- authorization_url: string;
280
- callback_origin: string;
281
- };
282
16
  export type ChatMcpOauthCompletion = {
283
- connectionId: string;
17
+ code: string;
18
+ connectionId?: string;
19
+ popupNonce: string;
20
+ serverId: string;
284
21
  };
285
22
  export type WaitForMcpOauthCompleteInput = {
286
23
  popup: Window | null;
287
24
  callbackOrigin: string;
25
+ popupNonce: string;
26
+ requireConnectionId?: boolean;
288
27
  serverId: string;
289
28
  timeoutMs?: number;
290
29
  };
291
- export type ChatTransport = {
292
- listThreads: (input?: {
293
- signal?: AbortSignal;
294
- }) => Promise<{
295
- items: ChatThreadSummary[];
296
- total?: number;
297
- }>;
298
- getThread: (input: {
299
- threadId: string;
300
- limit?: number;
301
- beforeTurnIndex?: number | null;
302
- includeRunEvents?: boolean;
303
- signal?: AbortSignal;
304
- }) => Promise<ChatThreadDetail>;
305
- streamMessage: (input: ChatSubmitInput, onEvent: (event: ChatRuntimeEvent) => void | Promise<void>) => Promise<ChatStreamResult>;
306
- attachRun: (input: {
307
- runId: string;
308
- signal: AbortSignal;
309
- }, onEvent: (event: ChatRuntimeEvent) => void | Promise<void>) => Promise<ChatStreamResult>;
310
- cancelRun: (input: {
311
- runId: string;
312
- assistantOutputText?: string;
313
- }) => Promise<{
314
- run_id?: string;
315
- status?: string;
316
- }>;
317
- deleteThread?: (input: {
318
- threadId: string;
319
- }) => Promise<{
320
- deleted?: boolean;
321
- }>;
322
- uploadAttachment?: (input: {
323
- file: File;
324
- signal?: AbortSignal;
325
- }) => Promise<ChatAttachment>;
326
- resumeHitl?: (input: ChatHitlResumeInput) => Promise<ChatHitlResumeResult>;
327
- startMcpAuth?: (input: ChatMcpAuthStartInput) => Promise<ChatMcpAuthStartResult>;
328
- subscribeThreadEvents?: (input: {
329
- cursor?: number | null;
330
- signal: AbortSignal;
331
- }, onEvent: (event: ChatThreadSummaryEvent) => void | Promise<void>) => Promise<void>;
332
- };
333
- export type ChatStreamResult = {
334
- threadId?: string | null;
335
- runId?: string | null;
336
- };
337
- export type StoredChatThread = ChatThreadSummary & {
338
- messages: ChatMessage[];
339
- isHydrated?: boolean;
340
- hasOlderTurns?: boolean;
341
- nextBeforeTurnIndex?: number | null;
342
- };
343
- export type ChatStorageAdapter = {
344
- listThreads: () => StoredChatThread[];
345
- setThreads: (threads: StoredChatThread[]) => void;
346
- getThread: (threadId: string) => StoredChatThread | undefined;
347
- upsertThread: (thread: StoredChatThread) => void;
348
- deleteThread?: (threadId: string) => void;
349
- getActiveThreadId?: () => string | null;
350
- setActiveThreadId?: (threadId: string | null) => void;
351
- };
352
- export type ChatController = {
353
- threads: StoredChatThread[];
354
- activeThreadId: string | null;
355
- activeThread: StoredChatThread | null;
356
- messages: ChatMessage[];
357
- streamingContent: string;
358
- streamingMessageId: string | null;
359
- contextStatus: ChatContextWindow | null;
360
- currentReasoning: ChatReasoningStep[];
361
- isLoading: boolean;
362
- isLoadingHistory: boolean;
363
- isLoadingOlder: boolean;
364
- isRefreshingThreads: boolean;
365
- isSelectingThread: boolean;
366
- hasOlderTurns: boolean;
367
- liked: Record<string, boolean>;
368
- disliked: Record<string, boolean>;
369
- copiedMessageId: string | null;
370
- lastThinkingDurationMs: number | null;
371
- activeRunId: string | null;
372
- pendingHitl: ChatHitlPart | null;
373
- isResolvingHitl: boolean;
374
- handleSubmit: (message: ChatSubmitMessage) => Promise<void>;
375
- attachRun: (runId: string, threadId?: string | null) => Promise<void>;
376
- resumeHitl: (input: Omit<ChatHitlResumeInput, "runId"> & {
377
- runId?: string;
378
- }) => Promise<ChatHitlResumeResult>;
379
- handleStop: () => void;
380
- handleCopy: (content: string, messageId: string) => void;
381
- handleLike: (msg: ChatMessage) => Promise<void>;
382
- handleDislike: (msg: ChatMessage) => Promise<void>;
383
- handleRetry: (msg: ChatMessage) => Promise<void>;
384
- handleSourceClick: (citations: ChatMessage["citations"]) => void;
385
- upsertLiveVoiceMessage: (input: {
386
- role: "user" | "assistant";
387
- content: string;
388
- isFinal?: boolean;
389
- citations?: ChatCitation[];
390
- reasoningSteps?: ChatReasoningStep[];
391
- }) => void;
392
- startNewThread: () => void;
393
- loadThreadById: (threadId: string) => Promise<void>;
394
- loadOlderTurns: () => Promise<void>;
395
- refresh: () => Promise<void>;
396
- textareaRef: RefObject<HTMLTextAreaElement | null>;
397
- };
@@ -1,4 +1,3 @@
1
- import * as React from "react";
2
1
  import type { ChatMessage } from "../types";
3
2
  export type AgentChatMessageActionHandlers = {
4
3
  copied?: boolean;
@@ -13,4 +12,4 @@ export type AgentChatDefaultActionsProps = {
13
12
  handlers?: AgentChatMessageActionHandlers;
14
13
  message: ChatMessage;
15
14
  };
16
- export declare function AgentChatDefaultActions({ handlers, message, }: AgentChatDefaultActionsProps): React.JSX.Element | null;
15
+ export declare function AgentChatDefaultActions({ handlers, message, }: AgentChatDefaultActionsProps): import("react/jsx-runtime").JSX.Element | null;
@@ -6,6 +6,7 @@ export type AgentChatComposerFile = ChatAttachment & {
6
6
  url: string;
7
7
  filename: string;
8
8
  mediaType: string;
9
+ source: File;
9
10
  };
10
11
  export type AgentChatComposerSubmit = {
11
12
  text: string;
@@ -25,4 +26,4 @@ export type AgentChatComposerProps = {
25
26
  placeholder?: string;
26
27
  textareaRef?: React.Ref<HTMLTextAreaElement>;
27
28
  };
28
- export declare function AgentChatComposer({ accept, allowAttachments, attachmentLayout, className, disabled, inputToolbarContent, isRunning, onAttachmentCountChange, onStop, onSubmit, placeholder, textareaRef, }: AgentChatComposerProps): React.JSX.Element;
29
+ export declare function AgentChatComposer({ accept, allowAttachments, attachmentLayout, className, disabled, inputToolbarContent, isRunning, onAttachmentCountChange, onStop, onSubmit, placeholder, textareaRef, }: AgentChatComposerProps): import("react/jsx-runtime").JSX.Element;
@@ -18,7 +18,7 @@ export type AgentChatMessageProps = {
18
18
  dir?: "ltr" | "rtl";
19
19
  getHitlActionState?: (part: ChatHitlPart) => AgentChatPartActionState | undefined;
20
20
  message: ChatMessage;
21
- onHitlAction?: (part: ChatHitlPart, decision: string) => void;
21
+ onHitlAction?: (part: ChatHitlPart, decision: string, comment?: string) => void;
22
22
  renderAssistantContent?: (input: {
23
23
  isStreaming: boolean;
24
24
  message: ChatMessage;
@@ -36,5 +36,5 @@ export type AgentChatMessageProps = {
36
36
  userMessageShowMoreLabel?: string;
37
37
  };
38
38
  export declare function shouldCollapseUserMessage(content: string, threshold?: number | null | undefined): boolean;
39
- export declare function AgentChatUserMessageContent({ collapsedLines, collapseThreshold, content, showLessLabel, showMoreLabel, }: AgentChatUserMessageContentProps): React.JSX.Element;
40
- export declare function AgentChatMessage({ actionHandlers, actions, actionsClassName, className, contentClassName, dir, getHitlActionState, message, onHitlAction, renderAssistantContent, renderPart, renderUserContent, showAssistantAttachments, streamingMessageId, userMessageCollapsedLines, userMessageContent, userMessageCollapseThreshold, userMessageShowLessLabel, userMessageShowMoreLabel, }: AgentChatMessageProps): React.JSX.Element;
39
+ export declare function AgentChatUserMessageContent({ collapsedLines, collapseThreshold, content, showLessLabel, showMoreLabel, }: AgentChatUserMessageContentProps): import("react/jsx-runtime").JSX.Element;
40
+ export declare function AgentChatMessage({ actionHandlers, actions, actionsClassName, className, contentClassName, dir, getHitlActionState, message, onHitlAction, renderAssistantContent, renderPart, renderUserContent, showAssistantAttachments, streamingMessageId, userMessageCollapsedLines, userMessageContent, userMessageCollapseThreshold, userMessageShowLessLabel, userMessageShowMoreLabel, }: AgentChatMessageProps): import("react/jsx-runtime").JSX.Element;
@@ -19,6 +19,6 @@ declare function DefaultPartRow({ activeToolId, getHitlActionState, isLoading, m
19
19
  message: ChatMessage;
20
20
  onHitlAction?: AgentResponseTimelineProps["onHitlAction"];
21
21
  part: ChatPart;
22
- }): React.JSX.Element | null;
23
- export declare function AgentResponseTimeline({ getHitlActionState, isLoading, message, onHitlAction, renderPart, }: AgentResponseTimelineProps): React.JSX.Element;
22
+ }): import("react/jsx-runtime").JSX.Element | null;
23
+ export declare function AgentResponseTimeline({ getHitlActionState, isLoading, message, onHitlAction, renderPart, }: AgentResponseTimelineProps): import("react/jsx-runtime").JSX.Element;
24
24
  export { DefaultPartRow as AgentChatPartRow };