@agents24/chat-react 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -18
- package/compatibility.json +10 -10
- package/dist/chunk-SSUO4EPD.js +189 -0
- package/dist/chunk-SSUO4EPD.js.map +1 -0
- package/dist/chunk-ZCNHLFRB.js +108 -0
- package/dist/chunk-ZCNHLFRB.js.map +1 -0
- package/dist/index.cjs +112 -95
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +362 -68
- package/dist/index.js.map +1 -1
- package/dist/mcp-oauth.d.ts +13 -0
- package/dist/runtime/index.cjs +594 -0
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +458 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/input-contract.d.ts +20 -0
- package/dist/runtime/use-agent-chat-runtime.d.ts +83 -0
- package/dist/scaffold/app.d.ts +30 -0
- package/dist/scaffold/components/chat/chat-composer.d.ts +21 -0
- package/dist/scaffold/components/chat/chat-message.d.ts +21 -0
- package/dist/scaffold/components/chat/chat-shell.d.ts +8 -0
- package/dist/scaffold/components/chat/collapsible-user-message.d.ts +3 -0
- package/dist/scaffold/components/chat/external-link-dialog.d.ts +2 -0
- package/dist/scaffold/components/chat/identity-control.d.ts +4 -0
- package/dist/scaffold/components/chat/message-parts.d.ts +12 -0
- package/dist/scaffold/components/chat/theme-menu.d.ts +1 -0
- package/dist/scaffold/components/chat/thread-sidebar.d.ts +16 -0
- package/dist/scaffold/components/chat/timeline-loading.d.ts +7 -0
- package/dist/scaffold/components/chat/turn-outline.d.ts +4 -0
- package/dist/scaffold/components/theme-provider.d.ts +20 -0
- package/dist/scaffold/components/ui/attachment.d.ts +24 -0
- package/dist/scaffold/components/ui/bubble.d.ts +17 -0
- package/dist/scaffold/components/ui/button-group.d.ts +11 -0
- package/dist/scaffold/components/ui/button.d.ts +10 -0
- package/dist/scaffold/components/ui/dialog.d.ts +17 -0
- package/dist/scaffold/components/ui/dropdown-menu.d.ts +29 -0
- package/dist/scaffold/components/ui/input.d.ts +3 -0
- package/dist/scaffold/components/ui/marker.d.ts +11 -0
- package/dist/scaffold/components/ui/message-scroller.d.ts +10 -0
- package/dist/scaffold/components/ui/message.d.ts +10 -0
- package/dist/scaffold/components/ui/popover.d.ts +6 -0
- package/dist/scaffold/components/ui/select.d.ts +8 -0
- package/dist/scaffold/components/ui/separator.d.ts +4 -0
- package/dist/scaffold/components/ui/sheet.d.ts +14 -0
- package/dist/scaffold/components/ui/sidebar.d.ts +69 -0
- package/dist/scaffold/components/ui/skeleton.d.ts +2 -0
- package/dist/scaffold/components/ui/textarea.d.ts +3 -0
- package/dist/scaffold/components/ui/tooltip.d.ts +15 -0
- package/dist/scaffold/hooks/use-mobile.d.ts +1 -0
- package/dist/scaffold/identity.d.ts +10 -0
- package/dist/scaffold/index.cjs +2270 -0
- package/dist/scaffold/index.cjs.map +1 -0
- package/dist/scaffold/index.d.ts +14 -0
- package/dist/scaffold/index.js +2244 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/lib/utils.d.ts +2 -0
- package/dist/styles.css +143 -298
- package/dist/types.d.ts +3 -13
- package/dist/ui/adapters.d.ts +1 -1
- package/dist/ui/agent-chat-actions.d.ts +12 -5
- package/dist/ui/agent-chat-composer.d.ts +2 -1
- package/dist/ui/agent-chat-context-compression-row.d.ts +5 -0
- package/dist/ui/agent-chat-context-status.d.ts +13 -0
- package/dist/ui/agent-chat-message.d.ts +7 -5
- package/dist/ui/agent-response-timeline.d.ts +29 -7
- package/dist/ui/ask-user-interaction-state.d.ts +20 -0
- package/dist/ui/ask-user-interaction.d.ts +8 -0
- package/dist/ui/index.cjs +1392 -272
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.js +2380 -65
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/tool-sessions.d.ts +70 -0
- package/dist/ui/use-audio-recorder.d.ts +8 -0
- package/package.json +27 -12
- package/scaffold/components.json +25 -0
- package/scaffold/manifest.json +28 -0
- package/scaffold/src/app.tsx +71 -0
- package/scaffold/src/chat.css +54 -0
- package/scaffold/src/components/chat/chat-composer.tsx +237 -0
- package/scaffold/src/components/chat/chat-message.tsx +76 -0
- package/scaffold/src/components/chat/chat-shell.tsx +257 -0
- package/scaffold/src/components/chat/collapsible-user-message.tsx +37 -0
- package/scaffold/src/components/chat/external-link-dialog.tsx +48 -0
- package/scaffold/src/components/chat/identity-control.tsx +69 -0
- package/scaffold/src/components/chat/message-parts.tsx +83 -0
- package/scaffold/src/components/chat/theme-menu.tsx +79 -0
- package/scaffold/src/components/chat/thread-sidebar.tsx +114 -0
- package/scaffold/src/components/chat/timeline-loading.ts +17 -0
- package/scaffold/src/components/chat/turn-outline.tsx +73 -0
- package/scaffold/src/components/theme-provider.tsx +91 -0
- package/scaffold/src/components/ui/attachment.tsx +204 -0
- package/scaffold/src/components/ui/bubble.tsx +125 -0
- package/scaffold/src/components/ui/button-group.tsx +83 -0
- package/scaffold/src/components/ui/button.tsx +65 -0
- package/scaffold/src/components/ui/dialog.tsx +171 -0
- package/scaffold/src/components/ui/dropdown-menu.tsx +271 -0
- package/scaffold/src/components/ui/input.tsx +19 -0
- package/scaffold/src/components/ui/marker.tsx +69 -0
- package/scaffold/src/components/ui/message-scroller.tsx +129 -0
- package/scaffold/src/components/ui/message.tsx +92 -0
- package/scaffold/src/components/ui/popover.tsx +40 -0
- package/scaffold/src/components/ui/select.tsx +92 -0
- package/scaffold/src/components/ui/separator.tsx +28 -0
- package/scaffold/src/components/ui/sheet.tsx +150 -0
- package/scaffold/src/components/ui/sidebar.tsx +677 -0
- package/scaffold/src/components/ui/skeleton.tsx +13 -0
- package/scaffold/src/components/ui/textarea.tsx +18 -0
- package/scaffold/src/components/ui/tooltip.tsx +56 -0
- package/scaffold/src/hooks/use-mobile.ts +24 -0
- package/scaffold/src/identity.ts +17 -0
- package/scaffold/src/index.css +222 -0
- package/scaffold/src/index.tsx +39 -0
- package/scaffold/src/lib/utils.ts +6 -0
- package/scaffold/styles.css +3 -0
- package/dist/chunk-CHAU7FNW.js +0 -140
- package/dist/chunk-CHAU7FNW.js.map +0 -1
- package/dist/chunk-LI67M74F.js +0 -445
- package/dist/chunk-LI67M74F.js.map +0 -1
- package/dist/chunk-NLEOWTZG.js +0 -1327
- package/dist/chunk-NLEOWTZG.js.map +0 -1
- package/dist/renderers.d.ts +0 -10
- package/dist/templates/agent-chat-app.d.ts +0 -18
- package/dist/templates/agent-chat-layout.d.ts +0 -69
- package/dist/templates/agent-chat-shell.d.ts +0 -37
- package/dist/templates/index.cjs +0 -2476
- package/dist/templates/index.cjs.map +0 -1
- package/dist/templates/index.d.ts +0 -3
- package/dist/templates/index.js +0 -723
- package/dist/templates/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/templates/index.ts","../../src/templates/agent-chat-shell.tsx","../../src/latest-thread-scroller.tsx","../../src/ui/utils.ts","../../src/templates/agent-chat-layout.tsx","../../src/ui/agent-chat-composer.tsx","../../src/ui/agent-chat-message.tsx","../../src/ui/adapters.ts","../../src/ui/attachment.tsx","../../src/ui/message.tsx","../../src/ui/agent-chat-actions.tsx","../../src/ui/agent-response-timeline.tsx","../../src/ui/message-response.tsx","../../src/active-content.ts","../../src/streaming-text.ts","../../src/ui/hitl-presentation.ts","../../src/templates/agent-chat-app.tsx","../../src/mcp-oauth.ts"],"sourcesContent":["export * from \"./agent-chat-shell\";\nexport * from \"./agent-chat-layout\";\nexport * from \"./agent-chat-app\";\n","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 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 \"a24-scroller 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 \"a24-scroller__viewport 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(\"a24-scroller__content 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 \"a24-scroller__item 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 \"a24-scroller__button 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-[background-color,border-color,color,opacity,transform] 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 data-side={railSide}\n data-visible={hasSideRoom ? \"\" : undefined}\n className={cx(\n \"a24-outline 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=\"a24-outline__rail 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 data-side={railSide}\n dir=\"ltr\"\n className={cx(\n \"a24-outline__button 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=\"a24-outline__bar 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 \"a24-outline__preview 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-[opacity,transform] 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","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...values: ClassValue[]) {\n return twMerge(clsx(values));\n}\n","import * as React from \"react\";\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 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 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 ThreadNavigation({\n activeThreadId,\n close,\n hasMoreThreads,\n isDeletingThread,\n isLoadingThreads,\n onDeleteThread,\n onLoadMoreThreads,\n onNewThread,\n onOpenThread,\n slots,\n threads,\n}: Pick<\n AgentChatLayoutProps,\n | \"activeThreadId\"\n | \"hasMoreThreads\"\n | \"isDeletingThread\"\n | \"isLoadingThreads\"\n | \"onDeleteThread\"\n | \"onLoadMoreThreads\"\n | \"onNewThread\"\n | \"onOpenThread\"\n | \"slots\"\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 <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 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 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 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 * 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 source: File;\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 source: file,\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-[background-color,color,opacity,transform] 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(\"a24-composer 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 data-layout={attachmentLayout}\n className={cn(\n \"a24-composer__attachments 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=\"a24-composer__attachment 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=\"a24-composer__attachment-remove 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 data-expanded={isExpanded ? \"\" : undefined}\n className={cn(\n \"a24-composer__surface 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=\"a24-composer__grid w-full\"\n style={{\n alignItems: \"center\",\n display: \"grid\",\n gridTemplateAreas: isExpanded\n ? `\"textarea textarea textarea\" \"plus toolbar submit\"`\n : `\"plus textarea composer mic submit\"`,\n gridTemplateColumns: isExpanded ? \"auto 1fr auto\" : \"auto 1fr auto auto auto\",\n gap: isExpanded ? \"3px 10px\" : \"8px\",\n }}\n >\n <div style={{ gridArea: \"plus\" }} className=\"a24-composer__attach-slot flex shrink-0 items-center justify-center\">\n <input\n ref={fileInputRef}\n accept={accept}\n aria-label=\"Attach files\"\n className=\"hidden\"\n multiple\n name=\"attachments\"\n onChange={handleFilesChange}\n type=\"file\"\n />\n <button\n aria-label=\"Attach files\"\n className={cn(\"a24-composer__attach\", pillButtonClass)}\n disabled={disabled || isSubmitting || isRunning || !allowAttachments}\n onClick={() => fileInputRef.current?.click()}\n title=\"Attach files\"\n type=\"button\"\n >\n <Plus className=\"size-4\" />\n </button>\n </div>\n\n <div style={{ gridArea: \"textarea\" }} className=\"a24-composer__textarea-slot min-w-0 w-full\">\n <textarea\n ref={setTextareaRef}\n aria-label=\"Message\"\n autoComplete=\"off\"\n className={cn(\n \"a24-composer__textarea w-full resize-none border-0 bg-transparent px-1 text-[15px] leading-relaxed text-foreground shadow-none outline-none placeholder:text-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 name=\"message\"\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=\"a24-composer__toolbar flex min-w-0 items-center gap-1.5\">\n {inputToolbarContent}\n </div>\n ) : null}\n\n {!isExpanded ? (\n <div style={{ gridArea: \"composer\" }} className=\"flex min-w-0 items-center gap-1.5\" />\n ) : null}\n\n {!isExpanded ? (\n <div style={{ gridArea: \"mic\" }} className=\"flex shrink-0 items-center justify-end\" />\n ) : null}\n\n <div style={{ gridArea: \"submit\" }} className=\"a24-composer__submit-slot flex shrink-0 items-center justify-end\">\n {isRunning ? (\n <button\n aria-label=\"Stop generating\"\n className={cn(\"a24-composer__submit\", submitButtonClass)}\n disabled={disabled || !onStop}\n onClick={onStop}\n title=\"Stop\"\n type=\"button\"\n >\n <Square className=\"size-3.5 fill-current\" />\n </button>\n ) : (\n <button\n aria-label={files.length > 0 ? `Send ${formatFileCount(files)}` : \"Send message\"}\n className={cn(\"a24-composer__submit\", submitButtonClass, text.trim().length > 0 && \"hover:scale-105\")}\n disabled={!canSubmit}\n onClick={() => void submit()}\n title=\"Send\"\n type=\"button\"\n >\n <ArrowUp className=\"size-4\" strokeWidth={2.5} />\n </button>\n )}\n </div>\n </div>\n </div>\n\n {!isExpanded && inputToolbarContent ? (\n <div className=\"a24-composer__toolbar a24-composer__toolbar--external mt-2 flex items-center gap-2 px-1\">{inputToolbarContent}</div>\n ) : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { 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, comment?: 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\";\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 flex-col gap-2\",\n isUser\n ? cn(\"is-user max-w-[80%] justify-end\", isRtl ? \"mr-auto\" : \"ml-auto\")\n : \"is-assistant max-w-full\",\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-full max-w-full min-w-0 flex-col gap-2 overflow-hidden text-sm group-[.is-user]:w-fit group-[.is-user]:overflow-visible\",\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\": \"bubble-content\",\n ...props,\n });\n}\n\nexport type ChatMessageActionsProps = React.ComponentProps<\"div\">;\n\nexport function ChatMessageActions({\n className,\n ...props\n}: ChatMessageActionsProps): React.ReactElement {\n return React.createElement(\"div\", {\n className: cn(\"flex items-center gap-1\", className),\n \"data-slot\": \"message-actions\",\n ...props,\n });\n}\n\nexport type ChatMessageActionProps = React.ComponentProps<\"button\"> & {\n label?: string;\n tooltip?: React.ReactNode;\n};\n\nexport function ChatMessageAction({\n children,\n className,\n label,\n tooltip,\n type = \"button\",\n ...props\n}: ChatMessageActionProps): React.ReactElement {\n const tooltipLabel = typeof tooltip === \"string\" ? tooltip : undefined;\n return React.createElement(\n \"button\",\n {\n \"aria-label\": label || tooltipLabel,\n className: cn(\n \"inline-flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:border-neutral-300 focus-visible:outline-none focus-visible:ring-0 disabled:pointer-events-none disabled:opacity-50\",\n className\n ),\n title: tooltipLabel,\n type,\n ...props,\n },\n children,\n React.createElement(\n \"span\",\n { className: \"sr-only\" },\n label || tooltipLabel\n )\n );\n}\n\nexport type ChatAttachmentData = Agents24ChatAttachment & {\n type?: string;\n name?: string;\n mediaType?: string;\n contentType?: string;\n};\n\nexport type ChatAttachmentProps = React.ComponentProps<typeof Attachment> & {\n data: ChatAttachmentData;\n onRemove?: () => void;\n};\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 { 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\";\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 const resolvedRef = React.useRef<HTMLDivElement>(null);\n const wasTerminal = React.useRef(isTerminal);\n React.useEffect(() => {\n if (isTerminal && !wasTerminal.current) resolvedRef.current?.focus();\n wasTerminal.current = isTerminal;\n }, [isTerminal]);\n if (isTerminal) {\n return (\n <div className=\"a24-hitl a24-hitl--resolved px-1 py-1 text-sm text-muted-foreground\" ref={resolvedRef} role=\"status\" tabIndex={-1}>{resolvedHitlLabel(part)}</div>\n );\n }\n return (\n <div className=\"a24-hitl space-y-2.5 px-1 py-2\">\n <div className=\"a24-hitl__title text-sm font-medium text-foreground text-pretty\">{hitlTitle(part)}</div>\n {requireComment ? (\n <textarea\n aria-label=\"Approval comment\"\n autoComplete=\"off\"\n className=\"a24-hitl__comment min-h-20 w-full resize-y rounded-md border border-border/60 bg-background px-3 py-2 text-sm outline-none focus-visible:border-neutral-300 focus-visible:ring-0 dark:focus-visible:border-neutral-600\"\n name=\"hitl-comment\"\n onChange={(event) => setComment(event.target.value)}\n placeholder=\"Comment required…\"\n value={comment}\n />\n ) : null}\n {state?.error ? <div className=\"a24-hitl__error text-sm text-destructive\">{state.error}</div> : null}\n <div className=\"a24-hitl__actions flex flex-wrap items-center gap-1.5\">\n {part.allowedActions.map((action) => (\n <button\n key={action}\n aria-label={hitlActionLabel(part, action)}\n className={cn(\n \"a24-hitl__action min-h-10 rounded-md px-3 text-sm font-medium transition-[background-color,color,opacity,transform] duration-150 ease-out active:scale-[0.96] disabled:pointer-events-none disabled:opacity-60\",\n action === \"approve\" || action === \"connect\"\n ? \"bg-neutral-900 text-white hover:bg-neutral-800 dark:bg-neutral-100 dark:text-neutral-900 dark:hover:bg-white\"\n : \"bg-transparent text-muted-foreground hover:bg-background/80 hover:text-foreground\"\n )}\n data-primary={action === \"approve\" || action === \"connect\" ? \"\" : undefined}\n disabled={!onHitlAction || isLoading || state?.status === \"connecting\" || state?.status === \"resuming\" || (requireComment && !comment.trim())}\n onClick={() => onHitlAction?.(part, 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 part.bundle ? <SafeUiBlocks bundle={part.bundle} /> : <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\" role=\"alert\">{part.errorText}</div>;\n if (part.kind === \"source\") {\n const href = safeExternalUrl(part.url);\n return href ? <a className=\"a24-source-link\" href={href} rel=\"noopener noreferrer\" target=\"_blank\">{part.title}</a> : <span className=\"a24-source-link\">{part.title}</span>;\n }\n if (part.kind === \"citation\") {\n const href = safeExternalUrl(part.url);\n const label = part.label || \"Citation\";\n return href ? <a className=\"a24-citation\" href={href} rel=\"noopener noreferrer\" target=\"_blank\">{label}</a> : <span className=\"a24-citation\">{label}</span>;\n }\n if (part.kind === \"attachment\") return <div className=\"a24-output-attachment\">{part.attachment.filename || \"Attachment\"}</div>;\n if (part.kind === \"data\") return <div data-agents24-data-part={part.name} className=\"hidden\">{message.id}</div>;\n return null;\n}\n\nfunction safeExternalUrl(value?: string | null): string | null {\n if (!value) return null;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.href : null;\n } catch {\n return null;\n }\n}\n\nfunction SafeUiBlocks({ bundle }: { bundle: Record<string, unknown> }) {\n const rows = Array.isArray(bundle.rows) ? bundle.rows : [];\n return (\n <section aria-label={typeof bundle.title === \"string\" ? bundle.title : \"Agent result\"} className=\"a24-ui-blocks\">\n {typeof bundle.title === \"string\" ? <h3>{bundle.title}</h3> : null}\n {rows.map((rawRow, rowIndex) => {\n const row = rawRow && typeof rawRow === \"object\" && !Array.isArray(rawRow) ? rawRow as Record<string, unknown> : {};\n const blocks = Array.isArray(row.blocks) ? row.blocks : [];\n return <div className=\"a24-ui-blocks__row\" key={`row-${rowIndex}`}>{blocks.map((rawBlock, blockIndex) => {\n const block = rawBlock && typeof rawBlock === \"object\" && !Array.isArray(rawBlock) ? rawBlock as Record<string, unknown> : {};\n const title = typeof block.title === \"string\" ? block.title : \"Result\";\n const kind = String(block.kind || \"note\");\n if (kind === \"table\" && Array.isArray(block.columns) && Array.isArray(block.rows)) {\n return (\n <div className=\"a24-ui-block\" key={String(block.id || blockIndex)}>\n <h4>{title}</h4>\n <div className=\"a24-ui-table-scroll\"><table><thead><tr>{block.columns.map((column, index) => <th key={index}>{String(column)}</th>)}</tr></thead><tbody>{block.rows.map((rawCells, index) => <tr key={index}>{(Array.isArray(rawCells) ? rawCells : []).map((cell, cellIndex) => <td key={cellIndex}>{String(cell)}</td>)}</tr>)}</tbody></table></div>\n </div>\n );\n }\n const value = block.value ?? block.text ?? \"\";\n return <div className=\"a24-ui-block\" key={String(block.id || blockIndex)}><h4>{title}</h4><p>{String(value)}</p></div>;\n })}</div>;\n })}\n </section>\n );\n}\n\nexport function AgentResponseTimeline({\n getHitlActionState,\n isLoading = false,\n message,\n 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 { CHAT_MARKDOWN_HARDEN_OPTIONS, safeChatMarkdownHref } from \"../active-content\";\nimport { useStreamingText } from \"../streaming-text\";\nimport { cn } from \"./utils\";\n\nexport type MessageResponseProps = React.ComponentProps<typeof Streamdown> & {\n streaming?: boolean;\n streamingId?: string;\n};\n\ntype MarkdownNode = {\n tagName?: string;\n position?: {\n start?: { line?: number };\n end?: { line?: number };\n };\n};\n\ntype MarkdownElementProps = {\n children?: React.ReactNode;\n node?: MarkdownNode;\n};\n\nfunction SafeMarkdownLink({ children, href, ...props }: React.ComponentProps<\"a\"> & MarkdownElementProps) {\n const domProps = { ...props };\n delete domProps.node;\n const safeHref = safeChatMarkdownHref(href);\n if (!safeHref) return <span>{children}</span>;\n if (safeHref.startsWith(\"#\")) return <a {...domProps} href={safeHref}>{children}</a>;\n return <a {...domProps} href={safeHref} rel=\"noopener noreferrer\" target=\"_blank\">{children}</a>;\n}\n\nfunction BlockedMarkdownImage({ alt }: React.ComponentProps<\"img\"> & MarkdownElementProps) {\n return alt ? <span aria-label={`Image blocked: ${alt}`} role=\"img\">{alt}</span> : null;\n}\n\nconst BLOCK_MARKDOWN_TAGS = new Set([\n \"blockquote\",\n \"div\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"ol\",\n \"pre\",\n \"table\",\n \"ul\",\n]);\n\nfunction isMultilineCodeNode(node?: MarkdownNode) {\n return (\n node?.tagName === \"code\" &&\n node.position?.start?.line !== undefined &&\n node.position?.end?.line !== undefined &&\n node.position.start.line !== node.position.end.line\n );\n}\n\nfunction hasBlockMarkdownChild(child: React.ReactNode): boolean {\n if (!React.isValidElement(child)) {\n return false;\n }\n\n if (typeof child.type === \"string\" && BLOCK_MARKDOWN_TAGS.has(child.type)) {\n return true;\n }\n\n const props = child.props as MarkdownElementProps;\n if (BLOCK_MARKDOWN_TAGS.has(props.node?.tagName || \"\") || isMultilineCodeNode(props.node)) {\n return true;\n }\n\n return React.Children.toArray(props.children).some(hasBlockMarkdownChild);\n}\n\nfunction MessageMarkdownParagraph({\n children,\n ...props\n}: React.ComponentProps<\"p\"> & MarkdownElementProps) {\n const domProps = { ...props };\n delete domProps.node;\n const childArray = React.Children.toArray(children).filter(\n (child) => child !== null && child !== \"\"\n );\n const isImageOnly =\n childArray.length === 1 &&\n React.isValidElement(childArray[0]) &&\n (childArray[0].props as MarkdownElementProps).node?.tagName === \"img\";\n\n if (isImageOnly) {\n return <>{children}</>;\n }\n\n if (childArray.some(hasBlockMarkdownChild)) {\n return <div {...domProps}>{children}</div>;\n }\n\n return <p {...domProps}>{children}</p>;\n}\n\nconst MESSAGE_RESPONSE_COMPONENTS = {\n a: SafeMarkdownLink,\n img: BlockedMarkdownImage,\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 CHAT_MARKDOWN_HARDEN_OPTIONS,\n ],\n ]\n : []),\n] as StreamdownRehypePlugins;\n\nexport const MessageResponse = React.memo(\n ({\n children,\n className,\n components,\n rehypePlugins,\n streaming = false,\n streamingId,\n ...props\n }: MessageResponseProps) => {\n const text =\n typeof children === \"string\" || typeof children === \"number\"\n ? String(children)\n : \"\";\n const streamingText = useStreamingText({\n charsPerSecond: 120,\n id: streamingId || text,\n isStreaming: streaming && text.length > 0,\n maxCatchupChars: 32,\n text,\n });\n const streamdownComponents = React.useMemo(\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","export const CHAT_MARKDOWN_HARDEN_OPTIONS = Object.freeze({\n allowDataImages: false,\n allowedImagePrefixes: [] as string[],\n allowedLinkPrefixes: [\"*\"],\n allowedProtocols: [] as string[],\n defaultOrigin: undefined,\n imageBlockPolicy: \"text-only\" as const,\n linkBlockPolicy: \"text-only\" as const,\n});\n\nexport function safeChatMarkdownHref(value?: string): string | undefined {\n if (!value) return undefined;\n if (value.startsWith(\"#\")) return value;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" || url.protocol === \"http:\" ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n","import { 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 cachedText && text.startsWith(cachedText) ? cachedText : text;\n });\n const targetRef = useRef(text);\n const displayedRef = useRef(displayedText);\n const rafRef = useRef<number | null>(null);\n const lastFrameAtRef = useRef<number | null>(null);\n const 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 = cachedText && text.startsWith(cachedText) ? cachedText : 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","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\") {\n const serverName = optionalString(presentation.server_name);\n return serverName ? `Connect ${serverName} to continue` : part.message;\n }\n if (part.hitlKind === \"app_data_permission\") return \"Allow this data change?\";\n return part.message;\n}\n\nexport function resolvedHitlLabel(part: ChatHitlPart): string {\n const outcome = String(part.resolution?.outcome || part.status).trim().toLowerCase();\n return {\n approved: part.hitlKind === \"user_approval\" ? \"Approved\" : \"Allowed\",\n rejected: part.hitlKind === \"user_approval\" ? \"Rejected\" : \"Not allowed\",\n connected: \"connected\",\n skipped: \"Skipped\",\n timeout: \"Timed out\",\n expired: \"Timed out\",\n cancelled: \"Cancelled\",\n invalidated: \"No longer available\",\n policy_denied: \"Not allowed\",\n }[outcome] || outcome.replace(/_/g, \" \");\n}\n","import 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 type { McpCallbackResult } from \"@agents24/client\";\nimport type { ChatMcpOauthCompletion, WaitForMcpOauthCompleteInput } from \"./types\";\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nfunction isLoopback(hostname: string): boolean {\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\";\n}\n\nfunction normalizedOrigin(value: string): string {\n try {\n const url = new URL(value);\n if (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && isLoopback(url.hostname))) {\n throw new Error(\"unsafe callback origin\");\n }\n if (url.origin === \"null\") throw new Error(\"opaque callback origin\");\n return url.origin;\n } catch {\n throw new Error(\"MCP authorization returned an invalid callback origin.\");\n }\n}\n\nexport function validateMcpCallbackResult(\n result: McpCallbackResult,\n expectedServerId: string,\n): McpCallbackResult {\n const serverId = String(result.server_id || \"\").trim();\n const connectionId = String(result.connection_id || \"\").trim();\n if (!serverId || serverId !== expectedServerId) {\n throw new Error(\"MCP authorization completed for an unexpected server.\");\n }\n if (!UUID_PATTERN.test(connectionId)) {\n throw new Error(\"MCP authorization returned an invalid connection identity.\");\n }\n return result;\n}\n\nexport function waitForMcpOauthComplete({\n popup,\n callbackOrigin,\n popupNonce,\n requireConnectionId = false,\n serverId,\n timeoutMs = 120_000,\n}: WaitForMcpOauthCompleteInput): Promise<ChatMcpOauthCompletion> {\n if (!popup) return Promise.reject(new Error(\"Could not open the MCP authorization popup.\"));\n const expectedOrigin = normalizedOrigin(callbackOrigin);\n const expectedServerId = String(serverId || \"\").trim();\n const expectedPopupNonce = String(popupNonce || \"\").trim();\n if (!expectedServerId) return Promise.reject(new Error(\"MCP authorization is missing its server identity.\"));\n if (!expectedPopupNonce) return Promise.reject(new Error(\"MCP authorization is missing its popup binding.\"));\n const returnFocusTo = typeof document !== \"undefined\"\n ? document.activeElement as { focus?: () => void } | null\n : null;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const finish = (result: ChatMcpOauthCompletion | Error) => {\n if (settled) return;\n settled = true;\n window.clearTimeout(timeout);\n window.clearInterval(closeTimer);\n window.removeEventListener(\"message\", onMessage);\n returnFocusTo?.focus?.();\n if (result instanceof Error) reject(result);\n else resolve(result);\n };\n const onMessage = (event: MessageEvent) => {\n if (event.source !== popup || event.origin !== expectedOrigin) return;\n const data = event.data as {\n type?: string;\n code?: string;\n connection_id?: string;\n popup_nonce?: string;\n server_id?: string;\n } | null;\n if (\n data?.type !== \"agents24.mcp.callback\" ||\n data.server_id !== expectedServerId ||\n data.popup_nonce !== expectedPopupNonce\n ) return;\n const code = String(data.code || \"\").trim();\n if (!code || code.length > 2048) return;\n const connectionId = String(data.connection_id || \"\").trim();\n if ((requireConnectionId || connectionId) && !UUID_PATTERN.test(connectionId)) return;\n finish({\n code,\n ...(connectionId ? { connectionId } : {}),\n popupNonce: expectedPopupNonce,\n serverId: expectedServerId,\n });\n };\n const timeout = window.setTimeout(\n () => finish(new Error(\"MCP authorization timed out.\")),\n Math.max(1, timeoutMs),\n );\n const closeTimer = window.setInterval(() => {\n if (popup.closed) finish(new Error(\"MCP authorization window was closed before connecting.\"));\n }, 500);\n window.addEventListener(\"message\", onMessage);\n });\n}\n"],"mappings":"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","names":["React","content","import_jsx_runtime","React","import_lucide_react","React","import_jsx_runtime","React","import_lucide_react","React","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","React","import_lucide_react","React","import_jsx_runtime","import_jsx_runtime","optionalString","import_jsx_runtime","import_jsx_runtime","import_react","React","import_jsx_runtime","crypto","error","createId"]}
|